Zum Inhalt

Arbeitsrechner einrichten

Ziel

Danach kannst du auf deinem Rechner cue cmd plan für beide Hosts und für DNS fehlerfrei ausführen.

Voraussetzungen

Schritte

1. Werkzeuge installieren

Installiere jeweils nach der Anleitung des Herstellers:

syslet selbst brauchst du nicht auf deinem Rechner, es läuft nur auf den Hosts.

Prüfen:

Bash
1
2
3
4
5
6
7
git --version
cue version
desync -h
sops --version
age --version
terraform version
direnv version

Jeder Befehl gibt eine Version bzw. bei desync -h die Hilfe aus. Meldet die Shell command not found, liegt das Programm nicht im PATH; bei desync fehlt meist der Ordner, in den go install installiert (go env GOPATH, darin bin).

2. SSH-Schlüssel bei Codeberg hinterlegen

Damit kommst du per SSH an das Repo; folge Adding an SSH key to your account in der Codeberg-Doku.

Bash
ssh -T git@codeberg.org

Erwartet: eine Begrüßung mit deinem Codeberg-Namen, etwa Hi there, <name>! You've successfully authenticated with the key named ….

3. Git einrichten

Name und E-Mail sind die deiner Codeberg-Identität:

Bash
1
2
3
4
5
git config --global user.name "Vorname Nachname"
git config --global user.email "du@example.org"
git config --global pull.rebase true
git config --global fetch.prune true
git config --global diff.colorMoved zebra

Die Einstellungen stammen aus Git configurations to set by default; warum wir pull.rebase setzen, steht in Git-Workflow.

Bash
git config --global --list

Erwartet: unter anderem pull.rebase=true, fetch.prune=true, diff.colormoved=zebra und dein Name und deine E-Mail.

4. Repo klonen

Wechsle in den Ordner, in dem das Repo liegen soll:

Bash
git clone ssh://git@codeberg.org/garagelab/infra.git
cd infra

Erwartet: ein neuer Ordner infra mit den Ordnern syslet, desec, apps und weiteren.

5. age-Schlüssel für die Secrets erzeugen

SOPS sucht den age-Schlüssel unter Linux in ~/.config/sops/age/keys.txt, unter macOS in ~/Library/Application Support/sops/age/keys.txt (siehe Encrypting using age in der SOPS-Doku). Lege die Datei am passenden Ort an, zum Beispiel unter Linux:

Bash
mkdir -p ~/.config/sops/age
age-keygen -o ~/.config/sops/age/keys.txt

Erwartet: Public key: age1…. Das ist der öffentliche Teil, den du in Schritt 7 weitergibst. Die Datei keys.txt enthält den privaten Teil: Sie gehört nicht ins Repo und wird mit niemandem geteilt. Sichere sie in deinem persönlichen Passwortmanager; ohne sie kannst du die Secrets nicht mehr bearbeiten.

6. SSH-Schlüssel für die Hosts erzeugen

Bash
ssh-keygen -t ed25519 -f ~/.ssh/garagelab -C "<dein-name>@garagelab"

Erwartet: zwei neue Dateien, ~/.ssh/garagelab (privat) und ~/.ssh/garagelab.pub (öffentlich).

7. Freischalten lassen

Schick der Person, die dich freischaltet, die beiden öffentlichen Teile:

  • die Zeile age1… aus Schritt 5 (noch einmal anzeigen: age-keygen -y <pfad-zu>/keys.txt)
  • den Inhalt von ~/.ssh/garagelab.pub

Sie geht nach Neue Person freischalten vor und sagt dir Bescheid, wenn sie fertig ist. Erst danach funktionieren die Schritte ab 8.

8. SSH für die Hosts einrichten

Ergänze deine ~/.ssh/config:

Text Only
1
2
3
4
Host werner.garage-lab.de vm-containerhost.garage-lab.net
    User root
    IdentityFile ~/.ssh/garagelab
    PreferredAuthentications publickey
Bash
ssh werner.garage-lab.de hostname
ssh vm-containerhost.garage-lab.net hostname

Beim ersten Verbinden fragt SSH, ob du dem Host vertraust; bestätige mit yes. Erwartet: der Name des Hosts, ohne Passwortabfrage.

containerhost hat nur eine interne Adresse. Du erreichst ihn nur über das Admin-VPN oder vor Ort aus dem Zauberer-WLAN (siehe Voraussetzungen).

9. API-Tokens ablegen

Die Tokens für deSEC und Authentik stehen im Vaultwarden. Leg im Repo-Ordner eine Datei .envrc an, die sie als Umgebungsvariablen setzt:

Bash
1
2
3
4
5
# deSEC
export DESEC_TOKEN=<token aus dem Vaultwarden>

# Authentik, Service-Account terraform-mgmt; nur nötig, wenn du Authentik änderst
export TF_VAR_authentik_token=<token aus dem Vaultwarden>

Erlaube direnv, die Datei zu laden:

Bash
direnv allow
git status

Erwartet: direnv: export +DESEC_TOKEN +TF_VAR_authentik_token; danach setzt direnv die Variablen jedes Mal, wenn du in den Repo-Ordner oder einen Ordner darunter wechselst. git status zeigt nothing to commit, working tree clean; die Datei taucht nicht auf, weil .gitignore sie ausschließt. Änderst du .envrc später, musst du direnv allow noch einmal ausführen.

Prüfen

Führe plan einmal für jeden Host und für DNS aus. plan ändert nichts.

Bash
1
2
3
4
cd syslet/werner
cue cmd plan
cd ../containerhost
cue cmd plan

Erwartet für jeden Host:

Text Only
No changes detected. All units are up to date.
Bash
cd ../../desec
cue cmd plan

Erwartet:

Text Only
1
2
3
4
5
6
7
Fetching current state...

Token Policies:
  (no changes) token 2262403e-a7f8-41bf-b2f1-d32030cd26b5
  (no changes) token 2f198c18-934a-4db4-872b-b1ab604c8728

No changes. Infrastructure is up-to-date.

Zeigt plan Änderungen statt „No changes“, ist dein Rechner trotzdem richtig eingerichtet; dann gilt plan zeigt unerwartete Änderungen.

Wenn du willst, prüfe auch SOPS: sops -d syslet/werner/creds-mailjet.enc.yaml zeigt die Secrets im Klartext an, ohne die Datei zu ändern.

Wenn etwas schiefgeht

  • Permission denied (publickey) beim Verbinden mit einem Host: Die Freischaltung aus Schritt 7 fehlt noch, oder IdentityFile in Schritt 8 zeigt auf die falsche Datei.
  • Could not resolve hostname oder Zeitüberschreitung bei containerhost: Dein Rechner ist weder mit dem Admin-VPN noch mit dem Zauberer-WLAN verbunden (Schritt 8).
  • reference "fqdn" not found: Du hast plan im falschen Ordner ausgeführt, etwa direkt in syslet/; siehe syslet in diesem Repo.
  • API token required: use -token or set DESEC_TOKEN: direnv hat .envrc nicht geladen. Meldet direnv .envrc is blocked, fehlt direnv allow (Schritt 9); kommt gar keine Meldung von direnv, ist der Hook für deine Shell nicht eingerichtet (Schritt 1).
  • Failed to get the data key bei sops -d: Dein age-Schlüssel liegt nicht dort, wo SOPS sucht (Schritt 5), oder die Freischaltung aus Schritt 7 fehlt noch.