iac/aero/pyproject.toml
emelinda 6d6703ed2d BIM: расширение ltree и задача досоздания баз в живой СУБД
Продолжение разбора: после появления bimapidb оба пода упали на
  psycopg2.ProgrammingError: ltree type not found in the database
а миграция api — на
  type "ltree" does not exist
  LINE 2: ALTER TABLE bimelement ADD hierarchy ltree null;
models/database.py при инициализации зовёт register_ltree(conn), без
расширения приложение не стартует. Роль bim не суперпользователь и
CREATE EXTENSION сама не сделает — расширение обязан завести бутстрап,
как у sarex_db и workflow_db. Добавлено в contour.databases.

--- Почему понадобилась отдельная задача ansible ---

Базы и расширения описаны декларативно, но заводит их скрипт бутстрапа
ТОЛЬКО при старте пода postgresql. На живом кластере правка списка
доезжает до Kubernetes и не делает ничего: спецификация пода не меняется,
пересоздания нет. Flux при этом полностью зелёный, а приложение падает с
"database does not exist" — связь между причиной и симптомом неочевидна.

Альтернатива — перезапуск postgresql-0, но это обрыв коннектов django,
processing и workspaces ради одной базы.

Добавлены tasks/databases.yml, список sarex_databases в defaults и задача
`uv run poe dbsync`. Делает ровно то же, что бутстрап, но без простоя, и
идемпотентно: существующие базы пропускаются, расширения создаются через
IF NOT EXISTS. Расширения обрабатываются отдельным шагом и всегда, а не
только для новых баз, — расширение может появиться в списке позже самой
базы, ровно так и вышло с ltree.

Проверено на живом контуре: bim-api 2/2 (uWSGI поднял воркеров),
bim-worker 2/2 (celery подключился к брокеру, 8 задач зарегистрировано).
2026-08-09 21:55:27 +03:00

114 lines
6.0 KiB
TOML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

[project]
name = "aero"
version = "0.1.0"
description = "Ansible-провижининг docker-хостов (docker, docker-compose, containerd)"
requires-python = ">=3.11"
dependencies = [
"ansible-core>=2.17",
]
[dependency-groups]
dev = [
"ansible-lint>=24.0",
"poethepoet>=0.29",
]
[tool.uv]
package = false
# Общее окружение для всех poe-задач.
# ANSIBLE_CONFIG задаётся явно: на /mnt/c (диск Windows) права 0777, и ansible
# из соображений безопасности игнорирует ansible.cfg в world-writable каталоге.
[tool.poe.env]
ANSIBLE_CONFIG = "${POE_ROOT}/ansible.cfg"
UV_LINK_MODE = "copy"
# Таск-раннер poethepoet. Запуск: uv run poe <task>
[tool.poe.tasks]
sync = "uv sync"
galaxy = "ansible-galaxy collection install -r requirements.yml"
ping = "ansible docker_hosts -m ping"
# Провижининг хоста: базовые пакеты + docker/containerd + запуск службы
provision = "ansible-playbook site.yml"
check = "ansible-playbook site.yml --check --diff"
# Деплой конфигурации: файлы, .env с паролями, сертификаты, docker login
deploy = "ansible-playbook deploy.yml"
deploy-check = "ansible-playbook deploy.yml --check --diff"
# Деплой + поднять стек приложения (docker compose up -d)
stack = "ansible-playbook deploy.yml -e sarex_compose_up=true"
# Деплой + поднять GitOps-подложку: k3s + gitea + vault + bootstrap FluxCD.
# Без --tags намеренно: подложке нужны .env, docker-compose.yaml и vault/config,
# которые кладут нетегированные задачи роли (при --tags они были бы пропущены).
platform = "ansible-playbook deploy.yml -e aero_platform_up=true"
# Только генерация паролей и рендер .env на хосте (без копирования/сертификатов)
gen-env = "ansible-playbook deploy.yml --tags env"
# docker login в приватный реестр по ключу json_key
login = "ansible-playbook deploy.yml --tags login"
# Показать логин+пароль администратора платформы. Саму учётку создаёт под
# backend при старте (apps/django/aero), эта задача только печатает креды.
superuser = "ansible-playbook deploy.yml -e sarex_create_superuser=true --tags superuser"
# Перекатить нагрузки, конфигурация которых лежит в ConfigMap. Нужно после
# правки nginx-configmap: Flux обновит ConfigMap, но под продолжит работать со
# старым содержимым — в шаблоне пода нет хеша конфига, спецификация не меняется
# и Kubernetes не видит причин его пересоздавать. Список — sarex_reload_workloads.
reload = "ansible-playbook deploy.yml -e sarex_reload=true --tags reload"
# Досоздать базы, появившиеся в contour.databases после запуска СУБД. Бутстрап
# заводит базы только при старте пода postgresql, поэтому на живом кластере
# новая база иначе не появится: Flux зелёный, а приложение падает с
# FATAL: database "..." does not exist. Идемпотентно.
dbsync = "ansible-playbook deploy.yml -e sarex_dbsync=true --tags dbsync"
lint = "ansible-lint"
# --- Операционные задачи на хосте (без полного деплоя) ----------------------
# Поднять/пересоздать сервисы приложения (docker compose up -d sarex_services).
# Только тег up: не трогает файлы/.env/сертификаты/login, лишь применяет стек.
up = "ansible-playbook deploy.yml -e sarex_compose_up=true --tags up"
[tool.poe.tasks.ps]
cmd = "ansible docker_hosts -m ansible.builtin.shell -a 'docker compose ps chdir=/root/sarex'"
help = "Статус стека на хосте (docker compose ps)"
[tool.poe.tasks.flux-status]
cmd = "ansible docker_hosts -m ansible.builtin.shell -a 'docker compose exec -T k3s-server kubectl -n flux-system get kustomizations,gitrepositories,pods chdir=/root/sarex'"
help = "Состояние FluxCD в k3s (kustomizations, источники, поды)"
[tool.poe.tasks.vault-status]
cmd = "ansible docker_hosts -m ansible.builtin.shell -a 'docker compose exec -T vault-init vault status chdir=/root/sarex'"
help = "Состояние Vault (инициализирован / распечатан)"
[tool.poe.tasks.pull]
cmd = "ansible docker_hosts -m ansible.builtin.shell -a 'docker compose pull ${service} chdir=/root/sarex'"
help = "Стянуть образы: uv run poe pull [service]"
[[tool.poe.tasks.pull.args]]
name = "service"
positional = true
default = ""
[tool.poe.tasks.logs]
cmd = "ansible docker_hosts -m ansible.builtin.shell -a 'docker compose logs --no-color --tail ${tail} ${service} chdir=/root/sarex'"
help = "Логи сервиса(ов): uv run poe logs [service] [--tail N]"
[[tool.poe.tasks.logs.args]]
name = "service"
positional = true
default = ""
[[tool.poe.tasks.logs.args]]
name = "tail"
options = ["--tail"]
default = "80"
[tool.poe.tasks.restart]
cmd = "ansible docker_hosts -m ansible.builtin.shell -a 'docker compose restart ${service} chdir=/root/sarex'"
help = "Перезапустить сервис: uv run poe restart <service>"
[[tool.poe.tasks.restart.args]]
name = "service"
positional = true
required = true
# Подготовка окружения: uv sync + установка коллекций
[tool.poe.tasks.setup]
sequence = ["sync", "galaxy"]
# Установка с чистого листа: окружение → docker → деплой+стек → суперпользователь
[tool.poe.tasks.install]
sequence = ["sync", "galaxy", "provision", "stack", "superuser"]