Skip to content

Self-Hosting Overview

solyto is fully self-hostable. All components are published as Docker images, and the selfhosted repo provides a complete Docker Compose stack with everything wired together.

  • Full control — your data stays on your hardware
  • No third-party access — nobody else has access to your data, ever
  • Customization — configure features, disable what you don’t need
  • No vendor lock-in — standard Docker stack, easy to migrate or back up
  • Free — no subscriptions, no limits

The only software requirement is Docker and Docker Compose — everything else runs inside containers. solyto is lightweight: it runs comfortably on a Raspberry Pi, and any VPS or root server is more than sufficient.

You also need:

  • A server reachable from the internet (VPS, dedicated server, or home server with port forwarding)
  • Three domain names pointing to your server’s IP address (app, api, dav)
  • A valid email address for TLS certificate generation (Let’s Encrypt)

solyto runs as 10 Docker services:

ServiceImageDescription
traefiktraefik:v3Reverse proxy with automatic HTTPS via Let’s Encrypt
nginxsolyto/api-nginxWeb server for API and DAV, healthcheck on /api/v1/health
apisolyto/api-phpLaravel PHP-FPM backend, runs startup.sh then php-fpm
davsolyto/api-phpWebDAV/CalDAV/CardDAV service (same image, different config)
queuesolyto/api-phpLaravel queue worker (queue:work --tries=3 --timeout=300)
appsolyto/appSvelteKit frontend with SSR, runs on port 3000
imgproxydarthsim/imgproxyOptional image processing (only if IMAGE_DRIVER=imgproxy)
mariadbmariadb:12Primary database for the API
postgrespostgres:17Database for CalDAV/CardDAV (SabreDAV)
redisredis:7.4.1Cache, queue backend, and session storage

Three images are published and maintained by the solyto project:

ImageBasePurpose
solyto/appNode 22 AlpineSvelteKit SSR frontend, port 3000
solyto/api-phpPHP 8.4 FPMLaravel application backend
solyto/api-nginxNginx AlpineServes static files and proxies to PHP-FPM

Three Docker networks isolate services by function:

NetworkServicesPurpose
publictraefik, nginx, appExternally reachable services
apinginx, api, dav, queue, imgproxyInternal API communication
dbapi, dav, queue, mariadb, postgres, redisDatabase access only

Traffic flow: Internet → Traefik → Nginx → PHP-FPM (api/dav) and Internet → Traefik → App (port 3000).

VolumeUsed byPurpose
mariadb_datamariadbMariaDB data persistence
pg_datapostgresPostgreSQL data persistence
redis_dataredisRedis data persistence
traefik_acmetraefikLet’s Encrypt TLS certificates
./storage/api, dav, queue, nginx, imgproxyShared file storage (uploads, logs, framework cache)