Troubleshooting Guide
Common issues and solutions for Sibyl deployments.
Connection Issues
Cannot Connect to API
Symptoms:
- Connection refused on port 3334
- Frontend shows "Cannot connect to server"
Solutions:
Check if server is running:
bash# Docker Compose docker compose --env-file ~/.sibyl/prod.env ps # Kubernetes kubectl get pods -n sibylCheck server logs:
bash# Docker Compose docker compose --env-file ~/.sibyl/prod.env logs backend # Kubernetes kubectl logs -n sibyl -l app.kubernetes.io/component=backendVerify port binding:
bash# Check what's listening lsof -i :3334 netstat -tlnp | grep 3334Check firewall rules (if applicable)
Database Connection Errors
SurrealDB Connection Refused:
surrealdb error: connection refusedSolutions:
Verify SurrealDB is running:
bashdocker compose --env-file ~/.sibyl/prod.env ps surrealdb kubectl get pods -n sibyl -l app=surrealdbCheck connection settings:
bash# Environment variables echo $SIBYL_SURREAL_URLTest direct connection:
bashcurl http://localhost:8000/health
Authentication Issues
Forbidden After Login
Symptoms:
- API response includes
"error": "forbidden". - Response body says
"Invalid request data."with remediation to check organization or project permissions. - Login or refresh succeeds, but the next project, search, admin, or MCP request fails.
What it usually means:
The client has a valid Sibyl session, but the request does not match the user's organization, project, memory-space, or admin permissions. This is different from an OIDC provider problem. In the default install, OIDC is off and local auth is expected.
Solutions:
Confirm the intended auth mode:
bashecho $SIBYL_LOCAL_AUTH_ENABLED echo $SIBYL_PUBLIC_SIGNUPS_ENABLED echo $SIBYL_OIDCDefault local installs should have local auth enabled, public signups disabled, and no OIDC providers.
For a new default install, complete setup first.
The first setup signup creates the owner/admin user. After setup, additional users need an invite unless
SIBYL_PUBLIC_SIGNUPS_ENABLED=true.Check the active CLI context and token owner:
bashsibyl config context sibyl auth status sibyl whoamiFor project-scoped failures, switch to a project the user can access or ask an owner/admin to add the membership.
For enterprise SSO, verify the IdP role claim emits
Sibyl.Member,Sibyl.Admin, orSibyl.Owner.
JWT Token Invalid
Symptoms:
- 401 Unauthorized responses
- "Invalid token" errors
Solutions:
Check JWT secret is set:
bash# Should be non-empty echo $SIBYL_JWT_SECRETVerify token hasn't expired:
- Default access token TTL: 60 minutes
- Use refresh token to get new access token
Check clock synchronization:
- JWT validation requires synchronized clocks
- Server and client should have correct time
GitHub OAuth Failing
Symptoms:
- "OAuth error" after GitHub redirect
- Missing callback URL
Solutions:
Verify OAuth credentials:
bashecho $SIBYL_GITHUB_CLIENT_ID echo $SIBYL_GITHUB_CLIENT_SECRETCheck callback URL in GitHub:
- Must match
SIBYL_PUBLIC_URL/api/auth/github/callback - Example:
https://sibyl.local/api/auth/github/callback
- Must match
Verify public URL:
bashecho $SIBYL_PUBLIC_URL
Schema Issues
"table ... does not exist" on a Fresh Store
Symptoms:
- API requests return HTTP 500
internal_errorwith a generic message. - Server logs show
NotFoundError: table projects does not exist(orteam_projects,raw_captures, another core table) against a newly provisioned SurrealDB. - The instance was just installed, restored onto an empty database, or pointed at a new
SIBYL_SURREAL_URL.
What it usually means:
The auth and content schemas were never applied to this store. The server applies both automatically at startup and refuses to start on failure outside development, so hitting this at request time means the server started in development mode against an empty store, or startup bootstrap failed and the log line was missed.
Solutions:
Apply the schemas directly (safe to run repeatedly):
bashsibyld db initThe command applies pending auth and content migrations, verifies schema invariants, never drops tables, and skips migrations already recorded in
schema_version.Check the startup bootstrap log for the failure that stopped the automatic path:
bashsibyl logs tail -l error -s apiLook for
Surreal auth schema bootstrap failedorSurreal content schema bootstrap failed; each names the plane, target version, and error.Verify readiness before sending traffic. The readiness endpoint reports schema bootstrap state, and compose/Kubernetes health checks gate on it, so an unhealthy backend that keeps restarting is usually this failure loudly refusing to serve.
Performance Issues
Slow Queries
Symptoms:
- API responses taking > 5 seconds
- Timeouts on graph operations
Solutions:
Check graph size:
bashcurl -H "Authorization: Bearer $TOKEN" \ https://sibyl.local/api/admin/statsLimit query results:
- Use
limitparameter on list endpoints - Paginate large result sets
- Use
High Memory Usage
Symptoms:
- OOMKilled pods in Kubernetes
- Container restarts
Solutions:
Increase resource limits:
yamlbackend: resources: limits: memory: 2Gi requests: memory: 512MiCheck for memory leaks:
bashkubectl top pods -n sibylReduce worker or API concurrency for memory-constrained pods.
Worker Queue Backlog
Symptoms:
- Jobs not completing
- Crawl tasks stuck
Solutions:
Check worker status:
bashkubectl logs -n sibyl -l app.kubernetes.io/component=worker -fScale workers:
bashkubectl scale deployment sibyl-worker -n sibyl --replicas=3Check Redis when the opt-in coordination backend is enabled:
bashredis-cli -h localhost -p 6381 -n 1 KEYS "*"
Port Conflicts
Local Data-Service Port Conflict
Error: SurrealDB or the optional Redis coordination profile cannot bind its port
Solutions:
Find conflicting process:
bashlsof -i :8000 lsof -i :6381Change port in compose:
Set
SIBYL_SURREAL_PORTorSIBYL_REDIS_PORTbefore starting Docker Compose.Update environment:
bashSIBYL_SURREAL_URL=ws://127.0.0.1:<surreal-port>/rpc
Kubernetes-Specific Issues
Pods Stuck in Pending
Solutions:
Check node resources:
bashkubectl describe nodes kubectl top nodesCheck resource requests:
bashkubectl describe pod <pod-name> -n sibylReduce resource requests:
yamlresources: requests: cpu: 50m # Reduce from 100m memory: 128Mi # Reduce from 256Mi
Pods CrashLoopBackOff
Solutions:
Check logs:
bashkubectl logs <pod-name> -n sibyl --previousCheck events:
bashkubectl get events -n sibyl --sort-by='.lastTimestamp'Common causes:
- Missing secrets
- Database not ready
- Port already bound
Historical Archive Rehearsal Database Unavailable
Solutions:
Confirm the external rehearsal database is reachable:
bashpsql "postgresql://$SIBYL_POSTGRES_USER:$SIBYL_POSTGRES_PASSWORD@$SIBYL_POSTGRES_HOST:$SIBYL_POSTGRES_PORT/$SIBYL_POSTGRES_DB" -c 'select 1'Confirm the retained archive contains the database dump sidecar:
bashtar -tzf migration-archive.tar.gz | grep postgres.sqlRun restore only in explicit rehearsal mode with
--restore-database-dump --source-type legacy-archive --target-mode postgres-rehearsal.
Kong Gateway Issues
Solutions:
Check Kong operator:
bashkubectl get pods -n kong-systemCheck gateway:
bashkubectl get gateway -n kong kubectl describe gateway sibyl-gateway -n kongCheck dataplane:
bashkubectl get pods -n kong kubectl logs -n kong -l app=dataplane-sibyl-gatewayCheck HTTPRoutes:
bashkubectl get httproute -n sibyl kubectl describe httproute sibyl-api -n sibyl
Tilt-Specific Issues
Tilt Stuck on Resource
Solutions:
Check Tilt logs:
- Click on stuck resource in Tilt UI
- Look for error messages
Trigger manual rebuild:
bashtilt trigger <resource-name>Full reset:
bashtilt down # If using Minikube: minikube delete minikube start --cpus=4 --memory=8192 # If using OrbStack: restart via OrbStack app or `orb restart`) tilt up
Can't Access sibyl.local
Solutions:
Check /etc/hosts:
bashgrep sibyl.local /etc/hosts # Should show: 127.0.0.1 sibyl.localCheck Caddy is running:
- Look for
caddy-proxyin Tilt UI
- Look for
Check Kong port-forward:
- Look for
kong-port-forwardin Tilt UI
- Look for
Trust Caddy CA (macOS):
bashsudo security add-trusted-cert -d -r trustRoot -k /Library/Keychains/System.keychain \ ~/.local/share/caddy/pki/authorities/local/root.crt
Getting Help
If you're still stuck:
Check logs thoroughly:
bash# All logs with timestamps kubectl logs -n sibyl --all-containers --timestamps -l app.kubernetes.io/name=sibylDescribe resources:
bashkubectl describe pod <pod-name> -n sibyl kubectl describe deployment <deploy-name> -n sibylCheck events:
bashkubectl get events -n sibyl --sort-by='.lastTimestamp' | tail -50File an issue:
- Include logs and error messages
- Describe reproduction steps
- Include environment details (OS, K8s version, etc.)
