- AGENTS.md: homepage/transcriber собираются ролью app_image, registry-плейбуков и vars/transcriber.images.yml больше нет - local-image-build: закрыты шаги по homepage и transcriber, остался вынос yc_*-переменных из vault; добавлены замеры архивов - container-hardening-nits: снят пункт про плавающий `:latest` у homepage
9.9 KiB
Беклог
Единый список будущих задач по серверу: то, что уже решили сделать, и идеи,
которые ещё надо обдумать. Это источник истины по беклогу — одна задача =
один файл в этом каталоге. Не план реализации: детальные проработки живут в
docs/drafts (беклог даёт сводку и ссылку), а реализованное
переезжает в ADR/спеку и пункт беклога удаляется.
Приоритет — грубая оценка «ценность / стоимость», не обязательство к порядку.
Источники пунктов помечены:
(ансибл-ревью) — ревью плейбуков docs/drafts/ansible-review.md (2026-05-25);
(tududi) — перенос из инбокса задач tududi (проект Pet Project Server);
(sec-ревью) — три независимых security-ревью на модели fable (2026-07-13).
Драфты timeweb.md и timeweb-migration-log.md — исторические логи уже
завершённой миграции в Timeweb (cutover 2026-05-23), в беклог не входят.
Высокий
- Закрыть admin API Caddy (localhost вместо всей сети) —
admin :2019слушает всю docker-сеть; любой контейнер может переписать маршрутизацию и снять forward_auth (sec-ревью) - Убрать группу
dockerу сервисных пользователей —docker= root на хосте; ~все app-аккаунты фактически root, изоляция «юзер на сервис» обнуляется (sec-ревью) - Изолировать/запаролить сессионный redis Authelia — стор сессий SSO в общей сети без пароля; запись в него = hijack SSO всех сервисов (sec-ревью)
- Алерты на проблемные контейнеры — wakapi крутился в restart-loop несколько дней незамеченным; healthcheck в compose + алерты Netdata
- Никаких секретов в выводе плейбуков —
inv plвсегда с--diff, и каждая задача, рендерящая файл с секретом, печатает его в терминал;no_logстоит ровно в одном месте из четырнадцати
Средний
- Захардить мониторинг-стек (netdata / dozzle / goaccess) — netdata/dozzle: лишние привилегии + docker.sock + доверие Remote-User в общей сети; socket-proxy + monitoring_network (sec-ревью)
- Ограничить эндпоинт
/metricsMiniflux —METRICS_ALLOWED_NETWORKS=0.0.0.0/0+ прокси без ограничения пути отдаёт метрики публично (sec-ревью) - Закрыть calibre-web forward-auth и проверить дефолтные креды — домен без forward_auth, защита на встроенной авторизации с дефолтом
admin/admin123(sec-ревью) - Понизить log level Authelia с debug до info —
debugв проде утекает детали аутентификации и OIDC черезdocker logs/dozzle (sec-ревью) - Включить автообновления безопасности — патчи openssh/libssl только вручную; окна в недели между CVE и фиксом (sec-ревью)
- Запретить SSH-вход под root —
PermitRootLogin yesпускает root по ключу; наименьшие привилегии + defense-in-depth (пароль уже off) (sec-ревью) - Gitea runner on-demand в Yandex Cloud — раннер активен только во время сборки; webhook→Cloud Function стартует ВМ, probe/decide гасят по idle; экономия ~95%
- Синхронизация общих Ansible-ролей между репозиториями —
owner/eget/secretsдублируются между репозиториями и дрейфуют; канон в ansible-shared + rsync-таски invoke - Уведомления о размере приложений и заполнении диска — алерты на заполнение диска и аномальный рост data-томов; сервер ресурсно ограничен (tududi)
- Handlers рестарта для оставшихся приложений — apprise/dashboard/transcriber/miniflux монтируют конфиг в контейнер, но рестарта нет вовсе; правка конфига не подхватывается
- Composable-роль
backup— бэкап — самый чистый шов для extraction (одинаков у всех, различается только список targets) (ансибл-ревью) - Локальная сборка образов вместо Yandex Container Registry — все три приложения переведены на роль
app_image; осталось вычиститьyc_*-переменные из vault и прогнать деплой - Вывести из оборота секреты с широкими правами — один
yc_oauth_tokenоткрывает весь аккаунт Yandex Cloud; после инцидента 24 июля цена утечки одной переменной должна быть ограничена одним сервисом - outline: секреты из файлов — умеет generic
<NAME>_FILEдля всех пяти секретов; единственное приложение, где выносится вообще всё, включая пароль БД - wakapi: секреты из файлов — salt, SMTP и OIDC выносятся либо через generic
_FILE, либо черезconfig.yml; для OIDC второй путь надёжнее из-за бага с=в значении - authelia: секреты из файлов — пять полей закрывает
_FILE, jwks-ключ и client secret — только template-фильтр; заодно четыре client secret можно перевести в хэш и перестать считать секретами - gramps: секретный ключ из файла — entrypoint читает
/app/secret/secret, если переменная не задана, и этот путь уже смонтирован — самая дешёвая правка из всей серии
Низкий
- Мелкий хардненинг Caddy — HSTS-заголовок, убрать лишний
NET_ADMIN, убрать leftover-листенер:29999(sec-ревью) - Мелкий хардненинг контейнеров —
no-new-privileges, non-rootuser:, homepage off:latest, соглашение о127.0.0.1:портах (sec-ревью) - Унифицировать ACL техпанелей Authelia — rssbridge (SSRF) и dashboard за
one_factorбез subject; свести кgroup:admins+two_factor(sec-ревью) - Причесать роль
ownerпод конвенции —assertвместоfail+when,loopвместоwith_*, добавитьmeta/README (ансибл-ревью) - Инвентарь:
host_vars, именованные группы, точечныйbecome— хост-специфику вhost_vars/server.yml, хост в именованную группу, глобальный root → точечный become (ансибл-ревью) - Фоновая зачистка стиля и конфигурации Ansible — sudoers.d, профиль ansible-lint,
ansible.cfg, кавычки,cache_valid_time(ансибл-ревью) - Logrotate для логов бэкапов — логи
backup-all.py/restic копятся без ротации (tududi) - [idea] Где хранить пароль ansible-vault — пароль открытым текстом рядом с репо,
ansible.cfgподставляет его в любую ansible-команду; вариант — доставать из KeePassXC - gitea: пароль SMTP из файла — умеет
GITEA__mailer__PASSWD__FILE, но пишет значение открытым текстом вapp.ini— выигрыш только противdocker inspect - tududi: секреты в смонтированный
.env— файловых секретов не умеет вовсе; единственный путь — смонтировать.envподdotenv, чтобы значения не попадали вConfig.Env