Self-hosted media server stack built on YAMS
  • Python 97.3%
  • Shell 2.7%
Find a file
mikd eccdc12b14 chore: drop ntfy from public release — notifications go through Matrix
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>
2026-05-11 15:32:55 +02:00
scripts Initial commit: YAMS custom stack 2026-05-11 08:50:51 +02:00
.env.example chore: drop ntfy from public release — notifications go through Matrix 2026-05-11 15:32:55 +02:00
.gitignore Initial commit: YAMS custom stack 2026-05-11 08:50:51 +02:00
CLAUDE.md chore: drop ntfy from public release — notifications go through Matrix 2026-05-11 15:32:55 +02:00
docker-compose.custom.yaml chore: drop ntfy from public release — notifications go through Matrix 2026-05-11 15:32:55 +02:00
docker-compose.yaml Initial commit: YAMS custom stack 2026-05-11 08:50:51 +02:00
gpu-watchdog.sh Initial commit: YAMS custom stack 2026-05-11 08:50:51 +02:00
README.md chore: drop ntfy from public release — notifications go through Matrix 2026-05-11 15:32:55 +02:00

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 check
  • notify_media.py — fires when Sonarr/Radarr imports or Jellyseerr gets a new request
  • notify_decluttarr.py — fires when Decluttarr removes a stalled download

gpu-watchdog.sh — restarts Jellyfin if NVIDIA GPU becomes unresponsive

Setup

  1. Follow the YAMS install guide to get the base stack running
  2. Copy .env.example to .env and fill in your values
  3. Start with both compose files:
    docker compose -f docker-compose.yaml -f docker-compose.custom.yaml up -d
    
  4. 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.