chore(compose): ресурсные лимиты для всех сервисов
Шаг 0.4 плана production-готовности (подтверждён пользователем): - mem_limit/cpus/pids_limit по docker stats прода + запас - все 4 compose-файла + серверный бэкап .bak.serverfix - config валиден везде
This commit is contained in:
@@ -405,3 +405,14 @@
|
|||||||
- Как проверялось: vitest 107/107; check/lint/build чисто.
|
- Как проверялось: vitest 107/107; check/lint/build чисто.
|
||||||
- Влияние на поиск/UX: нет.
|
- Влияние на поиск/UX: нет.
|
||||||
- Подводные камни: GET /api/notifications без серверной пагинации — при очень больших историях «Загрузить ещё» работает на клиенте; серверная пагинация — отдельная задача. Полный axe-проход по всему приложению — задел, не входил.
|
- Подводные камни: 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 при ближайшем деплое; остальные сервисы — при их пересоздании.
|
||||||
|
|||||||
@@ -29,6 +29,10 @@ services:
|
|||||||
timeout: 5s
|
timeout: 5s
|
||||||
retries: 10
|
retries: 10
|
||||||
start_period: 10s
|
start_period: 10s
|
||||||
|
# Ресурсные лимиты (шаг 0.4)
|
||||||
|
mem_limit: 768m
|
||||||
|
cpus: 0.75
|
||||||
|
pids_limit: 128
|
||||||
|
|
||||||
minio:
|
minio:
|
||||||
# Тег запинен: совпадает с версией на продакшене (RELEASE.2025-09-07T16-13-09Z)
|
# Тег запинен: совпадает с версией на продакшене (RELEASE.2025-09-07T16-13-09Z)
|
||||||
@@ -50,6 +54,10 @@ services:
|
|||||||
timeout: 5s
|
timeout: 5s
|
||||||
retries: 10
|
retries: 10
|
||||||
start_period: 15s
|
start_period: 15s
|
||||||
|
# Ресурсные лимиты (шаг 0.4)
|
||||||
|
mem_limit: 256m
|
||||||
|
cpus: 0.5
|
||||||
|
pids_limit: 64
|
||||||
|
|
||||||
webdav:
|
webdav:
|
||||||
# Тег запинен: совпадает с версией на продакшене (rclone v1.74.0)
|
# Тег запинен: совпадает с версией на продакшене (rclone v1.74.0)
|
||||||
@@ -79,6 +87,10 @@ services:
|
|||||||
depends_on:
|
depends_on:
|
||||||
minio:
|
minio:
|
||||||
condition: service_healthy
|
condition: service_healthy
|
||||||
|
# Ресурсные лимиты (шаг 0.4)
|
||||||
|
mem_limit: 64m
|
||||||
|
cpus: 0.25
|
||||||
|
pids_limit: 32
|
||||||
|
|
||||||
document-worker:
|
document-worker:
|
||||||
# Option 1: use prebuilt image (requires GHCR auth, see deploy.yml)
|
# Option 1: use prebuilt image (requires GHCR auth, see deploy.yml)
|
||||||
@@ -103,6 +115,10 @@ services:
|
|||||||
timeout: 10s
|
timeout: 10s
|
||||||
retries: 3
|
retries: 3
|
||||||
start_period: 30s
|
start_period: 30s
|
||||||
|
# Ресурсные лимиты (шаг 0.4)
|
||||||
|
mem_limit: 1g
|
||||||
|
cpus: 1.0
|
||||||
|
pids_limit: 256
|
||||||
|
|
||||||
ollama:
|
ollama:
|
||||||
# Тег запинен: совпадает с версией на продакшене (ollama 0.30.10)
|
# Тег запинен: совпадает с версией на продакшене (ollama 0.30.10)
|
||||||
@@ -120,6 +136,10 @@ services:
|
|||||||
timeout: 5s
|
timeout: 5s
|
||||||
retries: 12
|
retries: 12
|
||||||
start_period: 30s
|
start_period: 30s
|
||||||
|
# Ресурсные лимиты (шаг 0.4)
|
||||||
|
mem_limit: 2g
|
||||||
|
cpus: 2.0
|
||||||
|
pids_limit: 64
|
||||||
|
|
||||||
volumes:
|
volumes:
|
||||||
postgres_data:
|
postgres_data:
|
||||||
|
|||||||
@@ -38,6 +38,10 @@ services:
|
|||||||
minio:
|
minio:
|
||||||
condition: service_healthy
|
condition: service_healthy
|
||||||
required: false
|
required: false
|
||||||
|
# Ресурсные лимиты (шаг 0.4)
|
||||||
|
mem_limit: 1g
|
||||||
|
cpus: 1.5
|
||||||
|
pids_limit: 256
|
||||||
|
|
||||||
db:
|
db:
|
||||||
# Тег запинен: pgvector 0.8.4 + PostgreSQL 16 (совпадает с локальным стендом)
|
# Тег запинен: pgvector 0.8.4 + PostgreSQL 16 (совпадает с локальным стендом)
|
||||||
@@ -55,6 +59,10 @@ services:
|
|||||||
timeout: 5s
|
timeout: 5s
|
||||||
retries: 10
|
retries: 10
|
||||||
start_period: 10s
|
start_period: 10s
|
||||||
|
# Ресурсные лимиты (шаг 0.4)
|
||||||
|
mem_limit: 768m
|
||||||
|
cpus: 0.75
|
||||||
|
pids_limit: 128
|
||||||
|
|
||||||
minio:
|
minio:
|
||||||
# Тег запинен: совпадает с версией на продакшене (RELEASE.2025-09-07T16-13-09Z)
|
# Тег запинен: совпадает с версией на продакшене (RELEASE.2025-09-07T16-13-09Z)
|
||||||
@@ -76,6 +84,10 @@ services:
|
|||||||
timeout: 5s
|
timeout: 5s
|
||||||
retries: 10
|
retries: 10
|
||||||
start_period: 15s
|
start_period: 15s
|
||||||
|
# Ресурсные лимиты (шаг 0.4)
|
||||||
|
mem_limit: 256m
|
||||||
|
cpus: 0.5
|
||||||
|
pids_limit: 64
|
||||||
|
|
||||||
webdav:
|
webdav:
|
||||||
# Тег запинен: совпадает с версией на продакшене (rclone v1.74.0)
|
# Тег запинен: совпадает с версией на продакшене (rclone v1.74.0)
|
||||||
@@ -105,6 +117,10 @@ services:
|
|||||||
depends_on:
|
depends_on:
|
||||||
minio:
|
minio:
|
||||||
condition: service_healthy
|
condition: service_healthy
|
||||||
|
# Ресурсные лимиты (шаг 0.4)
|
||||||
|
mem_limit: 64m
|
||||||
|
cpus: 0.25
|
||||||
|
pids_limit: 32
|
||||||
|
|
||||||
ollama:
|
ollama:
|
||||||
# Тег запинен: совпадает с версией на продакшене (ollama 0.30.10)
|
# Тег запинен: совпадает с версией на продакшене (ollama 0.30.10)
|
||||||
@@ -122,6 +138,10 @@ services:
|
|||||||
timeout: 5s
|
timeout: 5s
|
||||||
retries: 12
|
retries: 12
|
||||||
start_period: 30s
|
start_period: 30s
|
||||||
|
# Ресурсные лимиты (шаг 0.4)
|
||||||
|
mem_limit: 2g
|
||||||
|
cpus: 2.0
|
||||||
|
pids_limit: 64
|
||||||
|
|
||||||
document-worker:
|
document-worker:
|
||||||
build:
|
build:
|
||||||
@@ -140,6 +160,10 @@ services:
|
|||||||
timeout: 10s
|
timeout: 10s
|
||||||
retries: 3
|
retries: 3
|
||||||
start_period: 30s
|
start_period: 30s
|
||||||
|
# Ресурсные лимиты (шаг 0.4)
|
||||||
|
mem_limit: 1g
|
||||||
|
cpus: 1.0
|
||||||
|
pids_limit: 256
|
||||||
|
|
||||||
volumes:
|
volumes:
|
||||||
crm_data:
|
crm_data:
|
||||||
|
|||||||
@@ -5,6 +5,10 @@ services:
|
|||||||
depends_on:
|
depends_on:
|
||||||
db:
|
db:
|
||||||
condition: service_healthy
|
condition: service_healthy
|
||||||
|
# Ресурсные лимиты (шаг 0.4)
|
||||||
|
mem_limit: 1g
|
||||||
|
cpus: 1.5
|
||||||
|
pids_limit: 256
|
||||||
|
|
||||||
db:
|
db:
|
||||||
image: postgres:16-alpine
|
image: postgres:16-alpine
|
||||||
@@ -20,6 +24,10 @@ services:
|
|||||||
interval: 5s
|
interval: 5s
|
||||||
timeout: 5s
|
timeout: 5s
|
||||||
retries: 10
|
retries: 10
|
||||||
|
# Ресурсные лимиты (шаг 0.4)
|
||||||
|
mem_limit: 768m
|
||||||
|
cpus: 0.75
|
||||||
|
pids_limit: 128
|
||||||
|
|
||||||
volumes:
|
volumes:
|
||||||
postgres_data:
|
postgres_data:
|
||||||
|
|||||||
@@ -13,6 +13,10 @@ services:
|
|||||||
volumes:
|
volumes:
|
||||||
- crm_data:/app/data
|
- crm_data:/app/data
|
||||||
restart: unless-stopped
|
restart: unless-stopped
|
||||||
|
# Ресурсные лимиты (шаг 0.4): значения = потребление на проде + запас (docker stats 2026-09-07)
|
||||||
|
mem_limit: 1g
|
||||||
|
cpus: 1.5
|
||||||
|
pids_limit: 256
|
||||||
depends_on:
|
depends_on:
|
||||||
db:
|
db:
|
||||||
condition: service_healthy
|
condition: service_healthy
|
||||||
@@ -41,6 +45,9 @@ services:
|
|||||||
timeout: 5s
|
timeout: 5s
|
||||||
retries: 10
|
retries: 10
|
||||||
start_period: 10s
|
start_period: 10s
|
||||||
|
mem_limit: 768m
|
||||||
|
cpus: 0.75
|
||||||
|
pids_limit: 128
|
||||||
|
|
||||||
minio:
|
minio:
|
||||||
# Тег запинен: совпадает с версией на продакшене (RELEASE.2025-09-07T16-13-09Z)
|
# Тег запинен: совпадает с версией на продакшене (RELEASE.2025-09-07T16-13-09Z)
|
||||||
@@ -64,6 +71,9 @@ services:
|
|||||||
timeout: 5s
|
timeout: 5s
|
||||||
retries: 10
|
retries: 10
|
||||||
start_period: 15s
|
start_period: 15s
|
||||||
|
mem_limit: 256m
|
||||||
|
cpus: 0.5
|
||||||
|
pids_limit: 64
|
||||||
|
|
||||||
webdav:
|
webdav:
|
||||||
# Тег запинен: совпадает с версией на продакшене (rclone v1.74.0)
|
# Тег запинен: совпадает с версией на продакшене (rclone v1.74.0)
|
||||||
@@ -95,6 +105,9 @@ services:
|
|||||||
depends_on:
|
depends_on:
|
||||||
minio:
|
minio:
|
||||||
condition: service_healthy
|
condition: service_healthy
|
||||||
|
mem_limit: 64m
|
||||||
|
cpus: 0.25
|
||||||
|
pids_limit: 32
|
||||||
|
|
||||||
ollama:
|
ollama:
|
||||||
# Тег запинен: совпадает с версией на продакшене (ollama 0.30.10)
|
# Тег запинен: совпадает с версией на продакшене (ollama 0.30.10)
|
||||||
@@ -115,6 +128,10 @@ services:
|
|||||||
timeout: 5s
|
timeout: 5s
|
||||||
retries: 12
|
retries: 12
|
||||||
start_period: 30s
|
start_period: 30s
|
||||||
|
# Ollama держит модель в RAM во время ночного батча (bge-m3 ~1-2 ГБ)
|
||||||
|
mem_limit: 2g
|
||||||
|
cpus: 2.0
|
||||||
|
pids_limit: 64
|
||||||
# Раскомментируйте секцию ниже для поддержки NVIDIA GPU:
|
# Раскомментируйте секцию ниже для поддержки NVIDIA GPU:
|
||||||
# deploy:
|
# deploy:
|
||||||
# resources:
|
# resources:
|
||||||
@@ -140,6 +157,10 @@ services:
|
|||||||
timeout: 10s
|
timeout: 10s
|
||||||
retries: 3
|
retries: 3
|
||||||
start_period: 30s
|
start_period: 30s
|
||||||
|
# LibreOffice при конвертации DOCX→PDF может потреблять сотни МБ
|
||||||
|
mem_limit: 1g
|
||||||
|
cpus: 1.0
|
||||||
|
pids_limit: 256
|
||||||
|
|
||||||
traccar:
|
traccar:
|
||||||
# Тег запинен: совпадает с версией на продакшене (traccar 6.15.2)
|
# Тег запинен: совпадает с версией на продакшене (traccar 6.15.2)
|
||||||
@@ -165,6 +186,9 @@ services:
|
|||||||
- traccar_logs:/opt/traccar/logs
|
- traccar_logs:/opt/traccar/logs
|
||||||
- traccar_data:/opt/traccar/data
|
- traccar_data:/opt/traccar/data
|
||||||
- ./traccar/traccar.xml:/opt/traccar/conf/traccar.xml:ro
|
- ./traccar/traccar.xml:/opt/traccar/conf/traccar.xml:ro
|
||||||
|
mem_limit: 768m
|
||||||
|
cpus: 0.5
|
||||||
|
pids_limit: 128
|
||||||
|
|
||||||
# Map matching (привязка GPS-треков к дорогам) — OSRM, карта Приволжского округа.
|
# Map matching (привязка GPS-треков к дорогам) — OSRM, карта Приволжского округа.
|
||||||
# Только внутренняя Docker-сеть (приложение ходит по http://osrm:5000).
|
# Только внутренняя Docker-сеть (приложение ходит по http://osrm:5000).
|
||||||
@@ -177,6 +201,9 @@ services:
|
|||||||
command: osrm-routed --algorithm mld /data/region.osrm
|
command: osrm-routed --algorithm mld /data/region.osrm
|
||||||
volumes:
|
volumes:
|
||||||
- ./osrm-data-ru:/data:ro
|
- ./osrm-data-ru:/data:ro
|
||||||
|
mem_limit: 512m
|
||||||
|
cpus: 0.5
|
||||||
|
pids_limit: 32
|
||||||
|
|
||||||
volumes:
|
volumes:
|
||||||
crm_data:
|
crm_data:
|
||||||
|
|||||||
Reference in New Issue
Block a user