From 00c2c7b114e223225a048dccc9f13c1a0a4cabaf Mon Sep 17 00:00:00 2001 From: ScrublordMcBad Date: Wed, 22 Apr 2026 10:00:01 +0000 Subject: [PATCH] Add docs/install.md --- docs/install.md | 84 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 84 insertions(+) create mode 100644 docs/install.md diff --git a/docs/install.md b/docs/install.md new file mode 100644 index 0000000..e4444de --- /dev/null +++ b/docs/install.md @@ -0,0 +1,84 @@ +Du hast absolut keine Tomaten auf den Augen – du hast vollkommen recht! Ich habe dir ein wunderbares Architekturdokument geschrieben, aber den wichtigsten Teil vergessen: **"Wie drücke ich den Startknopf, wenn ich einen nackten Server vor mir habe?"** + +Hier ist die fehlende, handfeste **Step-by-Step Installationsanleitung**. Du kannst diesen Block direkt als Kapitel 2 (vor der Architektur) in dein Git-Markdown einfügen. + +--- + +## 🚀 Step-by-Step Installationsanleitung (From Scratch) + +Diese Anleitung geht davon aus, dass du einen frischen Server (Ubuntu/Debian) mit öffentlicher IP hast und deine lokalen Tools (Flux CLI, kubectl, sops, age) installiert sind. + +### Schritt 1: Kubernetes (K3s) auf dem Server installieren +Logge dich per SSH auf deinem Server ein und installiere ein frisches K3s. Wir nutzen K3s mit dem Standard-Traefik-Ingress. + +```bash +# Auf dem Server ausführen: +curl -sfL https://get.k3s.io | sh - + +# Kubeconfig kopieren und Berechtigungen setzen (für den lokalen Zugriff) +sudo cp /etc/rancher/k3s/k3s.yaml ~/.kube/config +sudo chown $USER ~/.kube/config +``` +*Kopiere dir den Inhalt der `~/.kube/config` auf deinen lokalen Rechner, damit dein lokales `kubectl` den Server steuern kann. Vergiss nicht, die IP `127.0.0.1` in der Datei durch die öffentliche IP deines Servers zu ersetzen.* + +### Schritt 2: Den SOPS-Verschlüsselungs-Key generieren +Damit Flux deine verschlüsselten Passwörter (SMTP, Datenbank) im Cluster lesen kann, braucht es einen privaten Schlüssel. Wir nutzen `age`. + +```bash +# Auf deinem lokalen Rechner ausführen: +# 1. Key generieren +age-keygen -o age.agekey + +# 2. Den Public Key (steht in der Datei) in die .sops.yaml des Repos eintragen! + +# 3. Den Private Key als Secret in den Cluster laden (in den flux-system Namespace) +cat age.agekey | kubectl create secret generic sops-age \ +--namespace=flux-system \ +--from-file=age.agekey=/dev/stdin +``` + +### Schritt 3: Das Git-Repository vorbereiten +Stelle sicher, dass deine GitOps-Struktur gepusht ist und du ein Personal Access Token (PAT) für dein Git-Repository hast (bei GitHub/GitLab). +* Das Token benötigt Lese- und Schreibrechte auf das Repository. + +### Schritt 4: Flux Bootstrap (Der Startschuss) +Das ist der magische Befehl. Er installiert den Flux-Controller in deinem Cluster und verbindet ihn mit deinem Repository. Ab diesem Moment übernimmt Flux das Steuer. + +**Für GitHub:** +```bash +export GITHUB_TOKEN="dein-personal-access-token" +export GITHUB_USER="dein-github-username" + +flux bootstrap github \ + --owner=$GITHUB_USER \ + --repository=dein-repo-name \ + --branch=main \ + --path=prod/gitops/clusters/matrix \ + --personal +``` + +**Für Gitea/GitLab/Generisches Git (wie in deinem Setup scheinbar genutzt):** +```bash +flux bootstrap git \ + --url=https://rohana.axion1337.de/sorb/axion1337.chat-gitops.git \ + --branch=main \ + --path=prod/gitops/clusters/matrix \ + --username=dein-git-user \ + --password=dein-git-token +``` + +### Schritt 5: Zurücklehnen und beobachten +Flux klont jetzt dein Repo, liest die Kustomizations und wendet sie in der richtigen Reihenfolge an (`infra-apps` -> `production-apps`). + +Du kannst den Fortschritt live verfolgen: +```bash +# Zeigt den GitOps-Sync-Status: +flux get kustomizations --watch + +# Zeigt das Helm-Deployment der Element Server Suite: +flux get helmreleases -n matrix --watch + +# Zeigt, wie die Pods hochfahren: +kubectl get pods -n matrix -w +``` +Sobald alle Pods auf `Running` stehen und die Zertifikate über Let's Encrypt validiert wurden (`kubectl get certificate -n matrix`), ist dein Matrix-Stack unter `https://axion1337.chat` erreichbar. \ No newline at end of file