Сервер канбан-доски¶
Канбан-доска хранится в SQLite и доступна всем пользователям одного экземпляра QA Portal. Браузер получает состояние через same-origin API и проверяет новую ревизию каждые пять секунд.
Запуск¶
.venv\Scripts\python.exe -m tools.kanban_server --build
Параметры сервера:
--host— адрес привязки, по умолчанию127.0.0.1;--port— HTTP-порт, по умолчанию8000;--database— путь к SQLite-файлу, по умолчанию.tmp/kanban.sqlite3;--site-dir— каталог собранного MkDocs-портала;--build— собрать портал перед запуском.
Для доступа из доверенной сети используйте --host 0.0.0.0 и ограничьте порт
межсетевым экраном. Встроенный сервер не аутентифицирует пользователей, поэтому
его нельзя публиковать напрямую в интернет. Для постоянного окружения запустите
его как отдельный непривилегированный сервис за Nginx и TLS.
Системный сервис test-2¶
На test-2.business-pad.com API запускается непривилегированным systemd-сервисом
businesspad-qa-kanban.service на 127.0.0.1:8010. Nginx проксирует только
/api/kanban/, а статический портал продолжает публиковаться обычным CI job.
Конфигурации хранятся в deploy/systemd/businesspad-qa-kanban.service и
deploy/nginx/test-2.business-pad.com. Рабочая база находится вне document
root: /var/lib/businesspad-qa-kanban/kanban.sqlite3. Поэтому публикация новой
статической версии портала не удаляет карточки и их историю.
Хранение и история¶
Таблица kanban_cards содержит текущее состояние и номер версии карточки.
kanban_card_events — append-only журнал событий created, updated, moved
и deleted. Изменение карточки, событие истории и ревизия доски записываются в
одной транзакции.
GET /api/kanban/cards/{id}/history возвращает события от нового к старому.
Поле sequence содержит возрастающий номер события внутри карточки, actor и
createdAt — автора и точное время действия. Для updated объект
payload.changes содержит только действительно изменившиеся поля со значениями
from и to. Для moved сохраняются исходная и целевая колонки, а также
позиции карточки до и после перемещения.
При конкурентном редактировании клиент передаёт expectedVersion. Если версия
на сервере уже изменилась, API отвечает 409 Conflict, обновляет доску и просит
повторить изменение. Карточки удаляются мягко, поэтому их аудит остаётся в базе.
Резервное копирование¶
Остановите запись в сервис или используйте SQLite Online Backup API, затем скопируйте файл базы в защищённое хранилище. Не копируйте только основной файл во время активной записи без учёта WAL-файла.