version: '3.8' services: app: build: context: . dockerfile: Dockerfile.prod container_name: freezone-registration-app restart: unless-stopped environment: - RUST_ENV=production - RUST_LOG=info - STRIPE_SECRET_KEY=${STRIPE_SECRET_KEY} - STRIPE_WEBHOOK_SECRET=${STRIPE_WEBHOOK_SECRET} - SESSION_SECRET=${SESSION_SECRET} - DATABASE_URL=${DATABASE_URL} - REDIS_URL=${REDIS_URL} ports: - "8080:8080" volumes: - ./data:/app/data - ./logs:/app/logs depends_on: - redis - db networks: - freezone-network healthcheck: test: ["CMD", "curl", "-f", "http://localhost:8080/health"] interval: 30s timeout: 10s retries: 3 start_period: 40s redis: image: redis:7-alpine container_name: freezone-redis restart: unless-stopped command: redis-server --appendonly yes --requirepass ${REDIS_PASSWORD} environment: - REDIS_PASSWORD=${REDIS_PASSWORD} volumes: - redis_data:/data networks: - freezone-network healthcheck: test: ["CMD", "redis-cli", "--raw", "incr", "ping"] interval: 30s timeout: 10s retries: 3 db: image: postgres:15-alpine container_name: freezone-db restart: unless-stopped environment: - POSTGRES_DB=${POSTGRES_DB} - POSTGRES_USER=${POSTGRES_USER} - POSTGRES_PASSWORD=${POSTGRES_PASSWORD} volumes: - postgres_data:/var/lib/postgresql/data - ./db/init:/docker-entrypoint-initdb.d networks: - freezone-network healthcheck: test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER} -d ${POSTGRES_DB}"] interval: 30s timeout: 10s retries: 3 nginx: image: nginx:alpine container_name: freezone-nginx restart: unless-stopped ports: - "80:80" - "443:443" volumes: - ./nginx/nginx.conf:/etc/nginx/nginx.conf:ro - ./nginx/ssl:/etc/nginx/ssl:ro - ./static:/var/www/static:ro depends_on: - app networks: - freezone-network healthcheck: test: ["CMD", "wget", "--quiet", "--tries=1", "--spider", "http://localhost/health"] interval: 30s timeout: 10s retries: 3 prometheus: image: prom/prometheus:latest container_name: freezone-prometheus restart: unless-stopped command: - '--config.file=/etc/prometheus/prometheus.yml' - '--storage.tsdb.path=/prometheus' - '--web.console.libraries=/etc/prometheus/console_libraries' - '--web.console.templates=/etc/prometheus/consoles' - '--storage.tsdb.retention.time=200h' - '--web.enable-lifecycle' volumes: - ./monitoring/prometheus.yml:/etc/prometheus/prometheus.yml:ro - prometheus_data:/prometheus ports: - "9090:9090" networks: - freezone-network grafana: image: grafana/grafana:latest container_name: freezone-grafana restart: unless-stopped environment: - GF_SECURITY_ADMIN_PASSWORD=${GRAFANA_PASSWORD} - GF_USERS_ALLOW_SIGN_UP=false volumes: - grafana_data:/var/lib/grafana - ./monitoring/grafana/dashboards:/etc/grafana/provisioning/dashboards:ro - ./monitoring/grafana/datasources:/etc/grafana/provisioning/datasources:ro ports: - "3000:3000" depends_on: - prometheus networks: - freezone-network loki: image: grafana/loki:latest container_name: freezone-loki restart: unless-stopped command: -config.file=/etc/loki/local-config.yaml volumes: - ./monitoring/loki.yml:/etc/loki/local-config.yaml:ro - loki_data:/loki ports: - "3100:3100" networks: - freezone-network promtail: image: grafana/promtail:latest container_name: freezone-promtail restart: unless-stopped command: -config.file=/etc/promtail/config.yml volumes: - ./monitoring/promtail.yml:/etc/promtail/config.yml:ro - ./logs:/var/log/app:ro - /var/log:/var/log/host:ro depends_on: - loki networks: - freezone-network volumes: postgres_data: driver: local redis_data: driver: local prometheus_data: driver: local grafana_data: driver: local loki_data: driver: local networks: freezone-network: driver: bridge