Self-hosted services running on Docker Compose behind Traefik with Authelia SSO/2FA and a Synology NAS for storage.
| Category | Service | Subdomain |
|---|---|---|
| Infrastructure | Traefik | traefik.$DOMAINNAME |
| Infrastructure | Authelia | authelia.$DOMAINNAME |
| Infrastructure | Portainer | portainer.$DOMAINNAME |
| Infrastructure | Docker Socket Proxy | internal only |
| Infrastructure | Task Scheduler | internal only |
| Dashboard | Organizr | start.$DOMAINNAME |
| Media | Plex | plex.$DOMAINNAME |
| Media | Sonarr | sonarr.$DOMAINNAME |
| Media | Radarr | radarr.$DOMAINNAME |
| Media | Bazarr | bazarr.$DOMAINNAME |
| Media | SABnzbd | sabnzb.$DOMAINNAME |
| Media | NZBHydra2 | hydra.$DOMAINNAME |
| Collection Mgmt | Kometa | kometa.$DOMAINNAME |
| Books | Calibre-Web | books.$DOMAINNAME |
| Books | Lazy Librarian | lazylib.$DOMAINNAME |
| DNS | Pi-hole | pihole.$DOMAINNAME/admin/ |
| Home Automation | Home Assistant | homeassistant.$DOMAINNAME |
| Utilities | iSponsorBlockTV | internal only |
| Utilities | LibreSpeed | speedtest.$DOMAINNAME |
| Utilities | Smokeping | smokeping.$DOMAINNAME |
| Utilities | Slideshow Updater | internal only |
cp env.example .env
# Fill in all values in .envKey variables:
DOMAINNAME— your domain (all services run as subdomains)CLOUDFLARE_EMAIL,CLOUDFLARE_API_KEY,CLOUDFLARE_ZONEID— for Let's Encrypt DNS challengeDOCKERDIR— NFS mount path (e.g./mnt/docker)LOCALDOCKERDIR— local project directory pathPLEX_TOKEN— required for Kometa (get from Plex account settings)TMDB_API_READ_ACCESS_TOKEN— required for Kometa (TMDb v4 read token)
docker network create --gateway 192.168.90.1 --subnet 192.168.90.0/24 t2_proxy
docker network create --gateway 192.168.91.1 --subnet 192.168.91.0/24 socket_proxytouch acme/acme.json
chmod 600 acme/acme.jsonCopy and configure the Kometa config on your NFS mount:
mkdir -p /mnt/docker/kometa/assets
cp kometa/config.yml.example /mnt/docker/kometa/config.ymlToken values are read from environment — no edits needed if .env is populated.
After first start: Settings → Environments → Add Environment → Docker → set URL to socket-proxy:2375.
docker compose up -dTask Scheduler handles routine maintenance automatically:
- Nightly at midnight: Docker cleanup (prunes images/containers/volumes older than 7 days)
- Sundays at 3 AM: Plex restart (picks up
VERSION=publicupdates) - Daily at 1 AM: Kometa runs and updates Plex collections
See DEVELOPMENT.md for the automated task workflow using ralph.sh.