--- Бакет --- В base у measurements имя бакета ЗАШИТО в самом vault-шаблоне: "buckets":["measurements"] Из-за этого он складывал файлы в собственный бакет, тогда как медиахранилище контура одно — sarex-media-storage: туда пишет django и оттуда же раздаёт s3-proxy на маршруте /media/. Ссылка на файл измерения, отданная через django, вела бы в пустоту. Шаблон переопределён в apps/measurements/aero так, чтобы имя бакета читалось из секрета — как уже читается endpoint. Значение задаётся в одном месте, vault_app_secrets, и совпадает с sarex_django_s3_bucket. Заменить пришлось аннотацию целиком: значение внутри шаблона, через values его не перекрыть. Из Job'а бакетов убран measurements. Это не удаление: Job умеет только mc mb --ignore-existing, ранее созданный бакет остаётся на месте — мы лишь перестаём его заводить. Порядок применения безопасен: в platform.yml vault-k8s.yml идёт до gitea-sync.yml, то есть секрет получит ключ bucket раньше, чем Flux пересоздаст под. Иначе vault-agent-init не отрендерил бы шаблон с несуществующим ключом и под ушёл бы в Init:Error. --- Перекат нагрузок --- Единственное действие, которое до сих пор делалось руками мимо роли, — rollout restart после правки ConfigMap. Оно понадобилось дважды (порядок set/rewrite в nginx и auth_type) и оба раза выглядело как «правка не поехала»: Flux рапортует Applied revision, а поведение старое. Причина в том, что у релизов universal-chart в шаблоне пода нет контрольной суммы конфига: ConfigMap меняется, спецификация пода — нет, Kubernetes не видит причин пересоздавать под. Декларативно это здесь не лечится — имя ConfigMap передаётся чарту строкой, монтирует он его сам, а configMapGenerator переименовал бы ресурс, не поправив ссылку внутри чарта, который рендерится уже в кластере. Добавлены tasks/reload.yml, список sarex_reload_workloads в defaults и задача `uv run poe reload`. По умолчанию выключено: перезапуск подов посреди обычного деплоя происходить сам не должен.
109 lines
5.5 KiB
TOML
109 lines
5.5 KiB
TOML
[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"
|
||
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"]
|