chore(compose): параметризовать ресурсы postgres под переезд на новый хост #3058
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#3058
Loading…
Add table
Reference in a new issue
No description provided.
Delete branch "chore/compose-host-parameterised-resources"
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?
Снимает два блокера окна 30.08 (#3057), которых не было ни в одном issue — их вскрыла репетиция полного перелива на Poincare 2026-08-23.
Мина 1:
mem_limit: 3gзашит жёсткоtradein-mvp/docker-compose.prod.yml:126. На 62 ГиБ целевое 44g (не 64g — нужен запас под page cache вне контейнера). Ключевой порядок: лимит контейнера обязан подниматься раньшеshared_buffers, потому что он срабатывает раньшеpostgresql.conf—shared_buffers=12GBприmem_limit=3gубивает контейнер OOM-kill'ом на старте.Предупреждение об этом в файле уже было (строки 128-131), правки не было.
Мина 2:
initdb.dпротив восстановления дампаОба compose монтируют каталог миграций в
/docker-entrypoint-initdb.d. На свежем томе цепочка из 249 миграций отработает до восстановления дампа и засеет данные —scrape_schedules157 строк,tradein_users13,deals80 (003_seed_deals.sql,193_tradein_users_seed.sql) — а дамп идёт с--clean --if-existsи ляжет поверх.Решение: источник монтирования становится переменной. На первом старте нового хоста она указывает на пустой каталог, схема приезжает восстановлением дампа; после restore переменная снимается.
Что параметризовано
Только то, что зависит от размера хоста:
TRADEIN_PG_MEM_LIMIT3g44gTRADEIN_PG_SHM_SIZE512mTRADEIN_PG_SHARED_BUFFERS768MB12GBTRADEIN_PG_EFFECTIVE_CACHE_SIZE6GB36GBTRADEIN_PG_WORK_MEM16MB64MBTRADEIN_PG_MAINTENANCE_WORK_MEM256MB2GBTRADEIN_PG_MAX_WAL_SIZE4GB16GBTRADEIN_PG_INITDB_DIR./backend/data/sqlGENDESIGN_PG_INITDB_DIR./backend/db/initTRADEIN_PG_MEM_LIMITуправляет иmem_limit, иmemswap_limitнамеренно: инвариант «без свапа» (memswap == mem) обязан держаться и после правки, а не только на дефолте.checkpoint_timeout,wal_compression,random_page_cost,pg_stat_statementsи прочие от размера хоста не зависят — не тронуты.Целевые значения перечислены прямо в комментарии compose, а не в
.env.example: файлы.env*заблокированы guard-rail'ом сессии. Инженеру в окне не придётся искать их в другом месте.Нулевое изменение поведения на Beget — проверено, не заявлено
docker compose configпрогнан дважды на обоих файлах.Без переменных резолвится бит-в-бит как в
main:mem_limit/memswap_limit= 3221225472 (3g),shm_size= 536870912 (512m),shared_buffers=768MB,effective_cache_size=6GB,work_mem=16MB,maintenance_work_mem=256MB,max_wal_size=4GB, initdb source = штатные пути.С переменными:
mem_limit= 47244640256 (44g),memswap_limitсинхронно,12GB/36GB/64MB/2GB/16GB, initdb source подменяется.Лимиты остальных сервисов не изменились (
browser2560m/3g,backend768m/768m).$${POSTGRES_USER}в healthcheck диффом не задет.Что намеренно НЕ сделано
Postgres Site Finder (корневой compose) получил только переменную initdb.
mem_limitи тюнинга у него сейчас нет вовсе — добавление изменило бы поведение текущего прода, это отдельный риск и отдельная задача.При этом он до сих пор на стоковом конфиге:
shared_buffers128 МБ на базу 15 ГБ,wal_compressionoff,max_wal_size1 ГБ. Фикс #2991 применили только к кластеру Меры. Отсюда и разрыв в репетиции — перелив Меры 23 с против 173 с у Site Finder.Риск, который стоит внести в чек-лист окна
Если после restore забыть снять
*_INITDB_DIR, а том потом пересоздать (docker volume prune, повторная раскатка) — initdb отработает по пустому каталогу, и база останется без схемы вообще, молча. Снятие переменной должно быть отдельным шагом с проверкой, а не «не забыть». Добавлю пунктом в #3057.Refs #2989, #3057