|
@@ -3,9 +3,9 @@ services:
|
|
|
image: postgres:16-alpine
|
|
image: postgres:16-alpine
|
|
|
container_name: vidreview-db
|
|
container_name: vidreview-db
|
|
|
environment:
|
|
environment:
|
|
|
- POSTGRES_USER: vidreview
|
|
|
|
|
- POSTGRES_PASSWORD: vidreview123
|
|
|
|
|
- POSTGRES_DB: vidreview
|
|
|
|
|
|
|
+ POSTGRES_USER: ${POSTGRES_USER:-vidreview}
|
|
|
|
|
+ POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:?Required}
|
|
|
|
|
+ POSTGRES_DB: ${POSTGRES_DB:-vidreview}
|
|
|
ports:
|
|
ports:
|
|
|
- '5432:5432'
|
|
- '5432:5432'
|
|
|
volumes:
|
|
volumes:
|
|
@@ -16,7 +16,9 @@ services:
|
|
|
timeout: 5s
|
|
timeout: 5s
|
|
|
retries: 5
|
|
retries: 5
|
|
|
|
|
|
|
|
- # ── Init (runs once on fresh deploy) ───────────────────────────────────────
|
|
|
|
|
|
|
+ # ── Init: runs once on fresh deploy ─────────────────────────────────────
|
|
|
|
|
+ # Creates admin account, locks registration, saves credentials to seed_output.
|
|
|
|
|
+ # Skips silently if DB already has an admin (safe to re-run on updates).
|
|
|
init:
|
|
init:
|
|
|
build:
|
|
build:
|
|
|
context: .
|
|
context: .
|
|
@@ -24,14 +26,14 @@ services:
|
|
|
container_name: vidreview-init
|
|
container_name: vidreview-init
|
|
|
entrypoint: ['bash', '/scripts/init-admin.sh']
|
|
entrypoint: ['bash', '/scripts/init-admin.sh']
|
|
|
environment:
|
|
environment:
|
|
|
- DB_HOST: vidreview-db
|
|
|
|
|
- DB_NAME: vidreview
|
|
|
|
|
- DB_USER: vidreview
|
|
|
|
|
- DB_PASS: vidreview123
|
|
|
|
|
|
|
+ DB_HOST: postgres
|
|
|
|
|
+ DB_NAME: ${POSTGRES_DB:-vidreview}
|
|
|
|
|
+ DB_USER: ${POSTGRES_USER:-vidreview}
|
|
|
|
|
+ DB_PASS: ${POSTGRES_PASSWORD:?Required}
|
|
|
API_CONTAINER: vidreview-api
|
|
API_CONTAINER: vidreview-api
|
|
|
OUTPUT_DIR: /seed-output
|
|
OUTPUT_DIR: /seed-output
|
|
|
- ADMIN_EMAIL: admin@vidreview.local
|
|
|
|
|
- ADMIN_NAME: Admin
|
|
|
|
|
|
|
+ ADMIN_EMAIL: ${ADMIN_EMAIL:-admin@vidreview.local}
|
|
|
|
|
+ ADMIN_NAME: ${ADMIN_NAME:-Admin}
|
|
|
volumes:
|
|
volumes:
|
|
|
- /var/run/docker.sock:/var/run/docker.sock:rw
|
|
- /var/run/docker.sock:/var/run/docker.sock:rw
|
|
|
- /usr/bin/docker:/usr/bin/docker:rw
|
|
- /usr/bin/docker:/usr/bin/docker:rw
|
|
@@ -44,21 +46,22 @@ services:
|
|
|
condition: service_healthy
|
|
condition: service_healthy
|
|
|
restart: 'no'
|
|
restart: 'no'
|
|
|
|
|
|
|
|
|
|
+ # ── API ─────────────────────────────────────────────────────────────────
|
|
|
api:
|
|
api:
|
|
|
build:
|
|
build:
|
|
|
context: .
|
|
context: .
|
|
|
dockerfile: Dockerfile.api
|
|
dockerfile: Dockerfile.api
|
|
|
container_name: vidreview-api
|
|
container_name: vidreview-api
|
|
|
environment:
|
|
environment:
|
|
|
- DATABASE_URL: postgresql://vidreview:vidreview123@postgres:5432/vidreview
|
|
|
|
|
- JWT_SECRET: ${JWT_SECRET:-change-me-in-production}
|
|
|
|
|
|
|
+ DATABASE_URL: ${DATABASE_URL:?Required}
|
|
|
|
|
+ JWT_SECRET: ${JWT_SECRET:?Required}
|
|
|
JWT_EXPIRES_IN: ${JWT_EXPIRES_IN:-7d}
|
|
JWT_EXPIRES_IN: ${JWT_EXPIRES_IN:-7d}
|
|
|
API_PORT: 3001
|
|
API_PORT: 3001
|
|
|
- NODE_ENV: production
|
|
|
|
|
|
|
+ NODE_ENV: ${NODE_ENV:-production}
|
|
|
UPLOAD_DIR: /app/uploads
|
|
UPLOAD_DIR: /app/uploads
|
|
|
- MAX_FILE_SIZE_MB: 500
|
|
|
|
|
- ALLOWED_ORIGINS: 'https://vid.k9tech.space,http://vid.k9tech.space,http://10.147.17.128,http://192.168.1.31'
|
|
|
|
|
- FRONTEND_URL: https://vid.k9tech.space
|
|
|
|
|
|
|
+ MAX_FILE_SIZE_MB: ${MAX_FILE_SIZE_MB:-500}
|
|
|
|
|
+ ALLOWED_ORIGINS: ${ALLOWED_ORIGINS}
|
|
|
|
|
+ FRONTEND_URL: ${FRONTEND_URL}
|
|
|
RESEND_API_KEY: ${RESEND_API_KEY:-}
|
|
RESEND_API_KEY: ${RESEND_API_KEY:-}
|
|
|
ports:
|
|
ports:
|
|
|
- '3001:3001'
|
|
- '3001:3001'
|
|
@@ -73,7 +76,7 @@ services:
|
|
|
timeout: 5s
|
|
timeout: 5s
|
|
|
retries: 5
|
|
retries: 5
|
|
|
|
|
|
|
|
- # ── Transcode Worker ──────────────────────────────────────────────────────
|
|
|
|
|
|
|
+ # ── Transcode Worker ─────────────────────────────────────────────────────
|
|
|
worker:
|
|
worker:
|
|
|
build:
|
|
build:
|
|
|
context: .
|
|
context: .
|
|
@@ -81,10 +84,10 @@ services:
|
|
|
container_name: vidreview-worker
|
|
container_name: vidreview-worker
|
|
|
command: node src/worker/index.js
|
|
command: node src/worker/index.js
|
|
|
environment:
|
|
environment:
|
|
|
- DATABASE_URL: postgresql://vidreview:vidreview123@postgres:5432/vidreview
|
|
|
|
|
- NODE_ENV: production
|
|
|
|
|
|
|
+ DATABASE_URL: ${DATABASE_URL:?Required}
|
|
|
|
|
+ NODE_ENV: ${NODE_ENV:-production}
|
|
|
UPLOAD_DIR: /app/uploads
|
|
UPLOAD_DIR: /app/uploads
|
|
|
- POLL_INTERVAL_MS: 2000
|
|
|
|
|
|
|
+ POLL_INTERVAL_MS: ${POLL_INTERVAL_MS:-2000}
|
|
|
depends_on:
|
|
depends_on:
|
|
|
postgres:
|
|
postgres:
|
|
|
condition: service_healthy
|
|
condition: service_healthy
|
|
@@ -92,9 +95,7 @@ services:
|
|
|
- uploads:/app/uploads
|
|
- uploads:/app/uploads
|
|
|
restart: unless-stopped
|
|
restart: unless-stopped
|
|
|
|
|
|
|
|
- # ── Caddy Reverse Proxy ───────────────────────────────────────────────────
|
|
|
|
|
- # Receives HTTP traffic forwarded by Synology reverse proxy.
|
|
|
|
|
- # Routes /api/* → api container, everything else → frontend.
|
|
|
|
|
|
|
+ # ── Caddy Reverse Proxy ──────────────────────────────────────────────────
|
|
|
caddy:
|
|
caddy:
|
|
|
image: caddy:2-alpine
|
|
image: caddy:2-alpine
|
|
|
container_name: vidreview-caddy
|
|
container_name: vidreview-caddy
|
|
@@ -109,14 +110,15 @@ services:
|
|
|
- frontend
|
|
- frontend
|
|
|
- api
|
|
- api
|
|
|
|
|
|
|
|
|
|
+ # ── Frontend ────────────────────────────────────────────────────────────
|
|
|
frontend:
|
|
frontend:
|
|
|
build:
|
|
build:
|
|
|
context: .
|
|
context: .
|
|
|
dockerfile: Dockerfile.frontend
|
|
dockerfile: Dockerfile.frontend
|
|
|
container_name: vidreview-frontend
|
|
container_name: vidreview-frontend
|
|
|
environment:
|
|
environment:
|
|
|
- NEXT_PUBLIC_API_URL: https://vid.k9tech.space/api
|
|
|
|
|
- NODE_ENV: production
|
|
|
|
|
|
|
+ NEXT_PUBLIC_API_URL: ${NEXT_PUBLIC_API_URL}
|
|
|
|
|
+ NODE_ENV: ${NODE_ENV:-production}
|
|
|
expose:
|
|
expose:
|
|
|
- '3000'
|
|
- '3000'
|
|
|
depends_on:
|
|
depends_on:
|