services: db: image: postgres:16-alpine restart: unless-stopped environment: POSTGRES_DB: cards_collection POSTGRES_USER: ${DB_USER:-cards} POSTGRES_PASSWORD: ${DB_PASSWORD:?Define DB_PASSWORD en .env} volumes: - db_data:/var/lib/postgresql/data healthcheck: test: ["CMD-SHELL", "pg_isready -U ${DB_USER:-cards} -d cards_collection"] interval: 5s timeout: 5s retries: 10 app: image: tallon43/cards-collection:latest restart: unless-stopped environment: DATABASE_URL: postgres://${DB_USER:-cards}:${DB_PASSWORD:?Define DB_PASSWORD en .env}@db:5432/cards_collection JWT_SECRET: ${JWT_SECRET:?Define JWT_SECRET en .env} JWT_EXPIRES_IN: ${JWT_EXPIRES_IN:-30d} CORS_ORIGIN: ${CORS_ORIGIN:-http://localhost:8080} NODE_ENV: production # Vacío => automático según el protocolo de cada petición: HTTPS detrás de un # proxy lo detecta solo; en HTTP plano en la LAN (lo normal en un NAS) no marca # la cookie de sesión como Secure, si no el navegador la descartaría. COOKIE_SECURE: ${COOKIE_SECURE:-} # Usuario admin creado en el primer arranque (ver README/DOCKER_HUB.md). ADMIN_USER: ${ADMIN_USER:-admin} # Si se deja vacío, se genera una contraseña aleatoria y se imprime UNA vez # en el log del contenedor (docker compose logs app). ADMIN_PASSWORD: ${ADMIN_PASSWORD:-} ports: - "${APP_PORT:-8080}:3000" depends_on: db: condition: service_healthy volumes: db_data: