chore(ops): зависшие job-контейнеры, лимит журнала, мёртвый блок status в Caddy #2912
No reviewers
Labels
No labels
Fable 5 ревью
GG-форсайт
admin
analytics
auth
automation
bug
business
chore
ci
compliance
data
data-moat
docs
duplicate
dx
enhancement
feedback/max
generative
needs-discussion
needs-human
observability
pause-bots
performance
priority/p0
priority/p1
priority/p2
priority/p3
scope/backend
scope/db
scope/devops
scope/frontend
scope/qa
scrapers
security
site-finder
stage/1
stage/2
status/blocked
status/done
status/needs-analysis
status/needs-fix
status/qa
status/ready
status/review
status/wip
tech-debt
tradein
ux
week ревью 1
wontfix
ИРД
вторичка
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference: lekss361/gendesign#2912
Loading…
Add table
Reference in a new issue
No description provided.
Delete branch "chore/ops-prune-logs-caddy"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Три находки инфра-аудита, замеренные на проде 15.08.2026.
1. Зависшие job-контейнеры раннера
docker psдержит три контейнера задач Forgejo, живущих неделями:FORGEJO-ACTIONS-TASK-14123_..._JOB-changesFORGEJO-ACTIONS-TASK-14121_..._JOB-changesFORGEJO-ACTIONS-TASK-7610_..._JOB-build-frontendops/docker-prune.shих не видел: он фильтровал толькоstatus=exited.Добавлена секция (
ops/docker-prune.sh:107-172) с порогомJOB_CONTAINER_MAX_AGE_HOURS(по умолчанию 24 — задача CI столько не идёт никогда). Детали, которые важны:name=^FORGEJO-ACTIONS-TASK-, не подстрока, плюс отдельныйcase-skip дляforgejo,forgejo-runner*,gendesign-*,tradein-*,couchdbкак страховка;docker inspect .State.StartedAt, а не парсится из текстаdocker ps(«Up 4 weeks» ненадёжно);DRY_RUN, новый флаг не заводился;set -e).2. Журнал systemd без лимита
/var/logзанимает 3.1 ГБ, из них/var/log/journal— 2.5 ГБ, и вjournald.confне выставлено ни одного лимита.Отдельно стоит запомнить ложный след:
journalctl --disk-usageбез прав группыsystemd-journal/admпоказывает 174 МБ, потому что не может перечислить архивные файлы. Реальный объём виден только прямымduпо/var/log/journal/<machine-id>/— 100 файлов примерно по 48 МБ.Добавлен
ops/journald-gendesign.conf.exampleсSystemMaxUse=500M. Остальные 600 МБ/var/log— обычный rsyslog (syslog 313M, dmesg 113M и прочее), он уже под logrotate и здесь не трогается.3. Мёртвый блок
status.gendsgn.ruв CaddyХост указывал на uptime-kuma, которого среди контейнеров нет. Раз в 6 часов дёргался ACME (только staging-эндпоинт, боевым сертификатам не угрожало). Блок удалён вместе с висячей ссылкой на него в комментарии у
meraocenka.ru. Grep подтвердил: других упоминаний хоста в Caddyfile, compose и скриптах не осталось.Проверки
bash -n ops/docker-prune.sh— OK (shellcheck недоступен).caddy validate— Valid configuration. Конфиг передавался в контейнер по stdin, на сервере ничего не писалось и не перезапускалось.Что делать руками после мержа
Только одно — systemd-конфиг лежит вне
/opt/gendesign, деплой его не касается:После рестарта journald сам провакуумит архив под лимит: 2.5 ГБ → ~500 МБ.
Caddyfileиops/docker-prune.shруками трогать не нужно — оба пути явно перечислены вpaths:уdeploy.yml, мерж запустит деплой, который синхронизирует файлы и пересоздаст caddy. (Известное «ops/**не триггерит деплой» верно для каталога целиком, но не для этих двух конкретных путей.)Три зависших контейнера сейчас всё ещё живы — снимать их будет уже обновлённый скрипт по расписанию; разово можно и раньше.