Infrastruktur-Abbildung
Zielprofile für Compute, Storage und Netzwerk mit Kompatibilitätsprüfung definieren.
Zuletzt aktualisiert am
Migrieren Sie Spring Boot und PostgreSQL auf eine STACKIT-VM mit Terraform und Ansible: Eingaben, Bereitstellung, Probe, Cutover, Abnahme und Betriebsübergabe.
Bestätigen Sie anhand der Discovery-Nachweise, dass das Beibehalten von Spring-Boot-JAR, systemd-Service-Modell und PostgreSQL-Engine auf einer VM die Migrationsziele erfüllt; Kubernetes, Cloud Foundry oder PostgreSQL Flex wären stattdessen Replatform. Leiten Sie daraus die Delivery-Reihenfolge ab: Landing Zone, Terraform-Infrastruktur, Ansible-Konfiguration, separate PostgreSQL-Migration und geprobtes Runbook.
Rehost (lift-and-shift) migriert Workloads mit möglichst geringer Anwendungsänderung. Die Strategie reduziert Übergangsrisiken und beschleunigt den Umsetzungsdurchsatz.
Konkret ist Rehost anwendungs- und wellenorientiert: Für jeden Workload werden Zielabbildung, Cutover-Pfad und Runbook-Paket für eine wiederholbare Factory-Ausführung festgelegt.
Relocate und Rehost werden oft gleich verwendet, sind in diesem Framework jedoch bewusst getrennt.
Infrastruktur-Abbildung
Zielprofile für Compute, Storage und Netzwerk mit Kompatibilitätsprüfung definieren.
Daten- und Cutover-Pfad
Transferfenster, Konsistenzchecks und Rollback-Trigger entwerfen.
Stateful-Workload-Handling
Applikations-Deployment und Datenbankmigration als getrennte, aber abgestimmte Streams sequenzieren.
Security und Compliance
Identitätskontrollen, Verschlüsselungsanforderungen und Nachweis-Checkpoints abbilden.
Operatives Handover
Runbooks für Day-1-Betrieb und Incident-Ablaufe nach der Migration sicherstellen.
In Rehost-Szenarien hängt der Datenmigrationspfad davon ab, ob der Workload zustandslos (stateless) oder zustandsbehaftet (stateful) ist:
Für zustandsbehaftete Migrationswellen empfiehlt sich eine Trennung in zwei Streams:
Landing-Zone-Anforderungen und Controls als Startpunkt der Rehost-Ausführung festlegen. Netzwerk-, Identitäts-, Backup- und Monitoring-Voraussetzungen vor der Abfolge der Migration verbindlich festlegen, damit Rehost-Wellen mit planbarer Betriebsqualität umgesetzt werden.
Automatisierten Rehost-Pfad für wiederholbaren Wellen-Durchsatz definieren. Im automatisierten Rehost-Pfad werden Infrastruktur und Anwendung als Code bereitgestellt, damit Wellen reproduzierbar und auditierbar umgesetzt werden können.
VM-Ziel über IaC bereitstellen: Netzwerk, Security-Gruppen, Compute-Instanzen und Basis-Storage mit Terraform oder OpenTofu aufbauen.
Anwendung automatisiert installieren und konfigurieren: Ansible-Playbooks für die Installation von Paketen, Service-Setup und Basiskonfiguration verwenden.
Parameter der Zielumgebung kontrolliert anwenden: Variablen im Ziel, Secret-Referenzen und Endpoint-Mappings in einem gesteuerten automatisierten Lauf einspielen.
Automatisierte Validierungs- und Cutover-Gates ausführen: Health-Checks, Migrations-Pre-Checks, Rollback-Checkpoints und Release-Freigaben vor Live-Switch durchführen.
Das Runbook-Asset beschreibt die PostgreSQL-Flags und den optionalen Dump-basierten Restore-Pfad.
Manuelle Installations-Schritte für Ausnahme-Workloads beschreiben.
Ziel-VM manuell erstellen und vorbereiten: VM über Portal oder CLI bereitstellen, erforderlichen Storage anbinden und OS-Hardening sowie Patch-Baseline anwenden.
Runtime und Abhängigkeiten manuell installieren: Benötigte Runtime-Pakete, System-Bibliotheken und Service-User/-Gruppen gemäß Anleitung zur Installation des Produkts einrichten.
Anwendung klassisch installieren: Geführte Installationsschritte (zum Beispiel Installer- oder Setup-Wizard-Ablauf) ausführen, um das Quell-Deployment-Modell auf der Ziel-VM nachzubilden.
Status der Installation validieren: Service-Start, Rechte auf Dateien, erforderliche Ports, DNS-Erreichbarkeit und ausgehende Konnektivität prüfen.
Manuelle Konfiguration der Laufzeit und Controls festlegen.
Konfiguration der Quelle für den Kontext im Ziel spiegeln: Einstellungen der Anwendung aus der Umgebung der Quelle nachbilden und auf Ziel-Endpoints, DNS, Zertifikate und Service-Integrationen anpassen.
Security- und Einstellungen für Zugriffe anwenden: Service-Credentials, Secret-Handling und Least-Privilege-Zugriffe für den Betrieb im Ziel konfigurieren.
Standards für den Betrieb ausrichten: Logging-Ziele, Metrics-Exporter, Backup-Zeitpläne und Retention-Baselines festlegen.
Konfigurationsparität validieren: Smoke-Checks ausführen, damit die Zielinstanz funktional dem Quellbaseline-Verhalten entspricht.
Manuelle Deployment-Sequenz und Release-Checks definieren.
Finales Zeitfenster für die Migration planen: Freeze-Fenster, Kommunikations-Checkpoints und Rollback-Autorität für den Wechsel in den Produktivbetrieb abstimmen.
Finale Datenmigration ausführen: Letzten Abgleich der Daten oder Restore-Schritte fahren und Konsistenzprüfungen vor Go-live bestätigen.
Live-Verkehr aktivieren: Kontrollierte Live-Schaltung auf die Zielumgebung durchführen und kritische Nutzer- sowie Integrationspfade prüfen.
Handover-Bereitschaft bestätigen: Nachweise dokumentieren, offene Risiken schließen und Ownership für Day-1-Betrieb übergeben.
STACKIT
Der souveräne europäische Cloud-Anbieter hinter dem Framework, mit IaaS und PaaS aus deutschen und österreichischen Rechenzentren und voller Unabhängigkeit.
Dieses Muster bildet das validierte Ziel mit geringer Änderungstiefe für das Spring-Boot-Rehost-
Beispiel ab. Das JAR läuft weiterhin als systemd-Service, während PostgreSQL selbstverwaltet auf
derselben VM verbleibt. Die Betriebsmodelle von Laufzeit und Datenbank bleiben damit VM-zentriert.
Die Baseline umfasst bewusst nur eine VM. Sie demonstriert wiederholbare Migrationskontrollen und Betriebsbereitschaft, nicht High Availability für Anwendung oder Datenbank.
cp env.tfvars.example env.tfvarscreate_project = truetarget_project_name = "cmf-rehost-springboot"target_project_owner_email = "owner@sa.stackit.cloud"parent_container_id = "cmf-parent-container-id"service_account_key_path = "/path/to/stackit-sa-key.json"
run_ansible = truejar_local_path = "ansible/files/springboot-app.jar"availability_zone = "eu01-1"machine_type = "g2i.2"ssh_allowed_cidr = "203.0.113.10/32"app_allowed_cidr = "203.0.113.10/32"enable_observability = trueenable_node_exporter = trueenable_local_postgresql = trueenable_server_backup = trueflags.env):setup_project=truesetup_observability=truesetup_database=falsesetup_workload=truesetup_loadgen=falsesetup_dns=falseterraform initterraform apply -var-file=env.tfvarsErwartetes Ergebnis: application_url stellt die Spring-Boot-Anwendung direkt von der VM auf dem
konfigurierten Applikationsport bereit. PostgreSQL lauscht für die Anwendung auf localhost,
Observability erfasst den Node Exporter und für das Boot Volume ist ein täglicher Backup-Zeitplan aktiv.
Diese Baseline bietet kein automatisches Failover. Eine Load-Balancer- oder Multi-VM-Variante ist erst sinnvoll, nachdem Session Handling, PostgreSQL-Platzierung, Schreibkonsistenz, Health Checks, TLS und Traffic-Umschaltung gemeinsam entworfen und getestet wurden. Behandeln Sie dies als eigene Architekturentscheidung, nicht als implizite Eigenschaft dieses Rehost-Pfads.
STACKIT
Der souveräne europäische Cloud-Anbieter hinter dem Framework, mit IaaS und PaaS aus deutschen und österreichischen Rechenzentren und voller Unabhängigkeit.
Das Migration Framework definiert Strategie, Design, Landing Zone, Migration und Betriebsprinzipien für Rehost-Workloads. Dieses Asset wendet diese Prinzipien auf eine konkrete, ausführbare Spring-Boot- und PostgreSQL-Implementierung auf STACKIT an.
Das gepflegte Repository ist die Source of Truth für Terraform, Ansible, Applikationsartefakte, Migrationsskripte, Validierung und Laufzeitkonfiguration. Dieses Asset beschreibt die Nutzung der Implementierung, ohne ihren vollständigen Quellcode zu duplizieren.
STACKIT CMF Rehost Spring Boot Repository Öffnen Sie die ausführbare Terraform- und Ansible-Referenzimplementierung für den Rehost-Pfad von Spring Boot und PostgreSQL. Repository öffnenDieses Beispiel bildet einen Application-Rehost-Pfad für einen Spring-Boot-Workload ab, konkret das Spring-Music-Beispiel. Der Fokus liegt auf der Verlagerung der Laufzeit nach STACKIT:
systemd, ohne das Laufzeitmodell der Anwendung zu ändern.Die validierte Baseline enthält bewusst keinen Application Load Balancer, DNS-Switch, mehrere VMs, Kubernetes, Cloud Foundry oder PostgreSQL Flex. Ergänzen Sie diese nur als separat entworfene und getestete Erweiterungen; sie sind nicht impliziter Bestandteil dieses Rehost-Beispiels.
systemd-Service.Nutzen Sie dieses gemeinsame Flag-Modell in den Terraform-Variablen, um das Verhalten über CMF-Beispiele hinweg konsistent zu halten:
setup_project: Projektkontext erstellen oder verwenden.setup_observability: Observability-Ressourcen aktivieren oder deaktivieren.setup_database: Optionales VM-lokales PostgreSQL aktivieren oder deaktivieren.setup_workload: Workload-Installation auf der VM aktivieren oder deaktivieren.setup_loadgen: Optionale synthetische Lastgenerierung aktivieren oder deaktivieren.setup_dns: Wird vom gemeinsamen Wrapper akzeptiert, ist in dieser Baseline aber nicht unterstützt.Im aktuellen Rehost-Repository werden diese auf bestehende Schalter wie create_project,
enable_observability, enable_local_postgresql und die Flags zur Lastgenerierung abgebildet.
Das folgende Diagramm zeigt das implementierte und getestete Ziel, nicht eine zukünftige High-Availability-Variante.
Verwenden Sie ein isoliertes Linux-Labor mit Git, Terraform, Ansible, ShellCheck, SSH/SCP, curl, jq
und PostgreSQL-Server-/Client-Werkzeugen einschließlich pg_config. Die Sample-Dump-Skripte nutzen
runuser und den lokalen OS-Account postgres und benötigen Root-Rechte in diesem Labor.
Bei aktiviertem Server Backup braucht der Cutover zusätzlich eine authentifizierte STACKIT CLI.
Verwenden Sie für vorhandene gespeicherte Pläne die Terraform-Version, die sie erzeugt hat;
Plandateien sind versionsgebunden.
Beginnen Sie in einem übergeordneten Verzeichnis ohne bereits vorhandenen gleichnamigen Checkout. Dieser Stand enthält die Migrationsworkflows und die deklarative Observability-Verwaltung. Seine JAR ist gegenüber dem in der Replatform-Referenz fixierten Artefakt unverändert:
umask 077 && git clone https://github.com/stackitcloud/stackit-cmf-Rehost-springboot.git && git -C stackit-cmf-Rehost-springboot checkout --detach b9225eb35c64b9ef4761c208fadb9a2356431793 && test -f stackit-cmf-Rehost-springboot/scripts/run_cutover.sh && cd stackit-cmf-Rehost-springboot && printf '%s\n' "Workspace ready. Continue from this Rehost checkout." || { printf '%s\n' "Preparation failed. Resolve the error before continuing." >&2 false }Führen Sie die folgenden Schritte erst nach erfolgreicher Vorbereitung aus diesem Checkout aus. Bewahren Sie vorhandene Checkouts, State und Nachweise, statt sie zu ersetzen. Halten Sie Credentials, Pläne, State, Dumps, Inventory und Nachweise privat und außerhalb der Versionsverwaltung; aktivieren Sie kein Shell-Tracing.
Erstellen Sie die private Variablendatei nur, wenn sie noch nicht existiert:
umask 077test -e env.tfvars || cp env.tfvars.example env.tfvarschmod 600 env.tfvarsBearbeiten Sie die Datei vor dem Plan. Konfigurieren Sie das freigegebene bestehende Projekt oder den
Scope für die Projekterstellung, Service-Account-Key-Pfad, SSH-Schlüsselpaar, verfügbares Image,
Availability Zone, VM-Flavor und Storage. Beschränken Sie SSH- und Applikations-Ingress auf die
Quell-CIDRs, die am Zielpfad tatsächlich ankommen. Verifizieren Sie den SSH-Host-Key über einen
vertrauenswürdigen Kanal, bevor Migrationsskripte die strikte Host-Prüfung verwenden.
Setzen Sie für diese Skripte SSH_KEY und SSH_USER, falls sie von ~/.ssh/id_rsa und ubuntu
abweichen; halten Sie sie konsistent zu private_ssh_key_path und ssh_user in Terraform.
Aktivieren Sie VM-lokales PostgreSQL, Observability und Server Backup für diesen Walkthrough.
Lassen Sie für das erste Runtime-Deployment postgresql_restore_after_copy = false und den
Quelldump-Pfad leer: Provisioning darf die Quelle nicht vor Probe und Cutover-Freigabe importieren.
Übergeben Sie das Datenbankpasswort über den freigegebenen Secret-Mechanismus als
TF_VAR_postgresql_app_password und bewahren Sie es für spätere Pläne sicher auf;
schreiben Sie es nicht in Variablendatei, Shell-History oder Dokumentation.
Bestätigen Sie Berechtigungen, Quota, Kostenfreigabe und das private Terraform-Backend vor der Initialisierung. Dieser Ablauf setzt einen vorbereiteten Ausführungshost voraus und ist keine vollständige Installationsanleitung für das Labor.
Erstellen Sie einen Quelldump im Custom Format und erfassen Sie SHA-256-Prüfsumme, erwartete Datensatzanzahl und einen Workload-spezifischen deterministischen Fingerprint. Das Repository enthält ein reproduzierbares Beispiel mit acht Datensätzen:
./scripts/create_source_dump.sh./scripts/validate_source_dump.shDas Validierungsskript stellt den Dump in einem separaten lokalen PostgreSQL-Cluster wieder her, bevor er in eine Migrationsprobe eingehen darf. Die Skripte erzeugen das mitgelieferte Sample in temporären lokalen Clustern; sie exportieren weder eine laufende Anwendung noch die STACKIT VM. Verwenden Sie ein frisches Artefaktverzeichnis und überschreiben Sie keinen bereits freigegebenen Migrationsdump. Exportieren Sie eine reale Quelle unter dem vereinbarten Write Freeze und erfassen Sie gleichwertige Nachweise für Prüfsumme, Anzahl und Fingerprint.
Konfigurieren Sie ein bestehendes STACKIT Projekt oder die Projekterstellung, beschränken Sie SSH-
und Applikations-Ingress auf freigegebene Quell-CIDRs und übergeben Sie das Datenbankpasswort über
TF_VAR_postgresql_app_password statt über eine Variablendatei. Prüfen Sie vor dem Apply einen
gespeicherten Plan.
terraform init && ./scripts/check.sh && terraform plan -input=false -var-file=env.tfvars -out=tfplanStoppen Sie bei Fehlern in Initialisierung, Checks oder Plan. Prüfen Sie Ressourcenänderungen, Zielprojekt, Ingress, Kosten und den deaktivierten initialen Restore, bevor Sie den gespeicherten Plan ausdrücklich anwenden:
terraform apply tfplanTerraform führt nach dem Provisioning Ansible aus. Ein erfolgreicher Apply belegt den Abschluss dieser Orchestrierung, nicht die Abnahme migrierter Daten. Prüfen Sie die Laufzeit vor der Probe:
./scripts/validate_deployment.shFühren Sie die Probe gegen eine temporäre Datenbank auf der Ziel-VM aus:
./scripts/run_migration_rehearsal.shDie Probe prüft die Quelldaten, stellt den Dump wieder her, vergleicht Datensatzanzahl und Fingerprint
und entfernt die temporäre Datenbank, ohne die produktive springmusic-Datenbank zu verändern.
Hinterlegen Sie die erwarteten Quelldaten in env.tfvars:
enable_local_postgresql = truepostgresql_source_dump_local_path = "artifacts/source-postgresql.dump"postgresql_restore_after_copy = truepostgresql_expected_album_count = 8postgresql_expected_album_fingerprint = "<source-fingerprint>"Führen Sie anschließend das explizite Freigabe-Gate aus:
./scripts/run_cutover.sh --confirmDas Skript verlangt ein vollständig verfügbares Server Backup, das höchstens 24 Stunden alt ist. Es erzeugt einen gespeicherten Terraform-Plan, der ausschließlich die Ansible-Orchestrierungsressource ersetzt, weist andere Infrastrukturänderungen zurück, führt den Restore aus, validiert Daten und Laufzeitverhalten und verlangt abschließend einen Terraform-No-op-Plan. Wiederholungen mit demselben Quelldump-Hash bewahren den ursprünglichen Datenbank-Rollback-Punkt.
Die Validierung prüft Datensatzanzahl und Fingerprint der Quelle, Tabellen-Ownership, einen transaktional zurückgerollten Schreibvorgang als Application Role, Erreichbarkeit der Anwendung, Services und den geschützten Rollback-Dump.
./scripts/validate_migration.sh./scripts/validate_deployment.sh./scripts/verify_rollback.shWenn innerhalb des Rollback-Fensters ein freigegebener Rollback-Trigger eintritt, bewahren Sie die aktuelle Zieldatenbank und stellen den ursprünglichen Dump von vor dem Cutover wieder her:
./scripts/rollback_postgresql.sh --confirmMit enable_server_backup = true aktiviert Terraform STACKIT Server Backup und einen täglichen
Zeitplan für das Boot Volume der VM. Die Standardaufbewahrung beträgt 14 Tage. Der Cutover verlangt
ein vollständig verfügbares Backup, das höchstens 24 Stunden alt ist. Erstellung und Status des
Backups wurden am realen Ziel validiert; ein In-place-Restore mit Server Backup bleibt eine
disruptive Disaster-Recovery-Operation und muss in einer separaten Recovery-Umgebung geprobt werden.
Server Backup ergänzt den PostgreSQL-Dump von vor dem Restore. Es ersetzt weder die Datenbank-Konsistenzprüfungen noch das Application-Rollback-Verfahren.
Folgen Sie Arbeitsumgebung, privater Zielkonfiguration, Quellnachweisen und geprüftem Provisioning
in dieser Reihenfolge. Proben Sie vor dem freigegebenen Cutover und bewahren Sie anschließend die
Abnahmenachweise auf. Die Repository-Skripte rufen ausdrücklich terraform auf; ein Ausführungshost
mit ausschließlich OpenTofu benötigt eine separat geprüfte Anpassung, nicht nur ersetzte Befehle
auf dieser Seite.
Die Implementierung stellt STACKIT Observability bereit und erfasst den Node Exporter. Der Grafana-Provider
verwaltet das enthaltene Dashboard im Ordner SCF Rehost mit der vorhandenen Thanos-Datenquelle.
Er wartet auf die Bereitschaft der Instanz, statt die Dashboard-Erstellung stillschweigend zu überspringen.
Prüfen Sie über grafana_dashboard_url aktuelle VM-, Spring-Boot- und PostgreSQL-Metriken und verlangen
Sie anschließend einen No-op-Plan. Sieben Panels bilden die aktive Basis ab; das Panel für synthetische
Anfragen erscheint nur bei aktiviertem lokalem Lastgenerator. Diese Anfragen bilden nicht den gesamten
Application-Traffic ab. Die Deployment-Validierung prüft außerdem Exporter-Metriken und Service Health
nach dem Apply und nach dem Datenbank-Restore.
Die initialen Grafana-Admin-Zugangsdaten bleiben eine temporäre Authentifizierungsabhängigkeit. Schützen Sie State und gespeicherte Pläne. Benachrichtigungsempfänger, Zuständigkeit für Alarm-Routing, Application-Logs und Distributed Tracing benötigen vor Produktionseinsatz eine separate Konfiguration und Abnahme.
Dieses Beispiel kann in zwei zulässigen Setup-Modi eingesetzt werden.
create_project = false und project_id = "...", sowie die für
diesen Landing-Zone-Scope konfigurierte Service-Account-JSON.create_project = true und geben Sie über parent_container_id einen
bestehenden Folder oder Container an, in dem der Service Account ausreichende Berechtigungen hat.Hinweise zum Landing-Zone-Design finden Sie unter Application Landing Zone.
Nutzen Sie dieses Beispiel als Ausgangspunkt in env.tfvars.
create_project = truetarget_project_name = "cmf-rehost-springboot"target_project_owner_email = "owner@example.com"parent_container_id = "cmf-xxxxxxxx"service_account_key_path = "~/.ssh/cmf-sa.json"public_ssh_key_path = "~/.ssh/id_rsa.pub"private_ssh_key_path = "~/.ssh/id_rsa"availability_zone = "eu01-1"machine_type = "g2i.2"ssh_allowed_cidr = "203.0.113.10/32"app_allowed_cidr = "203.0.113.10/32"enable_local_postgresql = trueenable_observability = trueenable_server_backup = trueansible/files/springboot-app.jarjar_local_path verweist auf dieselbe Datei.jar_local_path.Wenn sich das Artefakt ändert, erkennt Terraform die geänderte Prüfsumme und führt den Ansible-Deployment-Schritt erneut aus.
Jede Probe, jeder Cutover und jedes Rollback schreibt eine evidence.env-Datei unter
artifacts/evidence/<timestamp>-<mode>/. Akzeptieren Sie einen Cutover nur, wenn der Nachweis die
erwartete Prüfsumme, Datensatzanzahl, den Fingerprint, die Ziel-VM, eine erfolgreiche
Laufzeitvalidierung und den abschließenden Terraform-No-op dokumentiert.
./scripts/validate_migration.sh./scripts/validate_deployment.shterraform plan -var-file=env.tfvars -detailed-exitcodeVerwenden Sie denselben freigegebenen Quellpfad, Restore-Schalter, Erwartungswert und Fingerprint
wie beim abgeschlossenen Cutover. Exit-Code 0 bedeutet keine Änderungen, 2 vorgeschlagene
Änderungen und 1 einen Fehler. Ein Plan allein belegt keinen Apply. Der Cutover-Workflow setzt
status=passed und terraform_noop=true erst nach Anwendung seines gespeicherten Plans und
erfolgreicher Daten- und Laufzeitvalidierung.
Die Replatform-Referenz verwendet das fixierte Spring-Music-JAR und den Sample-Datengenerator dieses Repositories weiter. Ihr Sample-Walkthrough benötigt deshalb diesen Checkout und validierte Dump-Artefakte, aber keine neu bereitgestellte Rehost-VM. Erstellen Sie keine zusätzliche VM allein zur Erzeugung des lokalen Samples.
Für eine tatsächliche Migration von der Rehost-VM zu SKE und PostgreSQL Flex müssen Sie den aktuellen VM-Zustand prüfen, Schreibzugriffe der Anwendung einfrieren, die reale PostgreSQL-Datenbank exportieren und diesen Export qualifizieren. Ein historisch erfolgreicher Rehost-Apply belegt weder aktuelle Erreichbarkeit noch die Gleichwertigkeit des lokalen Samples mit den VM-Daten. Quellexport, Abnahme und Source Failback benötigen ein eigenes freigegebenes Verfahren.
STACKIT
Der souveräne europäische Cloud-Anbieter hinter dem Framework, mit IaaS und PaaS aus deutschen und österreichischen Rechenzentren und voller Unabhängigkeit.
Das Migration Framework definiert Strategie, Design, Landing Zone, Migration und Betriebsprinzipien für Rehost-Workloads. Dieses Asset wendet diese Prinzipien auf eine konkrete, ausführbare Spring-Boot- und PostgreSQL-Implementierung auf STACKIT an.
Das gepflegte Repository ist die Source of Truth für Terraform, Ansible, Applikationsartefakte, Migrationsskripte, Validierung und Laufzeitkonfiguration. Dieses Asset beschreibt die Nutzung der Implementierung, ohne ihren vollständigen Quellcode zu duplizieren.
STACKIT CMF Rehost Spring Boot Repository Öffnen Sie die ausführbare Terraform- und Ansible-Referenzimplementierung für den Rehost-Pfad von Spring Boot und PostgreSQL. Repository öffnenDieses Beispiel bildet einen Application-Rehost-Pfad für einen Spring-Boot-Workload ab, konkret das Spring-Music-Beispiel. Der Fokus liegt auf der Verlagerung der Laufzeit nach STACKIT:
systemd, ohne das Laufzeitmodell der Anwendung zu ändern.Die validierte Baseline enthält bewusst keinen Application Load Balancer, DNS-Switch, mehrere VMs, Kubernetes, Cloud Foundry oder PostgreSQL Flex. Ergänzen Sie diese nur als separat entworfene und getestete Erweiterungen; sie sind nicht impliziter Bestandteil dieses Rehost-Beispiels.
systemd-Service.Nutzen Sie dieses gemeinsame Flag-Modell in den Terraform-Variablen, um das Verhalten über CMF-Beispiele hinweg konsistent zu halten:
setup_project: Projektkontext erstellen oder verwenden.setup_observability: Observability-Ressourcen aktivieren oder deaktivieren.setup_database: Optionales VM-lokales PostgreSQL aktivieren oder deaktivieren.setup_workload: Workload-Installation auf der VM aktivieren oder deaktivieren.setup_loadgen: Optionale synthetische Lastgenerierung aktivieren oder deaktivieren.setup_dns: Wird vom gemeinsamen Wrapper akzeptiert, ist in dieser Baseline aber nicht unterstützt.Im aktuellen Rehost-Repository werden diese auf bestehende Schalter wie create_project,
enable_observability, enable_local_postgresql und die Flags zur Lastgenerierung abgebildet.
Das folgende Diagramm zeigt das implementierte und getestete Ziel, nicht eine zukünftige High-Availability-Variante.
Verwenden Sie ein isoliertes Linux-Labor mit Git, Terraform, Ansible, ShellCheck, SSH/SCP, curl, jq
und PostgreSQL-Server-/Client-Werkzeugen einschließlich pg_config. Die Sample-Dump-Skripte nutzen
runuser und den lokalen OS-Account postgres und benötigen Root-Rechte in diesem Labor.
Bei aktiviertem Server Backup braucht der Cutover zusätzlich eine authentifizierte STACKIT CLI.
Verwenden Sie für vorhandene gespeicherte Pläne die Terraform-Version, die sie erzeugt hat;
Plandateien sind versionsgebunden.
Beginnen Sie in einem übergeordneten Verzeichnis ohne bereits vorhandenen gleichnamigen Checkout. Dieser Stand enthält die Migrationsworkflows und die deklarative Observability-Verwaltung. Seine JAR ist gegenüber dem in der Replatform-Referenz fixierten Artefakt unverändert:
umask 077 && git clone https://github.com/stackitcloud/stackit-cmf-Rehost-springboot.git && git -C stackit-cmf-Rehost-springboot checkout --detach b9225eb35c64b9ef4761c208fadb9a2356431793 && test -f stackit-cmf-Rehost-springboot/scripts/run_cutover.sh && cd stackit-cmf-Rehost-springboot && printf '%s\n' "Workspace ready. Continue from this Rehost checkout." || { printf '%s\n' "Preparation failed. Resolve the error before continuing." >&2 false }Führen Sie die folgenden Schritte erst nach erfolgreicher Vorbereitung aus diesem Checkout aus. Bewahren Sie vorhandene Checkouts, State und Nachweise, statt sie zu ersetzen. Halten Sie Credentials, Pläne, State, Dumps, Inventory und Nachweise privat und außerhalb der Versionsverwaltung; aktivieren Sie kein Shell-Tracing.
Erstellen Sie die private Variablendatei nur, wenn sie noch nicht existiert:
umask 077test -e env.tfvars || cp env.tfvars.example env.tfvarschmod 600 env.tfvarsBearbeiten Sie die Datei vor dem Plan. Konfigurieren Sie das freigegebene bestehende Projekt oder den
Scope für die Projekterstellung, Service-Account-Key-Pfad, SSH-Schlüsselpaar, verfügbares Image,
Availability Zone, VM-Flavor und Storage. Beschränken Sie SSH- und Applikations-Ingress auf die
Quell-CIDRs, die am Zielpfad tatsächlich ankommen. Verifizieren Sie den SSH-Host-Key über einen
vertrauenswürdigen Kanal, bevor Migrationsskripte die strikte Host-Prüfung verwenden.
Setzen Sie für diese Skripte SSH_KEY und SSH_USER, falls sie von ~/.ssh/id_rsa und ubuntu
abweichen; halten Sie sie konsistent zu private_ssh_key_path und ssh_user in Terraform.
Aktivieren Sie VM-lokales PostgreSQL, Observability und Server Backup für diesen Walkthrough.
Lassen Sie für das erste Runtime-Deployment postgresql_restore_after_copy = false und den
Quelldump-Pfad leer: Provisioning darf die Quelle nicht vor Probe und Cutover-Freigabe importieren.
Übergeben Sie das Datenbankpasswort über den freigegebenen Secret-Mechanismus als
TF_VAR_postgresql_app_password und bewahren Sie es für spätere Pläne sicher auf;
schreiben Sie es nicht in Variablendatei, Shell-History oder Dokumentation.
Bestätigen Sie Berechtigungen, Quota, Kostenfreigabe und das private Terraform-Backend vor der Initialisierung. Dieser Ablauf setzt einen vorbereiteten Ausführungshost voraus und ist keine vollständige Installationsanleitung für das Labor.
Erstellen Sie einen Quelldump im Custom Format und erfassen Sie SHA-256-Prüfsumme, erwartete Datensatzanzahl und einen Workload-spezifischen deterministischen Fingerprint. Das Repository enthält ein reproduzierbares Beispiel mit acht Datensätzen:
./scripts/create_source_dump.sh./scripts/validate_source_dump.shDas Validierungsskript stellt den Dump in einem separaten lokalen PostgreSQL-Cluster wieder her, bevor er in eine Migrationsprobe eingehen darf. Die Skripte erzeugen das mitgelieferte Sample in temporären lokalen Clustern; sie exportieren weder eine laufende Anwendung noch die STACKIT VM. Verwenden Sie ein frisches Artefaktverzeichnis und überschreiben Sie keinen bereits freigegebenen Migrationsdump. Exportieren Sie eine reale Quelle unter dem vereinbarten Write Freeze und erfassen Sie gleichwertige Nachweise für Prüfsumme, Anzahl und Fingerprint.
Konfigurieren Sie ein bestehendes STACKIT Projekt oder die Projekterstellung, beschränken Sie SSH-
und Applikations-Ingress auf freigegebene Quell-CIDRs und übergeben Sie das Datenbankpasswort über
TF_VAR_postgresql_app_password statt über eine Variablendatei. Prüfen Sie vor dem Apply einen
gespeicherten Plan.
terraform init && ./scripts/check.sh && terraform plan -input=false -var-file=env.tfvars -out=tfplanStoppen Sie bei Fehlern in Initialisierung, Checks oder Plan. Prüfen Sie Ressourcenänderungen, Zielprojekt, Ingress, Kosten und den deaktivierten initialen Restore, bevor Sie den gespeicherten Plan ausdrücklich anwenden:
terraform apply tfplanTerraform führt nach dem Provisioning Ansible aus. Ein erfolgreicher Apply belegt den Abschluss dieser Orchestrierung, nicht die Abnahme migrierter Daten. Prüfen Sie die Laufzeit vor der Probe:
./scripts/validate_deployment.shFühren Sie die Probe gegen eine temporäre Datenbank auf der Ziel-VM aus:
./scripts/run_migration_rehearsal.shDie Probe prüft die Quelldaten, stellt den Dump wieder her, vergleicht Datensatzanzahl und Fingerprint
und entfernt die temporäre Datenbank, ohne die produktive springmusic-Datenbank zu verändern.
Hinterlegen Sie die erwarteten Quelldaten in env.tfvars:
enable_local_postgresql = truepostgresql_source_dump_local_path = "artifacts/source-postgresql.dump"postgresql_restore_after_copy = truepostgresql_expected_album_count = 8postgresql_expected_album_fingerprint = "<source-fingerprint>"Führen Sie anschließend das explizite Freigabe-Gate aus:
./scripts/run_cutover.sh --confirmDas Skript verlangt ein vollständig verfügbares Server Backup, das höchstens 24 Stunden alt ist. Es erzeugt einen gespeicherten Terraform-Plan, der ausschließlich die Ansible-Orchestrierungsressource ersetzt, weist andere Infrastrukturänderungen zurück, führt den Restore aus, validiert Daten und Laufzeitverhalten und verlangt abschließend einen Terraform-No-op-Plan. Wiederholungen mit demselben Quelldump-Hash bewahren den ursprünglichen Datenbank-Rollback-Punkt.
Die Validierung prüft Datensatzanzahl und Fingerprint der Quelle, Tabellen-Ownership, einen transaktional zurückgerollten Schreibvorgang als Application Role, Erreichbarkeit der Anwendung, Services und den geschützten Rollback-Dump.
./scripts/validate_migration.sh./scripts/validate_deployment.sh./scripts/verify_rollback.shWenn innerhalb des Rollback-Fensters ein freigegebener Rollback-Trigger eintritt, bewahren Sie die aktuelle Zieldatenbank und stellen den ursprünglichen Dump von vor dem Cutover wieder her:
./scripts/rollback_postgresql.sh --confirmMit enable_server_backup = true aktiviert Terraform STACKIT Server Backup und einen täglichen
Zeitplan für das Boot Volume der VM. Die Standardaufbewahrung beträgt 14 Tage. Der Cutover verlangt
ein vollständig verfügbares Backup, das höchstens 24 Stunden alt ist. Erstellung und Status des
Backups wurden am realen Ziel validiert; ein In-place-Restore mit Server Backup bleibt eine
disruptive Disaster-Recovery-Operation und muss in einer separaten Recovery-Umgebung geprobt werden.
Server Backup ergänzt den PostgreSQL-Dump von vor dem Restore. Es ersetzt weder die Datenbank-Konsistenzprüfungen noch das Application-Rollback-Verfahren.
Folgen Sie Arbeitsumgebung, privater Zielkonfiguration, Quellnachweisen und geprüftem Provisioning
in dieser Reihenfolge. Proben Sie vor dem freigegebenen Cutover und bewahren Sie anschließend die
Abnahmenachweise auf. Die Repository-Skripte rufen ausdrücklich terraform auf; ein Ausführungshost
mit ausschließlich OpenTofu benötigt eine separat geprüfte Anpassung, nicht nur ersetzte Befehle
auf dieser Seite.
Die Implementierung stellt STACKIT Observability bereit und erfasst den Node Exporter. Der Grafana-Provider
verwaltet das enthaltene Dashboard im Ordner SCF Rehost mit der vorhandenen Thanos-Datenquelle.
Er wartet auf die Bereitschaft der Instanz, statt die Dashboard-Erstellung stillschweigend zu überspringen.
Prüfen Sie über grafana_dashboard_url aktuelle VM-, Spring-Boot- und PostgreSQL-Metriken und verlangen
Sie anschließend einen No-op-Plan. Sieben Panels bilden die aktive Basis ab; das Panel für synthetische
Anfragen erscheint nur bei aktiviertem lokalem Lastgenerator. Diese Anfragen bilden nicht den gesamten
Application-Traffic ab. Die Deployment-Validierung prüft außerdem Exporter-Metriken und Service Health
nach dem Apply und nach dem Datenbank-Restore.
Die initialen Grafana-Admin-Zugangsdaten bleiben eine temporäre Authentifizierungsabhängigkeit. Schützen Sie State und gespeicherte Pläne. Benachrichtigungsempfänger, Zuständigkeit für Alarm-Routing, Application-Logs und Distributed Tracing benötigen vor Produktionseinsatz eine separate Konfiguration und Abnahme.
Dieses Beispiel kann in zwei zulässigen Setup-Modi eingesetzt werden.
create_project = false und project_id = "...", sowie die für
diesen Landing-Zone-Scope konfigurierte Service-Account-JSON.create_project = true und geben Sie über parent_container_id einen
bestehenden Folder oder Container an, in dem der Service Account ausreichende Berechtigungen hat.Hinweise zum Landing-Zone-Design finden Sie unter Application Landing Zone.
Nutzen Sie dieses Beispiel als Ausgangspunkt in env.tfvars.
create_project = truetarget_project_name = "cmf-rehost-springboot"target_project_owner_email = "owner@example.com"parent_container_id = "cmf-xxxxxxxx"service_account_key_path = "~/.ssh/cmf-sa.json"public_ssh_key_path = "~/.ssh/id_rsa.pub"private_ssh_key_path = "~/.ssh/id_rsa"availability_zone = "eu01-1"machine_type = "g2i.2"ssh_allowed_cidr = "203.0.113.10/32"app_allowed_cidr = "203.0.113.10/32"enable_local_postgresql = trueenable_observability = trueenable_server_backup = trueansible/files/springboot-app.jarjar_local_path verweist auf dieselbe Datei.jar_local_path.Wenn sich das Artefakt ändert, erkennt Terraform die geänderte Prüfsumme und führt den Ansible-Deployment-Schritt erneut aus.
Jede Probe, jeder Cutover und jedes Rollback schreibt eine evidence.env-Datei unter
artifacts/evidence/<timestamp>-<mode>/. Akzeptieren Sie einen Cutover nur, wenn der Nachweis die
erwartete Prüfsumme, Datensatzanzahl, den Fingerprint, die Ziel-VM, eine erfolgreiche
Laufzeitvalidierung und den abschließenden Terraform-No-op dokumentiert.
./scripts/validate_migration.sh./scripts/validate_deployment.shterraform plan -var-file=env.tfvars -detailed-exitcodeVerwenden Sie denselben freigegebenen Quellpfad, Restore-Schalter, Erwartungswert und Fingerprint
wie beim abgeschlossenen Cutover. Exit-Code 0 bedeutet keine Änderungen, 2 vorgeschlagene
Änderungen und 1 einen Fehler. Ein Plan allein belegt keinen Apply. Der Cutover-Workflow setzt
status=passed und terraform_noop=true erst nach Anwendung seines gespeicherten Plans und
erfolgreicher Daten- und Laufzeitvalidierung.
Die Replatform-Referenz verwendet das fixierte Spring-Music-JAR und den Sample-Datengenerator dieses Repositories weiter. Ihr Sample-Walkthrough benötigt deshalb diesen Checkout und validierte Dump-Artefakte, aber keine neu bereitgestellte Rehost-VM. Erstellen Sie keine zusätzliche VM allein zur Erzeugung des lokalen Samples.
Für eine tatsächliche Migration von der Rehost-VM zu SKE und PostgreSQL Flex müssen Sie den aktuellen VM-Zustand prüfen, Schreibzugriffe der Anwendung einfrieren, die reale PostgreSQL-Datenbank exportieren und diesen Export qualifizieren. Ein historisch erfolgreicher Rehost-Apply belegt weder aktuelle Erreichbarkeit noch die Gleichwertigkeit des lokalen Samples mit den VM-Daten. Quellexport, Abnahme und Source Failback benötigen ein eigenes freigegebenes Verfahren.
STACKIT
Der souveräne europäische Cloud-Anbieter hinter dem Framework, mit IaaS und PaaS aus deutschen und österreichischen Rechenzentren und voller Unabhängigkeit.
Das Migration Framework definiert Strategie, Design, Landing Zone, Migration und Betriebsprinzipien für Rehost-Workloads. Dieses Asset wendet diese Prinzipien auf eine konkrete, ausführbare Spring-Boot- und PostgreSQL-Implementierung auf STACKIT an.
Das gepflegte Repository ist die Source of Truth für Terraform, Ansible, Applikationsartefakte, Migrationsskripte, Validierung und Laufzeitkonfiguration. Dieses Asset beschreibt die Nutzung der Implementierung, ohne ihren vollständigen Quellcode zu duplizieren.
STACKIT CMF Rehost Spring Boot Repository Öffnen Sie die ausführbare Terraform- und Ansible-Referenzimplementierung für den Rehost-Pfad von Spring Boot und PostgreSQL. Repository öffnenDieses Beispiel bildet einen Application-Rehost-Pfad für einen Spring-Boot-Workload ab, konkret das Spring-Music-Beispiel. Der Fokus liegt auf der Verlagerung der Laufzeit nach STACKIT:
systemd, ohne das Laufzeitmodell der Anwendung zu ändern.Die validierte Baseline enthält bewusst keinen Application Load Balancer, DNS-Switch, mehrere VMs, Kubernetes, Cloud Foundry oder PostgreSQL Flex. Ergänzen Sie diese nur als separat entworfene und getestete Erweiterungen; sie sind nicht impliziter Bestandteil dieses Rehost-Beispiels.
systemd-Service.Nutzen Sie dieses gemeinsame Flag-Modell in den Terraform-Variablen, um das Verhalten über CMF-Beispiele hinweg konsistent zu halten:
setup_project: Projektkontext erstellen oder verwenden.setup_observability: Observability-Ressourcen aktivieren oder deaktivieren.setup_database: Optionales VM-lokales PostgreSQL aktivieren oder deaktivieren.setup_workload: Workload-Installation auf der VM aktivieren oder deaktivieren.setup_loadgen: Optionale synthetische Lastgenerierung aktivieren oder deaktivieren.setup_dns: Wird vom gemeinsamen Wrapper akzeptiert, ist in dieser Baseline aber nicht unterstützt.Im aktuellen Rehost-Repository werden diese auf bestehende Schalter wie create_project,
enable_observability, enable_local_postgresql und die Flags zur Lastgenerierung abgebildet.
Das folgende Diagramm zeigt das implementierte und getestete Ziel, nicht eine zukünftige High-Availability-Variante.
Verwenden Sie ein isoliertes Linux-Labor mit Git, Terraform, Ansible, ShellCheck, SSH/SCP, curl, jq
und PostgreSQL-Server-/Client-Werkzeugen einschließlich pg_config. Die Sample-Dump-Skripte nutzen
runuser und den lokalen OS-Account postgres und benötigen Root-Rechte in diesem Labor.
Bei aktiviertem Server Backup braucht der Cutover zusätzlich eine authentifizierte STACKIT CLI.
Verwenden Sie für vorhandene gespeicherte Pläne die Terraform-Version, die sie erzeugt hat;
Plandateien sind versionsgebunden.
Beginnen Sie in einem übergeordneten Verzeichnis ohne bereits vorhandenen gleichnamigen Checkout. Dieser Stand enthält die Migrationsworkflows und die deklarative Observability-Verwaltung. Seine JAR ist gegenüber dem in der Replatform-Referenz fixierten Artefakt unverändert:
umask 077 && git clone https://github.com/stackitcloud/stackit-cmf-Rehost-springboot.git && git -C stackit-cmf-Rehost-springboot checkout --detach b9225eb35c64b9ef4761c208fadb9a2356431793 && test -f stackit-cmf-Rehost-springboot/scripts/run_cutover.sh && cd stackit-cmf-Rehost-springboot && printf '%s\n' "Workspace ready. Continue from this Rehost checkout." || { printf '%s\n' "Preparation failed. Resolve the error before continuing." >&2 false }Führen Sie die folgenden Schritte erst nach erfolgreicher Vorbereitung aus diesem Checkout aus. Bewahren Sie vorhandene Checkouts, State und Nachweise, statt sie zu ersetzen. Halten Sie Credentials, Pläne, State, Dumps, Inventory und Nachweise privat und außerhalb der Versionsverwaltung; aktivieren Sie kein Shell-Tracing.
Erstellen Sie die private Variablendatei nur, wenn sie noch nicht existiert:
umask 077test -e env.tfvars || cp env.tfvars.example env.tfvarschmod 600 env.tfvarsBearbeiten Sie die Datei vor dem Plan. Konfigurieren Sie das freigegebene bestehende Projekt oder den
Scope für die Projekterstellung, Service-Account-Key-Pfad, SSH-Schlüsselpaar, verfügbares Image,
Availability Zone, VM-Flavor und Storage. Beschränken Sie SSH- und Applikations-Ingress auf die
Quell-CIDRs, die am Zielpfad tatsächlich ankommen. Verifizieren Sie den SSH-Host-Key über einen
vertrauenswürdigen Kanal, bevor Migrationsskripte die strikte Host-Prüfung verwenden.
Setzen Sie für diese Skripte SSH_KEY und SSH_USER, falls sie von ~/.ssh/id_rsa und ubuntu
abweichen; halten Sie sie konsistent zu private_ssh_key_path und ssh_user in Terraform.
Aktivieren Sie VM-lokales PostgreSQL, Observability und Server Backup für diesen Walkthrough.
Lassen Sie für das erste Runtime-Deployment postgresql_restore_after_copy = false und den
Quelldump-Pfad leer: Provisioning darf die Quelle nicht vor Probe und Cutover-Freigabe importieren.
Übergeben Sie das Datenbankpasswort über den freigegebenen Secret-Mechanismus als
TF_VAR_postgresql_app_password und bewahren Sie es für spätere Pläne sicher auf;
schreiben Sie es nicht in Variablendatei, Shell-History oder Dokumentation.
Bestätigen Sie Berechtigungen, Quota, Kostenfreigabe und das private Terraform-Backend vor der Initialisierung. Dieser Ablauf setzt einen vorbereiteten Ausführungshost voraus und ist keine vollständige Installationsanleitung für das Labor.
Erstellen Sie einen Quelldump im Custom Format und erfassen Sie SHA-256-Prüfsumme, erwartete Datensatzanzahl und einen Workload-spezifischen deterministischen Fingerprint. Das Repository enthält ein reproduzierbares Beispiel mit acht Datensätzen:
./scripts/create_source_dump.sh./scripts/validate_source_dump.shDas Validierungsskript stellt den Dump in einem separaten lokalen PostgreSQL-Cluster wieder her, bevor er in eine Migrationsprobe eingehen darf. Die Skripte erzeugen das mitgelieferte Sample in temporären lokalen Clustern; sie exportieren weder eine laufende Anwendung noch die STACKIT VM. Verwenden Sie ein frisches Artefaktverzeichnis und überschreiben Sie keinen bereits freigegebenen Migrationsdump. Exportieren Sie eine reale Quelle unter dem vereinbarten Write Freeze und erfassen Sie gleichwertige Nachweise für Prüfsumme, Anzahl und Fingerprint.
Konfigurieren Sie ein bestehendes STACKIT Projekt oder die Projekterstellung, beschränken Sie SSH-
und Applikations-Ingress auf freigegebene Quell-CIDRs und übergeben Sie das Datenbankpasswort über
TF_VAR_postgresql_app_password statt über eine Variablendatei. Prüfen Sie vor dem Apply einen
gespeicherten Plan.
terraform init && ./scripts/check.sh && terraform plan -input=false -var-file=env.tfvars -out=tfplanStoppen Sie bei Fehlern in Initialisierung, Checks oder Plan. Prüfen Sie Ressourcenänderungen, Zielprojekt, Ingress, Kosten und den deaktivierten initialen Restore, bevor Sie den gespeicherten Plan ausdrücklich anwenden:
terraform apply tfplanTerraform führt nach dem Provisioning Ansible aus. Ein erfolgreicher Apply belegt den Abschluss dieser Orchestrierung, nicht die Abnahme migrierter Daten. Prüfen Sie die Laufzeit vor der Probe:
./scripts/validate_deployment.shFühren Sie die Probe gegen eine temporäre Datenbank auf der Ziel-VM aus:
./scripts/run_migration_rehearsal.shDie Probe prüft die Quelldaten, stellt den Dump wieder her, vergleicht Datensatzanzahl und Fingerprint
und entfernt die temporäre Datenbank, ohne die produktive springmusic-Datenbank zu verändern.
Hinterlegen Sie die erwarteten Quelldaten in env.tfvars:
enable_local_postgresql = truepostgresql_source_dump_local_path = "artifacts/source-postgresql.dump"postgresql_restore_after_copy = truepostgresql_expected_album_count = 8postgresql_expected_album_fingerprint = "<source-fingerprint>"Führen Sie anschließend das explizite Freigabe-Gate aus:
./scripts/run_cutover.sh --confirmDas Skript verlangt ein vollständig verfügbares Server Backup, das höchstens 24 Stunden alt ist. Es erzeugt einen gespeicherten Terraform-Plan, der ausschließlich die Ansible-Orchestrierungsressource ersetzt, weist andere Infrastrukturänderungen zurück, führt den Restore aus, validiert Daten und Laufzeitverhalten und verlangt abschließend einen Terraform-No-op-Plan. Wiederholungen mit demselben Quelldump-Hash bewahren den ursprünglichen Datenbank-Rollback-Punkt.
Die Validierung prüft Datensatzanzahl und Fingerprint der Quelle, Tabellen-Ownership, einen transaktional zurückgerollten Schreibvorgang als Application Role, Erreichbarkeit der Anwendung, Services und den geschützten Rollback-Dump.
./scripts/validate_migration.sh./scripts/validate_deployment.sh./scripts/verify_rollback.shWenn innerhalb des Rollback-Fensters ein freigegebener Rollback-Trigger eintritt, bewahren Sie die aktuelle Zieldatenbank und stellen den ursprünglichen Dump von vor dem Cutover wieder her:
./scripts/rollback_postgresql.sh --confirmMit enable_server_backup = true aktiviert Terraform STACKIT Server Backup und einen täglichen
Zeitplan für das Boot Volume der VM. Die Standardaufbewahrung beträgt 14 Tage. Der Cutover verlangt
ein vollständig verfügbares Backup, das höchstens 24 Stunden alt ist. Erstellung und Status des
Backups wurden am realen Ziel validiert; ein In-place-Restore mit Server Backup bleibt eine
disruptive Disaster-Recovery-Operation und muss in einer separaten Recovery-Umgebung geprobt werden.
Server Backup ergänzt den PostgreSQL-Dump von vor dem Restore. Es ersetzt weder die Datenbank-Konsistenzprüfungen noch das Application-Rollback-Verfahren.
Folgen Sie Arbeitsumgebung, privater Zielkonfiguration, Quellnachweisen und geprüftem Provisioning
in dieser Reihenfolge. Proben Sie vor dem freigegebenen Cutover und bewahren Sie anschließend die
Abnahmenachweise auf. Die Repository-Skripte rufen ausdrücklich terraform auf; ein Ausführungshost
mit ausschließlich OpenTofu benötigt eine separat geprüfte Anpassung, nicht nur ersetzte Befehle
auf dieser Seite.
Die Implementierung stellt STACKIT Observability bereit und erfasst den Node Exporter. Der Grafana-Provider
verwaltet das enthaltene Dashboard im Ordner SCF Rehost mit der vorhandenen Thanos-Datenquelle.
Er wartet auf die Bereitschaft der Instanz, statt die Dashboard-Erstellung stillschweigend zu überspringen.
Prüfen Sie über grafana_dashboard_url aktuelle VM-, Spring-Boot- und PostgreSQL-Metriken und verlangen
Sie anschließend einen No-op-Plan. Sieben Panels bilden die aktive Basis ab; das Panel für synthetische
Anfragen erscheint nur bei aktiviertem lokalem Lastgenerator. Diese Anfragen bilden nicht den gesamten
Application-Traffic ab. Die Deployment-Validierung prüft außerdem Exporter-Metriken und Service Health
nach dem Apply und nach dem Datenbank-Restore.
Die initialen Grafana-Admin-Zugangsdaten bleiben eine temporäre Authentifizierungsabhängigkeit. Schützen Sie State und gespeicherte Pläne. Benachrichtigungsempfänger, Zuständigkeit für Alarm-Routing, Application-Logs und Distributed Tracing benötigen vor Produktionseinsatz eine separate Konfiguration und Abnahme.
Dieses Beispiel kann in zwei zulässigen Setup-Modi eingesetzt werden.
create_project = false und project_id = "...", sowie die für
diesen Landing-Zone-Scope konfigurierte Service-Account-JSON.create_project = true und geben Sie über parent_container_id einen
bestehenden Folder oder Container an, in dem der Service Account ausreichende Berechtigungen hat.Hinweise zum Landing-Zone-Design finden Sie unter Application Landing Zone.
Nutzen Sie dieses Beispiel als Ausgangspunkt in env.tfvars.
create_project = truetarget_project_name = "cmf-rehost-springboot"target_project_owner_email = "owner@example.com"parent_container_id = "cmf-xxxxxxxx"service_account_key_path = "~/.ssh/cmf-sa.json"public_ssh_key_path = "~/.ssh/id_rsa.pub"private_ssh_key_path = "~/.ssh/id_rsa"availability_zone = "eu01-1"machine_type = "g2i.2"ssh_allowed_cidr = "203.0.113.10/32"app_allowed_cidr = "203.0.113.10/32"enable_local_postgresql = trueenable_observability = trueenable_server_backup = trueansible/files/springboot-app.jarjar_local_path verweist auf dieselbe Datei.jar_local_path.Wenn sich das Artefakt ändert, erkennt Terraform die geänderte Prüfsumme und führt den Ansible-Deployment-Schritt erneut aus.
Jede Probe, jeder Cutover und jedes Rollback schreibt eine evidence.env-Datei unter
artifacts/evidence/<timestamp>-<mode>/. Akzeptieren Sie einen Cutover nur, wenn der Nachweis die
erwartete Prüfsumme, Datensatzanzahl, den Fingerprint, die Ziel-VM, eine erfolgreiche
Laufzeitvalidierung und den abschließenden Terraform-No-op dokumentiert.
./scripts/validate_migration.sh./scripts/validate_deployment.shterraform plan -var-file=env.tfvars -detailed-exitcodeVerwenden Sie denselben freigegebenen Quellpfad, Restore-Schalter, Erwartungswert und Fingerprint
wie beim abgeschlossenen Cutover. Exit-Code 0 bedeutet keine Änderungen, 2 vorgeschlagene
Änderungen und 1 einen Fehler. Ein Plan allein belegt keinen Apply. Der Cutover-Workflow setzt
status=passed und terraform_noop=true erst nach Anwendung seines gespeicherten Plans und
erfolgreicher Daten- und Laufzeitvalidierung.
Die Replatform-Referenz verwendet das fixierte Spring-Music-JAR und den Sample-Datengenerator dieses Repositories weiter. Ihr Sample-Walkthrough benötigt deshalb diesen Checkout und validierte Dump-Artefakte, aber keine neu bereitgestellte Rehost-VM. Erstellen Sie keine zusätzliche VM allein zur Erzeugung des lokalen Samples.
Für eine tatsächliche Migration von der Rehost-VM zu SKE und PostgreSQL Flex müssen Sie den aktuellen VM-Zustand prüfen, Schreibzugriffe der Anwendung einfrieren, die reale PostgreSQL-Datenbank exportieren und diesen Export qualifizieren. Ein historisch erfolgreicher Rehost-Apply belegt weder aktuelle Erreichbarkeit noch die Gleichwertigkeit des lokalen Samples mit den VM-Daten. Quellexport, Abnahme und Source Failback benötigen ein eigenes freigegebenes Verfahren.
STACKIT
Der souveräne europäische Cloud-Anbieter hinter dem Framework, mit IaaS und PaaS aus deutschen und österreichischen Rechenzentren und voller Unabhängigkeit.
Das Migration Framework definiert Strategie, Design, Landing Zone, Migration und Betriebsprinzipien für Rehost-Workloads. Dieses Asset wendet diese Prinzipien auf eine konkrete, ausführbare Spring-Boot- und PostgreSQL-Implementierung auf STACKIT an.
Das gepflegte Repository ist die Source of Truth für Terraform, Ansible, Applikationsartefakte, Migrationsskripte, Validierung und Laufzeitkonfiguration. Dieses Asset beschreibt die Nutzung der Implementierung, ohne ihren vollständigen Quellcode zu duplizieren.
STACKIT CMF Rehost Spring Boot Repository Öffnen Sie die ausführbare Terraform- und Ansible-Referenzimplementierung für den Rehost-Pfad von Spring Boot und PostgreSQL. Repository öffnenDieses Beispiel bildet einen Application-Rehost-Pfad für einen Spring-Boot-Workload ab, konkret das Spring-Music-Beispiel. Der Fokus liegt auf der Verlagerung der Laufzeit nach STACKIT:
systemd, ohne das Laufzeitmodell der Anwendung zu ändern.Die validierte Baseline enthält bewusst keinen Application Load Balancer, DNS-Switch, mehrere VMs, Kubernetes, Cloud Foundry oder PostgreSQL Flex. Ergänzen Sie diese nur als separat entworfene und getestete Erweiterungen; sie sind nicht impliziter Bestandteil dieses Rehost-Beispiels.
systemd-Service.Nutzen Sie dieses gemeinsame Flag-Modell in den Terraform-Variablen, um das Verhalten über CMF-Beispiele hinweg konsistent zu halten:
setup_project: Projektkontext erstellen oder verwenden.setup_observability: Observability-Ressourcen aktivieren oder deaktivieren.setup_database: Optionales VM-lokales PostgreSQL aktivieren oder deaktivieren.setup_workload: Workload-Installation auf der VM aktivieren oder deaktivieren.setup_loadgen: Optionale synthetische Lastgenerierung aktivieren oder deaktivieren.setup_dns: Wird vom gemeinsamen Wrapper akzeptiert, ist in dieser Baseline aber nicht unterstützt.Im aktuellen Rehost-Repository werden diese auf bestehende Schalter wie create_project,
enable_observability, enable_local_postgresql und die Flags zur Lastgenerierung abgebildet.
Das folgende Diagramm zeigt das implementierte und getestete Ziel, nicht eine zukünftige High-Availability-Variante.
Verwenden Sie ein isoliertes Linux-Labor mit Git, Terraform, Ansible, ShellCheck, SSH/SCP, curl, jq
und PostgreSQL-Server-/Client-Werkzeugen einschließlich pg_config. Die Sample-Dump-Skripte nutzen
runuser und den lokalen OS-Account postgres und benötigen Root-Rechte in diesem Labor.
Bei aktiviertem Server Backup braucht der Cutover zusätzlich eine authentifizierte STACKIT CLI.
Verwenden Sie für vorhandene gespeicherte Pläne die Terraform-Version, die sie erzeugt hat;
Plandateien sind versionsgebunden.
Beginnen Sie in einem übergeordneten Verzeichnis ohne bereits vorhandenen gleichnamigen Checkout. Dieser Stand enthält die Migrationsworkflows und die deklarative Observability-Verwaltung. Seine JAR ist gegenüber dem in der Replatform-Referenz fixierten Artefakt unverändert:
umask 077 && git clone https://github.com/stackitcloud/stackit-cmf-Rehost-springboot.git && git -C stackit-cmf-Rehost-springboot checkout --detach b9225eb35c64b9ef4761c208fadb9a2356431793 && test -f stackit-cmf-Rehost-springboot/scripts/run_cutover.sh && cd stackit-cmf-Rehost-springboot && printf '%s\n' "Workspace ready. Continue from this Rehost checkout." || { printf '%s\n' "Preparation failed. Resolve the error before continuing." >&2 false }Führen Sie die folgenden Schritte erst nach erfolgreicher Vorbereitung aus diesem Checkout aus. Bewahren Sie vorhandene Checkouts, State und Nachweise, statt sie zu ersetzen. Halten Sie Credentials, Pläne, State, Dumps, Inventory und Nachweise privat und außerhalb der Versionsverwaltung; aktivieren Sie kein Shell-Tracing.
Erstellen Sie die private Variablendatei nur, wenn sie noch nicht existiert:
umask 077test -e env.tfvars || cp env.tfvars.example env.tfvarschmod 600 env.tfvarsBearbeiten Sie die Datei vor dem Plan. Konfigurieren Sie das freigegebene bestehende Projekt oder den
Scope für die Projekterstellung, Service-Account-Key-Pfad, SSH-Schlüsselpaar, verfügbares Image,
Availability Zone, VM-Flavor und Storage. Beschränken Sie SSH- und Applikations-Ingress auf die
Quell-CIDRs, die am Zielpfad tatsächlich ankommen. Verifizieren Sie den SSH-Host-Key über einen
vertrauenswürdigen Kanal, bevor Migrationsskripte die strikte Host-Prüfung verwenden.
Setzen Sie für diese Skripte SSH_KEY und SSH_USER, falls sie von ~/.ssh/id_rsa und ubuntu
abweichen; halten Sie sie konsistent zu private_ssh_key_path und ssh_user in Terraform.
Aktivieren Sie VM-lokales PostgreSQL, Observability und Server Backup für diesen Walkthrough.
Lassen Sie für das erste Runtime-Deployment postgresql_restore_after_copy = false und den
Quelldump-Pfad leer: Provisioning darf die Quelle nicht vor Probe und Cutover-Freigabe importieren.
Übergeben Sie das Datenbankpasswort über den freigegebenen Secret-Mechanismus als
TF_VAR_postgresql_app_password und bewahren Sie es für spätere Pläne sicher auf;
schreiben Sie es nicht in Variablendatei, Shell-History oder Dokumentation.
Bestätigen Sie Berechtigungen, Quota, Kostenfreigabe und das private Terraform-Backend vor der Initialisierung. Dieser Ablauf setzt einen vorbereiteten Ausführungshost voraus und ist keine vollständige Installationsanleitung für das Labor.
Erstellen Sie einen Quelldump im Custom Format und erfassen Sie SHA-256-Prüfsumme, erwartete Datensatzanzahl und einen Workload-spezifischen deterministischen Fingerprint. Das Repository enthält ein reproduzierbares Beispiel mit acht Datensätzen:
./scripts/create_source_dump.sh./scripts/validate_source_dump.shDas Validierungsskript stellt den Dump in einem separaten lokalen PostgreSQL-Cluster wieder her, bevor er in eine Migrationsprobe eingehen darf. Die Skripte erzeugen das mitgelieferte Sample in temporären lokalen Clustern; sie exportieren weder eine laufende Anwendung noch die STACKIT VM. Verwenden Sie ein frisches Artefaktverzeichnis und überschreiben Sie keinen bereits freigegebenen Migrationsdump. Exportieren Sie eine reale Quelle unter dem vereinbarten Write Freeze und erfassen Sie gleichwertige Nachweise für Prüfsumme, Anzahl und Fingerprint.
Konfigurieren Sie ein bestehendes STACKIT Projekt oder die Projekterstellung, beschränken Sie SSH-
und Applikations-Ingress auf freigegebene Quell-CIDRs und übergeben Sie das Datenbankpasswort über
TF_VAR_postgresql_app_password statt über eine Variablendatei. Prüfen Sie vor dem Apply einen
gespeicherten Plan.
terraform init && ./scripts/check.sh && terraform plan -input=false -var-file=env.tfvars -out=tfplanStoppen Sie bei Fehlern in Initialisierung, Checks oder Plan. Prüfen Sie Ressourcenänderungen, Zielprojekt, Ingress, Kosten und den deaktivierten initialen Restore, bevor Sie den gespeicherten Plan ausdrücklich anwenden:
terraform apply tfplanTerraform führt nach dem Provisioning Ansible aus. Ein erfolgreicher Apply belegt den Abschluss dieser Orchestrierung, nicht die Abnahme migrierter Daten. Prüfen Sie die Laufzeit vor der Probe:
./scripts/validate_deployment.shFühren Sie die Probe gegen eine temporäre Datenbank auf der Ziel-VM aus:
./scripts/run_migration_rehearsal.shDie Probe prüft die Quelldaten, stellt den Dump wieder her, vergleicht Datensatzanzahl und Fingerprint
und entfernt die temporäre Datenbank, ohne die produktive springmusic-Datenbank zu verändern.
Hinterlegen Sie die erwarteten Quelldaten in env.tfvars:
enable_local_postgresql = truepostgresql_source_dump_local_path = "artifacts/source-postgresql.dump"postgresql_restore_after_copy = truepostgresql_expected_album_count = 8postgresql_expected_album_fingerprint = "<source-fingerprint>"Führen Sie anschließend das explizite Freigabe-Gate aus:
./scripts/run_cutover.sh --confirmDas Skript verlangt ein vollständig verfügbares Server Backup, das höchstens 24 Stunden alt ist. Es erzeugt einen gespeicherten Terraform-Plan, der ausschließlich die Ansible-Orchestrierungsressource ersetzt, weist andere Infrastrukturänderungen zurück, führt den Restore aus, validiert Daten und Laufzeitverhalten und verlangt abschließend einen Terraform-No-op-Plan. Wiederholungen mit demselben Quelldump-Hash bewahren den ursprünglichen Datenbank-Rollback-Punkt.
Die Validierung prüft Datensatzanzahl und Fingerprint der Quelle, Tabellen-Ownership, einen transaktional zurückgerollten Schreibvorgang als Application Role, Erreichbarkeit der Anwendung, Services und den geschützten Rollback-Dump.
./scripts/validate_migration.sh./scripts/validate_deployment.sh./scripts/verify_rollback.shWenn innerhalb des Rollback-Fensters ein freigegebener Rollback-Trigger eintritt, bewahren Sie die aktuelle Zieldatenbank und stellen den ursprünglichen Dump von vor dem Cutover wieder her:
./scripts/rollback_postgresql.sh --confirmMit enable_server_backup = true aktiviert Terraform STACKIT Server Backup und einen täglichen
Zeitplan für das Boot Volume der VM. Die Standardaufbewahrung beträgt 14 Tage. Der Cutover verlangt
ein vollständig verfügbares Backup, das höchstens 24 Stunden alt ist. Erstellung und Status des
Backups wurden am realen Ziel validiert; ein In-place-Restore mit Server Backup bleibt eine
disruptive Disaster-Recovery-Operation und muss in einer separaten Recovery-Umgebung geprobt werden.
Server Backup ergänzt den PostgreSQL-Dump von vor dem Restore. Es ersetzt weder die Datenbank-Konsistenzprüfungen noch das Application-Rollback-Verfahren.
Folgen Sie Arbeitsumgebung, privater Zielkonfiguration, Quellnachweisen und geprüftem Provisioning
in dieser Reihenfolge. Proben Sie vor dem freigegebenen Cutover und bewahren Sie anschließend die
Abnahmenachweise auf. Die Repository-Skripte rufen ausdrücklich terraform auf; ein Ausführungshost
mit ausschließlich OpenTofu benötigt eine separat geprüfte Anpassung, nicht nur ersetzte Befehle
auf dieser Seite.
Die Implementierung stellt STACKIT Observability bereit und erfasst den Node Exporter. Der Grafana-Provider
verwaltet das enthaltene Dashboard im Ordner SCF Rehost mit der vorhandenen Thanos-Datenquelle.
Er wartet auf die Bereitschaft der Instanz, statt die Dashboard-Erstellung stillschweigend zu überspringen.
Prüfen Sie über grafana_dashboard_url aktuelle VM-, Spring-Boot- und PostgreSQL-Metriken und verlangen
Sie anschließend einen No-op-Plan. Sieben Panels bilden die aktive Basis ab; das Panel für synthetische
Anfragen erscheint nur bei aktiviertem lokalem Lastgenerator. Diese Anfragen bilden nicht den gesamten
Application-Traffic ab. Die Deployment-Validierung prüft außerdem Exporter-Metriken und Service Health
nach dem Apply und nach dem Datenbank-Restore.
Die initialen Grafana-Admin-Zugangsdaten bleiben eine temporäre Authentifizierungsabhängigkeit. Schützen Sie State und gespeicherte Pläne. Benachrichtigungsempfänger, Zuständigkeit für Alarm-Routing, Application-Logs und Distributed Tracing benötigen vor Produktionseinsatz eine separate Konfiguration und Abnahme.
Dieses Beispiel kann in zwei zulässigen Setup-Modi eingesetzt werden.
create_project = false und project_id = "...", sowie die für
diesen Landing-Zone-Scope konfigurierte Service-Account-JSON.create_project = true und geben Sie über parent_container_id einen
bestehenden Folder oder Container an, in dem der Service Account ausreichende Berechtigungen hat.Hinweise zum Landing-Zone-Design finden Sie unter Application Landing Zone.
Nutzen Sie dieses Beispiel als Ausgangspunkt in env.tfvars.
create_project = truetarget_project_name = "cmf-rehost-springboot"target_project_owner_email = "owner@example.com"parent_container_id = "cmf-xxxxxxxx"service_account_key_path = "~/.ssh/cmf-sa.json"public_ssh_key_path = "~/.ssh/id_rsa.pub"private_ssh_key_path = "~/.ssh/id_rsa"availability_zone = "eu01-1"machine_type = "g2i.2"ssh_allowed_cidr = "203.0.113.10/32"app_allowed_cidr = "203.0.113.10/32"enable_local_postgresql = trueenable_observability = trueenable_server_backup = trueansible/files/springboot-app.jarjar_local_path verweist auf dieselbe Datei.jar_local_path.Wenn sich das Artefakt ändert, erkennt Terraform die geänderte Prüfsumme und führt den Ansible-Deployment-Schritt erneut aus.
Jede Probe, jeder Cutover und jedes Rollback schreibt eine evidence.env-Datei unter
artifacts/evidence/<timestamp>-<mode>/. Akzeptieren Sie einen Cutover nur, wenn der Nachweis die
erwartete Prüfsumme, Datensatzanzahl, den Fingerprint, die Ziel-VM, eine erfolgreiche
Laufzeitvalidierung und den abschließenden Terraform-No-op dokumentiert.
./scripts/validate_migration.sh./scripts/validate_deployment.shterraform plan -var-file=env.tfvars -detailed-exitcodeVerwenden Sie denselben freigegebenen Quellpfad, Restore-Schalter, Erwartungswert und Fingerprint
wie beim abgeschlossenen Cutover. Exit-Code 0 bedeutet keine Änderungen, 2 vorgeschlagene
Änderungen und 1 einen Fehler. Ein Plan allein belegt keinen Apply. Der Cutover-Workflow setzt
status=passed und terraform_noop=true erst nach Anwendung seines gespeicherten Plans und
erfolgreicher Daten- und Laufzeitvalidierung.
Die Replatform-Referenz verwendet das fixierte Spring-Music-JAR und den Sample-Datengenerator dieses Repositories weiter. Ihr Sample-Walkthrough benötigt deshalb diesen Checkout und validierte Dump-Artefakte, aber keine neu bereitgestellte Rehost-VM. Erstellen Sie keine zusätzliche VM allein zur Erzeugung des lokalen Samples.
Für eine tatsächliche Migration von der Rehost-VM zu SKE und PostgreSQL Flex müssen Sie den aktuellen VM-Zustand prüfen, Schreibzugriffe der Anwendung einfrieren, die reale PostgreSQL-Datenbank exportieren und diesen Export qualifizieren. Ein historisch erfolgreicher Rehost-Apply belegt weder aktuelle Erreichbarkeit noch die Gleichwertigkeit des lokalen Samples mit den VM-Daten. Quellexport, Abnahme und Source Failback benötigen ein eigenes freigegebenes Verfahren.
STACKIT
Der souveräne europäische Cloud-Anbieter hinter dem Framework, mit IaaS und PaaS aus deutschen und österreichischen Rechenzentren und voller Unabhängigkeit.
Das Migration Framework definiert Strategie, Design, Landing Zone, Migration und Betriebsprinzipien für Rehost-Workloads. Dieses Asset wendet diese Prinzipien auf eine konkrete, ausführbare Spring-Boot- und PostgreSQL-Implementierung auf STACKIT an.
Das gepflegte Repository ist die Source of Truth für Terraform, Ansible, Applikationsartefakte, Migrationsskripte, Validierung und Laufzeitkonfiguration. Dieses Asset beschreibt die Nutzung der Implementierung, ohne ihren vollständigen Quellcode zu duplizieren.
STACKIT CMF Rehost Spring Boot Repository Öffnen Sie die ausführbare Terraform- und Ansible-Referenzimplementierung für den Rehost-Pfad von Spring Boot und PostgreSQL. Repository öffnenDieses Beispiel bildet einen Application-Rehost-Pfad für einen Spring-Boot-Workload ab, konkret das Spring-Music-Beispiel. Der Fokus liegt auf der Verlagerung der Laufzeit nach STACKIT:
systemd, ohne das Laufzeitmodell der Anwendung zu ändern.Die validierte Baseline enthält bewusst keinen Application Load Balancer, DNS-Switch, mehrere VMs, Kubernetes, Cloud Foundry oder PostgreSQL Flex. Ergänzen Sie diese nur als separat entworfene und getestete Erweiterungen; sie sind nicht impliziter Bestandteil dieses Rehost-Beispiels.
systemd-Service.Nutzen Sie dieses gemeinsame Flag-Modell in den Terraform-Variablen, um das Verhalten über CMF-Beispiele hinweg konsistent zu halten:
setup_project: Projektkontext erstellen oder verwenden.setup_observability: Observability-Ressourcen aktivieren oder deaktivieren.setup_database: Optionales VM-lokales PostgreSQL aktivieren oder deaktivieren.setup_workload: Workload-Installation auf der VM aktivieren oder deaktivieren.setup_loadgen: Optionale synthetische Lastgenerierung aktivieren oder deaktivieren.setup_dns: Wird vom gemeinsamen Wrapper akzeptiert, ist in dieser Baseline aber nicht unterstützt.Im aktuellen Rehost-Repository werden diese auf bestehende Schalter wie create_project,
enable_observability, enable_local_postgresql und die Flags zur Lastgenerierung abgebildet.
Das folgende Diagramm zeigt das implementierte und getestete Ziel, nicht eine zukünftige High-Availability-Variante.
Verwenden Sie ein isoliertes Linux-Labor mit Git, Terraform, Ansible, ShellCheck, SSH/SCP, curl, jq
und PostgreSQL-Server-/Client-Werkzeugen einschließlich pg_config. Die Sample-Dump-Skripte nutzen
runuser und den lokalen OS-Account postgres und benötigen Root-Rechte in diesem Labor.
Bei aktiviertem Server Backup braucht der Cutover zusätzlich eine authentifizierte STACKIT CLI.
Verwenden Sie für vorhandene gespeicherte Pläne die Terraform-Version, die sie erzeugt hat;
Plandateien sind versionsgebunden.
Beginnen Sie in einem übergeordneten Verzeichnis ohne bereits vorhandenen gleichnamigen Checkout. Dieser Stand enthält die Migrationsworkflows und die deklarative Observability-Verwaltung. Seine JAR ist gegenüber dem in der Replatform-Referenz fixierten Artefakt unverändert:
umask 077 && git clone https://github.com/stackitcloud/stackit-cmf-Rehost-springboot.git && git -C stackit-cmf-Rehost-springboot checkout --detach b9225eb35c64b9ef4761c208fadb9a2356431793 && test -f stackit-cmf-Rehost-springboot/scripts/run_cutover.sh && cd stackit-cmf-Rehost-springboot && printf '%s\n' "Workspace ready. Continue from this Rehost checkout." || { printf '%s\n' "Preparation failed. Resolve the error before continuing." >&2 false }Führen Sie die folgenden Schritte erst nach erfolgreicher Vorbereitung aus diesem Checkout aus. Bewahren Sie vorhandene Checkouts, State und Nachweise, statt sie zu ersetzen. Halten Sie Credentials, Pläne, State, Dumps, Inventory und Nachweise privat und außerhalb der Versionsverwaltung; aktivieren Sie kein Shell-Tracing.
Erstellen Sie die private Variablendatei nur, wenn sie noch nicht existiert:
umask 077test -e env.tfvars || cp env.tfvars.example env.tfvarschmod 600 env.tfvarsBearbeiten Sie die Datei vor dem Plan. Konfigurieren Sie das freigegebene bestehende Projekt oder den
Scope für die Projekterstellung, Service-Account-Key-Pfad, SSH-Schlüsselpaar, verfügbares Image,
Availability Zone, VM-Flavor und Storage. Beschränken Sie SSH- und Applikations-Ingress auf die
Quell-CIDRs, die am Zielpfad tatsächlich ankommen. Verifizieren Sie den SSH-Host-Key über einen
vertrauenswürdigen Kanal, bevor Migrationsskripte die strikte Host-Prüfung verwenden.
Setzen Sie für diese Skripte SSH_KEY und SSH_USER, falls sie von ~/.ssh/id_rsa und ubuntu
abweichen; halten Sie sie konsistent zu private_ssh_key_path und ssh_user in Terraform.
Aktivieren Sie VM-lokales PostgreSQL, Observability und Server Backup für diesen Walkthrough.
Lassen Sie für das erste Runtime-Deployment postgresql_restore_after_copy = false und den
Quelldump-Pfad leer: Provisioning darf die Quelle nicht vor Probe und Cutover-Freigabe importieren.
Übergeben Sie das Datenbankpasswort über den freigegebenen Secret-Mechanismus als
TF_VAR_postgresql_app_password und bewahren Sie es für spätere Pläne sicher auf;
schreiben Sie es nicht in Variablendatei, Shell-History oder Dokumentation.
Bestätigen Sie Berechtigungen, Quota, Kostenfreigabe und das private Terraform-Backend vor der Initialisierung. Dieser Ablauf setzt einen vorbereiteten Ausführungshost voraus und ist keine vollständige Installationsanleitung für das Labor.
Erstellen Sie einen Quelldump im Custom Format und erfassen Sie SHA-256-Prüfsumme, erwartete Datensatzanzahl und einen Workload-spezifischen deterministischen Fingerprint. Das Repository enthält ein reproduzierbares Beispiel mit acht Datensätzen:
./scripts/create_source_dump.sh./scripts/validate_source_dump.shDas Validierungsskript stellt den Dump in einem separaten lokalen PostgreSQL-Cluster wieder her, bevor er in eine Migrationsprobe eingehen darf. Die Skripte erzeugen das mitgelieferte Sample in temporären lokalen Clustern; sie exportieren weder eine laufende Anwendung noch die STACKIT VM. Verwenden Sie ein frisches Artefaktverzeichnis und überschreiben Sie keinen bereits freigegebenen Migrationsdump. Exportieren Sie eine reale Quelle unter dem vereinbarten Write Freeze und erfassen Sie gleichwertige Nachweise für Prüfsumme, Anzahl und Fingerprint.
Konfigurieren Sie ein bestehendes STACKIT Projekt oder die Projekterstellung, beschränken Sie SSH-
und Applikations-Ingress auf freigegebene Quell-CIDRs und übergeben Sie das Datenbankpasswort über
TF_VAR_postgresql_app_password statt über eine Variablendatei. Prüfen Sie vor dem Apply einen
gespeicherten Plan.
terraform init && ./scripts/check.sh && terraform plan -input=false -var-file=env.tfvars -out=tfplanStoppen Sie bei Fehlern in Initialisierung, Checks oder Plan. Prüfen Sie Ressourcenänderungen, Zielprojekt, Ingress, Kosten und den deaktivierten initialen Restore, bevor Sie den gespeicherten Plan ausdrücklich anwenden:
terraform apply tfplanTerraform führt nach dem Provisioning Ansible aus. Ein erfolgreicher Apply belegt den Abschluss dieser Orchestrierung, nicht die Abnahme migrierter Daten. Prüfen Sie die Laufzeit vor der Probe:
./scripts/validate_deployment.shFühren Sie die Probe gegen eine temporäre Datenbank auf der Ziel-VM aus:
./scripts/run_migration_rehearsal.shDie Probe prüft die Quelldaten, stellt den Dump wieder her, vergleicht Datensatzanzahl und Fingerprint
und entfernt die temporäre Datenbank, ohne die produktive springmusic-Datenbank zu verändern.
Hinterlegen Sie die erwarteten Quelldaten in env.tfvars:
enable_local_postgresql = truepostgresql_source_dump_local_path = "artifacts/source-postgresql.dump"postgresql_restore_after_copy = truepostgresql_expected_album_count = 8postgresql_expected_album_fingerprint = "<source-fingerprint>"Führen Sie anschließend das explizite Freigabe-Gate aus:
./scripts/run_cutover.sh --confirmDas Skript verlangt ein vollständig verfügbares Server Backup, das höchstens 24 Stunden alt ist. Es erzeugt einen gespeicherten Terraform-Plan, der ausschließlich die Ansible-Orchestrierungsressource ersetzt, weist andere Infrastrukturänderungen zurück, führt den Restore aus, validiert Daten und Laufzeitverhalten und verlangt abschließend einen Terraform-No-op-Plan. Wiederholungen mit demselben Quelldump-Hash bewahren den ursprünglichen Datenbank-Rollback-Punkt.
Die Validierung prüft Datensatzanzahl und Fingerprint der Quelle, Tabellen-Ownership, einen transaktional zurückgerollten Schreibvorgang als Application Role, Erreichbarkeit der Anwendung, Services und den geschützten Rollback-Dump.
./scripts/validate_migration.sh./scripts/validate_deployment.sh./scripts/verify_rollback.shWenn innerhalb des Rollback-Fensters ein freigegebener Rollback-Trigger eintritt, bewahren Sie die aktuelle Zieldatenbank und stellen den ursprünglichen Dump von vor dem Cutover wieder her:
./scripts/rollback_postgresql.sh --confirmMit enable_server_backup = true aktiviert Terraform STACKIT Server Backup und einen täglichen
Zeitplan für das Boot Volume der VM. Die Standardaufbewahrung beträgt 14 Tage. Der Cutover verlangt
ein vollständig verfügbares Backup, das höchstens 24 Stunden alt ist. Erstellung und Status des
Backups wurden am realen Ziel validiert; ein In-place-Restore mit Server Backup bleibt eine
disruptive Disaster-Recovery-Operation und muss in einer separaten Recovery-Umgebung geprobt werden.
Server Backup ergänzt den PostgreSQL-Dump von vor dem Restore. Es ersetzt weder die Datenbank-Konsistenzprüfungen noch das Application-Rollback-Verfahren.
Folgen Sie Arbeitsumgebung, privater Zielkonfiguration, Quellnachweisen und geprüftem Provisioning
in dieser Reihenfolge. Proben Sie vor dem freigegebenen Cutover und bewahren Sie anschließend die
Abnahmenachweise auf. Die Repository-Skripte rufen ausdrücklich terraform auf; ein Ausführungshost
mit ausschließlich OpenTofu benötigt eine separat geprüfte Anpassung, nicht nur ersetzte Befehle
auf dieser Seite.
Die Implementierung stellt STACKIT Observability bereit und erfasst den Node Exporter. Der Grafana-Provider
verwaltet das enthaltene Dashboard im Ordner SCF Rehost mit der vorhandenen Thanos-Datenquelle.
Er wartet auf die Bereitschaft der Instanz, statt die Dashboard-Erstellung stillschweigend zu überspringen.
Prüfen Sie über grafana_dashboard_url aktuelle VM-, Spring-Boot- und PostgreSQL-Metriken und verlangen
Sie anschließend einen No-op-Plan. Sieben Panels bilden die aktive Basis ab; das Panel für synthetische
Anfragen erscheint nur bei aktiviertem lokalem Lastgenerator. Diese Anfragen bilden nicht den gesamten
Application-Traffic ab. Die Deployment-Validierung prüft außerdem Exporter-Metriken und Service Health
nach dem Apply und nach dem Datenbank-Restore.
Die initialen Grafana-Admin-Zugangsdaten bleiben eine temporäre Authentifizierungsabhängigkeit. Schützen Sie State und gespeicherte Pläne. Benachrichtigungsempfänger, Zuständigkeit für Alarm-Routing, Application-Logs und Distributed Tracing benötigen vor Produktionseinsatz eine separate Konfiguration und Abnahme.
Dieses Beispiel kann in zwei zulässigen Setup-Modi eingesetzt werden.
create_project = false und project_id = "...", sowie die für
diesen Landing-Zone-Scope konfigurierte Service-Account-JSON.create_project = true und geben Sie über parent_container_id einen
bestehenden Folder oder Container an, in dem der Service Account ausreichende Berechtigungen hat.Hinweise zum Landing-Zone-Design finden Sie unter Application Landing Zone.
Nutzen Sie dieses Beispiel als Ausgangspunkt in env.tfvars.
create_project = truetarget_project_name = "cmf-rehost-springboot"target_project_owner_email = "owner@example.com"parent_container_id = "cmf-xxxxxxxx"service_account_key_path = "~/.ssh/cmf-sa.json"public_ssh_key_path = "~/.ssh/id_rsa.pub"private_ssh_key_path = "~/.ssh/id_rsa"availability_zone = "eu01-1"machine_type = "g2i.2"ssh_allowed_cidr = "203.0.113.10/32"app_allowed_cidr = "203.0.113.10/32"enable_local_postgresql = trueenable_observability = trueenable_server_backup = trueansible/files/springboot-app.jarjar_local_path verweist auf dieselbe Datei.jar_local_path.Wenn sich das Artefakt ändert, erkennt Terraform die geänderte Prüfsumme und führt den Ansible-Deployment-Schritt erneut aus.
Jede Probe, jeder Cutover und jedes Rollback schreibt eine evidence.env-Datei unter
artifacts/evidence/<timestamp>-<mode>/. Akzeptieren Sie einen Cutover nur, wenn der Nachweis die
erwartete Prüfsumme, Datensatzanzahl, den Fingerprint, die Ziel-VM, eine erfolgreiche
Laufzeitvalidierung und den abschließenden Terraform-No-op dokumentiert.
./scripts/validate_migration.sh./scripts/validate_deployment.shterraform plan -var-file=env.tfvars -detailed-exitcodeVerwenden Sie denselben freigegebenen Quellpfad, Restore-Schalter, Erwartungswert und Fingerprint
wie beim abgeschlossenen Cutover. Exit-Code 0 bedeutet keine Änderungen, 2 vorgeschlagene
Änderungen und 1 einen Fehler. Ein Plan allein belegt keinen Apply. Der Cutover-Workflow setzt
status=passed und terraform_noop=true erst nach Anwendung seines gespeicherten Plans und
erfolgreicher Daten- und Laufzeitvalidierung.
Die Replatform-Referenz verwendet das fixierte Spring-Music-JAR und den Sample-Datengenerator dieses Repositories weiter. Ihr Sample-Walkthrough benötigt deshalb diesen Checkout und validierte Dump-Artefakte, aber keine neu bereitgestellte Rehost-VM. Erstellen Sie keine zusätzliche VM allein zur Erzeugung des lokalen Samples.
Für eine tatsächliche Migration von der Rehost-VM zu SKE und PostgreSQL Flex müssen Sie den aktuellen VM-Zustand prüfen, Schreibzugriffe der Anwendung einfrieren, die reale PostgreSQL-Datenbank exportieren und diesen Export qualifizieren. Ein historisch erfolgreicher Rehost-Apply belegt weder aktuelle Erreichbarkeit noch die Gleichwertigkeit des lokalen Samples mit den VM-Daten. Quellexport, Abnahme und Source Failback benötigen ein eigenes freigegebenes Verfahren.
Das Migration Framework definiert Strategie, Design, Landing Zone, Migration und Betriebsprinzipien für Rehost-Workloads. Dieses Asset wendet diese Prinzipien auf eine konkrete, ausführbare Spring-Boot- und PostgreSQL-Implementierung auf STACKIT an.
Das gepflegte Repository ist die Source of Truth für Terraform, Ansible, Applikationsartefakte, Migrationsskripte, Validierung und Laufzeitkonfiguration. Dieses Asset beschreibt die Nutzung der Implementierung, ohne ihren vollständigen Quellcode zu duplizieren.
STACKIT CMF Rehost Spring Boot Repository Öffnen Sie die ausführbare Terraform- und Ansible-Referenzimplementierung für den Rehost-Pfad von Spring Boot und PostgreSQL. Repository öffnenDieses Beispiel bildet einen Application-Rehost-Pfad für einen Spring-Boot-Workload ab, konkret das Spring-Music-Beispiel. Der Fokus liegt auf der Verlagerung der Laufzeit nach STACKIT:
systemd, ohne das Laufzeitmodell der Anwendung zu ändern.Die validierte Baseline enthält bewusst keinen Application Load Balancer, DNS-Switch, mehrere VMs, Kubernetes, Cloud Foundry oder PostgreSQL Flex. Ergänzen Sie diese nur als separat entworfene und getestete Erweiterungen; sie sind nicht impliziter Bestandteil dieses Rehost-Beispiels.
systemd-Service.Nutzen Sie dieses gemeinsame Flag-Modell in den Terraform-Variablen, um das Verhalten über CMF-Beispiele hinweg konsistent zu halten:
setup_project: Projektkontext erstellen oder verwenden.setup_observability: Observability-Ressourcen aktivieren oder deaktivieren.setup_database: Optionales VM-lokales PostgreSQL aktivieren oder deaktivieren.setup_workload: Workload-Installation auf der VM aktivieren oder deaktivieren.setup_loadgen: Optionale synthetische Lastgenerierung aktivieren oder deaktivieren.setup_dns: Wird vom gemeinsamen Wrapper akzeptiert, ist in dieser Baseline aber nicht unterstützt.Im aktuellen Rehost-Repository werden diese auf bestehende Schalter wie create_project,
enable_observability, enable_local_postgresql und die Flags zur Lastgenerierung abgebildet.
Das folgende Diagramm zeigt das implementierte und getestete Ziel, nicht eine zukünftige High-Availability-Variante.
Verwenden Sie ein isoliertes Linux-Labor mit Git, Terraform, Ansible, ShellCheck, SSH/SCP, curl, jq
und PostgreSQL-Server-/Client-Werkzeugen einschließlich pg_config. Die Sample-Dump-Skripte nutzen
runuser und den lokalen OS-Account postgres und benötigen Root-Rechte in diesem Labor.
Bei aktiviertem Server Backup braucht der Cutover zusätzlich eine authentifizierte STACKIT CLI.
Verwenden Sie für vorhandene gespeicherte Pläne die Terraform-Version, die sie erzeugt hat;
Plandateien sind versionsgebunden.
Beginnen Sie in einem übergeordneten Verzeichnis ohne bereits vorhandenen gleichnamigen Checkout. Dieser Stand enthält die Migrationsworkflows und die deklarative Observability-Verwaltung. Seine JAR ist gegenüber dem in der Replatform-Referenz fixierten Artefakt unverändert:
umask 077 && git clone https://github.com/stackitcloud/stackit-cmf-Rehost-springboot.git && git -C stackit-cmf-Rehost-springboot checkout --detach b9225eb35c64b9ef4761c208fadb9a2356431793 && test -f stackit-cmf-Rehost-springboot/scripts/run_cutover.sh && cd stackit-cmf-Rehost-springboot && printf '%s\n' "Workspace ready. Continue from this Rehost checkout." || { printf '%s\n' "Preparation failed. Resolve the error before continuing." >&2 false }Führen Sie die folgenden Schritte erst nach erfolgreicher Vorbereitung aus diesem Checkout aus. Bewahren Sie vorhandene Checkouts, State und Nachweise, statt sie zu ersetzen. Halten Sie Credentials, Pläne, State, Dumps, Inventory und Nachweise privat und außerhalb der Versionsverwaltung; aktivieren Sie kein Shell-Tracing.
Erstellen Sie die private Variablendatei nur, wenn sie noch nicht existiert:
umask 077test -e env.tfvars || cp env.tfvars.example env.tfvarschmod 600 env.tfvarsBearbeiten Sie die Datei vor dem Plan. Konfigurieren Sie das freigegebene bestehende Projekt oder den
Scope für die Projekterstellung, Service-Account-Key-Pfad, SSH-Schlüsselpaar, verfügbares Image,
Availability Zone, VM-Flavor und Storage. Beschränken Sie SSH- und Applikations-Ingress auf die
Quell-CIDRs, die am Zielpfad tatsächlich ankommen. Verifizieren Sie den SSH-Host-Key über einen
vertrauenswürdigen Kanal, bevor Migrationsskripte die strikte Host-Prüfung verwenden.
Setzen Sie für diese Skripte SSH_KEY und SSH_USER, falls sie von ~/.ssh/id_rsa und ubuntu
abweichen; halten Sie sie konsistent zu private_ssh_key_path und ssh_user in Terraform.
Aktivieren Sie VM-lokales PostgreSQL, Observability und Server Backup für diesen Walkthrough.
Lassen Sie für das erste Runtime-Deployment postgresql_restore_after_copy = false und den
Quelldump-Pfad leer: Provisioning darf die Quelle nicht vor Probe und Cutover-Freigabe importieren.
Übergeben Sie das Datenbankpasswort über den freigegebenen Secret-Mechanismus als
TF_VAR_postgresql_app_password und bewahren Sie es für spätere Pläne sicher auf;
schreiben Sie es nicht in Variablendatei, Shell-History oder Dokumentation.
Bestätigen Sie Berechtigungen, Quota, Kostenfreigabe und das private Terraform-Backend vor der Initialisierung. Dieser Ablauf setzt einen vorbereiteten Ausführungshost voraus und ist keine vollständige Installationsanleitung für das Labor.
Erstellen Sie einen Quelldump im Custom Format und erfassen Sie SHA-256-Prüfsumme, erwartete Datensatzanzahl und einen Workload-spezifischen deterministischen Fingerprint. Das Repository enthält ein reproduzierbares Beispiel mit acht Datensätzen:
./scripts/create_source_dump.sh./scripts/validate_source_dump.shDas Validierungsskript stellt den Dump in einem separaten lokalen PostgreSQL-Cluster wieder her, bevor er in eine Migrationsprobe eingehen darf. Die Skripte erzeugen das mitgelieferte Sample in temporären lokalen Clustern; sie exportieren weder eine laufende Anwendung noch die STACKIT VM. Verwenden Sie ein frisches Artefaktverzeichnis und überschreiben Sie keinen bereits freigegebenen Migrationsdump. Exportieren Sie eine reale Quelle unter dem vereinbarten Write Freeze und erfassen Sie gleichwertige Nachweise für Prüfsumme, Anzahl und Fingerprint.
Konfigurieren Sie ein bestehendes STACKIT Projekt oder die Projekterstellung, beschränken Sie SSH-
und Applikations-Ingress auf freigegebene Quell-CIDRs und übergeben Sie das Datenbankpasswort über
TF_VAR_postgresql_app_password statt über eine Variablendatei. Prüfen Sie vor dem Apply einen
gespeicherten Plan.
terraform init && ./scripts/check.sh && terraform plan -input=false -var-file=env.tfvars -out=tfplanStoppen Sie bei Fehlern in Initialisierung, Checks oder Plan. Prüfen Sie Ressourcenänderungen, Zielprojekt, Ingress, Kosten und den deaktivierten initialen Restore, bevor Sie den gespeicherten Plan ausdrücklich anwenden:
terraform apply tfplanTerraform führt nach dem Provisioning Ansible aus. Ein erfolgreicher Apply belegt den Abschluss dieser Orchestrierung, nicht die Abnahme migrierter Daten. Prüfen Sie die Laufzeit vor der Probe:
./scripts/validate_deployment.shFühren Sie die Probe gegen eine temporäre Datenbank auf der Ziel-VM aus:
./scripts/run_migration_rehearsal.shDie Probe prüft die Quelldaten, stellt den Dump wieder her, vergleicht Datensatzanzahl und Fingerprint
und entfernt die temporäre Datenbank, ohne die produktive springmusic-Datenbank zu verändern.
Hinterlegen Sie die erwarteten Quelldaten in env.tfvars:
enable_local_postgresql = truepostgresql_source_dump_local_path = "artifacts/source-postgresql.dump"postgresql_restore_after_copy = truepostgresql_expected_album_count = 8postgresql_expected_album_fingerprint = "<source-fingerprint>"Führen Sie anschließend das explizite Freigabe-Gate aus:
./scripts/run_cutover.sh --confirmDas Skript verlangt ein vollständig verfügbares Server Backup, das höchstens 24 Stunden alt ist. Es erzeugt einen gespeicherten Terraform-Plan, der ausschließlich die Ansible-Orchestrierungsressource ersetzt, weist andere Infrastrukturänderungen zurück, führt den Restore aus, validiert Daten und Laufzeitverhalten und verlangt abschließend einen Terraform-No-op-Plan. Wiederholungen mit demselben Quelldump-Hash bewahren den ursprünglichen Datenbank-Rollback-Punkt.
Die Validierung prüft Datensatzanzahl und Fingerprint der Quelle, Tabellen-Ownership, einen transaktional zurückgerollten Schreibvorgang als Application Role, Erreichbarkeit der Anwendung, Services und den geschützten Rollback-Dump.
./scripts/validate_migration.sh./scripts/validate_deployment.sh./scripts/verify_rollback.shWenn innerhalb des Rollback-Fensters ein freigegebener Rollback-Trigger eintritt, bewahren Sie die aktuelle Zieldatenbank und stellen den ursprünglichen Dump von vor dem Cutover wieder her:
./scripts/rollback_postgresql.sh --confirmMit enable_server_backup = true aktiviert Terraform STACKIT Server Backup und einen täglichen
Zeitplan für das Boot Volume der VM. Die Standardaufbewahrung beträgt 14 Tage. Der Cutover verlangt
ein vollständig verfügbares Backup, das höchstens 24 Stunden alt ist. Erstellung und Status des
Backups wurden am realen Ziel validiert; ein In-place-Restore mit Server Backup bleibt eine
disruptive Disaster-Recovery-Operation und muss in einer separaten Recovery-Umgebung geprobt werden.
Server Backup ergänzt den PostgreSQL-Dump von vor dem Restore. Es ersetzt weder die Datenbank-Konsistenzprüfungen noch das Application-Rollback-Verfahren.
Folgen Sie Arbeitsumgebung, privater Zielkonfiguration, Quellnachweisen und geprüftem Provisioning
in dieser Reihenfolge. Proben Sie vor dem freigegebenen Cutover und bewahren Sie anschließend die
Abnahmenachweise auf. Die Repository-Skripte rufen ausdrücklich terraform auf; ein Ausführungshost
mit ausschließlich OpenTofu benötigt eine separat geprüfte Anpassung, nicht nur ersetzte Befehle
auf dieser Seite.
Die Implementierung stellt STACKIT Observability bereit und erfasst den Node Exporter. Der Grafana-Provider
verwaltet das enthaltene Dashboard im Ordner SCF Rehost mit der vorhandenen Thanos-Datenquelle.
Er wartet auf die Bereitschaft der Instanz, statt die Dashboard-Erstellung stillschweigend zu überspringen.
Prüfen Sie über grafana_dashboard_url aktuelle VM-, Spring-Boot- und PostgreSQL-Metriken und verlangen
Sie anschließend einen No-op-Plan. Sieben Panels bilden die aktive Basis ab; das Panel für synthetische
Anfragen erscheint nur bei aktiviertem lokalem Lastgenerator. Diese Anfragen bilden nicht den gesamten
Application-Traffic ab. Die Deployment-Validierung prüft außerdem Exporter-Metriken und Service Health
nach dem Apply und nach dem Datenbank-Restore.
Die initialen Grafana-Admin-Zugangsdaten bleiben eine temporäre Authentifizierungsabhängigkeit. Schützen Sie State und gespeicherte Pläne. Benachrichtigungsempfänger, Zuständigkeit für Alarm-Routing, Application-Logs und Distributed Tracing benötigen vor Produktionseinsatz eine separate Konfiguration und Abnahme.
Dieses Beispiel kann in zwei zulässigen Setup-Modi eingesetzt werden.
create_project = false und project_id = "...", sowie die für
diesen Landing-Zone-Scope konfigurierte Service-Account-JSON.create_project = true und geben Sie über parent_container_id einen
bestehenden Folder oder Container an, in dem der Service Account ausreichende Berechtigungen hat.Hinweise zum Landing-Zone-Design finden Sie unter Application Landing Zone.
Nutzen Sie dieses Beispiel als Ausgangspunkt in env.tfvars.
create_project = truetarget_project_name = "cmf-rehost-springboot"target_project_owner_email = "owner@example.com"parent_container_id = "cmf-xxxxxxxx"service_account_key_path = "~/.ssh/cmf-sa.json"public_ssh_key_path = "~/.ssh/id_rsa.pub"private_ssh_key_path = "~/.ssh/id_rsa"availability_zone = "eu01-1"machine_type = "g2i.2"ssh_allowed_cidr = "203.0.113.10/32"app_allowed_cidr = "203.0.113.10/32"enable_local_postgresql = trueenable_observability = trueenable_server_backup = trueansible/files/springboot-app.jarjar_local_path verweist auf dieselbe Datei.jar_local_path.Wenn sich das Artefakt ändert, erkennt Terraform die geänderte Prüfsumme und führt den Ansible-Deployment-Schritt erneut aus.
Jede Probe, jeder Cutover und jedes Rollback schreibt eine evidence.env-Datei unter
artifacts/evidence/<timestamp>-<mode>/. Akzeptieren Sie einen Cutover nur, wenn der Nachweis die
erwartete Prüfsumme, Datensatzanzahl, den Fingerprint, die Ziel-VM, eine erfolgreiche
Laufzeitvalidierung und den abschließenden Terraform-No-op dokumentiert.
./scripts/validate_migration.sh./scripts/validate_deployment.shterraform plan -var-file=env.tfvars -detailed-exitcodeVerwenden Sie denselben freigegebenen Quellpfad, Restore-Schalter, Erwartungswert und Fingerprint
wie beim abgeschlossenen Cutover. Exit-Code 0 bedeutet keine Änderungen, 2 vorgeschlagene
Änderungen und 1 einen Fehler. Ein Plan allein belegt keinen Apply. Der Cutover-Workflow setzt
status=passed und terraform_noop=true erst nach Anwendung seines gespeicherten Plans und
erfolgreicher Daten- und Laufzeitvalidierung.
Die Replatform-Referenz verwendet das fixierte Spring-Music-JAR und den Sample-Datengenerator dieses Repositories weiter. Ihr Sample-Walkthrough benötigt deshalb diesen Checkout und validierte Dump-Artefakte, aber keine neu bereitgestellte Rehost-VM. Erstellen Sie keine zusätzliche VM allein zur Erzeugung des lokalen Samples.
Für eine tatsächliche Migration von der Rehost-VM zu SKE und PostgreSQL Flex müssen Sie den aktuellen VM-Zustand prüfen, Schreibzugriffe der Anwendung einfrieren, die reale PostgreSQL-Datenbank exportieren und diesen Export qualifizieren. Ein historisch erfolgreicher Rehost-Apply belegt weder aktuelle Erreichbarkeit noch die Gleichwertigkeit des lokalen Samples mit den VM-Daten. Quellexport, Abnahme und Source Failback benötigen ein eigenes freigegebenes Verfahren.
./scripts/run_migration_rehearsal.sh gegen eine temporäre Zieldatenbank ausführen../scripts/run_cutover.sh --confirm mit den freigegebenen Quelldaten ausführen../scripts/rollback_postgresql.sh --confirm ausführen, um Spring Boot zu stoppen und die aktuelle Zieldatenbank zu bewahren.| Checkpoint | Owner | Timestamp | Ergebnis | Evidence Link |
|---|---|---|---|---|
| Ziel-VM-Runtime vorbereitet | Platform Engineer | YYYY-MM-DD HH:MM | Pass/Fail | link |
| Probe abgeschlossen | DB Owner | YYYY-MM-DD HH:MM | Pass/Fail | link |
| DB-Restore und Integritätscheck | DB Owner | YYYY-MM-DD HH:MM | Pass/Fail | link |
| Terraform-No-op bestätigt | Platform Engineer | YYYY-MM-DD HH:MM | Pass/Fail | link |
| Post-Cutover Business-Checks | Application Owner | YYYY-MM-DD HH:MM | Pass/Fail | link |
| Handover akzeptiert | Operations Owner | YYYY-MM-DD HH:MM | Pass/Fail | link |
STACKIT
Der souveräne europäische Cloud-Anbieter hinter dem Framework, mit IaaS und PaaS aus deutschen und österreichischen Rechenzentren und voller Unabhängigkeit.
./scripts/run_migration_rehearsal.sh gegen eine temporäre Zieldatenbank ausführen../scripts/run_cutover.sh --confirm mit den freigegebenen Quelldaten ausführen../scripts/rollback_postgresql.sh --confirm ausführen, um Spring Boot zu stoppen und die aktuelle Zieldatenbank zu bewahren.| Checkpoint | Owner | Timestamp | Ergebnis | Evidence Link |
|---|---|---|---|---|
| Ziel-VM-Runtime vorbereitet | Platform Engineer | YYYY-MM-DD HH:MM | Pass/Fail | link |
| Probe abgeschlossen | DB Owner | YYYY-MM-DD HH:MM | Pass/Fail | link |
| DB-Restore und Integritätscheck | DB Owner | YYYY-MM-DD HH:MM | Pass/Fail | link |
| Terraform-No-op bestätigt | Platform Engineer | YYYY-MM-DD HH:MM | Pass/Fail | link |
| Post-Cutover Business-Checks | Application Owner | YYYY-MM-DD HH:MM | Pass/Fail | link |
| Handover akzeptiert | Operations Owner | YYYY-MM-DD HH:MM | Pass/Fail | link |
STACKIT
Der souveräne europäische Cloud-Anbieter hinter dem Framework, mit IaaS und PaaS aus deutschen und österreichischen Rechenzentren und voller Unabhängigkeit.
Das Migration Framework definiert Strategie, Design, Landing Zone, Migration und Betriebsprinzipien für Rehost-Workloads. Dieses Asset wendet diese Prinzipien auf eine konkrete, ausführbare Spring-Boot- und PostgreSQL-Implementierung auf STACKIT an.
Das gepflegte Repository ist die Source of Truth für Terraform, Ansible, Applikationsartefakte, Migrationsskripte, Validierung und Laufzeitkonfiguration. Dieses Asset beschreibt die Nutzung der Implementierung, ohne ihren vollständigen Quellcode zu duplizieren.
STACKIT CMF Rehost Spring Boot Repository Öffnen Sie die ausführbare Terraform- und Ansible-Referenzimplementierung für den Rehost-Pfad von Spring Boot und PostgreSQL. Repository öffnenDieses Beispiel bildet einen Application-Rehost-Pfad für einen Spring-Boot-Workload ab, konkret das Spring-Music-Beispiel. Der Fokus liegt auf der Verlagerung der Laufzeit nach STACKIT:
systemd, ohne das Laufzeitmodell der Anwendung zu ändern.Die validierte Baseline enthält bewusst keinen Application Load Balancer, DNS-Switch, mehrere VMs, Kubernetes, Cloud Foundry oder PostgreSQL Flex. Ergänzen Sie diese nur als separat entworfene und getestete Erweiterungen; sie sind nicht impliziter Bestandteil dieses Rehost-Beispiels.
systemd-Service.Nutzen Sie dieses gemeinsame Flag-Modell in den Terraform-Variablen, um das Verhalten über CMF-Beispiele hinweg konsistent zu halten:
setup_project: Projektkontext erstellen oder verwenden.setup_observability: Observability-Ressourcen aktivieren oder deaktivieren.setup_database: Optionales VM-lokales PostgreSQL aktivieren oder deaktivieren.setup_workload: Workload-Installation auf der VM aktivieren oder deaktivieren.setup_loadgen: Optionale synthetische Lastgenerierung aktivieren oder deaktivieren.setup_dns: Wird vom gemeinsamen Wrapper akzeptiert, ist in dieser Baseline aber nicht unterstützt.Im aktuellen Rehost-Repository werden diese auf bestehende Schalter wie create_project,
enable_observability, enable_local_postgresql und die Flags zur Lastgenerierung abgebildet.
Das folgende Diagramm zeigt das implementierte und getestete Ziel, nicht eine zukünftige High-Availability-Variante.
Verwenden Sie ein isoliertes Linux-Labor mit Git, Terraform, Ansible, ShellCheck, SSH/SCP, curl, jq
und PostgreSQL-Server-/Client-Werkzeugen einschließlich pg_config. Die Sample-Dump-Skripte nutzen
runuser und den lokalen OS-Account postgres und benötigen Root-Rechte in diesem Labor.
Bei aktiviertem Server Backup braucht der Cutover zusätzlich eine authentifizierte STACKIT CLI.
Verwenden Sie für vorhandene gespeicherte Pläne die Terraform-Version, die sie erzeugt hat;
Plandateien sind versionsgebunden.
Beginnen Sie in einem übergeordneten Verzeichnis ohne bereits vorhandenen gleichnamigen Checkout. Dieser Stand enthält die Migrationsworkflows und die deklarative Observability-Verwaltung. Seine JAR ist gegenüber dem in der Replatform-Referenz fixierten Artefakt unverändert:
umask 077 && git clone https://github.com/stackitcloud/stackit-cmf-Rehost-springboot.git && git -C stackit-cmf-Rehost-springboot checkout --detach b9225eb35c64b9ef4761c208fadb9a2356431793 && test -f stackit-cmf-Rehost-springboot/scripts/run_cutover.sh && cd stackit-cmf-Rehost-springboot && printf '%s\n' "Workspace ready. Continue from this Rehost checkout." || { printf '%s\n' "Preparation failed. Resolve the error before continuing." >&2 false }Führen Sie die folgenden Schritte erst nach erfolgreicher Vorbereitung aus diesem Checkout aus. Bewahren Sie vorhandene Checkouts, State und Nachweise, statt sie zu ersetzen. Halten Sie Credentials, Pläne, State, Dumps, Inventory und Nachweise privat und außerhalb der Versionsverwaltung; aktivieren Sie kein Shell-Tracing.
Erstellen Sie die private Variablendatei nur, wenn sie noch nicht existiert:
umask 077test -e env.tfvars || cp env.tfvars.example env.tfvarschmod 600 env.tfvarsBearbeiten Sie die Datei vor dem Plan. Konfigurieren Sie das freigegebene bestehende Projekt oder den
Scope für die Projekterstellung, Service-Account-Key-Pfad, SSH-Schlüsselpaar, verfügbares Image,
Availability Zone, VM-Flavor und Storage. Beschränken Sie SSH- und Applikations-Ingress auf die
Quell-CIDRs, die am Zielpfad tatsächlich ankommen. Verifizieren Sie den SSH-Host-Key über einen
vertrauenswürdigen Kanal, bevor Migrationsskripte die strikte Host-Prüfung verwenden.
Setzen Sie für diese Skripte SSH_KEY und SSH_USER, falls sie von ~/.ssh/id_rsa und ubuntu
abweichen; halten Sie sie konsistent zu private_ssh_key_path und ssh_user in Terraform.
Aktivieren Sie VM-lokales PostgreSQL, Observability und Server Backup für diesen Walkthrough.
Lassen Sie für das erste Runtime-Deployment postgresql_restore_after_copy = false und den
Quelldump-Pfad leer: Provisioning darf die Quelle nicht vor Probe und Cutover-Freigabe importieren.
Übergeben Sie das Datenbankpasswort über den freigegebenen Secret-Mechanismus als
TF_VAR_postgresql_app_password und bewahren Sie es für spätere Pläne sicher auf;
schreiben Sie es nicht in Variablendatei, Shell-History oder Dokumentation.
Bestätigen Sie Berechtigungen, Quota, Kostenfreigabe und das private Terraform-Backend vor der Initialisierung. Dieser Ablauf setzt einen vorbereiteten Ausführungshost voraus und ist keine vollständige Installationsanleitung für das Labor.
Erstellen Sie einen Quelldump im Custom Format und erfassen Sie SHA-256-Prüfsumme, erwartete Datensatzanzahl und einen Workload-spezifischen deterministischen Fingerprint. Das Repository enthält ein reproduzierbares Beispiel mit acht Datensätzen:
./scripts/create_source_dump.sh./scripts/validate_source_dump.shDas Validierungsskript stellt den Dump in einem separaten lokalen PostgreSQL-Cluster wieder her, bevor er in eine Migrationsprobe eingehen darf. Die Skripte erzeugen das mitgelieferte Sample in temporären lokalen Clustern; sie exportieren weder eine laufende Anwendung noch die STACKIT VM. Verwenden Sie ein frisches Artefaktverzeichnis und überschreiben Sie keinen bereits freigegebenen Migrationsdump. Exportieren Sie eine reale Quelle unter dem vereinbarten Write Freeze und erfassen Sie gleichwertige Nachweise für Prüfsumme, Anzahl und Fingerprint.
Konfigurieren Sie ein bestehendes STACKIT Projekt oder die Projekterstellung, beschränken Sie SSH-
und Applikations-Ingress auf freigegebene Quell-CIDRs und übergeben Sie das Datenbankpasswort über
TF_VAR_postgresql_app_password statt über eine Variablendatei. Prüfen Sie vor dem Apply einen
gespeicherten Plan.
terraform init && ./scripts/check.sh && terraform plan -input=false -var-file=env.tfvars -out=tfplanStoppen Sie bei Fehlern in Initialisierung, Checks oder Plan. Prüfen Sie Ressourcenänderungen, Zielprojekt, Ingress, Kosten und den deaktivierten initialen Restore, bevor Sie den gespeicherten Plan ausdrücklich anwenden:
terraform apply tfplanTerraform führt nach dem Provisioning Ansible aus. Ein erfolgreicher Apply belegt den Abschluss dieser Orchestrierung, nicht die Abnahme migrierter Daten. Prüfen Sie die Laufzeit vor der Probe:
./scripts/validate_deployment.shFühren Sie die Probe gegen eine temporäre Datenbank auf der Ziel-VM aus:
./scripts/run_migration_rehearsal.shDie Probe prüft die Quelldaten, stellt den Dump wieder her, vergleicht Datensatzanzahl und Fingerprint
und entfernt die temporäre Datenbank, ohne die produktive springmusic-Datenbank zu verändern.
Hinterlegen Sie die erwarteten Quelldaten in env.tfvars:
enable_local_postgresql = truepostgresql_source_dump_local_path = "artifacts/source-postgresql.dump"postgresql_restore_after_copy = truepostgresql_expected_album_count = 8postgresql_expected_album_fingerprint = "<source-fingerprint>"Führen Sie anschließend das explizite Freigabe-Gate aus:
./scripts/run_cutover.sh --confirmDas Skript verlangt ein vollständig verfügbares Server Backup, das höchstens 24 Stunden alt ist. Es erzeugt einen gespeicherten Terraform-Plan, der ausschließlich die Ansible-Orchestrierungsressource ersetzt, weist andere Infrastrukturänderungen zurück, führt den Restore aus, validiert Daten und Laufzeitverhalten und verlangt abschließend einen Terraform-No-op-Plan. Wiederholungen mit demselben Quelldump-Hash bewahren den ursprünglichen Datenbank-Rollback-Punkt.
Die Validierung prüft Datensatzanzahl und Fingerprint der Quelle, Tabellen-Ownership, einen transaktional zurückgerollten Schreibvorgang als Application Role, Erreichbarkeit der Anwendung, Services und den geschützten Rollback-Dump.
./scripts/validate_migration.sh./scripts/validate_deployment.sh./scripts/verify_rollback.shWenn innerhalb des Rollback-Fensters ein freigegebener Rollback-Trigger eintritt, bewahren Sie die aktuelle Zieldatenbank und stellen den ursprünglichen Dump von vor dem Cutover wieder her:
./scripts/rollback_postgresql.sh --confirmMit enable_server_backup = true aktiviert Terraform STACKIT Server Backup und einen täglichen
Zeitplan für das Boot Volume der VM. Die Standardaufbewahrung beträgt 14 Tage. Der Cutover verlangt
ein vollständig verfügbares Backup, das höchstens 24 Stunden alt ist. Erstellung und Status des
Backups wurden am realen Ziel validiert; ein In-place-Restore mit Server Backup bleibt eine
disruptive Disaster-Recovery-Operation und muss in einer separaten Recovery-Umgebung geprobt werden.
Server Backup ergänzt den PostgreSQL-Dump von vor dem Restore. Es ersetzt weder die Datenbank-Konsistenzprüfungen noch das Application-Rollback-Verfahren.
Folgen Sie Arbeitsumgebung, privater Zielkonfiguration, Quellnachweisen und geprüftem Provisioning
in dieser Reihenfolge. Proben Sie vor dem freigegebenen Cutover und bewahren Sie anschließend die
Abnahmenachweise auf. Die Repository-Skripte rufen ausdrücklich terraform auf; ein Ausführungshost
mit ausschließlich OpenTofu benötigt eine separat geprüfte Anpassung, nicht nur ersetzte Befehle
auf dieser Seite.
Die Implementierung stellt STACKIT Observability bereit und erfasst den Node Exporter. Der Grafana-Provider
verwaltet das enthaltene Dashboard im Ordner SCF Rehost mit der vorhandenen Thanos-Datenquelle.
Er wartet auf die Bereitschaft der Instanz, statt die Dashboard-Erstellung stillschweigend zu überspringen.
Prüfen Sie über grafana_dashboard_url aktuelle VM-, Spring-Boot- und PostgreSQL-Metriken und verlangen
Sie anschließend einen No-op-Plan. Sieben Panels bilden die aktive Basis ab; das Panel für synthetische
Anfragen erscheint nur bei aktiviertem lokalem Lastgenerator. Diese Anfragen bilden nicht den gesamten
Application-Traffic ab. Die Deployment-Validierung prüft außerdem Exporter-Metriken und Service Health
nach dem Apply und nach dem Datenbank-Restore.
Die initialen Grafana-Admin-Zugangsdaten bleiben eine temporäre Authentifizierungsabhängigkeit. Schützen Sie State und gespeicherte Pläne. Benachrichtigungsempfänger, Zuständigkeit für Alarm-Routing, Application-Logs und Distributed Tracing benötigen vor Produktionseinsatz eine separate Konfiguration und Abnahme.
Dieses Beispiel kann in zwei zulässigen Setup-Modi eingesetzt werden.
create_project = false und project_id = "...", sowie die für
diesen Landing-Zone-Scope konfigurierte Service-Account-JSON.create_project = true und geben Sie über parent_container_id einen
bestehenden Folder oder Container an, in dem der Service Account ausreichende Berechtigungen hat.Hinweise zum Landing-Zone-Design finden Sie unter Application Landing Zone.
Nutzen Sie dieses Beispiel als Ausgangspunkt in env.tfvars.
create_project = truetarget_project_name = "cmf-rehost-springboot"target_project_owner_email = "owner@example.com"parent_container_id = "cmf-xxxxxxxx"service_account_key_path = "~/.ssh/cmf-sa.json"public_ssh_key_path = "~/.ssh/id_rsa.pub"private_ssh_key_path = "~/.ssh/id_rsa"availability_zone = "eu01-1"machine_type = "g2i.2"ssh_allowed_cidr = "203.0.113.10/32"app_allowed_cidr = "203.0.113.10/32"enable_local_postgresql = trueenable_observability = trueenable_server_backup = trueansible/files/springboot-app.jarjar_local_path verweist auf dieselbe Datei.jar_local_path.Wenn sich das Artefakt ändert, erkennt Terraform die geänderte Prüfsumme und führt den Ansible-Deployment-Schritt erneut aus.
Jede Probe, jeder Cutover und jedes Rollback schreibt eine evidence.env-Datei unter
artifacts/evidence/<timestamp>-<mode>/. Akzeptieren Sie einen Cutover nur, wenn der Nachweis die
erwartete Prüfsumme, Datensatzanzahl, den Fingerprint, die Ziel-VM, eine erfolgreiche
Laufzeitvalidierung und den abschließenden Terraform-No-op dokumentiert.
./scripts/validate_migration.sh./scripts/validate_deployment.shterraform plan -var-file=env.tfvars -detailed-exitcodeVerwenden Sie denselben freigegebenen Quellpfad, Restore-Schalter, Erwartungswert und Fingerprint
wie beim abgeschlossenen Cutover. Exit-Code 0 bedeutet keine Änderungen, 2 vorgeschlagene
Änderungen und 1 einen Fehler. Ein Plan allein belegt keinen Apply. Der Cutover-Workflow setzt
status=passed und terraform_noop=true erst nach Anwendung seines gespeicherten Plans und
erfolgreicher Daten- und Laufzeitvalidierung.
Die Replatform-Referenz verwendet das fixierte Spring-Music-JAR und den Sample-Datengenerator dieses Repositories weiter. Ihr Sample-Walkthrough benötigt deshalb diesen Checkout und validierte Dump-Artefakte, aber keine neu bereitgestellte Rehost-VM. Erstellen Sie keine zusätzliche VM allein zur Erzeugung des lokalen Samples.
Für eine tatsächliche Migration von der Rehost-VM zu SKE und PostgreSQL Flex müssen Sie den aktuellen VM-Zustand prüfen, Schreibzugriffe der Anwendung einfrieren, die reale PostgreSQL-Datenbank exportieren und diesen Export qualifizieren. Ein historisch erfolgreicher Rehost-Apply belegt weder aktuelle Erreichbarkeit noch die Gleichwertigkeit des lokalen Samples mit den VM-Daten. Quellexport, Abnahme und Source Failback benötigen ein eigenes freigegebenes Verfahren.
./scripts/run_migration_rehearsal.sh gegen eine temporäre Zieldatenbank ausführen../scripts/run_cutover.sh --confirm mit den freigegebenen Quelldaten ausführen../scripts/rollback_postgresql.sh --confirm ausführen, um Spring Boot zu stoppen und die aktuelle Zieldatenbank zu bewahren.| Checkpoint | Owner | Timestamp | Ergebnis | Evidence Link |
|---|---|---|---|---|
| Ziel-VM-Runtime vorbereitet | Platform Engineer | YYYY-MM-DD HH:MM | Pass/Fail | link |
| Probe abgeschlossen | DB Owner | YYYY-MM-DD HH:MM | Pass/Fail | link |
| DB-Restore und Integritätscheck | DB Owner | YYYY-MM-DD HH:MM | Pass/Fail | link |
| Terraform-No-op bestätigt | Platform Engineer | YYYY-MM-DD HH:MM | Pass/Fail | link |
| Post-Cutover Business-Checks | Application Owner | YYYY-MM-DD HH:MM | Pass/Fail | link |
| Handover akzeptiert | Operations Owner | YYYY-MM-DD HH:MM | Pass/Fail | link |
./scripts/run_migration_rehearsal.sh gegen eine temporäre Zieldatenbank ausführen../scripts/run_cutover.sh --confirm mit den freigegebenen Quelldaten ausführen../scripts/rollback_postgresql.sh --confirm ausführen, um Spring Boot zu stoppen und die aktuelle Zieldatenbank zu bewahren.| Checkpoint | Owner | Timestamp | Ergebnis | Evidence Link |
|---|---|---|---|---|
| Ziel-VM-Runtime vorbereitet | Platform Engineer | YYYY-MM-DD HH:MM | Pass/Fail | link |
| Probe abgeschlossen | DB Owner | YYYY-MM-DD HH:MM | Pass/Fail | link |
| DB-Restore und Integritätscheck | DB Owner | YYYY-MM-DD HH:MM | Pass/Fail | link |
| Terraform-No-op bestätigt | Platform Engineer | YYYY-MM-DD HH:MM | Pass/Fail | link |
| Post-Cutover Business-Checks | Application Owner | YYYY-MM-DD HH:MM | Pass/Fail | link |
| Handover akzeptiert | Operations Owner | YYYY-MM-DD HH:MM | Pass/Fail | link |
STACKIT
Der souveräne europäische Cloud-Anbieter hinter dem Framework, mit IaaS und PaaS aus deutschen und österreichischen Rechenzentren und voller Unabhängigkeit.
Das Migration Framework definiert Strategie, Design, Landing Zone, Migration und Betriebsprinzipien für Rehost-Workloads. Dieses Asset wendet diese Prinzipien auf eine konkrete, ausführbare Spring-Boot- und PostgreSQL-Implementierung auf STACKIT an.
Das gepflegte Repository ist die Source of Truth für Terraform, Ansible, Applikationsartefakte, Migrationsskripte, Validierung und Laufzeitkonfiguration. Dieses Asset beschreibt die Nutzung der Implementierung, ohne ihren vollständigen Quellcode zu duplizieren.
STACKIT CMF Rehost Spring Boot Repository Öffnen Sie die ausführbare Terraform- und Ansible-Referenzimplementierung für den Rehost-Pfad von Spring Boot und PostgreSQL. Repository öffnenDieses Beispiel bildet einen Application-Rehost-Pfad für einen Spring-Boot-Workload ab, konkret das Spring-Music-Beispiel. Der Fokus liegt auf der Verlagerung der Laufzeit nach STACKIT:
systemd, ohne das Laufzeitmodell der Anwendung zu ändern.Die validierte Baseline enthält bewusst keinen Application Load Balancer, DNS-Switch, mehrere VMs, Kubernetes, Cloud Foundry oder PostgreSQL Flex. Ergänzen Sie diese nur als separat entworfene und getestete Erweiterungen; sie sind nicht impliziter Bestandteil dieses Rehost-Beispiels.
systemd-Service.Nutzen Sie dieses gemeinsame Flag-Modell in den Terraform-Variablen, um das Verhalten über CMF-Beispiele hinweg konsistent zu halten:
setup_project: Projektkontext erstellen oder verwenden.setup_observability: Observability-Ressourcen aktivieren oder deaktivieren.setup_database: Optionales VM-lokales PostgreSQL aktivieren oder deaktivieren.setup_workload: Workload-Installation auf der VM aktivieren oder deaktivieren.setup_loadgen: Optionale synthetische Lastgenerierung aktivieren oder deaktivieren.setup_dns: Wird vom gemeinsamen Wrapper akzeptiert, ist in dieser Baseline aber nicht unterstützt.Im aktuellen Rehost-Repository werden diese auf bestehende Schalter wie create_project,
enable_observability, enable_local_postgresql und die Flags zur Lastgenerierung abgebildet.
Das folgende Diagramm zeigt das implementierte und getestete Ziel, nicht eine zukünftige High-Availability-Variante.
Verwenden Sie ein isoliertes Linux-Labor mit Git, Terraform, Ansible, ShellCheck, SSH/SCP, curl, jq
und PostgreSQL-Server-/Client-Werkzeugen einschließlich pg_config. Die Sample-Dump-Skripte nutzen
runuser und den lokalen OS-Account postgres und benötigen Root-Rechte in diesem Labor.
Bei aktiviertem Server Backup braucht der Cutover zusätzlich eine authentifizierte STACKIT CLI.
Verwenden Sie für vorhandene gespeicherte Pläne die Terraform-Version, die sie erzeugt hat;
Plandateien sind versionsgebunden.
Beginnen Sie in einem übergeordneten Verzeichnis ohne bereits vorhandenen gleichnamigen Checkout. Dieser Stand enthält die Migrationsworkflows und die deklarative Observability-Verwaltung. Seine JAR ist gegenüber dem in der Replatform-Referenz fixierten Artefakt unverändert:
umask 077 && git clone https://github.com/stackitcloud/stackit-cmf-Rehost-springboot.git && git -C stackit-cmf-Rehost-springboot checkout --detach b9225eb35c64b9ef4761c208fadb9a2356431793 && test -f stackit-cmf-Rehost-springboot/scripts/run_cutover.sh && cd stackit-cmf-Rehost-springboot && printf '%s\n' "Workspace ready. Continue from this Rehost checkout." || { printf '%s\n' "Preparation failed. Resolve the error before continuing." >&2 false }Führen Sie die folgenden Schritte erst nach erfolgreicher Vorbereitung aus diesem Checkout aus. Bewahren Sie vorhandene Checkouts, State und Nachweise, statt sie zu ersetzen. Halten Sie Credentials, Pläne, State, Dumps, Inventory und Nachweise privat und außerhalb der Versionsverwaltung; aktivieren Sie kein Shell-Tracing.
Erstellen Sie die private Variablendatei nur, wenn sie noch nicht existiert:
umask 077test -e env.tfvars || cp env.tfvars.example env.tfvarschmod 600 env.tfvarsBearbeiten Sie die Datei vor dem Plan. Konfigurieren Sie das freigegebene bestehende Projekt oder den
Scope für die Projekterstellung, Service-Account-Key-Pfad, SSH-Schlüsselpaar, verfügbares Image,
Availability Zone, VM-Flavor und Storage. Beschränken Sie SSH- und Applikations-Ingress auf die
Quell-CIDRs, die am Zielpfad tatsächlich ankommen. Verifizieren Sie den SSH-Host-Key über einen
vertrauenswürdigen Kanal, bevor Migrationsskripte die strikte Host-Prüfung verwenden.
Setzen Sie für diese Skripte SSH_KEY und SSH_USER, falls sie von ~/.ssh/id_rsa und ubuntu
abweichen; halten Sie sie konsistent zu private_ssh_key_path und ssh_user in Terraform.
Aktivieren Sie VM-lokales PostgreSQL, Observability und Server Backup für diesen Walkthrough.
Lassen Sie für das erste Runtime-Deployment postgresql_restore_after_copy = false und den
Quelldump-Pfad leer: Provisioning darf die Quelle nicht vor Probe und Cutover-Freigabe importieren.
Übergeben Sie das Datenbankpasswort über den freigegebenen Secret-Mechanismus als
TF_VAR_postgresql_app_password und bewahren Sie es für spätere Pläne sicher auf;
schreiben Sie es nicht in Variablendatei, Shell-History oder Dokumentation.
Bestätigen Sie Berechtigungen, Quota, Kostenfreigabe und das private Terraform-Backend vor der Initialisierung. Dieser Ablauf setzt einen vorbereiteten Ausführungshost voraus und ist keine vollständige Installationsanleitung für das Labor.
Erstellen Sie einen Quelldump im Custom Format und erfassen Sie SHA-256-Prüfsumme, erwartete Datensatzanzahl und einen Workload-spezifischen deterministischen Fingerprint. Das Repository enthält ein reproduzierbares Beispiel mit acht Datensätzen:
./scripts/create_source_dump.sh./scripts/validate_source_dump.shDas Validierungsskript stellt den Dump in einem separaten lokalen PostgreSQL-Cluster wieder her, bevor er in eine Migrationsprobe eingehen darf. Die Skripte erzeugen das mitgelieferte Sample in temporären lokalen Clustern; sie exportieren weder eine laufende Anwendung noch die STACKIT VM. Verwenden Sie ein frisches Artefaktverzeichnis und überschreiben Sie keinen bereits freigegebenen Migrationsdump. Exportieren Sie eine reale Quelle unter dem vereinbarten Write Freeze und erfassen Sie gleichwertige Nachweise für Prüfsumme, Anzahl und Fingerprint.
Konfigurieren Sie ein bestehendes STACKIT Projekt oder die Projekterstellung, beschränken Sie SSH-
und Applikations-Ingress auf freigegebene Quell-CIDRs und übergeben Sie das Datenbankpasswort über
TF_VAR_postgresql_app_password statt über eine Variablendatei. Prüfen Sie vor dem Apply einen
gespeicherten Plan.
terraform init && ./scripts/check.sh && terraform plan -input=false -var-file=env.tfvars -out=tfplanStoppen Sie bei Fehlern in Initialisierung, Checks oder Plan. Prüfen Sie Ressourcenänderungen, Zielprojekt, Ingress, Kosten und den deaktivierten initialen Restore, bevor Sie den gespeicherten Plan ausdrücklich anwenden:
terraform apply tfplanTerraform führt nach dem Provisioning Ansible aus. Ein erfolgreicher Apply belegt den Abschluss dieser Orchestrierung, nicht die Abnahme migrierter Daten. Prüfen Sie die Laufzeit vor der Probe:
./scripts/validate_deployment.shFühren Sie die Probe gegen eine temporäre Datenbank auf der Ziel-VM aus:
./scripts/run_migration_rehearsal.shDie Probe prüft die Quelldaten, stellt den Dump wieder her, vergleicht Datensatzanzahl und Fingerprint
und entfernt die temporäre Datenbank, ohne die produktive springmusic-Datenbank zu verändern.
Hinterlegen Sie die erwarteten Quelldaten in env.tfvars:
enable_local_postgresql = truepostgresql_source_dump_local_path = "artifacts/source-postgresql.dump"postgresql_restore_after_copy = truepostgresql_expected_album_count = 8postgresql_expected_album_fingerprint = "<source-fingerprint>"Führen Sie anschließend das explizite Freigabe-Gate aus:
./scripts/run_cutover.sh --confirmDas Skript verlangt ein vollständig verfügbares Server Backup, das höchstens 24 Stunden alt ist. Es erzeugt einen gespeicherten Terraform-Plan, der ausschließlich die Ansible-Orchestrierungsressource ersetzt, weist andere Infrastrukturänderungen zurück, führt den Restore aus, validiert Daten und Laufzeitverhalten und verlangt abschließend einen Terraform-No-op-Plan. Wiederholungen mit demselben Quelldump-Hash bewahren den ursprünglichen Datenbank-Rollback-Punkt.
Die Validierung prüft Datensatzanzahl und Fingerprint der Quelle, Tabellen-Ownership, einen transaktional zurückgerollten Schreibvorgang als Application Role, Erreichbarkeit der Anwendung, Services und den geschützten Rollback-Dump.
./scripts/validate_migration.sh./scripts/validate_deployment.sh./scripts/verify_rollback.shWenn innerhalb des Rollback-Fensters ein freigegebener Rollback-Trigger eintritt, bewahren Sie die aktuelle Zieldatenbank und stellen den ursprünglichen Dump von vor dem Cutover wieder her:
./scripts/rollback_postgresql.sh --confirmMit enable_server_backup = true aktiviert Terraform STACKIT Server Backup und einen täglichen
Zeitplan für das Boot Volume der VM. Die Standardaufbewahrung beträgt 14 Tage. Der Cutover verlangt
ein vollständig verfügbares Backup, das höchstens 24 Stunden alt ist. Erstellung und Status des
Backups wurden am realen Ziel validiert; ein In-place-Restore mit Server Backup bleibt eine
disruptive Disaster-Recovery-Operation und muss in einer separaten Recovery-Umgebung geprobt werden.
Server Backup ergänzt den PostgreSQL-Dump von vor dem Restore. Es ersetzt weder die Datenbank-Konsistenzprüfungen noch das Application-Rollback-Verfahren.
Folgen Sie Arbeitsumgebung, privater Zielkonfiguration, Quellnachweisen und geprüftem Provisioning
in dieser Reihenfolge. Proben Sie vor dem freigegebenen Cutover und bewahren Sie anschließend die
Abnahmenachweise auf. Die Repository-Skripte rufen ausdrücklich terraform auf; ein Ausführungshost
mit ausschließlich OpenTofu benötigt eine separat geprüfte Anpassung, nicht nur ersetzte Befehle
auf dieser Seite.
Die Implementierung stellt STACKIT Observability bereit und erfasst den Node Exporter. Der Grafana-Provider
verwaltet das enthaltene Dashboard im Ordner SCF Rehost mit der vorhandenen Thanos-Datenquelle.
Er wartet auf die Bereitschaft der Instanz, statt die Dashboard-Erstellung stillschweigend zu überspringen.
Prüfen Sie über grafana_dashboard_url aktuelle VM-, Spring-Boot- und PostgreSQL-Metriken und verlangen
Sie anschließend einen No-op-Plan. Sieben Panels bilden die aktive Basis ab; das Panel für synthetische
Anfragen erscheint nur bei aktiviertem lokalem Lastgenerator. Diese Anfragen bilden nicht den gesamten
Application-Traffic ab. Die Deployment-Validierung prüft außerdem Exporter-Metriken und Service Health
nach dem Apply und nach dem Datenbank-Restore.
Die initialen Grafana-Admin-Zugangsdaten bleiben eine temporäre Authentifizierungsabhängigkeit. Schützen Sie State und gespeicherte Pläne. Benachrichtigungsempfänger, Zuständigkeit für Alarm-Routing, Application-Logs und Distributed Tracing benötigen vor Produktionseinsatz eine separate Konfiguration und Abnahme.
Dieses Beispiel kann in zwei zulässigen Setup-Modi eingesetzt werden.
create_project = false und project_id = "...", sowie die für
diesen Landing-Zone-Scope konfigurierte Service-Account-JSON.create_project = true und geben Sie über parent_container_id einen
bestehenden Folder oder Container an, in dem der Service Account ausreichende Berechtigungen hat.Hinweise zum Landing-Zone-Design finden Sie unter Application Landing Zone.
Nutzen Sie dieses Beispiel als Ausgangspunkt in env.tfvars.
create_project = truetarget_project_name = "cmf-rehost-springboot"target_project_owner_email = "owner@example.com"parent_container_id = "cmf-xxxxxxxx"service_account_key_path = "~/.ssh/cmf-sa.json"public_ssh_key_path = "~/.ssh/id_rsa.pub"private_ssh_key_path = "~/.ssh/id_rsa"availability_zone = "eu01-1"machine_type = "g2i.2"ssh_allowed_cidr = "203.0.113.10/32"app_allowed_cidr = "203.0.113.10/32"enable_local_postgresql = trueenable_observability = trueenable_server_backup = trueansible/files/springboot-app.jarjar_local_path verweist auf dieselbe Datei.jar_local_path.Wenn sich das Artefakt ändert, erkennt Terraform die geänderte Prüfsumme und führt den Ansible-Deployment-Schritt erneut aus.
Jede Probe, jeder Cutover und jedes Rollback schreibt eine evidence.env-Datei unter
artifacts/evidence/<timestamp>-<mode>/. Akzeptieren Sie einen Cutover nur, wenn der Nachweis die
erwartete Prüfsumme, Datensatzanzahl, den Fingerprint, die Ziel-VM, eine erfolgreiche
Laufzeitvalidierung und den abschließenden Terraform-No-op dokumentiert.
./scripts/validate_migration.sh./scripts/validate_deployment.shterraform plan -var-file=env.tfvars -detailed-exitcodeVerwenden Sie denselben freigegebenen Quellpfad, Restore-Schalter, Erwartungswert und Fingerprint
wie beim abgeschlossenen Cutover. Exit-Code 0 bedeutet keine Änderungen, 2 vorgeschlagene
Änderungen und 1 einen Fehler. Ein Plan allein belegt keinen Apply. Der Cutover-Workflow setzt
status=passed und terraform_noop=true erst nach Anwendung seines gespeicherten Plans und
erfolgreicher Daten- und Laufzeitvalidierung.
Die Replatform-Referenz verwendet das fixierte Spring-Music-JAR und den Sample-Datengenerator dieses Repositories weiter. Ihr Sample-Walkthrough benötigt deshalb diesen Checkout und validierte Dump-Artefakte, aber keine neu bereitgestellte Rehost-VM. Erstellen Sie keine zusätzliche VM allein zur Erzeugung des lokalen Samples.
Für eine tatsächliche Migration von der Rehost-VM zu SKE und PostgreSQL Flex müssen Sie den aktuellen VM-Zustand prüfen, Schreibzugriffe der Anwendung einfrieren, die reale PostgreSQL-Datenbank exportieren und diesen Export qualifizieren. Ein historisch erfolgreicher Rehost-Apply belegt weder aktuelle Erreichbarkeit noch die Gleichwertigkeit des lokalen Samples mit den VM-Daten. Quellexport, Abnahme und Source Failback benötigen ein eigenes freigegebenes Verfahren.
STACKIT
Der souveräne europäische Cloud-Anbieter hinter dem Framework, mit IaaS und PaaS aus deutschen und österreichischen Rechenzentren und voller Unabhängigkeit.
Das Migration Framework definiert Strategie, Design, Landing Zone, Migration und Betriebsprinzipien für Rehost-Workloads. Dieses Asset wendet diese Prinzipien auf eine konkrete, ausführbare Spring-Boot- und PostgreSQL-Implementierung auf STACKIT an.
Das gepflegte Repository ist die Source of Truth für Terraform, Ansible, Applikationsartefakte, Migrationsskripte, Validierung und Laufzeitkonfiguration. Dieses Asset beschreibt die Nutzung der Implementierung, ohne ihren vollständigen Quellcode zu duplizieren.
STACKIT CMF Rehost Spring Boot Repository Öffnen Sie die ausführbare Terraform- und Ansible-Referenzimplementierung für den Rehost-Pfad von Spring Boot und PostgreSQL. Repository öffnenDieses Beispiel bildet einen Application-Rehost-Pfad für einen Spring-Boot-Workload ab, konkret das Spring-Music-Beispiel. Der Fokus liegt auf der Verlagerung der Laufzeit nach STACKIT:
systemd, ohne das Laufzeitmodell der Anwendung zu ändern.Die validierte Baseline enthält bewusst keinen Application Load Balancer, DNS-Switch, mehrere VMs, Kubernetes, Cloud Foundry oder PostgreSQL Flex. Ergänzen Sie diese nur als separat entworfene und getestete Erweiterungen; sie sind nicht impliziter Bestandteil dieses Rehost-Beispiels.
systemd-Service.Nutzen Sie dieses gemeinsame Flag-Modell in den Terraform-Variablen, um das Verhalten über CMF-Beispiele hinweg konsistent zu halten:
setup_project: Projektkontext erstellen oder verwenden.setup_observability: Observability-Ressourcen aktivieren oder deaktivieren.setup_database: Optionales VM-lokales PostgreSQL aktivieren oder deaktivieren.setup_workload: Workload-Installation auf der VM aktivieren oder deaktivieren.setup_loadgen: Optionale synthetische Lastgenerierung aktivieren oder deaktivieren.setup_dns: Wird vom gemeinsamen Wrapper akzeptiert, ist in dieser Baseline aber nicht unterstützt.Im aktuellen Rehost-Repository werden diese auf bestehende Schalter wie create_project,
enable_observability, enable_local_postgresql und die Flags zur Lastgenerierung abgebildet.
Das folgende Diagramm zeigt das implementierte und getestete Ziel, nicht eine zukünftige High-Availability-Variante.
Verwenden Sie ein isoliertes Linux-Labor mit Git, Terraform, Ansible, ShellCheck, SSH/SCP, curl, jq
und PostgreSQL-Server-/Client-Werkzeugen einschließlich pg_config. Die Sample-Dump-Skripte nutzen
runuser und den lokalen OS-Account postgres und benötigen Root-Rechte in diesem Labor.
Bei aktiviertem Server Backup braucht der Cutover zusätzlich eine authentifizierte STACKIT CLI.
Verwenden Sie für vorhandene gespeicherte Pläne die Terraform-Version, die sie erzeugt hat;
Plandateien sind versionsgebunden.
Beginnen Sie in einem übergeordneten Verzeichnis ohne bereits vorhandenen gleichnamigen Checkout. Dieser Stand enthält die Migrationsworkflows und die deklarative Observability-Verwaltung. Seine JAR ist gegenüber dem in der Replatform-Referenz fixierten Artefakt unverändert:
umask 077 && git clone https://github.com/stackitcloud/stackit-cmf-Rehost-springboot.git && git -C stackit-cmf-Rehost-springboot checkout --detach b9225eb35c64b9ef4761c208fadb9a2356431793 && test -f stackit-cmf-Rehost-springboot/scripts/run_cutover.sh && cd stackit-cmf-Rehost-springboot && printf '%s\n' "Workspace ready. Continue from this Rehost checkout." || { printf '%s\n' "Preparation failed. Resolve the error before continuing." >&2 false }Führen Sie die folgenden Schritte erst nach erfolgreicher Vorbereitung aus diesem Checkout aus. Bewahren Sie vorhandene Checkouts, State und Nachweise, statt sie zu ersetzen. Halten Sie Credentials, Pläne, State, Dumps, Inventory und Nachweise privat und außerhalb der Versionsverwaltung; aktivieren Sie kein Shell-Tracing.
Erstellen Sie die private Variablendatei nur, wenn sie noch nicht existiert:
umask 077test -e env.tfvars || cp env.tfvars.example env.tfvarschmod 600 env.tfvarsBearbeiten Sie die Datei vor dem Plan. Konfigurieren Sie das freigegebene bestehende Projekt oder den
Scope für die Projekterstellung, Service-Account-Key-Pfad, SSH-Schlüsselpaar, verfügbares Image,
Availability Zone, VM-Flavor und Storage. Beschränken Sie SSH- und Applikations-Ingress auf die
Quell-CIDRs, die am Zielpfad tatsächlich ankommen. Verifizieren Sie den SSH-Host-Key über einen
vertrauenswürdigen Kanal, bevor Migrationsskripte die strikte Host-Prüfung verwenden.
Setzen Sie für diese Skripte SSH_KEY und SSH_USER, falls sie von ~/.ssh/id_rsa und ubuntu
abweichen; halten Sie sie konsistent zu private_ssh_key_path und ssh_user in Terraform.
Aktivieren Sie VM-lokales PostgreSQL, Observability und Server Backup für diesen Walkthrough.
Lassen Sie für das erste Runtime-Deployment postgresql_restore_after_copy = false und den
Quelldump-Pfad leer: Provisioning darf die Quelle nicht vor Probe und Cutover-Freigabe importieren.
Übergeben Sie das Datenbankpasswort über den freigegebenen Secret-Mechanismus als
TF_VAR_postgresql_app_password und bewahren Sie es für spätere Pläne sicher auf;
schreiben Sie es nicht in Variablendatei, Shell-History oder Dokumentation.
Bestätigen Sie Berechtigungen, Quota, Kostenfreigabe und das private Terraform-Backend vor der Initialisierung. Dieser Ablauf setzt einen vorbereiteten Ausführungshost voraus und ist keine vollständige Installationsanleitung für das Labor.
Erstellen Sie einen Quelldump im Custom Format und erfassen Sie SHA-256-Prüfsumme, erwartete Datensatzanzahl und einen Workload-spezifischen deterministischen Fingerprint. Das Repository enthält ein reproduzierbares Beispiel mit acht Datensätzen:
./scripts/create_source_dump.sh./scripts/validate_source_dump.shDas Validierungsskript stellt den Dump in einem separaten lokalen PostgreSQL-Cluster wieder her, bevor er in eine Migrationsprobe eingehen darf. Die Skripte erzeugen das mitgelieferte Sample in temporären lokalen Clustern; sie exportieren weder eine laufende Anwendung noch die STACKIT VM. Verwenden Sie ein frisches Artefaktverzeichnis und überschreiben Sie keinen bereits freigegebenen Migrationsdump. Exportieren Sie eine reale Quelle unter dem vereinbarten Write Freeze und erfassen Sie gleichwertige Nachweise für Prüfsumme, Anzahl und Fingerprint.
Konfigurieren Sie ein bestehendes STACKIT Projekt oder die Projekterstellung, beschränken Sie SSH-
und Applikations-Ingress auf freigegebene Quell-CIDRs und übergeben Sie das Datenbankpasswort über
TF_VAR_postgresql_app_password statt über eine Variablendatei. Prüfen Sie vor dem Apply einen
gespeicherten Plan.
terraform init && ./scripts/check.sh && terraform plan -input=false -var-file=env.tfvars -out=tfplanStoppen Sie bei Fehlern in Initialisierung, Checks oder Plan. Prüfen Sie Ressourcenänderungen, Zielprojekt, Ingress, Kosten und den deaktivierten initialen Restore, bevor Sie den gespeicherten Plan ausdrücklich anwenden:
terraform apply tfplanTerraform führt nach dem Provisioning Ansible aus. Ein erfolgreicher Apply belegt den Abschluss dieser Orchestrierung, nicht die Abnahme migrierter Daten. Prüfen Sie die Laufzeit vor der Probe:
./scripts/validate_deployment.shFühren Sie die Probe gegen eine temporäre Datenbank auf der Ziel-VM aus:
./scripts/run_migration_rehearsal.shDie Probe prüft die Quelldaten, stellt den Dump wieder her, vergleicht Datensatzanzahl und Fingerprint
und entfernt die temporäre Datenbank, ohne die produktive springmusic-Datenbank zu verändern.
Hinterlegen Sie die erwarteten Quelldaten in env.tfvars:
enable_local_postgresql = truepostgresql_source_dump_local_path = "artifacts/source-postgresql.dump"postgresql_restore_after_copy = truepostgresql_expected_album_count = 8postgresql_expected_album_fingerprint = "<source-fingerprint>"Führen Sie anschließend das explizite Freigabe-Gate aus:
./scripts/run_cutover.sh --confirmDas Skript verlangt ein vollständig verfügbares Server Backup, das höchstens 24 Stunden alt ist. Es erzeugt einen gespeicherten Terraform-Plan, der ausschließlich die Ansible-Orchestrierungsressource ersetzt, weist andere Infrastrukturänderungen zurück, führt den Restore aus, validiert Daten und Laufzeitverhalten und verlangt abschließend einen Terraform-No-op-Plan. Wiederholungen mit demselben Quelldump-Hash bewahren den ursprünglichen Datenbank-Rollback-Punkt.
Die Validierung prüft Datensatzanzahl und Fingerprint der Quelle, Tabellen-Ownership, einen transaktional zurückgerollten Schreibvorgang als Application Role, Erreichbarkeit der Anwendung, Services und den geschützten Rollback-Dump.
./scripts/validate_migration.sh./scripts/validate_deployment.sh./scripts/verify_rollback.shWenn innerhalb des Rollback-Fensters ein freigegebener Rollback-Trigger eintritt, bewahren Sie die aktuelle Zieldatenbank und stellen den ursprünglichen Dump von vor dem Cutover wieder her:
./scripts/rollback_postgresql.sh --confirmMit enable_server_backup = true aktiviert Terraform STACKIT Server Backup und einen täglichen
Zeitplan für das Boot Volume der VM. Die Standardaufbewahrung beträgt 14 Tage. Der Cutover verlangt
ein vollständig verfügbares Backup, das höchstens 24 Stunden alt ist. Erstellung und Status des
Backups wurden am realen Ziel validiert; ein In-place-Restore mit Server Backup bleibt eine
disruptive Disaster-Recovery-Operation und muss in einer separaten Recovery-Umgebung geprobt werden.
Server Backup ergänzt den PostgreSQL-Dump von vor dem Restore. Es ersetzt weder die Datenbank-Konsistenzprüfungen noch das Application-Rollback-Verfahren.
Folgen Sie Arbeitsumgebung, privater Zielkonfiguration, Quellnachweisen und geprüftem Provisioning
in dieser Reihenfolge. Proben Sie vor dem freigegebenen Cutover und bewahren Sie anschließend die
Abnahmenachweise auf. Die Repository-Skripte rufen ausdrücklich terraform auf; ein Ausführungshost
mit ausschließlich OpenTofu benötigt eine separat geprüfte Anpassung, nicht nur ersetzte Befehle
auf dieser Seite.
Die Implementierung stellt STACKIT Observability bereit und erfasst den Node Exporter. Der Grafana-Provider
verwaltet das enthaltene Dashboard im Ordner SCF Rehost mit der vorhandenen Thanos-Datenquelle.
Er wartet auf die Bereitschaft der Instanz, statt die Dashboard-Erstellung stillschweigend zu überspringen.
Prüfen Sie über grafana_dashboard_url aktuelle VM-, Spring-Boot- und PostgreSQL-Metriken und verlangen
Sie anschließend einen No-op-Plan. Sieben Panels bilden die aktive Basis ab; das Panel für synthetische
Anfragen erscheint nur bei aktiviertem lokalem Lastgenerator. Diese Anfragen bilden nicht den gesamten
Application-Traffic ab. Die Deployment-Validierung prüft außerdem Exporter-Metriken und Service Health
nach dem Apply und nach dem Datenbank-Restore.
Die initialen Grafana-Admin-Zugangsdaten bleiben eine temporäre Authentifizierungsabhängigkeit. Schützen Sie State und gespeicherte Pläne. Benachrichtigungsempfänger, Zuständigkeit für Alarm-Routing, Application-Logs und Distributed Tracing benötigen vor Produktionseinsatz eine separate Konfiguration und Abnahme.
Dieses Beispiel kann in zwei zulässigen Setup-Modi eingesetzt werden.
create_project = false und project_id = "...", sowie die für
diesen Landing-Zone-Scope konfigurierte Service-Account-JSON.create_project = true und geben Sie über parent_container_id einen
bestehenden Folder oder Container an, in dem der Service Account ausreichende Berechtigungen hat.Hinweise zum Landing-Zone-Design finden Sie unter Application Landing Zone.
Nutzen Sie dieses Beispiel als Ausgangspunkt in env.tfvars.
create_project = truetarget_project_name = "cmf-rehost-springboot"target_project_owner_email = "owner@example.com"parent_container_id = "cmf-xxxxxxxx"service_account_key_path = "~/.ssh/cmf-sa.json"public_ssh_key_path = "~/.ssh/id_rsa.pub"private_ssh_key_path = "~/.ssh/id_rsa"availability_zone = "eu01-1"machine_type = "g2i.2"ssh_allowed_cidr = "203.0.113.10/32"app_allowed_cidr = "203.0.113.10/32"enable_local_postgresql = trueenable_observability = trueenable_server_backup = trueansible/files/springboot-app.jarjar_local_path verweist auf dieselbe Datei.jar_local_path.Wenn sich das Artefakt ändert, erkennt Terraform die geänderte Prüfsumme und führt den Ansible-Deployment-Schritt erneut aus.
Jede Probe, jeder Cutover und jedes Rollback schreibt eine evidence.env-Datei unter
artifacts/evidence/<timestamp>-<mode>/. Akzeptieren Sie einen Cutover nur, wenn der Nachweis die
erwartete Prüfsumme, Datensatzanzahl, den Fingerprint, die Ziel-VM, eine erfolgreiche
Laufzeitvalidierung und den abschließenden Terraform-No-op dokumentiert.
./scripts/validate_migration.sh./scripts/validate_deployment.shterraform plan -var-file=env.tfvars -detailed-exitcodeVerwenden Sie denselben freigegebenen Quellpfad, Restore-Schalter, Erwartungswert und Fingerprint
wie beim abgeschlossenen Cutover. Exit-Code 0 bedeutet keine Änderungen, 2 vorgeschlagene
Änderungen und 1 einen Fehler. Ein Plan allein belegt keinen Apply. Der Cutover-Workflow setzt
status=passed und terraform_noop=true erst nach Anwendung seines gespeicherten Plans und
erfolgreicher Daten- und Laufzeitvalidierung.
Die Replatform-Referenz verwendet das fixierte Spring-Music-JAR und den Sample-Datengenerator dieses Repositories weiter. Ihr Sample-Walkthrough benötigt deshalb diesen Checkout und validierte Dump-Artefakte, aber keine neu bereitgestellte Rehost-VM. Erstellen Sie keine zusätzliche VM allein zur Erzeugung des lokalen Samples.
Für eine tatsächliche Migration von der Rehost-VM zu SKE und PostgreSQL Flex müssen Sie den aktuellen VM-Zustand prüfen, Schreibzugriffe der Anwendung einfrieren, die reale PostgreSQL-Datenbank exportieren und diesen Export qualifizieren. Ein historisch erfolgreicher Rehost-Apply belegt weder aktuelle Erreichbarkeit noch die Gleichwertigkeit des lokalen Samples mit den VM-Daten. Quellexport, Abnahme und Source Failback benötigen ein eigenes freigegebenes Verfahren.
./scripts/run_migration_rehearsal.sh gegen eine temporäre Zieldatenbank ausführen../scripts/run_cutover.sh --confirm mit den freigegebenen Quelldaten ausführen../scripts/rollback_postgresql.sh --confirm ausführen, um Spring Boot zu stoppen und die aktuelle Zieldatenbank zu bewahren.| Checkpoint | Owner | Timestamp | Ergebnis | Evidence Link |
|---|---|---|---|---|
| Ziel-VM-Runtime vorbereitet | Platform Engineer | YYYY-MM-DD HH:MM | Pass/Fail | link |
| Probe abgeschlossen | DB Owner | YYYY-MM-DD HH:MM | Pass/Fail | link |
| DB-Restore und Integritätscheck | DB Owner | YYYY-MM-DD HH:MM | Pass/Fail | link |
| Terraform-No-op bestätigt | Platform Engineer | YYYY-MM-DD HH:MM | Pass/Fail | link |
| Post-Cutover Business-Checks | Application Owner | YYYY-MM-DD HH:MM | Pass/Fail | link |
| Handover akzeptiert | Operations Owner | YYYY-MM-DD HH:MM | Pass/Fail | link |
Das Migration Framework definiert Strategie, Design, Landing Zone, Migration und Betriebsprinzipien für Rehost-Workloads. Dieses Asset wendet diese Prinzipien auf eine konkrete, ausführbare Spring-Boot- und PostgreSQL-Implementierung auf STACKIT an.
Das gepflegte Repository ist die Source of Truth für Terraform, Ansible, Applikationsartefakte, Migrationsskripte, Validierung und Laufzeitkonfiguration. Dieses Asset beschreibt die Nutzung der Implementierung, ohne ihren vollständigen Quellcode zu duplizieren.
STACKIT CMF Rehost Spring Boot Repository Öffnen Sie die ausführbare Terraform- und Ansible-Referenzimplementierung für den Rehost-Pfad von Spring Boot und PostgreSQL. Repository öffnenDieses Beispiel bildet einen Application-Rehost-Pfad für einen Spring-Boot-Workload ab, konkret das Spring-Music-Beispiel. Der Fokus liegt auf der Verlagerung der Laufzeit nach STACKIT:
systemd, ohne das Laufzeitmodell der Anwendung zu ändern.Die validierte Baseline enthält bewusst keinen Application Load Balancer, DNS-Switch, mehrere VMs, Kubernetes, Cloud Foundry oder PostgreSQL Flex. Ergänzen Sie diese nur als separat entworfene und getestete Erweiterungen; sie sind nicht impliziter Bestandteil dieses Rehost-Beispiels.
systemd-Service.Nutzen Sie dieses gemeinsame Flag-Modell in den Terraform-Variablen, um das Verhalten über CMF-Beispiele hinweg konsistent zu halten:
setup_project: Projektkontext erstellen oder verwenden.setup_observability: Observability-Ressourcen aktivieren oder deaktivieren.setup_database: Optionales VM-lokales PostgreSQL aktivieren oder deaktivieren.setup_workload: Workload-Installation auf der VM aktivieren oder deaktivieren.setup_loadgen: Optionale synthetische Lastgenerierung aktivieren oder deaktivieren.setup_dns: Wird vom gemeinsamen Wrapper akzeptiert, ist in dieser Baseline aber nicht unterstützt.Im aktuellen Rehost-Repository werden diese auf bestehende Schalter wie create_project,
enable_observability, enable_local_postgresql und die Flags zur Lastgenerierung abgebildet.
Das folgende Diagramm zeigt das implementierte und getestete Ziel, nicht eine zukünftige High-Availability-Variante.
Verwenden Sie ein isoliertes Linux-Labor mit Git, Terraform, Ansible, ShellCheck, SSH/SCP, curl, jq
und PostgreSQL-Server-/Client-Werkzeugen einschließlich pg_config. Die Sample-Dump-Skripte nutzen
runuser und den lokalen OS-Account postgres und benötigen Root-Rechte in diesem Labor.
Bei aktiviertem Server Backup braucht der Cutover zusätzlich eine authentifizierte STACKIT CLI.
Verwenden Sie für vorhandene gespeicherte Pläne die Terraform-Version, die sie erzeugt hat;
Plandateien sind versionsgebunden.
Beginnen Sie in einem übergeordneten Verzeichnis ohne bereits vorhandenen gleichnamigen Checkout. Dieser Stand enthält die Migrationsworkflows und die deklarative Observability-Verwaltung. Seine JAR ist gegenüber dem in der Replatform-Referenz fixierten Artefakt unverändert:
umask 077 && git clone https://github.com/stackitcloud/stackit-cmf-Rehost-springboot.git && git -C stackit-cmf-Rehost-springboot checkout --detach b9225eb35c64b9ef4761c208fadb9a2356431793 && test -f stackit-cmf-Rehost-springboot/scripts/run_cutover.sh && cd stackit-cmf-Rehost-springboot && printf '%s\n' "Workspace ready. Continue from this Rehost checkout." || { printf '%s\n' "Preparation failed. Resolve the error before continuing." >&2 false }Führen Sie die folgenden Schritte erst nach erfolgreicher Vorbereitung aus diesem Checkout aus. Bewahren Sie vorhandene Checkouts, State und Nachweise, statt sie zu ersetzen. Halten Sie Credentials, Pläne, State, Dumps, Inventory und Nachweise privat und außerhalb der Versionsverwaltung; aktivieren Sie kein Shell-Tracing.
Erstellen Sie die private Variablendatei nur, wenn sie noch nicht existiert:
umask 077test -e env.tfvars || cp env.tfvars.example env.tfvarschmod 600 env.tfvarsBearbeiten Sie die Datei vor dem Plan. Konfigurieren Sie das freigegebene bestehende Projekt oder den
Scope für die Projekterstellung, Service-Account-Key-Pfad, SSH-Schlüsselpaar, verfügbares Image,
Availability Zone, VM-Flavor und Storage. Beschränken Sie SSH- und Applikations-Ingress auf die
Quell-CIDRs, die am Zielpfad tatsächlich ankommen. Verifizieren Sie den SSH-Host-Key über einen
vertrauenswürdigen Kanal, bevor Migrationsskripte die strikte Host-Prüfung verwenden.
Setzen Sie für diese Skripte SSH_KEY und SSH_USER, falls sie von ~/.ssh/id_rsa und ubuntu
abweichen; halten Sie sie konsistent zu private_ssh_key_path und ssh_user in Terraform.
Aktivieren Sie VM-lokales PostgreSQL, Observability und Server Backup für diesen Walkthrough.
Lassen Sie für das erste Runtime-Deployment postgresql_restore_after_copy = false und den
Quelldump-Pfad leer: Provisioning darf die Quelle nicht vor Probe und Cutover-Freigabe importieren.
Übergeben Sie das Datenbankpasswort über den freigegebenen Secret-Mechanismus als
TF_VAR_postgresql_app_password und bewahren Sie es für spätere Pläne sicher auf;
schreiben Sie es nicht in Variablendatei, Shell-History oder Dokumentation.
Bestätigen Sie Berechtigungen, Quota, Kostenfreigabe und das private Terraform-Backend vor der Initialisierung. Dieser Ablauf setzt einen vorbereiteten Ausführungshost voraus und ist keine vollständige Installationsanleitung für das Labor.
Erstellen Sie einen Quelldump im Custom Format und erfassen Sie SHA-256-Prüfsumme, erwartete Datensatzanzahl und einen Workload-spezifischen deterministischen Fingerprint. Das Repository enthält ein reproduzierbares Beispiel mit acht Datensätzen:
./scripts/create_source_dump.sh./scripts/validate_source_dump.shDas Validierungsskript stellt den Dump in einem separaten lokalen PostgreSQL-Cluster wieder her, bevor er in eine Migrationsprobe eingehen darf. Die Skripte erzeugen das mitgelieferte Sample in temporären lokalen Clustern; sie exportieren weder eine laufende Anwendung noch die STACKIT VM. Verwenden Sie ein frisches Artefaktverzeichnis und überschreiben Sie keinen bereits freigegebenen Migrationsdump. Exportieren Sie eine reale Quelle unter dem vereinbarten Write Freeze und erfassen Sie gleichwertige Nachweise für Prüfsumme, Anzahl und Fingerprint.
Konfigurieren Sie ein bestehendes STACKIT Projekt oder die Projekterstellung, beschränken Sie SSH-
und Applikations-Ingress auf freigegebene Quell-CIDRs und übergeben Sie das Datenbankpasswort über
TF_VAR_postgresql_app_password statt über eine Variablendatei. Prüfen Sie vor dem Apply einen
gespeicherten Plan.
terraform init && ./scripts/check.sh && terraform plan -input=false -var-file=env.tfvars -out=tfplanStoppen Sie bei Fehlern in Initialisierung, Checks oder Plan. Prüfen Sie Ressourcenänderungen, Zielprojekt, Ingress, Kosten und den deaktivierten initialen Restore, bevor Sie den gespeicherten Plan ausdrücklich anwenden:
terraform apply tfplanTerraform führt nach dem Provisioning Ansible aus. Ein erfolgreicher Apply belegt den Abschluss dieser Orchestrierung, nicht die Abnahme migrierter Daten. Prüfen Sie die Laufzeit vor der Probe:
./scripts/validate_deployment.shFühren Sie die Probe gegen eine temporäre Datenbank auf der Ziel-VM aus:
./scripts/run_migration_rehearsal.shDie Probe prüft die Quelldaten, stellt den Dump wieder her, vergleicht Datensatzanzahl und Fingerprint
und entfernt die temporäre Datenbank, ohne die produktive springmusic-Datenbank zu verändern.
Hinterlegen Sie die erwarteten Quelldaten in env.tfvars:
enable_local_postgresql = truepostgresql_source_dump_local_path = "artifacts/source-postgresql.dump"postgresql_restore_after_copy = truepostgresql_expected_album_count = 8postgresql_expected_album_fingerprint = "<source-fingerprint>"Führen Sie anschließend das explizite Freigabe-Gate aus:
./scripts/run_cutover.sh --confirmDas Skript verlangt ein vollständig verfügbares Server Backup, das höchstens 24 Stunden alt ist. Es erzeugt einen gespeicherten Terraform-Plan, der ausschließlich die Ansible-Orchestrierungsressource ersetzt, weist andere Infrastrukturänderungen zurück, führt den Restore aus, validiert Daten und Laufzeitverhalten und verlangt abschließend einen Terraform-No-op-Plan. Wiederholungen mit demselben Quelldump-Hash bewahren den ursprünglichen Datenbank-Rollback-Punkt.
Die Validierung prüft Datensatzanzahl und Fingerprint der Quelle, Tabellen-Ownership, einen transaktional zurückgerollten Schreibvorgang als Application Role, Erreichbarkeit der Anwendung, Services und den geschützten Rollback-Dump.
./scripts/validate_migration.sh./scripts/validate_deployment.sh./scripts/verify_rollback.shWenn innerhalb des Rollback-Fensters ein freigegebener Rollback-Trigger eintritt, bewahren Sie die aktuelle Zieldatenbank und stellen den ursprünglichen Dump von vor dem Cutover wieder her:
./scripts/rollback_postgresql.sh --confirmMit enable_server_backup = true aktiviert Terraform STACKIT Server Backup und einen täglichen
Zeitplan für das Boot Volume der VM. Die Standardaufbewahrung beträgt 14 Tage. Der Cutover verlangt
ein vollständig verfügbares Backup, das höchstens 24 Stunden alt ist. Erstellung und Status des
Backups wurden am realen Ziel validiert; ein In-place-Restore mit Server Backup bleibt eine
disruptive Disaster-Recovery-Operation und muss in einer separaten Recovery-Umgebung geprobt werden.
Server Backup ergänzt den PostgreSQL-Dump von vor dem Restore. Es ersetzt weder die Datenbank-Konsistenzprüfungen noch das Application-Rollback-Verfahren.
Folgen Sie Arbeitsumgebung, privater Zielkonfiguration, Quellnachweisen und geprüftem Provisioning
in dieser Reihenfolge. Proben Sie vor dem freigegebenen Cutover und bewahren Sie anschließend die
Abnahmenachweise auf. Die Repository-Skripte rufen ausdrücklich terraform auf; ein Ausführungshost
mit ausschließlich OpenTofu benötigt eine separat geprüfte Anpassung, nicht nur ersetzte Befehle
auf dieser Seite.
Die Implementierung stellt STACKIT Observability bereit und erfasst den Node Exporter. Der Grafana-Provider
verwaltet das enthaltene Dashboard im Ordner SCF Rehost mit der vorhandenen Thanos-Datenquelle.
Er wartet auf die Bereitschaft der Instanz, statt die Dashboard-Erstellung stillschweigend zu überspringen.
Prüfen Sie über grafana_dashboard_url aktuelle VM-, Spring-Boot- und PostgreSQL-Metriken und verlangen
Sie anschließend einen No-op-Plan. Sieben Panels bilden die aktive Basis ab; das Panel für synthetische
Anfragen erscheint nur bei aktiviertem lokalem Lastgenerator. Diese Anfragen bilden nicht den gesamten
Application-Traffic ab. Die Deployment-Validierung prüft außerdem Exporter-Metriken und Service Health
nach dem Apply und nach dem Datenbank-Restore.
Die initialen Grafana-Admin-Zugangsdaten bleiben eine temporäre Authentifizierungsabhängigkeit. Schützen Sie State und gespeicherte Pläne. Benachrichtigungsempfänger, Zuständigkeit für Alarm-Routing, Application-Logs und Distributed Tracing benötigen vor Produktionseinsatz eine separate Konfiguration und Abnahme.
Dieses Beispiel kann in zwei zulässigen Setup-Modi eingesetzt werden.
create_project = false und project_id = "...", sowie die für
diesen Landing-Zone-Scope konfigurierte Service-Account-JSON.create_project = true und geben Sie über parent_container_id einen
bestehenden Folder oder Container an, in dem der Service Account ausreichende Berechtigungen hat.Hinweise zum Landing-Zone-Design finden Sie unter Application Landing Zone.
Nutzen Sie dieses Beispiel als Ausgangspunkt in env.tfvars.
create_project = truetarget_project_name = "cmf-rehost-springboot"target_project_owner_email = "owner@example.com"parent_container_id = "cmf-xxxxxxxx"service_account_key_path = "~/.ssh/cmf-sa.json"public_ssh_key_path = "~/.ssh/id_rsa.pub"private_ssh_key_path = "~/.ssh/id_rsa"availability_zone = "eu01-1"machine_type = "g2i.2"ssh_allowed_cidr = "203.0.113.10/32"app_allowed_cidr = "203.0.113.10/32"enable_local_postgresql = trueenable_observability = trueenable_server_backup = trueansible/files/springboot-app.jarjar_local_path verweist auf dieselbe Datei.jar_local_path.Wenn sich das Artefakt ändert, erkennt Terraform die geänderte Prüfsumme und führt den Ansible-Deployment-Schritt erneut aus.
Jede Probe, jeder Cutover und jedes Rollback schreibt eine evidence.env-Datei unter
artifacts/evidence/<timestamp>-<mode>/. Akzeptieren Sie einen Cutover nur, wenn der Nachweis die
erwartete Prüfsumme, Datensatzanzahl, den Fingerprint, die Ziel-VM, eine erfolgreiche
Laufzeitvalidierung und den abschließenden Terraform-No-op dokumentiert.
./scripts/validate_migration.sh./scripts/validate_deployment.shterraform plan -var-file=env.tfvars -detailed-exitcodeVerwenden Sie denselben freigegebenen Quellpfad, Restore-Schalter, Erwartungswert und Fingerprint
wie beim abgeschlossenen Cutover. Exit-Code 0 bedeutet keine Änderungen, 2 vorgeschlagene
Änderungen und 1 einen Fehler. Ein Plan allein belegt keinen Apply. Der Cutover-Workflow setzt
status=passed und terraform_noop=true erst nach Anwendung seines gespeicherten Plans und
erfolgreicher Daten- und Laufzeitvalidierung.
Die Replatform-Referenz verwendet das fixierte Spring-Music-JAR und den Sample-Datengenerator dieses Repositories weiter. Ihr Sample-Walkthrough benötigt deshalb diesen Checkout und validierte Dump-Artefakte, aber keine neu bereitgestellte Rehost-VM. Erstellen Sie keine zusätzliche VM allein zur Erzeugung des lokalen Samples.
Für eine tatsächliche Migration von der Rehost-VM zu SKE und PostgreSQL Flex müssen Sie den aktuellen VM-Zustand prüfen, Schreibzugriffe der Anwendung einfrieren, die reale PostgreSQL-Datenbank exportieren und diesen Export qualifizieren. Ein historisch erfolgreicher Rehost-Apply belegt weder aktuelle Erreichbarkeit noch die Gleichwertigkeit des lokalen Samples mit den VM-Daten. Quellexport, Abnahme und Source Failback benötigen ein eigenes freigegebenes Verfahren.
Kehren Sie vom konkreten Migrationsbeispiel zum Migration Framework zurück. Beginnen Sie Optimize erst nach stabilem Cutover, verwenden Sie repräsentative Produktionstelemetrie, setzen Sie jeweils eine kontrollierte Änderung um und validieren Sie ihre Wirkung auf Zuverlässigkeit, Performance und Kosten.
Optimize startet, sobald Workloads auf STACKIT laufen und reale Daten aus dem Betrieb vorliegen. Das Modul überführt Beobachtungen aus dem Betrieb in messbare Verbesserungen für Performance, Stabilität und Wirtschaftlichkeit.
Optimize ist keine einmalige Aufgabe, sondern ein iterativer Zyklus, der sich mit früher Stabilisierung und Unterstützung direkt nach dem Cutover überschneiden kann.
Viele Entscheidungen zu Rightsizing und Tuning sind erst unter echter Last belastbar. Nach dem Cutover lassen sich Annahmen mit Daten aus dem Betrieb validieren und präzisieren.
Optimierungsentscheidungen sollten auf Laufzeitdaten basieren, nicht auf Annahmen. Für die praktische Umsetzung werden Workload-Telemetrie, Alerting und kontrollierte Infrastrukturänderungen kombiniert.
Für Replatform-Workloads auf Kubernetes umfasst Optimierung mehrere Ebenen und sollte als gemeinsamer Regelkreis gesteuert werden.
Zentrale Eingaben
Cutover-Berichte, Incident-Trends, SLO-Messwerte, Telemetrie-Baselines und Kostenberichte.
Ergebnisse
Priorisiertes Verbesserungs-Backlog, validierte Tuning-Änderungen und aktualisierte Betriebsstandards.
Governance-Effekt
Nachvollziehbare Trade-off-Entscheidungen zwischen Performance, Stabilität und Kosten.
STACKIT
Der souveräne europäische Cloud-Anbieter hinter dem Framework, mit IaaS und PaaS aus deutschen und österreichischen Rechenzentren und voller Unabhängigkeit.
Dieses Asset führt dieselbe Spring-Boot- und PostgreSQL-Referenzimplementierung fort, die für Provisioning, Migration, Cutover und Stabilisierung verwendet wurde. Es führt kein weiteres Beispiel oder Repository ein. Die vorhandenen Terraform-Variablen, Ansible-Konfiguration, Observability-Instanz und Validierungsworkflows bleiben die technische Baseline für Optimize.
Die Optimize-Erweiterung beantwortet eine praktische Frage: Wie lassen sich Über- oder Unterprovisionierung erkennen und VM- oder Storage-Kapazität anschließend über einen kontrollierten IaC-Workflow ändern?
STACKIT CMF Rehost Spring Boot Repository Arbeiten Sie mit derselben Terraform- und Ansible-Referenzimplementierung weiter, die in den vorherigen Rehost-Migrationsschritten verwendet wurde. Repository öffnen Rehost-Implementierungs-AssetNutze den managed STACKIT Observability -Stack als Datenquelle.
Architektur-Referenzen:
Nutze das Dashboard, um Infrastruktur-Auslastung, Anwendungszustand, Request-Verhalten und Alert-Historie gemeinsam zu bewerten, bevor die VM-Kapazität geändert wird.

Definiere technische Schwellwerte, bevor du Kapazität änderst.
Halte Schwellwerte workload-spezifisch und validiere sie gegen reale Traffic-Muster.
Für stateful Rehost-Workloads sollten Signale aus der Datenbank im selben Dashboard-Zyklus bewertet werden.
Nutze diese Signale gemeinsam mit VM-Metriken, damit Optimize-Entscheidungen nicht nur auf CPU oder Memory basieren.
Wenn der Rehost-Workload den Datenbank-Layer später auf PostgreSQL Flex umstellt, sollte DB-Rightsizing in denselben Optimize-Loop aufgenommen werden.
Passe die VM-Größe in env.tfvars an:
machine_type = "g3i.2"Apply und Plan-Ausgabe prüfen:
terraform plan -var-file=env.tfvarsterraform apply -var-file=env.tfvarsDanach validieren:
systemctl status, synthetische Checks)Passe die VM-Größe in env.tfvars an:
machine_type = "g3i.4"Apply durchführen und mit denselben Post-Change-Checks validieren.
Wenn sich SLOs nach dem Rightsizing verschlechtern, rolle zurück, indem du den vorherigen machine_type wiederherstellst und IaC erneut ausführst.
Behandle Rollback als regulären Runbook-Schritt und nicht nur als Notfallweg.
terraform plan.In Rehost-Szenarien sind CPU und Memory nur eine Seite des Rightsizing. Auch Storage-Performance kann zum Engpass werden.
Eine Block-Storage-Performance-Klasse definiert die maximalen IOPS und den maximalen Durchsatz für das gesamte Volume. Zugriffe von Anwendung, Datenbank, Betriebssystem und Backup teilen dieses Performance-Budget. Wählen Sie die Klasse vor dem Erstellen des Volumes anhand gemessener Lastspitzen, Latenzanforderungen, Backup-Aktivität und expliziter Wachstumsreserve.
Die folgende Tabelle listet die derzeit verfügbaren Leistungs-Klassen für die Region EU01 auf:
| Leistungs-Klasse | Name | Max. IOPS | Max. Durchsatz (MB/s) |
|---|---|---|---|
| Leistungs-Klasse 0 | storage_premium_perf0 | 120 | 25 |
| Leistungs-Klasse 1 | storage_premium_perf1 | 500 | 50 |
| Leistungs-Klasse 2 | storage_premium_perf2 | 1000 | 100 |
| Leistungs-Klasse 4 | storage_premium_perf4 | 2000 | 150 |
| Leistungs-Klasse 6 | storage_premium_perf6 | 5000 | 200 |
| Leistungs-Klasse 8 | storage_premium_perf8 | 10000 | 250 |
| Leistungs-Klasse 10 | storage_premium_perf10 | 15000 | 300 |
| Leistungs-Klasse 12 | storage_premium_perf12 | 20000 | 350 |
| Leistungs-Klasse 13 | storage_premium_perf13 | 20000 | 700 |
| Leistungs-Klasse 14 | storage_premium_perf14 | 25000 | 400 |
| Leistungs-Klasse 15 | storage_premium_perf15 | 25000 | 800 |
| Leistungs-Klasse 16 | storage_premium_perf16 | 30000 | 450 |
| Leistungs-Klasse 17 | storage_premium_perf17 | 30000 | 900 |
| Leistungs-Klasse 18 | storage_premium_perf18 | 35000 | 500 |
| Leistungs-Klasse 19 | storage_premium_perf19 | 35000 | 1000 |
| Leistungs-Klasse 20 | storage_premium_perf20 | 40000 | 550 |
| Leistungs-Klasse 21 | storage_premium_perf21 | 40000 | 1100 |
IOPS – Input/Output Operations per second (Ein-/Ausgabebefehle pro Sekunde)
Durchsatz – Durchsatz in Megabyte pro Sekunde
Somit lassen sich die verwendeten Klassen anhand der Namensgebung im Detail unterscheiden. Beispiel: „Block Storage Premium – Leistungs-Klasse 2“ entspricht SSD-Festplatten mit max. 1000 IOPS und max. 100 Mbyte/s Durchsatz.
Dieser Abschnitt wird mehrmals am Tag automatisch aus der STACKIT-Doku übernommen. Hier lässt er sich nicht ändern. Änderungen gehören in die STACKIT-Doku.
In der Rehost-Baseline teilen sich Betriebssystem, Spring-Boot-Anwendung und PostgreSQL-Daten das Boot Volume. Eine Änderung der Performance-Klasse erfordert daher ein kontrolliertes Ersatzziel:
Verwenden Sie ein separates Data Volume, wenn Storage-Kapazität oder -Performance unabhängig vom VM-Lifecycle weiterentwickelt werden müssen. Erstellen Sie für eine andere Performance-Klasse ein neues Volume im erforderlichen Verfügbarkeitsmodell mit ausreichender Kapazität, stoppen Sie Schreibzugriffe, migrieren und verifizieren Sie die Daten, wechseln Sie Attachment oder Mount und bewahren Sie das Quell-Volume auf, bis Abnahme- und Rollback-Gates passiert sind.
Daten aus Block Storage migrierenBehandeln Sie Storage-Prüfungen als Teil derselben Optimize-Schleife und validieren Sie nach jeder Änderung erneut Latenz, Fehlerverhalten, Recovery und Kostenwirkung.
Dieses Asset führt dieselbe Spring-Boot- und PostgreSQL-Referenzimplementierung fort, die für Provisioning, Migration, Cutover und Stabilisierung verwendet wurde. Es führt kein weiteres Beispiel oder Repository ein. Die vorhandenen Terraform-Variablen, Ansible-Konfiguration, Observability-Instanz und Validierungsworkflows bleiben die technische Baseline für Optimize.
Die Optimize-Erweiterung beantwortet eine praktische Frage: Wie lassen sich Über- oder Unterprovisionierung erkennen und VM- oder Storage-Kapazität anschließend über einen kontrollierten IaC-Workflow ändern?
STACKIT CMF Rehost Spring Boot Repository Arbeiten Sie mit derselben Terraform- und Ansible-Referenzimplementierung weiter, die in den vorherigen Rehost-Migrationsschritten verwendet wurde. Repository öffnen Rehost-Implementierungs-AssetNutze den managed STACKIT Observability -Stack als Datenquelle.
Architektur-Referenzen:
Nutze das Dashboard, um Infrastruktur-Auslastung, Anwendungszustand, Request-Verhalten und Alert-Historie gemeinsam zu bewerten, bevor die VM-Kapazität geändert wird.

Definiere technische Schwellwerte, bevor du Kapazität änderst.
Halte Schwellwerte workload-spezifisch und validiere sie gegen reale Traffic-Muster.
Für stateful Rehost-Workloads sollten Signale aus der Datenbank im selben Dashboard-Zyklus bewertet werden.
Nutze diese Signale gemeinsam mit VM-Metriken, damit Optimize-Entscheidungen nicht nur auf CPU oder Memory basieren.
Wenn der Rehost-Workload den Datenbank-Layer später auf PostgreSQL Flex umstellt, sollte DB-Rightsizing in denselben Optimize-Loop aufgenommen werden.
Passe die VM-Größe in env.tfvars an:
machine_type = "g3i.2"Apply und Plan-Ausgabe prüfen:
terraform plan -var-file=env.tfvarsterraform apply -var-file=env.tfvarsDanach validieren:
systemctl status, synthetische Checks)Passe die VM-Größe in env.tfvars an:
machine_type = "g3i.4"Apply durchführen und mit denselben Post-Change-Checks validieren.
Wenn sich SLOs nach dem Rightsizing verschlechtern, rolle zurück, indem du den vorherigen machine_type wiederherstellst und IaC erneut ausführst.
Behandle Rollback als regulären Runbook-Schritt und nicht nur als Notfallweg.
terraform plan.In Rehost-Szenarien sind CPU und Memory nur eine Seite des Rightsizing. Auch Storage-Performance kann zum Engpass werden.
Eine Block-Storage-Performance-Klasse definiert die maximalen IOPS und den maximalen Durchsatz für das gesamte Volume. Zugriffe von Anwendung, Datenbank, Betriebssystem und Backup teilen dieses Performance-Budget. Wählen Sie die Klasse vor dem Erstellen des Volumes anhand gemessener Lastspitzen, Latenzanforderungen, Backup-Aktivität und expliziter Wachstumsreserve.
Die folgende Tabelle listet die derzeit verfügbaren Leistungs-Klassen für die Region EU01 auf:
| Leistungs-Klasse | Name | Max. IOPS | Max. Durchsatz (MB/s) |
|---|---|---|---|
| Leistungs-Klasse 0 | storage_premium_perf0 | 120 | 25 |
| Leistungs-Klasse 1 | storage_premium_perf1 | 500 | 50 |
| Leistungs-Klasse 2 | storage_premium_perf2 | 1000 | 100 |
| Leistungs-Klasse 4 | storage_premium_perf4 | 2000 | 150 |
| Leistungs-Klasse 6 | storage_premium_perf6 | 5000 | 200 |
| Leistungs-Klasse 8 | storage_premium_perf8 | 10000 | 250 |
| Leistungs-Klasse 10 | storage_premium_perf10 | 15000 | 300 |
| Leistungs-Klasse 12 | storage_premium_perf12 | 20000 | 350 |
| Leistungs-Klasse 13 | storage_premium_perf13 | 20000 | 700 |
| Leistungs-Klasse 14 | storage_premium_perf14 | 25000 | 400 |
| Leistungs-Klasse 15 | storage_premium_perf15 | 25000 | 800 |
| Leistungs-Klasse 16 | storage_premium_perf16 | 30000 | 450 |
| Leistungs-Klasse 17 | storage_premium_perf17 | 30000 | 900 |
| Leistungs-Klasse 18 | storage_premium_perf18 | 35000 | 500 |
| Leistungs-Klasse 19 | storage_premium_perf19 | 35000 | 1000 |
| Leistungs-Klasse 20 | storage_premium_perf20 | 40000 | 550 |
| Leistungs-Klasse 21 | storage_premium_perf21 | 40000 | 1100 |
IOPS – Input/Output Operations per second (Ein-/Ausgabebefehle pro Sekunde)
Durchsatz – Durchsatz in Megabyte pro Sekunde
Somit lassen sich die verwendeten Klassen anhand der Namensgebung im Detail unterscheiden. Beispiel: „Block Storage Premium – Leistungs-Klasse 2“ entspricht SSD-Festplatten mit max. 1000 IOPS und max. 100 Mbyte/s Durchsatz.
Dieser Abschnitt wird mehrmals am Tag automatisch aus der STACKIT-Doku übernommen. Hier lässt er sich nicht ändern. Änderungen gehören in die STACKIT-Doku.
In der Rehost-Baseline teilen sich Betriebssystem, Spring-Boot-Anwendung und PostgreSQL-Daten das Boot Volume. Eine Änderung der Performance-Klasse erfordert daher ein kontrolliertes Ersatzziel:
Verwenden Sie ein separates Data Volume, wenn Storage-Kapazität oder -Performance unabhängig vom VM-Lifecycle weiterentwickelt werden müssen. Erstellen Sie für eine andere Performance-Klasse ein neues Volume im erforderlichen Verfügbarkeitsmodell mit ausreichender Kapazität, stoppen Sie Schreibzugriffe, migrieren und verifizieren Sie die Daten, wechseln Sie Attachment oder Mount und bewahren Sie das Quell-Volume auf, bis Abnahme- und Rollback-Gates passiert sind.
Daten aus Block Storage migrierenBehandeln Sie Storage-Prüfungen als Teil derselben Optimize-Schleife und validieren Sie nach jeder Änderung erneut Latenz, Fehlerverhalten, Recovery und Kostenwirkung.
STACKIT
Der souveräne europäische Cloud-Anbieter hinter dem Framework, mit IaaS und PaaS aus deutschen und österreichischen Rechenzentren und voller Unabhängigkeit.
Dieses Asset führt dieselbe Spring-Boot- und PostgreSQL-Referenzimplementierung fort, die für Provisioning, Migration, Cutover und Stabilisierung verwendet wurde. Es führt kein weiteres Beispiel oder Repository ein. Die vorhandenen Terraform-Variablen, Ansible-Konfiguration, Observability-Instanz und Validierungsworkflows bleiben die technische Baseline für Optimize.
Die Optimize-Erweiterung beantwortet eine praktische Frage: Wie lassen sich Über- oder Unterprovisionierung erkennen und VM- oder Storage-Kapazität anschließend über einen kontrollierten IaC-Workflow ändern?
STACKIT CMF Rehost Spring Boot Repository Arbeiten Sie mit derselben Terraform- und Ansible-Referenzimplementierung weiter, die in den vorherigen Rehost-Migrationsschritten verwendet wurde. Repository öffnen Rehost-Implementierungs-AssetNutze den managed STACKIT Observability -Stack als Datenquelle.
Architektur-Referenzen:
Nutze das Dashboard, um Infrastruktur-Auslastung, Anwendungszustand, Request-Verhalten und Alert-Historie gemeinsam zu bewerten, bevor die VM-Kapazität geändert wird.

Definiere technische Schwellwerte, bevor du Kapazität änderst.
Halte Schwellwerte workload-spezifisch und validiere sie gegen reale Traffic-Muster.
Für stateful Rehost-Workloads sollten Signale aus der Datenbank im selben Dashboard-Zyklus bewertet werden.
Nutze diese Signale gemeinsam mit VM-Metriken, damit Optimize-Entscheidungen nicht nur auf CPU oder Memory basieren.
Wenn der Rehost-Workload den Datenbank-Layer später auf PostgreSQL Flex umstellt, sollte DB-Rightsizing in denselben Optimize-Loop aufgenommen werden.
Passe die VM-Größe in env.tfvars an:
machine_type = "g3i.2"Apply und Plan-Ausgabe prüfen:
terraform plan -var-file=env.tfvarsterraform apply -var-file=env.tfvarsDanach validieren:
systemctl status, synthetische Checks)Passe die VM-Größe in env.tfvars an:
machine_type = "g3i.4"Apply durchführen und mit denselben Post-Change-Checks validieren.
Wenn sich SLOs nach dem Rightsizing verschlechtern, rolle zurück, indem du den vorherigen machine_type wiederherstellst und IaC erneut ausführst.
Behandle Rollback als regulären Runbook-Schritt und nicht nur als Notfallweg.
terraform plan.In Rehost-Szenarien sind CPU und Memory nur eine Seite des Rightsizing. Auch Storage-Performance kann zum Engpass werden.
Eine Block-Storage-Performance-Klasse definiert die maximalen IOPS und den maximalen Durchsatz für das gesamte Volume. Zugriffe von Anwendung, Datenbank, Betriebssystem und Backup teilen dieses Performance-Budget. Wählen Sie die Klasse vor dem Erstellen des Volumes anhand gemessener Lastspitzen, Latenzanforderungen, Backup-Aktivität und expliziter Wachstumsreserve.
Die folgende Tabelle listet die derzeit verfügbaren Leistungs-Klassen für die Region EU01 auf:
| Leistungs-Klasse | Name | Max. IOPS | Max. Durchsatz (MB/s) |
|---|---|---|---|
| Leistungs-Klasse 0 | storage_premium_perf0 | 120 | 25 |
| Leistungs-Klasse 1 | storage_premium_perf1 | 500 | 50 |
| Leistungs-Klasse 2 | storage_premium_perf2 | 1000 | 100 |
| Leistungs-Klasse 4 | storage_premium_perf4 | 2000 | 150 |
| Leistungs-Klasse 6 | storage_premium_perf6 | 5000 | 200 |
| Leistungs-Klasse 8 | storage_premium_perf8 | 10000 | 250 |
| Leistungs-Klasse 10 | storage_premium_perf10 | 15000 | 300 |
| Leistungs-Klasse 12 | storage_premium_perf12 | 20000 | 350 |
| Leistungs-Klasse 13 | storage_premium_perf13 | 20000 | 700 |
| Leistungs-Klasse 14 | storage_premium_perf14 | 25000 | 400 |
| Leistungs-Klasse 15 | storage_premium_perf15 | 25000 | 800 |
| Leistungs-Klasse 16 | storage_premium_perf16 | 30000 | 450 |
| Leistungs-Klasse 17 | storage_premium_perf17 | 30000 | 900 |
| Leistungs-Klasse 18 | storage_premium_perf18 | 35000 | 500 |
| Leistungs-Klasse 19 | storage_premium_perf19 | 35000 | 1000 |
| Leistungs-Klasse 20 | storage_premium_perf20 | 40000 | 550 |
| Leistungs-Klasse 21 | storage_premium_perf21 | 40000 | 1100 |
IOPS – Input/Output Operations per second (Ein-/Ausgabebefehle pro Sekunde)
Durchsatz – Durchsatz in Megabyte pro Sekunde
Somit lassen sich die verwendeten Klassen anhand der Namensgebung im Detail unterscheiden. Beispiel: „Block Storage Premium – Leistungs-Klasse 2“ entspricht SSD-Festplatten mit max. 1000 IOPS und max. 100 Mbyte/s Durchsatz.
Dieser Abschnitt wird mehrmals am Tag automatisch aus der STACKIT-Doku übernommen. Hier lässt er sich nicht ändern. Änderungen gehören in die STACKIT-Doku.
In der Rehost-Baseline teilen sich Betriebssystem, Spring-Boot-Anwendung und PostgreSQL-Daten das Boot Volume. Eine Änderung der Performance-Klasse erfordert daher ein kontrolliertes Ersatzziel:
Verwenden Sie ein separates Data Volume, wenn Storage-Kapazität oder -Performance unabhängig vom VM-Lifecycle weiterentwickelt werden müssen. Erstellen Sie für eine andere Performance-Klasse ein neues Volume im erforderlichen Verfügbarkeitsmodell mit ausreichender Kapazität, stoppen Sie Schreibzugriffe, migrieren und verifizieren Sie die Daten, wechseln Sie Attachment oder Mount und bewahren Sie das Quell-Volume auf, bis Abnahme- und Rollback-Gates passiert sind.
Daten aus Block Storage migrierenBehandeln Sie Storage-Prüfungen als Teil derselben Optimize-Schleife und validieren Sie nach jeder Änderung erneut Latenz, Fehlerverhalten, Recovery und Kostenwirkung.
STACKIT
Der souveräne europäische Cloud-Anbieter hinter dem Framework, mit IaaS und PaaS aus deutschen und österreichischen Rechenzentren und voller Unabhängigkeit.
Dieses Asset führt dieselbe Spring-Boot- und PostgreSQL-Referenzimplementierung fort, die für Provisioning, Migration, Cutover und Stabilisierung verwendet wurde. Es führt kein weiteres Beispiel oder Repository ein. Die vorhandenen Terraform-Variablen, Ansible-Konfiguration, Observability-Instanz und Validierungsworkflows bleiben die technische Baseline für Optimize.
Die Optimize-Erweiterung beantwortet eine praktische Frage: Wie lassen sich Über- oder Unterprovisionierung erkennen und VM- oder Storage-Kapazität anschließend über einen kontrollierten IaC-Workflow ändern?
STACKIT CMF Rehost Spring Boot Repository Arbeiten Sie mit derselben Terraform- und Ansible-Referenzimplementierung weiter, die in den vorherigen Rehost-Migrationsschritten verwendet wurde. Repository öffnen Rehost-Implementierungs-AssetNutze den managed STACKIT Observability -Stack als Datenquelle.
Architektur-Referenzen:
Nutze das Dashboard, um Infrastruktur-Auslastung, Anwendungszustand, Request-Verhalten und Alert-Historie gemeinsam zu bewerten, bevor die VM-Kapazität geändert wird.

Definiere technische Schwellwerte, bevor du Kapazität änderst.
Halte Schwellwerte workload-spezifisch und validiere sie gegen reale Traffic-Muster.
Für stateful Rehost-Workloads sollten Signale aus der Datenbank im selben Dashboard-Zyklus bewertet werden.
Nutze diese Signale gemeinsam mit VM-Metriken, damit Optimize-Entscheidungen nicht nur auf CPU oder Memory basieren.
Wenn der Rehost-Workload den Datenbank-Layer später auf PostgreSQL Flex umstellt, sollte DB-Rightsizing in denselben Optimize-Loop aufgenommen werden.
Passe die VM-Größe in env.tfvars an:
machine_type = "g3i.2"Apply und Plan-Ausgabe prüfen:
terraform plan -var-file=env.tfvarsterraform apply -var-file=env.tfvarsDanach validieren:
systemctl status, synthetische Checks)Passe die VM-Größe in env.tfvars an:
machine_type = "g3i.4"Apply durchführen und mit denselben Post-Change-Checks validieren.
Wenn sich SLOs nach dem Rightsizing verschlechtern, rolle zurück, indem du den vorherigen machine_type wiederherstellst und IaC erneut ausführst.
Behandle Rollback als regulären Runbook-Schritt und nicht nur als Notfallweg.
terraform plan.In Rehost-Szenarien sind CPU und Memory nur eine Seite des Rightsizing. Auch Storage-Performance kann zum Engpass werden.
Eine Block-Storage-Performance-Klasse definiert die maximalen IOPS und den maximalen Durchsatz für das gesamte Volume. Zugriffe von Anwendung, Datenbank, Betriebssystem und Backup teilen dieses Performance-Budget. Wählen Sie die Klasse vor dem Erstellen des Volumes anhand gemessener Lastspitzen, Latenzanforderungen, Backup-Aktivität und expliziter Wachstumsreserve.
Die folgende Tabelle listet die derzeit verfügbaren Leistungs-Klassen für die Region EU01 auf:
| Leistungs-Klasse | Name | Max. IOPS | Max. Durchsatz (MB/s) |
|---|---|---|---|
| Leistungs-Klasse 0 | storage_premium_perf0 | 120 | 25 |
| Leistungs-Klasse 1 | storage_premium_perf1 | 500 | 50 |
| Leistungs-Klasse 2 | storage_premium_perf2 | 1000 | 100 |
| Leistungs-Klasse 4 | storage_premium_perf4 | 2000 | 150 |
| Leistungs-Klasse 6 | storage_premium_perf6 | 5000 | 200 |
| Leistungs-Klasse 8 | storage_premium_perf8 | 10000 | 250 |
| Leistungs-Klasse 10 | storage_premium_perf10 | 15000 | 300 |
| Leistungs-Klasse 12 | storage_premium_perf12 | 20000 | 350 |
| Leistungs-Klasse 13 | storage_premium_perf13 | 20000 | 700 |
| Leistungs-Klasse 14 | storage_premium_perf14 | 25000 | 400 |
| Leistungs-Klasse 15 | storage_premium_perf15 | 25000 | 800 |
| Leistungs-Klasse 16 | storage_premium_perf16 | 30000 | 450 |
| Leistungs-Klasse 17 | storage_premium_perf17 | 30000 | 900 |
| Leistungs-Klasse 18 | storage_premium_perf18 | 35000 | 500 |
| Leistungs-Klasse 19 | storage_premium_perf19 | 35000 | 1000 |
| Leistungs-Klasse 20 | storage_premium_perf20 | 40000 | 550 |
| Leistungs-Klasse 21 | storage_premium_perf21 | 40000 | 1100 |
IOPS – Input/Output Operations per second (Ein-/Ausgabebefehle pro Sekunde)
Durchsatz – Durchsatz in Megabyte pro Sekunde
Somit lassen sich die verwendeten Klassen anhand der Namensgebung im Detail unterscheiden. Beispiel: „Block Storage Premium – Leistungs-Klasse 2“ entspricht SSD-Festplatten mit max. 1000 IOPS und max. 100 Mbyte/s Durchsatz.
Dieser Abschnitt wird mehrmals am Tag automatisch aus der STACKIT-Doku übernommen. Hier lässt er sich nicht ändern. Änderungen gehören in die STACKIT-Doku.
In der Rehost-Baseline teilen sich Betriebssystem, Spring-Boot-Anwendung und PostgreSQL-Daten das Boot Volume. Eine Änderung der Performance-Klasse erfordert daher ein kontrolliertes Ersatzziel:
Verwenden Sie ein separates Data Volume, wenn Storage-Kapazität oder -Performance unabhängig vom VM-Lifecycle weiterentwickelt werden müssen. Erstellen Sie für eine andere Performance-Klasse ein neues Volume im erforderlichen Verfügbarkeitsmodell mit ausreichender Kapazität, stoppen Sie Schreibzugriffe, migrieren und verifizieren Sie die Daten, wechseln Sie Attachment oder Mount und bewahren Sie das Quell-Volume auf, bis Abnahme- und Rollback-Gates passiert sind.
Daten aus Block Storage migrierenBehandeln Sie Storage-Prüfungen als Teil derselben Optimize-Schleife und validieren Sie nach jeder Änderung erneut Latenz, Fehlerverhalten, Recovery und Kostenwirkung.
Das Migration Framework definiert Strategie, Design, Landing Zone, Migration und Betriebsprinzipien für Rehost-Workloads. Dieses Asset wendet diese Prinzipien auf eine konkrete, ausführbare Spring-Boot- und PostgreSQL-Implementierung auf STACKIT an.
Das gepflegte Repository ist die Source of Truth für Terraform, Ansible, Applikationsartefakte, Migrationsskripte, Validierung und Laufzeitkonfiguration. Dieses Asset beschreibt die Nutzung der Implementierung, ohne ihren vollständigen Quellcode zu duplizieren.
STACKIT CMF Rehost Spring Boot Repository Öffnen Sie die ausführbare Terraform- und Ansible-Referenzimplementierung für den Rehost-Pfad von Spring Boot und PostgreSQL. Repository öffnenDieses Beispiel bildet einen Application-Rehost-Pfad für einen Spring-Boot-Workload ab, konkret das Spring-Music-Beispiel. Der Fokus liegt auf der Verlagerung der Laufzeit nach STACKIT:
systemd, ohne das Laufzeitmodell der Anwendung zu ändern.Die validierte Baseline enthält bewusst keinen Application Load Balancer, DNS-Switch, mehrere VMs, Kubernetes, Cloud Foundry oder PostgreSQL Flex. Ergänzen Sie diese nur als separat entworfene und getestete Erweiterungen; sie sind nicht impliziter Bestandteil dieses Rehost-Beispiels.
systemd-Service.Nutzen Sie dieses gemeinsame Flag-Modell in den Terraform-Variablen, um das Verhalten über CMF-Beispiele hinweg konsistent zu halten:
setup_project: Projektkontext erstellen oder verwenden.setup_observability: Observability-Ressourcen aktivieren oder deaktivieren.setup_database: Optionales VM-lokales PostgreSQL aktivieren oder deaktivieren.setup_workload: Workload-Installation auf der VM aktivieren oder deaktivieren.setup_loadgen: Optionale synthetische Lastgenerierung aktivieren oder deaktivieren.setup_dns: Wird vom gemeinsamen Wrapper akzeptiert, ist in dieser Baseline aber nicht unterstützt.Im aktuellen Rehost-Repository werden diese auf bestehende Schalter wie create_project,
enable_observability, enable_local_postgresql und die Flags zur Lastgenerierung abgebildet.
Das folgende Diagramm zeigt das implementierte und getestete Ziel, nicht eine zukünftige High-Availability-Variante.
Verwenden Sie ein isoliertes Linux-Labor mit Git, Terraform, Ansible, ShellCheck, SSH/SCP, curl, jq
und PostgreSQL-Server-/Client-Werkzeugen einschließlich pg_config. Die Sample-Dump-Skripte nutzen
runuser und den lokalen OS-Account postgres und benötigen Root-Rechte in diesem Labor.
Bei aktiviertem Server Backup braucht der Cutover zusätzlich eine authentifizierte STACKIT CLI.
Verwenden Sie für vorhandene gespeicherte Pläne die Terraform-Version, die sie erzeugt hat;
Plandateien sind versionsgebunden.
Beginnen Sie in einem übergeordneten Verzeichnis ohne bereits vorhandenen gleichnamigen Checkout. Dieser Stand enthält die Migrationsworkflows und die deklarative Observability-Verwaltung. Seine JAR ist gegenüber dem in der Replatform-Referenz fixierten Artefakt unverändert:
umask 077 && git clone https://github.com/stackitcloud/stackit-cmf-Rehost-springboot.git && git -C stackit-cmf-Rehost-springboot checkout --detach b9225eb35c64b9ef4761c208fadb9a2356431793 && test -f stackit-cmf-Rehost-springboot/scripts/run_cutover.sh && cd stackit-cmf-Rehost-springboot && printf '%s\n' "Workspace ready. Continue from this Rehost checkout." || { printf '%s\n' "Preparation failed. Resolve the error before continuing." >&2 false }Führen Sie die folgenden Schritte erst nach erfolgreicher Vorbereitung aus diesem Checkout aus. Bewahren Sie vorhandene Checkouts, State und Nachweise, statt sie zu ersetzen. Halten Sie Credentials, Pläne, State, Dumps, Inventory und Nachweise privat und außerhalb der Versionsverwaltung; aktivieren Sie kein Shell-Tracing.
Erstellen Sie die private Variablendatei nur, wenn sie noch nicht existiert:
umask 077test -e env.tfvars || cp env.tfvars.example env.tfvarschmod 600 env.tfvarsBearbeiten Sie die Datei vor dem Plan. Konfigurieren Sie das freigegebene bestehende Projekt oder den
Scope für die Projekterstellung, Service-Account-Key-Pfad, SSH-Schlüsselpaar, verfügbares Image,
Availability Zone, VM-Flavor und Storage. Beschränken Sie SSH- und Applikations-Ingress auf die
Quell-CIDRs, die am Zielpfad tatsächlich ankommen. Verifizieren Sie den SSH-Host-Key über einen
vertrauenswürdigen Kanal, bevor Migrationsskripte die strikte Host-Prüfung verwenden.
Setzen Sie für diese Skripte SSH_KEY und SSH_USER, falls sie von ~/.ssh/id_rsa und ubuntu
abweichen; halten Sie sie konsistent zu private_ssh_key_path und ssh_user in Terraform.
Aktivieren Sie VM-lokales PostgreSQL, Observability und Server Backup für diesen Walkthrough.
Lassen Sie für das erste Runtime-Deployment postgresql_restore_after_copy = false und den
Quelldump-Pfad leer: Provisioning darf die Quelle nicht vor Probe und Cutover-Freigabe importieren.
Übergeben Sie das Datenbankpasswort über den freigegebenen Secret-Mechanismus als
TF_VAR_postgresql_app_password und bewahren Sie es für spätere Pläne sicher auf;
schreiben Sie es nicht in Variablendatei, Shell-History oder Dokumentation.
Bestätigen Sie Berechtigungen, Quota, Kostenfreigabe und das private Terraform-Backend vor der Initialisierung. Dieser Ablauf setzt einen vorbereiteten Ausführungshost voraus und ist keine vollständige Installationsanleitung für das Labor.
Erstellen Sie einen Quelldump im Custom Format und erfassen Sie SHA-256-Prüfsumme, erwartete Datensatzanzahl und einen Workload-spezifischen deterministischen Fingerprint. Das Repository enthält ein reproduzierbares Beispiel mit acht Datensätzen:
./scripts/create_source_dump.sh./scripts/validate_source_dump.shDas Validierungsskript stellt den Dump in einem separaten lokalen PostgreSQL-Cluster wieder her, bevor er in eine Migrationsprobe eingehen darf. Die Skripte erzeugen das mitgelieferte Sample in temporären lokalen Clustern; sie exportieren weder eine laufende Anwendung noch die STACKIT VM. Verwenden Sie ein frisches Artefaktverzeichnis und überschreiben Sie keinen bereits freigegebenen Migrationsdump. Exportieren Sie eine reale Quelle unter dem vereinbarten Write Freeze und erfassen Sie gleichwertige Nachweise für Prüfsumme, Anzahl und Fingerprint.
Konfigurieren Sie ein bestehendes STACKIT Projekt oder die Projekterstellung, beschränken Sie SSH-
und Applikations-Ingress auf freigegebene Quell-CIDRs und übergeben Sie das Datenbankpasswort über
TF_VAR_postgresql_app_password statt über eine Variablendatei. Prüfen Sie vor dem Apply einen
gespeicherten Plan.
terraform init && ./scripts/check.sh && terraform plan -input=false -var-file=env.tfvars -out=tfplanStoppen Sie bei Fehlern in Initialisierung, Checks oder Plan. Prüfen Sie Ressourcenänderungen, Zielprojekt, Ingress, Kosten und den deaktivierten initialen Restore, bevor Sie den gespeicherten Plan ausdrücklich anwenden:
terraform apply tfplanTerraform führt nach dem Provisioning Ansible aus. Ein erfolgreicher Apply belegt den Abschluss dieser Orchestrierung, nicht die Abnahme migrierter Daten. Prüfen Sie die Laufzeit vor der Probe:
./scripts/validate_deployment.shFühren Sie die Probe gegen eine temporäre Datenbank auf der Ziel-VM aus:
./scripts/run_migration_rehearsal.shDie Probe prüft die Quelldaten, stellt den Dump wieder her, vergleicht Datensatzanzahl und Fingerprint
und entfernt die temporäre Datenbank, ohne die produktive springmusic-Datenbank zu verändern.
Hinterlegen Sie die erwarteten Quelldaten in env.tfvars:
enable_local_postgresql = truepostgresql_source_dump_local_path = "artifacts/source-postgresql.dump"postgresql_restore_after_copy = truepostgresql_expected_album_count = 8postgresql_expected_album_fingerprint = "<source-fingerprint>"Führen Sie anschließend das explizite Freigabe-Gate aus:
./scripts/run_cutover.sh --confirmDas Skript verlangt ein vollständig verfügbares Server Backup, das höchstens 24 Stunden alt ist. Es erzeugt einen gespeicherten Terraform-Plan, der ausschließlich die Ansible-Orchestrierungsressource ersetzt, weist andere Infrastrukturänderungen zurück, führt den Restore aus, validiert Daten und Laufzeitverhalten und verlangt abschließend einen Terraform-No-op-Plan. Wiederholungen mit demselben Quelldump-Hash bewahren den ursprünglichen Datenbank-Rollback-Punkt.
Die Validierung prüft Datensatzanzahl und Fingerprint der Quelle, Tabellen-Ownership, einen transaktional zurückgerollten Schreibvorgang als Application Role, Erreichbarkeit der Anwendung, Services und den geschützten Rollback-Dump.
./scripts/validate_migration.sh./scripts/validate_deployment.sh./scripts/verify_rollback.shWenn innerhalb des Rollback-Fensters ein freigegebener Rollback-Trigger eintritt, bewahren Sie die aktuelle Zieldatenbank und stellen den ursprünglichen Dump von vor dem Cutover wieder her:
./scripts/rollback_postgresql.sh --confirmMit enable_server_backup = true aktiviert Terraform STACKIT Server Backup und einen täglichen
Zeitplan für das Boot Volume der VM. Die Standardaufbewahrung beträgt 14 Tage. Der Cutover verlangt
ein vollständig verfügbares Backup, das höchstens 24 Stunden alt ist. Erstellung und Status des
Backups wurden am realen Ziel validiert; ein In-place-Restore mit Server Backup bleibt eine
disruptive Disaster-Recovery-Operation und muss in einer separaten Recovery-Umgebung geprobt werden.
Server Backup ergänzt den PostgreSQL-Dump von vor dem Restore. Es ersetzt weder die Datenbank-Konsistenzprüfungen noch das Application-Rollback-Verfahren.
Folgen Sie Arbeitsumgebung, privater Zielkonfiguration, Quellnachweisen und geprüftem Provisioning
in dieser Reihenfolge. Proben Sie vor dem freigegebenen Cutover und bewahren Sie anschließend die
Abnahmenachweise auf. Die Repository-Skripte rufen ausdrücklich terraform auf; ein Ausführungshost
mit ausschließlich OpenTofu benötigt eine separat geprüfte Anpassung, nicht nur ersetzte Befehle
auf dieser Seite.
Die Implementierung stellt STACKIT Observability bereit und erfasst den Node Exporter. Der Grafana-Provider
verwaltet das enthaltene Dashboard im Ordner SCF Rehost mit der vorhandenen Thanos-Datenquelle.
Er wartet auf die Bereitschaft der Instanz, statt die Dashboard-Erstellung stillschweigend zu überspringen.
Prüfen Sie über grafana_dashboard_url aktuelle VM-, Spring-Boot- und PostgreSQL-Metriken und verlangen
Sie anschließend einen No-op-Plan. Sieben Panels bilden die aktive Basis ab; das Panel für synthetische
Anfragen erscheint nur bei aktiviertem lokalem Lastgenerator. Diese Anfragen bilden nicht den gesamten
Application-Traffic ab. Die Deployment-Validierung prüft außerdem Exporter-Metriken und Service Health
nach dem Apply und nach dem Datenbank-Restore.
Die initialen Grafana-Admin-Zugangsdaten bleiben eine temporäre Authentifizierungsabhängigkeit. Schützen Sie State und gespeicherte Pläne. Benachrichtigungsempfänger, Zuständigkeit für Alarm-Routing, Application-Logs und Distributed Tracing benötigen vor Produktionseinsatz eine separate Konfiguration und Abnahme.
Dieses Beispiel kann in zwei zulässigen Setup-Modi eingesetzt werden.
create_project = false und project_id = "...", sowie die für
diesen Landing-Zone-Scope konfigurierte Service-Account-JSON.create_project = true und geben Sie über parent_container_id einen
bestehenden Folder oder Container an, in dem der Service Account ausreichende Berechtigungen hat.Hinweise zum Landing-Zone-Design finden Sie unter Application Landing Zone.
Nutzen Sie dieses Beispiel als Ausgangspunkt in env.tfvars.
create_project = truetarget_project_name = "cmf-rehost-springboot"target_project_owner_email = "owner@example.com"parent_container_id = "cmf-xxxxxxxx"service_account_key_path = "~/.ssh/cmf-sa.json"public_ssh_key_path = "~/.ssh/id_rsa.pub"private_ssh_key_path = "~/.ssh/id_rsa"availability_zone = "eu01-1"machine_type = "g2i.2"ssh_allowed_cidr = "203.0.113.10/32"app_allowed_cidr = "203.0.113.10/32"enable_local_postgresql = trueenable_observability = trueenable_server_backup = trueansible/files/springboot-app.jarjar_local_path verweist auf dieselbe Datei.jar_local_path.Wenn sich das Artefakt ändert, erkennt Terraform die geänderte Prüfsumme und führt den Ansible-Deployment-Schritt erneut aus.
Jede Probe, jeder Cutover und jedes Rollback schreibt eine evidence.env-Datei unter
artifacts/evidence/<timestamp>-<mode>/. Akzeptieren Sie einen Cutover nur, wenn der Nachweis die
erwartete Prüfsumme, Datensatzanzahl, den Fingerprint, die Ziel-VM, eine erfolgreiche
Laufzeitvalidierung und den abschließenden Terraform-No-op dokumentiert.
./scripts/validate_migration.sh./scripts/validate_deployment.shterraform plan -var-file=env.tfvars -detailed-exitcodeVerwenden Sie denselben freigegebenen Quellpfad, Restore-Schalter, Erwartungswert und Fingerprint
wie beim abgeschlossenen Cutover. Exit-Code 0 bedeutet keine Änderungen, 2 vorgeschlagene
Änderungen und 1 einen Fehler. Ein Plan allein belegt keinen Apply. Der Cutover-Workflow setzt
status=passed und terraform_noop=true erst nach Anwendung seines gespeicherten Plans und
erfolgreicher Daten- und Laufzeitvalidierung.
Die Replatform-Referenz verwendet das fixierte Spring-Music-JAR und den Sample-Datengenerator dieses Repositories weiter. Ihr Sample-Walkthrough benötigt deshalb diesen Checkout und validierte Dump-Artefakte, aber keine neu bereitgestellte Rehost-VM. Erstellen Sie keine zusätzliche VM allein zur Erzeugung des lokalen Samples.
Für eine tatsächliche Migration von der Rehost-VM zu SKE und PostgreSQL Flex müssen Sie den aktuellen VM-Zustand prüfen, Schreibzugriffe der Anwendung einfrieren, die reale PostgreSQL-Datenbank exportieren und diesen Export qualifizieren. Ein historisch erfolgreicher Rehost-Apply belegt weder aktuelle Erreichbarkeit noch die Gleichwertigkeit des lokalen Samples mit den VM-Daten. Quellexport, Abnahme und Source Failback benötigen ein eigenes freigegebenes Verfahren.