feat(ops): лёгкий Postgres на Beget под forgejo и glitchtip (вариант А) #3080
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#3080
Loading…
Add table
Reference in a new issue
No description provided.
Delete branch "fix/3061-infra-postgres-split"
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?
Зачем
Базы
forgejo(265 МБ) иglitchtip(729 МБ) сейчас лежат внутриgendesign-postgres-1— того самого кластера, который 30.08 уезжает целиком вместе с 15 ГБ Site Finder. В окно переезда легли бы веб Forgejo, git по HTTP и Actions, то есть CI, из которого мы деплоим, ровно тогда, когда он нужнее всего. Отдельно неприятно, что Forgejo заявлен компенсацией риска «всё в одном аккаунте Selectel»: падая вместе с переездом, эту роль он не выполняет.Владелец выбрал вариант А — отдельный лёгкий кластер на Beget. PostGIS тут не нужен: обе схемы обычные реляционные, поэтому
postgres:16-alpine, а неpostgis/postgis:16-3.4ради гигабайта данных.Мерж и деплой ничего не меняют
infra-postgresстоит под профилемinfra, которого нет ни в одном окружении на Beget →docker composeего просто не видит.GLITCHTIP_DB_HOSTимеет дефолтpostgres→ строка подключения GlitchTip рендерится байт-в-байт как сегодня.Первая редакция этого свойства не имела: сервис стоял в профиле
glitchtip, который на Beget уже активен, и мерж поднял бы кластер с пустымINFRA_PG_PASSWORDв вечный restart-loop при зелёном деплое. Поймано ревью.Что в диффе
docker-compose.prod.ymlinfra-postgres(профильinfra, томinfra_postgres_data, портов наружу нет),GLITCHTIP_DB_HOSTс дефолтом, снятdepends_on: postgresу glitchtip-web/worker, runbook в шапкеops/db-bootstrap/infra-postgres/01-roles-and-databases.shforgejo/glitchtipops/backup-forgejo.shforgejoops/split-infra-postgres.sh.forgejo/workflows/deploy-infra.ymlinfra-postgres, но только если контейнер уже существуетops/gendesign-backup-forgejo.default.examplePG_CONTAINERв конфиге бэкапаДве защиты, которые стоит отревьюить отдельно
Healthcheck проверяет не приём соединений, а наличие обеих баз. Иначе «отравленный том» — когда bootstrap упал уже после инициализации PGDATA и потому больше никогда не запустится — выглядел бы здоровым, а обнаружился бы в ночь переезда как
role "forgejo" does not exist.backup-forgejo.shпри двух кандидатах останавливается с exit 1, а не выбирает первого. Это ровно окно миграции, когда база лежит в обоих кластерах: молча выбрать один — с вероятностью 1/2 бэкапить труп, а порогMIN_DB_DUMP_BYTESпротухший дамп не поймает, он нормального размера.ops/split-infra-postgres.shDry-run по умолчанию,
--applyдля реального прогона. Останавливает писателей, снимает число строк, восстанавливает целевой ролью (суперюзер забрал бы таблицы себе и выдалpermission deniedуже после переключения), сверяет построчные карты изpg_class.Ревью нашло два сценария бесшумной потери, оба закрыты:
--allow-missing-writer.--force-restoreотказывается работать, если переключение уже сделано (читаетapp.iniи конфиг GlitchTip) — иначе затёр бы боевой новый кластер старым дампом, и сверка подтвердила бы успех.Дампы под
umask 077+chmod 600: в дампе forgejo хеши паролей и access-токены.Test plan
Проверено на живом Docker 29.5.3, не по YAML:
docker compose config: сегодняшний рендер Beget байт-в-байт идентиченmainpostgres:16-alpine— обе базы →0, послеDROP DATABASEодной →1docker logsего нетbash -nна обоих скриптахops/split-infra-postgres.shбез--applyна Beget — до окна переезда--apply, проверка веба Forgejo и приёма событий GlitchTipРучное переключение (после мержа, на VM)
infra+INFRA_PG_PASSWORDops/split-infra-postgres.sh— сначала без флагов, потом--applyapp.ini:HOST = infra-postgres:5432GLITCHTIP_DB_HOST=infra-postgresPG_CONTAINER=gendesign-infra-postgresRefs #3061, #3057, #3075, #2989, #2203