Déploiement Continu - 0x485254/brief-26 GitHub Wiki

🚀 Déploiement Continu - serveur Web auto hébergé

[Raspberry Pi 5 - Linux Debian ]

Ce document explique le fonctionnement du déploiement continu mis en place pour le projet EasyGroup Interpromo, en utilisant :

  • GitHub Actions pour automatiser les tâches côté CI/CD
  • Tailscale pour établir un tunnel VPN sécurisé vers le Raspberry Pi
  • Docker Compose pour exécuter les services backend et base de données

🛠️ Architecture et outils utilisés

Élément Rôle
GitHub Héberge le code et déclenche les actions de déploiement
GitHub Actions Système d’automatisation qui exécute des actions (workflows)
Tailscale Crée un VPN privé pour accéder au Raspberry Pi depuis GitHub
Docker Compose Déploie et orchestre les services (backend, base de données)
Raspberry Pi Serveur hébergeant l’application

🔐 Accès sécurisé avec Tailscale

Pourquoi utiliser Tailscale ?

GitHub Actions ne peut pas accéder directement à une machine derrière une box (comme un Raspberry Pi chez soi).
Tailscale permet de créer un réseau privé sécurisé entre GitHub Actions et le Raspberry Pi, sans configurer le NAT, le pare-feu ou exposer des ports.

Étapes pour Tailscale :

  1. Installer Tailscale sur le Raspberry Pi :
    curl -fsSL https://tailscale.com/install.sh | sh
    sudo tailscale up
    
  2. Le Pi rejoint le réseau Tailscale (ex: pi@raspberrypi devient accessible via 100.x.x.x)
  3. On autorise GitHub Actions à s’y connecter via une clé privée SSH.
  4. Le Pi n’a pas besoin d’IP publique !

📁 Organisation du dépôt

.
├── .github/workflows/
│   └── deploy-rasp.yml       # Fichier GitHub Actions pour le déploiement automatique
├── docker-compose.rasp.yml  # Configuration Docker utilisée par le Raspberry Pi
├── Dockerfile                # Image Docker de l'application backend
└── ...                      # Code source du projet

🧪 Comportement attendu

Chaque fois qu'on pousse du code sur la branche définit, GitHub :

  1. Clone le code
  2. Se connecte à notre serveur web (Raspberry Pi) via SSH (grâce à Tailscale)
  3. Envoie les fichiers mis à jour
  4. Relance l’application en utilisant docker compose

⚙️ GitHub Actions - .github/workflows/deploy-rasp.yml

📌 Déclencheur :

on:
  push:
    branches:
      - deploy-rasp

👉 Chaque git push sur la branche deploy-rasp déclenche automatiquement le workflow.


🔨 Étapes principales du job production :

jobs:
  production:
    runs-on: ubuntu-latest
  1. Checkout du code
- name: Checkout code
  uses: actions/checkout@v3
  1. Configuration de Java 17 pour Maven
- name: Setup JDK
  uses: actions/setup-java@v3
  with:
    distribution: 'temurin'
    java-version: '17'
  1. Build avec tests
- name: Build backend (tests inclus)
  run: mvn --batch-mode --quiet install -Dspring.profiles.active=test -DskipTests=false

✅ Cela compile et exécute les tests, en mode silencieux, pour s’assurer que le backend est fonctionnel avant déploiement.

  1. Connexion VPN sécurisée avec Tailscale
- name: Setup Tailscale (OAuth)
  uses: tailscale/github-action@v3
  with:
    oauth-client-id: ${{ secrets.TS_OAUTH_CLIENT_ID }}
    oauth-secret: ${{ secrets.TS_OAUTH_SECRET }}
    tags: tag:ci

🔐 Utilise OAuth pour joindre le réseau Tailscale, ce qui permet de se connecter au Raspberry Pi sans exposer de port public.

  1. Vérification de la connexion SSH
- name: Test SSH connection
  run: ssh -o StrictHostKeyChecking=no [email protected] "echo '✅ SSH OK'"
  1. Déploiement distant
- name: Deploy to production via Tailscale SSH
  run: |
    ssh -o StrictHostKeyChecking=no [email protected] "
      cd brief-26 &&
      git pull origin deploy-rasp &&
      docker compose -f docker-compose.rasp.yml --env-file .env --project-name easygroup-inter-prod up --build -d
    "

🎯 Cette commande :

  • Se connecte au Pi via SSH (via Tailscale)
  • Fait un git pull
  • Reconstruit les conteneurs avec Docker Compose
  • Lance le tout en mode détaché

🧱 Fichier docker-compose.rasp.yml

Définit deux services Docker :

1. Service app (Spring Boot)

  app:
    build: .
    container_name: easygroup-inter-app
    ports:
      - "${APP_PORT:-8080}:8080"
    environment:
      - SPRING_PROFILES_ACTIVE=prod
      - DB_HOST=db
      - DB_PORT=5432
      - DB_NAME=easygroup
      - DB_USERNAME=postgres
      - DB_PASSWORD=postgres
      - CORS_ENABLED=true
      - CORS_URLS=${{CORS_URLS:-http://localhost:5173, https://brief-react-v3-groupshuffle.vercel.app}}
    restart: unless-stopped
    depends_on:
      - db
    networks:
      - spring-network

✅ Le backend est construit localement, expose le port 8080 et accède à la base db.

2. Service db (PostgreSQL)

  db:
    image: postgres:14-alpine
    container_name: easygroup-db
    ports:
      - "5432:5432"
    environment:
      - POSTGRES_USER=postgres
      - POSTGRES_PASSWORD=postgres
      - POSTGRES_DB=easygroup
    volumes:
      - postgres_data:/var/lib/postgresql/data
    networks:
      - spring-network

📦 La base de données est persistée via un volume Docker postgres_data.


🌐 Réseau Docker

networks:
  spring-network:

volumes:
  postgres_data:

Tous les services partagent un réseau privé Docker pour communiquer entre eux.


🔐 Secrets nécessaires sur GitHub

Secret Utilité
TS_OAUTH_CLIENT_ID Identifiant OAuth pour Tailscale
TS_OAUTH_SECRET Secret OAuth pour Tailscale
(clé SSH privée si usage) Permet la connexion SSH depuis Actions

📝 Résumé final

En combinant :

  • GitHub Actions (déclencheur)
  • Tailscale (connexion VPN privée)
  • Docker Compose (déploiement reproductible)

👉 on obtient un déploiement continu simple, sécurisé, et efficace sur un serveur web auto-hébergé, depuis un dépôt GitHub en ligne.