fix(deploy): postgres in the project, no restart on an empty list, image named with dashes #1

Merged
hh merged 2 commits from deploy-scheme into main 2026-10-08 18:46:03 +00:00
Owner

Баги шаблона, найденные при переводе cars-system 07.10, и абзац про новую схему деплоя. Не сливать без решения человека — слияние меняет все будущие проекты и copier update существующих.

Что исправлено

  1. pre-deploy поднимал postgres в родительском каталоге. COMPOSE := cd .. && docker compose подставлялся дважды в одну строку (… | grep -qx postgres && cd .. && docker compose up -d postgres) — второй cd .. уходил на уровень выше проекта, в логах деплоя «no configuration file provided: not found». Теперь каждая команда compose — в своей подоболочке; postgres поднимается с --wait (миграция сразу за ним).
  2. post-deploy при пустом списке сервисов всё равно делал docker compose restart. [ -z "$running" ] || cd .. && docker compose restart $running читается как (… || cd ..) && restart — при пустом списке перезапускалось всё (и в backend/, а не в корне). Теперь if [ -n "$running" ]; then (…restart…); fi.
  3. Имя образа — через дефис. project_slug остаётся snake_case (пакет python, база), а образ — <slug с дефисами>/backend, как имена стеков и проектов во флоте (cars-system/backend, а не cars_system/backend). Переменная caddy — в PR шаблона caddy.

Проверено рендером (copier copy -r HEAD, layout part, postgres) и make pre-deploy / post-deploy с поддельным docker, который печатает свой каталог:

main эта ветка
up -d postgres в tpl/ (родитель проекта) в корне проекта, --wait
пустой список в post-deploy docker compose restart в backend/ ничего
непустой список — docker compose restart api в корне

Для существующих проектов

copier update переименует образ (foo_bar/backend → foo-bar/backend): make pre-deploy не найдёт образ под новым именем и соберёт его один раз, старый останется до чистки. У стеков в git-режиме имя образа задаёт слой в infra — их это не касается.

Вопрос: убирать ли make pre-deploy / post-deploy и штампы refs/deploy/*

Прод флота теперь деплоит infra/komodo (git-режим Komodo: слой compose.fleet.yml, deploy.sh, sops в каталоге стека, теги образов по хэшу). Эти цели на проде больше не нужны, и именно в них жили баги 1–2. Но их ещё зовут стеки на files_on_host (сверено по fleet/**/stack.toml 08.10):

  • make pre-deploy + make post-deploy: hubmi, ai-lawyer, factory-record;
  • только make pre-deploy: superteam, lodge;
  • stealth-server / stealth-solutions их не используют.

Если цели убрать из шаблона, copier update в этих репах удалит их из Makefile, и следующий деплой стека упадёт на make: *** No rule to make target 'pre-deploy'.

Рекомендация: в этом PR цели оставить (баги в них починены, README говорит, что они для чекаута, развёрнутого руками). Убрать отдельным PR во всех шаблонах сразу (backend-python, frontend-svelte, blank, корневой Makefile infra), когда последний из этих пяти стеков переедет в git-режим. ai-lawyer, factory-record, lodge уже подготовлены (stack.toml.next), hubmi и superteam ждут решения по репам в Gitea.

🤖 Generated with Claude Code

Баги шаблона, найденные при переводе cars-system 07.10, и абзац про новую схему деплоя. **Не сливать без решения человека** — слияние меняет все будущие проекты и `copier update` существующих. ## Что исправлено 1. **`pre-deploy` поднимал postgres в родительском каталоге.** `COMPOSE := cd .. && docker compose` подставлялся дважды в одну строку (`… | grep -qx postgres && cd .. && docker compose up -d postgres`) — второй `cd ..` уходил на уровень выше проекта, в логах деплоя «no configuration file provided: not found». Теперь каждая команда compose — в своей подоболочке; postgres поднимается с `--wait` (миграция сразу за ним). 2. **`post-deploy` при пустом списке сервисов всё равно делал `docker compose restart`.** `[ -z "$running" ] || cd .. && docker compose restart $running` читается как `(… || cd ..) && restart` — при пустом списке перезапускалось всё (и в `backend/`, а не в корне). Теперь `if [ -n "$running" ]; then (…restart…); fi`. 4. **Имя образа — через дефис.** `project_slug` остаётся snake_case (пакет python, база), а образ — `<slug с дефисами>/backend`, как имена стеков и проектов во флоте (`cars-system/backend`, а не `cars_system/backend`). Переменная caddy — в PR шаблона `caddy`. Проверено рендером (`copier copy -r HEAD`, layout part, postgres) и `make pre-deploy` / `post-deploy` с поддельным docker, который печатает свой каталог: | | `main` | эта ветка | |---|---|---| | `up -d postgres` | в `tpl/` (родитель проекта) | в корне проекта, `--wait` | | пустой список в post-deploy | `docker compose restart` в `backend/` | ничего | | непустой список | — | `docker compose restart api` в корне | ## Для существующих проектов `copier update` переименует образ (`foo_bar/backend` → `foo-bar/backend`): `make pre-deploy` не найдёт образ под новым именем и соберёт его один раз, старый останется до чистки. У стеков в git-режиме имя образа задаёт слой в infra — их это не касается. ## Вопрос: убирать ли `make pre-deploy` / `post-deploy` и штампы `refs/deploy/*` Прод флота теперь деплоит `infra/komodo` (git-режим Komodo: слой `compose.fleet.yml`, `deploy.sh`, sops в каталоге стека, теги образов по хэшу). Эти цели на проде больше не нужны, и именно в них жили баги 1–2. Но их ещё зовут стеки на `files_on_host` (сверено по `fleet/**/stack.toml` 08.10): - `make pre-deploy` + `make post-deploy`: **hubmi**, **ai-lawyer**, **factory-record**; - только `make pre-deploy`: **superteam**, **lodge**; - stealth-server / stealth-solutions их не используют. Если цели убрать из шаблона, `copier update` в этих репах удалит их из Makefile, и следующий деплой стека упадёт на `make: *** No rule to make target 'pre-deploy'`. **Рекомендация:** в этом PR цели оставить (баги в них починены, README говорит, что они для чекаута, развёрнутого руками). Убрать отдельным PR во всех шаблонах сразу (`backend-python`, `frontend-svelte`, `blank`, корневой Makefile `infra`), когда последний из этих пяти стеков переедет в git-режим. ai-lawyer, factory-record, lodge уже подготовлены (`stack.toml.next`), hubmi и superteam ждут решения по репам в Gitea. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
hh added 2 commits 2026-10-08 04:41:45 +00:00
hh merged commit a5345a9e4c into main 2026-10-08 18:46:03 +00:00
hh deleted branch deploy-scheme 2026-10-08 18:46:03 +00:00
Sign in to join this conversation.
No Reviewers
No labels
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: templates/backend-python#1