# Copyright (c) 2024-2025 Тарабанов Александр Викторович # All rights reserved. # This software is proprietary and confidential. # For licensing inquiries: info@hb3-accelerator.com services: postgres: image: postgres:16 container_name: dapp-postgres restart: unless-stopped dns: - 1.1.1.1 # Cloudflare (приватность) - 9.9.9.9 # Quad9 (безопасность + блокировка вредоносных доменов) - 8.8.8.8 # Google (надежность, fallback) logging: driver: "json-file" options: max-size: "10m" max-file: "3" volumes: - postgres_data:/var/lib/postgresql/data - ./backend/db/data:/mnt/isic_csv_data environment: - POSTGRES_DB=${DB_NAME:-dapp_db} - POSTGRES_USER=${DB_USER:-dapp_user} - POSTGRES_PASSWORD=${DB_PASSWORD:-dapp_password} healthcheck: test: - CMD-SHELL - pg_isready -U ${DB_USER:-dapp_user} -d ${DB_NAME:-dapp_db} interval: 5s timeout: 5s retries: 5 ollama: build: context: . dockerfile: Dockerfile.ollama container_name: dapp-ollama restart: unless-stopped dns: - 1.1.1.1 # Cloudflare (приватность) - 9.9.9.9 # Quad9 (безопасность + блокировка вредоносных доменов) - 8.8.8.8 # Google (надежность, fallback) logging: driver: "json-file" options: max-size: "20m" max-file: "3" volumes: - ollama_data:/root/.ollama # ports: # - '11434:11434' # ЗАКРЫТЬ! Доступ только через backend deploy: resources: limits: cpus: '2.0' memory: 6G reservations: cpus: '1.0' memory: 4G environment: - OLLAMA_HOST=0.0.0.0 - OLLAMA_ORIGINS=* - OLLAMA_NUM_PARALLEL=2 - OLLAMA_NUM_GPU=0 - OLLAMA_KEEP_ALIVE=86400 - OLLAMA_MODEL_TIMEOUT=0 - OLLAMA_MAX_LOADED_MODELS=2 - OLLAMA_FLASH_ATTENTION=0 - OLLAMA_LLM_LIBRARY=auto healthcheck: test: ["CMD", "ollama", "list"] interval: 30s timeout: 10s retries: 5 start_period: 120s vector-search: build: context: ./vector-search dockerfile: Dockerfile container_name: dapp-vector-search restart: unless-stopped dns: - 1.1.1.1 # Cloudflare (приватность) - 9.9.9.9 # Quad9 (безопасность + блокировка вредоносных доменов) - 8.8.8.8 # Google (надежность, fallback) logging: driver: "json-file" options: max-size: "10m" max-file: "3" depends_on: ollama: condition: service_healthy volumes: - ./vector-search:/app - vector_search_data:/app/data environment: - OLLAMA_BASE_URL=http://ollama:11434 - OLLAMA_EMBED_MODEL=${OLLAMA_EMBEDDINGS_MODEL:-mxbai-embed-large:latest} # ports: # - '8001:8001' # Закрываем - используется только backend'ом healthcheck: test: ["CMD", "python", "-c", "import requests; requests.get('http://localhost:8001/health')"] interval: 30s timeout: 10s retries: 5 start_period: 60s backend: build: context: ./backend dockerfile: Dockerfile container_name: dapp-backend restart: unless-stopped dns: - 1.1.1.1 # Cloudflare (приватность) - 9.9.9.9 # Quad9 (безопасность + блокировка вредоносных доменов) - 8.8.8.8 # Google (надежность, fallback) logging: driver: "json-file" options: max-size: "5m" max-file: "2" depends_on: postgres: condition: service_healthy ollama: condition: service_healthy vector-search: condition: service_healthy volumes: - ./backend:/app - ./backend/uploads:/app/uploads - backend_node_modules:/app/node_modules - ./frontend/dist:/app/frontend_dist:ro - ./ssl:/app/ssl - ./shared:/app/shared:ro - ~/.ssh:/root/.ssh:ro # SSH ключи для подключения к VDS environment: - NODE_ENV=${NODE_ENV:-production} - PORT=${PORT:-8000} - DB_HOST=postgres - DB_PORT=5432 - DB_NAME=${DB_NAME:-dapp_db} - DB_USER=${DB_USER:-dapp_user} - DB_PASSWORD=${DB_PASSWORD:-dapp_password} - >- DATABASE_URL=postgresql://${DB_USER:-dapp_user}:${DB_PASSWORD:-dapp_password}@postgres:5432/${DB_NAME:-dapp_db} - OLLAMA_BASE_URL=http://ollama:11434 - OLLAMA_MODEL=${OLLAMA_MODEL:-qwen2.5:7b} - OLLAMA_EMBEDDINGS_MODEL=${OLLAMA_EMBEDDINGS_MODEL:-mxbai-embed-large:latest} - OLLAMA_EMBED_MODEL=${OLLAMA_EMBEDDINGS_MODEL:-mxbai-embed-large:latest} # FRONTEND_URL настраивается в коде, не через env - VECTOR_SEARCH_URL=http://vector-search:8001 - LOG_LEVEL=${LOG_LEVEL:-warn} # Factory адреса теперь хранятся в базе данных # Убираем порты для продакшна - доступ только через nginx # ports: # - '8000:8000' extra_hosts: - host.docker.internal:host-gateway healthcheck: test: ["CMD", "node", "-e", "require('http').get('http://localhost:8000/api/health', (res) => { process.exit(res.statusCode === 200 ? 0 : 1) })"] interval: 30s timeout: 10s retries: 5 start_period: 60s frontend: profiles: ["dev"] # Только для разработки build: context: ./frontend dockerfile: Dockerfile container_name: dapp-frontend restart: unless-stopped dns: - 1.1.1.1 # Cloudflare (приватность) - 9.9.9.9 # Quad9 (безопасность + блокировка вредоносных доменов) - 8.8.8.8 # Google (надежность, fallback) logging: driver: "json-file" options: max-size: "10m" max-file: "3" depends_on: backend: condition: service_healthy volumes: - ./frontend:/app - frontend_node_modules:/app/node_modules - ./shared:/app/shared:ro ports: - '5173:5173' # Vite dev server для локальной разработки command: yarn run dev -- --host 0.0.0.0 frontend-nginx: build: context: ./frontend dockerfile: nginx.Dockerfile container_name: dapp-frontend-nginx restart: unless-stopped dns: - 1.1.1.1 # Cloudflare (приватность) - 9.9.9.9 # Quad9 (безопасность + блокировка вредоносных доменов) - 8.8.8.8 # Google (надежность, fallback) ports: - "9000:80" # Frontend nginx (для production на VDS) - "9443:443" # HTTPS порт для production на VDS environment: - DOMAIN=${DOMAIN:-production.local} - BACKEND_CONTAINER=dapp-backend depends_on: - backend # SSH Key Server отключен по безопасности (оставлен пример профиля dev при необходимости) # ssh-key-server: # profiles: ["dev"] # image: node:20-slim # container_name: dapp-ssh-key-server # restart: unless-stopped # dns: # - 1.1.1.1 # - 9.9.9.9 # - 8.8.8.8 # volumes: # - ./scripts/ssh-key-server.js:/app/ssh-key-server.js:ro # - ./ssl:/app/ssl:ro # - ~/.ssh:/root/.ssh:ro # command: node /app/ssh-key-server.js # # Порт намеренно не публикуется, без healthcheck # WebSSH Agent для настройки VDS webssh-agent: build: context: ./webssh-agent dockerfile: Dockerfile args: WEBSSH_UID: ${LOCAL_UID:-1000} WEBSSH_GID: ${LOCAL_GID:-1000} container_name: dapp-webssh-agent restart: unless-stopped dns: - 1.1.1.1 # Cloudflare (приватность) - 9.9.9.9 # Quad9 (безопасность + блокировка вредоносных доменов) - 8.8.8.8 # Google (надежность, fallback) volumes: - ~/.ssh:/home/webssh/.ssh:rw - /var/run/docker.sock:/var/run/docker.sock:rw - /tmp:/tmp # для временных файлов - ./ssl:/app/ssl # для доступа к ключу шифрования security_opt: - no-new-privileges:true # Запрет повышения привилегий ports: - '3000:3000' # Локальный доступ environment: - NODE_ENV=${NODE_ENV:-development} depends_on: - backend healthcheck: test: ["CMD", "wget", "--quiet", "--tries=1", "--spider", "http://localhost:3000/health"] interval: 30s timeout: 10s retries: 3 volumes: postgres_data: ollama_data: vector_search_data: frontend_node_modules: backend_node_modules: