Pular para o conteúdo principal

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á:

  1. ✅ Fazer deploy no Railway
  2. ✅ Fazer deploy no Heroku
  3. ✅ Entender as opções AWS
  4. ✅ Configurar um banco de dados gerenciado
  5. ✅ Escolher a plataforma certa

1. Comparação de Plataformas​

PlataformaDificuldadeCustoIdeal para
Railway⭐ FácilGratuito → $5/mêsProjetos pessoais, startups
Heroku⭐ Fácil$7/mêsApps simples
Render⭐ FácilGratuito → $7/mêsAlternativa ao Heroku
AWS ECS⭐⭐⭐ ComplexoVariávelEnterprise
Kubernetes⭐⭐⭐⭐ AvançadoVariávelMicrosserviç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

  1. Acesse railway.app
  2. "New Project" → "Deploy from GitHub repo"
  3. Selecione seu repositório
  4. 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​

  1. No projeto Railway: "New" → "Database" → "PostgreSQL"
  2. 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​

  1. Acesse render.com
  2. "New" → "Web Service"
  3. Conecte o GitHub
  4. Configure:
    • 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 (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


⬅️ Voltar ao Módulo 12