services: postgres: image: postgres:15-alpine container_name: dyolink_db_prod env_file: - database.env environment: - POSTGRES_USER=${POSTGRES_USER} - POSTGRES_PASSWORD=${POSTGRES_PASSWORD} - POSTGRES_DB=${POSTGRES_DB:-dyolink_db} - TZ=UTC ports: - "5433:5432" volumes: - postgres_data_prod:/var/lib/postgresql/data - ./database/init.sql:/docker-entrypoint-initdb.d/init.sql:ro - ./database/backups:/backups networks: - dyolink_network restart: unless-stopped logging: driver: "json-file" options: max-size: "10m" max-file: "3" healthcheck: test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER}"] interval: 30s timeout: 10s retries: 3 start_period: 40s backend: image: ${DOCKER_USERNAME}/dyolink-backend:${TAG:-latest} container_name: dyolink_backend_prod depends_on: postgres: condition: service_healthy env_file: - backend.env environment: - NODE_ENV=production - TZ=UTC - PORT=3000 ports: - "4001:3000" networks: - dyolink_network restart: unless-stopped logging: driver: "json-file" options: max-size: "10m" max-file: "3" healthcheck: test: ["CMD", "node", "-e", "require('http').get('http://127.0.0.1:3000/api/health', (r) => {if(r.statusCode!==200)process.exit(1)})"] interval: 30s timeout: 10s retries: 3 start_period: 40s frontend: image: ${DOCKER_USERNAME}/dyolink-frontend:${TAG:-latest} container_name: dyolink_frontend_prod depends_on: - backend env_file: - frontend.env environment: - NODE_ENV=production - TZ=UTC - PORT=3000 ports: - "4000:3000" networks: - dyolink_network restart: unless-stopped logging: driver: "json-file" options: max-size: "10m" max-file: "3" healthcheck: test: ["CMD", "node", "-e", "require('http').get('http://127.0.0.1:3000/', (r) => {if(r.statusCode!==200)process.exit(1)})"] interval: 30s timeout: 10s retries: 3 nginx: image: nginx:alpine container_name: dyolink_nginx_prod depends_on: - backend - frontend ports: - "80:80" - "443:443" volumes: - ./nginx/nginx.conf:/etc/nginx/conf.d/default.conf:ro - ./ssl:/etc/nginx/ssl:ro - ./logs/nginx:/var/log/nginx networks: - dyolink_network restart: unless-stopped logging: driver: "json-file" options: max-size: "10m" max-file: "3" networks: dyolink_network: driver: bridge name: dyolink_network volumes: postgres_data_prod: name: dyolink_postgres_data_prod