https://github.com/jonakoudijs/homelab
Setup configuration for my homelab
https://github.com/jonakoudijs/homelab
helm helm-charts helmfile homelab homelab-setup kubernetes mac-mini talos
Last synced: 2 months ago
JSON representation
Setup configuration for my homelab
- Host: GitHub
- URL: https://github.com/jonakoudijs/homelab
- Owner: jonakoudijs
- License: mit
- Created: 2024-10-01T18:58:38.000Z (over 1 year ago)
- Default Branch: main
- Last Pushed: 2026-01-03T15:33:20.000Z (5 months ago)
- Last Synced: 2026-01-08T13:55:32.469Z (5 months ago)
- Topics: helm, helm-charts, helmfile, homelab, homelab-setup, kubernetes, mac-mini, talos
- Language: Mustache
- Homepage: https://github.com/jonakoudijs/homelab
- Size: 226 KB
- Stars: 0
- Watchers: 1
- Forks: 0
- Open Issues: 3
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
[](LICENSE)
# Homelab
Setup configuration for my homelab cluster. The entire setup and configuration
is defined as IAC. This platform runs Kubernetes 24/7 at my home and is used to
run various tools and services I use personally and for testing new things.
Currently it consists of a [Talos](https://www.talos.dev) 1-node cluster but it
changes regularly. The hardware used is a Mac Mini, late 2014. These are relatively
cheap second hand and have a really low power consumption.
## Requirements
The following local tools are needed to set everything up:
- [kubectl](https://kubernetes.io/docs/reference/kubectl/)
- [helm](https://helm.sh)
- [helmfile](https://helmfile.readthedocs.io)
- [gnupg](https://gnupg.org)
- [kubeseal](https://github.com/bitnami-labs/sealed-secrets?tab=readme-ov-file#kubeseal)
- [talosctl](https://www.talos.dev/latest/learn-more/talosctl/)
## Initial Setup
These manual setups are needed for the initial setup. The first step is to
generate the required files to configure the Talos cluster:
```bash
talosctl gen config homelab https://10.0.0.201:6443
```
In this example the node will be configured with the ip `10.0.0.201`.
When using a Mac Mini, a boot loader needs to be configured. The easiest way is to
first install [Ubuntu 22.04](https://ubuntu.com/download/server/thank-you?version=22.04.5&architecture=amd64<s=true)
and then install Talos over that.
## Talos Cluster
The cluster is setup with [Talos](https://www.talos.dev) and can be managed
with [talosctl](https://www.talos.dev/latest/learn-more/talosctl/). For example:
```bash
talosctl --nodes 10.0.0.201 --endpoints 10.0.0.201 dashboard
```
In this example you see that the node specified is `10.0.0.201` and cluster ip
address where `talosctl` communicates with is also `10.0.0.201`.
The installation of the Talos nodes are done by installing the latest version
via ISO. After installation the the Talos configuration needs to be applied:
```bash
talosctl apply -e 10.0.0.201 -n -f controlplane.yaml --insecure
```
If the cluster consists of 1 node make sure to allow scheduling by adding the
following line to the `controlplane.yaml`:
```yaml
cluster:
allowSchedulingOnControlPlanes: true
```
## Helm Charts
Almost everything is configured via Helm charts and deployed with Helmfile.
Documentation on configurations of various components can be found here:
- [Traefik](https://github.com/traefik/traefik-helm-chart/blob/master/traefik/values.yaml)
- [KubeSeal](https://github.com/bitnami-labs/sealed-secrets?tab=readme-ov-file#overview)
- [Cert Manager](https://cert-manager.io/docs/)
- [Local Path Provisioner](https://github.com/rancher/local-path-provisioner/tree/master/deploy/chart/local-path-provisioner)
- [NFS External provisioner](https://github.com/kubernetes-sigs/nfs-subdir-external-provisioner/tree/master/charts/nfs-subdir-external-provisioner)
- [Jellyfin](https://github.com/jellyfin/jellyfin-helm/tree/master/charts/jellyfin)
- [Kavorites](https://github.com/jonakoudijs/kavorites)
## Secrets
Sensitive data like passwords, api keys etc. are stored in secrets. The tool
[kubeseal](https://github.com/bitnami-labs/sealed-secrets) is used to be able
to store secrets encrypted in the repository. Remember to specify the namespace
in the secret before encrypting. For example:
```bash
apiVersion: v1
kind: Secret
metadata:
name: secret-basic-auth
namespace: mynamespace
stringData:
username: admin
password: t0p-Secret
```
Then encrypt this secret file with the `kubeseal` command:
```bash
kubeseal -f original-secret.yaml -w secret.yaml
```