Self-hosted media server stack built on YAMS
- Python 97.3%
- Shell 2.7%
Removed ntfy service and the shoutrrr Watchtower notification env vars. Update reports surface to Matrix via scripts/monitor.py (already documented in the README's scripts section). Kept Watchtower in notify-only mode with the daily poll interval. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> |
||
|---|---|---|
| scripts | ||
| .env.example | ||
| .gitignore | ||
| CLAUDE.md | ||
| docker-compose.custom.yaml | ||
| docker-compose.yaml | ||
| gpu-watchdog.sh | ||
| README.md | ||
yams-public
My personal YAMS media server stack with customizations on top of the base install.
What's in here
docker-compose.custom.yaml — extends the YAMS base compose with:
- Jellyseerr — request management
- Nginx Proxy Manager — reverse proxy with SSL
- GoAccess — NPM log analytics dashboard
- qbit_manage — automated qBittorrent tag/category management (runs every 30 min)
- Homepage — service dashboard with Docker socket integration
- Decluttarr — automatic removal of stalled/stuck downloads
- Watchtower — notify-only mode, daily poll (update reports surfaced to Matrix by
scripts/monitor.py) - gpu-stats — lightweight NVIDIA GPU metrics HTTP endpoint for Homepage
- Jellyfin overrides: transcodes → media drive, external subtitles mount
scripts/ — Python cron scripts for Matrix-based alerting:
monitor.py— disk space, container health, VPN IP check, port forward checknotify_media.py— fires when Sonarr/Radarr imports or Jellyseerr gets a new requestnotify_decluttarr.py— fires when Decluttarr removes a stalled download
gpu-watchdog.sh — restarts Jellyfin if NVIDIA GPU becomes unresponsive
Setup
- Follow the YAMS install guide to get the base stack running
- Copy
.env.exampleto.envand fill in your values - Start with both compose files:
docker compose -f docker-compose.yaml -f docker-compose.custom.yaml up -d - Add the monitoring scripts to cron (see each script's docstring for interval)
Radarr/Sonarr custom format strategy
English-first library with German dual language preferred. See CLAUDE.md for the full score breakdown.
Secret management
Sensitive config files (.env, arr config.xml, etc.) are kept out of git via .gitignore. For encrypted-at-rest secrets, SOPS + age works well.