Capítulo 4: Deploy em Cloud
Introdução
Sua aplicação está pronta, Docker configurado, CI/CD em funcionamento. É hora de colocá-la online! Este capítulo cobre as principais opções de deploy em cloud.
🎯 Objetivos do Capítulo
Ao final deste capítulo, você saberá:
- ✅ Fazer deploy no Railway
- ✅ Fazer deploy no Heroku
- ✅ Entender as opções AWS
- ✅ Configurar um banco de dados gerenciado
- ✅ Escolher a plataforma certa
1. Comparação de Plataformas
| Plataforma | Dificuldade | Custo | Ideal para |
|---|---|---|---|
| Railway | ⭐ Fácil | Gratuito → $5/mês | Projetos pessoais, startups |
| Heroku | ⭐ Fácil | $7/mês | Apps simples |
| Render | ⭐ Fácil | Gratuito → $7/mês | Alternativa ao Heroku |
| AWS ECS | ⭐⭐⭐ Complexo | Variável | Enterprise |
| Kubernetes | ⭐⭐⭐⭐ Avançado | Variável | Microsserviços |
2. Railway (Recomendado para Iniciantes)
Por que Railway?
- ✅ Interface simples
- ✅ Deploy via GitHub
- ✅ PostgreSQL integrado
- ✅ Gratuito para começar
- ✅ Suporta Docker
Deploy
Opção 1: Via GitHub
- Acesse railway.app
- "New Project" → "Deploy from GitHub repo"
- Selecione seu repositório
- O Railway detecta automaticamente o Spring Boot
Opção 2: Com Docker
# Instalar Railway CLI
npm i -g @railway/cli
# Login
railway login
# Criar um projeto
railway init
# Fazer deploy
railway up
Configuração
# Variáveis de ambiente (no Railway Dashboard)
SPRING_PROFILES_ACTIVE=prod
DATABASE_URL=${{Postgres.DATABASE_URL}}
Adicionar PostgreSQL
- No projeto Railway: "New" → "Database" → "PostgreSQL"
- As variáveis são injetadas automaticamente
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
Preparação
Procfile (na raiz):
web: java -Dserver.port=$PORT -jar target/*.jar
system.properties:
java.runtime.version=17
Deploy
# Instalar Heroku CLI
# https://devcenter.heroku.com/articles/heroku-cli
# Login
heroku login
# Criar o app
heroku create my-spring-app
# Adicionar PostgreSQL
heroku addons:create heroku-postgresql:mini
# Fazer deploy
git push heroku main
# Ver logs
heroku logs --tail
Variáveis de Ambiente
heroku config:set SPRING_PROFILES_ACTIVE=prod
heroku config:set JWT_SECRET=your-secret-key
# Ver todas as variáveis
heroku config
Com Docker
# Login no registry do Heroku
heroku container:login
# Build e push
heroku container:push web
# Deploy
heroku container:release web
4. Render
Deploy
- Acesse render.com
- "New" → "Web Service"
- Conecte o GitHub
- Configure:
- 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 (Opções)
Elastic Beanstalk (Simples)
# Instalar EB CLI
pip install awsebcli
# Inicializar
eb init
# Criar o ambiente
eb create production
# Fazer deploy
eb deploy
ECS com Fargate (Docker)
# Criar um cluster
aws ecs create-cluster --cluster-name my-cluster
# Criar uma task definition (JSON)
aws ecs register-task-definition --cli-input-json file://task-definition.json
# Criar um serviço
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. Banco de Dados Gerenciado
Railway PostgreSQL
# Configurado automaticamente
spring.datasource.url=${DATABASE_URL}
Heroku Postgres
# Heroku fornece DATABASE_URL automaticamente
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
Algumas plataformas fornecem uma URL no formato:
postgres://user:password@host:5432/dbname
Configuração Spring para fazer o parser:
@Configuration
public class DatabaseConfig {
@Bean
@Profile("prod")
public DataSource dataSource() {
String databaseUrl = System.getenv("DATABASE_URL");
if (databaseUrl != null && databaseUrl.startsWith("postgres://")) {
// Fazer o parser do formato 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 de Deploy
Antes do Deploy
□ Testes passam localmente
□ Perfil de produção configurado
□ Segredos externalizados
□ Dockerfile testado
□ Health check configurado
□ Logs configurados
Variáveis de Ambiente
# Essenciais
SPRING_PROFILES_ACTIVE=prod
DATABASE_URL=...
JWT_SECRET=...
# Opcionais
SERVER_PORT=8080
JAVA_OPTS="-Xmx512m"
Pós-Deploy
□ Aplicação acessível
□ Health check OK
□ Logs visíveis
□ Banco de dados conectado
□ Monitoramento em funcionamento
8. Monitoramento em Produção
Actuator
management.endpoints.web.exposure.include=health,info,prometheus
management.endpoint.health.show-details=when_authorized
Logging Cloud
# Logs em JSON para cloud
logging.pattern.console={"timestamp":"%d","level":"%p","logger":"%c","message":"%m"}%n
Serviços de Monitoramento
- Railway: Métricas integradas
- Heroku: Heroku Metrics
- AWS: CloudWatch
- Externo: Datadog, New Relic
9. Resumo
Recomendações por Caso de Uso
Projeto pessoal / POC:
→ Railway (gratuito, simples)
Startup / MVP:
→ Railway ou Render ($5-20/mês)
PME / Produção:
→ Heroku ou AWS Elastic Beanstalk
Enterprise / Escala:
→ AWS ECS / Kubernetes
Deploy Express (Railway)
# 1. Ter um Dockerfile
# 2. Fazer push no GitHub
# 3. No railway.app:
# - New Project → GitHub
# - Add PostgreSQL
# - Configurar variáveis
# 4. Pronto! 🚀
🎯 Próximo Passo
Hora da prática! Vamos dockerizar e fazer o deploy de uma aplicação.
➡️ TP12.1: Dockerização Completa