312 lines
10 KiB
YAML
312 lines
10 KiB
YAML
# Copyright (c) 2024-2026 Тарабанов Александр Викторович
|
||
# 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
|
||
|
||
# Gitea — самохостируемый Git-сервис для репозиториев DLE (БД в том же postgres).
|
||
# Перед первым запуском: ./scripts/setup-gitea-db.sh
|
||
gitea:
|
||
image: gitea/gitea:1.24
|
||
container_name: dapp-gitea
|
||
restart: unless-stopped
|
||
dns:
|
||
- 1.1.1.1
|
||
- 9.9.9.9
|
||
- 8.8.8.8
|
||
logging:
|
||
driver: "json-file"
|
||
options:
|
||
max-size: "10m"
|
||
max-file: "3"
|
||
depends_on:
|
||
postgres:
|
||
condition: service_healthy
|
||
environment:
|
||
- USER_UID=1000
|
||
- USER_GID=1000
|
||
- GITEA__server__ROOT_URL=http://localhost:3001/
|
||
- GITEA__server__HTTP_PORT=3000
|
||
- GITEA__security__X_FRAME_OPTIONS=
|
||
- GITEA__service__ENABLE_PASSKEY_AUTHENTICATION=false
|
||
- GITEA__database__DB_TYPE=postgres
|
||
- GITEA__database__HOST=postgres:5432
|
||
- GITEA__database__NAME=gitea
|
||
- GITEA__database__USER=gitea
|
||
- GITEA__database__PASSWD=${GITEA_DB_PASSWORD:-gitea}
|
||
volumes:
|
||
- gitea_data:/data
|
||
- /etc/timezone:/etc/timezone:ro
|
||
- /etc/localtime:/etc/localtime:ro
|
||
ports:
|
||
- "3001:3000" # Веб-интерфейс (3000 занят webssh-agent)
|
||
|
||
# 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:
|
||
gitea_data:
|
||
frontend_node_modules:
|
||
backend_node_modules: |