Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
35 commits
Select commit Hold shift + click to select a range
8469dcf
feat: identidade por produto, containers padronizados e o painel para…
elielsousa-pathbit Sep 12, 2026
1e849fb
Isolar cada stack em rede, hostname e faixa de enderecos proprios
elielsousa-pathbit Sep 12, 2026
dd9a3d9
Nao marcar como invalida a credencial que nao conseguimos ler
elielsousa-pathbit Sep 12, 2026
e90128b
Nao afirmar saude que nao foi medida, e dar ao log um lugar gravavel
elielsousa-pathbit Sep 12, 2026
3558df3
Prender o painel do Makefile ao loopback, com guarda que impede o ret…
elielsousa-pathbit Sep 13, 2026
0dc5444
Tirar a credencial de fabrica do texto de --help
elielsousa-pathbit Sep 13, 2026
db0f1de
Doc de licencas x usuarios, com os scripts que reproduzem cada numero
elielsousa-pathbit Sep 13, 2026
42853fd
Contrato de identidade visual travado por teste
elielsousa-pathbit Sep 13, 2026
a58344e
Traduzir o rotulo da saida de rede, e calar o cabecalho Server
elielsousa-pathbit Sep 13, 2026
a43a1d0
Dar icone a aba do painel, que era a unica pagina sem ele
elielsousa-pathbit Sep 13, 2026
0e7d23e
Tela de login propria, e o grid que finalmente cabe na tela
elielsousa-pathbit Sep 13, 2026
25609a0
Freio contra forca bruta no login: 429, espera que cresce e prova de …
elielsousa-pathbit Sep 13, 2026
67010df
Barra do topo com tres controles, e o carimbo que se estragava sozinho
elielsousa-pathbit Sep 13, 2026
2f2ffdc
Guarda: nada responde sem sessao, exceto o que tem motivo declarado
elielsousa-pathbit Sep 13, 2026
74e3502
Tirar a senha real de dentro do teste que existe para impedir isso
elielsousa-pathbit Sep 13, 2026
2d5b279
Encadear o LiteLLM nos gateways, e um teste que nao mente sobre isso
elielsousa-pathbit Sep 13, 2026
41c35d1
Dificuldade da prova de trabalho cresce com a insistencia
elielsousa-pathbit Sep 13, 2026
6f52da2
Fazer o botao Sair sair de verdade, e 404 para rota que nao existe
elielsousa-pathbit Sep 13, 2026
c4d4266
SSO por OIDC e SAML2, e os seis cartoes iguais nos tres paineis
elielsousa-pathbit Sep 13, 2026
6470786
O canone dos irmaos, e a catraca que o mede sem mentir
elielsousa-pathbit Sep 14, 2026
a7af27f
A wiki para de anunciar o que a tela nao tem mais
elielsousa-pathbit Sep 14, 2026
5e83171
A unica excecao a "container_name igual ao hostname", explicada
elielsousa-pathbit Sep 14, 2026
a3d91c2
O catalogo de traducoes passa a ser o MESMO arquivo nos tres
elielsousa-pathbit Sep 14, 2026
ba5b139
O README do OminiRTkSync deixa de estar meio em cada idioma
elielsousa-pathbit Sep 14, 2026
7f9e60d
Um leitor de data so: o normalizer e o models discordavam em 3 horas
elielsousa-pathbit Sep 14, 2026
f176617
A celula do grid de modelos nunca mais fica em branco
elielsousa-pathbit Sep 14, 2026
c96aba4
O modal de SSO parava de dar o mesmo aviso duas vezes
elielsousa-pathbit Sep 14, 2026
a9dafb6
A tela do LiteLlm parava de dizer que o gateway respondeu quando ele …
elielsousa-pathbit Sep 14, 2026
5d1ae70
O rodape da Pathbit em toda tela do produto -- menos em uma, de propo…
elielsousa-pathbit Sep 14, 2026
fa13ee7
A barra de paginacao mostrava a chave crua, e o historico nao paginava
elielsousa-pathbit Sep 14, 2026
0d42b2e
As tres portas do SAML2 nos tres paineis
elielsousa-pathbit Sep 14, 2026
be125d0
Duas rotas que o servidor prometia e nao servia
elielsousa-pathbit Sep 14, 2026
0a35628
feat(auth): desafio interativo direto de selecao de icones no login a…
elielsousa-pathbit Sep 14, 2026
db31fc0
chore(vscode): ignorar repositorios de tmp no source control do editor
elielsousa-pathbit Sep 14, 2026
7894266
chore: sincronizar master em feat/identidade-e-padronizacao
elielsousa-pathbit Sep 14, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
41 changes: 39 additions & 2 deletions .env.example
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ DB_PATH=/app/data/storage.sqlite
# 2. Conectividade com o Gateway OmniRoute
# ------------------------------------------------------------------------------
# URL base do gateway OmniRoute para testes de conexao e diagnosticos
OMNIROUTE_URL=http://127.0.0.1:20128
OMNIROUTE_URL=http://ominirtk-router:20128

# ------------------------------------------------------------------------------
# 3. Parametros de Sincronizacao e Agendador Cron
Expand Down Expand Up @@ -85,7 +85,7 @@ DASHBOARD_PASSWORD=

# Deixou DASHBOARD_PASSWORD vazia? O container gera uma credencial de
# recuperacao no primeiro boot. Leia e entre com ela como usuario 'admin':
# docker exec ominirtksync cat /app/data/.dashboard_recovery
# docker exec ominirtk-sync cat /app/data/.dashboard_recovery
# Depois defina a sua senha pela tela.
#
# Com DASHBOARD_PASSWORD preenchida, o ambiente vira a fonte da verdade e a
Expand All @@ -99,6 +99,26 @@ DASHBOARD_PASSWORD=
# quando e necessaria.
# DASHBOARD_RECOVERY_HASH=

# ------------------------------------------------------------------------------
# Entrada federada (SSO / OpenID Connect) -- opcional
# ------------------------------------------------------------------------------
# O SSO e configurado PELA TELA (botao Configuracoes no cabecalho do painel), e
# nao por variaveis: issuer, client_id, endereco publico e lista de autorizados
# ficam no banco de preferencias. Estas duas variaveis existem porque nao
# pertencem ao banco.
#
# Segredo do cliente OAuth. Quando preenchido aqui, o ambiente VENCE o arquivo
# .sso_client_secret (modo 0600) e a tela trava o campo, do mesmo jeito que faz
# com DASHBOARD_PASSWORD. E um segredo: o lugar dele e o seu .env, que nunca e
# versionado, jamais este arquivo de exemplo.
# OIDC_CLIENT_SECRET=

# Interruptor de emergencia. Com 1, a entrada federada e desligada sem tocar no
# banco e nenhuma rota /sso/* responde -- o formulario local volta a ser a unica
# porta. E o que salva quando o provedor de identidade cai e o painel esta atras
# de um tunel: suba com a variavel e entre com usuario e senha.
SSO_DISABLED=0

# ------------------------------------------------------------------------------
# Log persistente em arquivo
# ------------------------------------------------------------------------------
Expand Down Expand Up @@ -127,3 +147,20 @@ REQUIRE_LOGIN=false
# que uma conexao esta saudavel so por carregar uma credencial.
CREDENTIAL_CHECK_ENABLED=1
CREDENTIAL_CHECK_TIMEOUT=8

# --- Acesso remoto (opcional) ------------------------------------------------
# Só têm efeito quando você sobe o perfil correspondente:
# docker compose --profile tunel up -d
# docker compose --profile tailnet up -d
# Leia docs/wiki/Remote-Access.md ANTES de ligar qualquer um dos dois: com a
# porta em 127.0.0.1 o painel só é alcançado por esta máquina, e um túnel
# inverte isso.

# Vazio = quick tunnel da Cloudflare: URL nova a cada subida, pública para quem
# a tiver. Preenchido com o token de um túnel nomeado = URL estável e a
# possibilidade de pôr o Cloudflare Access na frente.
TUNNEL_TOKEN=

# Chave efêmera gerada em https://login.tailscale.com/admin/settings/keys
# (efêmera para o nó sumir sozinho quando o contêiner morrer).
TS_AUTHKEY=
2 changes: 1 addition & 1 deletion .github/workflows/cleanup-packages.yml
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ name: Package Retention
# Historico: a primeira versao deste arquivo nao era limpeza. Com
# min-versions-to-keep: 0 e delete-only-untagged-versions: false ela apagava
# TODAS as versoes e em seguida removia o proprio package via API. Quem
# estivesse puxando ghcr.io/pathbit/ominirtksyncatest ficava sem imagem.
# estivesse puxando ghcr.io/pathbit/ominirtksync ficava sem imagem.
#
# A segunda versao corrigia isso, mas usava actions/delete-package-versions,
# que trata cada manifesto como uma versao independente. O build e multi-arch
Expand Down
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -1231,6 +1231,9 @@ temp/
# Credenciais do painel: o hash de recuperacao e a senha em texto herdada.
.dashboard_recovery
.dashboard_auth.json
# Segredo do cliente OAuth da entrada federada. Mora no diretorio de dados
# (modo 0600), mas em execucao local esse diretorio pode ser o proprio repo.
.sso_client_secret
# Log persistente: pode conter endereco, nome de conexao e mensagem de erro.
*.log
logs/
Expand Down
21 changes: 11 additions & 10 deletions .vscode/settings.json
Original file line number Diff line number Diff line change
@@ -1,12 +1,13 @@
{
"editor.formatOnSave": true,
"editor.defaultFormatter": "esbenp.prettier-vscode",
"editor.formatOnPaste": true,
"explorer.autoReveal": true,
"explorer.compactFolders": false,
"files.exclude": {
"**/.git": false
},
"claudeCode.includeCoAuthoredBy": false,
"git.includeCoAuthoredBy": false
"editor.formatOnSave": true,
"editor.defaultFormatter": "esbenp.prettier-vscode",
"editor.formatOnPaste": true,
"explorer.autoReveal": true,
"explorer.compactFolders": false,
"files.exclude": {
"**/.git": false
},
"claudeCode.includeCoAuthoredBy": false,
"git.includeCoAuthoredBy": false,
"git.ignoredRepositories": ["**/tmp/**"]
}
5 changes: 5 additions & 0 deletions Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,11 @@ COPY pyproject.toml /app/
RUN pip install --no-cache-dir --upgrade pip && \
pip install --no-cache-dir -e .

# Criado na imagem, com o dono que o compose usa: um volume nomeado herda o
# dono do diretorio que cobre. Sem isto ele nasce root e o processo (uid 1000)
# nao consegue escrever o proprio log.
RUN mkdir -p /app/logs && chown -R 1000:1000 /app/logs

EXPOSE 9090

HEALTHCHECK --interval=15s --timeout=5s --start-period=10s --retries=3 \
Expand Down
19 changes: 17 additions & 2 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,17 @@
# Cria o .env a partir do .env.example. Nunca sobrescreve um .env existente:
# ele carrega os seus segredos, e um `make setup` distraido nao pode apaga-los.
# O docker compose le esse .env sozinho, por estar ao lado do compose.
setup:
# A rede de inferencia e compartilhada pelos tres gateways e declarada como
# externa nos tres composes -- externa justamente para que nenhuma das stacks
# seja dona dela: qualquer uma pode subir primeiro, e derrubar uma nao leva a
# rede junto. O preco e que ela precisa existir antes do primeiro `up`, e o
# compose so diz "network declared as external, but could not be found".
rede-de-inferencia:
@docker network inspect rtk-inference-net >/dev/null 2>&1 \
|| docker network create rtk-inference-net >/dev/null \
&& echo "rede rtk-inference-net pronta."

setup: rede-de-inferencia
@if [ -f .env ]; then \
echo ".env ja existe — preservado."; \
else \
Expand Down Expand Up @@ -38,8 +48,13 @@ status:
docker-build:
docker build -t ominirtksync:latest -t ghcr.io/pathbit/ominirtksync:latest .

# O bind em 127.0.0.1 nao e detalhe: este painel le o banco do gateway e mostra
# a saude das credenciais. Sem o prefixo, "-p PORTA:9090" publica em TODA
# interface -- o Wi-Fi do cafe, a VLAN do escritorio -- enquanto os composes
# deste repo publicam so no loopback. Comentario FORA da receita: linha iniciada
# por # dentro de um alvo vai para o shell e aparece na saida.
docker-run:
docker run --rm -it --name ominirtksync -p 9092:9090 ominirtksync:latest
docker run --rm -it --name ominirtk-sync -p 127.0.0.1:9092:9090 ominirtksync:latest

clean:
find . -type d -name "__pycache__" -exec rm -rf {} +
Expand Down
Loading
Loading