환경변수 레퍼런스
시크릿은 항상 런타임 env(compose environment: / Synology Container Manager 환경변수)로 주입합니다. 루트 .env 는 gitignore·dockerignore 대상이라 이미지에 포함되지 않습니다.
필수
| 변수 | 설명 |
|---|---|
DATABASE_URL | Postgres 연결 문자열 (postgres://bebe:<pw>@postgres:5432/bebe). |
REDIS_URL | 큐 연결 문자열 (redis://redis:6379). |
SECRET_KEY | 세션·암호화 키. 32바이트+ (openssl rand -hex 32). |
PUBLIC_URL | 외부 공개 URL (https://bebe.example.com). 미디어 base URL 도 이 값으로 폴백됩니다. |
미디어 서비스 시크릿 (필수)
app 이미지의 web·media 프로세스가 서로 인증·서명할 때 씁니다. 빠지면 사진 페이지가 500 납니다.
| 변수 | 설명 |
|---|---|
MEDIA_SERVICE_TOKEN | web → media bearer 토큰. 32바이트+ (openssl rand -hex 32). |
MEDIA_JWT_SECRET | file-serve·upload 토큰 서명 키. 32바이트+ (별도로 생성). |
DB role 분리
entrypoint 가 이 비밀번호로 bebe_web·bebe_media 역할을 만듭니다. web 은 public 스키마, media 는 media 스키마만 접근합니다.
| 변수 | 설명 |
|---|---|
DATABASE_URL_WEB | web 프로세스용 (bebe_web 역할). |
DATABASE_URL_MEDIA | media 프로세스용 (bebe_media 역할). |
BEBE_WEB_DB_PASSWORD | bebe_web 역할 비밀번호. |
BEBE_MEDIA_DB_PASSWORD | bebe_media 역할 비밀번호. |
미디어 base URL (보통 미설정)
| 변수 | 설명 |
|---|---|
MEDIA_INTERNAL_URL | 컨테이너 내부 media 주소. 단일 컨테이너라 http://localhost:3001. |
MEDIA_PUBLIC_BASE_URL | 브라우저용 미디어 base. 보통 미설정 → PUBLIC_URL 폴백. :3001 같은 노출 안 된 포트를 넣지 마세요. |
NEXT_PUBLIC_MEDIA_BASE_URL | 위와 동일. 미설정(또는 PUBLIC_URL 과 동일)이 정답입니다. |
선택
| 변수 | 기본값 | 설명 |
|---|---|---|
PORT | 3000 | 노출 포트. Synology 의 5000/5001 회피. |
TZ | Asia/Seoul | 방해금지·다이제스트·추억 푸시가 컨테이너 로컬 시각으로 판단하므로 가족 시간대로. |
PUID / PGID | 1000 (DSM 예시 1026/100) | 볼륨 소유권. Synology 에서는 id <user> 로 확인. |
ADMIN_USER_EMAIL | — | 인스턴스 관리자 이메일(콤마 구분). 단일 가족 모델에선 첫 가입 owner 가 곧 관리자. |
STORAGE_MODE | local | local 또는 s3. |
STORAGE_PATH | /data | 로컬 저장 경로 (볼륨 마운트 대상). |
STORAGE_S3_* | — | S3/MinIO 사용 시 엔드포인트·버킷·키. |
BACKUP_DIR | /backups | 앱 백업 번들 저장 경로. |
FACE_ML_URL | http://ml:8000 | 얼굴 인식 ML 사이드카 주소(옵트인). ml 컨테이너를 안 띄우면 호출도 없습니다. |
LOG_LEVEL | info | pino 로그 레벨. |
런타임 설정(OIDC·SMTP·리텐션 등)은 env 가 아니라 앱 내 관리자 UI 에서 합니다. env 로 준 값이 있으면 UI 는 잠깁니다.