Déploiement d'application Java sur VPS : niveau avancé avec CI/CD, Docker et SSL
\n\nDans cet article, nous allons examiner le processus avancé de déploiement d'une application Java sur un VPS (Virtual Private Server). Nous ne nous attarderons pas sur les étapes de base comme l'installation du JDK ou le lancement d'un fichier JAR. Au lieu de cela, nous nous concentrerons sur la configuration d'un pipeline CI/CD, la conteneurisation avec Docker, l'utilisation de Nginx comme proxy inverse, l'obtention automatique de certificats SSL, ainsi que sur le monitoring et la haute disponibilité de l'application.
\n\nOn suppose que vous possédez déjà un VPS avec Ubuntu 22.04 LTS, un nom de domaine de base, et que vous êtes familier avec la ligne de commande Linux. Tous les exemples de code sont écrits en Java 17+ avec Spring Boot, mais les principes s'appliquent à tout framework Java.
\n\n1. Conteneurisation de l'application Java avec Docker
\n\nLa première étape vers un déploiement avancé consiste à empaqueter l'application dans un conteneur Docker. Cela garantit la reproductibilité de l'environnement et simplifie le déploiement.
\n\nCréez un Dockerfile à la racine du projet :
\n\n# Utilisation d'une construction multi-étapes pour réduire la taille de l'image finale\nFROM maven:3.9.6-eclipse-temurin-17 AS builder\nWORKDIR /app\nCOPY pom.xml .\nRUN mvn dependency:go-offline\nCOPY src ./src\nRUN mvn clean package -DskipTests\n\nFROM eclipse-temurin:17-jre-alpine\nWORKDIR /app\nCOPY --from=builder /app/target/*.jar app.jar\nEXPOSE 8080\nENTRYPOINT ["java", "-jar", "app.jar"]\n\nFichier docker-compose.yml pour l'exécution avec une base de données :
\n\nversion: '3.8'\nservices:\n app:\n build: .\n ports:\n - "8080:8080"\n environment:\n - SPRING_DATASOURCE_URL=jdbc:postgresql://db:5432/mydb\n - SPRING_DATASOURCE_USERNAME=user\n - SPRING_DATASOURCE_PASSWORD=pass\n depends_on:\n - db\n restart: unless-stopped\n\n db:\n image: postgres:15-alpine\n environment:\n POSTGRES_DB: mydb\n POSTGRES_USER: user\n POSTGRES_PASSWORD: pass\n volumes:\n - pgdata:/var/lib/postgresql/data\n restart: unless-stopped\n\nvolumes:\n pgdata:\n\nAprès avoir construit l'image avec la commande docker compose build, vous obtiendrez un conteneur prêt à être déployé.
2. Configuration du pipeline CI/CD (GitHub Actions)
\n\nL'automatisation du déploiement est un élément clé du niveau avancé. Nous utilisons GitHub Actions pour construire, tester et envoyer l'image sur le serveur.
\n\nCréez le fichier .github/workflows/deploy.yml :
\n\nname: Deploy Java App to VPS\n\non:\n push:\n branches: [ main ]\n\njobs:\n build-and-deploy:\n runs-on: ubuntu-latest\n steps:\n - uses: actions/checkout@v4\n\n - name: Set up JDK 17\n uses: actions/setup-java@v4\n with:\n java-version: '17'\n distribution: 'temurin'\n\n - name: Build with Maven\n run: mvn clean package\n\n - name: Build Docker image\n run: docker build -t myapp:latest .\n\n - name: Save Docker image to tar\n run: docker save myapp:latest | gzip > myapp.tar.gz\n\n - name: Copy image to VPS via SCP\n uses: appleboy/scp-action@v0.1.7\n with:\n host: ${{ secrets.VPS_HOST }}\n username: ${{ secrets.VPS_USER }}\n key: ${{ secrets.VPS_SSH_KEY }}\n source: "myapp.tar.gz"\n target: "/opt/app/"\n\n - name: Deploy on VPS\n uses: appleboy/ssh-action@v1.0.3\n with:\n host: ${{ secrets.VPS_HOST }}\n username: ${{ secrets.VPS_USER }}\n key: ${{ secrets.VPS_SSH_KEY }}\n script: |\n cd /opt/app\n docker load < myapp.tar.gz\n docker compose down\n docker compose up -d\n rm myapp.tar.gz\n\nN'oubliez pas d'ajouter les secrets VPS_HOST, VPS_USER, VPS_SSH_KEY dans les paramètres