aboutsummaryrefslogtreecommitdiff
path: root/README.md
blob: 4bce6f7729f4eb122429922a6f3628bcb563ebb3 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
# IT-Infrastruktur für den Stadtteilbeirat Heimfeld

Dieses Git-Repository enthält den Quellcode für Konfiguration und Verwaltung von Rechnern, welche Dienste unter der DNS-Domain `heimfeld.hamburg` bereitstellen.

## Vorbereitung

Um mit dem Code zu arbeiten, zunächst Nix installieren:

- Debian/Ubuntu

  ```bash
  apt install --yes curl git jq nix
  ```

- Arch

  ```bash
  pacman --sync --refresh --noconfirm curl git jq nix
  ```

Anschließend Flakes aktivieren:

```bash
echo extra-experimental-features = nix-command flakes >> /etc/nix/nix.conf
```

Beim ersten Aufruf von `nix run` oder `nix flake check` werden Abhängigkeiten geladen oder gebaut, was eine Weile dauern kann.
Spätere Aufrufe sind viel schneller, da nur Änderungen verarbeitet werden müssen.

## Abläufe

### Quellcode abrufen

```bash
git clone https://git.heimfeld.hamburg/infra
```

Weitere URLs (z.B. für SSH) sind zu finden auf <https://git.heimfeld.hamburg/infra/> unter **Clone**.

### SSH einrichten

Folgendes in `~/.ssh/config` eintragen:

```
Host tharos
  ForwardAgent yes
  HostName 81.169.239.254
  IdentityFile /home/<user>/.ssh/tharos
```

wobei `<user>` das eigene lokale Linux-Benutzerkonto ist.

### Administrator hinzufügen

Nutzernamen von Administratoren und ihre SSH-Keys sind unter [`keys`](./keys) organisiert.
Das Format des Ordners ist in [`keys.nix`](./keys.nix) dokumentiert.


Sich selbst als Administrator mit genau einem SSH-Schlüssel hinzuzufügen:

```bash
cat ~/.ssh/foo.pub > ./keys/$USER
```

Sich selbst als Administrator mit mehreren Schlüsseln hinzuzufügen:

```bash
mkdir .keys/$USER
cp ~/.ssh/foo.pub > ./keys/$USER/
cp ~/.ssh/bar.pub > ./keys/$USER/
```

### Änderungen am Quellcode hochladen

Auf dem Server muss ein [SSH Public Key für den hochlandenden Nutzer](#administrator-hinzufugen) von einem Administrator eingerichtet worden sein.

[Erstmalig wurde der Quellcode über HTTPS abgerufen](#quellcode-abrufen), daher muss `remotes` angepasst werden:

```bash
git remote set-url origin ssh://heimfeld.hamburg/git/infra
```

Da mehrere Nutzer Schreibzugriff auf das Repository haben, muss jeder Nutzer explizit den eigenen Zugriff mit [`safe.directory`](https://git-scm.com/docs/git-config#Documentation/git-config.txt-safedirectory) erlauben:

```bash
ssh tharos git config --global --add safe.directory /git/infra
```

Dann wie üblich:

```bash
git push origin main
```

### Tests durchführen

```bash
nix flake check
```

### Konfiguration lokal ausprobieren

```bash
nix run .#vm-tharos
```

Dieser Befehl startet eine virtuelle Maschine mit der exakten Konfiguration des Produktionssystems.

Anschließend kann man sich über SSH mit dem auf der Maschine eingerichteten Nutzer und dem entsprechenden SSH-Key verbinden:

```bash
ssh localhost -p 10022 -o ForwardAgent=yes -i ~/.ssh/tharos
```

Der SSH-Port ist entsprechend der VM-Konfiguration versetzt um Konflikte mit möglicherweise bestehenden Diensten auf dem Host zu vermeiten.
`ForwardAgent=yes` ist erforderlich, um Befehle mit `sudo` auszuführen, wobei die Authentifizierung über direkt SSH statt einem Passwort erfolgt.

### Eine neue Maschine aufsetzen

**ACHTUNG: Alle Daten auf dem Zielsystem werden dabei gelöscht!**

```bash
nix run .#infect-tharos
```

Die NixOS-Installation erfolgt mit [`nixos-anywhere`](https://nix-community.github.io/nixos-anywhere/).

Mit dem laufenden Produktionssystem über SSH verbinden:

```bash
ssh tharos
```

### Geänderte Konfiguration anwenden

```bash
nix run .#deploy-tharos -- switch
```

## Architektur

Die Systeme laufen auf NixOS und werden mit Nix verwaltet.

Dokumentation zu beiden ist zu finden unter <https://nix.dev>.
Die wesentlichen Aspekte sind dort die [Nix-Sprache](https://nix.dev/tutorials/nix-language) und das [Modulsystem](https://nix.dev/tutorials/module-system/).

Der Code hier ist modular organisiert mit Flake Parts, was es einfacher macht isolierte Änderungen vorzunehmen und die Lesbarkeit verbessern hilft.
Flake Parts sind dokumentiert unter <https://flake.parts>.

Zusätzlich wird mit `flakes.machines` eine eigene Abstraktion verwendet um Systeme und entsprechende Hilfswerkzeuge zu konfigurieren.
Dies ist momentan nur im Quellcode dokumentiert in [`machines.nix`](./machines.nix).

Zur Zeit ist genau eine Maschine in Betrieb, die in [`tharos.nix`](./tharos.nix) spezifiziert ist.
Der Server läuft bei [STRATO](https://www.strato.de) unter Kundennummer 73292174, Auftragsnummer 7709638.