services: server: build: context: . dockerfile: server/Dockerfile ports: - "${SERVER_PORT:-8080}:8080" environment: NSTREAM_DATABASE_URL: jdbc:postgresql://postgres:5432/${POSTGRES_DB:-nstream} NSTREAM_DATABASE_USER: ${POSTGRES_USER:-nstream} NSTREAM_DATABASE_PASSWORD: ${POSTGRES_PASSWORD:-nstream_local_password} NSTREAM_REDIS_URI: redis://redis:6379 NSTREAM_JWT_SECRET: ${NSTREAM_JWT_SECRET:-replace-this-local-development-secret-before-deploying} NSTREAM_SMTP_HOST: mailpit NSTREAM_SMTP_PORT: 1025 NSTREAM_SMTP_FROM: ${NSTREAM_SMTP_FROM:-noreply@nstream.local} NSTREAM_WATCHMODE_API_KEY: ${NSTREAM_WATCHMODE_API_KEY} NSTREAM_WATCHMODE_BASE_URL: ${NSTREAM_WATCHMODE_BASE_URL:-https://api.watchmode.com/v1} NSTREAM_GROQ_API_KEY: ${NSTREAM_GROQ_API_KEY} NSTREAM_GROQ_BASE_URL: ${NSTREAM_GROQ_BASE_URL:-https://api.groq.com/openai/v1} NSTREAM_GROQ_FAST_MODEL: ${NSTREAM_GROQ_FAST_MODEL:-openai/gpt-oss-20b} NSTREAM_GROQ_ADVANCED_MODEL: ${NSTREAM_GROQ_ADVANCED_MODEL:-openai/gpt-oss-120b} NSTREAM_LICENSED_TRAILERS_JSON: ${NSTREAM_LICENSED_TRAILERS_JSON:-} depends_on: postgres: condition: service_healthy redis: condition: service_healthy restart: unless-stopped postgres: image: postgres:17-alpine environment: POSTGRES_DB: ${POSTGRES_DB:-nstream} POSTGRES_USER: ${POSTGRES_USER:-nstream} POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-nstream_local_password} ports: - "${POSTGRES_PORT:-5432}:5432" volumes: - postgres-data:/var/lib/postgresql/data healthcheck: test: ["CMD-SHELL", "pg_isready -U $$POSTGRES_USER -d $$POSTGRES_DB"] interval: 5s timeout: 5s retries: 10 redis: image: redis:7-alpine ports: - "${REDIS_PORT:-6379}:6379" volumes: - redis-data:/data healthcheck: test: ["CMD", "redis-cli", "ping"] interval: 5s timeout: 5s retries: 10 mailpit: image: axllent/mailpit:v1.27 ports: - "${MAILPIT_SMTP_PORT:-1025}:1025" - "${MAILPIT_UI_PORT:-8025}:8025" volumes: postgres-data: redis-data: