Java-Anwendung auf einem VPS bereitstellen: 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 uns nicht mit grundlegenden Schritten wie der Installation des JDK oder dem Ausführen einer JAR-Datei aufhalten. Stattdessen konzentrieren wir uns auf die Einrichtung einer CI/CD-Pipeline, die Containerisierung mit Docker, die Verwendung von Nginx als Reverse-Proxy, das automatische Abrufen von SSL-Zertifikaten sowie die Überwachung und Fehlertoleranz der Anwendung.
Es wird vorausgesetzt, dass Sie bereits einen VPS mit Ubuntu 22.04 LTS, eine Basisdomäne besitzen und mit der Linux-Kommandozeile vertraut sind. Alle Codebeispiele sind in Java 17+ mit Spring Boot geschrieben, aber die Prinzipien gelten für jedes Java-Framework.
1. Containerisierung einer Java-Anwendung mit Docker
Der erste Schritt zur fortgeschrittenen Bereitstellung ist das Verpacken der Anwendung in einen Docker-Container. Dies gewährleistet Reproduzierbarkeit der Umgebung und vereinfacht die Bereitstellung.
Erstellen Sie ein Dockerfile im Projektstammverzeichnis:
# Use multi-stage build to reduce the size of the final imageFROM 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"]docker-compose.yml-Datei für den Betrieb 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 haben Sie einen containerbereit zur Bereitstellung.
2. Einrichten einer CI/CD-Pipeline (GitHub Actions)
Die Automatisierung der Bereitstellung ist ein Schlüsselelement der fortgeschrittenen Stufe. Wir verwenden GitHub Actions, um das Image zu erstellen, zu testen und an den Server zu senden.
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.gzVergessen Sie nicht, die Secrets VPS_HOST, VPS_USER, VPS_SSH_KEY in den Einstellungen hinzuzufügen