Chapitre 4: Déploiement Cloud
Introduction
Votre application est prête, Docker configuré, CI/CD en place. Il est temps de la mettre en ligne! Ce chapitre couvre les principales options de déploiement cloud.
🎯 Objectifs du Chapitre
À la fin de ce chapitre, vous saurez:
- ✅ Déployer sur Railway
- ✅ Déployer sur Heroku
- ✅ Comprendre les options AWS
- ✅ Configurer une base de données managée
- ✅ Choisir la bonne plateforme
1. Comparaison des Plateformes
| Plateforme | Difficulté | Coût | Idéal pour |
|---|---|---|---|
| Railway | ⭐ Facile | Gratuit → $5/mois | Projets perso, startups |
| Heroku | ⭐ Facile | $7/mois | Apps simples |
| Render | ⭐ Facile | Gratuit → $7/mois | Alternative Heroku |
| AWS ECS | ⭐⭐⭐ Complexe | Variable | Enterprise |
| Kubernetes | ⭐⭐⭐⭐ Avancé | Variable | Microservices |
2. Railway (Recommandé pour Débuter)
Pourquoi Railway?
- ✅ Interface simple
- ✅ Déploiement depuis GitHub
- ✅ PostgreSQL intégré
- ✅ Gratuit pour commencer
- ✅ Supporte Docker
Déploiement
Option 1: Depuis GitHub
- Aller sur railway.app
- "New Project" → "Deploy from GitHub repo"
- Sélectionner votre repository
- Railway détecte automatiquement Spring Boot
Option 2: Avec Docker
# Installer Railway CLI
npm i -g @railway/cli
# Login
railway login
# Créer un projet
railway init
# Déployer
railway up
Configuration
# Variables d'environnement (dans Railway Dashboard)
SPRING_PROFILES_ACTIVE=prod
DATABASE_URL=${{Postgres.DATABASE_URL}}
Ajouter PostgreSQL
- Dans le projet Railway: "New" → "Database" → "PostgreSQL"
- Les variables sont automatiquement injectées
railway.json
{
"$schema": "https://railway.app/railway.schema.json",
"build": {
"builder": "DOCKERFILE",
"dockerfilePath": "Dockerfile"
},
"deploy": {
"startCommand": "java -jar app.jar",
"healthcheckPath": "/actuator/health",
"restartPolicyType": "ON_FAILURE"
}
}
3. Heroku
Préparation
Procfile (à la racine):
web: java -Dserver.port=$PORT -jar target/*.jar
system.properties:
java.runtime.version=17
Déploiement
# Installer Heroku CLI
# https://devcenter.heroku.com/articles/heroku-cli
# Login
heroku login
# Créer l'app
heroku create my-spring-app
# Ajouter PostgreSQL
heroku addons:create heroku-postgresql:mini
# Déployer
git push heroku main
# Voir les logs
heroku logs --tail
Variables d'Environnement
heroku config:set SPRING_PROFILES_ACTIVE=prod
heroku config:set JWT_SECRET=your-secret-key
# Voir toutes les variables
heroku config
Avec Docker
# Login au registry Heroku
heroku container:login
# Build et push
heroku container:push web
# Deployer
heroku container:release web
4. Render
Déploiement
- Aller sur render.com
- "New" → "Web Service"
- Connecter GitHub
- Configurer:
- Build Command:
mvn clean package -DskipTests - Start Command:
java -jar target/*.jar
- Build Command:
render.yaml
services:
- type: web
name: my-spring-app
env: docker
dockerfilePath: ./Dockerfile
envVars:
- key: SPRING_PROFILES_ACTIVE
value: prod
- key: DATABASE_URL
fromDatabase:
name: mydb
property: connectionString
databases:
- name: mydb
plan: free
5. AWS (Options)
Elastic Beanstalk (Simple)
# Installer EB CLI
pip install awsebcli
# Initialiser
eb init
# Créer l'environnement
eb create production
# Déployer
eb deploy
ECS avec Fargate (Docker)
# Créer un cluster
aws ecs create-cluster --cluster-name my-cluster
# Créer une task definition (JSON)
aws ecs register-task-definition --cli-input-json file://task-definition.json
# Créer un service
aws ecs create-service \
--cluster my-cluster \
--service-name my-service \
--task-definition my-task \
--desired-count 2
task-definition.json
{
"family": "my-spring-app",
"containerDefinitions": [
{
"name": "app",
"image": "myuser/myapp:latest",
"portMappings": [
{
"containerPort": 8080,
"hostPort": 8080
}
],
"environment": [
{
"name": "SPRING_PROFILES_ACTIVE",
"value": "prod"
}
],
"logConfiguration": {
"logDriver": "awslogs",
"options": {
"awslogs-group": "/ecs/my-app",
"awslogs-region": "us-east-1"
}
}
}
],
"requiresCompatibilities": ["FARGATE"],
"cpu": "256",
"memory": "512"
}
6. Base de Données Managée
Railway PostgreSQL
# Automatiquement configuré
spring.datasource.url=${DATABASE_URL}
Heroku Postgres
# Heroku fournit DATABASE_URL automatiquement
spring.datasource.url=${DATABASE_URL}
AWS RDS
spring.datasource.url=jdbc:postgresql://mydb.xxx.us-east-1.rds.amazonaws.com:5432/mydb
spring.datasource.username=${DB_USERNAME}
spring.datasource.password=${DB_PASSWORD}
Parser DATABASE_URL
Certaines plateformes fournissent une URL au format:
postgres://user:password@host:5432/dbname
Configuration Spring pour parser:
@Configuration
public class DatabaseConfig {
@Bean
@Profile("prod")
public DataSource dataSource() {
String databaseUrl = System.getenv("DATABASE_URL");
if (databaseUrl != null && databaseUrl.startsWith("postgres://")) {
// Parser le format Heroku/Railway
URI uri = URI.create(databaseUrl);
String username = uri.getUserInfo().split(":")[0];
String password = uri.getUserInfo().split(":")[1];
String jdbcUrl = "jdbc:postgresql://" + uri.getHost() + ":" + uri.getPort() + uri.getPath();
HikariDataSource ds = new HikariDataSource();
ds.setJdbcUrl(jdbcUrl);
ds.setUsername(username);
ds.setPassword(password);
return ds;
}
// Fallback
return DataSourceBuilder.create().build();
}
}
7. Checklist Déploiement
Avant le Déploiement
□ Tests passent localement
□ Profil production configuré
□ Secrets externalisés
□ Dockerfile testé
□ Health check configuré
□ Logs configurés
Variables d'Environnement
# Essentielles
SPRING_PROFILES_ACTIVE=prod
DATABASE_URL=...
JWT_SECRET=...
# Optionnelles
SERVER_PORT=8080
JAVA_OPTS="-Xmx512m"
Post-Déploiement
□ Application accessible
□ Health check OK
□ Logs visibles
□ Base de données connectée
□ Monitoring en place
8. Monitoring en Production
Actuator
management.endpoints.web.exposure.include=health,info,prometheus
management.endpoint.health.show-details=when_authorized
Logging Cloud
# Logs JSON pour cloud
logging.pattern.console={"timestamp":"%d","level":"%p","logger":"%c","message":"%m"}%n
Services de Monitoring
- Railway: Metrics intégrées
- Heroku: Heroku Metrics
- AWS: CloudWatch
- Externe: Datadog, New Relic
9. Résumé
Recommandations par Cas d'Usage
Projet personnel / POC:
→ Railway (gratuit, simple)
Startup / MVP:
→ Railway ou Render ($5-20/mois)
PME / Production:
→ Heroku ou AWS Elastic Beanstalk
Enterprise / Scale:
→ AWS ECS / Kubernetes
Déploiement Express (Railway)
# 1. Avoir un Dockerfile
# 2. Push sur GitHub
# 3. Sur railway.app:
# - New Project → GitHub
# - Add PostgreSQL
# - Configure variables
# 4. Done! 🚀
🎯 Prochaine Étape
Place à la pratique! Dockerisons et déployons une application.
➡️ TP12.1: Dockerisation Complète