Production OPERATOR Bootstrap
SPEC #008 정합.
Overview
production 환경의 첫 운영사 계정. Flyway V7 시드로 prod 에만 INSERT. 챗에 평문 비밀번호 노출 X — 사용자가 로컬에서 BCrypt 해시 생성 + V7 SQL placeholder 교체.
첫 계정 spec
| 항목 | 값 |
|---|---|
prod@chilloen.com | |
| role | OPERATOR |
| passwordMustChange | false (기획 미확정, schema 만) |
| status | ACTIVE |
| passwordHash | 사용자가 로컬 생성 (BCrypt strength=12) |
V7 Migration
linkmusic-msa-space-was/src/main/resources/db/migration/V7__prod_operator_seed.sql:
-- 환경 분기 — Flyway placeholder 로 prod 만 실행
-- (또는 spring.flyway.locations 로 conditional, V7 자체는 모든 env 에 존재)
INSERT INTO operator_account (
id, email, password_hash, name, role, status, password_must_change,
created_at, updated_at
)
VALUES (
-- fixed UUID for prod operator (idempotent 재시도 가능)
'00000000-0000-0000-0000-0000000000a1',
'prod@chilloen.com',
'$BCRYPT_HASH_PLACEHOLDER$', -- 로컬에서 사용자가 교체
'Production Operator',
'OPERATOR',
'ACTIVE',
false,
NOW(),
NOW()
)
ON CONFLICT (email) DO NOTHING;해시 생성 방법
# (a) Python
python3 -c "import bcrypt; print(bcrypt.hashpw(b'<비밀번호>', bcrypt.gensalt(rounds=12)).decode())"
# (b) htpasswd (apache2-utils)
htpasswd -bnBC 12 "" "<비밀번호>" | tr -d ':\n'
# (c) Spring Boot ShellRunner (build & run)생성된 해시는 $BCRYPT_HASH_PLACEHOLDER$ 부분에 직접 교체 후 commit. 평문 비번은 어디에도 commit X.
Dev 환경 vs Prod
| 환경 | OPERATOR 시드 |
|---|---|
Dev (spring.profiles.active=default) | V3 dev@chilloen.com (역시 placeholder 교체 필요, 로컬 비번) |
Prod (spring.profiles.active=render) | V7 prod@chilloen.com 추가로 INSERT |
prod 도 V3 의 dev@chilloen.com 가 INSERT 되지만, 사용 안 함 (V3 의 prod 비번은 시드 시점에 placeholder 그대로 — 로그인 불가).
Constraints
- 평문 비밀번호 채팅 / commit 노출 금지
- Flyway migration 은 idempotent (
ON CONFLICT DO NOTHING) - production 첫 deploy 후 즉시 로그인 가능 (
/login으로 prod@chilloen.com)
Roadmap
- 첫 운영자 가입 흐름 (
/admin/operators/new) — 후속 SPEC - 운영자 추가 user 생성 (관리자가 다른 OPERATOR 초대) — 후속 SPEC
References
- SPEC #008
linkmusic-msa-space-was/src/main/resources/db/migration/V7__prod_operator_seed.sql