Plataforma

Autoalojamiento

La misma imagen se ejecuta en su servidor o en el nuestro. Esta página es la vista del operador: qué configurar, qué poner delante y cómo mantenerlo en marcha sin que nada salga del edificio.

Disposición

  • Un único proceso Python ejecuta el escucha de chat, el planificador y la API con el panel en un solo bucle de eventos.
  • El contenedor escucha solo en la interfaz de loopback; un proxy inverso (Nginx o Caddy) termina TLS y le reenvía el tráfico.
  • El estado vive en un directorio de datos: la base de datos SQLite, las subidas, los datos GeoIP, las claves generadas y los pesos del modelo. Para despliegues en varios servidores, DATABASE_URL puede apuntar a Postgres; el conjunto de migraciones aditivas funciona en ambos.
  • El servidor de chat (Synapse u otro homeserver Matrix) puede estar en cualquier lugar accesible.

Entorno

MATRIX_HOMESERVER, MATRIX_USER_ID, MATRIX_ACCESS_TOKENla cuenta del bot
MATRIX_STANDUP_ROOM_IDla sala de standup por defecto
MATRIX_ADMIN_TOKENtoken de administrador del homeserver para aprovisionamiento y consultas; solo en el entorno, nunca se persiste
SECRET_KEYuna cadena aleatoria de 64 o más caracteres que firma las sesiones del panel
DATABASE_URLsqlite por defecto, o una URL de Postgres
BOOTSTRAP_ADMIN_MATRIX_IDel primer administrador, promocionado al arrancar
AI_PROVIDER y la clave del proveedorvéase Proveedores de IA
INTEGRATION_VAULT_KEYla clave que cifra las credenciales de integración guardadas
TZ, MAX_BODY_BYTES, AI_REASONING_MODELopcionales

Proxy inverso

  • Reenviar X-Forwarded-For y X-Forwarded-Proto; sin la segunda, el producto no puede distinguir HTTP de HTTPS y omite la cabecera HSTS.
  • Habilitar la compresión de las respuestas proxificadas y HTTP/2; el panel carga decenas de recursos en un arranque en frío.
  • Nunca comprimir ni almacenar en búfer el endpoint del flujo de eventos; las actualizaciones en vivo son eventos enviados por el servidor.
  • La limitación de tasa por IP es tarea del proxy; el producto limita por sí mismo las solicitudes de código y los inicios de sesión.
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
gzip_proxied any;
http2 on;

Cabeceras de seguridad y límites

Cada respuesta lleva nosniff, denegación de marcos, una política sin referente, una política de permisos restrictiva, un HSTS de dos años sobre TLS y una política de seguridad de contenido. Los cuerpos de las solicitudes tienen un tope de 5 MiB por defecto. Cada entrada se valida por esquema antes de que se ejecute un gestor; los ID de chat se comprueban con una expresión regular antes de cualquier llamada al homeserver; el HTTP saliente está fijado al homeserver y al host del proveedor configurado.

Operar

  • Actualizar: pull, reconstruir, reiniciar. Las migraciones se ejecutan al arrancar y omiten lo que ya existe.
  • Copia de seguridad del directorio de datos cada noche; con Postgres, pg_dump.
  • Salud: un endpoint de vitalidad rápido y sin autenticación para la comprobación del contenedor, y uno detallado restringido a administradores con tiempo activo, tamaño de la base de datos y estado del proveedor.
  • GeoIP: ejecutar el script de actualización semanalmente (db-ip Lite sin clave, o MaxMind con una clave gratuita); una copia en el volumen de datos se detecta al reiniciar sin configuración.
  • El planificador sostiene la jornada: muestras de presencia cada cinco minutos, comprobaciones de ausencia cada quince, consolidaciones nocturnas y materialización de puntuaciones, resúmenes e informes en sus cadencias.
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

Aislado de la red

Con un servidor Matrix autoalojado, Ollama como proveedor, una base de datos de IP local en el servidor, las respuestas habladas desactivadas y ninguna integración habilitada, el producto no necesita internet en absoluto. No hay telemetría, ni balizas de uso, ni informes de fallos que llamen fuera; no sale ni un byte a menos que se configure un destino.