Files
iistwin/docker-compose.yml
Ильяс Султанов 87fe0f03f5 chore(compose): ресурсные лимиты для всех сервисов
Шаг 0.4 плана production-готовности (подтверждён пользователем):
- mem_limit/cpus/pids_limit по docker stats прода + запас
- все 4 compose-файла + серверный бэкап .bak.serverfix
- config валиден везде
2026-09-08 10:01:23 +03:00

215 lines
7.1 KiB
YAML
Raw Permalink 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.

services:
app:
build: .
ports:
- "5000:5000"
env_file:
- .env
environment:
OLLAMA_BASE_URL: ${OLLAMA_BASE_URL:-http://ollama:11434}
DOC_WORKER_URL: ${DOC_WORKER_URL:-http://document-worker:3000}
# GPS: URL Traccar API внутри Docker-сети (user/password — в .env)
TRACCAR_API_URL: ${TRACCAR_API_URL:-http://traccar:8082}
volumes:
- crm_data:/app/data
restart: unless-stopped
# Ресурсные лимиты (шаг 0.4): значения = потребление на проде + запас (docker stats 2026-09-07)
mem_limit: 1g
cpus: 1.5
pids_limit: 256
depends_on:
db:
condition: service_healthy
required: false
minio:
condition: service_healthy
required: false
ollama:
condition: service_healthy
required: false
db:
image: postgres:16-alpine
profiles:
- with-postgres
environment:
POSTGRES_DB: ${POSTGRES_DB:-appdb}
POSTGRES_USER: ${POSTGRES_USER:-appuser}
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:?POSTGRES_PASSWORD is required}
volumes:
- postgres_data:/var/lib/postgresql/data
restart: unless-stopped
healthcheck:
test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER:-appuser} -d ${POSTGRES_DB:-appdb}"]
interval: 5s
timeout: 5s
retries: 10
start_period: 10s
mem_limit: 768m
cpus: 0.75
pids_limit: 128
minio:
# Тег запинен: совпадает с версией на продакшене (RELEASE.2025-09-07T16-13-09Z)
image: minio/minio:RELEASE.2025-09-07T16-13-09Z
profiles:
- with-minio
command: server /data --console-address :9001
ports:
- "9000:9000" # S3 API (используется приложением)
- "9001:9001" # MinIO Web Console (http://localhost:9001)
environment:
# Креды MinIO — только из .env, дефолтов нет: в production обязательно сменить minioadmin/minioadmin
MINIO_ROOT_USER: ${MINIO_ACCESS_KEY:?MINIO_ACCESS_KEY is required}
MINIO_ROOT_PASSWORD: ${MINIO_SECRET_KEY:?MINIO_SECRET_KEY is required}
volumes:
- minio_data:/data
restart: unless-stopped
healthcheck:
test: ["CMD", "mc", "ready", "local"]
interval: 10s
timeout: 5s
retries: 10
start_period: 15s
mem_limit: 256m
cpus: 0.5
pids_limit: 64
webdav:
# Тег запинен: совпадает с версией на продакшене (rclone v1.74.0)
image: rclone/rclone:1.74.0
profiles:
- with-minio
entrypoint: /bin/sh
command: >
-c "rclone serve webdav
--addr :8080
--user $${WEBDAV_USER:-admin}
--pass $${WEBDAV_PASSWORD:?WEBDAV_PASSWORD is required}
--no-checksum
:s3:$${MINIO_BUCKET:-files}
--s3-provider=Minio
--s3-access-key-id=$${MINIO_ACCESS_KEY:?MINIO_ACCESS_KEY is required}
--s3-secret-access-key=$${MINIO_SECRET_KEY}
--s3-endpoint=http://minio:9000
--s3-no-check-bucket"
ports:
- "8080:8080" # WebDAV (http://device-ip:8080)
environment:
WEBDAV_USER: ${WEBDAV_USER:-admin}
WEBDAV_PASSWORD: ${WEBDAV_PASSWORD:-}
MINIO_ACCESS_KEY: ${MINIO_ACCESS_KEY:?MINIO_ACCESS_KEY is required}
MINIO_SECRET_KEY: ${MINIO_SECRET_KEY:-}
MINIO_BUCKET: ${MINIO_BUCKET:-files}
restart: unless-stopped
depends_on:
minio:
condition: service_healthy
mem_limit: 64m
cpus: 0.25
pids_limit: 32
ollama:
# Тег запинен: совпадает с версией на продакшене (ollama 0.30.10)
image: ollama/ollama:0.30.10
profiles:
- with-ollama
ports:
- "11434:11434"
environment:
- OLLAMA_KEEP_ALIVE=${OLLAMA_KEEP_ALIVE:-5m}
- OLLAMA_NUM_PARALLEL=1
volumes:
- ollama_data:/root/.ollama
restart: unless-stopped
healthcheck:
test: ["CMD-SHELL", "ollama list >/dev/null 2>&1 || exit 1"]
interval: 10s
timeout: 5s
retries: 12
start_period: 30s
# Ollama держит модель в RAM во время ночного батча (bge-m3 ~1-2 ГБ)
mem_limit: 2g
cpus: 2.0
pids_limit: 64
# Раскомментируйте секцию ниже для поддержки NVIDIA GPU:
# deploy:
# resources:
# reservations:
# devices:
# - driver: nvidia
# count: all
# capabilities: [gpu]
document-worker:
image: ghcr.io/iisultanov/iistwin-document-worker:latest
env_file:
- .env
environment:
PORT: 3000
# Порт не публикуется наружу — worker доступен только внутри Docker-сети
volumes:
- crm_data:/app/data
restart: unless-stopped
healthcheck:
test: ["CMD", "wget", "-qO-", "http://localhost:3000/health"]
interval: 30s
timeout: 10s
retries: 3
start_period: 30s
# LibreOffice при конвертации DOCX→PDF может потреблять сотни МБ
mem_limit: 1g
cpus: 1.0
pids_limit: 256
traccar:
# Тег запинен: совпадает с версией на продакшене (traccar 6.15.2)
image: traccar/traccar:6.15.2
container_name: traccar
restart: unless-stopped
ports:
- "5055:5055" # OsmAnd/HTTP — приём точек с трекеров/приложений
- "5023:5023" # GT06 (Concox, Coban, Jimi)
- "5023:5023/udp"
- "5027:5027" # Teltonika (FMB920/FMB125/FMC130)
- "5027:5027/udp"
- "5001:5001" # GPS103 / TK-102/103
- "5001:5001/udp"
- "5013:5013" # H02
- "5013:5013/udp"
- "5036:5036" # Suntech
- "5036:5036/udp"
# Web UI Traccar наружу не публикуем — только внутренняя Docker-сеть.
# При необходимости доступа извне раскомментируйте:
# - "5082:8082" # web UI
volumes:
- traccar_logs:/opt/traccar/logs
- traccar_data:/opt/traccar/data
- ./traccar/traccar.xml:/opt/traccar/conf/traccar.xml:ro
mem_limit: 768m
cpus: 0.5
pids_limit: 128
# Map matching (привязка GPS-треков к дорогам) — OSRM, карта Приволжского округа.
# Только внутренняя Docker-сеть (приложение ходит по http://osrm:5000).
osrm:
# Пин по digest: тега v6.0.0 не существует, есть только latest
# (digest совпадает с образом на продакшене на момент пина)
image: osrm/osrm-backend:latest@sha256:af5d4a83fb90086a43b1ae2ca22872e6768766ad5fcbb07a29ff90ec644ee409
container_name: osrm
restart: unless-stopped
command: osrm-routed --algorithm mld /data/region.osrm
volumes:
- ./osrm-data-ru:/data:ro
mem_limit: 512m
cpus: 0.5
pids_limit: 32
volumes:
crm_data:
postgres_data:
minio_data:
ollama_data:
traccar_logs:
traccar_data: