Zum Inhalt springen
Alle Anleitungen

Allgemein ·

Apps und DNS mit Terraform verwalten

Den headpat-Terraform-Provider installieren, eine App mit eigenem Hostnamen und DNS-Einträgen in HCL beschreiben, bestehende Dienste importieren und den Bezahlschritt regeln, den Terraform nicht übernehmen kann.

Wenn du deine Infrastruktur schon in Terraform hältst, können deine Headpat-Apps, eigenen Hostnamen und DNS-Einträge dort ebenfalls leben. Der headpat-Provider spricht mit derselben API wie das Panel, authentifiziert mit einem API-Schlüssel. Diese Anleitung installiert ihn, legt eine App mit Hostname und DNS-Eintrag an und erklärt den einen Schritt, den Terraform nicht für dich erledigen kann: das Bezahlen.

Was du brauchst

1. Provider installieren

Der Provider ist noch nicht in der öffentlichen Terraform-Registry, deshalb sagst du Terraform, wo er liegt. Lade die Zip-Datei für dein System aus dem neuesten Terraform-Provider-Release (die Releases heißen Terraform provider x.y.z) und entpacke die Binärdatei in einen Ordner deiner Wahl, zum Beispiel ~/.terraform.d/headpat.

Dann zeigst du Terraform mit einem Dev Override in der CLI-Konfigurationsdatei auf diesen Ordner, ~/.terraformrc unter Linux und macOS, %APPDATA%\terraform.rc unter Windows:

provider_installation {
  dev_overrides {
    "headpatcloud/headpat" = "/home/you/.terraform.d/headpat"
  }
  direct {}
}

Mit einem Dev Override überspringt Terraform terraform init für diesen Provider und warnt bei jedem Lauf, dass es einen lokalen Build verwendet. Das ist so gewollt.

2. Provider konfigurieren

terraform {
  required_providers {
    headpat = {
      source = "headpatcloud/headpat"
    }
  }
}

provider "headpat" {}

Der Provider liest den Schlüssel aus der Umgebungsvariable HEADPAT_API_KEY. Du kannst auch api_key im Provider-Block setzen, etwa aus einer Terraform-Variable; der Schlüssel selbst gehört nie ins Repository.

3. App, Hostname und DNS-Eintrag beschreiben

data "headpat_app_catalog" "all" {}

resource "headpat_dns_zone" "example" {
  zone_name = "example.com"
}

resource "headpat_app" "api" {
  template = "container-app"
  tier     = "standard"
  name     = "api"
  image    = "ghcr.io/acme/api:1.4.0"
  port     = 3000
  env = {
    NODE_ENV = "production"
  }
  volume_path = "/data"
}

resource "headpat_app_domain" "api" {
  app_id   = headpat_app.api.id
  hostname = "api.example.com"
}

resource "headpat_dns_record" "api" {
  zone_id = headpat_dns_zone.example.id
  name    = "api.example.com"
  type    = "CNAME"
  values  = [headpat_app_domain.api.dns_target]
}

resource "headpat_dns_record" "api_ownership" {
  zone_id = headpat_dns_zone.example.id
  name    = "${headpat_app_domain.api.ownership_txt_label}.api.example.com"
  type    = "TXT"
  values  = ["\"${headpat_app_domain.api.ownership_txt_value}\""]
}

output "hostname" {
  value = headpat_app.api.hostname
}

template und tier sind die Slugs aus dem Katalog; data.headpat_app_catalog.all.templates listet sie mit Preisen. Änderungen an image, port, env oder volume_path aktualisieren die laufende App; Änderungen an Template, Tier oder Name ersetzen sie. Bei den anderen Templates, etwa WordPress oder PostgreSQL, lässt du die Container-App-Attribute weg.

headpat_app_domain liefert alles, was das Panel zu einem eigenen Hostnamen zeigt: das CNAME-Ziel, die A-Record-Alternative für Apex-Namen und den TXT-Eintrag, der den Besitz nachweist. Werden diese Werte wie oben in headpat_dns_record eingespeist, legt ein einziges terraform apply die App an, hängt den Hostnamen an und veröffentlicht die Einträge, die ihn validieren.

export HEADPAT_API_KEY=...
terraform plan
terraform apply

4. Neue Dienste bezahlen

Terraform kann keinen Stripe-Checkout abschließen. Zahlt dein Konto pro Dienst, liefert das Anlegen einer headpat_app einen Entwurf und eine checkout_url, und der Apply endet mit einer Warnung, die die URL nennt. Öffne sie, bezahle, und die App wird eingerichtet; der nächste terraform plan oder terraform refresh zeigt sie als running. Anders abgerechnete Konten überspringen diesen Schritt, und der Provider wartet, bis die App läuft (create_timeout_minutes, standardmäßig zehn).

Bestehende Dienste importieren

terraform import headpat_app.api <app-id>
terraform import headpat_app_domain.api <app-id>/<domain-id>
terraform import headpat_dns_zone.example <zone-id>
terraform import headpat_dns_record.api <zone-id>/api.example.com/CNAME

Die IDs stehen in den URLs des Panels sowie in headpat apps list --json und headpat dns zones --json der CLI.

Löschen

terraform destroy auf einer headpat_app kündigt das Abonnement standardmäßig zum Ende des Abrechnungszeitraums, die App läuft also bis dahin weiter. Setze delete_immediately = true auf der Ressource, wenn sie sofort verschwinden soll; die Daten gehen damit verloren.

Referenz

Die Ressourcen und Datenquellen mit allen Attributen sind unter terraform/docs im Release-Repository dokumentiert, daneben liegt ein vollständiges Beispiel. Heute verfügbar: headpat_app, headpat_app_domain, headpat_dns_zone, headpat_dns_record sowie die Datenquellen headpat_app_catalog, headpat_app und headpat_dns_zones.

Bereit, es auszuprobieren?

Brauchst du Hilfe?

Wenn etwas aus dieser Anleitung bei dir nicht klappt, schreib uns und wir helfen dir weiter.

Kontakt aufnehmen