# ============================================================================= # uload Docker Compose - Production (standalone) # ============================================================================= # Use this for manual production deployment without Coolify. # For Docker Compose deployments, use docker-compose.coolify.yml instead. # ============================================================================= services: # --------------------------------------------------------------------------- # PostgreSQL Database # --------------------------------------------------------------------------- postgres: image: postgres:16-alpine container_name: uload-db-prod restart: always environment: POSTGRES_DB: uload POSTGRES_USER: uload POSTGRES_PASSWORD: ${DB_PASSWORD} PGDATA: /var/lib/postgresql/data/pgdata volumes: - postgres_data:/var/lib/postgresql/data healthcheck: test: ["CMD-SHELL", "pg_isready -U uload -d uload"] interval: 10s timeout: 5s retries: 5 networks: - uload-network # --------------------------------------------------------------------------- # Redis Cache # --------------------------------------------------------------------------- redis: image: redis:7-alpine container_name: uload-redis-prod restart: always volumes: - redis_data:/data healthcheck: test: ["CMD", "redis-cli", "ping"] interval: 10s timeout: 5s retries: 5 networks: - uload-network # --------------------------------------------------------------------------- # uload Web Application # --------------------------------------------------------------------------- app: build: context: . dockerfile: Dockerfile container_name: uload-app-prod ports: - '3000:3000' environment: NODE_ENV: production PORT: 3000 HOST: 0.0.0.0 ORIGIN: ${ORIGIN:-https://ulo.ad} DATABASE_URL: postgresql://uload:${DB_PASSWORD}@postgres:5432/uload REDIS_URL: redis://redis:6379 AUTH_SECRET: ${AUTH_SECRET} RESEND_API_KEY: ${RESEND_API_KEY:-} STRIPE_SECRET_KEY: ${STRIPE_SECRET_KEY:-} STRIPE_WEBHOOK_SECRET: ${STRIPE_WEBHOOK_SECRET:-} R2_ACCESS_KEY_ID: ${R2_ACCESS_KEY_ID:-} R2_SECRET_ACCESS_KEY: ${R2_SECRET_ACCESS_KEY:-} R2_BUCKET_NAME: ${R2_BUCKET_NAME:-} R2_ENDPOINT: ${R2_ENDPOINT:-} PUBLIC_UMAMI_URL: ${PUBLIC_UMAMI_URL:-} PUBLIC_UMAMI_WEBSITE_ID: ${PUBLIC_UMAMI_WEBSITE_ID:-} restart: always depends_on: postgres: condition: service_healthy redis: condition: service_healthy healthcheck: test: ["CMD", "wget", "--no-verbose", "--tries=1", "--spider", "http://localhost:3000/api/health"] interval: 30s timeout: 10s retries: 3 start_period: 40s networks: - uload-network volumes: postgres_data: driver: local redis_data: driver: local networks: uload-network: driver: bridge