Wire backend to processing-api, provision workflow_db extensions, add deploy automation

- backend/celery: WORKFLOWS_USE/HOST/BASE_HOST/PREFIX -> processing-api
  (WORKFLOWSSETTINGS builds COMPARISON/DOCUMENTATION/PDM_FILES URLs)
- postgres-init: create uuid-ossp/ltree/hstore in workflow_db as superuser
  (processing role lacks CREATE EXTENSION) - fixes workflows-api migration
- sarex_stack: handlers recreate nginx / backend+celery when their mounted
  configs change (docker compose up -d does not detect bind-mount edits)
- poe: operational tasks up/ps/pull/logs/restart on the host
This commit is contained in:
emelinda 2026-07-24 18:22:02 +03:00
parent b7f4d07544
commit 6244a05c19
5 changed files with 81 additions and 1 deletions

View File

@ -21,6 +21,9 @@ SAREX_JWT_PRIVATE_KEY=changeme
SAREX_JWT_PUBLIC_KEY=changeme
SAREX_PROCESSING_DB_USER=processing
SAREX_PROCESSING_DB_PASSWORD=processing-secret
# Расширения PostgreSQL для workflow_db (создаёт postgres-init суперпользователем;
# роль processing прав на CREATE EXTENSION не имеет). Нужны миграциям workflows-api.
SAREX_PROCESSING_DB_EXTENSIONS=uuid-ossp ltree hstore
SAREX_BIM_DB_USER=bim
SAREX_BIM_DB_PASSWORD=bim-secret
SAREX_WORKSPACE_DB_USER=workspace

View File

@ -44,6 +44,43 @@ login = "ansible-playbook deploy.yml --tags login"
superuser = "ansible-playbook deploy.yml -e sarex_create_superuser=true --tags superuser"
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.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"]

View File

@ -0,0 +1,20 @@
---
# Пересоздание контейнеров при изменении их bind-mount конфигов.
# docker compose up -d НЕ пересоздаёт контейнер, если поменялся только
# смонтированный файл (шаблон nginx, production.py) — контент тома он не
# отслеживает. Поэтому на изменение конфига форсим --force-recreate конкретного
# сервиса. Срабатывает только когда стек реально поднимается (sarex_compose_up),
# иначе на обычном deploy без up мы бы стартовали контейнеры.
- name: Recreate nginx
ansible.builtin.command:
cmd: "{{ compose_cmd }} up -d --force-recreate --no-deps nginx"
chdir: "{{ deploy_dir }}"
when: sarex_compose_up | bool
- name: Recreate backend and celery
# Оба монтируют ./backend/production.py (celery — ещё и через тот же файл),
# поэтому пересоздаём вместе.
ansible.builtin.command:
cmd: "{{ compose_cmd }} up -d --force-recreate --no-deps backend celery"
chdir: "{{ deploy_dir }}"
when: sarex_compose_up | bool

View File

@ -17,19 +17,23 @@
# nginx монтирует ./nginx/templates и ./nginx/certs — без шаблонов nginx не
# стартует, поэтому копируем конфигурацию рядом с compose.
# Изменение шаблона → handler пересоздаёт nginx (envsubst рендерит на старте).
- name: Скопировать шаблоны nginx
ansible.builtin.copy:
src: "{{ deploy_src_root }}/nginx/templates/"
dest: "{{ deploy_dir }}/nginx/templates/"
mode: "0644"
notify: Recreate nginx
# backend монтирует ./backend/uwsgi.ini (http-socket + 4 воркера) и
# ./backend/production.py (классическая JWT-аутентификация)
# ./backend/production.py (классическая JWT-аутентификация).
# Изменение конфигов → handler пересоздаёт backend и celery.
- name: Скопировать конфиги backend (uwsgi.ini, production.py)
ansible.builtin.copy:
src: "{{ deploy_src_root }}/backend/"
dest: "{{ deploy_dir }}/backend/"
mode: "0644"
notify: Recreate backend and celery
# --- Секреты: генерация с персистом на control-node (идемпотентно) --------
- name: Сгенерировать/загрузить пароли (persist в secrets_store, gitignored)

View File

@ -154,6 +154,14 @@ services:
for ext in $$DJANGO_EXTENSIONS; do
q -c "CREATE EXTENSION IF NOT EXISTS \"$$ext\"" && echo "extension $$ext ready in $$DJANGO_DB"
done
# Расширения для processing (workflow_db) — ОТДЕЛЬНАЯ база, поэтому явно
# -d PROC_DB. Роль processing не суперпользователь → CREATE EXTENSION в
# её миграциях (uuid-ossp/ltree/hstore) падает; заводим суперпользователем.
for ext in $$PROC_EXTENSIONS; do
psql -v ON_ERROR_STOP=1 -h postgres -U "$$SUPER_USER" -d "$$PROC_DB" \
-c "CREATE EXTENSION IF NOT EXISTS \"$$ext\"" && echo "extension $$ext ready in $$PROC_DB"
done
environment:
PGPASSWORD: ${SAREX_POSTGRES_PASSWORD:-sarex}
SUPER_USER: ${SAREX_POSTGRES_USER:-sarex}
@ -167,6 +175,7 @@ services:
PROC_DB: ${SAREX_PROCESSING_DB:-workflow_db}
PROC_USER: ${SAREX_PROCESSING_DB_USER:-processing}
PROC_PASSWORD: ${SAREX_PROCESSING_DB_PASSWORD:-processing-secret}
PROC_EXTENSIONS: ${SAREX_PROCESSING_DB_EXTENSIONS:-uuid-ossp ltree hstore}
# bim
BIM_DB: ${SAREX_BIM_DB:-bim_db}
BIM_USER: ${SAREX_BIM_DB_USER:-bim}
@ -305,6 +314,13 @@ services:
# проксирует их в s3-proxy (CORS+Range). Из apps/django/base/backend-deployment.yaml.
SERVER_USE_DJANGO_STORAGE: "1"
SERVER_DJANGO_URLS: "1"
# processing (workflows-api): backend ходит в processing-api за workflow'ами.
# WORKFLOWSSETTINGS.host строит COMPARISON/DOCUMENTATION/PDM_FILES_API_URL.
# По умолчанию use=False и host=api.sarex.io — переопределяем на наш стек.
WORKFLOWS_USE: "1"
WORKFLOWS_HOST: http://processing-api:8080
WORKFLOWS_BASE_HOST: http://backend:8000
WORKFLOWS_PREFIX: /internal/v1
tty: true
ports:
- "8000:8000" # HTTP API (uWSGI http-socket), migrate выполняется в entrypoint