FeaturesAuthProduction Operator Bootstrap

Production OPERATOR Bootstrap

SPEC #008 정합.

Overview

production 환경의 첫 운영사 계정. Flyway V7 시드로 prod 에만 INSERT. 챗에 평문 비밀번호 노출 X — 사용자가 로컬에서 BCrypt 해시 생성 + V7 SQL placeholder 교체.

첫 계정 spec

항목
emailprod@chilloen.com
roleOPERATOR
passwordMustChangefalse (기획 미확정, schema 만)
statusACTIVE
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