🐾 Deploy Gratuito: Spring Boot PetClinic no Render + PostgreSQL no Aiven.io
Última atualização: 29 de Setembro de 2025 por Paulo Evaristo Ferreira da Silva
Introdução
Neste tutorial, você vai aprender a implantar gratuitamente a aplicação Spring Boot PetClinic (construída com Maven) usando:
- Render — para hospedar a aplicação Java (plano gratuito)
- Aiven.io — para o banco de dados PostgreSQL gratuito
Pré-requisitos
- Conta no GitHub
- Conta no Render
- Conta no Aiven.io
- Git instalado localmente
- (Opcional) JDK 17 e Maven para testes locais
1️⃣ Passo 1: Crie um banco PostgreSQL gratuito no Aiven.io
- Acesse https://aiven.io e crie uma conta
- Clique em "Create a project" e dê um nome (ex:
petclinic-project
) - Clique em "Create service":
- Cloud provider: Escolha qualquer (ex: AWS Frankfurt)
- Service type: PostgreSQL
- Plan: Free Hobbyist
- Service name: petclinic-db
- Clique em "Create service" e aguarde o provisionamento (~5 minutos)
- Após pronto, vá em "Overview" e anote:
- Host (ex:
deployfree-pevaristo.j.aivencloud.com
) - Port (ex:
13854
) - Database name (
defaultdb
) - Username (
avnadmin
) - Password (clique em "Show")
- Host (ex:
⚠️ Isso expõe seu banco publicamente — só use em projetos pessoais.
2️⃣ Passo 2: Prepare seu repositório no GitHub
Clone o repositório oficial do PetClinic
git clone https://github.com/spring-projects/spring-petclinic.git meu-petclinic-render-aiven cd meu-petclinic-render-aiven
Crie um novo repositório no GitHub
- No GitHub, crie um novo repositório público (ex:
petclinic-render-aiven
) - Conecte seu diretório local ao novo repositório:
git remote set-url origin https://github.com/seu-usuario/petclinic-render-aiven.git
3️⃣ Passo 3: Modifique os arquivos necessários
📄 Dockerfile
Crie ou substitua o Dockerfile
na raiz do projeto com este conteúdo:
# Build stage FROM maven:3.9.4-eclipse-temurin-17-alpine AS build WORKDIR /app # Copia o POM e baixa dependências COPY pom.xml . RUN mvn dependency:go-offline -B # Copia o código-fonte COPY src ./src # Compila com o perfil 'postgres' RUN mvn clean package -DskipTests -Ppostgres # Runtime stage FROM eclipse-temurin:17-jre-alpine AS runtime WORKDIR /app # Copia o JAR do build stage COPY --from=build /app/target/*.jar /app/app.jar # Expõe a porta 8080 EXPOSE 8080 # Executa com perfil 'postgres' e configurações otimizadas ENTRYPOINT ["java", \ "-Dspring.profiles.active=postgres", \ "-Xmx512m", \ "-Xms256m", \ "-jar", \ "/app/app.jar"]
-Ppostgres
ativa o perfil correto durante o build.
📄 src/main/resources/application-postgres.properties
Atualize este arquivo com:
# Database Configuration spring.datasource.url=${SPRING_DATASOURCE_URL} spring.datasource.username=${SPRING_DATASOURCE_USERNAME} spring.datasource.password=${SPRING_DATASOURCE_PASSWORD} spring.datasource.driver-class-name=org.postgresql.Driver # JPA Configuration spring.jpa.database-platform=org.hibernate.dialect.PostgreSQLDialect spring.jpa.hibernate.ddl-auto=${SPRING_JPA_HIBERNATE_DDL_AUTO:update} spring.jpa.show-sql=false spring.jpa.properties.hibernate.format_sql=false # Disable schema initialization (Hibernate will handle it) spring.sql.init.mode=never # HikariCP Configuration (otimizado para free tier) spring.datasource.hikari.maximum-pool-size=5 spring.datasource.hikari.minimum-idle=2 spring.datasource.hikari.connection-timeout=30000 spring.datasource.hikari.idle-timeout=600000 spring.datasource.hikari.max-lifetime=1800000 spring.datasource.hikari.connection-test-query=SELECT 1 # SSL Configuration for Aiven spring.datasource.hikari.data-source-properties.ssl=true spring.datasource.hikari.data-source-properties.sslmode=require
spring.sql.init.mode=never
evita falhas ao tentar rodar scripts no Aiven.
📄 render.yaml (opcional, mas recomendado)
Crie o arquivo render.yaml
na raiz do projeto:
services: - type: web name: petclinic-aiven env: docker region: frankfurt plan: free dockerfilePath: ./Dockerfile healthCheckPath: /actuator/health envVars: - key: SPRING_DATASOURCE_URL sync: false - key: SPRING_DATASOURCE_USERNAME sync: false - key: SPRING_DATASOURCE_PASSWORD sync: false - key: SPRING_JPA_HIBERNATE_DDL_AUTO value: update - key: SPRING_PROFILES_ACTIVE value: postgres
📄 .gitignore
Adicione se não existir:
.env target/ *.jar .DS_Store
4️⃣ Passo 4: Faça push para o GitHub
git add . git commit -m "feat: configuração para Render + Aiven" git push -u origin main
5️⃣ Passo 5: Crie o serviço no Render
- Acesse https://dashboard.render.com
- Clique em "New" → "Web Service"
- Conecte sua conta do GitHub e selecione seu repositório (
petclinic-render-aiven
) - Preencha:
- Name: petclinic-aiven
- Region: escolha uma (ex: Frankfurt)
- Branch: main
- Runtime: Docker
- Build Command: deixe em branco (o Dockerfile cuida disso)
- Start Command: deixe em branco
- Em "Advanced" → "Environment Variables", adicione como Secrets:
KEY | VALUE |
---|---|
SPRING_DATASOURCE_URL | jdbc:postgresql://<seu-host-aiven>:<porta>/defaultdb?sslmode=require |
SPRING_DATASOURCE_USERNAME | avnadmin |
SPRING_DATASOURCE_PASSWORD | <sua-senha-do-aiven> |
SPRING_JPA_HIBERNATE_DDL_AUTO | update |
<seu-host-aiven>
, <porta>
e <sua-senha-do-aiven>
pelos dados do Aiven.
- Clique em "Create Web Service"
6️⃣ Passo 6: Aguarde o deploy
- O Render fará o build da imagem Docker e iniciará a aplicação
- Em poucos minutos, seu app estará no ar em:
https://petclinic-aiven.onrender.com
Tomcat initialized with port 8080
→ deploy bem-sucedido!
🛠️ Troubleshooting
Erro: "Schema-validation: missing table [owners]"
Solução: Certifique-se de que SPRING_JPA_HIBERNATE_DDL_AUTO=update
está configurado no Render.
Erro: "Connection refused"
Solução: Verifique se as credenciais do Aiven estão corretas e se o sslmode=require
está na URL.
Aplicação muito lenta
Causa: O plano gratuito do Render hiberna após 15 minutos de inatividade. A primeira requisição após hibernação pode levar 30-60 segundos.
🎯 Entendendo os Modos do DDL-AUTO
Modo | O que faz | Quando usar |
---|---|---|
validate | Apenas valida se tabelas existem | Produção com banco já populado |
update | Cria/atualiza tabelas automaticamente | Desenvolvimento e primeira vez |
create | Apaga e recria tudo sempre | Nunca em produção! |
create-drop | Cria ao iniciar, apaga ao fechar | Apenas testes |
none | Não faz nada | Quando você gerencia schema manualmente |
💰 Custos e Limitações
Render (Plano Free)
- ✅ 750 horas de execução por mês
- ✅ 512 MB RAM
- ⚠️ Hiberna após 15 minutos de inatividade
- ⚠️ Build de 90 minutos por deploy
Aiven.io (Plano Hobbyist)
- ✅ 1 CPU / 1 GB RAM / 1 GB Storage
- ✅ 20 conexões simultâneas
- ✅ Válido por 30 dias (renovável)
- ⚠️ Sem backup automático
🛡️ Dicas de Segurança
- ❌ Não use
ddl-auto=create
no Aiven — prefiravalidate
ouupdate
- ❌ Nunca comite senhas no GitHub — use sempre Secrets no Render
- ✅ Para produção, desative "Allow all IPs" no Aiven e use whitelist de IPs
- ✅ Configure
maximum-pool-size=5
para evitar esgotamento de conexões
🎉 Conclusão
Você agora tem uma aplicação Spring Boot rodando gratuitamente na nuvem, com banco de dados PostgreSQL gerenciado, tudo sem pagar um centavo.
🔗 Links úteis
Se este tutorial te ajudou, compartilhe com seus colegas! 🐶🐱
✍️ Autor: Paulo Evaristo Ferreira da Silva
📧 Contato: paulo.evaristo@exemplo.com
💻 GitHub: @seu-usuario