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 :
- Installer Tailscale sur le Raspberry Pi :
curl -fsSL https://tailscale.com/install.sh | sh sudo tailscale up
- Le Pi rejoint le réseau Tailscale (ex:
pi@raspberrypi
devient accessible via100.x.x.x
) - On autorise GitHub Actions à s’y connecter via une clé privée SSH.
- 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 :
- Clone le code
- Se connecte à notre serveur web (Raspberry Pi) via SSH (grâce à Tailscale)
- Envoie les fichiers mis à jour
- Relance l’application en utilisant
docker compose
.github/workflows/deploy-rasp.yml
⚙️ GitHub Actions - 📌 Déclencheur :
on:
push:
branches:
- deploy-rasp
👉 Chaque git push
sur la branche deploy-rasp
déclenche automatiquement le workflow.
production
:
🔨 Étapes principales du job jobs:
production:
runs-on: ubuntu-latest
- Checkout du code
- name: Checkout code
uses: actions/checkout@v3
- Configuration de Java 17 pour Maven
- name: Setup JDK
uses: actions/setup-java@v3
with:
distribution: 'temurin'
java-version: '17'
- 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.
- 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.
- Vérification de la connexion SSH
- name: Test SSH connection
run: ssh -o StrictHostKeyChecking=no [email protected] "echo '✅ SSH OK'"
- 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é
docker-compose.rasp.yml
🧱 Fichier Définit deux services Docker :
app
(Spring Boot)
1. Service 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
.
db
(PostgreSQL)
2. Service 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.