Repository navigation
fix(examples)/feat(runtime): путь volume для postgres:18+ (#26) + человекочитаемый нейминг контейнеров (#27) — 3.2.0 - #31
Merged
Conversation
Образы postgres:18+ (docker-library/postgres#1259) хранят данные в каталогах по мажорным версиям и ожидают единое монтирование в /var/lib/postgresql; legacy-путь .../data отправляет контейнер в рестарт-луп. - schemas/pegas.json: примеры volumes (properties.services и $defs.service) переведены на путь 18+; description поля volumes объясняет причину. - example.json: перегенерирован из схемы (bun run scripts/gen-example.ts). - README.md, docs/reference/contract.md: примеры и таблица полей обновлены. - llms.txt уже содержал корректный путь — не тронут. - src/examples.postgres18.test.ts: guard-тест — примеры в репозитории не монтируют legacy-путь, postgres:18-сервис эталона использует путь 18+.
…ервис>-<сценарий>-<runtimeId> (#27) compose-проект `${runtimeId}-${scenario}` давал имена вида `0a1b0e24d9-development-db-1`: в docker ps невозможно определить ни проект, ни сервис, ни принадлежность к Pegas. Схема 3.2.0: - контейнер: pegas-<проект>-<сервис>-<сценарий>-<runtimeId> (container_name в манифесте); compose-проект: pegas-<проект>-<сценарий>-<runtimeId>; - runtimeId — суффикс: защита от коллизий checkout'ов + детерминизм имён (идемпотентность compose up); - предел DNS-метки 63 (RFC 1035) — реальное ограничение Docker: имя длиннее перестаёт резолвиться встроенным DNS (эмпирически: 76 → DNS_FAIL, 43 → OK). Длинные имена усекаются детерминированным дайджестом; усечение сохраняет projectName и runtimeId, режет сценарий и сервис; - тома объявлены с явным именем <runtimeId>-<сценарий>_<том> (историческая схема compose): переименование проекта не осиротит данные существующих развёртываний — проверено на живом томе 0a1b0e24d9-development_815records-pgdata; - миграция: up точечно снимает сирот прежнего compose-проекта по меткам pegas.project/pegas.scenario + com.docker.compose.project — --remove-orphans чужой проект не видит, без миграции старые контейнеры работали бы параллельно; - сетевые алиасы <runtimeId>-<scenario>-<service> не меняются: на них ссылаются upstream'ы маршрутных файлов и значения pegas://; - имя compose-проекта теперь только из манифеста (createRuntimeCompose возвращает scenario/composeProject): прежнее дублирование в runtime.ts расходилось с name: манифеста при пустом PEGAS_ENV; - план deploy --dry-run показывает compose-проект и containerNames. Новый модуль src/naming.ts — единственный источник истины схемы имён (+ naming.test.ts, 24 теста). Проверено живым docker compose: config -q, up/down, docker ps, volume ls — существующие тома и контейнеры не задеты. Версия 3.2.0 (minor: имена контейнеров меняются, контракт и маршруты нет).
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Два независимых исправления в одной ветке: путь тома для
postgres:18+(#26) и человекочитаемый нейминг контейнеров (#27). Версия 3.2.0 (minor).#26 — путь volume для postgres:18+ →
/var/lib/postgresqlОбразы
postgres:18+(docker-library/postgres#1259) хранят данные в каталогах по мажорным версиям и ожидают единое монтирование в/var/lib/postgresql. Legacy-путь.../dataотправляет контейнер в рестарт-луп.schemas/pegas.json— источник истины: примерыvolumesпереведены на путь 18+,descriptionполя объясняет причину;example.jsonперегенерирован из схемы (bun run scripts/gen-example.ts),README.mdиdocs/reference/contract.mdобновлены;llms.txtуже содержал корректный путь;src/examples.postgres18.test.tsловит откат к legacy-пути.Подтверждено на живом развёртывании: контейнер
0a1b0e24d9-development-db-1уже смонтирован в/var/lib/postgresqlсPGDATA=/var/lib/postgresql/18/docker— legacy-путь сломал бы его.#27 — нейминг
pegas-<проект>-<сервис>-<сценарий>-<runtimeId>Compose-проект
${runtimeId}-${scenario}давал имена вида0a1b0e24d9-development-db-1: вdocker psнельзя было определить ни проект, ни сервис, ни принадлежность к Pegas.container_nameв манифесте; compose-проект —pegas-<проект>-<сценарий>-<runtimeId>;runtimeIdостаётся суффиксом (защита от коллизий checkout'ов + детерминизм имён → идемпотентностьcompose up);src/naming.ts— единственный источник истины схемы имён (+24 теста);deploy --dry-runпоказывает compose-проект иcontainerNames;<runtimeId>-<scenario>-<service>не меняются: на них ссылаются upstream'ы маршрутных файлов шлюза и развёрнутые значенияpegas://— маршруты и service discovery не требуют перенастройки.Три ограничения, найденные эмпирически
1. Переименование проекта осиротило бы данные. Compose-проект задаёт префикс named-томов (
0a1b0e24d9-development_815records-pgdata). Тома закреплены явнымname:по исторической схеме. Проверено на реальном развёртывании: том существовал до правок и был переиспользован новым проектом без миграции.2. Имя контейнера длиннее 63 символов перестаёт резолвиться по DNS.
docker createпринимает и 306 символов,compose config -q— тоже; но в поднятой сети 76 символов →getent hostsвозвращаетDNS_FAIL, 43 символа →DNS_OK(предел DNS-метки, RFC 1035). Длинные имена усекаются детерминированным дайджестом, сохраняяprojectNameиruntimeIdцеликом (первая реализация резала имя проекта в нечитаемое8-0f45c4— против самой цели issue, порядок приоритетов исправлен).3. Латентный рассинхрон имени compose-проекта.
deploy.tsвычислял${runtimeId}-${env}, а манифест —pegas-${projectId}-${scenario}; при пустомPEGAS_ENVподставлялсяdevelopmentвместоscenarios[0]. Флаг--project-nameперекрываетname:манифеста (проверено), поэтому дублирование убрано:createRuntimeCompose()возвращаетscenarioиcomposeProject.Миграция сирот
Без неё после переименования старые контейнеры работали бы параллельно —
--remove-orphansчужой compose-проект не видит.upточечно снимает контейнеры прежнего проекта по меткамpegas.project+pegas.scenario+com.docker.compose.project. Фильтр проверен на реальном legacy-контейнере: находит ровно его, чужие развёртывания не затрагиваются.Проверки
bun run testbun run typecheckbun run docs:checkllms.txtиcli.mdактуальныbun run builddocker compose config -q/up/downdocker ps/volume lsE2E локально не запускался: он поднимает собственный gateway на 80/443, которые заняты живым
pegas-gatewayна этой машине. Все пробные контейнеры сняты, том с данными и контейнеры пользователя не затронуты.Closes #26
Closes #27