Troubleshooting
Health Check
Run the built-in health check to verify all backing services:
norn health
# alias:
norn doctorThis checks connectivity to:
- Nomad API
- Consul API
- PostgreSQL database
- S3 storage (if configured)
OpenTelemetry and Grafana
Norn can export OTLP traces and logs to an OpenTelemetry Collector, Grafana Alloy, or Grafana Cloud OTLP endpoint.
export NORN_OTEL_ENABLED=true
export NORN_OTEL_LOGS=true
export NORN_LOG_FORMAT=json
export OTEL_SERVICE_NAME=norn-api
export OTEL_EXPORTER_OTLP_ENDPOINT=http://127.0.0.1:4318The API wraps HTTP traffic with OpenTelemetry spans. NORN_LOG_FORMAT=json keeps stdout logs easy to collect with a Collector filelog receiver even when OTLP logs are disabled.
Use Norn's platform ops rollup to verify what the API sees at runtime:
norn ops platformThe rollup reports OTEL enablement, log export state, log format, service name, and OTLP endpoint without printing secrets. It also summarizes recent access status buckets, service exposure, dirty deployments, snapshot retention pressure, and secret hygiene.
Common Issues
Nomad Not Running
Symptom: WARNING: nomad unavailable on API startup, deploys fail.
Fix: Start Nomad:
# Dev mode
nomad agent -dev -bind=0.0.0.0
# Production
sudo systemctl start nomadVerify: curl http://localhost:4646/v1/status/leader
Consul Not Running
Symptom: WARNING: consul not healthy, services not discoverable.
Fix: Start Consul:
# Dev mode
consul agent -dev
# Production
sudo systemctl start consulVerify: curl http://localhost:8500/v1/status/leader
Database Connection Failed
Symptom: database: dial tcp ... connection refused
Fix: Ensure PostgreSQL is running and the connection string is correct:
# Check if PostgreSQL is running
pg_isready
# Verify connection
psql "postgres://norn:norn@localhost:5432/norn_v2?sslmode=disable"SOPS Key Missing
Symptom: Deploys fail at the submit step with SOPS decryption errors.
Fix: Ensure the age key exists:
ls ~/.config/sops/age/keys.txtOn macOS, also check the Application Support path:
ls ~/Library/Application\ Support/sops/age/keys.txtIf missing, symlink:
mkdir -p ~/Library/Application\ Support/sops/age/
ln -sf ~/.config/sops/age/keys.txt \
~/Library/Application\ Support/sops/age/keys.txtHost Volume Not Found
Symptom: Nomad allocation fails with "volume not found" error.
Fix: Add the host_volume stanza to the Nomad client config and restart:
client {
host_volume "volume-name" {
path = "/opt/volumes/volume-name"
read_only = false
}
}See Volumes for full setup.
Deploy Stuck at Healthy Step
Symptom: Deploy hangs after submit, never reaches healthy.
Possible causes:
- Container is crashing — check Nomad allocation logs:
nomad alloc logs <alloc-id> - Health check failing — verify the health check path returns 200
- Port conflict — another allocation is using the static port
InfraSpec Validation Errors
Run the validator to check your infraspec:
norn validate myappCommon issues:
- Missing
namefield - Process with
portbut nohealthcheck - Invalid cron expression in
schedule - Volume name doesn't match Nomad host_volume
Debugging Deploys
View Saga Events
Every deploy creates a saga with detailed step-by-step events:
# Get the saga ID from the deploy output, then:
norn saga <saga-id>
# Or view recent events for an app:
norn saga --app=myapp --limit=50Check Nomad UI
Open http://localhost:4646 to see:
- Job status and allocation health
- Task logs
- Resource utilization
- Failed allocation events
Check API Logs
The Norn API logs all requests and pipeline events to stdout. Look for pipeline: prefixed messages for deploy issues.