Горячие клавиши

← и →: предыдущая и следующая глава

S или /: поиск по книге

?: показать эту подсказку

Esc: закрыть подсказку или поиск

Конфиг brokapi.toml

Справочник по файлу, который читает программа brokapi. Один файл - одна служба: в нем перечислены гейтвеи (по одному на счет) и то, как служба за ними следит. Как работать с файлом по шагам: Быстрый старт. Команда brokapi init пишет образец с комментариями, brokapi check --offline проверяет файл, не обращаясь к брокерам.

Пример

Два гейтвея на одной службе: песочница Т-Банка и счет АЛОР. Токены берутся из переменной и из файла:

state_dir = "state"

[service]
stop_timeout = "10s"

[service.restart]
initial = "500ms"
max_pause = "30s"
max_restarts = 5
window = "60s"

[[gateway]]
name = "tbank-sandbox"
broker = "tbank"
account = "2000000000"
sandbox = true
token_env = "TBANK_TOKEN"

[[gateway]]
name = "alor-main"
broker = "alor"
account = "D12345"
token_file = "/etc/brokapi/alor.token"
autostart = false

[gateway.ring]
size = 20000
max_age = "10m"

[gateway.limits.http]
rate = 50
per = "1s"
burst = 50

Разделы [gateway.ring] и [gateway.limits.*] относятся к ближайшему сверху [[gateway]], то есть в примере - к alor-main.

У Bybit пара из ключа и секрета, поэтому гейтвей читает два значения: секрет как токен (token_env или token_file), ключ из key_env или key_file. sandbox = true - демо-счет (у него своя пара ключей, BYBIT_DEMO_API_KEY и BYBIT_DEMO_API_SECRET), без него гейтвей работает на основном контуре:

state_dir = "state"

[[gateway]]
name = "bybit-demo"
broker = "bybit"
sandbox = true
token_env = "BYBIT_DEMO_API_SECRET"
key_env = "BYBIT_DEMO_API_KEY"

Где лежит файл

Команда ищет конфиг по порядку: ключ -c <файл>, переменная BROKAPI_CONFIG, ./brokapi.toml, brokapi.toml в каталоге настроек пользователя (на Linux ~/.config/brokapi, на macOS и Windows свои каталоги). Ничего не нашлось - код выхода 2 и список мест, где искали.

Служба определяется файлом: у двух файлов разные каталоги состояния и разные сокеты, значит, это две независимые службы. Две службы на один каталог состояния программа не пустит: вторая откажется запускаться и назовет pid и конфиг первой.

Верхний уровень

КлючТипПо умолчаниюЧто значит
state_dirпуть<имя файла без .toml>.state рядом с конфигомКаталог, где служба и гейтвеи держат свои файлы: журналы заявок, ключи доступа, сокеты, pid-файлы, логи. Относительный путь считается от каталога конфига
[service]разделсм. нижеКак служба следит за гейтвеями
[[gateway]]список разделовпустоГейтвеи: по одному разделу на счет

Имя по умолчанию берется из имени файла, поэтому prod.toml и test.toml в одном каталоге получают разные каталоги состояния (prod.state и test.state) и не сталкиваются.

Любое неизвестное поле - ошибка с именем поля, а не молчаливый пропуск: опечатка в названии не превратится в настройку по умолчанию.

[service]

КлючПо умолчаниюЧто значит
listenсокет в каталоге состояния (Linux, macOS; если путь длиннее, чем принимает система, то в личном коротком каталоге, см. Какие файлы где лежат), свободный порт 127.0.0.1 (Windows)Где служба слушает команды: unix:<путь> или tcp:127.0.0.1:<порт>. Адрес должен быть на этом компьютере (127.0.0.1, ::1)
check_interval"1s"Как часто служба проверяет свои гейтвеи
stop_timeout"10s"Сколько гейтвею дается на остановку по просьбе, после этого его завершают принудительно

[service.restart]

Что служба делает, когда гейтвей остановился сам (упал, был убит):

КлючПо умолчаниюЧто значит
initial"500ms"Пауза перед первым перезапуском. После каждого следующего пауза вдвое длиннее
max_pause"30s"Дольше этого пауза не растет
max_restarts5Сколько перезапусков за window разрешено. Не меньше 1
window"60s"Период, в котором перезапуски считаются

Когда за window набралось max_restarts остановок, гейтвей получает состояние failed, служба перестает его запускать и ждет brokapi start <имя>. Почему так: гейтвей, который падает сразу после старта (токен отозван, счет закрыт), без предела будет бесконечно стучаться к брокеру. Гейтвей, который проработал дольше window, начинает счет с нуля. Запуск руками (start, restart) тоже обнуляет счет.

[service.logs]

КлючПо умолчаниюЧто значит
max_size_mb10При каком размере файл закрывается и начинается новый, в мегабайтах
keep5Сколько старых файлов хранить рядом с текущим

Журналы лежат в <state_dir>/logs/: service.log и по файлу на гейтвей (<имя>.log). Читать их удобнее командой brokapi logs.

[[gateway]]

Один раздел - одно подключение: брокер, счет и токен. Бот подключается к гейтвею, а не к брокеру.

КлючОбязателенЧто значит
nameдаИмя гейтвея. Команды обращаются к нему по имени, оно же имя каталога <state_dir>/gateways/<имя>/. От 1 до 32 символов: буквы, цифры, ., _, -. Имена не повторяются
brokerдаbcs, tbank, finam, alor или bybit
accountнетСчет: account_id у Т-Банка и Финама, portfolio у АЛОР. У БКС и Bybit выбора счета нет (ключ Bybit принадлежит одному счету), поле с ним - ошибка
sandboxнетtrue - песочница брокера (у Т-Банка sandbox, у АЛОР test, у Bybit демо-счет). У БКС и Финама песочницы нет, sandbox = true для них - ошибка
token_envодин из двухИмя переменной окружения с токеном
token_fileодин из двухПуть к файлу с токеном (весь файл, без пробелов по краям)
key_env, key_fileтолько Bybit, один из двухКлюч API Bybit: имя переменной окружения или путь к файлу. У Bybit пара из ключа и секрета, секрет задают как токен (token_env или token_file), а ключ этими двумя полями
autostartнет, truefalse - служба не запускает гейтвей на up, он ждет brokapi start
bot_bufferнет, 1024Сколько событий копится для одного бота. Бот, у которого буфер переполнился, считается слишком медленным: его поток закрывается кадром Lagged, остальные боты не замечают. См. События
bot_graceнет, "30s"Сколько бот может отсутствовать, прежде чем гейтвей отпустит его подписки
[gateway.ring]нетКольцо последних событий: size (по умолчанию 10000) и max_age (по умолчанию "5m"). От него зависит, как давно бот может отключиться и все равно получить пропущенное
[gateway.limits.<ведро>]нетЗаменяет ведро лимита брокера: rate, per, burst, все три обязательны
[gateway.settings]нетОстальные настройки коннектора, как в библиотеке: endpoint, write, exchange, app_name и другие

Токен - ровно один из двух способов. Оба сразу или ни одного - ошибка конфига. Токен в [gateway.settings] (token, refresh_token, secret) тоже ошибка: токен не должен попадать в файл, который хранят и копируют.

Файл с токеном должен читаться только вами (chmod 600). brokapi check предупреждает, если это не так (на Linux и macOS). Путь к нему лучше писать абсолютный: относительный читается от рабочего каталога процесса, а не от каталога конфига.

БКС и заявки. Для торговли у БКС нужен токен на запись и настройка write = true в [gateway.settings], как в библиотеке (BCS_IS_WRITE). Без этого брокер торговые команды не примет.

Ведра лимита

Гейтвей создает один счетчик лимитов брокера на всех ботов. В [gateway.limits.<ведро>] можно заменить значения одного ведра. Названия ведер у каждого брокера свои. Их видно в таблице rate limit of the broker команды brokapi status <гейтвей>, а как ведра устроены и зачем у отмены отдельное: Лимиты запросов. Неизвестное имя - ошибка конфига, в которой перечислены известные.

Длительности

Везде, где ждет время, строка с единицей: "500ms", "30s", "5m", "2h". Число без единицы - секунды.

Что дальше

  • Проверить файл: brokapi check --offline (только файл и токены), brokapi check (еще и чтение счета).
  • Применить изменения без остановки службы: brokapi reload. Раздел изменился - гейтвей перезапускается, не изменился - нет. Изменения state_dir, [service] и listen без перезапуска службы не применяются.
  • Настройки коннекторов: страницы брокеров БКС, Т-Банк, Финам, АЛОР.

Листать можно клавишами Влево и Вправо.

brokapi by RunInfra