services v1.0.0 [extra]


Управление службами: Windows/Linux/Docker/локальные юниты, каталог, действия.

versiondatecommitфайлов
1.0.02026-10-078c15e4d6865923

README

# services

Управление службами на всех хостах из одного места: что есть, что запущено, старт/стоп/рестарт.

Тип: Модуль. Категория: `extra`. Зависимостей нет.

## Что это

Службы живут на разных машинах и разных init-системах — Windows (`sc`), Linux (`systemctl` по SSH), Docker-контейнеры, локальные юниты. Спрашивать хочется одинаково, поэтому ядро держит реестр, а провайдеры отвечают каждый за свой тип:

- `services_windows` — службы Windows (`sc query/start/stop`, автозапуск через `sc config`);
- `services_linux` — юниты удалённых Linux-машин (`systemctl` по SSH, действия через sudo);
- `services_docker` — контейнеры (`docker ps/start/stop/restart`, включая healthy);
- `services_local` — юниты своей же машины (`systemctl` напрямую, без SSH).

Провайдеры видят только свой вайтлист: остальные службы хоста боту недоступны. Каждое действие пишется в аудит, статусы собираются best-effort (упавший хост не роняет весь список).

В кабинете — сводная таблица служб всех хостов со статусами, в Telegram — кнопка сервисов в меню (группировка по хостам).

## Каталог

Право `service_catalog` (старт/стоп/рестарт не даёт): все доступные службы хостов — из кеша `data/services/discovery_cache.json`, обновление только вручную по кнопке (по хосту или всё сразу). Чекбокс «вкл» — служба в общем списке, выкл — скрыта.

Списки хранятся в `data/services/hosts.json` (вне git, один файл на все типы: `type/alias/endpoint/services/...`), сохранение из кабинета — без рестарта (`hosts_set` + `reload` провайдеров). Нет `hosts.json` — провайдеры работают как раньше: один инстанс из своего `.env`.

Подключения — одна таблица перед каталогом: хост, тип, селект точки → привязка, кеш, действия (🔄 опрос, 💾 сохранить, 🗑 удалить точку). Новые точки создаются там же: windows/linux/docker → ssh-точка, local — новый хост без точки. SSH-пароль/ключ живёт в точке (`data/env/outbound.env`), здесь — только вайтлисты и sudo-пароли для удалённых команд. С ключом (`address.key`) пароль можно не вводить.

## Устройство (для разработчиков)

Провайдеры встроены в ядро: движки — `services/backends/` (`docker.py/linux.py/local.py/windows.py` + базовый `ProviderModule`), конфиги — `backends/<type>.schema.json`, примеры — `backends/<type>.env.example`. Значения читаются из `data/env/services_<type>.env` (имена сохранены). API-имена провайдеров (`services_docker.*` и т.д.) сохранены ради совместимости кабинета и внешних вызовов. Контракт провайдера — пять API-методов (`services_info/service_status/service_action/discover/reload`), ядро вызывает их по имени.

Отдельных модулей `services_*` больше нет (релиз 1.0.0): при первом старте ядро само сносит их каталоги с бекапом в `data/backups/modules-legacy/` и помечает записи в modstate как missing — обновление приезжает обычной заменой файлов.

## Возможности

- `register {provider: str}` → регистрация провайдера (зовут services_* в своём setup)
- `hosts_for {svc_type}` → инстансы типа из hosts.json (валидированные; [] — fallback на .env)
- `hosts_all {}` → весь hosts.json — для кабинета
- `hosts_set {entries, actor = ""}` → перезаписать hosts.json (атомарно) + reload провайдеров
- `discover {host = "", actor = ""}` → опросить хосты, перезаписать кеш каталога
- `catalog {query, type_, host, checked, page, per_page}` → каталог из кеша: фильтры + пагинация
- `endpoint_add {name, svc_type, address, secret, via?, note?}` → создать точку outbound (ssh) с пробой подключения
- `endpoint_delete {name}` → удалить точку; ссылки инстансов сбрасываются (reload)
- `host_add {alias, svc_type, endpoint?, sudo_pass?}` → новый хост в hosts.json (local — без точки, services пустой)
- `providers {}` → провайдеры и их инстансы
- `list {}` → плоский список служб (имена + host/type)
- `status {}` → статусы всех служб (best-effort)
- `action {host: str, name: str, act: start|stop|restart}` → действие с маршрутизацией по host

## Права

- `service_manage` — управление службами (таблица статусов, старт/стоп/рестарт)
- `service_catalog` — каталог (hosts/точки/кеш), старт/стоп/рестарт не даёт

## Telegram

- Кнопка сервисов в меню (колбэки `service_*`, группировка по хостам); команд нет

## Web

- `GET /api/admin/services` — статусы служб всех хостов
- `POST /api/admin/service` — действие (`start|stop|restart`)
- `GET /api/admin/services_catalog` — каталог из кеша
- `POST /api/admin/services_discover` — обновить кеш (в фоне)
- `GET/POST /api/admin/services_hosts` — инстансы и чекбоксы
- `POST /api/admin/services_endpoint` — создать точку outbound
- `POST /api/admin/services_endpoint_delete` — удалить точку
- `POST /api/admin/services_host_add` — добавить хост

## Конфигурация (`config.schema.json`)

- обязательных и опциональных нет (настройки провайдеров — в их `.env`, см. ниже)

Манифест

{
  "name": "services",
  "version": "1.0.0",
  "category": "extra",
  "description": "Управление службами: Windows/Linux/Docker/локальные юниты, каталог, действия.",
  "requires": [],
  "rights": [],
  "api_methods": [],
  "web_routes": [],
  "commit": "8c15e4d68659850405ecb08860eebe6d3a4d2f45",
  "updated": "2026-10-07 10:00:57 +0300",
  "integrity": "sha256:5cc3fb456522190407a236dfad7ecc6988294008de299ed8df913166e27c28a2",
  "files": "[23 файлов — см. вкладки ниже]",
  "note": "",
  "wdesc": "",
  "wbody": "",
  "_extra": {
    "api": "",
    "events_emitted": "[]",
    "events_subscribed": "[]",
    "audit_allow": "",
    "shared_routes": "",
    "config_schema": "config.schema.json",
    "env_example": ".env.example"
  }
}

Файлы и исходники

Дерево файлов

  • · корень
    • 6.8 КБ
    • 0.0 КБ
    • 6.0 КБ
    • 34.2 КБ
    • 6.2 КБ
    • 0.8 КБ
    • 11.4 КБ
  • backends/
    • 0.6 КБ
    • 0.7 КБ
    • 3.0 КБ
    • 0.1 КБ
    • 0.7 КБ
    • 4.8 КБ
    • 0.1 КБ
    • 0.4 КБ
    • 3.7 КБ
    • 0.1 КБ
    • 11.6 КБ
    • 0.7 КБ
    • 7.2 КБ
    • 0.2 КБ
  • web/
    • 5.0 КБ
    • 14.2 КБ

Предпросмотр

Выберите файл в дереве выше — код откроется здесь.