modsafe v0.12.1 [base]


Менеджер модулей бота

README

# modsafe

Охрана модулей: аудит кода, хеши файлов, вкл/выкл, секреты, маркет.

Тип: Модуль. Категория: `base`. Зависимостей нет.
## Описание
Привратник модульного ядра. Решает, какому коду можно жить в боте, а какому — нет.

Сначала идёт аудит кода: сканер ищет опасные конструкции и раскладывает находки по серьёзности. Легитимные исключения явно перечисляются в манифесте модуля, а полный паспорт модуля (права, API, файлы, README) смотрится отдельной командой.

Дальше — учёт и включение. Новые модули появляются выключенными и включаются вручную, изменения применяются рестартом. Себя модуль выключить не даёт. Эталоны хешей фиксируют состояние «текущие файлы = доверенные»: любая подмена после этого видна как расхождение.

Секреты хранятся по модулям и никогда не показываются наружу — видны только имена ключей. Маркет сайта отдаёт живой список модулей: установка и обновление идут оттуда со сверкой целостности, при несовпадении установка отклоняется. Зависимости ставятся сами.

Обновления умеют делать бекап кода перед заменой, сохранять флаг включения и не трогать секреты: секреты правятся только через кабинет. Обновление ядра затрагивает только ядро — модули и данные не трогаются. Сам модуль обновляется только вручную, чтобы не отпилить сук, на котором сидит.
## Возможности
- `list` `{}` → все модули/транспорты со статусом (+requires со статусом, required_by, skipped с причинами)
- `log_errors` `{}` → ошибки/варнинги в журналах с момента запуска (по модулям)
- `audit_one` `{name}` → находки сканера по одному модулю
- `set_enabled` `{name, enabled}` → вкл/выкл (применится после рестарта; warnings — что сломается по зависимостям)
- `rescan` `{name?}` → обновить эталон хешей
- `stage` `{filename, content_type, body}` → принять архив в стейджинг + аудит
- `staged` `{}` → список стейджинга
- `install` `{name}` → установить из стейджинга (выключенным)
- `update_staged` `{name, force?}` → обновить установленный модуль архивом из стейджинга (бекап, swap, enabled сохранён; force — перезалить ту же версию; даунгрейд — с предупреждением)
- `market` `{}` → живой маркет сайта (+локальные версии, флаг update)
- `market_install` `{name}` → установить модуль с сайта (выключенным, +pip)
- `update_check` `{}` → [{name, installed, market}] для бейджа обновлений
- `update_module` `{name}` → обновить с сайта (бекап, rescan, enabled сохранён)
- `skeleton_check` `{}` → свежая версия скелета (tag, файлы)
- `update_skeleton` `{}` → обновить ядро с сайта (только скелет, бекап)
- `delete` `{name}` → удалить модуль (только выключенный)
- `pack` `{name, with_secrets}` → упаковать модуль в zip (b64; с env — в `_env/`)
- `env_keys` `{name}` → ключи секретов без значений
- `env_set` `{name, values}` → сохранить секреты
- `inspect` `{name}` → полный паспорт модуля/транспорта
- `orphans` `{}` → pip-пакеты без владельца (только показ)
- `uninstall_orphans` `{packages}` → удалить сирот (лимит 20)
## Права
- `modules_manage` — Управление модулями: вкл/выкл, аудит, эталон хешей
## Web
- `GET /api/modsafe/modules` — список модулей
- `POST /api/modsafe/enable` — вкл/выкл
- `POST /api/modsafe/rescan` — обновить эталоны
- `POST /api/modsafe/upload` — загрузка в стейджинг
- `GET /api/modsafe/staged` — список стейджинга
- `POST /api/modsafe/install` — установка (выключенным)
- `POST /api/modsafe/update_staged` — обновление из стейджинга {name, force?}
- `GET /api/modsafe/market` — маркет сайта (+локальные версии)
- `POST /api/modsafe/market_install` — установка с сайта {name}
- `GET /api/modsafe/updates` — сверка версий (бейдж обновлений)
- `POST /api/modsafe/update` — обновление модуля {name}
- `GET /api/modsafe/skeleton` — версия скелета на сайте
- `POST /api/modsafe/skeleton` — обновление скелета
- `POST /api/modsafe/delete` — удаление
- `GET /api/modsafe/pack` — упаковка в zip (`?secrets=1` — с env)
- `GET/POST /api/modsafe/env` — секреты модулей
- `GET /api/modsafe/inspect` — паспорт модуля
- `GET/POST /api/modsafe/orphans` — пакеты-сироты
- `GET /api/modsafe/log_errors` — ошибки/варнинги в журналах с момента запуска (по модулям)
- кабинет «Модули»: индикатор 🔴/🟡 ошибок в логах с момента запуска (клик — в syslog), колонка зависимостей (requires со статусом + кто зависит), зависимости модулей маркета, блок «⚠ Не загрузилось» с причинами загрузчика, confirm о зависимостях перед вкл/выкл
## Конфигурация (`config.schema.json`)
- обязательных нет; опциональные (дефолты):
  - `MODSAFE_MAX_UPLOAD_MB` = `5` — лимит архива, МБ
  - `MODSAFE_MARKET_URL` = `https://euk0r.ru` — маркет сайта

Манифест

{
  "name": "modsafe",
  "version": "0.12.1",
  "category": "base",
  "description": "Охрана модулей: аудит кода, хеши файлов, вкл/выкл (default-off для новых).",
  "requires": [],
  "rights": [],
  "api_methods": [],
  "web_routes": [],
  "commit": "ccd26ec6f219d5145145aa53a2d024005504ae38",
  "updated": "2026-10-27 17:46:53 +0300",
  "history": [
    {
      "version": "0.1.0",
      "date": "2026-09-10 12:02:52 +0300",
      "commit": "5b54618d7def86392c3871a6bf159af1918b5420"
    },
    {
      "version": "0.2.0",
      "date": "2026-09-11 10:17:26 +0300",
      "commit": "c86c8b6fe14b77d3a6c763be84f1c247a2caaa2a"
    },
    {
      "version": "0.3.0",
      "date": "2026-09-11 12:23:42 +0300",
      "commit": "89c49ab191a0218061fd25357309a0091e5fbf97"
    },
    {
      "version": "0.4.0",
      "date": "2026-09-11 15:07:17 +0300",
      "commit": "aae9303e4f13456e323dcc99891b51294859ea21"
    },
    {
      "version": "0.4.1",
      "date": "2026-09-12 23:22:16 +0300",
      "commit": "db9c47f797b3a96a29b646f86025a87d1eb4d645"
    },
    {
      "version": "0.5.0",
      "date": "2026-09-16 21:13:43 +0300",
      "commit": "a13385f31489c1a087e94657b758f3faabdb2c0e"
    },
    {
      "version": "0.6.0",
      "date": "2026-09-17 09:30:25 +0300",
      "commit": "47801cc7f98e5d02856f09e224f586aba5c5d256"
    },
    {
      "version": "0.7.0",
      "date": "2026-09-17 15:38:23 +0300",
      "commit": "9b2aca8f77b11e9a8fdc6dccc4abe96d728949b2"
    },
    {
      "version": "0.8.0",
      "date": "2026-09-17 16:37:53 +0300",
      "commit": "a175eef67a91fe36a6ef23cfcfa1a27a0dd48aa7"
    },
    {
      "version": "0.8.1",
      "date": "2026-09-17 16:44:11 +0300",
      "commit": "5880799d5bc2c2652d77c622a8b2d1f555884a82"
    },
    {
      "version": "0.8.2",
      "date": "2026-09-18 09:43:21 +0300",
      "commit": "cc0436870dbeaac3f0065e924cfde12322aae05c"
    },
    {
      "version": "0.8.3",
      "date": "2026-09-18 09:55:58 +0300",
      "commit": "af5e39ebe0e9a7e57cc12fdbb5c30cfe1779a3eb"
    },
    {
      "version": "0.8.4",
      "date": "2026-09-18 10:14:20 +0300",
      "commit": "6b95f0202b21031270ff7b1b0d4e45d6f41c5c2c"
    },
    {
      "version": "0.9.0",
      "date": "2026-09-21 17:56:41 +0300",
      "commit": "bf8125926601829a1ee527438f12a16e5ca4b006"
    },
    {
      "version": "0.10.0",
      "date": "2026-09-22 09:09:00 +0300",
      "commit": "12062f0487bc86256a1f9a37f1ef3f40396b65c2"
    },
    {
      "version": "0.11.0",
      "date": "2026-10-08 12:43:58 +0300",
      "commit": "8930762567a7584c72d7f50d1f3ac8918f1788cb"
    },
    {
      "version": "0.12.0",
      "date": "2026-10-14 19:17:33 +0300",
      "commit": "fb917bdb55f3a1af479af85c52cc41d706772b74"
    },
    {
      "version": "0.12.1",
      "date": "2026-10-27 17:29:16 +0300",
      "commit": "fb3cdb3ee4d8ab8ce51861917ebdf9bc811433ec"
    }
  ],
  "integrity": "sha256:0ee4e8ea2b4e7fd369487d453cf4e0902dcc5942ece080a690bee5e5ed76c4b4",
  "files": "[9 файлов — см. вкладки ниже]",
  "note": "Менеджер модулей бота",
  "wdesc": "",
  "wbody": "",
  "_extra": {
    "api": "",
    "events_emitted": "[]",
    "events_subscribed": "[]",
    "audit_allow": "",
    "config_schema": "config.schema.json",
    "env_example": ".env.example"
  }
}

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

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

  • · корень
    • 6.9 КБ
    • 0.1 КБ
    • 41.8 КБ
    • 7.6 КБ
    • 12.1 КБ
    • 60.6 КБ
    • 14.1 КБ
  • web/
    • 5.1 КБ
    • 49.7 КБ

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

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

История версий

versiondatecommit
0.12.12026-10-27fb3cdb3ee4d8
0.12.02026-10-14fb917bdb55f3
0.11.02026-10-088930762567a7
0.10.02026-09-2212062f0487bc
0.9.02026-09-21bf8125926601
0.8.42026-09-186b95f0202b21
0.8.32026-09-18af5e39ebe0e9
0.8.22026-09-18cc0436870dbe
0.8.12026-09-175880799d5bc2
0.8.02026-09-17a175eef67a91
0.7.02026-09-179b2aca8f77b1
0.6.02026-09-1747801cc7f98e
0.5.02026-09-16a13385f31489
0.4.12026-09-12db9c47f797b3
0.4.02026-09-11aae9303e4f13
0.3.02026-09-1189c49ab191a0
0.2.02026-09-11c86c8b6fe14b
0.1.02026-09-105b54618d7def