Skip to content
🔵Entwurf (gut)64%
Vollständigkeit:
80%
Korrektheit:
80%
⏳ Noch nicht geprüft

Umgebungsvariablen und .env-Datei ​

Referenz der Konfigurations- und Secrets-Datei des Installationsskripts (install_civitas_core_V1.sh, install_civitas_core_V1s.sh). Die versionierten Vorlagen sind .env.example (V1) und .env-v1s.local.example (V1s).

Dateiname und Ablageort ​

Das Skript lädt die Datei im Host-Kontext nicht selbst. Vor dem Skriptaufruf wird sie manuell gesourct oder die Werte sind als Umgebungsvariablen gesetzt. require_env_file() prüft die Datei vor der VM-Anlage auf Existenz, Lesbarkeit und fehlende Schreibrechte für group/other. run_in_vm() kopiert sie für den VM-Hop in die VM und sourct sie dort.

VarianteDateinameOrtKopie in die VM
V1.env.localHost-Home (${HOME}, bei root /root)/root/civitas-install/.env.local
V1s.env-v1s.local (kein Fallback)Host-Home (${HOME}, bei root /root)/root/civitas-install/.env.local

Die Datei liegt bewusst außerhalb von ${SCRIPT_DIR}: das Installations-Repo wird per Synchronisation mit --delete gespiegelt, Secrets dürfen deshalb nicht darin liegen.

Laden ​

bash
set -a; source ${HOME}/.env-v1s.local; set +a
./install_civitas_core_V1s.sh

Beim VM-Hop (CIVITAS_CONTEXT=vm):

bash
cd ${VM_REMOTE_INSTALL_DIR}
if [[ -f .env.local ]]; then set -a; source .env.local; set +a; fi
./install_civitas_core_V1s.sh

Zwei Punkte sind zu beachten:

  • Der Installer kopiert nur die Datei aus ${HOME} in die VM. Die Datei muss als ${HOME}/.env-v1s.local (V1s) bzw. ${HOME}/.env.local (V1) vorliegen; require_env_file() bricht ab, wenn sie fehlt oder für group/other schreibbar ist.
  • Nur die Werte, die in der Datei stehen, werden mitkopiert. Variablen, die nur in der Host-Shell exportiert sind, erreichen die VM nicht.

Struktur der Vorlage ​

In den Vorlagen stehen aktiv (nicht auskommentiert) nur Pflichtvariablen, Secrets und der WireGuard-Block mit CHANGEME-Platzhaltern. Alle Variablen mit einem Default in 01_config.sh sind auskommentiert (# export NAME="Default"), damit die Defaults nur einmal, in 01_config.sh, leben.

Netzwerkmodus: WG_ENABLE ​

WG_ENABLE steuert, ob WireGuard konfiguriert wird.

WertBedeutung
true (Default)WireGuard aktiv, die WG_*-Secrets sind Pflicht
falseWireGuard aus, die WG_*-Variablen werden ignoriert

Groß-/Kleinschreibung ist egal. Jeder andere Wert bricht ab. Ein leerer Wert wird wie der Default (true) behandelt. Das Ergebnis wird als WG_ENABLED=true|false exportiert.

Bei WG_ENABLE=false prüft 03_preflight.sh das Werkzeug wg nicht, 06_civitas.sh überspringt setup_wireguard und 07b_verify_phase2.sh überspringt Tunnel- und OPNsense-Prüfungen.

Variablenübersicht ​

Steuerung / Debug ​

VariablePflichtDefaultWirkung
CIVITAS_DEBUGneinfalseausführliche Debug-Ausgabe
LE_CERTneinfalsetrue = Staging + Production, false = nur Staging
LE_REQUESTS_BLOCKEDneinfalsetrue = keine neuen Zertifikatsanforderungen
APISIX_DASHBOARDneinfalseAPISIX-Dashboard aktivieren
RUN_TESTSneinfalseE2E-Tests nach Installation
CERT_BACKUP_FILEneinle-certs-backup.yamlDateiname (relativ) oder Pfad in der VM
CERT_BACKUP_HOST_FILEnein${HOME}/le-certs-backup.yamlHost-Pfad des Zertifikats-Backups
CERT_BACKUP_MIN_DAYSnein30Mindest-Restlaufzeit in Tagen, damit ein Backup als brauchbar gilt (1-600)
LOG_FILEneinleeroptionaler Pfad für File-Logging

CERT_BACKUP_FILE bestimmt den Dateinamen oder Pfad in der VM. Der Installer liest ein vorhandenes Backup von CERT_BACKUP_HOST_FILE auf dem Host und nutzt den veralteten Pfad ${SCRIPT_DIR}/le-certs-backup.yaml als Fallback mit Warnung. Nach einer Neuausstellung holt er das Backup nach CERT_BACKUP_HOST_FILE zurück. Das Backup ist funktionsfähig.

NO_NEW_LE_CERT existiert nicht; der Safety-Schalter heißt LE_REQUESTS_BLOCKED.

Domain ​

VariablePflichtDefaultWirkung
DOMAIN_NAMEja-Basis-Domain ohne udp.-Präfix

01_config.sh bildet daraus DOMAIN="udp.${DOMAIN_NAME}". Ein separates export DOMAIN=… ist wirkungslos.

Tests (E2E) ​

VariablePflichtDefaultWirkung
TEST_IDnein-E2E-Test-Identifier (erstes Domain-Label, z. B. udp)
BASE_DOMAINnein-E2E-Test-Basis-Domain (Rest der Domain)

TEST_ID und BASE_DOMAIN werden vom Installer nicht gelesen. Eine Verwendung durch das E2E-Testrepo ist nicht belegt. TEST_ID.BASE_DOMAIN entspricht DOMAIN.

VM-Zugang, SMTP, Admin ​

VariablePflichtDefaultWirkung
ROOT_PASSWORDneinleerwird per chpasswd in der VM gesetzt (Konsole), wenn gesetzt
SMTP_HOSTja-SMTP-Server
SMTP_PORTnein587SMTP-Port
SMTP_USERja-SMTP-Benutzer
SMTP_PASSja-SMTP-Passwort
ADMIN_EMAILneinadmin@${DOMAIN_NAME}E-Mail des Plattform-Administrators
ADMIN_PASSja-master_password und platform_admin-Passwort
TENANT_ADMIN_PASSnein-wird von keinem Modul gelesen

Mindestens VM_SSH_PUBKEY oder ROOT_PASSWORD muss gesetzt sein, sonst bricht init_ssh_access vor jeder VM-Änderung ab. Der Installations-Key zählt dabei nicht.

Netzwerkmodus / WireGuard ​

VariablePflichtDefaultWirkung
WG_ENABLEneintruefalse deaktiviert WireGuard
WG_VM_PRIVATE_KEYbei WG_ENABLE=true-WireGuard-Private-Key der VM
WG_OPN_PUBLIC_KEYbei WG_ENABLE=true-WireGuard-Public-Key der OPNsense
WG_OPN_ENDPOINTbei WG_ENABLE=true-öffentliche IP:Port der OPNsense
WG_PRESHARED_KEYneinleerWireGuard-Pre-Shared-Key
WG_LISTEN_PORTnein51820WireGuard-Listen-Port

SSH-Zugang zur VM ​

VariablePflichtDefaultWirkung
VM_SSH_PUBKEYneinleeröffentliche Schlüssel für direkten Login, eine Zeile pro Key
VM_REMOVE_INSTALL_KEYneinfalsetrue = Installations-Key am Ende aus der VM entfernen
INSTALL_KEY_DIRnein${HOME}/.local/share/civitas-install/<VM_ID>Ablage des Installations-Key-Paars

Details zum Ablauf, zur Validierung und zur Altbestand-Migration in ssh-zugang-zur-vm.md.

Cluster / Kubernetes ​

VariablePflichtDefaultWirkung
K3S_NODE_NAMEneinhostnamek3s-Node-Name
CC_ENVIRONMENTneincc-prdAnsible-Environment-Name (Muster {CC_ENVIRONMENT}-{stack})
K8S_CONTEXTneindefaultkubectl-Kontext
STORAGECLASS_RWOneinlocal-pathStorageClass ReadWriteOnce
STORAGECLASS_RWXneinlocal-pathStorageClass ReadWriteMany
STORAGECLASS_LOCneinlocal-pathStorageClass lokal
INGRESS_CLASSneinnginxIngress-Klasse
CERT_MANAGER_ISSUERneinselfsigned-issuercert-manager-Issuer
CREDENTIALS_OUTPUT_PATHnein/root/civitas-install/credentials.envZielpfad der Dienst-Passwörter

Wiederholungen und Zeitsteuerung ​

VariablePflichtDefaultWirkung
CC_API_MAX_RETRIESnein60maximale API-Check-Versuche (1-600)
CC_DEPLOYMENT_MAX_RETRIESnein30maximale Deployment-Check-Versuche (1-600)
CC_EXEC_ATTEMPTSnein2Versuche für cc_cli exec bei vorübergehenden Fehlern (1-600)
CC_EXEC_RETRY_DELAYnein30Sekunden zwischen den cc_cli exec-Versuchen (1-600)
IDM_TOKEN_RETRIESnein6Versuche für den Keycloak-Master-Token (1-600)
IDM_TOKEN_RETRY_DELAYnein10Sekunden zwischen den Token-Versuchen (1-600)

Die Zahlenvariablen werden auf 1 bis 600 geprüft.

Host / VM (Proxmox) ​

VariableDefaultWirkung
VM_ID2010Proxmox VM-ID
VM_NAMEcivitas-coreVM-Anzeigename
VM_RAM_MB40960RAM in MiB
VM_CORES12vCPUs
VM_DISK_GB300Disk-Größe in GiB
VM_BRIDGEvmbr0Bridge-Netzwerk
PROXMOX_STORAGElocal-zfs-civitasProxmox-Storage für die VM-Disk; unterstützt: zfspool, lvmthin
VM_IP_STATIC192.168.12.139IPv4-Adresse der VM
VM_IP_PREFIX24IPv4-Präfixlänge
VM_GW192.168.12.1IPv4-Gateway
VM_IP6_STATICleerIPv6-Adresse der VM; leer = IPv6 aus
VM_IP6_PREFIX64IPv6-Präfixlänge
VM_GW6leerIPv6-Gateway (Pflicht, wenn VM_IP6_STATIC gesetzt)
PBS_STORAGEbackup-p2d2-kingluiPBS-Storage; leer = Backup-Prüfung überspringen
CLOUD_IMAGE_URLDebian-13-Cloud-ImageQuelle für das Cloud-Image
CLOUD_IMAGE_CACHE/var/lib/vz/template/qcowCache-Verzeichnis für das Cloud-Image
SOHO_GATEWAY${VM_GW}Gateway für die Phase-0-Netzprüfung

Unterscheidung „leer = Default" und „leer = deaktiviert":

  • Die meisten Host-/VM-Werte verwenden ${VAR:-default}. Ein leerer Wert erhält den Default, nicht den leeren Wert.
  • PBS_STORAGE verwendet ${VAR-default}. Ein leerer Wert bleibt leer und deaktiviert die Backup-Prüfung.
  • VM_IP6_STATIC und VM_GW6 sind standardmäßig leer. IPv6 ist damit aus. Wer IPv6 nutzt, setzt beide Variablen ausdrücklich.

V1s-spezifisch ​

VariablePflichtDefaultWirkung
V1S_IMAGE_TAGneinv1s-localTag des lokal gebauten Portal-Backend-Images

RustFS / S3 (nur V1) ​

VariablePflichtDefaultWirkung
RUSTFS_ENDPOINTneinleerS3-Endpoint; leer = s3_backend deaktiviert
RUSTFS_ACCESS_KEYneinleerS3-Access-Key
RUSTFS_SECRET_KEYneinleerS3-Secret-Key
RUSTFS_BUCKET_NAMEneinportal-configS3-Bucket-Name
RUSTFS_REGIONneineu-north-1S3-Region
RUSTFS_FORCE_PATH_STYLEneintrueS3 Force-Path-Style
MC_VERSIONneinfestmc-Client-Version
MC_ALIAS_NAMEneincivitas-rustfsmc-Alias für den Endpoint
MC_BUCKET_NAMEneinportal-configmc-Bucket-Name

V1s benötigt diese Variablen nicht (statische Masterportal-Konfiguration).

CHANGEME-Warnung ​

warn_changeme_values läuft zweimal pro Lauf: als „Start" direkt nach der Startmeldung und als „Ende" unmittelbar vor der Schlussmeldung (Host- und VM-Zweig). Sie warnt nur und bricht nie ab. Bricht das Skript vorher ab, erscheint kein „Ende"-Hinweis.

Geprüft werden alle Shell-Variablen, deren Wert CHANGEME enthält. WG_* werden bei WG_ENABLED!=true übersprungen. NAME=Wert wird nur ausgegeben, wenn der Wert aus A-Za-z0-9._@:/- besteht, höchstens 64 Zeichen lang ist und CHANGEME als eigenständiges Token enthält. Sonst erscheint nur der Name mit „(enthält CHANGEME)".

Umgebungen ​

Die beiden Profile unterscheiden sich in Netzwerkmodus, Storage und VM-Größe.

ProfilWG_ENABLEPROXMOX_STORAGEVM_BRIDGEVM_CORESPBS_STORAGE
Hinter HAProxy (udp.data-dna.eu)truelocal-zfs-civitasvmbr012gesetzt
Standalone (udp.projekte-koenig.eu)falselocal-lvmvmbr110leer

Die Betriebsarten sind in Netzwerk-Topologie beschrieben.

Beispielprofile ​

Hinter HAProxy mit WireGuard (WG_ENABLE=true) ​

bash
export WG_ENABLE="true"
export PROXMOX_STORAGE="local-zfs-civitas"
export VM_BRIDGE="vmbr0"
export VM_CORES="12"
export WG_VM_PRIVATE_KEY="…"
export WG_OPN_PUBLIC_KEY="…"
export WG_OPN_ENDPOINT="…:51820"
export VM_IP6_STATIC="fd01:1:1:1::139"
export VM_GW6="fd01:1:1:1:de39:6fff:febe:9962"

Standalone ohne WireGuard (WG_ENABLE=false) ​

bash
export WG_ENABLE="false"
export PROXMOX_STORAGE="local-lvm"
export VM_BRIDGE="vmbr1"
export VM_CORES="10"
export VM_GW="192.168.12.1"
export VM_IP6_STATIC="fd01:1:1:1::139"
export VM_GW6="fd01:1:1:1::1"
export PBS_STORAGE=""
export DOMAIN_NAME="projekte-koenig.eu"
export CC_API_MAX_RETRIES="60"
export VM_SSH_PUBKEY="<public-key>"

Das Profil Standalone setzt VM_SSH_PUBKEY für den direkten Login.

Bekannte Einschränkungen ​

  • ROOT_PASSWORD ist optional. Gesetzt wird es nach dem SSH-Zugang per chpasswd in der VM.
  • ENVIRONMENT in 01_config.sh (hart cc-prd) ist ein ungenutzter Duplikat-Name zu CC_ENVIRONMENT.
  • TEST_ID/BASE_DOMAIN werden vom Installer nicht gelesen.
  • Der CHANGEME-„Ende"-Hinweis fehlt, wenn das Skript vorher abbricht.

Sicherheitshinweise ​

Die .env-Datei enthält Secrets und wird nicht committet. Die versionierten Vorlagen enthalten nur Platzhalter (CHANGEME).