chore(compose): ресурсные лимиты для всех сервисов

Шаг 0.4 плана production-готовности (подтверждён пользователем):
- mem_limit/cpus/pids_limit по docker stats прода + запас
- все 4 compose-файла + серверный бэкап .bak.serverfix
- config валиден везде
This commit is contained in:
2026-09-08 10:01:23 +03:00
parent 42e5ace655
commit 87fe0f03f5
5 changed files with 90 additions and 0 deletions

View File

@@ -405,3 +405,14 @@
- Как проверялось: vitest 107/107; check/lint/build чисто.
- Влияние на поиск/UX: нет.
- Подводные камни: GET /api/notifications без серверной пагинации — при очень больших историях «Загрузить ещё» работает на клиенте; серверная пагинация — отдельная задача. Полный axe-проход по всему приложению — задел, не входил.
---
## [0.4] Ресурсные лимиты во все compose-файлы [ПРОД]
- Статус: ⏳ деплой
- Зачем: утечка в одном сервисе не роняет хост (аудит, Фаза 0). Подтверждено пользователем 2026-09-08.
- Что изменено: mem_limit/cpus/pids_limit во всех 4 compose-файлах + серверный бэкап .bak.serverfix (крит. правило №1; преддеплойная копия .bak2-20260908). Значения по docker stats прода 2026-09-07 + запас (сервер 6 ГБ/3 CPU, на хосте другие стеки): app 1g/1.5/256, document-worker 1g/1.0/256, db 768m/0.75/128, minio 256m/0.5/64, webdav 64m/0.25/32, ollama 2g/2.0/64 (модель в RAM на ночном батче), traccar 768m/0.5/128, osrm 512m/0.5/32. proxy (Traefik) сознательно без лимита — критичная инфраструктура хоста.
- Как проверялось: docker compose config валиден для всех 4 файлов и для бэкапа на сервере.
- Влияние на поиск/UX: нет.
- Подводные камни: сумма лимитов ~6.3 ГБ > 5.9 ГБ RAM — лимиты это потолки, не резерв; ollama в простое 36 МБ. На проде лимиты применяются к app/document-worker при ближайшем деплое; остальные сервисы — при их пересоздании.

View File

@@ -29,6 +29,10 @@ services:
timeout: 5s
retries: 10
start_period: 10s
# Ресурсные лимиты (шаг 0.4)
mem_limit: 768m
cpus: 0.75
pids_limit: 128
minio:
# Тег запинен: совпадает с версией на продакшене (RELEASE.2025-09-07T16-13-09Z)
@@ -50,6 +54,10 @@ services:
timeout: 5s
retries: 10
start_period: 15s
# Ресурсные лимиты (шаг 0.4)
mem_limit: 256m
cpus: 0.5
pids_limit: 64
webdav:
# Тег запинен: совпадает с версией на продакшене (rclone v1.74.0)
@@ -79,6 +87,10 @@ services:
depends_on:
minio:
condition: service_healthy
# Ресурсные лимиты (шаг 0.4)
mem_limit: 64m
cpus: 0.25
pids_limit: 32
document-worker:
# Option 1: use prebuilt image (requires GHCR auth, see deploy.yml)
@@ -103,6 +115,10 @@ services:
timeout: 10s
retries: 3
start_period: 30s
# Ресурсные лимиты (шаг 0.4)
mem_limit: 1g
cpus: 1.0
pids_limit: 256
ollama:
# Тег запинен: совпадает с версией на продакшене (ollama 0.30.10)
@@ -120,6 +136,10 @@ services:
timeout: 5s
retries: 12
start_period: 30s
# Ресурсные лимиты (шаг 0.4)
mem_limit: 2g
cpus: 2.0
pids_limit: 64
volumes:
postgres_data:

View File

@@ -38,6 +38,10 @@ services:
minio:
condition: service_healthy
required: false
# Ресурсные лимиты (шаг 0.4)
mem_limit: 1g
cpus: 1.5
pids_limit: 256
db:
# Тег запинен: pgvector 0.8.4 + PostgreSQL 16 (совпадает с локальным стендом)
@@ -55,6 +59,10 @@ services:
timeout: 5s
retries: 10
start_period: 10s
# Ресурсные лимиты (шаг 0.4)
mem_limit: 768m
cpus: 0.75
pids_limit: 128
minio:
# Тег запинен: совпадает с версией на продакшене (RELEASE.2025-09-07T16-13-09Z)
@@ -76,6 +84,10 @@ services:
timeout: 5s
retries: 10
start_period: 15s
# Ресурсные лимиты (шаг 0.4)
mem_limit: 256m
cpus: 0.5
pids_limit: 64
webdav:
# Тег запинен: совпадает с версией на продакшене (rclone v1.74.0)
@@ -105,6 +117,10 @@ services:
depends_on:
minio:
condition: service_healthy
# Ресурсные лимиты (шаг 0.4)
mem_limit: 64m
cpus: 0.25
pids_limit: 32
ollama:
# Тег запинен: совпадает с версией на продакшене (ollama 0.30.10)
@@ -122,6 +138,10 @@ services:
timeout: 5s
retries: 12
start_period: 30s
# Ресурсные лимиты (шаг 0.4)
mem_limit: 2g
cpus: 2.0
pids_limit: 64
document-worker:
build:
@@ -140,6 +160,10 @@ services:
timeout: 10s
retries: 3
start_period: 30s
# Ресурсные лимиты (шаг 0.4)
mem_limit: 1g
cpus: 1.0
pids_limit: 256
volumes:
crm_data:

View File

@@ -5,6 +5,10 @@ services:
depends_on:
db:
condition: service_healthy
# Ресурсные лимиты (шаг 0.4)
mem_limit: 1g
cpus: 1.5
pids_limit: 256
db:
image: postgres:16-alpine
@@ -20,6 +24,10 @@ services:
interval: 5s
timeout: 5s
retries: 10
# Ресурсные лимиты (шаг 0.4)
mem_limit: 768m
cpus: 0.75
pids_limit: 128
volumes:
postgres_data:

View File

@@ -13,6 +13,10 @@ services:
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
@@ -41,6 +45,9 @@ services:
timeout: 5s
retries: 10
start_period: 10s
mem_limit: 768m
cpus: 0.75
pids_limit: 128
minio:
# Тег запинен: совпадает с версией на продакшене (RELEASE.2025-09-07T16-13-09Z)
@@ -64,6 +71,9 @@ services:
timeout: 5s
retries: 10
start_period: 15s
mem_limit: 256m
cpus: 0.5
pids_limit: 64
webdav:
# Тег запинен: совпадает с версией на продакшене (rclone v1.74.0)
@@ -95,6 +105,9 @@ services:
depends_on:
minio:
condition: service_healthy
mem_limit: 64m
cpus: 0.25
pids_limit: 32
ollama:
# Тег запинен: совпадает с версией на продакшене (ollama 0.30.10)
@@ -115,6 +128,10 @@ services:
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:
@@ -140,6 +157,10 @@ services:
timeout: 10s
retries: 3
start_period: 30s
# LibreOffice при конвертации DOCX→PDF может потреблять сотни МБ
mem_limit: 1g
cpus: 1.0
pids_limit: 256
traccar:
# Тег запинен: совпадает с версией на продакшене (traccar 6.15.2)
@@ -165,6 +186,9 @@ services:
- 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).
@@ -177,6 +201,9 @@ services:
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: