DevOps Projekt 1: Automatisiertes lokales Multi-VM Deployment

Aufbau einer realistischen Multi-Tier Java-Anwendung auf mehreren VMs (NginxTomcatMariaDB / Memcached / RabbitMQ) und anschließende vollständige Automatisierung des Setups mit Vagrant + Shell Provisioning.

Vagrant VirtualBox Shell (Bash) Nginx Tomcat 9 Java 17 Maven MariaDB Memcached RabbitMQ

1. Projektziel

Ziel dieses Projekts war es, eine komplette Anwendung inkl. Backend-Services wie in einer professionellen Umgebung aufzusetzen – zuerst manuell (für Verständnis & Troubleshooting), danach vollautomatisch (reproduzierbar, konsistent, schnell).

Wichtig:
Dieses Projekt zeigt bewusst die Entwicklung von „Manual Ops“ zu „Infrastructure Automation“ – inklusive realer Debugging-Fälle.

2. Systemarchitektur

Die Architektur folgt einem klassischen Pattern: Reverse Proxy vorne, Application Server in der Mitte, Data Services im Backend.

Warum Multi-VM? Saubere Trennung der Verantwortlichkeiten, klare Abhängigkeiten und realistische Produktions-Architektur.

3. Setup manuell (Troubleshooting & Verständnis)

Im ersten Schritt habe ich jede Komponente manuell installiert, um Abhängigkeiten, Ports und Logs zu verstehen:

Real-world Debugging:
Beim initialen Setup schlug das Deployment auf Tomcat 10 fehl (Jakarta vs. javax).
Logs zeigten: NoClassDefFoundError: javax/servlet/ServletContextListener
Fix: Wechsel auf Tomcat 9 (kompatibel mit javax.servlet).

4. Automatisierung (Vagrant + Shell Provisioning)

Nach erfolgreichem manuellen Aufbau wurde das Setup in Provisioning-Skripte übertragen. Damit ist das gesamte System reproduzierbar: vagrant up erstellt und konfiguriert alles automatisch.

Beispiel: Projektstruktur

Diese Struktur entspricht meinem aktuellen Repository (Setup + Automation im selben Projekt).

PROFILE/
├── src/                      # Application source code (Java / Spring)
├── target/                   # Maven Build Output (WAR nach mvn package)
├── ansible/                  # (optional) späterer Ausbau / Experimente
└── vagrant/
    └── Automated_provisioning/
        ├── Vagrantfile               # Orchestriert alle VMs + Provisioning
        ├── application.properties    # App-Config: DB/Cache/Queue Hosts & Ports
        ├── backend.sh                # Build/Deploy Schritte (Repo, Maven, WAR)
        ├── mysql.sh                  # Datenbank Setup (MariaDB/MySQL)
        ├── memcache.sh               # Memcached Setup
        ├── rabbitmq.sh               # RabbitMQ Setup
        ├── nginx.sh                  # Nginx Reverse Proxy Setup
        ├── tomcat.sh                 # Tomcat Setup (Linux VM)
        └── tomcat_ubuntu.sh          # Tomcat Setup (Ubuntu Variante, falls genutzt)

Der Vagrantfile erstellt die VMs (db01/mc01/rmq01/app01/web01) und ruft die jeweiligen Provisioning-Skripte auf.

Jedes Script installiert und konfiguriert genau einen Service (inkl. Ports/Firewall), sodass am Ende vagrant up ein vollständiges, lauffähiges System liefert.

5. Validierung

Nach dem automatisierten Provisioning wird das System mit technischen Checks validiert. Diese Prüfungen entsprechen typischen DevOps-Health-Checks in realen Umgebungen.

Service-Status & Ports

Überprüfung, ob alle relevanten Services laufen und auf den erwarteten Ports erreichbar sind.

# Service status (auf den jeweiligen VMs)
systemctl status nginx
systemctl status tomcat
systemctl status mariadb
systemctl status memcached
systemctl status rabbitmq-server

Provisioning – One-Command Setup

Sichtbarer Nachweis des automatisierten Setups mit vagrant up.

Vagrant up – Automatisiertes Multi-VM Provisioning
Während des Provisionings erstellt Vagrant automatisch alle VMs (db01, mc01, rmq01, app01, web01) und führt die jeweiligen Shell-Provisioning-Skripte aus.

End-to-End Test (HTTP Response)

Technischer Nachweis, dass die Anwendung über den Reverse Proxy erreichbar ist.

curl Test – HTTP 200 OK über Nginx
curl -I http://192.168.56.11 liefert HTTP 200 OK. Die Anfrage wird über Nginx an Tomcat weitergeleitet, inklusive Session-Handling.

Wichtig:
Dieses Projekt zeigt nicht nur Automatisierung, sondern auch systematisches Validieren. Tests mit curl und Service-Status-Prüfungen sind typische Werkzeuge in CI/CD-Pipelines und Produktions-Health-Checks.

6. Warum diese technischen Entscheidungen?

7. Lernziele & DevOps-Kompetenzen

8. Nächster Schritt: AWS Migration

Das lokale Setup war entscheidend, um die Anwendung vollständig zu verstehen, zu stabilisieren und zu automatisieren, bevor sie risikofrei nach Cloud migriert wurde. Im nächsten Schritt wird die bestehende Java-Anwendung ohne Code-Änderungen nach AWS migriert (Lift & Shift), inklusive EC2, Load Balancer, Security Groups, S3 und IAM.

Zur AWS-Migration Projekt