Add Jellyfin media server deployment #77

Merged
eblume merged 5 commits from feature/jellyfin-deployment into main 2026-01-30 16:57:27 -08:00
Owner

Summary

  • Add Jellyfin ansible role for native macOS deployment via Homebrew cask
  • Add jellyfin_metrics role for Prometheus textfile metrics collection
  • Add Caddy routing for jellyfin.ops.eblu.me
  • Add Alloy log collection for Jellyfin stdout/stderr
  • Add Grafana dashboard for Jellyfin monitoring

Architecture

Jellyfin runs natively on indri (not in k8s) for full VideoToolbox hardware transcoding support. The M1 Mac Mini can handle ~3 concurrent 4K HDR→SDR transcoding streams.

Deployment and Testing

  • Deploy Jellyfin: mise run provision-indri -- --tags jellyfin,jellyfin_metrics,caddy,alloy
  • Sync Grafana dashboard: argocd app sync grafana-config
  • Complete Jellyfin setup wizard at https://jellyfin.ops.eblu.me
  • Generate API key and save to ~/.jellyfin-api-key
  • Add media libraries (/Volumes/allisonflix/Movies, /Volumes/allisonflix/TV)
  • Enable VideoToolbox hardware transcoding
  • Verify metrics in Grafana dashboard
  • Verify logs in Loki: {service="jellyfin"}

🤖 Generated with Claude Code

## Summary - Add Jellyfin ansible role for native macOS deployment via Homebrew cask - Add jellyfin_metrics role for Prometheus textfile metrics collection - Add Caddy routing for jellyfin.ops.eblu.me - Add Alloy log collection for Jellyfin stdout/stderr - Add Grafana dashboard for Jellyfin monitoring ## Architecture Jellyfin runs natively on indri (not in k8s) for full VideoToolbox hardware transcoding support. The M1 Mac Mini can handle ~3 concurrent 4K HDR→SDR transcoding streams. ## Deployment and Testing - [ ] Deploy Jellyfin: `mise run provision-indri -- --tags jellyfin,jellyfin_metrics,caddy,alloy` - [ ] Sync Grafana dashboard: `argocd app sync grafana-config` - [ ] Complete Jellyfin setup wizard at https://jellyfin.ops.eblu.me - [ ] Generate API key and save to `~/.jellyfin-api-key` - [ ] Add media libraries (/Volumes/allisonflix/Movies, /Volumes/allisonflix/TV) - [ ] Enable VideoToolbox hardware transcoding - [ ] Verify metrics in Grafana dashboard - [ ] Verify logs in Loki: `{service="jellyfin"}` 🤖 Generated with [Claude Code](https://claude.com/claude-code)
Deploy Jellyfin natively on indri via Ansible for VideoToolbox
hardware transcoding. Includes metrics collection, log forwarding
to Loki, and Grafana dashboard.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
The Homebrew cask puts jellyfin-web in Contents/Resources/, not
Contents/MacOS/, so we need to explicitly specify the path.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add pre_task to fetch API key from 1Password
- Update jellyfin_metrics role to write API key file
- Include fallback fetch for --tags jellyfin_metrics runs

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add Jellyfin service with native widget showing library stats and now playing
- Add ExternalSecret to fetch API key from 1Password

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
eblume merged commit bcc8685316 into main 2026-01-30 16:57:27 -08:00
Sign in to join this conversation.
No reviewers
No labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
eblume/blumeops!77
No description provided.