9.6 KiB
9.6 KiB
План интеграции AstraDeploy и бота (FSM + callback API)
Цели
Сделать наблюдаемую, устойчивую и воспроизводимую установку через бота с поэтапными статусами.
Скрипт уже умеет отдавать:
startedstepsuccessfailed
Нужно оборачивать это в FSM-движок на бэкенде бота.
1. Точка входа callback
Endpoint
POST /astra-deploy/report- Заголовок:
Authorization: Bearer <report-token> - Content-Type:
application/json
Тело (из скрипта)
{
"status": "step",
"core": "paper",
"dir": "/opt/minecraft/paper",
"port": 25565,
"protocol": "tcp",
"service": "tmux-systemd",
"message": "Installing base packages",
"step": "preflight_packages",
"step_index": 14,
"step_total": 80,
"step_percent": 17
}
Рекомендуемый расширенный payload (бот-раннер может добавить)
{
"request_id": "uuid",
"job_id": "job_123",
"user_id": "123",
"locale": "ru"
}
Ответ
200/204с{ "ok": true }или пустым телом.- Идемпотентность по
(request_id, status, step, step_index, step_total, ts_sec)или аналогичной паре.
2. Запуск задачи из бота
Ключевые параметры запускаемого процесса:
--core ...--dir ...--port ...--service systemd|tmux-systemd|screen|none--user ...--firewall yes|no--yes--accept-license yes(обязательно в автоматическом)--accept-eula yesдля Java-ядер--report-url ...--report-token ...--locale ru|en(илиLANGUAGE/LANG)--dry-run,--update,--force-clean,--backup-existing,--allow-existing--build,--mc-versionдляnethergamesmc
3. FSM состояния
Состояния
QUEUEDRUNNINGVALIDATIONPREPARE_ENVCORE_INSTALLPOST_INSTALLWAITING_INPUTROLLBACKDONEFAILEDDRY_RUNSTALLED(таймаут между шагами)
Переходы
started->RUNNINGstep(parse_complete|prepare_defaults|preflight_*)->VALIDATIONstep(preflight_packages|preflight_java|preflight_user|preflight_directory)->PREPARE_ENVstep(install_core|deploy_core|update_core|core_*)->CORE_INSTALLstep(core_post|core_service|service_*|finalize)->POST_INSTALLstatus=success->DONEstatus=failed->FAILED--dry-run(локально определено) ->DRY_RUN- долгий таймаут без новых step ->
STALLED - interactive без автоматических флагов и требующие ответа ->
WAITING_INPUT
Идёмпотентная обработка
- Игнорировать дубликаты последнего шага в том же
request_id. - Обновлять состояние только если новый
step_indexвыше предыдущего или статус изменился на более поздний.
4. Полная карта step
Общая фаза и предзапуск
parse_completeprepare_defaultspreflight_startinstall_startfinalizecore_runtimecore_installcore_update
Предпроверки
preflight_beginpreflight_validate_rootpreflight_detectpreflight_detect_ospreflight_validate_supportpreflight_update_mode_checkpreflight_validate_planpreflight_validate_licensespreflight_validate_portpreflight_directorypreflight_packagespreflight_javapreflight_user
Установка/обновление ядер
core_resolve_channelcore_resolve_downloadcore_fetchcore_rendercore_configurecore_postcore_servicecore_chowncore_backupcore_update_donecore_phpbuild_resolvecore_phpbuild_fetchcore_composercore_repo_clonecore_installinstall_coredeploy_coreupdate_core
Системные шаги
packages_startpackages_dry_runpackages_indexdownload_startdownload_completeddownload_swapfirewall_startfirewall_donefirewall_manualjava_installrender_start_scriptchmod_start_scriptservice_stopservice_createservice_reload_enableservice_startuser_createuser_existsprepare_dirpermission_fix
5. Маппинг на UX-сообщения (ru/en)
RU
preflight_*→ «Подготовка окружения и проверок»preflight_packages/packages_*→ «Установка базовых пакетов»core_*→ «Установка и настройка ядра»service_*,core_service→ «Настройка автозапуска»core_chown/prepare_dir/permission_fix→ «Настройка доступа»success→ «Установка завершена»failed→ «Ошибка установки»
EN
preflight_*→Environment preflightcore_*→Core installationservice_*→Service setupfailed→Deployment failed
6. Edge-cases по сценариям запуска
- Interactive (без
--yes)- может остановиться на подтверждении лицензии/ЕULA/директории
- статус
WAITING_INPUT
--easy- обычный процесс, добавляется план-сводка до preflight
--updatestep_totalуменьшается на 6, проверяется существующая непустая директория
--dry-run- физически без изменений, callback может отсутствовать (как реализовано сейчас)
--force-clean- удаление содержимого директории перед установкой
--backup-existing- резервная копия
*.backup-<timestamp> --allow-existing- пропуск проверки непустой директории
- Неправильный
core/ OS - жёсткий fail с объяснением
- Порт занят
- fail с деталями
tcp/udpи предложением сменить порт - Сбой callback API
- для скрипта не фатальный; бот не должен переводить задачу в
FAILEDиз-за 5xx webhook-а
7. Rollback и пост-факту
На фатальной ошибке скрипт делает:
- лог ошибки
- попытку удаления созданного сервиса (если был создан)
- сообщение с путём лога (
/var/log/astra-deploy/...) - завершение с кодом ошибки
Для бота:
- статусы ->
ROLLBACK(внутренний подстейт) - показать пользователю:
- возможная причина
- путь лога
- безопасный список ручных действий
8. Минимальная модель хранения
jobs
iduser_idcore,dir,port,service,localefsm_statestatuspercentstep,step_index,step_total,messagerequest_id,report_token_id,process_pidcreated_at,updated_at
job_events
job_idstatus,step,step_index,step_total,step_percentmessageraw_payload(json)created_at
9. Шаблоны уведомлений
Telegram (RU)
- Запуск:
🚀 Установка AstraDeploy запущена - Шаг:
⚙️ {percent}% | {state} | {step} - Успех:
✅ Установка завершена - Ошибка:
❌ Установка завершена с ошибкой
Telegram (EN)
🚀 AstraDeploy started⚙️ {percent}% | {state} | {step}✅ Installation completed❌ Installation failed
Кнопки:
Получить статусЛогиЗапустить проверкуПовторить (dry-run)
10. Безопасность
- Токены webhook не логировать.
- Проверять
Authorizationстрого. - Проверка whitelist по разрешённым
step. - Rate limit на report endpoint.
- Защищённое хранение токенов (vault/secret/env).
11. Проверочный набор для интеграции
papernon-interactive, валидные флагиpaperбез--accept-eulaи с--yes->failednethergamesmc --dry-run-> без изменений, шаги в локальном логе- занятый порт ->
failed --updateна пустой директории ->failed--force-cleanна непустой директории -> success после очистки- callback 5xx -> установка продолжается, без ложного FAILED в UI
12. Что отдаёт разработчику бота на старте
- список поддерживаемых
core:pmmp,paper,purpur,velocity,powernukkitx,nethergamesmc - поддерживаемые режимы сервиса:
systemd,tmux-systemd,screen,none - список ключевых шагов из этого плана выше
- статусные правила и fallback-поведение для отсутствующего callback