services: app: build: context: . dockerfile: Dockerfile args: - NODE_ENV=production image: phosphat-report:latest container_name: phosphat-report-app restart: unless-stopped ports: - "${APP_PORT:-3000}:3000" environment: - NODE_ENV=production - PORT=3000 - DATABASE_URL=file:/app/data/production.db - SESSION_SECRET=${SESSION_SECRET} - SUPER_ADMIN=${SUPER_ADMIN} - SUPER_ADMIN_EMAIL=${SUPER_ADMIN_EMAIL} - SUPER_ADMIN_PASSWORD=${SUPER_ADMIN_PASSWORD} - MAIL_HOST=${MAIL_HOST:-} - MAIL_PORT=${MAIL_PORT:-587} - MAIL_SECURE=${MAIL_SECURE:-false} - MAIL_USERNAME=${MAIL_USERNAME:-} - MAIL_PASSWORD=${MAIL_PASSWORD:-} - MAIL_FROM_NAME=${MAIL_FROM_NAME:-Phosphat Report System} - MAIL_FROM_EMAIL=${MAIL_FROM_EMAIL:-} volumes: - app_data:/app/data - app_logs:/app/logs networks: - app_network healthcheck: test: ["CMD", "wget", "--no-verbose", "--tries=1", "--spider", "http://localhost:3000/health", "||", "exit", "1"] interval: 30s timeout: 10s retries: 3 start_period: 40s deploy: resources: limits: memory: 512M cpus: '0.5' reservations: memory: 256M cpus: '0.25' backup: image: alpine:latest container_name: phosphat-report-backup restart: unless-stopped volumes: - app_data:/data:ro - backup_data:/backup command: > sh -c " apk add --no-cache dcron sqlite && echo '0 2 * * * cp /data/production.db /backup/production_$(date +%Y%m%d_%H%M%S).db && find /backup -name \"production_*.db\" -mtime +7 -delete' | crontab - && crond -f " networks: - app_network depends_on: - app volumes: app_data: driver: local app_logs: driver: local backup_data: driver: local networks: app_network: driver: bridge