chore(vds): mem_limit 512m всему тиражу snolla (5 стеков live + compose-копии + вики-конвенция)
Тираж snolla (labtools.ru/17, emspb/18, labtools.pro/19, tandemmebel/20, kupimknigi/21) шёл без mem_limit → cgroup-cap = вся память хоста (12.9 GiB), одна течь могла съесть весь бокс. Выставил 512m (baseline ~100-200M, 2.5-5x запас) на всех 5 живых стеках через env-preserving Portainer PUT + синхронизировал source-of-truth compose. Все healthy, limit=536870912 подтверждён, labtools.pro 200. Конвенция «app-стек обязан нести mem_limit» закреплена в portainer-stack-management-vds § Convention + step 6 snolla-bump-рецепта. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -68,6 +68,22 @@ curl -ksS -X POST "$PORTAINER_URL/api/stacks/create/standalone/string?endpointId
|
||||
-H "Authorization: Bearer $JWT" -H "Content-Type: application/json" --data "$PAYLOAD"
|
||||
```
|
||||
|
||||
## Convention: `mem_limit` на app-стеках (обязательно)
|
||||
|
||||
**Каждый app/site-стек несёт `mem_limit`.** Без него cgroup-`limit` = вся память хоста (12.9 GiB) →
|
||||
одна течь в контейнере может съесть весь бокс, а не упереться в свой потолок. С `restart: unless-stopped`
|
||||
упор в лимит = OOM-kill контейнера + авто-подъём (изоляция вместо каскада на всю машину).
|
||||
|
||||
- **standalone-стек (не swarm) → ключ `mem_limit`**, НЕ `deploy.resources.limits.memory` (тот игнорится вне swarm).
|
||||
- Значение = ~2.5–5× наблюдаемого пика. snolla-сайты (Node SSR, baseline ~100–200 MB) → **`512m`**.
|
||||
Прочерк-пример: owncloud oCIS → `1g`.
|
||||
- Ставить в момент создания/правки стека — не откладывать. Проверка постфактум: `ops.docker.stats <name>`
|
||||
поле `limit` == заданному (512m = 536870912), не 13890813952.
|
||||
- **Синхронизировать обе копии**: боевой стек в Portainer (PUT) И source-of-truth compose в
|
||||
`admin/host-stacks/vds-kzntsv/<img>.compose.yml`. Иначе следующий redeploy из гита откатит лимит.
|
||||
|
||||
Применено 2026-07-05 ко всему тиражу snolla (labtools.ru/17, emspb/18, labtools.pro/19, tandemmebel/20, kupimknigi/21) → все `512m`.
|
||||
|
||||
## Gotchas
|
||||
|
||||
1. **`env_file: .env` ломает Portainer string-mode** — Portainer не материализует `.env` файл в `/data/compose/<id>/`. Compose pull fails: `env file /data/compose/<id>/.env not found`. Fix: `sed '/^\s*env_file:/d'` + передавать env через API `env` array.
|
||||
|
||||
@@ -80,6 +80,8 @@ META=/tmp/st<ID>.json node put-stack.js <stackId> <endpointId=1> <oldTag> <newTa
|
||||
|
||||
### 6. Закрытие
|
||||
Compose source-of-truth (`admin/host-stacks/vds-kzntsv/<img>.compose.yml`) — обновить тег + коммент rollback.
|
||||
**Проверить `mem_limit`** на стеке (обязателен для всех app-стеков — см. [[portainer-stack-management-vds]] § Convention).
|
||||
snolla → `512m`; если стек его ещё не несёт (старые до 2026-07-05) — добавить в этот же PUT и в compose-копию.
|
||||
Борд-таска 🟢, отчёт прогу (Notify=сам сайт, минуя workshop), rollback-тег остаётся в registry.
|
||||
|
||||
## put-stack.js (env-preserving Portainer stack PUT)
|
||||
|
||||
@@ -27,6 +27,7 @@ services:
|
||||
container_name: emspb
|
||||
image: registry.kzntsv.site/emspb:95a5c42 # git-sha victor/emspb.ru master (snolla 0.42.1, bump 2026-07-05; prev b6e361a=0.28.4=rollback)
|
||||
restart: unless-stopped
|
||||
mem_limit: 512m # guardrail от runaway: snolla baseline ~100-200M; OOM в контейнере → restart:unless-stopped поднимет. standalone-compose → mem_limit (НЕ deploy.resources — то swarm-only).
|
||||
environment:
|
||||
NODE_ENV: production
|
||||
TZ: Europe/Moscow
|
||||
|
||||
@@ -30,6 +30,7 @@ services:
|
||||
container_name: kupimknigi
|
||||
image: registry.kzntsv.site/kupimknigi:9608ff6 # git-sha victor/kupimknigi.spb.ru (snolla 0.42.0 / core 0.24.0 / data 0.14.1)
|
||||
restart: unless-stopped
|
||||
mem_limit: 512m # guardrail от runaway: snolla baseline ~100-200M; OOM в контейнере → restart:unless-stopped поднимет. standalone-compose → mem_limit (НЕ deploy.resources — то swarm-only).
|
||||
environment:
|
||||
NODE_ENV: production
|
||||
TZ: Europe/Moscow
|
||||
|
||||
@@ -29,6 +29,7 @@ services:
|
||||
container_name: labtools-pro
|
||||
image: registry.kzntsv.site/labtools-pro:0610432 # git-sha victor/labtools.pro master (snolla 0.42.1, bump 2026-07-05; prev 7bd9fae=0.28.7=rollback)
|
||||
restart: unless-stopped
|
||||
mem_limit: 512m # guardrail от runaway: snolla baseline ~100-200M; OOM в контейнере → restart:unless-stopped поднимет. standalone-compose → mem_limit (НЕ deploy.resources — то swarm-only).
|
||||
environment:
|
||||
NODE_ENV: production
|
||||
TZ: Europe/Moscow
|
||||
|
||||
@@ -26,6 +26,7 @@ services:
|
||||
container_name: labtools
|
||||
image: registry.kzntsv.site/labtools:566d41c # git-sha victor/labtools.ru master (snolla 0.42.1, bump 2026-07-05; prev 43e28ba=0.28.2=rollback)
|
||||
restart: unless-stopped
|
||||
mem_limit: 512m # guardrail от runaway: snolla baseline ~100-200M; OOM в контейнере → restart:unless-stopped поднимет. standalone-compose → mem_limit (НЕ deploy.resources — то swarm-only).
|
||||
environment:
|
||||
NODE_ENV: production
|
||||
TZ: Europe/Moscow
|
||||
|
||||
@@ -31,6 +31,7 @@ services:
|
||||
container_name: tandemmebel
|
||||
image: registry.kzntsv.site/tandemmebel:ed96b18 # git-sha victor/tandemmebel.ru master (snolla 0.42.0 / core 0.24.0 / data 0.14.1 — viewmodel-graph + blog-archive)
|
||||
restart: unless-stopped
|
||||
mem_limit: 512m # guardrail от runaway: snolla baseline ~100-200M; OOM в контейнере → restart:unless-stopped поднимет. standalone-compose → mem_limit (НЕ deploy.resources — то swarm-only).
|
||||
environment:
|
||||
NODE_ENV: production
|
||||
TZ: Europe/Moscow
|
||||
|
||||
Reference in New Issue
Block a user