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_TOKEN | la cuenta del bot |
|---|---|
| MATRIX_STANDUP_ROOM_ID | la sala de standup por defecto |
| MATRIX_ADMIN_TOKEN | token de administrador del homeserver para aprovisionamiento y consultas; solo en el entorno, nunca se persiste |
| SECRET_KEY | una cadena aleatoria de 64 o más caracteres que firma las sesiones del panel |
| DATABASE_URL | sqlite por defecto, o una URL de Postgres |
| BOOTSTRAP_ADMIN_MATRIX_ID | el primer administrador, promocionado al arrancar |
| AI_PROVIDER y la clave del proveedor | véase Proveedores de IA |
| INTEGRATION_VAULT_KEY | la clave que cifra las credenciales de integración guardadas |
| TZ, MAX_BODY_BYTES, AI_REASONING_MODEL | opcionales |
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.