Skip to main content

SafariDesk Self-Hosted Troubleshooting

Use this page when a self-hosted SafariDesk deployment does not start, does not route traffic correctly, or behaves differently from the expected Docker Compose architecture. Related pages:

First Commands to Run

Run these from the monorepo root. Check rendered Compose config:
Check service status:
Show recent logs for every service:
Run HTTP health checks:
For production:

Expected Services

The default stack should include:
Check:
If a service is missing, inspect docker-compose.yml and any extra Compose files passed with -f.

Expected Public Ports

Only nginx should publish a host port by default. Check:
Expected public entrypoint:
If PostgreSQL, Redis, backend, or Channels are publicly exposed, stop and fix the Compose configuration before production use.

Containers Do Not Start

Check status:
Check logs for failed services:
Common causes:

Docker Image Pull Fails

Check configured images:
Check .env:
Common fixes:
  • Use DOCKERHUB_NAMESPACE=safaridesk for official images.
  • Use a tag that exists on Docker Hub.
  • Run docker login if images are private.
  • Use docker compose up -d --build if building locally from source.

Frontend Does Not Load

Check Nginx:
Check frontend:
Check HTTP response:
Common causes:

Frontend Cannot Reach API

The default same-domain frontend should call:
Check frontend config in .env:
Check API through Nginx:
Check backend directly inside Compose:
Common causes:

WebSockets Do Not Connect

WebSockets route through:
Nginx forwards WebSockets to:
Check Channels logs:
Check Redis logs:
For same-domain deployment, leave these empty unless you need explicit URLs:
For split-domain deployment, use explicit WebSocket URLs:
Common causes:

Static Files 404

Django static files are served by root Nginx from the staticfiles volume:
Collect static files:
Restart Nginx:
Check the volume is mounted in the rendered config:
Common causes:
  • collectstatic was not run.
  • staticfiles volume was recreated.
  • Nginx was started before files were collected.
  • A custom Nginx config removed the /static/ route.

Uploads or Media 404

Uploads route through:
The backend media root is:
Check backend volume mount:
Check Nginx route:
Common causes:

Migrations Fail

Run:
If it fails, check:
Check database connectivity:
Common causes:
  • Database service is unhealthy.
  • DB_PASSWORD in .env does not match the existing database volume.
  • Database volume was created with old credentials.
  • Disk is full.
  • A migration depends on data cleanup.
  • pgvector extension installation failed.
If the database password was changed after the volume was created, changing .env alone does not change the existing PostgreSQL user password.

Redis or Celery Problems

Check Redis:
Check worker:
Check beat:
Restart background services:
If REDIS_PASSWORD is set, Celery URLs must include the password:

Email Does Not Send

Check email settings:
Check backend and worker logs:
Common causes:
  • SMTP host or port is wrong.
  • SMTP credentials are wrong.
  • Provider requires app password.
  • EMAIL_USE_TLS / EMAIL_USE_SSL mismatch.
  • Outbound SMTP is blocked by the host provider.
  • Worker is not running for async email jobs.
Placeholder provider links:

Admin Login Fails

Create or recover the SafariAdmin user:
Check .env:
Direct command:
Then try logging in again with SUPERUSER_EMAIL and SUPERUSER_PASSWORD.

Health Check Fails

The health script checks:
Run:
If / fails:
  • Check nginx.
  • Check frontend.
  • Check HTTP_PORT.
If /api/v1/health/ fails:
  • Check backend.
  • Check database connectivity.
  • Check Nginx /api/ route.

Disk Space Problems

Check host disk:
Check Docker disk usage:
Large data sources:
  • PostgreSQL volume
  • Uploads volume
  • Backups in data/backups
  • Docker image layers
  • Container logs
Do not delete Docker volumes unless you have verified backups.

Safe Restart Sequence

Restart application services:
Restart all services:
Stop and start:
Do not use docker compose down -v in production unless you intend to remove volumes and have a tested backup.

Information to Collect for Support

Collect:
Also collect:
  • SafariDesk version / SAFARIDESK_IMAGE_TAG
  • Deployment URL
  • Whether same-domain or split-domain routing is used
  • Recent upgrade steps
  • Whether migrations ran
  • Whether backups exist
Do not share .env without removing secrets.