Полный цикл M0–M5 по ТЗ: - Catalog Service: импорт runtipi/runtipi-appstore → catalog_apps, идемпотентный синк, кэш логотипов, авто раз в 24ч (APScheduler), флаг update_available. - App Engine: установка (клон золотого шаблона → pct push compose/.env → docker compose up → health-check) с журналом шагов, шифрованием env (Fernet), генерацией random-секретов и прогрессом по WebSocket. - Lifecycle: start/stop/restart/logs/delete + реконсиляция состояния (orphaned). - Update/Rollback через снапшоты Proxmox (pre-update, хранение последнего 1). - UI: экраны App Store (сетка/поиск/категории), страница приложения, мастер установки (динамическая form_fields + advanced + прогресс + креденшелы), My Apps; i18n ru/en; атрибуция Runtipi. - RBAC app:view/install/manage; только unprivileged LXC; pct exec/push без shell-инъекций (base64 + экранирование). - Модели catalog_apps/installed_apps/app_operations (миграции 31–32). - Docs: golden-template, appstore-poc/catalog/engine. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
4.2 KiB
4.2 KiB
App Store — M0 Proof of Concept
Изолированный backend-каркас, который вручную проверяет ключевую схему модуля
App Store: create (из золотого шаблона) → push → exec → health-check для
одного приложения. Роутеры FastAPI НЕ регистрируются — работающая панель не
затрагивается. Это seed будущего services/appstore_engine.py.
Код: backend/app/appstore/ (pipeline.py, cli.py, samples/).
Предпосылки
- Золотой шаблон LXC уже подготовлен и лежит как
vztmplв storage ноды:- Debian 12, unprivileged;
- предустановлены Docker Engine + Docker Compose plugin,
curl,jq; - экспортирован в шаблон (
vzdump→ файл в…/template/cache/*.tar.zst), видимый какlocal:vztmpl/<имя>.tar.zst. - Features
nesting=1,keyctl=1PoC выставляет сам при создании CT (это параметр контейнера, а не свойство шаблона).
- SSH-доступ панели к ноде root-ом (тот же механизм, что использует остальная
панель —
setup_ssh.sh/ пароль root на сервере). Нужен дляpct exec/pct push. - Proxmox-сервер уже добавлен в панель (есть
server_idв БД). - Запуск — в окружении бэкенда (доступ к БД панели и
FERNET_KEY), например внутри backend-контейнера:docker compose exec app python -m app.appstore.cli ....
Запуск
Установка тестового приложения (по умолчанию — uptime-kuma, односервисное):
python -m app.appstore.cli install \
--server-id 1 \
--ostemplate local:vztmpl/golden-docker_12_amd64.tar.zst \
--name poc-uptime-kuma \
--port 3001
Опционально: --node, --storage, --bridge, --cores, --memory, --disk,
--compose-file <path>, --env-file <path>.
Повторяемость — снести контейнер:
python -m app.appstore.cli teardown --server-id 1 --vmid <VMID>
Что делает пайплайн (pipeline.poc_install)
_get_proxmox_client()→ подключение к Proxmox, выбор ноды.create_lxc_container(ostemplate=<golden>, features="nesting=1,keyctl=1", …)+wait_for_task— контейнер из золотого шаблона.start_container→ ожидание IP (pct exec … hostname -I).mkdir /opt/app /opt/app-data, создание Docker-сетиtipi_main_network.- Доставка
docker-compose.ymlи.envчерез base64 → файл на ноде →pct push(без shell-инъекций, S-4). pct exec … docker compose --env-file .env up -d.- Health-check
GET http://<ip>:<port>(ретраи 5с, любой HTTP-ответ = успех).
Прогресс шагов печатается в лог (в реальном движке станет WS-broadcast'ом).
Definition of Done (M0)
- Из золотого шаблона поднимается контейнер, и
docker compose upтестового приложения проходит с первой попытки. poc installзавершается статусомrunning, выводитhttp://IP:порт, и Uptime Kuma открывается по этому адресу.
Известные ограничения PoC
- Нет записи в БД (таблицы
installed_apps/app_operations— этап M1+); PoC наблюдаем только по логам и через сам Proxmox. - Health-check IP определяется через
hostname -I(DHCP). Статический IP из IPAM — на следующем этапе (готовыйipam_serviceуже есть). - Для «тяжёлых»/privileged приложений unprivileged LXC может не подойти — это ожидаемо и отражено в рисках ТЗ.