Тираж 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>
2026-07-05 14:32:55 +03:00
8 changed files with 54 additions and 21 deletions
Оператор дал отмашку «хуярь деплой + пуш». Три уже-боевых на VDS сайта обновлены **in-place** на движке 0.42.1 (order-tag фикс liquid 0.10.2), каждый — acceptance на НОВОМ образе С VDS против прод-оракула ДО подмены, затем env-preserving swap тега → live-smoke GREEN. Все три прога квитированы (Notify=сам сайт). Пропуск по вике (таски просили using-wiki) закрыт в конце сессии.
Начали со съёма health-метрик тиража (user: «не распухает ли память, не жрут ли ЦПУ»). Вывод: все snolla-сайты здоровы — CPU ~0.5% одного ядра в среднем, RAM 100–206 MB, нет reclaim-трэша / OOM-давления. На машину (13 GiB, 6 vCPU) влияние в пределах шума; главный едок RAM на боксе — `mssql` (2.1 GB).
Рецепт (durable): [`concepts/snolla-live-prod-inplace-image-bump.md`](../.wiki/concepts/snolla-live-prod-inplace-image-bump.md) — build→throwaway-staging-acceptance-С-VDS→`put-stack.js` PUT→live-smoke. Пер-сайт секции «0.42.1 bump» в трёх deploy-рунбуках.
**Нашёл дыру:** ни один snolla-стек не нёс `mem_limit` → cgroup-cap = вся память хоста (12.9 GiB). Течь в любом контейнере могла съесть весь бокс. По просьбе user'а выставил **`mem_limit: 512m`** всем пяти (env-preserving Portainer PUT, секреты вернул verbatim) + синхронизировал source-of-truth compose в репо.
| **tandemmebel.ru cutover** (последний из тиража) | staging GREEN, стек 20 `tandemmebel:ed96b18` (0.42.0), ждёт DNS | Триггер = **владелец флипает reg.ru `tandemmebel.ru`+www→89.253.255.94**. Порядок в STATUS.md-блоке `[tandemmebel-web-vds-deploy]`: verify авторит.NS (`Resolve-DnsName -Server ns1.reg.ru`) → ТОЛЬКО ПОТОМ боевой `Host()` в стек 20 (LE-порядок критичен) → live-smoke (gallery-DoD 12/12). Если origin уехал — пересобрать HEAD, ре-DoD. |
| **tandemmebel.ru cutover** (последний из тиража) | staging GREEN, стек 20 `tandemmebel:ed96b18` (0.42.0), mem_limit стоит, ждёт DNS | Триггер = **владелец флипает reg.ru `tandemmebel.ru`+www→89.253.255.94**. Порядок в STATUS.md-блоке `[tandemmebel-web-vds-deploy]`: verify авторит.NS → ТОЛЬКО ПОТОМ боевой `Host()` в стек 20 (LE-порядок критичен) → live-smoke (gallery-DoD 12/12). Если origin уехал — пересобрать HEAD, ре-DoD.К cutover можно сразу бампнуть до 0.42.1. |
- **Версии тиража разъехались:** kupimknigi (стек 21) + tandemmebel (стек 20) на **0.42.0**, три сегодняшних на **0.42.1** (order-фикс). Добампить kupimknigi/tandemmebel до 0.42.1 для единого пина, или оставить? (Пока не просили; tandemmebel всё равно пересобирать к cutover — там можно сразу 0.42.1.)
- **Версии тиража разъехались:** kupimknigi (21) + tandemmebel (20) на **0.42.0**, три остальных на **0.42.1** (order-фикс). Добампить оба до 0.42.1 для единого пина, или оставить? tandemmebel всё равно пересобирать к cutover — там сразу 0.42.1.
- Опционально: поставить периодический снапшот RAM трёх свежих (17/18/19) на пару суток, чтобы поймать дрейф во времени (одним снимком течь за дни не доказать). Не просили — предложение висит.
## Не делать (preemptive guards)
- **tandemmebel:** НЕ трогать стек 20 / НЕ вставлять боевой Host ДО подтверждённого DNS-флипа на **обоих** авторит.NS (иначе LE HTTP-01 упадёт на RUVDS → сожжём rate-limit). Флип делает владелец, не мы.
- **RUVDS IIS 80.64.31.36** — НЕ декоммишн (rollback-путь всех мигрированных сайтов). Биндинги labtools.ru/pro оставлены как rollback (в отличие от emspb, снятого 07-02).
-Отмашка «хуярь деплой» этой сессии = только тираж 0.42.1 live-редеплоев. На новые боевые apply — спрашивать заново (needs-human класс).
- **tandemmebel:** НЕ трогать стек 20 / НЕ вставлять боевой Host ДО подтверждённого DNS-флипа на **обоих** авторит.NS (иначе LE HTTP-01 упадёт на RUVDS → сожжём rate-limit). Флип делает владелец.
- **RUVDS IIS 80.64.31.36** — НЕ декоммишн (rollback всех мигрированных). Биндинги labtools.ru/pro оставлены как rollback.
-Новые app-стеки / правки существующих — **всегда с `mem_limit`** (см. вики-конвенцию), синхронно в Portainer И compose-копию.
- Нового в `~/.claude/.../memory/` не писал (рецепт ушёл в durable вику-concept, не в память). Существующие релевантные: `workstation-lan-dns-serves-local-cms-copy`, `operator-dns-flip-verify-domain-before-cutover`, `ps51-iso8859-corrupts-portainer-stackfile`, `smoke-crawl-real-pages-not-two-routes` — все подтвердились на практике этой сессии.
- Новая: `vds-app-stacks-need-mem-limit` (durable-правило про лимиты).
- Подтвердились: `ps51-iso8859-corrupts-portainer-stackfile` (обошёл PS-грабли, PUT слал UTF-8-байтами), `workstation-lan-dns-serves-local-cms-copy` (smoke через `--resolve`).
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
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.