Перейти к содержанию

Сервер канбан-доски

Канбан-доска хранится в 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-файла.