Bebe MomentBebe Moment

일반 Linux Docker 설치

요구 사항

  • Docker 24+, Docker Compose v2
  • 외부 리버스 프록시 (nginx, Caddy, Traefik) — TLS 종단용

빠른 시작

# 1. 디렉토리 준비
mkdir -p /opt/stacks/bebe-moment && cd /opt/stacks/bebe-moment

# 2. compose + env 다운로드
curl -fLO https://raw.githubusercontent.com/svrforum/bebe-moment/main/compose/docker-compose.yml
curl -fL https://raw.githubusercontent.com/svrforum/bebe-moment/main/compose/.env.example -o .env

# 3. .env 편집
nano .env
# SECRET_KEY, POSTGRES_PASSWORD, PUBLIC_URL, ADMIN_USER_EMAIL 필수
# MEDIA_SERVICE_TOKEN, MEDIA_JWT_SECRET (각 32바이트+) 도 필수 — 미디어 서비스 인증·서명 키
#   생성: openssl rand -hex 32

# 4. 기동
docker compose up -d

# 5. 첫 로그인
# PUBLIC_URL 접속 → 첫 사용자 가입 → 온보딩(가족·아기 설정)
# 첫 가입자가 곧 관리자(owner) → /admin 접근 가능

SECRET_KEY 생성

openssl rand -hex 32

MEDIA_SERVICE_TOKEN, MEDIA_JWT_SECRET 도 같은 방식으로 각각 따로 생성합니다.

첫 로그인

PUBLIC_URL 로 접속하면 첫 사용자 가입 화면이 뜹니다. 가입 후 온보딩(가족·아기 설정)을 마치면 그 첫 가입자가 곧 관리자(owner) 입니다. 이후 구성원은 초대 링크로만 합류하고, 관리 화면은 /admin 또는 설정 → 관리자에서 엽니다.

리버스 프록시 예시 (Caddy)

bebe.example.com {
  reverse_proxy localhost:3000
}

큰 tus 업로드·SSE 가 끊기지 않도록 프록시 타임아웃을 넉넉히(≥ 600초) 두고, WebSocket 을 허용하세요. PUBLIC_URL 은 공개 도메인(https://…)으로 맞춥니다. https 로 바뀌면 세션 쿠키가 __Secure- 접두사로 전환되어 한 번 재로그인이 필요할 수 있습니다.

업그레이드

docker compose pull
docker compose up -d

기동 시 prisma migrate deploy 가 자동 실행되어 스키마가 최신으로 맞춰집니다.

백업

  • ./data — 업로드 원본 + 파생물 (주기적 백업 권장)
  • ./pg — Postgres 데이터 (pg_dump 또는 NAS 백업 도구 등)
  • ./redis — 임시 큐 (복구 불필요)

앱 자체 백업(설정 → 관리자 → 백업, 전체·증분·원격 S3)도 함께 쓰는 것을 권장합니다.

트러블슈팅

페이지가 500 / 로그에 MEDIA_SERVICE_TOKEN env required

미디어를 부르는 페이지(타임라인·상세)가 500 나고 로그에 MEDIA_SERVICE_TOKEN env required 가 보이면, 컨테이너에 MEDIA_SERVICE_TOKEN·MEDIA_JWT_SECRET 가 안 들어간 것입니다.

  • 루트 .envgitignore 이자 dockerignore 대상이라 이미지에 포함되지 않습니다. 이 값들은 반드시 런타임 env(compose environment:)로 줘야 합니다.
  • /api/health 는 미디어를 안 거쳐 200 으로 남으므로 헬스체크만으론 못 잡습니다 — 실제 사진 페이지로 확인하세요.

페이지는 뜨는데 사진이 안 뜸 (썸네일 깨짐)

서명 URL 이 노출되지 않은 포트(예: :3001)를 가리키는 경우입니다.

  • 이 배포는 포트 3000 하나만 노출하고 브라우저는 /media/* Next rewrite 로 내부 미디어(:3001)에 접근합니다.
  • MEDIA_PUBLIC_BASE_URL / NEXT_PUBLIC_MEDIA_BASE_URL설정하지 마세요(미설정 시 PUBLIC_URL 로 폴백되어 /media/... 가 동일 오리진으로 서빙됩니다). :3001 같은 값을 넣으면 브라우저가 닿지 못해 이미지가 깨집니다.

더 많은 사례는 트러블슈팅 을 참고하세요.