Plataforma

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_TOKENa conta do bot
MATRIX_STANDUP_ROOM_IDa sala de standup por defeito
MATRIX_ADMIN_TOKENtoken de administrador do homeserver para aprovisionamento e consultas; apenas no ambiente, nunca persistido
SECRET_KEYuma cadeia aleatória com 64 ou mais caracteres que assina as sessões do painel
DATABASE_URLsqlite por defeito, ou um URL Postgres
BOOTSTRAP_ADMIN_MATRIX_IDo primeiro administrador, promovido no arranque
AI_PROVIDER e a chave do fornecedorver Fornecedores de IA
INTEGRATION_VAULT_KEYa chave que cifra as credenciais de integração guardadas
TZ, MAX_BODY_BYTES, AI_REASONING_MODELopcionais

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.