version: '3.8' services: # PostgreSQL Database postgres: image: postgres:17-alpine container_name: blog_postgres_dev restart: unless-stopped environment: POSTGRES_USER: blog POSTGRES_PASSWORD: postgres POSTGRES_DB: blog_dev volumes: - postgres_data_dev:/var/lib/postgresql/data ports: - "5432:5432" healthcheck: test: ["CMD-SHELL", "pg_isready -U blog"] interval: 10s timeout: 5s retries: 5 networks: - blog_network # Redis Cache redis: image: redis:7-alpine container_name: blog_redis_dev restart: unless-stopped command: redis-server --appendonly yes volumes: - redis_data_dev:/data ports: - "6379:6379" healthcheck: test: ["CMD", "redis-cli", "--raw", "incr", "ping"] interval: 10s timeout: 5s retries: 5 networks: - blog_network # NestJS Backend API api: build: context: .. dockerfile: deploy/Dockerfile target: backend-prod container_name: blog_api_dev restart: unless-stopped depends_on: postgres: condition: service_healthy redis: condition: service_healthy environment: NODE_ENV: development PORT: 3000 DATABASE_URL: postgresql://blog:postgres@postgres:5432/blog_dev REDIS_URL: redis://redis:6379 API_PORT: 3000 LOG_LEVEL: debug ports: - "3000:3000" volumes: - ../apps/api/src:/app/apps/api/src networks: - blog_network # Next.js Frontend frontend: build: context: .. dockerfile: deploy/Dockerfile target: frontend-prod container_name: blog_frontend_dev restart: unless-stopped environment: NODE_ENV: development NEXT_PUBLIC_API_URL: http://localhost:3000 ports: - "3001:3001" volumes: - ../apps/frontend/src:/app/apps/frontend/src networks: - blog_network # Nginx Reverse Proxy nginx: image: nginx:alpine container_name: blog_nginx_dev restart: unless-stopped depends_on: - api - frontend ports: - "80:80" volumes: - ./nginx.conf:/etc/nginx/nginx.conf:ro networks: - blog_network networks: blog_network: driver: bridge volumes: postgres_data_dev: driver: local redis_data_dev: driver: local