From 00bd3c72b6ad790f595a2109bb58505d25313455 Mon Sep 17 00:00:00 2001 From: NotBigGhost Date: Sat, 19 Sep 2026 02:21:19 +0300 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=B5=D0=BF=D0=BB=D0=BE=D0=B9:=20=D0=BA?= =?UTF-8?q?=D0=B0=D0=BA=20=D0=B2=D0=BA=D0=BB=D1=8E=D1=87=D0=B8=D1=82=D1=8C?= =?UTF-8?q?=20memory=20cgroup=20=D0=BD=D0=B0=20Pi,=20=D0=B8=D0=BD=D0=B0?= =?UTF-8?q?=D1=87=D0=B5=20mem=5Flimit=20=D0=BD=D0=B5=20=D0=B4=D0=B5=D0=B9?= =?UTF-8?q?=D1=81=D1=82=D0=B2=D1=83=D0=B5=D1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit На Pi при каждом `docker compose up` контейнеры пишут «Your kernel does not support memory limit capabilities…». Причина — прошивка Raspberry Pi добавляет ядру cgroup_disable=memory: контроллера memory нет, и Docker молча игнорирует mem_limit (app 512m, tunnel 64m, backup 384m). deploy/pi/README.md: проверка, дописывание cgroup_enable=memory в cmdline.txt с бэкапом, перезагрузка и контроль; строка в «Если что-то не так». Пояснения у mem_limit в compose и в .env.example. #67 Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_01LqSoRj99iwVEH5U5fnZgsd --- .env.example | 3 ++- deploy/pi/README.md | 29 +++++++++++++++++++++++++++++ docker-compose.yml | 4 +++- 3 files changed, 34 insertions(+), 2 deletions(-) diff --git a/.env.example b/.env.example index add725e..0a062ed 100644 --- a/.env.example +++ b/.env.example @@ -85,7 +85,8 @@ IMAGE_TAG=latest # ─── РЕСУРСЫ ПРОД-КОНТЕЙНЕРА (docker-compose.yml) ───────────────────────────── # Лимиты под Raspberry Pi. Не заданы → дефолты compose (512m / 1.5 CPU). -# Подними, если у Pi больше RAM/ядер. +# Подними, если у Pi больше RAM/ядер. Лимит памяти работает, только если на Pi включён +# memory cgroup (cgroup_enable=memory в cmdline.txt) — см. deploy/pi/README.md, раздел 1. #APP_MEM_LIMIT=512m #APP_CPUS=1.5 diff --git a/deploy/pi/README.md b/deploy/pi/README.md index 3b97139..b52bcae 100644 --- a/deploy/pi/README.md +++ b/deploy/pi/README.md @@ -35,6 +35,32 @@ newgrp docker # применить группу docker version && docker compose version # проверка ``` +### Лимиты памяти (memory cgroup) +Прошивка Raspberry Pi сама добавляет ядру `cgroup_disable=memory`. Без контроллера `memory` +Docker **молча игнорирует** `mem_limit` из `docker-compose.yml` (app 512m, tunnel 64m, backup +384m) и на каждый контейнер пишет «Your kernel does not support memory limit capabilities or +the cgroup is not mounted. Limitation discarded.». Тогда утечка или тяжёлый бэкап могут +занять всю RAM Pi, и OOM-killer прибьёт что попало. + +Проверка — если есть вывод, лимиты не работают: +```bash +docker info 2>&1 | grep -i "no memory limit" +cat /sys/fs/cgroup/cgroup.controllers # в списке должно быть слово memory +``` +Включить — дописать параметр **в ту же единственную строку** `cmdline.txt` (перевод строки +в этом файле ломает загрузку) и перезагрузить Pi. Прод на время перезагрузки недоступен, +контейнеры поднимутся сами: +```bash +sudo cp /boot/firmware/cmdline.txt /boot/firmware/cmdline.txt.bak +grep -q "cgroup_enable=memory" /boot/firmware/cmdline.txt || \ + sudo sed -i '1 s/$/ cgroup_enable=memory/' /boot/firmware/cmdline.txt +cat /boot/firmware/cmdline.txt # одна строка, в конце cgroup_enable=memory +sudo reboot +``` +После перезагрузки `cgroup.controllers` содержит `memory`, а `docker info` не пишет +`No memory limit support`. Если Pi не загрузился, верните бэкап: вставьте карту в ПК и на +разделе `bootfs` замените `cmdline.txt` содержимым `cmdline.txt.bak`. + ## 2. SSH-ключ для туннеля **Что это.** Отдельная пара ключей **только для туннеля** — ею контейнер `tunnel` логинится на `tunnel@VPS`, чтобы открыть `ssh -R`. Это не системный ключ Pi, ты создаёшь его сам. Распределение: @@ -145,3 +171,6 @@ docker compose exec backup fs-backup list # хронология снимк слот 9000 → на VPS `sudo fuser -k 9000/tcp`, затем `docker compose restart tunnel`). - `pull` не проходит → проверь `docker login gitea.arseniev.info` и что реестр по HTTPS с валидным сертификатом (иначе хост в `/etc/docker/daemon.json` → `insecure-registries`, `systemctl restart docker`). +- `docker compose up` пишет «Your kernel does not support memory limit capabilities… + Limitation discarded.» → лимиты памяти не работают: включите memory cgroup, раздел 1, + «Лимиты памяти». diff --git a/docker-compose.yml b/docker-compose.yml index bda1dd3..db49bda 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -42,7 +42,9 @@ services: timeout: 5s retries: 3 start_period: 40s - mem_limit: ${APP_MEM_LIMIT:-512m} # лимиты под Pi; переопределяются в .env + # Лимиты под Pi; переопределяются в .env. mem_limit действует, только если на Pi включён + # memory cgroup — иначе Docker его молча игнорирует (deploy/pi/README.md, раздел 1). + mem_limit: ${APP_MEM_LIMIT:-512m} cpus: ${APP_CPUS:-1.5} security_opt: - no-new-privileges:true -- 2.54.0