Запуск и обслуживание
Инструкции для того, кто держит службу brokapi постоянно: как запустить ее вместе с системой, что она делает при сбоях, как остановить гейтвей и снять заявки,
какие файлы где лежат и что делать, когда что-то не запускается. Первый запуск по шагам: Быстрый старт.
Постоянный запуск (systemd)
brokapi up без -d работает на переднем плане и печатает, что запустилась: это ровно то, что нужно менеджеру служб. Когда systemd посылает SIGTERM, служба
останавливает гейтвеи (каждому дается stop_timeout, по умолчанию 10 секунд) и выходит. Образец юнита /etc/systemd/system/brokapi.service:
[Unit]
Description=brokapi service
After=network-online.target
Wants=network-online.target
[Service]
Type=simple
User=brokapi
ExecStart=/usr/local/bin/brokapi -c /etc/brokapi/brokapi.toml up
EnvironmentFile=/etc/brokapi/tokens.env
Restart=on-failure
RestartSec=5
[Install]
WantedBy=multi-user.target
Три замечания к образцу:
- Токены лежат в
/etc/brokapi/tokens.envстрокамиTBANK_TOKEN=...с правами 600 и владельцем изUser=. В конфиге на них ссылаетсяtoken_env. Либоtoken_fileна файл с теми же правами. -cс полным путем. У юнита нет рабочего каталога сbrokapi.toml, а относительныйstate_dirсчитается от каталога конфига, так что-cдостаточно.- Пользователь без прав входа. Служба хранит в каталоге состояния ключи доступа ботов. Этот каталог должен принадлежать тому же пользователю и никому больше.
Это образец, а не команда установки: подстройте пути и пользователя под себя. Установки службы одной командой пока нет, ни для systemd, ни для launchd на macOS и службы Windows.
На macOS и Windows службу можно запустить в фоне командой brokapi up -d, после перезагрузки машины ее придется запустить заново.
Несколько служб на одной машине
Каждый конфиг - своя служба: свой каталог состояния, свой сокет, свои гейтвеи. brokapi -c prod.toml up -d и brokapi -c test.toml up -d не мешают друг другу, а brokapi services
показывает обе:
$ brokapi services
PID GATEWAYS UPTIME CONFIG STATE DIRECTORY
4121 2/2 running 3h02m /home/me/bots/prod.toml /home/me/bots/prod.state
4377 1/1 running 12m07s /home/me/bots/test.toml /home/me/bots/test.state
Две службы на один каталог состояния не пустит ни одна: вторая откажется запускаться и назовет pid и конфиг первой. Так сделано, чтобы два процесса не делили
журнал заявок и сокеты. Если конфиги лежат рядом, у них разные имена файлов и значит разные каталоги по умолчанию (prod.state, test.state).
Что происходит при сбоях
| Что случилось | Что делает программа | Что делать вам |
|---|---|---|
| Гейтвей упал или убит | Служба запускает его заново: сначала через 0,5 секунды, потом через 1, 2, 4 и так до 30 секунд. После 5 остановок за минуту гейтвей получает состояние failed и служба оставляет его в покое | Если failed: brokapi logs <гейтвей> покажет причину, после исправления brokapi start <гейтвей>. Боты получат Gap и сверятся: События |
| Служба умерла | Гейтвеи продолжают работать, боты ничего не замечают. Новая служба (brokapi up с тем же конфигом) находит их по pid-файлам и сокетам и берет под присмотр | brokapi up -d. Гейтвей с именем brokapi, который не отвечает, будет убит: иначе он держал бы сокет |
| Машину перезагрузили | Ничего не работает, заявки на бирже остались | brokapi up -d. Гейтвей сверит журнал с брокером до приема команд. Боты получат Gap с причиной NEW_EPOCH |
| Гейтвей завис | ps показывает прочерки вместо цифр в колонках BOTS, EVENTS/S, ORDERS, LIMIT: гейтвей не отвечает | brokapi restart <гейтвей> |
| Токен перестал подходить | Гейтвей не может стартовать или переподключиться. Причина обычно видна в LAST ERROR команды ps и в строках ERROR журнала | Заменить токен, brokapi restart <гейтвей> |
Остановить гейтвей и снять заявки
Заявка на бирже живет дольше, чем процесс, который ее поставил. Поэтому остановка гейтвея заявок не снимает: ни stop, ни down, ни перезагрузка. Снять их можно двумя способами.
| Команда | Что делает |
|---|---|
brokapi stop <гейтвей> --cancel-orders | Сначала снимает активные и стоп-заявки счета, потом останавливает гейтвей. Если часть не снялась, команда перечисляет их и завершается с кодом 1 |
brokapi cancel-all <гейтвей> | Только снимает заявки, гейтвей продолжает работать. Это аварийная кнопка, когда бот сошел с ума. На отказ по лимиту ждет и повторяет |
Остановка без снятия: brokapi stop <гейтвей> останавливает один гейтвей и держит его остановленным до brokapi start. brokapi down останавливает службу и все гейтвеи,
brokapi down --leave-gateways - только службу, гейтвеи остаются работать (следующий up подхватит их).
На Linux и macOS гейтвею посылается SIGTERM, и если он не вышел за stop_timeout, его завершают принудительно. На Windows у процесса без окна нет просьбы остановиться,
поэтому он завершается сразу, и в его журнале не будет строки stopped. Журнал и сверка при старте рассчитаны на внезапный конец, заявки это не теряет.
Менять конфиг, не останавливая службу
Правьте brokapi.toml и применяйте:
brokapi reload- привести работающие гейтвеи в соответствие с файлом: новые запустить, убранные остановить, измененные перезапустить, остальные не трогать.brokapi add <гейтвей>- запустить один гейтвей из файла.brokapi remove <гейтвей>- остановить и забыть его в памяти службы.
remove не правит файл. Пока гейтвей остается в файле, reload вернет его. Чтобы убрать насовсем, удалите раздел из brokapi.toml. Изменения state_dir, раздела [service] и listen
без перезапуска службы не применяются.
Какие файлы где лежат
brokapi.state/ каталог состояния службы (state_dir)
service.key ключ доступа к службе, права 600
service.addr где служба слушает
service.sock сокет службы (Linux, macOS)
service.pid pid службы
logs/service.log журнал службы
logs/<гейтвей>.log журнал гейтвея
gateways/<гейтвей>/ один гейтвей
journal.jsonl журнал заявок
access.key ключ доступа ботов, права 600
gateway.addr где слушает гейтвей
gateway.sock сокет гейтвея (Linux, macOS)
gateway.pid pid гейтвея
Путь до сокета Unix не может быть длиннее 107 байт на Linux и 103 на macOS. Каталог состояния в ~/Library/Application Support/...
с длинным именем гейтвея легко получает путь длиннее. Тогда программа не отказывается стартовать: сокет кладется в личный каталог
$XDG_RUNTIME_DIR/brokapi-<uid> или /tmp/brokapi-<uid> (права 700, только ваш пользователь, чужой или подмененный каталог не берется),
а настоящий адрес записывается в service.addr и gateway.addr. Команды и боты читают адрес из этих файлов, так что ничего настраивать не нужно.
Сокет убирается, когда гейтвей или служба останавливаются. Если даже так не получилось, ошибка называет причину и предлагает короче state_dir
или свой короткий путь в listen. Если вы сами задали в listen слишком длинный путь, это тоже ошибка с пояснением: за вас его не меняют.
Журналы ротируются по размеру ([service.logs]): max_size_mb и keep. Каталог состояния не кладите в репозиторий и в общую копию: в нем ключи доступа к службе и гейтвеям.
Токены брокеров там не лежат, они только в переменной окружения или в token_file.
Реестр служб машины (его читает brokapi services) хранится отдельно: в ~/.local/state/brokapi/services на Linux, на macOS и Windows в каталоге локальных данных пользователя.
Если что-то пошло не так
| Что видно | Что значит | Что делать |
|---|---|---|
no config file found. Looked at: ... (код 2) | Конфиг не найден | Указать -c, перейти в каталог с файлом или сделать brokapi init |
the environment variable ... (token_env) is not set | В окружении службы нет переменной с токеном | Для systemd - EnvironmentFile=. В терминале - export перед brokapi up |
the state directory ... is used by another service (pid ..., config ...) | Для этого каталога служба уже работает | brokapi down для нее или другой state_dir в этом конфиге |
a service already runs for ... (see brokapi services) | up -d на уже запущенный конфиг | Ничего: служба работает |
no service is running for ... (код 3) | Службы нет | brokapi up -d |
the gateway ... is not running. Start the service with ..., or the gateway with brokapi start ... (код 4) | Гейтвей не запущен (остановлен, failed, autostart = false) | brokapi ps, потом brokapi start <гейтвей> |
the service refused the access key | Ключ в service.key не от этой службы | Команда ходит в тот же state_dir, что и служба? Проверьте -c |
the service ended at once (...) и хвост журнала | Служба при up -d сразу вышла | Хвост журнала называет причину, чаще всего это конфиг |
... has mode 644: the access key must be readable by its owner only (chmod 600) | У access.key чужие права, гейтвей с ним не стартует | chmod 600 на файл |
the address ... is not on this machine: the gateway listens on loopback only | В listen адрес не этой машины | Только 127.0.0.1 или сокет Unix |
another gateway is already listening at ... | Тот же сокет занят живым гейтвеем | Это второй процесс того же гейтвея: brokapi ps, лишний остановить |
У бота the access key is missing or wrong | Нет заголовка authorization или ключ не из access.key этого гейтвея | Подключить бота |
Листать можно клавишами Влево и Вправо.