Files
DLE/docker-compose.yml
2026-03-01 22:03:48 +03:00

312 lines
10 KiB
YAML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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: