🐾 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=createno Aiven — prefiravalidateouupdate - ❌ 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=5para 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: filisteus@gmail.com
💻 GitHub: @filisteus