Automate immutable production deployments
This commit is contained in:
@@ -33,9 +33,12 @@ chmod 600 terraform.tfvars
|
||||
```
|
||||
|
||||
Auch `terraform.tfstate` bleibt lokal und wird nicht nach Git oder auf den
|
||||
Anwendungsserver übertragen. Nach dem ersten Apply sollte die State-Datei
|
||||
verschlüsselt gesichert werden, weil OpenTofu sie für spätere Änderungen an
|
||||
denselben Ressourcen benötigt.
|
||||
Anwendungsserver übertragen. Nach jedem Import oder Apply muss die State-Datei
|
||||
mit Dateimodus `0600` verschlüsselt gesichert werden, weil OpenTofu sie für
|
||||
spätere Änderungen an denselben Ressourcen benötigt. Ist ein älterer State
|
||||
verloren, werden vorhandene Ressourcen vor jedem Apply anhand ihrer
|
||||
Hetzner-IDs importiert; ein paralleles Neuerzeugen gleichnamiger Ressourcen ist
|
||||
nicht zulässig.
|
||||
|
||||
## Infrastruktur erzeugen
|
||||
|
||||
@@ -44,10 +47,15 @@ cd infra/opentofu
|
||||
tofu init
|
||||
tofu fmt -check
|
||||
tofu validate
|
||||
umask 077
|
||||
tofu plan -out=watermaps.tfplan
|
||||
tofu apply watermaps.tfplan
|
||||
```
|
||||
|
||||
Gespeicherte Plan-Dateien enthalten trotz als sensibel markierter Variablen
|
||||
unter Umständen den Hetzner-Token. Sie müssen deshalb wie `terraform.tfvars`
|
||||
und der State immer Modus `0600` haben und dürfen nicht weitergegeben werden.
|
||||
|
||||
Die feste IPv4-Adresse und den erforderlichen manuellen DNS-Eintrag zeigt
|
||||
OpenTofu anschließend an:
|
||||
|
||||
@@ -79,3 +87,25 @@ Der Status des ersten Starts lässt sich so prüfen:
|
||||
ssh deploy@"$(tofu output -raw server_ipv4)" \
|
||||
"cloud-init status --wait && systemctl status watermaps-volume-setup --no-pager"
|
||||
```
|
||||
|
||||
Cloud-init bindet ausschließlich das von OpenTofu erzeugte Volume über den
|
||||
stabilen Hetzner-Gerätepfad
|
||||
`/dev/disk/by-id/scsi-0HC_Volume_<volume-id>` ein. Es wird nicht heuristisch
|
||||
das erste Blockgerät mit dem Modellnamen `Volume` ausgewählt. Nach dem Mount
|
||||
wird zusätzlich die UUID des tatsächlich eingehängten Geräts geprüft. Ein
|
||||
Volume ohne lesbares Dateisystem wird standardmäßig nicht formatiert; nur bei
|
||||
einem garantiert neuen, leeren Volume darf
|
||||
`initialize_empty_routing_volume = true` für die einmalige Initialisierung
|
||||
gesetzt werden. Bei Importen und Serverwechseln bleibt der Wert `false`.
|
||||
|
||||
Der Löschschutz ist getrennt konfiguriert:
|
||||
|
||||
- `enable_server_protection` für den austauschbaren Host,
|
||||
- `enable_primary_ip_protection` für die feste öffentliche Adresse,
|
||||
- `enable_volume_protection` für Routing-, Zertifikats- und PostGIS-Daten.
|
||||
|
||||
Bei einem kontrollierten Servertausch bleiben IP- und Volume-Schutz immer
|
||||
aktiv. Ein Plan, der `hcloud_primary_ip.main` oder
|
||||
`hcloud_volume.routing_data` ersetzen beziehungsweise löschen will, darf nicht
|
||||
angewendet werden. Zusätzlich verhindert OpenTofu für beide Ressourcen mit
|
||||
`prevent_destroy` eine versehentliche Löschung durch den IaC-Plan.
|
||||
|
||||
Reference in New Issue
Block a user