简体中文 English 繁體中文 日本語 Русский
本文为静态镜像,内容以交互版为准 在交互式文档中心打开 →

name: erispulse-config-cli description: "适用于:配置声明式 schema、排查配置问题、使用 epsdk 命令行与部署。覆盖场景:- После изменения параметров подключения необходимо перезапустить фреймворк; при мгновенном сбое создания пула автоматически будет повторная попытка с экспоненциальной задержкой。Когда нужно читать эту страницу: забыли параметры команды epsdk, хотите добавить управление компонентами в скрипт, или хотите контролировать поведение run / stop / restart. Для повседневного использования init / install / run достаточно знать одну команду: epsdk <команда> --help — всегда можно посмотреть описание параметров, не читая всю статью.。Когда нужно читать эту статью: если вам нужно выбрать способ установки (pip / uv / Docker / клиентское приложение ErisPulse-App) или если установка не удалась и требуется устранение неполадок. Если вы хотите просто быстро запустить, 5-минутный старт уже охватывает самый простой процесс, и эту статью можно пропустить.。когда бот должен длительно работать на постоянной основе — здесь всё о развёртывании в..."

ErisPulse 配置系统与 CLI 工具链

This skill is auto-built from the ErisPulse documentation. Repository: https://github.com/ErisPulse/ErisPulse Source paths are annotated per section; see docs/ in the repository for the latest content.

内容大纲

AI 按需读取:只读需要的章节即可,不必全文加载。

配置系统

来源: docs/ru/user-guide/configuration.md(https://github.com/ErisPulse/ErisPulse/blob/main/docs/ru/user-guide/configuration.md)

Описание конфигурационного файла

Note

Обязательно к прочтению для ядра L1 — одна из пяти ключевых статей в разделе "Путь к чтению" на главной странице, необходима для разработки модулей.

В этой статье описывается конфигурационный файл самого фреймворка config/config.toml: что управляет каждый раздел конфигурации, какие параметры поддерживают горячую перезагрузку, как использовать переменные окружения для переопределения значений. Для параметров сторонних модулей обратитесь к документации самого модуля.

ErisPulse использует конфигурационный файл в формате TOML config/config.toml для управления настройками проекта.

Путь к конфигурационному файлу

Конфигурационный файл находится в папке config/ в корне проекта:

project/
├── config/
│   └── config.toml
├── main.py

Предупреждение о нескольких экземплярах и файле блокировки

При запуске фреймворк создает файл блокировки config.lock в каталоге состояния проекта .erispulse/ и удерживает его до завершения процесса (используется для обнаружения нескольких экземпляров, использующих один каталог конфигурации; до версии 2.10 он находился в каталоге config/ под именем .erispulse_config.lock и будет автоматически удален при первом запуске после обновления). Если в логах появится предупреждение о том, что "конфигурационный файл, возможно, используется другой экземпляром ErisPulse", это означает, что два или более процессов ErisPulse записывают в один и тот же файл конфигурации (типичная сцена: несколько контейнеров монтируют один и тот же каталог config/ хост-машины) — одновременные записи будут перезаписывать друг друга, поэтому каждому экземпляру следует использовать отдельный каталог конфигурации.

Чувствительная конфигурация не попадает в репозиторий

Конфигурационный файл содержит токены (token / API key) и другие конфиденциальные данные: при инициализации фреймворка и epsdk init автоматически создается файл .gitignore в каталоге config/ (содержит только одну строку * — все файлы в каталоге не попадают в репозиторий, исключая сам файл .gitignore); если .gitignore уже существует, он не будет перезаписан. Каталог состояния .erispulse/ (файл блокировки экземпляра, файл состояния CLI) также относится к локальному состоянию машины, и шаблон проекта .gitignore уже по умолчанию игнорирует его.

Обработка ошибок при загрузке конфигурации

Фреймворк различает три состояния ошибок при загрузке config.toml и предоставляет действенные диагностические сообщения, а не просто тихо возвращается к конфигурации по умолчанию:

Состояние ошибки Условие срабатывания Поведение фреймворка
Файл отсутствует config.toml не существует Нормальный запуск, тихо используется пустая конфигурация (не выдает предупреждение)
Ошибка синтаксиса TOML Файл существует, но формат некорректен (например, отсутствуют кавычки, не закрыты скобки) Выводит номер строки/столбца и причину ошибки, и сохраняет предыдущую действительную конфигурацию и продолжает работу (изменения в файле не вступают в силу)
Ошибка доступа/другие ошибки Нет прав на чтение, ошибки ввода-вывода и т.д. Выводит ясную причину, и сохраняет предыдущую действительную конфигурацию и продолжает работу

Важно: "Предыдущая действительная конфигурация" ≠ "Конфигурация по умолчанию": при повреждении файла фреймворк использует последнюю успешно проанализированную конфигурацию перед этим запуском (если поврежденный файл изменен во время работы, используется старое значение), а не сбрасывает все параметры на заводские значения. При устранении неисправностей не предполагайте, что "конфигурация была сброшена".

Например, если вы случайно напишете port = 8000 (без кавычек строки), в логах появится примерно такое:

[ERROR] [Config] Синтаксическая ошибка в конфигурационном файле config/config.toml (строка 3, столбец 1): ...
[WARNING] [Config] Не удалось прочитать конфигурационный файл. Продолжение работы с предыдущей действительной конфигурацией, изменения в файле не вступили в силу — пожалуйста, исправьте файл и перезагрузите или перезапустите

Таким образом, вы можете сразу найти проблему на уровне логирования INFO, а не задаваться вопросом "почему мои изменения в конфигурации не вступили в силу".

Что делать, если испортить конфигурационный файл во время работы? Если вы вручную отредактируете config.toml во время работы робота и внесете синтаксическую ошибку, фреймворк при следующей записи (объединении конфигурации) выведет сообщение "Конфигурационный файл поврежден (ошибка синтаксиса, строка X), невозможно записать — пожалуйста, сначала исправьте конфигурационный файл и перезапустите", а не запутанное "ошибка записи". Изменения, которые должны быть записаны, сохраняются, и они не теряются.

Сохранение комментариев и минимизация записи на диск

Комментарии и порядок ключей в config.toml сохраняются полностью при записи фреймворком: независимо от того, используется ли setConfig(), сохранение с помощью CLI-конфигуратора или генерация шаблона конфигурации адаптером/модулем, фреймворк изменяет только соответствующие ключи, и ваши комментарии, а также порядок, не будут стерты или пересортированы (используется без потерь TOML-движок tomlclass, не трогает неизмененные части, сохраняет байты без изменений, стиль завершения строк CRLF/LF также не изменяется).

Фреймворк сдерживает записываемые данные:

Переменные окружения для переопределения

Фреймворк поддерживает переопределение конфигурационных параметров ErisPulse.* с помощью переменных окружения (подходит для Docker / контейнеризации / CI-развертывания, без необходимости изменять config.toml).

Правило именования: замените точечный путь ErisPulse.<section>.<key> на все заглавные буквы, замените . на _ и добавьте префикс ERISPULSE_:

Параметр конфигурации Переменная окружения Пример значения
ErisPulse.server.port ERISPULSE_SERVER_PORT 9000
ErisPulse.server.host ERISPULSE_SERVER_HOST 0.0.0.0
ErisPulse.logger.level ERISPULSE_LOGGER_LEVEL DEBUG
ErisPulse.framework.strict_mode ERISPULSE_FRAMEWORK_STRICT_MODE 2

Описание поведения:

# Пример развертывания с Docker: без изменения config.toml, напрямую переопределяем порт
ERISPULSE_SERVER_PORT=9000 docker compose up -d

Примечание: ErisPulse.server.port и другие конфигурационные параметры фреймворка, получаемые через get_server_config() и другие API, подвержены влиянию переменных окружения.

Связывание переменных окружения с конфигурацией модуля (с версии 2.9.0+)

Сама конфигурация модуля (на основе ConfigClass) поддерживает привязку переменных окружения на уровне полей — в field(metadata=...) объявите env:

@dataclass
class MyConfig(BaseConfig):
    api_key: str = field(default="", metadata={
        "description": "API-ключ",
        "env": "MYMODULE_API_KEY",   # привязка переменной окружения
    })
    retries: int = field(default=3, metadata={"env": "MYMODULE_RETRIES"})

Описание поведения:

# Пример развертывания с Docker: без изменения config.toml, напрямую вставляем API-ключ модуля
MYMODULE_API_KEY=sk-xxx docker compose up -d

Как выбрать между конфигурационным классом и полем модели? Конфигурационный класс управляет "как работает модуль" (параметры поведения, горячая перезагрузка), ORM Field() управляет "какие данные были созданы пользователем" (таблицы базы данных, запросы). Оба используют одну и ту же систему ограничений и движок проверки; таблица сопоставления см. в Слое модели данных · Когда использовать какой тип объявления.

Горячая перезагрузка конфигурации

Начиная с версии 2.7.0, фреймворк системно поддерживает горячую перезагрузку конфигурации. После внешнего изменения config.toml (фоновый монитор каждые 5 секунд обнаруживает изменения) или вызова setConfig() из кода, компоненты автоматически реагируют:

Компонент Поддерживаемые параметры конфигурации Поведение
Logger logger.level / log_files / log_dir (включая параметры сегментации) / memory_limit / format / exclude_levels Автоматически переприменяются (с обнаружением изменений)
CommandHandler event.command.prefix / case_sensitive / allow_space_prefix / must_at_bot Действуют с первой следующей командой
Адаптеры framework.handler_max_concurrency Сигнал обнуления кэша, перестроение по новому значению
Активный GC framework.proactive_gc_* Конфигурация изменяется, задача GC перезапускается, поддержка изменения/отключения/переактивации во время выполнения
Master master.users Каждый вызов is_master() проверяет в реальном времени, перезапуск не требуется
Модули/Адаптеры Собственные параметры конфигурации Вызывается on_config_update(old, new)

Параметры, требующие перезапуска (небезопасно переключать во время выполнения, при изменении выводится предупреждение "Требуется перезапуск процесса для вступления в силу"):

Параметр Причина
router.cors.* / router.security.* Промежуточные слои записываются в FastAPI при запуске сервиса, безопасное переключение во время выполнения невозможно
storage.use_global_db SQLite-дескриптор файла открыт во время выполнения, безопасное переключение пути невозможно

Что делать, если редактирование и сохранение файла завершилось ошибкой? Если при редактировании config.toml возникнет временный синтаксический сбой, фреймворк сохранит предыдущую действительную конфигурацию и выведет диагностическое сообщение, не будет рассылать пустую конфигурацию компонентам (чтобы избежать ошибочного возврата on_config_update к значениям по умолчанию).

Внутреннее разбиение цепочки горячей перезагрузки

"Как компоненты узнают, что конфигурация изменилась?" — за этим стоит цепочка обнаружения → перезагрузки → рассылки:

flowchart TD
    A["Внешнее редактирование config.toml"] --> B{"Кто первым обнаружит?"}
    B -->|"Фоновый поток-монитор<br/>каждые 5 секунд опрашивает mtime"| C["_check_file_change определяет изменение"]
    B -->|"При чтении конфигурации<br/>кэш старше 60 секунд"| C
    C --> D["_load_config перезагружает TOML"]
    D --> E{"Успешно?"}
    E -->|"Нет (синтаксическая ошибка)"| F["Сохраняет предыдущую действительную конфигурацию<br/>не рассылает, выводит диагностическое сообщение"]
    E -->|"Да"| G["lifecycle.emit config.updated<br/>передает old_config / new_config"]
    G --> H["Реагируют подписчики компонентов<br/>(logger / scope / command / GC ...)"]

Две линии обнаружения (достаточно одной, обе обеспечивают резервирование):

Путь Механизм Время срабатывания
Фоновый монитор демон-поток config-watcher каждые 5 секунд wait опрашивает mtime файла максимум через 5 секунд после внешнего изменения файла
Ленивое обнаружение при любом getConfig() чтении, если кэш старше 60 секунд, сначала проверяет файл при следующем чтении конфигурации

Фреймворк не повредит сам себя: setConfig() при записи файла сохраняет "время последнего изменения, вызванного самим фреймворком", монитор при сравнении исключает его, и только внешние изменения считаются изменением.

Два типа событий изменения конфигурации:

Событие Инициатор Данные Типичный сценарий
config.set код / Dashboard вызывает setConfig() {key, old_value, new_value} одиночное изменение (генерация шаблона, запись состояния, изменение конфигурации во время выполнения)
config.updated внешнее изменение после обнаружения монитором/ленивым обнаружением {old_config, new_config, config_file} ручное редактирование config.toml

setConfig() по умолчанию задерживает запись на диск на 5 секунд (объединяет несколько записей), immediate=True записывает немедленно. Монитор обнаруживает внешнее изменение и обновляет только кэш в памяти, не записывает изменения обратно в файл.

Список автоматических реакций (обычно оба события подписаны, реакция одинаковая):

Компонент Подписка Реакция
Logger config.set + config.updated уровень/файлы/директория сегментации/память/формат/уровни исключения переприменяются (с обнаружением изменений, без изменений не изменяются)
Scope config.updated перестраивается кэш привязки области
Командная система config.updated параметры префикса/регистра/пробел/must_at_bot перезагружаются, действие срабатывает с первой следующей командой
Адаптеры config.set + config.updated handler_max_concurrency сбрасывает и перестраивает семафор
Активный GC config.set + config.updated proactive_gc_* немедленно перезапускает фоновую задачу GC
Адаптеры маршрутизация в on_config_update обратный вызов on_config_update(old, new) для каждого адаптера
Модули маршрутизация в on_config_update обратный вызов on_config_update(old, new) для каждого модуля
Хранилище config.updated изменение use_global_db только предупреждение (требуется перезапуск)
Роутер config.updated изменение cors.* / security.* только предупреждение (требуется перезапуск)

API чтения и удаления конфигурации

getAllConfig: полный снимок конфигурации

Вместо прямого чтения приватного _cache (внешнее чтение приватных свойств не защищено обратной совместимостью):

config = sdk.config.getAllConfig()     # глубокая копия снимка, изменение in-place не влияет на состояние фреймворка
config["ErisPulse"]["server"]["port"]

Вид отчета соответствует getConfig: изменения setConfig() / delete отражены, строго соответствует содержимому файла после задержки записи.

delConfig: удаление ключа конфигурации

setConfig(key, None) просто устанавливает значение в пустое, ключ остается в файле; delConfig удаляет ключ из файла:

sdk.config.delConfig("ErisPulse.modules.status.OldModule")            # задержанная запись
sdk.config.delConfig("OneBot.deprecated_key", immediate=True)         # немедленная запись

Полный пример конфигурации

[ErisPulse.server]
host = "0.0.0.0"
port = 8000
auto_start = true
ssl_certfile = ""
ssl_keyfile = ""

[ErisPulse.master]
# users поддерживает два формата (выберите один):
#   глобальный владелец (действует на всех платформах): users = ["123456", "789012"]
#   владелец по платформе: users = { yunhu = ["123456"], telegram = ["789012"] }
users = {}

[ErisPulse.logger]
level = "INFO"
format = "rich"
log_files = []
log_dir = ""
log_rotation = "size"
log_max_size_mb = 10
log_backup_count = 5
log_rotation_when = "midnight"
memory_limit = 1000
exclude_levels = []

[ErisPulse.framework]
enable_lazy_loading = true
uninit_timeout = 30
strict_mode = 0

[ErisPulse.framework.strict_mode_exceptions]
modules = []
adapters = []

[ErisPulse.storage]
backend = "sqlite"
use_global_db = false

[ErisPulse.event.command]
prefix = "/"
case_sensitive = true
allow_space_prefix = false
must_at_bot = false

[ErisPulse.event.message]
ignore_self = true

[ErisPulse.i18n]
language = "auto"

Конфигурация сервера

[ErisPulse.server]
host = "0.0.0.0"
port = 8000
auto_start = true
ssl_certfile = "/path/to/cert.pem"
ssl_keyfile = "/path/to/key.pem"
# В сценариях контейнеризации / отсутствия монтирования файлов можно встроить PEM-контент (имеет приоритет над путями certfile/keyfile)
# ssl_cert = """-----BEGIN CERTIFICATE-----
# ...
# -----END CERTIFICATE-----"""
# ssl_key = """-----BEGIN PRIVATE KEY-----
# ...
# -----END PRIVATE KEY-----"""
Параметр Тип Значение по умолчанию Описание
host string 0.0.0.0 Адрес прослушивания, 0.0.0.0 означает все интерфейсы
port integer 8000 Номер порта прослушивания
auto_start boolean true Автоматически запускать сервер маршрутизации при sdk.init()? Установите false, чтобы пропустить запуск сервера маршрутизации (сценарии без WebUI)
ssl_certfile string пустая строка Путь к файлу SSL-сертификата
ssl_keyfile string пустая строка Путь к файлу SSL-приватного ключа
ssl_cert string пустая строка Встроенный PEM-контент сертификата (не путь). Вместе с ssl_key имеет приоритет над ssl_certfile/ssl_keyfile путями; фреймворк временно сохраняет SSL-контекст, затем удаляет временный файл
ssl_key string пустая строка Встроенный PEM-контент приватного ключа (не путь), семантика аналогична выше

Занятость порта не является фатальной ошибкой: при запуске, если обнаруживается, что port уже занят, фреймворк пропускает запуск сервера маршрутизации и выводит предупреждение, адаптеры и модули продолжают работать (только HTTP/WS/SSE маршруты и WebUI недоступны). При диагностике "робот работает, но WebUI не открывается" сначала проверьте порт.

Конфигурация системы владельца

Система владельца используется для определения "владельца" аккаунта (например, администратора бота). master.users поддерживает два формата:

[ErisPulse.master]
# Формат 1: глобальный владелец (действует на всех платформах)
users = ["123456", "789012"]

# Формат 2: владелец по платформе (dict)
# users = { yunhu = ["123456"], telegram = ["789012"] }
Параметр Тип Значение по умолчанию Описание
users array / object пустой Список владельцев. Формат list — глобальные владельцы (действуют на всех платформах); формат dict — владельцы по платформе (ключ — имя платформы, значение — список владельцев на этой платформе)

В коде проверка осуществляется через master.is_master(event) или master.is_master(platform, user_id), каждый вызов читает конфигурацию в реальном времени (поддержка горячей перезагрузки, перезапуск не требуется):

from ErisPulse.Core import master

if master.is_master(event):
    await event.reply("Привет, хозяин")

Цепочка проверки и изменение во время выполнения

Цепочка проверки владельца: конфигурация владельца → запись во время выполнения → провайдер цепочки:

from ErisPulse.Core import master

master.is_master(event)                      # проверка по событию
master.is_master("yunhu", "123")             # явная проверка
master.add("yunhu", "123")                   # добавление во время выполнения (по умолчанию сохраняется; persist=False только в памяти)
master.remove("yunhu", "123")                # удаление (по умолчанию сохраняется)
master.list()                                # объединение: {"global": [...], "<platform>": [...]}

Пользовательские источники идентификации (провайдеры)

Помимо конфигурации, можно зарегистрировать пользовательские источники идентификации: fn(platform, user_id) -> bool, встроенные источники идентификации (конфигурация + запись во время выполнения) не срабатывают, последовательно проверяются, если один провайдер разрешает, то считается владельцем. Подходит для подключения администраторских интерфейсов адаптеров, ролей базы данных и других внешних систем идентификации.

Регистрация через master.provider поддерживает декораторные / функциональные способы, удаление происходит через зарегистрированную функцию с помощью fn.unregister():

from ErisPulse.Core import master

# Способ 1: декоратор (рекомендуется, постоянный источник идентификации)
@master.provider
def admin_provider(platform, user_id):
    return user_id in {"999"}     # пользовательская логика проверки

master.is_master("yunhu", "999")   # True
admin_provider.unregister()        # отменить регистрацию, когда больше не нужно

# Способ 2: функциональный (регистрация в модуле / отмена в unload)
fn = master.provider(admin_provider)
fn.unregister()

Исключения провайдера перехватываются и пропускаются, не блокируют цепочку проверки идентификации. Привязка метода экземпляра не может быть связана с unregister, при необходимости парной регистрации/удаления используйте модульные функции.

Приоритет пользователя: область действия владельца определяется пользователем

Параметр master=True является по умолчанию для разработчика: пользователь может перезаписать или расширить его в ErisPulse.event.overrides.command.<module>.<cmd>.master = true/false (см. [Единая конфигурация перезаписи событий (event.overrides)], где явная конфигурация пользователя имеет приоритет).

Конфигурация журналирования

[ErisPulse.logger]
level = "INFO"
log_files = []                # Явный список файлов журнала (взаимоисключающе с log_dir, имеет более высокий приоритет)
log_dir = ""                  # Каталог журналов (после установки включается автоматическая ротация по сегментам)
log_rotation = "size"         # Способ ротации: "size" / "date" / "none"
log_max_size_mb = 10          # Максимальный размер одного файла в режиме size (МБ)
log_backup_count = 5          # Количество хранимых файлов истории журнала
log_rotation_when = "midnight"  # Период ротации в режиме date: S/M/H/D/midnight
memory_limit = 1000             # Лимит записей журнала в памяти для одного модуля (0 = отключение копии журнала в памяти)
total_memory_limit = 5000       # Общий лимит записей журнала в памяти для всех модулей (0 = без ограничений)
exclude_levels = ["EVENT"]
Параметр Тип По умолчанию Описание
level string INFO Уровень журналирования: TRACE, DEBUG, INFO, WARNING, ERROR, CRITICAL (TRACE — самый низкий уровень, выводит подробную отладочную информацию о внутренних процессах фреймворка)
format string rich Формат вывода журнала: rich (цветной, по умолчанию), plain (простой текст без цвета, подходит для сбора журналов/перенаправления в пайпы), json (структурированный JSON, подходит для ELK и т. п.)
log_files array пусто Список файлов вывода журнала (явные пути, без ротации)
log_dir string пусто Каталог вывода журнала (создаётся автоматически). После установки записи пишутся в файл erispulse.log в каталоге и автоматически ротируются согласно log_rotation; взаимоисключающе с log_files, приоритет у log_files
log_rotation string size Способ ротации: size (по размеру) / date (по времени) / none (без ротации)
log_max_size_mb float 10 Максимальный размер одного файла в режиме size (МБ); после превышения выполняется ротация в резервные копии .1/.2
log_backup_count integer 5 Количество хранимых файлов истории журнала; самые старые резервные копии сверх лимита удаляются автоматически
log_rotation_when string midnight Период ротации в режиме date: S/M/H/D/midnight (по умолчанию ежедневно в полночь)
memory_limit integer 1000 Количество записей журнала, хранимых в памяти для одного модуля; 0 отключает копию журнала в памяти (запись в память прекращается, уже существующие записи сохраняются)
total_memory_limit integer 5000 Общий лимит записей журнала в памяти для всех модулей; 0 означает без ограничений. При превышении лимита самые старые записи удаляются согласно политике ротации (в первую очередь сокращаются очереди модулей с наибольшим количеством записей); действует независимо от memory_limit отдельного модуля
exclude_levels array пусто Блокировка указанных уровней журналирования. Журналы заблокированных уровней полностью отбрасываются (не записываются в память, не отправляются подписчикам, таким как Dashboard, не выводятся на печать, не записываются в файлы). Поддерживается горячее обновление

Также можно динамически переключать настройки в коде:

from ErisPulse.Core import logger

# Ротация по размеру: 10 МБ на файл, хранить 5 копий
logger.set_output_dir("logs", rotation="size", max_size_mb=10, backup_count=5)

# Ротация по времени: ежедневно в полночь, хранить 7 копий
logger.set_output_dir("logs", rotation="date", backup_count=7)

Note

log_dir и связанные с ротацией настройки требуют ErisPulse 2.8.0+.

Защита конфиденциальности: содержимое отправляемых и получаемых сообщений записывается с уровнем EVENT (числовое значение 21). Установив exclude_levels = ["EVENT"], вы сделаете содержимое сообщений в группах и личных чатах недоступным для просмотра в бэкенде (например, на панели журналов Dashboard), не затрагивая журналы других уровней.

Note

Функция exclude_levels требует ErisPulse 2.8.0+.

Конфигурация фреймворка

[ErisPulse.framework]
enable_lazy_loading = true
uninit_timeout = 30
strict_mode = 0

[ErisPulse.framework.strict_mode_exceptions]
modules = []
adapters = []
Параметр Тип По умолчанию Описание
enable_lazy_loading boolean true Включать ли ленивую загрузку модулей
uninit_timeout integer 30 Общий таймаут корректного завершения работы (в секундах), по истечении — принудительное завершение. 0 означает отсутствие таймаута
strict_mode integer 0 Уровень строгого режима, см. описание «Строгий режим» ниже
handler_max_concurrency integer 64 Максимальное количество параллельных задач (Task) обработчиков событий; большее значение повышает пропускную способность, но увеличивает потребление памяти
handler_queue_max_pending integer 4096 Backpressure очереди при всплесках событий: лимит количества ожидающих задач (Task) обработчиков на одну платформу; при превышении задачи обработчиков новых событий отбрасываются с записью WARNING (счётчик отброшенных можно посмотреть в диагностике troubleshoot); 0 означает без ограничений
offline_bot_expiry integer 3600 Время автоматического устаревания записей офлайн-ботов (в секундах), 0 означает без истечения срока
plugins_dir string / list "plugins" Папка локальных плагинов (относительно корня проекта); добавление/удаление/изменение файлов плагинов автоматически обнаруживается hot-reload watcher'ом
watch_ignore_dirs list встроенный список Имена каталогов, игнорируемых мониторингом файлов hot-reload (.venv/.git/__pycache__ и т.д.); непустой список полностью заменяет встроенный, [] означает не игнорировать никакие каталоги
watch_include_plugin_dirs boolean true Передаёт ли epsdk run --reload каталоги плагинов для точечной обработки hot-reload watcher'ом плагинов (перезагрузка отдельных модулей), исключая их из полного мониторинга

Конфигурация проактивного GC

После инициализации SDK запускается фоновая задача проактивного GC, которая периодически выполняет сборку мусора Python и освобождение внутренних ресурсов (очистка офлайн-ботов и т.д.). Все параметры поддерживают горячее обновление; при изменении задача немедленно перезапускается.

Параметр Тип По умолчанию Описание
proactive_gc_interval number 300 Интервал сборки (в секундах), поддерживает дробные значения. 0 отключает проактивный GC
proactive_gc_generation integer 0 Поколение для сборки в обычных циклах (0/1/2, ограничивается диапазоном 0..2). Обратите внимание, что gc.collect(2) эквивалентен полной сборке; значение по умолчанию 0 сохраняет лёгкость; глубокая сборка периодически запускается параметром proactive_gc_full_every
proactive_gc_full_every integer 20 Полная сборка каждые N циклов, 0 отключает периодическую полную сборку. Полная сборка ограничивается порогом proactive_gc_memory_growth_mb
proactive_gc_memory_growth_mb integer 32 Порог прироста памяти для полной сборки (МБ): сравнивается с базовой линией памяти после последней полной сборки (приоритетно tracemalloc, затем RSS); полная сборка выполняется только когда прирост достигает этого значения. 0 означает отсутствие порога
proactive_gc_idle_only boolean false При включении во время всплесков событий (когда есть незавершённые pending handler) Python GC пропускается в этом цикле, чтобы избежать пауз и конкуренции с обработкой сообщений; освобождение внутренних ресурсов не затрагивается
proactive_gc_gen0_min integer 500 Минимальное количество мусора gen0 для запуска сборки в обычных циклах: если gc.get_count()[0] ниже этого значения, цикл пропускается (простаивающие циклы практически без затрат). 0 означает сборку всегда

Изменение 2.7.1: значение по умолчанию proactive_gc_generation изменено с 2 на 0, значение по умолчанию proactive_gc_full_every — с 0 на 20. Ранее generation=2 означало выполнение самой тяжёлой полной сборки в каждом цикле; новые значения по умолчанию при сохранении охвата сборки значительно снижают накладные расходы на простаивающие циклы. Явно заданные старые значения продолжают действовать согласно буквальной семантике.

Строгий режим

Строгий режим определяет политику обработки несоответствий или сбоев модулей/адаптеров на этапе загрузки. Современные модули/адаптеры должны наследовать соответствующие базовые классы (BaseModule/BaseAdapter); компоненты, не наследующие базовые классы, влияют на контекстную систему фреймворка и резервную очистку, что может привести к утечкам ресурсов.

Изменение 2.5.2: уровень по умолчанию изменён с 1 (пропуск) на 0 (мягкий), чтобы уменьшить количество проблем загрузки, с которыми сталкиваются новые пользователи при первом использовании. Компоненты, не наследующие базовые классы, будут загружаться с предупреждением WARNING, а не отклоняться напрямую. Для восстановления прежнего поведения явно установите strict_mode = 1.

Уровень Название Поведение
0 Мягкий (по умолчанию) Нарушения вызывают только предупреждения; компоненты, не наследующие базовые классы, всё равно будут загружаться (совместимость со старыми компонентами)
1 Строгий-пропуск Отклонение и пропуск компонентов, не наследующих базовые классы; остальное запускается нормально
2 Строгий-фатальный Сбор всех нарушений с единым отчётом и прерывание всего запуска

На всех уровнях сбои самих компонентов, такие как «ошибки на этапах загрузки/регистрации/инициализации», всегда пропускаются; разница между уровнями в следующем:

Список исключений

Если некоторые компоненты действительно временно невозможно перенести (например, зависящие от них старые модули), их можно добавить в список исключений; перечисленные компоненты даже при несоответствии будут обрабатываться по мягкому режиму и продолжат загружаться:

[ErisPulse.framework.strict_mode_exceptions]
modules = ["SeTu", "SomeLegacyModule"]
adapters = ["OldAdapter"]

Когда компонент отклоняется строгим режимом, в журнале будет явно указано, как восстановить его загрузку (добавить в список исключений или понизить уровень).

Взаимодействие с CLI

Предзапускная самопроверка epsdk run (разбираемость файла конфигурации, полнота обязательной конфигурации компонентов) по умолчанию следует этой конфигурации: при ненулевом значении неудача проверки приводит к отказу в запуске, при 0 — только предупреждение и продолжение работы. Также можно временно переключиться без изменения конфигурации: epsdk run --strict включает самопроверку и строгий уровень одновременно для текущего запуска (уровень может только повышаться, передаётся в запускаемый процесс через переменную окружения ERISPULSE_FRAMEWORK_STRICT_MODE), --no-strict временно понижает до мягкого режима с выдачей только предупреждений для текущего запуска.

Конфигурация хранилища

Начиная с версии 2.8.0, движок хранилища поддерживает три асинхронных бэкенда, API полностью одинаковы, конфигурация переключается одним кликом:

Бэкенд Драйвер Установка Особенности
SQLite (по умолчанию) aiosqlite В комплекте Нулевая конфигурация, одиночный файл, WAL-параллелизм
MySQL / MariaDB aiomysql pip install ErisPulse[mysql] Существующая инфраструктура MySQL, многократное использование
PostgreSQL asyncpg pip install ErisPulse[postgres] Сильная транзакционность, высокая параллельность
[ErisPulse.storage]
backend = "sqlite"        # "sqlite" (по умолчанию) / "mysql" / "postgres"
use_global_db = false     # Только SQLite: использовать глобальную базу данных в пакете data/config.db

[ErisPulse.storage.mysql]      # backend = "mysql" при активации
host = "127.0.0.1"
port = 3306
user = "erispulse"
password = ""
database = "erispulse"
# charset = "utf8mb4"
# pool_min = 1
# pool_max = 10

[ErisPulse.storage.postgres]   # backend = "postgres" при активации
host = "127.0.0.1"
port = 5432
user = "erispulse"
password = ""
database = "erispulse"
# pool_min = 1
# pool_max = 10
Параметр Тип Значение по умолчанию Описание
backend string sqlite Бэкенд хранилища: sqlite / mysql / postgres, переключение без изменений кода
use_global_db boolean false Только SQLite: использовать глобальную базу данных, а не проектную базу данных
storage.mysql.* table см. выше Параметры подключения MySQL (host / port / user / password / database / charset / pool)
storage.postgres.* table см. выше Параметры подключения PostgreSQL (host / port / user / password / database / pool)

Также поддерживаются переменные окружения (Docker / 12-factor): ErisPulse.storage.postgres.host → ERISPULSE_STORAGE_POSTGRES_HOST.

Tip

  • После изменения параметров подключения необходимо перезапустить фреймворк; при мгновенном сбое создания пула автоматически будет повторная попытка с экспоненциальной задержкой
  • Перед переключением бэкенда можно использовать скрипт проверки: python tests/devs/test_storage_backend_verify.py --backend mysql
  • Детальные объяснения транзакций, диалектов, пользовательских бэкендов см. в Хранилищные бэкенды

Конфигурация событий

Конфигурация команд

[ErisPulse.event.command]
prefix = "/"
case_sensitive = true
allow_space_prefix = false
Параметр Тип Значение по умолчанию Описание
prefix string / Префикс команды
case_sensitive boolean true Регистр чувствителен (разные команды: /Help и /help)
allow_space_prefix boolean false Пространство допускается в качестве префикса
must_at_bot boolean false Команда должна быть вызвана с упоминанием бота (в личных сообщениях не ограничено)

Конфигурация сообщений

[ErisPulse.event.message]
ignore_self = true
Параметр Тип Значение по умолчанию Описание
ignore_self boolean true Игнорировать собственные сообщения бота

Конфигурация входящего ящика сессии (transcript)

[ErisPulse.transcript]
enabled = true
max_per_session = 50
ttl_hours = 168.0
self_echo = "bot"
Параметр Тип Значение по умолчанию Описание
enabled boolean true Записывать ли автоматически входящие/исходящие сообщения (после отключения запись прекращается, история остаётся доступной для запросов)
max_per_session int 50 Количество хранимых записей на одну сессию (0 = отключить обрезку для этой сессии)
ttl_hours float 168.0 Глобальный срок хранения (в часах, 0 = никогда не очищать)
self_echo string bot Обработка входящего эхо-сообщения бота (self.user_id == user_id, например OneBot report-self-message): bot = записывать как bot и помечать meta.self_echo; skip = не записывать; user = записывать как user (прежнее поведение)

О рисках и аудите политики хранения см. Входящий ящик сессии; поля атрибуции (sender / meta) и принадлежность исходящих сообщений (meta.module) также описаны в этом документе.

Конфигурация локализации

[ErisPulse.i18n]
language = "auto"
Параметр Тип Значение по умолчанию Описание
language string auto Язык отображения встроенных текстов фреймворка. Установите auto для автоматического определения системного языка, или укажите конкретный код: zh-CN, zh-TW, en, ja, ru

Конфигурация модуля

Каждый модуль может определить свою конфигурацию в конфигурационном файле:

[MyModule]
api_url = "https://api.example.com"
timeout = 30
enabled = true

В модуле читать и записывать конфигурацию:

from ErisPulse import sdk

# Чтение конфигурации
config = sdk.config.getConfig("MyModule", {})
api_url = config.get("api_url", "https://default.api.com")

# Запись конфигурации во время выполнения (отложенная запись)
sdk.config.setConfig("MyModule.timeout", 60)

# Немедленная запись в файл
sdk.config.setConfig("MyModule.timeout", 60, immediate=True)

setConfig по умолчанию использует отложенную запись (примерно каждые 5 секунд массовая запись в файл), установка immediate=True немедленно сохраняет. Изменения конфигурации запускают событие жизненного цикла config.set.

Конфигурация области (scope)

Note

Эта функция требует ErisPulse 2.8.0+.

Область определяет "в каком диапазоне действует" — какие модули доступны в какой платформе / боте / сессии (① уровень модуля), какие события принимаются для какой пользовательской / групповой / бот / адаптерной идентичности (② уровень идентичности), какие исходящие вызовы может выполнять модуль (③ уровень исходящих вызовов):

[ErisPulse.scope]
default_allow = true        # Глобальный фолбэк (false = явный отказ в строгом режиме; не влияет на исходящий уровень)
cache_size = 1024           # Размер LRU-кэша

# ① Уровень модуля (приоритет: сессия > бот > платформа; записи поддерживают точные / glob / re: регулярные выражения)
[ErisPulse.scope.platforms.onebot11]
modules = ["Chat", "Tool*"]
blocked = ["re:^Danger"]

# Подуровень привязки с merge = true объединяет с низшим уровнем по каждому элементу (по умолчанию общее перезаписывание)
[ErisPulse.scope.bots.onebot11."123456"]
modules = ["Music"]
merge = true

# ② Уровень идентичности (приоритет: пользователь > сессия > бот > адаптер; на каждом уровне записываются только allow или deny)
[ErisPulse.scope.identity.adapters.onebot11]
deny = true                 # Все события этой платформы отбрасываются на входе
[ErisPulse.scope.identity.users.onebot11]
allow = ["u_admin"]         # Поддержка glob / re: регулярных выражений
deny = ["u_bad", "spam_*"]

# ③ Уровень исходящих действий (по умолчанию разрешено все; правила встроенная таблица, записи поддерживают точные / glob / re: регулярные выражения)
[ErisPulse.scope.actions.MyModule]
send = { deny = true }                    # Полный запрет отправки
api = { allow = ["get_*"] }               # Только разрешенные стандартные API запросов
request = { deny = true }                 # Запрет обработки запросов
Параметр Тип Описание
scope.default_allow boolean Глобальный фолбэк: разрешение/отказ для модулей/идентичностей, не попавших в правила (true)
scope.cache_size integer Размер LRU-кэша (по умолчанию 1024)
scope.platforms / bots / sessions table ① Трехуровневая привязка модуля: {modules=[...], blocked=[...], merge=bool?}
scope.identity.adapters / bots / sessions / users table ② Четырехуровневая привязка идентичности: {allow=true} / {deny=true}
scope.actions.<module>.<action> table ③ Правила исходящих действий: `{allow=[...], deny=true

Подробности и API времени выполнения (модульные sdk.scope.set_module() / set_identity() / set_action(), проверка is_allowed() / is_identity_allowed() / is_action_allowed(), а также словарный фолбэк get() / set() / delete()) см. в Область (scope).

Единая конфигурация перезаписи событий (event.overrides)

Система перезаписи событий: по типу события перезаписывает поведение любого модуля, не изменяя код модуля. Стандартные типы OneBot12 (meta / message / notice / request) и расширенные типы (command) имеют свои собственные настраиваемые параметры:

[ErisPulse.event.overrides]

# message: текстовые условия (AND с условиями в коде)
[ErisPulse.event.overrides.message.ChatModule]
pattern = "闲聊*"

# notice / request / meta: detail_type белый список (записи поддерживают точные / glob / re: регулярные выражения)
[ErisPulse.event.overrides.notice.MyModule]
detail_types = ["group_increase"]

# command (расширение): параметры перезаписи (приоритет пользователя; отключение через acl deny)
[ErisPulse.event.overrides.command.MyModule.restart]
master = true               # Перезапись только для владельца фреймворка (false — разрешить ограничения владельца)
hidden = true               # Скрыть в списке помощи
aliases = ["rs"]            # Активные псевдонимы

# acl (только для command): черный/белый список пользователей (имя команды поддерживает glob / re: регулярные выражения, точные ключи имеют приоритет)
[ErisPulse.event.overrides.acl."roll*"]
allow = ["onebot11:u_vip"]  # Идентификатор пользователя "platform:user_id"
deny = ["onebot11:u_bad"]

# ACL фолбэк: разрешение (true) / строгий отказ (false) для команд без ACL
acl_default_allow = true
Параметр Тип Описание
event.overrides.message.<module> table Текстовое условие: {pattern="...", regex="..."}
event.overrides.notice / request.<module> table {detail_types=[...], pattern, regex}
event.overrides.meta.<module> table {detail_types=[...]}
event.overrides.command.<module> table Параметры перезаписи модуля (скаляры)
event.overrides.command.<module>.<command> table Параметры перезаписи команды (командный приоритет)
event.overrides.acl.<command> table Черный/белый список пользователей: {allow=[...], deny=[...]}
event.overrides.acl_default_allow boolean ACL фолбэк: разрешение (true) / строгий отказ (false) для команд без ACL

API времени выполнения (после from ErisPulse.Core.Event import overrides по подпространствам типа вызывать overrides.message.set() / overrides.command.set() / overrides.acl.set() и т.д., или через sdk.Event.overrides доступ к overrides.message.set() / overrides.command.set() / overrides.acl.set() и т.д.) См. Введение в обработку событий · Перезапись событий.

Далее

CLI 参考

来源: docs/ru/user-guide/cli-reference.md(https://github.com/ErisPulse/ErisPulse/blob/main/docs/ru/user-guide/cli-reference.md)

Справочник командной строки

Tip

Когда нужно читать эту страницу: забыли параметры команды epsdk, хотите добавить управление компонентами в скрипт, или хотите контролировать поведение run / stop / restart. Для повседневного использования init / install / run достаточно знать одну команду: epsdk <команда> --help — всегда можно посмотреть описание параметров, не читая всю статью.

epsdk — это инструмент командной строки ErisPulse: инициализация проекта, установка / обновление модулей и адаптеров, интерактивная настройка компонентов, запуск и остановка робота, диагностика среды — всё это доступно одной командой.

Совет: epsdk (без команды) показывает основную справку по категориям: Проект (init / create / run), Управление компонентами (install / uninstall / upgrade / list / list-remote / types), Конфигурация и диагностика (config / doctor / i18n), Прочее (self-update / version).


Команды управления пакетами

Команда Алиас Параметры Описание
install i, add [пакет]... [--upgrade/-U] [--pre] [-e ПУТЬ] [--user] [--no-deps] [-t КАТАЛОГ] [--index-url URL] [--extra-index-url URL] [--no-cache-dir] [-r ФАЙЛ] [-c ФАЙЛ] [--force-reinstall] [--ignore-installed] [--compile/--no-compile] [--prefix КАТАЛОГ] [--src КАТАЛОГ] [--config-settings НАСТРОЙКИ] [--no-binary ФОРМАТ] [--only-binary ФОРМАТ] [--prefer-binary] [--build-isolation/--no-build-isolation] [--upgrade-strategy {eager,only-if-needed,to-satisfy-only}] [--break-system-packages] [--no-uv] Установка модуля/адаптера
uninstall rm, remove <пакет>... [--no-uv] Удаление модуля/адаптера
upgrade up [пакет]... [--force/-f] [--pre] [--no-uv] Обновление указанного модуля или всех
self-update su, update [версия] [--pre] [--force/-f] [--no-uv] Обновление SDK

Команды диагностики

Команда Алиас Параметры Описание
doctor diag [--verbose] [--fix] Диагностика среды и вывод отчета о состоянии; --fix пытается автоматически исправить

install

Установка пакетов модуля или адаптера ErisPulse. Если имя пакета не указано, запускается интерактивный установщик.

Алиас: i, add

Связь с uv (2.11.1+): в проектах, управляемых uv (существует uv.lock или [tool.uv]), install / upgrade / uninstall автоматически используют uv add / uv remove — зависимости записываются в pyproject.toml и uv.lock, uv sync больше не удаляет компоненты, установленные через epsdk; в случае сбоя автоматически возвращается к uv pip / pip. Параметры, не поддерживаемые uv, например --user, используют pip. Порядок определения целевой среды: ERISPULSE_PYTHON → UV_PROJECT_ENVIRONMENT → .venv проекта → UV_PYTHON → VIRTUAL_ENV → текущий интерпретатор (команда epsdk doctor показывает полную цепочку).

Параметры:

Параметр Краткий Описание
[пакет]... Имя пакета для установки, можно указать несколько
--upgrade -U Обновить до последней версии
--pre Разрешить установку предварительных версий
--editable -e Установить в режиме редактирования (требует указания пути)
--user Установить в каталог site-packages пользователя
--no-deps Не устанавливать зависимости
--target -t Установить в указанный каталог
--index-url Указать URL зеркала PyPI
--extra-index-url Дополнительный URL зеркала PyPI (можно указать несколько)
--no-cache-dir Отключить кэш
--requirement -r Установка из файла requirements
--constraint -c Установка из файла ограничений
--force-reinstall Принудительная переустановка
--ignore-installed Игнорировать уже установленные пакеты
--compile Компилировать .pyc файлы после установки
--no-compile Не компилировать .pyc файлы после установки
--prefix Установить в указанный префикс каталога
--src Каталог исходного кода для установки в режиме редактирования
--config-settings Передача конфигурации сборочному бэкенду (можно указать несколько)
--no-binary Ограничение использования бинарных пакетов (например, :all:)
--only-binary Ограничение использования только бинарных пакетов (например, :all:)
--prefer-binary Предпочтение бинарных пакетов
--build-isolation Включить изоляцию сборки
--no-build-isolation Отключить изоляцию сборки
--upgrade-strategy Стратегия обновления: eager, only-if-needed, to-satisfy-only
--break-system-packages Разрешить изменение системных пакетов
--no-uv Использовать pip вместо uv

Примеры:

# Установка одного модуля
epsdk install Weather

# Установка нескольких модулей
epsdk install Yunhu Weather

# Установка из зеркала и обновление
epsdk install Weather -U --index-url https://pypi.tuna.tsinghua.edu.cn/simple

# Установка в режиме редактирования (для разработки)
epsdk install -e ./my-adapter

uninstall

Удаление установленного модуля или адаптера ErisPulse. Если имя пакета не указано, запускается интерактивный удалитель.

Алиас: rm, remove

Параметры:

Параметр Описание
<пакет>... Имя пакета для удаления, можно указать несколько
--no-uv Использовать pip вместо uv

Примеры:

# Удаление одного модуля
epsdk uninstall Weather

# Удаление нескольких модулей
epsdk uninstall Yunhu Weather

upgrade

Обновление установленных компонентов ErisPulse. Если имя пакета не указано, запускается интерактивное обновление всех.

Алиас: up

Параметры:

Параметр Краткий Описание
[пакет]... Имя пакета для обновления, можно указать несколько
--force -f Принудительное обновление, без подтверждения
--pre Разрешить обновление до предварительных версий
--no-uv Использовать pip вместо uv

Примеры:

# Обновление всех пакетов
epsdk upgrade

# Обновление указанного пакета
epsdk upgrade Weather

# Принудительное обновление (без подтверждения)
epsdk upgrade -f

self-update

Обновление самого ErisPulse SDK до последней версии.

Алиас: su, update

Параметры:

Параметр Краткий Описание
[версия] Указать номер целевой версии
--pre Разрешить обновление до предварительных версий
--force -f Принудительное обновление, без подтверждения
--no-uv Использовать pip вместо uv

Примеры:

# Обновление до последней стабильной версии
epsdk self-update

# Обновление до указанной версии
epsdk self-update 1.2.3

# Разрешить предварительные версии
epsdk self-update --pre

# Принудительное обновление
epsdk self-update -f

Note

При установке через uv tool install ErisPulse команда автоматически заменяется на uv tool upgrade ErisPulse (при указании версии — uv tool install ErisPulse==<версия> --force), прямое обновление с помощью pip приведёт к восстановлению инвентаря uv. На Windows обновление выполняется в новом окне консоли: текущий CLI должен быть завершён для освобождения файлов инструментального окружения, после завершения обновления откройте терминал заново.


Команды для просмотра информации

Команда Алиас Параметры Описание
list l, ls [--type/-t {modules,adapters,all}] [--outdated/-o] Вывод списка установленных компонентов
list-remote lsr [--type/-t {modules,adapters,all}] [--refresh/-r] Вывод списка доступных удалённых компонентов
version ver Вывод информации о версии SDK и Python (эквивалентно -V)

list

Вывод списка установленных модулей и адаптеров ErisPulse.

Алиас: l, ls

Параметры:

Параметр Краткий Описание
--type -t Указать тип: modules, adapters, all (по умолчанию)
--outdated -o Вывести только обновляемые пакеты

Примеры:

# Вывод всех установленных компонентов
epsdk list

# Только модули
epsdk list -t modules

# Только адаптеры
epsdk list -t adapters

# Только обновляемые пакеты
epsdk list -o

list-remote

Вывод списка доступных удалённых модулей и адаптеров ErisPulse.

Алиас: lsr

Параметры:

Параметр Краткий Описание
--type -t Указать тип: modules, adapters, all (по умолчанию)
--refresh -r Принудительное обновление кэша удалённых пакетов

Примеры:

# Вывод всех доступных удалённых компонентов
epsdk list-remote

# Только удалённые модули
epsdk list-remote -t modules

# Обновление кэша и вывод
epsdk list-remote -r

Команды конфигурации

Команда Алиас Параметры Описание
config cfg, conf [имя] [--list/-l] [--json] Интерактивная конфигурация адаптера/модуля

config

Интерактивное заполнение конфигурационных параметров адаптера/модуля. Визуальный помощник генерируется на основе класса конфигурации (ConfigClass / AccountConfigClass), автоматически создаёт форму и проводит валидацию, без необходимости ручного редактирования config.toml.

Адаптеры дополнительно поддерживают управление несколькими аккаунтами (бот-аккаунтами): добавление/редактирование/удаление аккаунтов, а также включение/отключение.

Алиас: cfg, conf

Параметры:

Параметр Краткий Описание
[имя] Имя цели (название платформы адаптера или модуля), оставить пустым — переход в интерактивный выбор
--list -l Вывести только состояние всех целей, без запуска помощника
--json Вывести состояние всех целей в формате JSON (для CI / скриптов), без запуска помощника

Примеры:

# Просмотр состояния всех адаптеров/модулей
epsdk config --list

# Вывод состояния в JSON (для CI / скриптов)
epsdk config --json

# Интерактивный выбор цели для конфигурации
epsdk config

# Конфигурация указанного адаптера
epsdk config yunhu

# Конфигурация указанного модуля
epsdk config MyModule

Описание:


Команды управления запуском

Tip

epsdk run автоматически обнаруживает и использует виртуальное окружение .venv в каталоге проекта (также можно явно указать интерпретатор через переменную ERISPULSE_PYTHON). epsdk install / uninstall / upgrade / list также действуют на виртуальное окружение проекта.

Команда Алиас Параметры Описание
run r [скрипт] [--reload] [--strict/--no-strict] Запуск указанного скрипта или SDK
stop — [--force] [--pid PID] Остановка запущенного экземпляра (запущен с помощью epsdk run)
restart — [--force] [--pid PID] Перезапуск запущенного экземпляра (остановка с последующим перезапуском с теми же параметрами)

run

Запуск проекта ErisPulse или прямой запуск SDK. Поддерживает режим горячей перезагрузки.

Алиас: r

Параметры:

Параметр Описание
[скрипт] Файл скрипта для запуска, если не указан — запуск SDK
--reload Включить режим горячей перезагрузки: отслеживает изменения файлов и автоматически перезагружает код компонентов (без перезапуска всего процесса); по умолчанию игнорирует каталоги .venv/.git (можно настроить через ErisPulse.framework.watch_ignore_dirs), каталоги плагинов обрабатываются точечными watch-ersами плагинов
--strict / --no-strict Временно включить / отключить строгий режим (только для текущего запуска, не записывается в конфигурацию); по умолчанию следует ErisPulse.framework.strict_mode (если не 0, проверка завершается с ошибкой, если 0 — только предупреждение и продолжение).

Примеры:

# Прямой запуск SDK
epsdk run

# Запуск указанного файла скрипта
epsdk run main.py

# Горячая перезагрузка (изменения файлов автоматически перезапускают код)
epsdk run main.py --reload

# Горячая перезагрузка SDK
epsdk run --reload

# Временный строгий режим: предварительная проверка завершается с ошибкой, если не пройдена, уровень строгости повышается как минимум до 1 (пропускает некорректные компоненты, передаётся через `ERISPULSE_FRAMEWORK_STRICT_MODE` в процесс, не записывается в файл конфигурации)
epsdk run main.py --strict

# Временный лёгкий режим (строгий режим включен в конфигурации, но на этот раз нужно запустить)
epsdk run main.py --no-strict

Предварительная проверка: run перед запуском быстро проверяет разбор config/config.toml и обязательную конфигурацию установленных компонентов, строгость по умолчанию следует ErisPulse.framework.strict_mode (если не 0, проверка завершается с ошибкой, если 0 — только предупреждение и продолжение). Отсутствие конфигурационного файла считается нормальным для первого запуска, только предупреждение, не ошибка. --strict временно включает строгость: предварительная проверка завершается с ошибкой, при этом уровень строгости повышается как минимум до 1 (пропускает некорректные компоненты, передаётся через ERISPULSE_FRAMEWORK_STRICT_MODE в процесс, не записывается в файл конфигурации); --no-strict временно снижает до лёгкого. Сама предварительная проверка при ошибках автоматически пропускается, не включает проверку сети, не блокирует запуск.

Структура наблюдения --reload (начиная с 2.11.1): epsdk run --reload запускается как "надзирательный процесс + перезагрузочный дочерний процесс". Сохранение .py файлов запускает перезагрузку в дочернем процессе (исключительная последовательная обработка, объединение шторма); ошибки синтаксиса модуля отклоняются на уровне предварительной проверки, старый экземпляр продолжает обслуживать; при sdk.hard_restart() дочерний процесс завершается с кодом 42, надзирательный процесс отображает причину и автоматически перезапускает новый дочерний процесс — после обновления фреймворка новая кодовая база сразу активируется.

stop

Остановка запущенного экземпляра ErisPulse (запущен с помощью epsdk run и в том же каталоге проекта). run при запуске записывает PID надзирательного процесса, PID дочернего процесса фреймворка и исходную команду запуска в .erispulse/runtime.json, stop использует эти данные для определения экземпляра.

Порядок остановки: в POSIX сначала отправляется сигнал SIGINT надзирательному процессу (аналогичный Ctrl+C, с корректным завершением), при таймауте постепенно повышаются до SIGTERM / SIGKILL; в Windows нет семантики сигналов процесса, сначала останавливается дочерний процесс фреймворка, затем надзирательный процесс (чтобы избежать ошибочного восстановления надзирателя).

Параметры:

Параметр Описание
--force Принудительная остановка без ожидания
--pid PID Указать PID цели (переопределяет файл состояния, для нестандартных способов запуска)

Примеры:

# Остановка запущенного экземпляра в текущем проекте
epsdk stop

# Принудительная остановка
epsdk stop --force

restart

Перезапуск запущенного экземпляра ErisPulse: остановка по семантике stop, затем перезапуск с использованием команды запуска из файла состояния (перехватывает терминал, новый экземпляр записывает новый файл состояния).

Параметры: такие же, как у stop (--force / --pid PID).

Примеры:

# Корректный перезапуск (после обновления адаптера/модуля через pip, чтобы код вступил в силу; кодовые горячие перезагрузки модулей в процессе также возможны с помощью `sdk.reload_module` / `sdk.adapter.reload`, без необходимости перезапуска)
epsdk restart

Note

Запуск python main.py и подобные способы, обходящие epsdk run, не записывают файл состояния — такие процессы управляются системными инструментами, или с помощью epsdk stop --pid <PID> по указанному PID.


Команды управления проектом

Команда Алиас Параметры Описание
init — [путь] [--project-name/-n <имя>] [--path <каталог>] [--adapter/-a <имя>] [--quick/-q] [--force/-f] [--here] [--no-uv] [--no-venv] Инициализация проекта ErisPulse
create — {module,adapter,pack} [--name/-n <имя>] [--description/-d <описание>] [--author/-a <имя>] [--email/-e <почта>] [--homepage <сайт>] [--output/-o <каталог>] [--force/-f] [--local] Создание шаблона модуля/адаптера; pack преобразует локальный плагин в публикуемый проект

init

Инициализация нового проекта ErisPulse. Поддерживает интерактивный и быстрый режим, начиная с 2.8.4 создаёт pyproject.toml (список зависимостей), по умолчанию создаёт виртуальное окружение .venv и устанавливает фреймворк и адаптер, поддерживает указание произвольного каталога.

Параметры:

Параметр Краткий Описание
[путь] Целевой путь (может включать родительские каталоги, например ../apps/mybot; имя без пути эквивалентно --project-name)
--project-name -n Имя проекта
--path Родительский каталог проекта (в сочетании с -n указывает путь создания)
--adapter -a Предварительно выбранный адаптер (можно передавать несколько раз или через запятую), при передаче пропускает выбор адаптера
--quick -q Быстрый режим, пропускает интерактивное руководство (по умолчанию создаёт .venv и устанавливает зависимости)
--force -f Принудительное перезапись существующих файлов конфигурации
--here Инициализация в текущем каталоге, без создания подкаталога
--no-uv Использование pip вместо uv
--no-venv Пропуск создания виртуального окружения и установки зависимостей

Примеры:

# Интерактивная инициализация
epsdk init

# Быстрая инициализация (создаёт my_bot/ в текущем каталоге, с `pyproject.toml` + `.venv`)
epsdk init -q -n my_bot

# Быстрая инициализация с предустановленными адаптерами (без интеракции, для скриптов / CI)
epsdk init -q -n my_bot --adapter yunhu,telegram

# Инициализация в произвольном каталоге (../apps/mybot)
epsdk init ../apps/mybot

# Комбинация родительского каталога и имени проекта
epsdk init -n my_bot --path ../apps

# Принудительная перезапись конфигурации
epsdk init -f

# Инициализация в текущем каталоге
epsdk init --here -n my_bot

# Создание только структуры проекта, без виртуального окружения
epsdk init --no-venv -n my_bot

Результат инициализации: main.py, pyproject.toml (список зависимостей), config/config.toml + config.full.example, config/ssl/, logs/, .gitignore, README.md; при выборе создания виртуального окружения дополнительно создаётся .venv и устанавливаются erispulse и выбранные адаптеры.

Note

.gitignore — шаблон с группировкой: байт-коды и результаты сборки, виртуальные окружения и .env, кэш инструментов, файлы редактора и системы, и полностью исключает каталоги config/ и logs/ — config.toml содержит токены адаптеров и другие чувствительные данные, не рекомендуется включать в репозиторий; для совместного использования шаблона конфигурации используйте config.full.example.

Warning

Не используйте uv run epsdk run для запуска робота. uv run в каталоге без pyproject.toml создает изолированную среду для однократного запуска — адаптеры, установленные через epsdk install, не будут сохранены. Используйте epsdk run в каталоге проекта (автоматически использует .venv), или активируйте виртуальное окружение перед запуском.

create

Создание шаблона модуля или адаптера ErisPulse; подкоманда pack преобразует локальный плагин (plugins/ каталог) в публикуемый стандартный проект.

Параметры:

Параметр Краткий Описание
{module,adapter,pack} Тип для создания: module / adapter / pack (преобразование плагина в проект)
--name -n Имя проекта (в стиле PascalCase)
--description -d Описание проекта
--author -a Имя автора
--email -e Электронная почта автора
--homepage URL-адрес проекта
--output -o Каталог вывода (по умолчанию текущий каталог)
--force -f Принудительная перезапись существующего каталога
--local Создание локального плагина (доступно для module / adapter): генерирует структуру plugins/<имя>/, без установки через пакет

Примеры:

# Интерактивное создание (выводит выбор типа и заполняет информацию)
epsdk create

# Прямое создание проекта модуля
epsdk create module -n MyModule

# Создание локального плагина (в каталог `plugins/` проекта, автоматически обнаруживается при запуске)
epsdk create module -n MyModule --local

# Создание локального адаптера плагина (аналогично, без установки через пакет)
epsdk create adapter -n MyAdapter --local

# Прямое создание проекта адаптера
epsdk create adapter -n MyAdapter

# Преобразование локального плагина в публикуемый проект (интерактивный выбор плагина → заполнение метаинформации → генерация стандартного проекта)
epsdk create pack

# Полные параметры
epsdk create module -n MyModule -d "Описание модуля" -a "Автор" -e "[email protected]"

# Указание каталога вывода
epsdk create module -n MyModule -o ./projects

# Принудительная перезапись существующего каталога
epsdk create module -n MyModule -f

Команды языка

Команда Алиас Параметры Описание
i18n language, lang [язык] [--list/-l] Просмотр или смена языка отображения CLI

i18n

Просмотр текущего языка CLI, список поддерживаемых языков, смена языка отображения. Если параметр не указан, запускается интерактивное меню выбора.

Алиас: language, lang

Параметры:

Параметр Краткий Описание
[язык] Код языка для смены (например, zh-CN, en, ja, ru)
--list -l Вывод списка всех поддерживаемых языков

Примеры:

# Интерактивный выбор языка
epsdk i18n

# Смена на английский
epsdk i18n en

# Смена на японский
epsdk i18n ja

# Вывод списка всех поддерживаемых языков
epsdk i18n --list

Команды для генерации типовых аннотаций

Команда Алиас Параметры Описание
types t, stub [--output/-o <путь>] [--force] [--adapters-only] [--modules-only] Генерация файлов аннотаций типов для автодополнения в IDE

types

Сканирование установленных модулей и адаптеров ErisPulse, генерация файлов .pyi с аннотациями типов, для получения точного автодополнения и проверки типов в IDE.

Алиас: t, stub

Параметры:

Параметр Краткий Описание
--output -o Путь вывода (по умолчанию ep-stubs/ в текущем каталоге)
--force Принудительная перезапись существующих файлов аннотаций
--adapters-only Генерировать только аннотации для адаптеров
--modules-only Генерировать только аннотации для модулей

Важно: --adapters-only и --modules-only взаимоисключительны, при одновременном указании последний параметр имеет приоритет.

Примеры:

# Генерация аннотаций для всех установленных модулей и адаптеров
epsdk types

# Только аннотации для адаптеров
epsdk types --adapters-only

# Вывод в указанный каталог
epsdk types -o ./typings

# Принудительная перезапись файлов
epsdk types --force

Глобальные параметры

Следующие параметры применимы ко всем командам:

Параметр Краткий Описание
--help -h Показать справку
--version -V Показать информацию о версии
--verbose -v Показать подробный вывод (можно повторять -vv/-vvv)
--no-color Отключить цветной вывод (подходит для CI / сбора логов)
--no-banner Пропустить стартовый баннер (скриптовое использование / CI; в неинтерактивных терминалах и при ERISPULSE_NO_BANNER=1 автоматически скрыт)
--yes -y Автоматическое подтверждение всех интерактивных запросов (без интеракции)

Диагностика окружения

doctor

Note

Эта команда доступна в ErisPulse 2.7.0+.

Диагностика текущей среды CLI, вывод отчета о состоянии. Используется для выявления проблем "почему не устанавливается / не подключается".

Параметр Описание
--verbose Показать подробную диагностику
--fix Диагностировать и попытаться автоматически исправить исправимые проблемы

Проверяемые пункты:

Автоматическое исправление (--fix):

# Диагностика среды
epsdk doctor

# Алиас
epsdk diag

# Диагностика и автоматическое исправление
epsdk doctor --fix

Интерактивная установка

Запуск epsdk install без указания пакета ведёт к интерактивной установке:

epsdk install

Интерфейс предоставляет:

  1. Выбор адаптера
  2. Выбор модуля
  3. Пользовательская установка

Общие способы использования

Установка модуля

# Установка одного модуля
epsdk install Weather

# Установка нескольких модулей
epsdk install Yunhu Weather

# Обновление модуля
epsdk install Weather -U

Вывод списка компонентов

# Вывод всех компонентов
epsdk list

# Только адаптеры
epsdk list -t adapters

# Только обновляемые компоненты
epsdk list -o

# Вывод доступных удалённых компонентов
epsdk list-remote

Удаление компонентов

# Удаление одного компонента
epsdk uninstall Weather

# Удаление нескольких компонентов
epsdk uninstall Yunhu Weather

Конфигурация компонентов

# Просмотр состояния конфигурации
epsdk config --list

# Интерактивный выбор цели для конфигурации
epsdk config

# Конфигурация указанного адаптера
epsdk config yunhu

Обновление компонентов

# Обновление всех компонентов
epsdk upgrade

# Обновление указанного компонента
epsdk upgrade Weather

# Принудительное обновление
epsdk upgrade -f

Запуск проекта

# Обычный запуск
epsdk run main.py

# Горячая перезагрузка
epsdk run main.py --reload

Смена языка

# Интерактивный выбор языка
epsdk i18n

# Прямая смена на английский
epsdk i18n en

# Вывод списка поддерживаемых языков
epsdk i18n --list

Генерация типовых аннотаций

# Генерация всех типовых аннотаций
epsdk types

# Только типовые аннотации для модулей
epsdk types --modules-only

Инициализация проекта

# Интерактивная инициализация
epsdk init

# Быстрая инициализация
epsdk init -q -n my_bot

Создание шаблона

# Интерактивное создание (выводит выбор типа и заполняет информацию)
epsdk create

# Прямое создание проекта модуля
epsdk create module -n MyModule

# Прямое создание проекта адаптера
epsdk create adapter -n MyAdapter

# Полные параметры
epsdk create module -n MyModule -d "Описание модуля" -a "Автор" -e "[email protected]"

# Принудительная перезапись существующего каталога
epsdk create module -n MyModule -f

Далее

安装

来源: docs/ru/user-guide/installation.md(https://github.com/ErisPulse/ErisPulse/blob/main/docs/ru/user-guide/installation.md)

Справочник по установке

Tip

Когда нужно читать эту статью: если вам нужно выбрать способ установки (pip / uv / Docker / клиентское приложение ErisPulse-App) или если установка не удалась и требуется устранение неполадок. Если вы хотите просто быстро запустить, 5-минутный старт уже охватывает самый простой процесс, и эту статью можно пропустить.

Системные требования

Способы установки

Способ 1: Установка с помощью pip

# Установка ErisPulse
pip install ErisPulse

# Обновление до последней версии
pip install ErisPulse --upgrade

Способ 2: Установка с помощью uv (рекомендуется)

uv — это более быстрая инструментальная цепочка для Python, рекомендуемая для среды разработки.

Установка uv

# Установка uv с помощью pip
pip install uv

# Проверка установки
uv --version

Создание виртуального окружения

# Создание директории проекта
mkdir my_bot && cd my_bot

# Установка Python 3.12
uv python install 3.12

# Создание виртуального окружения
uv venv

Активация виртуального окружения

# Windows
.venv\Scripts\activate

# Linux/Mac
source .venv/bin/activate

Установка ErisPulse

# Установка ErisPulse
uv pip install ErisPulse --upgrade

Способ 3: Установка с помощью uv tool (глобальный CLI, рекомендуется)

Если вы хотите использовать epsdk как глобальный командную строку, uv tool install — самый чистый способ: epsdk работает в независимой среде инструментов, не загрязняя никакую проектную среду:

# Установка (epsdk сразу доступен, без необходимости активации виртуального окружения)
uv tool install ErisPulse

# Обновление (или просто используйте epsdk self-update, который автоматически использует этот канал)
uv tool upgrade ErisPulse

Note

epsdk в среде инструментов автоматически распознает .venv проекта при запуске в директории проекта: epsdk install установит компоненты в проектное окружение, epsdk run запустит бота с использованием проектного окружения, сам фреймворк по-прежнему предоставляется средой инструментов, и обе среды не влияют друг на друга.

В меню однокомандного скрипта установки (get.erisdev.com/install.sh / install.ps1) также доступен способ установки «глобальный CLI (uv tool)», который автоматически установит uv и проведет вас через процесс.

Инициализация проекта и установка модулей

После установки полный процесс инициализации проекта, установки модулей и запуска описан в 5 минут к быстрому старту.

Способ 4: Использование клиентского приложения ErisPulse-App (без терминала)

Не хотите устанавливать среду Python? ErisPulse-App — это официальное клиентское приложение для всех платформ (Android / Windows / Linux / macOS), которое можно запускать прямо с телефона, а настольная версия поддерживает сворачивание в системную панель для постоянной фоновой работы; включает в себя встроенный интерпретатор Python и SDK ErisPulse, не требуя терминала и ручной настройки:

Подробное руководство см. в разделе Установка и использование ErisPulse-App.

Проверка установки

Проверка установки

# Проверка версии ErisPulse
epsdk --version

Запуск теста

# Запуск проекта
epsdk run main.py

Если вы видите подобный вывод, значит установка прошла успешно:

[INFO] Инициализация ErisPulse...
[INFO] Загружен адаптер: Yunhu
[INFO] Загружен модуль: MyModule
[INFO] Инициализация ErisPulse завершена

Часто задаваемые вопросы

Ошибка установки

  1. Проверьте, входит ли версия Python в поддерживаемый диапазон (поддерживается 3.10 – 3.14; экспериментальная поддержка 3.14t с свободным потоком / без GIL не гарантируется).
  2. Попробуйте использовать uv pip install ErisPulse вместо pip install.
  3. Если возникает ошибка прав, попробуйте pip install --user ErisPulse или используйте виртуальное окружение.
  4. Если SSL-ошибка сертификата возникает в корпоративной среде с прокси, попробуйте pip install --trusted-host pypi.org --trusted-host files.pythonhosted.org ErisPulse.
  5. Убедитесь, что сетевое подключение работает и доступен репозиторий pip.

Ошибка конфигурации

  1. Проверьте синтаксис config.toml (TOML-формат чувствителен к отступам и кавычкам).
  2. Убедитесь, что все необходимые параметры конфигурации заполнены.
  3. Просмотрите логи терминала для получения подробной информации об ошибке.
  4. Используйте epsdk init, чтобы пересоздать конфигурационный файл.

Ошибка установки модуля

  1. Убедитесь, что имя модуля написано правильно (регистр важен).
  2. Проверьте сетевое подключение.
  3. Используйте epsdk list-remote, чтобы просмотреть список доступных модулей.
  4. Убедитесь, что модуль совместим с текущей версией SDK.

Стратегия выполнения Windows PowerShell

Если PowerShell выводит сообщение «Невозможно загрузить файл... так как выполнение скриптов запрещено на этой системе»:

Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser

Ошибка создания виртуального окружения в Debian/Ubuntu

Если скрипт установки сообщает о «неудаче создания виртуального окружения» и ошибка содержит ensurepip is not available, это связано с тем, что python3-venv не установлен по умолчанию в Debian/Ubuntu (системный ensurepip для Python отключен):

sudo apt install python3.13-venv   # Установите пакет, соответствующий вашей версии Python
# Или установите универсальный метапакет:
sudo apt install python3-venv

После установки перезапустите скрипт установки. Новые версии скриптов установки при обнаружении этой проблемы спрашивают пользователя и могут автоматически установить соответствующий системный пакет; также можно использовать uv (так как uv venv не зависит от ensurepip).

Далее

部署

来源: docs/ru/user-guide/deployment.md(https://github.com/ErisPulse/ErisPulse/blob/main/docs/ru/user-guide/deployment.md)

Руководство по развёртыванию

Tip

Когда читать этот документ: когда бот должен длительно работать на постоянной основе — здесь всё о развёртывании в Docker, процессных супервизорах systemd / Supervisor, обратном прокси и SSL, резервном копировании и обновлениях. На этапе локальной разработки и отладки это не требуется — можете пропустить.

Завершение разработки бота — это только начало. Этот документ охватывает три способа развёртывания, необходимых для стабильной работы бота на сервере (Docker / systemd / Supervisor), а также обратный прокси, усиление безопасности и резервное копирование.

Развёртывание в Docker (рекомендуется)

ErisPulse предоставляет официальный Docker-образ со встроенными фреймворком ErisPulse и панелью управления Dashboard, поддерживающий архитектуры linux/amd64 и linux/arm64.

Быстрый старт

# Загрузка образа
docker pull erispulse/erispulse:latest

# Скачивание docker-compose.yml
curl -O https://raw.githubusercontent.com/ErisPulse/ErisPulse/main/docker-compose.yml

# Задайте токен входа в Dashboard и запустите
ERISPULSE_DASHBOARD_TOKEN=your-token docker compose up -d

После запуска откройте http://localhost:8000/Dashboard и войдите, используя установленный токен в качестве пароля.

Ускорение загрузки образа через зеркало (для Китая)

Если Docker Hub недоступен, образ можно загрузить через GitHub Container Registry:

docker pull ghcr.io/erispulse/erispulse:latest

При использовании образа из ghcr.io необходимо изменить поле image в docker-compose.yml:

services:
  erispulse:
    image: ghcr.io/erispulse/erispulse:latest

docker-compose.yml

services:
  erispulse:
    image: erispulse/erispulse:${ERISPULSE_TAG:-latest}
    container_name: ${CONTAINER_NAME:-erispulse}
    ports:
      - "${ERISPULSE_PORT:-8000}:8000"
    volumes:
      - ./config:/app/config
      # Персистентный каталог Python-пакетов
      - ./config/.packages:/usr/local/lib/python3.13/site-packages
    environment:
      - TZ=${TZ:-Asia/Shanghai}
      - LANG=${LANG:-en_US.UTF-8}
      - ERISPULSE_LANG=${ERISPULSE_LANG:-}
      - ERISPULSE_DASHBOARD_TOKEN=${ERISPULSE_DASHBOARD_TOKEN:-}
    init: true
    # Корректная остановка выполняется обработкой сигналов внутри фреймворка (SIGTERM); здесь задаётся только длительность льготного периода
    stop_grace_period: 30s
    restart: on-failure:5
    healthcheck:
      test: ["CMD", "python", "-c", "import urllib.request; urllib.request.urlopen('http://localhost:8000/ping')"]
      interval: 30s
      timeout: 5s
      start_period: 20s
      retries: 3

Вышеуказанное соответствует docker-compose.yml в корне репозитория (в версии из репозитория в начале файла содержатся дополнительные комментарии об ускорении через зеркало и переменных окружения); рекомендуется скачивать и использовать напрямую.

Переменные окружения

Переменная Значение по умолчанию Описание
ERISPULSE_PORT 8000 Маппинг порта Dashboard
ERISPULSE_TAG latest Тег образа (для фиксации версии можно указать конкретный номер версии)
CONTAINER_NAME erispulse Имя контейнера (для различения экземпляров при развёртывании нескольких экземпляров)
ERISPULSE_DASHBOARD_TOKEN Генерируется автоматически Токен входа в Dashboard (настоятельно рекомендуется задать)
TZ Asia/Shanghai Часовой пояс
LANG en_US.UTF-8 Язык системы, автоматическое определение языка интерфейса запуска
ERISPULSE_LANG пусто Принудительный язык интерфейса запуска: zh / zh_TW / en / ja / ru (переопределяет LANG)

Сохранение данных

В каталог ./config смонтированы файлы конфигурации и база данных, он содержит:

Обновление фреймворка (включая pre/rc) и самолечение образа: точка входа при каждом запуске контейнера выполняет самопроверку целостности основных пакетов. При повреждении восстановление выполняется по принципу «приоритет версии, установленной пользователем» — версии, явно установленные/обновлённые в персистентном томе (например, pre-версия, установленная через Dashboard), будут переустановлены в той же версии из PyPI, без тихого отката к версии, встроенной в образ. Поэтому после обновления фреймворка через Dashboard целевая версия сохраняется при любом количестве перезапусков контейнера.

Панель управления Dashboard

Docker-образ ErisPulse содержит встроенный модуль Dashboard, предоставляющий веб-интерфейс визуального управления.

Обзор функций

Функция Описание
Панель мониторинга Обзор системы, мониторинг CPU/памяти, время работы, статистика событий
Управление ботами Просмотр статуса «онлайн» и информации ботов на различных платформах
Просмотр событий Поток событий в реальном времени с фильтрацией по типу и платформе
Просмотр логов Просмотрщик логов с фильтрацией по модулю и уровню
Управление модулями Просмотр, загрузка и выгрузка установленных модулей и адаптеров
Магазин модулей Просмотр доступных удалённых пакетов и установка в один клик
Редактирование конфигурации Онлайн-редактирование config.toml
Управление хранилищем Просмотр и редактирование данных Key-Value хранилища
Резервное копирование Экспорт/импорт конфигурации и данных хранилища
Журнал аудита Запись всех операций управления

Установка модулей через Dashboard

В Dashboard интегрирована функция магазина модулей, с помощью которой можно:

  1. Установить из магазина: просмотреть список удалённых модулей и установить нужный в один клик
  2. Загрузить локальный пакет: загрузить файл .whl или .zip напрямую для установки — удобно для тестирования самостоятельно разработанных модулей

Быстрый процесс тестирования для разработчиков модулей: после развёртывания в Docker загружайте собранные вами файлы .whl напрямую через функцию «Загрузить локальный пакет» в Dashboard для тестирования — без ручных операций с контейнером.

Супервизия процессов и жёсткий перезапуск

Жёсткий перезапуск ErisPulse (sdk.hard_restart()) рассчитан на внешнего супервизора, который заново запускает процесс при коде выхода 42, — сам SDK новый процесс не запускает. В производственной среде обязательно настройте супервизора, иначе после жёсткого перезапуска процесс не восстановится автоматически:

Полные примеры настройки каждого супервизора и описание контракта кода выхода 42 см. в разделе Процесс запуска → Руководство по супервизорам.

Проверка состояния

В SDK встроена конечная точка проверки состояния:

# Проверка состояния
curl http://localhost:8000/health

В официальном docker-compose.yml уже встроена приведённая ниже проверка состояния; при написании собственного compose-файла можно ориентироваться на неё:

services:
  erispulse:
    healthcheck:
      test: ["CMD", "python", "-c", "import urllib.request; urllib.request.urlopen('http://localhost:8000/ping')"]
      interval: 30s
      timeout: 5s
      start_period: 20s
      retries: 3

Обратный прокси

Если необходимо предоставить доступ к Dashboard через обратный прокси (например, Nginx):

server {
    listen 80;
    server_name bot.example.com;

    location / {
        proxy_pass http://127.0.0.1:8000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }

    # Поддержка WebSocket (необходима для потока событий Dashboard в реальном времени)
    location /Dashboard/ws {
        proxy_pass http://127.0.0.1:8000;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
    }
}

Для SSL можно использовать Let's Encrypt:

sudo certbot --nginx -d bot.example.com

Ручное развёртывание (pip)

Если Docker не используется, можно развернуть вручную.

Конфигурация для производственного окружения

# config/config.toml

[ErisPulse.server]
host = "0.0.0.0"
port = 8000

[ErisPulse.logger]
level = "INFO"
log_files = ["app.log"]
memory_limit = 5000

[ErisPulse.framework]
enable_lazy_loading = true

systemd (Linux)

Создайте файл /etc/systemd/system/erispulse-bot.service:

[Unit]
Description=ErisPulse Bot
After=network.target

[Service]
Type=simple
User=bot
WorkingDirectory=/opt/erispulse-bot
ExecStart=/opt/erispulse-bot/venv/bin/epsdk run main.py
Restart=always
RestartSec=5
StandardOutput=journal
StandardError=journal

[Install]
WantedBy=multi-user.target

Управление:

sudo systemctl daemon-reload
sudo systemctl start erispulse-bot
sudo systemctl enable erispulse-bot
sudo journalctl -u erispulse-bot -f

Supervisor

Создайте файл /etc/supervisor/conf.d/erispulse-bot.conf:

[program:erispulse-bot]
command=/opt/erispulse-bot/venv/bin/python -m ErisPulse run main.py
directory=/opt/erispulse-bot
user=bot
autostart=true
autorestart=true
stderr_logfile=/var/log/erispulse-bot/err.log
stdout_logfile=/var/log/erispulse-bot/out.log

Изолированное развёртывание через uv tool (разделение CLI и окружения проекта)

uv tool install устанавливает epsdk как отдельное инструментальное окружение, полностью изолируя сам CLI от зависимостей проекта: обновление CLI не затрагивает .venv проекта, а изменения зависимостей проекта не влияют на CLI.

# 1. Глобальная установка CLI (команды epsdk / ep становятся доступны автоматически)
uv tool install ErisPulse

# 2. В проекте размещаются только зависимости бота (.venv управляется uv)
cd /opt/erispulse-bot
uv add erispulse ErisPulse-Adapter-Yunhu   # добавляйте адаптеры по мере необходимости

# 3. Запуск через CLI (интерпретатор из .venv проекта определяется и используется автоматически)
epsdk run main.py

Ключевые аспекты поведения:

Рекомендации по безопасности

  1. Задайте токен Dashboard: используйте сильный случайный токен, не используйте значения по умолчанию
  2. Не открывайте порт в публичную сеть: если не используется обратный прокси + SSL, ограничьте доступ к порту Dashboard внутренней сетью
  3. Защитите каталог данных: каталог config/ содержит конфигурацию и базу данных, установите соответствующие права доступа к файлам
  4. Регулярно обновляйтесь: используйте epsdk self-update или загружайте новейший Docker-образ
  5. Не запускайте от root: при ручном развёртывании создайте отдельного пользователя
  6. Используйте политику перезапуска Docker: restart: on-failure:5 в официальном compose гарантирует автоматический перезапуск после аварийного завершения (включая код выхода 42 жёсткого перезапуска)

Развёртывание нескольких экземпляров

При запуске нескольких экземпляров бота:

  1. Каждый экземпляр использует отдельный каталог проекта и docker-compose.yml
  2. Используйте разные номера портов: ERISPULSE_PORT=8001
  3. Используйте разные имена контейнеров: container_name: erispulse-bot2

Обновление и обслуживание

Через Docker

# Загрузка новейшего образа
docker compose pull

# Перезапуск с использованием нового образа
docker compose up -d

Через pip

epsdk self-update
epsdk upgrade

Через uv tool

# Обновление инструментального окружения CLI
uv tool upgrade ErisPulse

# Обновление зависимостей проекта (выполнять в каталоге проекта)
uv sync

Горячая перезагрузка конфигурации сервера во время выполнения

После изменения адреса прослушивания / порта / SSL-сертификата перезапускать процесс не нужно — вызовите router.reload() из любой сопрограммы:

await sdk.router.reload(port=9000)                                # смена порта
await sdk.router.reload(ssl_cert=new_pem, ssl_key=new_key)        # горячая замена сертификата (сценарий продления сертификата)
await sdk.router.reload(host="0.0.0.0", port=9000)                # опущенные параметры наследуют текущую конфигурацию

Резервное копирование

Регулярно создавайте резервные копии каталога config/:

# Развёртывание Docker
tar czf erispulse-backup-$(date +%Y%m%d).tar.gz config/

# Или выполните экспорт через функцию «Резервное копирование» в Dashboard

Следующие шаги