services: db: image: postgres:18-alpine restart: always env_file: - ./backend/qlockify-backend-deployment/.env volumes: - postgres_data:/var/lib/postgresql - ./postgres/init.sql:/docker-entrypoint-initdb.d/init.sql command: postgres healthcheck: test: ["CMD-SHELL", "pg_isready -U $${POSTGRES_USER} -d $${POSTGRES_DB}"] interval: 10s timeout: 5s retries: 5 ports: - "127.0.0.1:5432:5432" # Bound to localhost for security (as in old project) redis: image: redis:7-alpine restart: always ports: - "127.0.0.1:6379:6379" backend: build: context: ./backend/qlockify-backend-deployment dockerfile: ../Dockerfile restart: always env_file: - ./backend/qlockify-backend-deployment/.env volumes: - static_data:/app/static - media_data:/app/media command: > sh -c "python manage.py migrate && python manage.py collectstatic --noinput && gunicorn config.wsgi:application --bind 0.0.0.0:8000" expose: - "8000" depends_on: db: condition: service_healthy redis: condition: service_started celery: build: context: ./backend/qlockify-backend-deployment dockerfile: ../Dockerfile restart: always env_file: - ./backend/qlockify-backend-deployment/.env volumes: - media_data:/app/media command: celery -A config worker -l INFO depends_on: db: condition: service_healthy redis: condition: service_started backend: condition: service_started frontend: build: context: ./frontend/qlockify-frontend-deployment dockerfile: ../Dockerfile restart: always env_file: - ./frontend/qlockify-frontend-deployment/.env expose: - "80" nginx: image: nginx:alpine restart: always ports: - "80:80" - "443:443" volumes: - ./nginx/nginx.conf:/etc/nginx/conf.d/default.conf:ro - ./nginx/certs:/etc/nginx/certs:ro - ./nginx/.htpasswd:/etc/nginx/.htpasswd:ro - static_data:/usr/share/nginx/html/static:ro - media_data:/usr/share/nginx/html/media:ro depends_on: - backend - frontend volumes: postgres_data: static_data: media_data: