Files
bart b5750423ed
Sync HTPC Manifests to GitOps / Sync Manifests to GitOps Repo (push) Successful in 4s
feat(radio-chicken): add Kubernetes manifests and migration scripts for Radio Chicken
2026-11-07 11:25:52 +01:00

145 lines
8.2 KiB
Markdown

# HTPC & Media Services Platform
Beheert de configuratie, deployment en automatisering van de HTPC (Home Theater PC) en media-stack voor `bnhmeijer.nl` op `vmserver` (`10.2.0.4`).
---
## 🧭 Inhoudsopgave
- [Overzicht](#-overzicht)
- [Applicaties & Services](#-applicaties--services)
- [Architectuur & Ingress](#-architectuur--ingress)
- [Opslag & Mounts](#-opslag--mounts)
- [GitOps & Deployment](#-gitops--deployment)
---
## 📌 Overzicht
Deze repository bevat de Kubernetes manifests, configuraties en eventuele hulpscripts voor de HTPC mediadiensten. De workloads worden beheerd via GitOps (Gitea Actions en ArgoCD) binnen het homelab cluster.
---
## 🎬 Applicaties & Services
De HTPC omgeving omvat onder andere de volgende diensten:
| Service | Poort | Beschrijving |
| :--- | :--- | :--- |
| **Jellyfin** | `8096` | Media streaming en playback server voor films, series en muziek |
| **Sonarr** | `8989` | Automatisch beheer en downloaden van tv-series |
| **Radarr** | `7878` | Automatisch beheer en downloaden van speelfilms |
| **Lidarr** | `8686` | Automatisch beheer en downloaden van muziek |
| **Bazarr** | `6767` | Ondertitelbeheer en synchronisatie |
| **Jackett / Prowlarr** | `9117` / `9696` | Torrent- en usenet indexer proxy |
| **SABnzbd / Transmission** | `8080` / `9091` | Downloadclients voor media-acquisitie (BitTorrent peer-poort `53662`) |
| **slskd** | `5030` / `50300` | Soulseek peer-to-peer client en web daemon (HTTP: `5030`, Soulseek listen: `50300`) |
| **Radio Chicken & Icecast** | `5000` / `8000` | Gepersonaliseerd radiostation, Icecast audio/video streams, live web-UI en clip downloader |
---
## 🏛️ Architectuur & Ingress
- **SSL & Reverse Proxy**: Inkomend verkeer verloopt via de centrale Apache reverse proxy op `thuus.bnhmeijer.nl`.
- **Authenticatie**: Beveiligd via Keycloak OIDC of ingebouwde service-authenticatie.
- **Interne routering**: Envoy Gateway HTTPRoutes routeren verkeer direct naar de betreffende Kubernetes pods in de `htpc` namespace.
---
## 🚀 Migratie van Host Services naar Kubernetes
### Radarr
Voor het migreren van de standalone `radarr.service` op `10.2.0.4` naar de Kubernetes pod is een geautomatiseerd script beschikbaar:
```bash
# Migratie uitvoeren (stopt host service, synct /storage/var/lib/radarr naar K8s PVC, start pod):
./migrate_radarr_to_cluster.sh
# Terugrollen naar standalone service indien gewenst:
./rollback_radarr_migration.sh
```
- **Dataopslag**: PersistentVolumeClaim `radarr-config` (10Gi, `local-path` op `/datadisk/infra/pv`).
- **Mediaopslag**: HostPath `/datadisk` gemount op `/datadisk` (voor films in `/datadisk/htpc/Films` en downloads in `/datadisk/upload`).
- **Netwerk & Ingress**: Luistert op poort `7878` (zowel via ClusterIP als HostPort `7878` op `10.2.0.4`), waardoor de bestaande Apache reverse proxy rule (`ProxyPass /radarr http://127.0.0.1:7878/radarr`) naadloos blijft functioneren.
### Transmission
De BitTorrent daemon (`transmission`) draait als pod in de `htpc` namespace:
- **Dataopslag**: PersistentVolumeClaim `transmission-config` (10Gi, `local-path` op `/datadisk/infra/pv`), gemigreerd vanuit `/var/www/.config/transmission-daemon` met behoud van alle torrents, resume-bestanden en instellingen.
- **Mediaopslag**: HostPath `/datadisk` en `/mnt/mp3` zodat `/datadisk/upload/finished` en `/datadisk/upload/incomplete` identiek zijn voor Transmission, Radarr, Sonarr en Lidarr.
- **Netwerk**: Web UI / RPC op poort `9091` (ClusterIP + HostPort `9091`) en BitTorrent peer-poort `53662` (TCP & UDP, ClusterIP + HostPort `53662`).
### slskd
De Soulseek daemon (`slskd`) draait als pod in de `htpc` namespace:
- **Dataopslag**: PersistentVolumeClaim `slskd-config` (10Gi, `local-path` op `/datadisk/infra/pv`), gemigreerd vanuit `/var/www/.local/share/slskd` via een init-container (inclusief `slskd.yml`, SQLite databases en state).
- **Mediaopslag**: HostPath `/datadisk` gemount op `/datadisk` (voor `/datadisk/upload/slskd`, `/datadisk/upload/incomplete` en `/datadisk/htpc/mp3`) en `/mnt/mp3` gemount op `/mnt/mp3`.
- **Netwerk**: Web UI op poort `5030` (ClusterIP + HostPort `5030`), optioneel HTTPS op poort `5031` en Soulseek listen poort `50300` (ClusterIP + HostPort `50300`).
- **Migratie & Opruimen**:
```bash
# Migratie uitvoeren (maakt backup in /storage/backups/, stopt host service, start pod):
./migrate_slskd_to_cluster.sh
# Oude host bestanden en service opruimen:
./cleanup_old_slskd.sh
```
### Jackett
De torrent indexer proxy (`jackett`) draait als pod in de `htpc` namespace:
- **Dataopslag**: PersistentVolumeClaim `jackett-config` (10Gi, `local-path` op `/datadisk/infra/pv`), gemigreerd vanuit `/home/bart/.config/Jackett` via init-container (inclusief alle indexers en `ServerConfig.json`).
- **Mediaopslag**: HostPath `/datadisk` gemount op `/datadisk`.
- **Netwerk & Ingress**: Luistert op poort `9117` (ClusterIP + HostPort `9117`). De Apache reverse proxy routeert `https://thuus.bnhmeijer.nl/jackett/` naadloos door naar `127.0.0.1:9117`.
- **Migratie & Opruimen**:
```bash
# Migratie uitvoeren (maakt backup in /storage/backups/, stopt host service, start pod):
./migrate_jackett_to_cluster.sh
# Oude host bestanden en service opruimen:
./cleanup_old_jackett.sh
```
### Jellyfin
De Jellyfin media server (`jellyfin`) draait als pod in de `htpc` namespace:
- **Dataopslag**: PersistentVolumeClaim `jellyfin-config` (30Gi, `local-path` op `/datadisk/infra/pv`), gemigreerd vanuit `/etc/jellyfin` en `/var/lib/jellyfin` via init-container (inclusief alle databases, metadata en plugins).
- **Mediaopslag**: HostPath `/datadisk` gemount op `/datadisk` en `/mnt/mp3` gemount op `/mnt/mp3` zodat alle bibliotheekpaden en symlinks exact behouden blijven.
- **Hardware Transcoding**: Directe hardware-acceleratie via VA-API met AMD Phoenix2 iGPU (`/dev/dri` hostPath gemount in container met `privileged: true`).
- **Netwerk & Ingress**: Luistert op poort `8096` (ClusterIP + HostPort `8096`). De Apache reverse proxy routeert `https://thuus.bnhmeijer.nl/jellyfin` en `wss://.../jellyfin/socket` naadloos door naar `127.0.0.1:8096`.
- **Migratie, Terugrol & Opruimen**:
```bash
# Migratie uitvoeren (maakt backup in /storage/backups/, stopt host service, synct data, start pod):
./migrate_jellyfin_to_cluster.sh
# Terugrollen naar standalone host service indien gewenst:
./rollback_jellyfin_migration.sh
# Oude host bestanden en service opruimen:
./cleanup_old_jellyfin.sh
```
### Radio Chicken & Icecast
Het Radio Chicken streamingplatform en Icecast server draaien als multi-container pod (`radio-chicken`) in de `htpc` namespace:
- **Containers in pod**:
- `icecast` (`moul/icecast:latest`): Luistert op poort `8000` (ClusterIP + HostPort `8000`) voor audio (`/chicken`) en live webm video (`/chicken_video.webm`).
- `radio-chicken` (`git.bnhmeijer.nl/bart/radio-chicken:latest`): Flask web-UI, stemsynthese, live ffmpeg hardware transcoding en streaming naar Icecast op poort `5000` (ClusterIP + HostPort `5000`).
- `autoplacer` (`git.bnhmeijer.nl/bart/radio-chicken-autoplacer:latest`): Achtergrond-worker die nummers in Jellyfin analyseert en in playlists plaatst.
- `mv-downloader` (`git.bnhmeijer.nl/bart/radio-chicken-mv-downloader:latest`): Achtergrond-worker die ontbrekende videoclips van favoriete nummers automatisch downloadt via YouTube naar `/music_videos`.
- **Dataopslag**: PersistentVolumeClaim `radio-chicken-data` (10Gi, `local-path` op `/datadisk/infra/pv`), gemigreerd vanuit `/home/bart/jellyfinradio/data` en `webroot` via init-container.
- **Mediaopslag**: HostPath `/datadisk/htpc/music_video` gemount op `/music_videos`.
- **Hardware Transcoding**: Directe hardware-acceleratie via VA-API met AMD Phoenix2 iGPU (`/dev/dri` hostPath gemount met `privileged: true`).
- **Netwerk & Ingress**: Luistert op poort `5000` en `8000`. De Apache reverse proxy routeert `/radio/live`, `/radio/vote` en `/radio/` direct door naar `127.0.0.1:5000` en `127.0.0.1:8000`.
- **Migratie, Terugrol & Opruimen**:
```bash
# Migratie uitvoeren (maakt backup, sync video's, stopt host containers, start pod):
./migrate_radio_chicken_to_cluster.sh
# Terugrollen naar standalone host containers indien gewenst:
./rollback_radio_chicken_migration.sh
# Oude host containers opruimen:
./cleanup_old_radio_chicken.sh
```