273 lines
9.0 KiB
YAML
273 lines
9.0 KiB
YAML
# 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}
|
|
# 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: |