Files
iistwin/docker-compose.yml
Ильяс Султанов 75ec0f25bb chore(repo): дедуп formatAmount, пины образов, дефолты MinIO, доля any
Шаги 2.3 и 2.4 плана production-готовности:
- lib/format.ts formatAmount вместо 2 локальных копий
- пины тегов minio/rclone/ollama/traccar/pgvector + osrm по digest
- minioadmin без дефолта (env required, dev-подсказки в .env.example)
- 28 any в auto-transitions/shared типизированы из @shared/schema
- удалён _tablefield_orig.txt
- check/lint/build чисто, vitest 104/104
2026-09-08 01:07:55 +03:00

188 lines
6.3 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.

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
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
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
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
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
# Раскомментируйте секцию ниже для поддержки 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
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
# 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
volumes:
crm_data:
postgres_data:
minio_data:
ollama_data:
traccar_logs:
traccar_data: