Htk8s
HTPC services running on Kubernetes
Install / Use
/learn @fabito/Htk8sREADME
HTPC powered by k3s
This is my current HTPC setup. It runs on k3s - a lightweight and easy to install Kubernetes distribution. It includes the following applications:
- Sonarr for tv shows
- Radarr for movies
- Bazarr for subtitles
- Transmission for torrents
- ~~Jackett for torrent tracker searching~~
- Prowlarr for index management
- Readarr for ebooks
- ~~Emby~~
- Jellyfin
Applications state (settings / db) and media files are stored in a shared volume of type hostPath. It does not use PVC and currently only works if the whole htpc namespace is deployed in the same node.
Getting Started
Quickstart
# for x86_64
kubectl apply -f https://raw.githubusercontent.com/fabito/htk8s/v0.1/install_x86_64.yaml
# for raspberry pi (ARM)
kubectl apply -f https://raw.githubusercontent.com/fabito/htk8s/v0.1/install_armhf.yaml
The Gitops way
# x86_64 only
kubectl apply -f https://raw.githubusercontent.com/fabito/htk8s/v0.1/install_argocd.yaml
This alternate manifest will install Argo CD along with the htpc application. Then it will monitor this repo for changes and apply them to the cluster accordingly (more specifically the overlays/x86overlay).
You can access the ArgoCD UI at: https://localhost/argocd.
Verifying the installation
All resources are created in the htpc namespace. So if you run:
k3s kubectl get all -n htpc
You should get something similar to:
NAME READY STATUS RESTARTS AGE
pod/bazarr-795f88c5c9-w75l7 1/1 Running 0 24h
pod/emby-6f457df664-fqbmc 1/1 Running 0 24h
pod/jackett-6bcf6cd8d6-lrh6j 1/1 Running 0 24h
pod/radarr-5c965c7678-zt8sq 1/1 Running 0 24h
pod/sonarr-b65c8956-mxng4 1/1 Running 0 24h
pod/transmission-5f7fdc6cb5-nrtbb 1/1 Running 0 24h
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/bazarr ClusterIP 10.43.43.224 <none> 6767/TCP 24h
service/emby ClusterIP 10.43.212.198 <none> 8096/TCP 24h
service/jackett ClusterIP 10.43.104.233 <none> 9117/TCP 24h
service/radarr ClusterIP 10.43.141.101 <none> 7878/TCP 24h
service/sonarr ClusterIP 10.43.35.98 <none> 8989/TCP 24h
service/transmission ClusterIP 10.43.184.198 <none> 9091/TCP 24h
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/bazarr 1/1 1 1 24h
deployment.apps/emby 1/1 1 1 24h
deployment.apps/jackett 1/1 1 1 24h
deployment.apps/radarr 1/1 1 1 24h
deployment.apps/sonarr 1/1 1 1 24h
deployment.apps/transmission 1/1 1 1 24h
NAME DESIRED CURRENT READY AGE
replicaset.apps/bazarr-795f88c5c9 1 1 1 24h
replicaset.apps/emby-6f457df664 1 1 1 24h
replicaset.apps/jackett-6bcf6cd8d6 1 1 1 24h
replicaset.apps/radarr-5c965c7678 1 1 1 24h
replicaset.apps/sonarr-b65c8956 1 1 1 24h
replicaset.apps/transmission-5f7fdc6cb5 1 1 1 24h
You should also be able to reach each component's UI using the links below. Don't forget to replace localhost with the IP or the server name running k3s.
|App|URI |---|--- |radarr|http://localhost/radarr |sonarr|http://localhost/sonarr |bazarr|http://localhost/bazarr |jacket|http://localhost/jackett |prowlarr|http://localhost/prowlarr |readarr|http://localhost/readarr |transmission|http://localhost/transmission |jellyfin|http://localhost/
Check the ingress-route.yaml for more details.
Each module except for Jellyfin is configured to respond on a custom basepath (check the init containers logic for more details).
How it works (WIP)
It uses LinuxServers images.
It uses a hostPath volume to store configuration and media files. It defaults to the /opt/htpc directory
/opt/htpc
├── bazarr
├── downloads
├── jellyfin
├── prowlarr
├── readarr
├── media
│ ├── movies
│ ├── books
│ └── tv
├── radarr
├── sonarr
└── transmission
Related Skills
node-connect
334.9kDiagnose OpenClaw node connection and pairing failures for Android, iOS, and macOS companion apps
frontend-design
82.3kCreate distinctive, production-grade frontend interfaces with high design quality. Use this skill when the user asks to build web components, pages, or applications. Generates creative, polished code that avoids generic AI aesthetics.
openai-whisper-api
334.9kTranscribe audio via OpenAI Audio Transcriptions API (Whisper).
commit-push-pr
82.3kCommit, push, and open a PR
