fix(caddy): закрыть генерацию архивов Forgejo — она съедала диск #3534

Merged
lekss361 merged 1 commit from fix/forgejo-archive-crawler into main 2026-09-16 14:22:19 +00:00
Owner

Что происходит

Диск на Beget заполнен на 84 процента, свободно 25 ГБ из 145 ГБ. Расход измерен контрольным df за 120 секунд: 2 ГБ в час. До нуля оставалось около 12 часов.

Заполняет его кэш архивов Forgejo:

значение
размер repo-archive 55 ГБ
файлов в кэше 63 452
создано за последний час 107
обращений к архивам за 6 часов 78, из них 73 с одного адреса

Репозиторий публичный, и внешний обходчик дёргает ссылку «скачать архив» для каждого коммита. Forgejo на каждый такой GET пересобирает снапшот репозитория заново, по 20-30 МБ и несколько секунд CPU, и кладёт результат в кэш. Штатная уборка archive_cleanup работает, но раз в сутки, а генерация идёт около сотни файлов в час. Кэш вышел на плато и продолжает есть остаток диска.

Почему отказ, а не ограничение скорости

Даже один запрос в минуту — это 30 МБ новых файлов в минуту при суточной уборке. Ограничение скорости замедлило бы рост, но не остановило.

Что ломается

Анонимная кнопка «скачать архив» в веб-интерфейсе. Всё остальное не задето: git clone, git fetch и работа CI идут по смарт-протоколу, это другие пути (/info/refs, /git-upload-pack).

Обратимо снятием двух правил.

Проверка

caddy validate --config infra.caddy --adapter caddyfileValid configuration.

После деплоя: обращение к архиву должно отдавать 403, git clone работать, рост кэша прекратиться. Сам кэш чистится отдельно, после этой правки.

🤖 Generated with Claude Code

https://claude.ai/code/session_01JY6iWDnGDthdvsMWgK1BMG

## Что происходит Диск на Beget заполнен на 84 процента, свободно 25 ГБ из 145 ГБ. Расход измерен контрольным `df` за 120 секунд: **2 ГБ в час**. До нуля оставалось около 12 часов. Заполняет его кэш архивов Forgejo: | | значение | |---|---| | размер `repo-archive` | 55 ГБ | | файлов в кэше | 63 452 | | создано за последний час | 107 | | обращений к архивам за 6 часов | 78, из них 73 с одного адреса | Репозиторий публичный, и внешний обходчик дёргает ссылку «скачать архив» для каждого коммита. Forgejo на каждый такой GET пересобирает снапшот репозитория заново, по 20-30 МБ и несколько секунд CPU, и кладёт результат в кэш. Штатная уборка `archive_cleanup` работает, но раз в сутки, а генерация идёт около сотни файлов в час. Кэш вышел на плато и продолжает есть остаток диска. ## Почему отказ, а не ограничение скорости Даже один запрос в минуту — это 30 МБ новых файлов в минуту при суточной уборке. Ограничение скорости замедлило бы рост, но не остановило. ## Что ломается Анонимная кнопка «скачать архив» в веб-интерфейсе. Всё остальное не задето: `git clone`, `git fetch` и работа CI идут по смарт-протоколу, это другие пути (`/info/refs`, `/git-upload-pack`). Обратимо снятием двух правил. ## Проверка `caddy validate --config infra.caddy --adapter caddyfile` → `Valid configuration`. После деплоя: обращение к архиву должно отдавать 403, `git clone` работать, рост кэша прекратиться. Сам кэш чистится отдельно, после этой правки. 🤖 Generated with [Claude Code](https://claude.com/claude-code) https://claude.ai/code/session_01JY6iWDnGDthdvsMWgK1BMG
lekss361 added 1 commit 2026-09-16 14:21:23 +00:00
fix(caddy): закрыть генерацию архивов Forgejo — она съедала диск
All checks were successful
CI Trade-In / changes (pull_request) Successful in 13s
CI Trade-In / backend-tests (pull_request) Has been skipped
CI Trade-In / browser-tests (pull_request) Has been skipped
CI / changes (pull_request) Successful in 15s
CI Trade-In / frontend-checks (pull_request) Has been skipped
CI / backend-tests (pull_request) Has been skipped
CI / frontend-tests (pull_request) Has been skipped
CI / openapi-codegen-check (pull_request) Has been skipped
42a9402d62
Внешний обходчик дёргал /<owner>/<repo>/archive/<ref> для каждого коммита,
Forgejo на каждый запрос пересобирал снапшот репозитория (20-30 МБ) и клал
в кэш repo-archive. Штатная уборка идёт раз в сутки, генерация — около ста
файлов в час. Кэш вырос до 55 ГБ при диске 145 ГБ и ел 2 ГБ/ч (замерено
контрольным df за 120 с); до нуля свободного места оставалось ~12 часов.

73 из 78 обращений к архивам за шесть часов пришли с одного адреса.

Отказ, а не rate limit: даже один запрос в минуту даёт 30 МБ/мин новых
файлов при суточной уборке. На git clone/fetch и на CI не влияет — смарт-
протокол ходит другими путями. Цена: анонимная кнопка «скачать архив»
в вебе перестаёт работать.

`caddy validate` — Valid configuration.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JY6iWDnGDthdvsMWgK1BMG
lekss361 merged commit 1bd5283aa6 into main 2026-09-16 14:22:19 +00:00
lekss361 deleted branch fix/forgejo-archive-crawler 2026-09-16 14:22:20 +00:00
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference: lekss361/gendesign#3534
No description provided.