diff --git a/IMPLEMENTATION_LOG.md b/IMPLEMENTATION_LOG.md index eae47eb..764159d 100644 --- a/IMPLEMENTATION_LOG.md +++ b/IMPLEMENTATION_LOG.md @@ -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 при ближайшем деплое; остальные сервисы — при их пересоздании. diff --git a/docker-compose.deps.yml b/docker-compose.deps.yml index 44cf264..efa82cb 100644 --- a/docker-compose.deps.yml +++ b/docker-compose.deps.yml @@ -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: diff --git a/docker-compose.local.yml b/docker-compose.local.yml index 4723082..aad3b59 100644 --- a/docker-compose.local.yml +++ b/docker-compose.local.yml @@ -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: diff --git a/docker-compose.postgres.yml b/docker-compose.postgres.yml index d3ef46e..64b673a 100644 --- a/docker-compose.postgres.yml +++ b/docker-compose.postgres.yml @@ -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: diff --git a/docker-compose.yml b/docker-compose.yml index dda7262..e88d253 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -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: