286 lines
9.5 KiB
YAML
286 lines
9.5 KiB
YAML
# Copyright (c) 2024-2025 Тарабанов Александр Викторович
|
||
# All rights reserved.
|
||
# This software is proprietary and confidential.
|
||
# For licensing inquiries: info@hb3-accelerator.com
|
||
|
||
# Production docker-compose для VDS
|
||
services:
|
||
postgres:
|
||
image: postgres:16
|
||
container_name: dapp-postgres
|
||
restart: unless-stopped
|
||
networks:
|
||
- dapp_network
|
||
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}
|
||
# 🆕 SCRAM-SHA-256 для безопасной аутентификации
|
||
- POSTGRES_INITDB_ARGS=--auth-host=scram-sha-256 --auth-local=scram-sha-256
|
||
# НЕ открываем порт 5432 наружу - только внутри Docker сети
|
||
healthcheck:
|
||
test:
|
||
- CMD-SHELL
|
||
- pg_isready -U ${DB_USER:-dapp_user} -d ${DB_NAME:-dapp_db}
|
||
interval: 5s
|
||
timeout: 5s
|
||
retries: 5
|
||
|
||
ollama:
|
||
image: digital_legal_entitydle-ollama:latest
|
||
container_name: dapp-ollama
|
||
restart: unless-stopped
|
||
networks:
|
||
- dapp_network
|
||
logging:
|
||
driver: "json-file"
|
||
options:
|
||
max-size: "20m"
|
||
max-file: "3"
|
||
volumes:
|
||
- ollama_data:/root/.ollama
|
||
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:
|
||
image: digital_legal_entitydle-vector-search:latest
|
||
container_name: dapp-vector-search
|
||
restart: unless-stopped
|
||
networks:
|
||
- dapp_network
|
||
logging:
|
||
driver: "json-file"
|
||
options:
|
||
max-size: "10m"
|
||
max-file: "3"
|
||
depends_on:
|
||
ollama:
|
||
condition: service_healthy
|
||
volumes:
|
||
- vector_search_data:/app/data
|
||
environment:
|
||
# 🆕 Исправленный URL для Ollama
|
||
- OLLAMA_BASE_URL=http://dapp-ollama:11434
|
||
- OLLAMA_EMBED_MODEL=${OLLAMA_EMBEDDINGS_MODEL:-mxbai-embed-large:latest}
|
||
- VECTOR_SEARCH_PORT=8001
|
||
- LOG_LEVEL=INFO
|
||
# 🆕 Улучшенный health check с fallback
|
||
healthcheck:
|
||
test:
|
||
- CMD-SHELL
|
||
- >-
|
||
python -c "import sys, urllib.request;
|
||
sys.exit(0 if urllib.request.urlopen('http://127.0.0.1:8001/health', timeout=5).getcode() == 200 else 1)"
|
||
interval: 20s
|
||
timeout: 5s
|
||
retries: 5
|
||
start_period: 40s
|
||
|
||
backend:
|
||
image: digital_legal_entitydle-backend:latest
|
||
container_name: dapp-backend
|
||
restart: unless-stopped
|
||
networks:
|
||
- dapp_network
|
||
logging:
|
||
driver: "json-file"
|
||
options:
|
||
max-size: "5m"
|
||
max-file: "2"
|
||
# 🆕 Исправленные зависимости - backend запускается после postgres и ollama, но не ждет vector-search
|
||
depends_on:
|
||
postgres:
|
||
condition: service_healthy
|
||
ollama:
|
||
condition: service_healthy
|
||
vector-search:
|
||
condition: service_started
|
||
volumes:
|
||
- ./backend:/app
|
||
- backend_node_modules:/app/node_modules
|
||
- ./ssl:/app/ssl:ro
|
||
# Доступ к Docker socket для управления контейнерами на VDS
|
||
- /var/run/docker.sock:/var/run/docker.sock:ro
|
||
# Доступ к системным файловым системам для мониторинга и управления
|
||
# Монтируем напрямую для работы команд top, free, ps и т.д.
|
||
- /proc:/host/proc:ro
|
||
- /sys:/host/sys:ro
|
||
# Также монтируем в стандартные пути для совместимости (read-only для безопасности)
|
||
- /proc:/proc:ro
|
||
- /sys:/sys:ro
|
||
- ~/.ssh:/root/.ssh:ro # SSH ключи для подключения к VDS
|
||
# Добавляем необходимые capabilities для управления системой
|
||
cap_add:
|
||
- SYS_ADMIN # Для управления системой (reboot, shutdown, useradd и т.д.)
|
||
- SYS_TIME # Для управления временем системы
|
||
environment:
|
||
- NODE_ENV=production
|
||
- PORT=8000
|
||
- FRONTEND_URL=https://${DOMAIN}
|
||
# 🆕 Исправленные переменные БД с правильными именами хостов
|
||
- DB_HOST=dapp-postgres
|
||
- DB_PORT=5432
|
||
- DB_NAME=${DB_NAME:-dapp_db}
|
||
- DB_USER=${DB_USER:-dapp_user}
|
||
- DB_PASSWORD=${DB_PASSWORD:-dapp_password}
|
||
# 🆕 DATABASE_URL с SCRAM-SHA-256 поддержкой
|
||
- DATABASE_URL=postgresql://${DB_USER:-dapp_user}:${DB_PASSWORD:-dapp_password}@dapp-postgres:5432/${DB_NAME:-dapp_db}?sslmode=prefer
|
||
# 🆕 Исправленный URL для Ollama
|
||
- OLLAMA_BASE_URL=http://dapp-ollama:11434
|
||
- OLLAMA_MODEL=${OLLAMA_MODEL:-qwen2.5:7b}
|
||
- OLLAMA_EMBEDDINGS_MODEL=${OLLAMA_EMBEDDINGS_MODEL:-mxbai-embed-large:latest}
|
||
# 🆕 Исправленный URL для Vector Search
|
||
- VECTOR_SEARCH_URL=http://dapp-vector-search:8001
|
||
# Команда запуска для production
|
||
command: ["yarn", "run", "start"]
|
||
# НЕ открываем порт 8000 наружу - только nginx подключается
|
||
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:
|
||
image: digital_legal_entitydle-frontend:latest
|
||
container_name: dapp-frontend
|
||
restart: unless-stopped
|
||
networks:
|
||
- dapp_network
|
||
logging:
|
||
driver: "json-file"
|
||
options:
|
||
max-size: "5m"
|
||
max-file: "2"
|
||
depends_on:
|
||
backend:
|
||
condition: service_healthy
|
||
volumes:
|
||
- ./ssl:/app/ssl:ro
|
||
environment:
|
||
- NODE_ENV=production
|
||
- PORT=5173
|
||
# 🆕 Исправленный URL для backend
|
||
- VITE_BACKEND_URL=https://${DOMAIN}/api
|
||
- VITE_WS_URL=wss://${DOMAIN}/ws
|
||
# НЕ открываем порт 5173 наружу - только nginx подключается
|
||
healthcheck:
|
||
test: ["CMD", "node", "-e", "require('http').get('http://localhost:5173', (res) => { process.exit(res.statusCode === 200 ? 0 : 1) })"]
|
||
interval: 30s
|
||
timeout: 10s
|
||
retries: 5
|
||
start_period: 60s
|
||
|
||
# Certbot контейнер для автоматического получения SSL сертификатов
|
||
# 🆕 Убрана зависимость от frontend-nginx - certbot может работать независимо
|
||
certbot:
|
||
image: certbot/certbot
|
||
container_name: dapp-certbot
|
||
restart: "no"
|
||
networks:
|
||
- dapp_network
|
||
volumes:
|
||
- /etc/letsencrypt:/etc/letsencrypt
|
||
- /var/www/certbot:/var/www/certbot
|
||
command: >-
|
||
certonly
|
||
--webroot
|
||
--webroot-path=/var/www/certbot
|
||
--email ${EMAIL}
|
||
--agree-tos
|
||
--no-eff-email
|
||
--non-interactive
|
||
--keep-until-expiring
|
||
--expand
|
||
-d ${DOMAIN}
|
||
# 🆕 Убрана зависимость - certbot работает независимо через временный nginx или существующий
|
||
|
||
# Nginx с автоматическим SSL и поддержкой WebSocket
|
||
frontend-nginx:
|
||
image: digital_legal_entitydle-frontend-nginx:latest
|
||
container_name: dapp-frontend-nginx
|
||
restart: unless-stopped
|
||
networks:
|
||
- dapp_network
|
||
ports:
|
||
- "80:80"
|
||
- "443:443"
|
||
environment:
|
||
- DOMAIN=${DOMAIN:-localhost}
|
||
- BACKEND_CONTAINER=dapp-backend
|
||
- EMAIL=${EMAIL}
|
||
# 🆕 Переменные для WebSocket поддержки
|
||
- WS_BACKEND_CONTAINER=dapp-backend
|
||
volumes:
|
||
# SSL сертификаты Let's Encrypt (автоматически обновляются)
|
||
- /etc/letsencrypt:/etc/letsencrypt:ro
|
||
# Webroot для certbot
|
||
- /var/www/certbot:/var/www/certbot
|
||
depends_on:
|
||
- backend
|
||
- frontend
|
||
healthcheck:
|
||
test: ["CMD-SHELL", "curl -k -f https://127.0.0.1/health || curl -f http://127.0.0.1/health || exit 1"]
|
||
interval: 30s
|
||
timeout: 10s
|
||
retries: 5
|
||
start_period: 30s
|
||
|
||
webssh-agent:
|
||
image: digital_legal_entitydle-webssh-agent:latest
|
||
container_name: dapp-webssh-agent
|
||
restart: unless-stopped
|
||
volumes:
|
||
- ~/.ssh:/root/.ssh:ro
|
||
- /var/run/docker.sock:/var/run/docker.sock:rw
|
||
# 🆕 Исправленный проброс портов - только локальный доступ для безопасности
|
||
ports:
|
||
- "127.0.0.1:3000:3000"
|
||
environment:
|
||
- NODE_ENV=production
|
||
depends_on:
|
||
- backend
|
||
|
||
|
||
# 🆕 Явное определение Docker сети для обеспечения связи между контейнерами
|
||
networks:
|
||
dapp_network:
|
||
driver: bridge
|
||
name: dapp_network
|
||
|
||
volumes:
|
||
postgres_data:
|
||
ollama_data:
|
||
vector_search_data:
|
||
backend_node_modules:
|