Troubleshooting
This guide covers common issues and their solutions when deploying Outline using the Helm chart.
Pod Issues
Pod Stuck in Pending State
Symptoms: Pod remains in Pending
status
Common Causes:
- Insufficient cluster resources
- PVC binding issues
- Node selector constraints
Solutions:
# Check pod events
kubectl describe pod <pod-name>
# Check resource availability
kubectl get nodes -o custom-columns="NAME:.metadata.name,CPU:.status.capacity.cpu,MEMORY:.status.capacity.memory"
# Check PVC status
kubectl get pvc
# Check storage class
kubectl get storageclass
Pod CrashLoopBackOff
Symptoms: Pod repeatedly crashes and restarts
Common Causes:
- Database connection issues
- Configuration errors
- Resource constraints
Solutions:
# Check pod logs
kubectl logs <pod-name> --previous
# Check pod events
kubectl describe pod <pod-name>
# Check resource usage
kubectl top pod <pod-name>
Pod Not Ready
Symptoms: Pod is running but not ready
Common Causes:
- Health check failures
- Database connectivity issues
- Application startup problems
Solutions:
# Check readiness probe
kubectl describe pod <pod-name> | grep -A 10 "Readiness"
# Check application logs
kubectl logs <pod-name> | grep -i "ready\|health"
# Test health endpoint
kubectl exec -it <pod-name> -- curl -f http://localhost:3000/_health
Database Issues
Database Connection Failed
Symptoms: Application cannot connect to PostgreSQL
Common Causes:
- Database not running
- Incorrect credentials
- Network connectivity issues
Solutions:
# Check database pod status
kubectl get pods -l app.kubernetes.io/name=postgresql
# Check database logs
kubectl logs -f deployment/outline-postgresql
# Test database connectivity
kubectl exec -it <outline-pod> -- psql $DATABASE_URL -c "SELECT 1;"
# Check database environment variables
kubectl exec -it <outline-pod> -- env | grep -E "(PG|DATABASE)"
Redis Connection Issues
Symptoms: Application cannot connect to Redis
Common Causes:
- Redis not running
- Authentication issues
- Network connectivity problems
Solutions:
# Check Redis pod status
kubectl get pods -l app.kubernetes.io/name=redis
# Check Redis logs
kubectl logs -f deployment/outline-redis-master
# Test Redis connectivity
kubectl exec -it <outline-pod> -- redis-cli -h $REDIS_HOST -p $REDIS_PORT ping
# Check Redis environment variables
kubectl exec -it <outline-pod> -- env | grep -E "(REDIS)"
Storage Issues
PVC Binding Issues
Symptoms: PersistentVolumeClaim remains in Pending
status
Common Causes:
- No available storage class
- Insufficient storage capacity
- Storage class configuration issues
Solutions:
# Check PVC status
kubectl get pvc
# Check available storage classes
kubectl get storageclass
# Check persistent volumes
kubectl get pv
# Check storage class events
kubectl describe pvc <pvc-name>
S3 Storage Issues
Symptoms: File uploads fail or S3 connectivity issues
Common Causes:
- Incorrect S3 credentials
- Network connectivity issues
- S3 bucket permissions
Solutions:
# Check S3 environment variables
kubectl exec -it <pod-name> -- env | grep -E "(AWS_)"
# Test S3 connectivity
kubectl exec -it <pod-name> -- aws s3 ls s3://your-bucket
# Check S3 credentials
kubectl get secret <release-name>-s3-secret -o yaml
# Verify bucket permissions
kubectl exec -it <pod-name> -- aws s3api get-bucket-acl --bucket your-bucket
MinIO Issues
Symptoms: MinIO not accessible or configuration problems
Common Causes:
- MinIO pod not running
- Ingress configuration issues
- Credential problems
Solutions:
# Check MinIO pod status
kubectl get pods -l app.kubernetes.io/name=minio
# Check MinIO logs
kubectl logs -f deployment/outline-minio
# Check MinIO service
kubectl get svc -l app.kubernetes.io/name=minio
# Test MinIO connectivity
kubectl exec -it <outline-pod> -- curl -f http://outline-minio:9000
Authentication Issues
OAuth Provider Problems
Symptoms: Users cannot authenticate via OAuth providers
Common Causes:
- Incorrect OAuth credentials
- Redirect URI mismatches
- Provider configuration issues
Solutions:
# Check authentication environment variables
kubectl exec -it <pod-name> -- env | grep -E "(GOOGLE|AZURE|OIDC|SLACK|GITHUB)"
# Check authentication secrets
kubectl get secret <release-name>-auth-secret -o yaml
# Check application logs for auth errors
kubectl logs <pod-name> | grep -i "auth\|oauth\|login"
# Verify redirect URIs in OAuth provider
# Ensure they match: https://your-domain.com/auth/provider.callback
SAML Configuration Issues
Symptoms: SAML authentication fails
Common Causes:
- Incorrect SAML endpoint
- Certificate issues
- Configuration mismatches
Solutions:
# Check SAML environment variables
kubectl exec -it <pod-name> -- env | grep -E "(SAML)"
# Verify SAML certificate
kubectl get secret <release-name>-auth-secret -o yaml | grep SAML_CERT
# Check SAML endpoint configuration
kubectl exec -it <pod-name> -- env | grep SAML_SSO_ENDPOINT
Network and Ingress Issues
Ingress Not Working
Symptoms: Cannot access Outline via ingress
Common Causes:
- Ingress controller not installed
- Incorrect ingress configuration
- DNS resolution issues
Solutions:
# Check ingress status
kubectl get ingress
# Check ingress controller
kubectl get pods -n ingress-nginx
# Check ingress events
kubectl describe ingress <ingress-name>
# Test ingress connectivity
curl -I https://your-domain.com/_health
# Check DNS resolution
nslookup your-domain.com
SSL Certificate Issues
Symptoms: SSL certificate errors or HTTPS not working
Common Causes:
- Certificate not issued
- Incorrect certificate configuration
- cert-manager issues
Solutions:
# Check certificate status
kubectl get certificate
# Check cert-manager pods
kubectl get pods -n cert-manager
# Check certificate events
kubectl describe certificate <certificate-name>
# Check TLS secret
kubectl get secret <tls-secret-name> -o yaml
Application Issues
Application Not Starting
Symptoms: Outline application fails to start
Common Causes:
- Missing environment variables
- Configuration errors
- Resource constraints
Solutions:
# Check application logs
kubectl logs <pod-name>
# Check environment variables
kubectl exec -it <pod-name> -- env | sort
# Check configuration
kubectl get configmap <release-name>-entrypoint -o yaml
# Check resource usage
kubectl top pod <pod-name>
Performance Issues
Symptoms: Slow application performance
Common Causes:
- Insufficient resources
- Database performance issues
- Network latency
Solutions:
# Check resource usage
kubectl top pod <pod-name>
kubectl top node
# Check database performance
kubectl exec -it <postgresql-pod> -- psql -U outline -d outline -c "SELECT * FROM pg_stat_activity;"
# Check Redis performance
kubectl exec -it <redis-pod> -- redis-cli info memory
# Enable debug logging
kubectl patch deployment <deployment-name> -p '{"spec":{"template":{"spec":{"containers":[{"name":"outline","env":[{"name":"LOG_LEVEL","value":"debug"}]}]}}}}'
Common Error Messages
"Database connection failed"
# Check database connectivity
kubectl exec -it <pod-name> -- psql $DATABASE_URL -c "SELECT 1;"
# Check database credentials
kubectl get secret <release-name>-postgresql -o yaml
# Verify database URL
kubectl exec -it <pod-name> -- echo $DATABASE_URL
"Redis connection failed"
# Check Redis connectivity
kubectl exec -it <pod-name> -- redis-cli -h $REDIS_HOST -p $REDIS_PORT ping
# Check Redis credentials
kubectl get secret <release-name>-redis -o yaml
# Verify Redis URL
kubectl exec -it <pod-name> -- echo $REDIS_URL
"File upload failed"
# Check storage configuration
kubectl exec -it <pod-name> -- env | grep -E "(FILE_STORAGE|AWS_)"
# Check S3 connectivity
kubectl exec -it <pod-name> -- aws s3 ls s3://your-bucket
# Check local storage permissions
kubectl exec -it <pod-name> -- ls -la /var/lib/outline/data
"Authentication failed"
# Check authentication configuration
kubectl exec -it <pod-name> -- env | grep -E "(GOOGLE|AZURE|OIDC|SLACK|GITHUB)"
# Check authentication secrets
kubectl get secret <release-name>-auth-secret -o yaml
# Check application logs
kubectl logs <pod-name> | grep -i "auth"
Debug Mode
Enable debug logging for troubleshooting:
logging:
level: debug
extraDebug:
- http
- router
- store
- policies
Apply debug configuration:
# Update deployment with debug logging
kubectl patch deployment <deployment-name> -p '{"spec":{"template":{"spec":{"containers":[{"name":"outline","env":[{"name":"LOG_LEVEL","value":"debug"},{"name":"DEBUG","value":"http,router,store,policies"}]}]}}}}'
# Check debug logs
kubectl logs -f <pod-name>
Monitoring and Logging
Enable Application Monitoring
podAnnotations:
prometheus.io/scrape: "true"
prometheus.io/port: "3000"
prometheus.io/path: "/_health"
Log Aggregation
Configure log aggregation for better debugging:
# Add logging sidecar
extraContainers:
- name: log-aggregator
image: fluent/fluent-bit:latest
volumeMounts:
- name: varlog
mountPath: /var/log
- name: varlibdockercontainers
mountPath: /var/lib/docker/containers
readOnly: true
resources:
requests:
memory: "64Mi"
cpu: "50m"
limits:
memory: "128Mi"
cpu: "100m"
Recovery Procedures
Database Recovery
# Backup database
kubectl exec -it <postgresql-pod> -- pg_dump -U outline outline > outline-backup.sql
# Restore database
kubectl exec -i <postgresql-pod> -- psql -U outline outline < outline-backup.sql
Application Recovery
# Restart application
kubectl rollout restart deployment <deployment-name>
# Check rollout status
kubectl rollout status deployment <deployment-name>
# Rollback if needed
kubectl rollout undo deployment <deployment-name>
Storage Recovery
# Backup local storage
kubectl exec -it <pod-name> -- tar czf /tmp/outline-data.tar.gz /var/lib/outline/data
kubectl cp <pod-name>:/tmp/outline-data.tar.gz ./outline-data-backup.tar.gz
# Restore local storage
kubectl cp ./outline-data-backup.tar.gz <pod-name>:/tmp/
kubectl exec -it <pod-name> -- tar xzf /tmp/outline-data-backup.tar.gz -C /
Getting Help
Collecting Debug Information
# Collect all relevant information
kubectl get all -l app.kubernetes.io/name=outline
kubectl get pvc -l app.kubernetes.io/name=outline
kubectl get secrets -l app.kubernetes.io/name=outline
kubectl describe pod <pod-name>
kubectl logs <pod-name> --previous
kubectl exec -it <pod-name> -- env | sort
Useful Commands
# Check all resources
kubectl get all -l app.kubernetes.io/name=outline
# Check events
kubectl get events --sort-by='.lastTimestamp'
# Check resource usage
kubectl top pods -l app.kubernetes.io/name=outline
# Check configuration
kubectl get configmap -l app.kubernetes.io/name=outline
kubectl get secret -l app.kubernetes.io/name=outline
Next Steps
- Review configuration options
- Check authentication setup
- Verify storage configuration
- Confirm database settings
- Explore advanced configuration