Auto-alojamento
A mesma imagem corre no vosso servidor ou no nosso. Esta página é a vista do operador: o que definir, o que pôr à frente, e como o manter a correr sem que nada saia do edifício.
Disposição
- Um único processo Python corre o escutador de chat, o agendador e a API com o painel num único ciclo de eventos.
- O contentor escuta apenas na interface de loopback; um proxy inverso (Nginx ou Caddy) termina o TLS e reencaminha para ele.
- O estado vive numa diretoria de dados: a base de dados SQLite, os carregamentos, os dados GeoIP, as chaves geradas e os pesos do modelo. Apontem DATABASE_URL para Postgres em implementações com vários servidores; o conjunto de migrações aditivas funciona em ambos.
- O servidor de chat (Synapse ou outro homeserver Matrix) pode estar em qualquer lugar acessível.
Ambiente
| MATRIX_HOMESERVER, MATRIX_USER_ID, MATRIX_ACCESS_TOKEN | a conta do bot |
|---|---|
| MATRIX_STANDUP_ROOM_ID | a sala de standup por defeito |
| MATRIX_ADMIN_TOKEN | token de administrador do homeserver para aprovisionamento e consultas; apenas no ambiente, nunca persistido |
| SECRET_KEY | uma cadeia aleatória com 64 ou mais caracteres que assina as sessões do painel |
| DATABASE_URL | sqlite por defeito, ou um URL Postgres |
| BOOTSTRAP_ADMIN_MATRIX_ID | o primeiro administrador, promovido no arranque |
| AI_PROVIDER e a chave do fornecedor | ver Fornecedores de IA |
| INTEGRATION_VAULT_KEY | a chave que cifra as credenciais de integração guardadas |
| TZ, MAX_BODY_BYTES, AI_REASONING_MODEL | opcionais |
Proxy inverso
- Reencaminhem X-Forwarded-For e X-Forwarded-Proto; sem este último, o produto não consegue distinguir HTTP de HTTPS e omite o cabeçalho HSTS.
- Ativem a compressão das respostas em proxy e o HTTP/2; o painel carrega dezenas de recursos num carregamento a frio.
- Nunca comprimam nem coloquem em buffer o endpoint do fluxo de eventos; as atualizações em direto são eventos enviados pelo servidor.
- A limitação de débito por IP é tarefa do proxy; o produto limita por si próprio os pedidos de código e os inícios de sessão.
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; gzip_proxied any; http2 on;
Cabeçalhos de segurança e limites
Todas as respostas transportam nosniff, recusa de frames, uma política sem referrer, uma política de permissões restritiva, um HSTS de dois anos em TLS e uma política de segurança de conteúdo. Os corpos dos pedidos estão limitados a 5 MiB por defeito. Todas as entradas são validadas por esquema antes de um tratador correr; os IDs de chat são verificados por expressão regular antes de qualquer chamada ao homeserver; o HTTP de saída está fixado ao homeserver e ao servidor do fornecedor configurado.
Operar
- Atualizar: pull, rebuild, restart. As migrações correm no arranque e saltam o que já existe.
- Façam cópia de segurança da diretoria de dados todas as noites; para Postgres usem pg_dump.
- Saúde: um endpoint de vivacidade rápido e sem autenticação para a verificação do contentor, e um detalhado, reservado a administradores, com tempo de atividade, tamanho da base de dados e estado do fornecedor.
- GeoIP: corram o script de atualização semanalmente (db-ip Lite sem chave, ou MaxMind com uma chave gratuita); uma cópia no volume de dados é apanhada no reinício sem configuração.
- O agendador gere o dia de trabalho: amostras de presença a cada cinco minutos, verificações de ausência a cada quinze, agregações noturnas e materialização de pontuações, resumos e relatórios nas suas cadências.
docker compose up -d --build docker exec inroots sqlite3 /app/data/standup.db ".backup /tmp/backup.db" GEO_DATA_DIR=/app/data/geo scripts/update_geoip.sh
Isolado da rede
Com um servidor Matrix auto-alojado, o Ollama como fornecedor, uma base de dados de IP local no servidor, as respostas faladas desligadas e nenhuma integração ativada, o produto não precisa de internet de todo. Não há telemetria, nem sinal de utilização, nem relator de falhas a contactar o exterior; zero bytes saem, a menos que configurem um destino.