version: "3.8" networks: itcloud-net: driver: bridge internal: true # ВАЖНО: сеть без выхода "в интернет" (межконтейнерная) itcloud-edge: driver: bridge services: nginx: image: nginx:alpine ports: - "${NGINX_PORT:-8095}:80" volumes: - ./nginx/nginx.conf:/etc/nginx/conf.d/default.conf:ro depends_on: - frontend - backend restart: unless-stopped networks: - itcloud-edge - itcloud-net backend: build: ./backend expose: - "8000" environment: - APP_ENV=dev - DATABASE_URL=sqlite+aiosqlite:////app/data/app.db - S3_ENDPOINT_URL=http://minio:9000 - S3_REGION=us-east-1 - S3_ACCESS_KEY_ID=${MINIO_ROOT_USER:-minioadmin} - S3_SECRET_ACCESS_KEY=${MINIO_ROOT_PASSWORD:-minioadmin} - MEDIA_BUCKET=itcloud-media - JWT_SECRET=${JWT_SECRET:-dev-secret-key-change-in-production} - CORS_ORIGINS=${CORS_ORIGINS} - REDIS_URL=redis://redis:6379/0 volumes: - ./backend/src:/app/src - ./backend-data:/app/data depends_on: minio: condition: service_healthy redis: condition: service_healthy command: uvicorn app.main:app --host 0.0.0.0 --port 8000 --reload networks: - itcloud-net frontend: build: ./frontend expose: - "5173" environment: - VITE_API_URL=${VITE_API_URL} volumes: - ./frontend/src:/app/src - ./frontend/public:/app/public command: npm run dev -- --host 0.0.0.0 networks: - itcloud-net minio: image: minio/minio:latest ports: - "${MINIO_API_PORT:-9090}:9000" - "${MINIO_CONSOLE_PORT:-9091}:9001" environment: - MINIO_ROOT_USER=${MINIO_ROOT_USER:-minioadmin} - MINIO_ROOT_PASSWORD=${MINIO_ROOT_PASSWORD:-minioadmin} volumes: - ${S3_DATA_PATH:-/mnt/data/s3}:/data command: server /data --console-address ":9001" healthcheck: test: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/live"] interval: 10s timeout: 5s retries: 20 networks: - itcloud-edge - itcloud-net minio-setup: image: minio/mc:latest depends_on: minio: condition: service_healthy environment: - MINIO_ROOT_USER=${MINIO_ROOT_USER:-minioadmin} - MINIO_ROOT_PASSWORD=${MINIO_ROOT_PASSWORD:-minioadmin} - MEDIA_BUCKET=itcloud-media - TRASH_BUCKET=itcloud-trash entrypoint: > /bin/sh -c " set -e; mc alias set myminio http://minio:9000 $$MINIO_ROOT_USER $$MINIO_ROOT_PASSWORD; mc mb myminio/$$MEDIA_BUCKET --ignore-existing; mc mb myminio/$$TRASH_BUCKET --ignore-existing; mc anonymous set none myminio/$$MEDIA_BUCKET; mc anonymous set none myminio/$$TRASH_BUCKET; echo 'MinIO buckets ensured:' $$MEDIA_BUCKET $$TRASH_BUCKET; " restart: "no" networks: - itcloud-net redis: image: redis:7-alpine command: redis-server --appendonly yes --appendfsync everysec --save 60 1000 expose: - "6379" volumes: - redis-data:/data healthcheck: test: ["CMD", "redis-cli", "ping"] interval: 10s timeout: 3s retries: 20 networks: - itcloud-net worker: build: ./backend environment: - APP_ENV=dev - DATABASE_URL=sqlite+aiosqlite:////app/data/app.db - S3_ENDPOINT_URL=http://minio:9000 - S3_REGION=us-east-1 - S3_ACCESS_KEY_ID=${MINIO_ROOT_USER:-minioadmin} - S3_SECRET_ACCESS_KEY=${MINIO_ROOT_PASSWORD:-minioadmin} - MEDIA_BUCKET=itcloud-media - JWT_SECRET=${JWT_SECRET:-dev-secret-key-change-in-production} - CORS_ORIGINS=${CORS_ORIGINS} - REDIS_URL=redis://redis:6379/0 volumes: - ./backend/src:/app/src - ./backend-data:/app/data depends_on: minio: condition: service_healthy redis: condition: service_healthy command: python /app/src/worker.py restart: unless-stopped networks: - itcloud-net volumes: redis-data: