Estado: vigente desde 2026-05-05
El repo no debe contener secretos operativos reales. La aplicacion lee configuracion sensible desde variables de entorno o EnvironmentFile de systemd.
Ruta protegida:
/etc/ops-center/
Archivos:
auth.env: usuario bootstrap, token de servicio, proxy/cookie/auth.db.env: conexion PostgreSQL de la app.Permisos esperados:
root:root 600 /etc/ops-center/auth.env
root:root 600 /etc/ops-center/db.env
Systemd carga esos archivos mediante drop-ins:
ops-center.service.d/10-auth-hardening.confops-center.service.d/20-db.confops-dispatch-launcher.service.d/10-auth-hardening.confops-templates-scheduler.service.d/10-db.confDB:
PGHOST=localhost
PGPORT=5432
PGDATABASE=ops_center
PGUSER=ops
PGPASSWORD=<secret>
Auth/servicio:
OPS_ADMIN_USER=<bootstrap-admin>
OPS_ADMIN_PASSWORD=<secret>
OPS_SERVICE_TOKEN=<secret>
OPS_CREDENTIALS_KEY=<base64-32-bytes>
TRUST_PROXY=true
OPS_ADMIN_PASSWORD solo se usa si no existe ningun app_users activo.
OPS_CREDENTIALS_KEY cifra la boveda de credenciales de agentes; no debe rotarse sin re-cifrar los registros existentes.
/etc/ops-center/auth.env.ops_settings.service_api_token.systemctl restart ops-center.service ops-dispatch-launcher.service.X-OPS-Service-Token.No publicar el token en docs, commits, logs ni tickets.
Los usuarios pueden registrar credenciales desde Cuenta y acceso -> Credenciales.
Reglas:
agent_credentials.secret_encrypted.secret_preview y secret_fingerprint.personal pertenecen a un usuario; las credenciales workspace son compartidas y requieren rol admin del workspace para crearse o modificarse.agent_slug solo usa credenciales workspace; una credencial personal solo se inyecta si una tarea/target la referencia de forma explicita.usage separa credenciales de agent, deployment, server, provider y other.X-OPS-Service-Token pueden resolver secretos para runtime.POST /api/agent-credentials/resolve por workspace_id y agent_slug.Mapeo por defecto:
provider_slug=openai -> OPENAI_API_KEYprovider_slug=anthropic|claude -> ANTHROPIC_API_KEYprovider_slug=minimax -> MINIMAX_API_KEYprovider_slug=google|gemini -> GOOGLE_API_KEYSe puede forzar otra variable con metadata.env_var.
Los servidores/entornos se gestionan como deployment_targets:
credential_id, pero debe ser scope=workspace y usage=deployment|server|other.deployment_target_id.credential_id, el launcher tambien solicita esa credencial al resolver env de runtime.Regla operativa: cualquier tarea de despliegue debe tratarse como accion sensible. El agente debe registrar comandos/resultados y no ejecutar acciones destructivas sin Human Gate.
Una tarea puede referenciar deployment_target_id.
Cuando hay target:
POST /api/tasks/:id/dispatch crea o exige Human Gate antes de encolar.GET /api/dispatch/next entrega el checklist al launcher.Las tareas con deployment_target_id o tags sensibles (prod, production, deploy, deployment, release, server, ssh, security, billing, client-comms, supervision) requieren aprobacion humana antes de entrar en dispatch.
Flujo:
POST /api/tasks/:id/dispatch crea/retorna un gate pendiente y responde 409 human_gate_required si falta aprobacion.POST /api/tasks/:id/human-gate/approve.ops_settings.human_gate_approval_hours (24h por defecto).GET /api/dispatch/next y POST /api/dispatch/claim ignoran o bloquean tareas sensibles sin gate aprobado.Las operaciones sensibles escriben eventos append-only en audit_events.
Incluye:
La auditoria no almacena secretos: campos con nombres tipo secret, token, password, key, credential, hash o encrypted se redactan en metadata.
Consulta:
GET /api/audit-events devuelve eventos del workspace activo para roles admin u owner.include_global=true solo funciona para administradores de plataforma.Cuenta y acceso -> Auditoria permite filtrar por accion, entidad, texto y limite.Las migraciones de esquema con claves foraneas deben ejecutarse con rol propietario/superusuario (postgres) y APP_DB_ROLE=ops para dejar grants correctos al usuario de aplicacion.