Compare commits

..

3 Commits

Author SHA1 Message Date
4d0146d6c2 Deploy: Auto-DNS über offizielle Hetzner Cloud DNS API (ein Token)
Hetzner hat DNS in die Cloud-API integriert → der hcloud-Provider (>=1.64) bringt
hcloud_zone/hcloud_zone_rrset mit. germanbrew/hetznerdns (separate API + eigener
Token) entfernt. dns.tf legt mit manage_dns=true Apex (@) + Wildcard (*) als
A-Records auf die caddy_ip; Zone wird per Name nachgeschlagen. Plan verifiziert
(12 to add). Kein separater DNS-Token mehr nötig.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-04 15:03:17 +02:00
70e979eae7 Deploy: cloud-init seedet die DB (app:seed) nach den Migrationen
Bisher liefen nur Migrationen → keine Daten, kein Admin-Login. app:seed ist
idempotent (überspringt, wenn admin@vcard4reseller.de existiert), läuft nur auf
app-1 (RUN_MIGRATIONS). Damit ist der dokumentierte Login admin/admin direkt nutzbar.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-04 14:26:00 +02:00
a3bdb3f81b Deploy: Auto-DNS optional/deaktiviert (manage_dns=false unblockt apply)
Der germanbrew/hetznerdns-Provider ruft schon beim Init die API auf und scheitert
am leeren Token, selbst ohne DNS-Ressourcen. Da DNS standardmäßig manuell gesetzt
wird (manage_dns=false), Provider entfernt + dns.tf → dns.tf.disabled (Code bleibt
für späteres Aktivieren erhalten). Lock-File auf hcloud-only reduziert.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-04 14:24:42 +02:00
3 changed files with 15 additions and 25 deletions

View File

@ -59,6 +59,8 @@ write_files:
sleep 20
if [ "$RUN_MIGRATIONS" = "true" ]; then
$COMPOSE exec -T php php bin/console doctrine:migrations:migrate --no-interaction || true
# Erst-Befüllung (idempotent: überspringt, wenn admin@vcard4reseller.de existiert)
$COMPOSE exec -T php php bin/console app:seed || true
fi
$COMPOSE exec -T php php bin/console cache:clear || true
runcmd:

View File

@ -1,32 +1,28 @@
# Optional: DNS-Records über die Hetzner DNS API anlegen (manage_dns = true).
# Voraussetzung: Zone liegt bei Hetzner DNS, separater DNS-API-Token.
# DNS über die Hetzner Cloud DNS API (manage_dns = true) gleicher Cloud-Token,
# DNS ist inzwischen in die Cloud-API integriert. Die Zone muss bereits in
# Hetzner DNS existieren (Lookup per Name).
data "hetznerdns_zone" "zone" {
data "hcloud_zone" "zone" {
count = var.manage_dns ? 1 : 0
name = var.dns_zone_name
}
locals {
# Relativer Record-Name: "@" wenn Portal == Zone, sonst der Subdomain-Teil
portal_record_name = var.domain == var.dns_zone_name ? "@" : replace(var.domain, ".${var.dns_zone_name}", "")
}
# Portal-Domain Caddy
resource "hetznerdns_record" "portal" {
# Portal-Domain (Apex "@" wenn domain == zone, sonst Subdomain-Teil) Caddy
resource "hcloud_zone_rrset" "portal" {
count = var.manage_dns ? 1 : 0
zone_id = data.hetznerdns_zone.zone[0].id
name = local.portal_record_name
zone = data.hcloud_zone.zone[0].id
name = var.domain == var.dns_zone_name ? "@" : replace(var.domain, ".${var.dns_zone_name}", "")
type = "A"
value = hcloud_server.caddy.ipv4_address
ttl = 300
records = [{ value = hcloud_server.caddy.ipv4_address }]
}
# Wildcard für Firmen-Subdomains (KONZEPT §11) Caddy (On-Demand-TLS)
resource "hetznerdns_record" "wildcard" {
resource "hcloud_zone_rrset" "wildcard" {
count = var.manage_dns ? 1 : 0
zone_id = data.hetznerdns_zone.zone[0].id
zone = data.hcloud_zone.zone[0].id
name = "*"
type = "A"
value = hcloud_server.caddy.ipv4_address
ttl = 300
records = [{ value = hcloud_server.caddy.ipv4_address }]
}

View File

@ -3,11 +3,7 @@ terraform {
required_providers {
hcloud = {
source = "hetznercloud/hcloud"
version = "~> 1.48"
}
hetznerdns = {
source = "germanbrew/hetznerdns"
version = "~> 3.0"
version = "~> 1.64" # >= 1.64 für integriertes DNS (hcloud_zone_rrset)
}
}
}
@ -15,7 +11,3 @@ terraform {
provider "hcloud" {
token = var.hcloud_token
}
provider "hetznerdns" {
api_token = var.hetzner_dns_token
}