Bereitstellung einer Java-Anwendung auf einem VPS: Fortgeschrittenes Niveau mit CI/CD

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Bereitstellung einer Java-Anwendung auf einem VPS: Fortgeschrittenes Niveau mit CI/CD, Docker und SSL



In diesem Artikel betrachten wir den fortgeschrittenen Prozess der Bereitstellung einer Java-Anwendung auf einem VPS (Virtual Private Server). Wir werden nicht bei grundlegenden Schritten wie der Installation des JDK oder dem Starten einer JAR-Datei stehen bleiben. Stattdessen konzentrieren wir uns auf die Einrichtung einer CI/CD-Pipeline, die Containerisierung mit Docker, die Verwendung von Nginx als Reverse Proxy, den automatischen Bezug von SSL-Zertifikaten sowie auf das Monitoring und die Ausfallsicherheit der Anwendung.



Es wird vorausgesetzt, dass Sie bereits einen VPS mit Ubuntu 22.04 LTS, eine Basis-Domain besitzen und mit der Linux-Kommandozeile vertraut sind. Alle Codebeispiele sind in Java 17+ mit Spring Boot geschrieben, die Prinzipien sind jedoch auf jedes Java-Framework anwendbar.



1. Containerisierung der Java-Anwendung mit Docker



Der erste Schritt zur fortgeschrittenen Bereitstellung ist das Verpacken der Anwendung in einen Docker-Container. Dies gewährleistet die Reproduzierbarkeit der Umgebung und vereinfacht die Bereitstellung.



Erstellen Sie eine Dockerfile im Projektstammverzeichnis:



# Verwendung eines Multi-Stage-Builds zur Reduzierung der endgültigen Image-GrößeFROM maven:3.9.6-eclipse-temurin-17 AS builderWORKDIR /appCOPY pom.xml .RUN mvn dependency:go-offlineCOPY src ./srcRUN mvn clean package -DskipTests

FROM eclipse-temurin:17-jre-alpineWORKDIR /appCOPY --from=builder /app/target/*.jar app.jarEXPOSE 8080ENTRYPOINT ["java", "-jar", "app.jar"]


Datei docker-compose.yml zum Starten mit einer Datenbank:



version: '3.8'services:  app:    build: .    ports:      - "8080:8080"    environment:      - SPRING_DATASOURCE_URL=jdbc:postgresql://db:5432/mydb      - SPRING_DATASOURCE_USERNAME=user      - SPRING_DATASOURCE_PASSWORD=pass    depends_on:      - db    restart: unless-stopped

db: image: postgres:15-alpine environment: POSTGRES_DB: mydb POSTGRES_USER: user POSTGRES_PASSWORD: pass volumes: - pgdata:/var/lib/postgresql/data restart: unless-stopped

volumes: pgdata:


Nach dem Erstellen des Images mit dem Befehl docker compose build erhalten Sie einen bereitstellungsbereiten Container.



2. Einrichtung der CI/CD-Pipeline (GitHub Actions)



Die Automatisierung der Bereitstellung ist ein Schlüsselelement der fortgeschrittenen Stufe. Wir verwenden GitHub Actions zum Bauen, Testen und Senden des Images an den Server.



Erstellen Sie die Datei .github/workflows/deploy.yml:



name: Deploy Java App to VPS

on: push: branches: [ main ]

jobs: build-and-deploy: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4

- name: Set up JDK 17 uses: actions/setup-java@v4 with: java-version: '17' distribution: 'temurin'

- name: Build with Maven run: mvn clean package

- name: Build Docker image run: docker build -t myapp:latest .

- name: Save Docker image to tar run: docker save myapp:latest | gzip > myapp.tar.gz

- name: Copy image to VPS via SCP uses: appleboy/scp-action@v0.1.7 with: host: ${{ secrets.VPS_HOST }} username: ${{ secrets.VPS_USER }} key: ${{ secrets.VPS_SSH_KEY }} source: "myapp.tar.gz" target: "/opt/app/"

- name: Deploy on VPS uses: appleboy/ssh-action@v1.0.3 with: host: ${{ secrets.VPS_HOST }} username: ${{ secrets.VPS_USER }} key: ${{ secrets.VPS_SSH_KEY }} script: | cd /opt/app docker load < myapp.tar.gz docker compose down docker compose up -d rm myapp.tar.gz


Vergessen Sie nicht, die Geheimnisse VPS_HOST, VPS_USER, VPS_SSH_KEY in den Einstellungen hinzuzufügen

Blogs

Buchempfehlungen