Aller au contenu principal

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:

  1. ✅ Déployer sur Railway
  2. ✅ Déployer sur Heroku
  3. ✅ Comprendre les options AWS
  4. ✅ Configurer une base de données managée
  5. ✅ Choisir la bonne plateforme

1. Comparaison des Plateformes​

PlateformeDifficultéCoûtIdéal pour
Railway⭐ FacileGratuit → $5/moisProjets perso, startups
Heroku⭐ Facile$7/moisApps simples
Render⭐ FacileGratuit → $7/moisAlternative Heroku
AWS ECS⭐⭐⭐ ComplexeVariableEnterprise
Kubernetes⭐⭐⭐⭐ AvancéVariableMicroservices

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

  1. Aller sur railway.app
  2. "New Project" → "Deploy from GitHub repo"
  3. Sélectionner votre repository
  4. 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​

  1. Dans le projet Railway: "New" → "Database" → "PostgreSQL"
  2. 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​

  1. Aller sur render.com
  2. "New" → "Web Service"
  3. Connecter GitHub
  4. Configurer:
    • Build Command: mvn clean package -DskipTests
    • Start Command: java -jar target/*.jar

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


⬅️ Retour au Module 12