Skip to content
GitHub

Troubleshooting Guide

Guía de diagnóstico y resolución de problemas comunes en Orchestrator, Sevastopol y PostgreSQL.


  • curl http://localhost:8000/health no responde
  • Frontend muestra “Network Error”
  • Logs muestran timeouts
Terminal window
# 1. Verificar estado del proceso
pm2 status orchestrator
# 2. Ver logs de error
pm2 logs orchestrator --err --lines 50
# 3. Verificar puerto
lsof -i :8000
CausaSolución
Proceso muertopm2 restart orchestrator
Puerto en usokill -9 $(lsof -t -i:8000) y reiniciar
OOM (Out of Memory)Aumentar RAM o reducir max_connections
DB connection failedVer sección “PostgreSQL No Conecta”

  • Error: connect ECONNREFUSED 127.0.0.1:5432
  • FATAL: connection refused
Terminal window
# 1. Verificar servicio PostgreSQL
sudo systemctl status postgresql
# 2. Verificar si está escuchando
pg_isready
# 3. Verificar logs
sudo tail -50 /var/log/postgresql/postgresql-16-main.log
CausaSolución
Servicio caídosudo systemctl start postgresql
Max connectionsAumentar max_connections en postgresql.conf
pg_hba.confVerificar que permite conexiones locales
Disco llenoLiberar espacio en disco

  • Timeouts en API (> 30s)
  • Dashboard carga lento
  • CPU PostgreSQL alto
-- Queries actualmente corriendo
SELECT pid, now() - pg_stat_activity.query_start AS duration, query
FROM pg_stat_activity
WHERE state = 'active'
ORDER BY duration DESC;
-- Top queries lentas (requiere pg_stat_statements)
SELECT query, calls, mean_exec_time::numeric(10,2) as mean_ms
FROM pg_stat_statements
ORDER BY mean_exec_time DESC
LIMIT 10;
CausaSolución
Missing indexCrear índice en columnas filtradas
Table bloatVACUUM ANALYZE <table>
Full table scanRevisar EXPLAIN ANALYZE
Lock contentionVer sección “Deadlocks”

Ejemplo - Agregar índice faltante:

-- Si query filtra por employee_id frecuentemente
CREATE INDEX CONCURRENTLY idx_contracts_employee
ON contracts(employee_id);

  • “Invalid credentials” en login
  • “Token expired”
  • 401 Unauthorized
Terminal window
# Verificar JWT_SECRET configurado
echo $JWT_SECRET | wc -c
# Debe ser > 32 caracteres
# Verificar que cookies se envían
curl -v --cookie-jar - http://localhost:8000/api/command/auth/login \
-H "Content-Type: application/json" \
-d '{"email":"[email protected]","password":"..."}'
CausaSolución
JWT_SECRET vacíoConfigurar en .env.production
Token expiradoRelogin (JWT expira en 24h)
Cookie no persisteVerificar SameSite y Secure flags
Usuario desactivadoUPDATE users SET active=true WHERE email='...'

  • “Tenant not found”
  • “Schema does not exist”
  • Datos mezclados entre clientes
-- Verificar que tenant existe
SELECT * FROM central.tenants WHERE id = '<TENANT_ID>';
-- Verificar que schema existe
SELECT nspname FROM pg_namespace WHERE nspname = 'tenant_<ID>';
-- Verificar search_path actual en sesión
SHOW search_path;
CausaSolución
Tenant no existeCrear tenant via admin
Schema borradoRestore from backup
search_path incorrectoVerificar middleware de tenant
Header X-Tenant-ID faltanteVerificar frontend envía header

  • npm run build falla
  • Errores de TypeScript
  • MDX parsing errors
Terminal window
# Limpiar cache
rm -rf node_modules/.vite
rm -rf dist
# Reinstalar dependencias
rm -rf node_modules
npm ci
# Build con verbose
npm run build -- --verbose
ErrorSolución
MDX parsing errorEscapar caracteres especiales (<, >, {, })
TypeScript errorCorregir tipos o usar // @ts-ignore temporal
Memory heapNODE_OPTIONS="--max-old-space-size=4096" npm run build
Dependency conflictBorrar lockfile y regenerar

  • “Access-Control-Allow-Origin” error en browser
  • Requests bloqueados en frontend
  • Preflight OPTIONS fallando
Terminal window
# Verificar headers de respuesta
curl -v -X OPTIONS http://localhost:8000/api/query/employees \
-H "Origin: http://localhost:4321" \
-H "Access-Control-Request-Method: GET"
CausaSolución
Origin no permitidoAgregar origin a lista de CORS
Credentials no permitidasAccess-Control-Allow-Credentials: true
Headers no permitidosAgregar headers a Allow-Headers
Nginx proxyVerificar config de proxy_set_header

Config ejemplo (Orchestrator):

app.use(
cors({
origin: ["http://localhost:4321", "https://app.nostromo.cl"],
credentials: true,
allowedHeaders: ["Content-Type", "Authorization", "X-Tenant-ID"],
}),
);

  • RAM de proceso crece constantemente
  • pm2 monit muestra memoria subiendo
  • OOM kills en logs del sistema
Terminal window
# Monitorear memoria en tiempo real
pm2 monit
# Ver memoria del proceso
ps aux | grep node
# Generar heap dump (Node.js)
kill -USR2 <PID>
CausaSolución
Event listeners sin cleanupRevisar removeEventListener
DB connections no cerradasVerificar pool.release()
Cache sin límiteAgregar LRU cache con max size
Circular referencesUsar WeakMap/WeakRef

Configuración de restart automático:

Terminal window
# PM2 - restart cuando excede 500MB
pm2 start dist/server.js --name orchestrator --max-memory-restart 500M

  • “deadlock detected” en logs
  • Transactions colgadas
  • Queries que nunca terminan
-- Ver locks actuales
SELECT
blocked.pid as blocked_pid,
blocked.query as blocked_query,
blocking.pid as blocking_pid,
blocking.query as blocking_query
FROM pg_stat_activity blocked
JOIN pg_locks blocked_locks ON blocked.pid = blocked_locks.pid
JOIN pg_locks blocking_locks
ON blocked_locks.locktype = blocking_locks.locktype
AND blocked_locks.relation = blocking_locks.relation
AND blocked_locks.pid != blocking_locks.pid
JOIN pg_stat_activity blocking ON blocking_locks.pid = blocking.pid
WHERE NOT blocked_locks.granted;
CausaSolución
Transaction largaReducir tamaño de transactions
Lock order inconsistenteOrdenar acceso a tablas consistentemente
Lock timeout bajoSET lock_timeout = '10s'
Query bloqueandoSELECT pg_cancel_backend(<PID>)

  • “No space left on device”
  • PostgreSQL read-only mode
  • Logs no se escriben
Terminal window
# Ver uso de disco
df -h
# Encontrar archivos grandes
du -sh /* | sort -rh | head -20
# Ver logs grandes
du -sh /var/log/*
CausaSolución
Logs grandesRotar logs: logrotate -f /etc/logrotate.conf
WAL acumuladopg_switch_wal() + verificar replicación
Backups localesMover a storage remoto
Core dumpsBorrar /var/crash/*

Terminal window
# Orchestrator
pm2 logs orchestrator --lines 100
# PostgreSQL
sudo tail -f /var/log/postgresql/postgresql-16-main.log
# Nginx
sudo tail -f /var/log/nginx/error.log
# System
sudo journalctl -u orchestrator -f
Terminal window
# CPU y memoria
htop
# Disco I/O
iotop
# Network
nethogs
# PostgreSQL stats
psql -c "SELECT * FROM pg_stat_activity;"

NivelProblemaContacto
L1Servicio caídoOn-call engineer
L2Data corruptionDBA team
L3Security breachSecurity team + management


FechaVersionCambios
2026-01-181.0Guía inicial creada