services: postgres: image: postgres:15-alpine container_name: pg-admin-db environment: POSTGRES_USER: ${DB_USER:-postgres} POSTGRES_PASSWORD: ${DB_PASSWORD:-postgres} POSTGRES_DB: ${DB_NAME:-pg_admin} POSTGRES_INITDB_ARGS: "--encoding=UTF8 -c shared_buffers=256MB -c max_connections=100" # БД НЕ открыта наружу - только для контейнеров volumes: - postgres_data:/var/lib/postgresql/data - ./docker/init-db.sql:/docker-entrypoint-initdb.d/init.sql healthcheck: test: ["CMD-SHELL", "pg_isready -U ${DB_USER:-postgres} -d ${DB_NAME:-pg_admin}"] interval: 10s timeout: 5s retries: 5 networks: - pg-admin-network restart: unless-stopped deploy: resources: limits: cpus: '1' memory: 512M reservations: cpus: '0.5' memory: 256M backend: build: context: ./backend dockerfile: ../docker/Dockerfile.backend container_name: pg-admin-api environment: NODE_ENV: ${NODE_ENV:-production} PORT: ${API_PORT:-3000} DB_HOST: postgres DB_PORT: 5432 DB_USER: ${DB_USER:-postgres} DB_PASSWORD: ${DB_PASSWORD:-postgres} DB_NAME: ${DB_NAME:-pg_admin} JWT_SECRET: ${JWT_SECRET:-change_me_in_production} JWT_EXPIRE: ${JWT_EXPIRE:-7d} MAX_CONNECTIONS: ${MAX_CONNECTIONS:-20} LOG_LEVEL: ${LOG_LEVEL:-info} # API НЕ открыт наружу - только для nginx depends_on: postgres: condition: service_healthy volumes: - ./backend/src:/app/src - ./backend/logs:/app/logs networks: - pg-admin-network restart: unless-stopped deploy: resources: limits: cpus: '1' memory: 512M reservations: cpus: '0.5' memory: 256M frontend: build: context: ./frontend dockerfile: ../docker/Dockerfile.frontend container_name: pg-admin-ui environment: REACT_APP_API_URL: ${FRONTEND_API_URL:-http://localhost:3000/api} REACT_APP_ENV: ${NODE_ENV:-production} # Frontend НЕ открыт наружу - только для nginx depends_on: - backend volumes: - ./frontend/src:/app/src networks: - pg-admin-network restart: unless-stopped deploy: resources: limits: cpus: '1' memory: 512M reservations: cpus: '0.5' memory: 256M redis: image: redis:7-alpine container_name: pg-admin-cache # Redis НЕ открыт наружу - только для контейнеров command: redis-server --appendonly yes --maxmemory 256mb --maxmemory-policy allkeys-lru volumes: - redis_data:/data healthcheck: test: ["CMD", "redis-cli", "ping"] interval: 10s timeout: 5s retries: 5 networks: - pg-admin-network restart: unless-stopped deploy: resources: limits: cpus: '0.5' memory: 256M reservations: cpus: '0.25' memory: 128M nginx: image: nginx:alpine container_name: pg-admin-proxy ports: - "${NGINX_PORT:-80}:80" volumes: - ./docker/nginx.conf:/etc/nginx/nginx.conf:ro depends_on: - frontend - backend networks: - pg-admin-network restart: unless-stopped deploy: resources: limits: cpus: '0.5' memory: 256M reservations: cpus: '0.25' memory: 128M volumes: postgres_data: driver: local redis_data: driver: local networks: pg-admin-network: driver: bridge