Coordenador em Python que integra os scripts legados brln-autofee.py, lndg_AR_trigger.py e ai_param_tuner.py em um único processo, com estado persistido em SQLite e serviços externos encapsulados.
- Python 3.11 ou superior
lncliinstalado no PATH (ou caminho absoluto)bosinstalado OU LND REST API habilitada (recomendado)- Node LND com LNDg (API HTTP e banco SQLite acessíveis)
- Conta Amboss com token GraphQL
- Opcional: bot do Telegram para notificações
O projeto usa uv para gerenciamento de dependências.
curl -LsSf https://astral.sh/uv/install.sh | sh
source ~/.bashrcgit clone https://github.com/jvxis/brln-autofee.git
cd brln-autofeeuv syncIsso cria automaticamente o virtualenv (.venv/) e instala todas as dependências.
python3 -m brln_orchestrator init-dbO banco (brln_orchestrator.sqlite3) será criado na pasta atual.
python3 -m brln_orchestrator set-secret \
--amboss-token "SEU_TOKEN" \
--telegram-token "TOKEN_TELEGRAM" \
--telegram-chat "ID_CHAT" \
--lndg-url "http://HOST:PORTA" \
--lndg-user "usuario" \
--lndg-pass "senha" \
--lndg-db-path "/caminho/para/lndg/data/db.sqlite3" \
--bos-path "/caminho/para/bos" \
--lncli-path "/caminho/para/lncli"- Caso não utilize Telegram, omita os parâmetros correspondentes.
Por padrão, o orquestrador usa o bos (Balance of Satoshis) para atualizar taxas dos canais. Cada chamada ao bos abre um novo processo e uma nova conexão com o LND, o que pode sobrecarregar o PostgreSQL se o LND usar esse backend.
A LND REST API resolve esse problema usando uma sessão HTTP persistente (keep-alive), reutilizando a mesma conexão para todas as atualizações.
| BOS (padrão) | REST API |
|---|---|
| 1 processo por canal | 1 sessão HTTP reutilizada |
| Cada processo abre conexão LND→PostgreSQL | Uma conexão persistente |
| Overhead de Node.js | Python nativo |
python3 -m brln_orchestrator set-secret \
--lnd-rest-host "localhost:8080" \
--lnd-macaroon-path "/caminho/para/.lnd/data/chain/bitcoin/mainnet/admin.macaroon" \
--lnd-tls-cert-path "/caminho/para/.lnd/tls.cert" \
--use-lnd-rest 1--lnd-rest-host: Host e porta da REST API do LND (padrão:localhost:8080)--lnd-macaroon-path: Caminho doadmin.macaroon(padrão:~/.lnd/data/chain/bitcoin/mainnet/admin.macaroon)--lnd-tls-cert-path: Caminho dotls.cert(padrão:~/.lnd/tls.cert)--use-lnd-rest 1: Ativa a REST API (use0para voltar ao BOS)
grep -i "restlisten" ~/.lnd/lnd.conf
# Exemplo: restlisten=0.0.0.0:8080Ao iniciar, o orquestrador exibirá 🔌 Usando LND REST API (sessão persistente) se a REST API estiver ativa.
Importe listas antigas (pubkeys ou channel IDs) uma única vez:
python3 migrate-exclusion.py --db brln_orchestrator.sqlite3 \
--autofee brln-autofee.py \
--ar lndg_AR_trigger.pyO mesmo utilitário também migra a FORCE_SOURCE_LIST do trigger legado para a nova tabela dedicada.
Gerencie manualmente:
python3 -m brln_orchestrator exclusions add 0247... --note "Parceiro"
python3 -m brln_orchestrator exclusions rm 0247...
python3 -m brln_orchestrator exclusions listUse sempre pubkeys para excluir do Autofee e channel IDs para excluir do Rebalance.
As exclusões são aplicadas tanto no AutoFee (pubkeys) quanto no AR Trigger (channel IDs). Em dry-run, o console lista as entradas ignoradas para conferência rápida.
Canal em FORCE_SOURCE_LIST continua válido, agora via SQLite:
python3 -m brln_orchestrator forced-sources add 9737... --note "nome do peer"
python3 -m brln_orchestrator forced-sources rm 9737...
python3 -m brln_orchestrator forced-sources listEm dry-run, o AR Trigger mostra os canais forçados antes de executar o legado.
EXCL_DRY_VERBOSE=1força o AutoFee a mostrar no console/Telegram as alterações "🚷excl-dry" (executa dry-run apenas para consulta).
Exemplo:
EXCL_DRY_VERBOSE=1 python3 -m brln_orchestrator run --dry-run-autofee --dry-run-arpython3 -m brln_orchestrator run \
--mode moderado \
--dry-run-autofee \
--dry-run-ar \
--dry-run-tuner \
--loop-interval-autofee 120 \
--loop-interval-ar 120 \
--loop-interval-tuner 600python3 -m brln_orchestrator run \
--mode moderado \
--monthly-profit-ppm 200 \
--monthly-profit-sat 200000 \
--loop-interval-autofee 3600 \
--loop-interval-ar 300 \
--loop-interval-tuner 7200 \
--no-dry-run-autofee \
--no-dry-run-ar \
--no-dry-run-tuner \
--didactic-explain \
--didactic-detailedPor padrão, os intervalos são 600s (AutoFee), 300s (AR) e 1800s (Tuner).
Ajuste conforme a cadência desejada; para observar apenas um módulo, defina intervalos altos nos demais (ex.: --loop-interval-ar 3600).
Use --no-autofee, --no-ar ou --no-tuner para desativar loops específicos.
Adicione --once para executar uma única rodada e encerrar.
Se voce tiver ligado algum --dry-run-* em execucoes anteriores e quiser voltar ao modo real, utilize as flags opostas para limpar o estado persistido: --no-dry-run-autofee, --no-dry-run-ar e/ou --no-dry-run-tuner. As flags de dry-run existem tambem para o Tuner; lembre-se de desativa-las se quiser que ele aplique overrides definitivos.
Os modos aplicam presets definidos em brln_orchestrator/presets_modes.payload_json, ajustando limites do AutoFee e do AR Trigger antes de cada ciclo:
- conservador (padrão): reduz teto e passos, alonga cooldowns e reforça o peg pelo outrate para priorizar estabilidade de margem.
- moderado: libera passos medianos, aumenta bump para drenados recorrentes e suaviza o ROI-cap para equilibrar receita e utilização.
- agressivo: amplia step-cap e surges, encurta cooldowns e torna o ROI-cap mais permissivo (sink até 90% do preço observado), reagindo mais rápido.
Escolha o modo com --mode (ou defina o padrão rodando uma única vez); o preset correspondente é carregado automaticamente nos loops seguintes.
Informe --monthly-profit-ppm e/ou --monthly-profit-sat para orientar o AI Param Tuner.
As metas são convertidas para a janela de 7 dias, e o tuner ajusta gradualmente overrides como SURGE_K, TOP_REVENUE_SURGE_BUMP, REBAL_FLOOR_MARGIN, OUTRATE_FLOOR_FACTOR e cooldowns até convergir com a margem desejada.
Os valores resultantes são persistidos em overrides (scope autofee) e aplicados a cada ciclo do orquestrador.
python3 -m brln_orchestrator show-configAs principais tabelas incluem:
meta: pares chave/valor (versão, settings, etc.)secrets: credenciais e caminhos externosautofee_cache,autofee_state: estados legados migrados do JSONoverrides: overrides do tuner (scope = 'autofee')legacy_store: armazenamento genérico para dados herdados (autofee_meta,assisted_ledger, etc.)telemetry_log: registros de log por componente (autofee,ar,tuner)amboss_series: cache de séries da Ambossexclusions: pubkeys e channel IDs excluídosforced_sources: channel IDs fixados como source no AR Trigger
Não há arquivos JSON ou TXT externos; todo o estado persistente fica no SQLite.
O projeto possui um sistema de logging centralizado com arquivos rotativos:
logs/brln.log- Log principal (INFO+)logs/brln.error.log- Apenas erros (ERROR+)
Configurável via variáveis de ambiente:
| Variável | Valores | Padrão |
|---|---|---|
BRLN_LOG_LEVEL |
DEBUG, INFO, WARNING, ERROR | INFO |
BRLN_LOG_FORMAT |
text, json | text |
BRLN_LOG_CONSOLE |
true, false | true |
BRLN_LOG_FILE |
true, false | true |
Exemplo com debug:
BRLN_LOG_LEVEL=DEBUG python3 -m brln_orchestrator run ...Além disso, as saídas são gravadas em telemetry_log no SQLite:
sqlite3 brln_orchestrator.sqlite3 "SELECT ts,component,level,msg FROM telemetry_log ORDER BY ts DESC LIMIT 20;"Para rodar o orquestrador como serviço do sistema:
sudo nano /etc/systemd/system/brln-autofee.serviceCole o seguinte conteúdo (ajuste os caminhos e parâmetros conforme necessário):
[Unit]
Description=BRLN AutoFee Orchestrator - Lightning Network Fee Manager
After=lnd.service
Wants=lnd.service
[Service]
Type=simple
User=lnd
Group=lnd
WorkingDirectory=/home/lnd/brln-autofee
Environment="PATH=/home/lnd/brln-autofee/.venv/bin:/usr/local/bin:/usr/bin:/bin"
ExecStart=/home/lnd/brln-autofee/.venv/bin/python3 -m brln_orchestrator run \
--mode moderado \
--no-dry-run-autofee \
--no-dry-run-ar \
--no-dry-run-tuner \
--loop-interval-autofee 3600 \
--loop-interval-ar 300 \
--loop-interval-tuner 7200
Restart=always
RestartSec=30
StandardOutput=journal
StandardError=journal
[Install]
WantedBy=multi-user.targetsudo systemctl daemon-reload
sudo systemctl enable brln-autofee
sudo systemctl start brln-autofeesudo systemctl status brln-autofee
sudo journalctl -fu brln-autofeePara remover o banco local:
rm brln_orchestrator.sqlite3(Crie um backup antes).
O .gitignore já ignora *.sqlite3 e .venv/.