segunda-feira, 29 de setembro de 2025

Deploy Gratuito: Spring Boot PetClinic no Render + PostgreSQL no Aiven.io

🐾 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
Tudo 100% gratuito, sem cartão de crédito necessário!

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

  1. Acesse https://aiven.io e crie uma conta
  2. Clique em "Create a project" e dê um nome (ex: petclinic-project)
  3. Clique em "Create service":
    • Cloud provider: Escolha qualquer (ex: AWS Frankfurt)
    • Service type: PostgreSQL
    • Plan: Free Hobbyist
    • Service name: petclinic-db
  4. Clique em "Create service" e aguarde o provisionamento (~5 minutos)
  5. 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")
🔐 Não compartilhe esses dados! Eles serão usados apenas no Render.
Importante: Em "Networking", ative "Allow connections from any IP address" (para testes).
⚠️ 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

  1. No GitHub, crie um novo repositório público (ex: petclinic-render-aiven)
  2. 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"]
✅ O -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
✅ Seu código agora está no GitHub, sem senhas ou dados sensíveis.

5️⃣ Passo 5: Crie o serviço no Render

  1. Acesse https://dashboard.render.com
  2. Clique em "New""Web Service"
  3. Conecte sua conta do GitHub e selecione seu repositório (petclinic-render-aiven)
  4. 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
  5. 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
🔐 Substitua <seu-host-aiven>, <porta> e <sua-senha-do-aiven> pelos dados do Aiven.
  1. 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
✅ Você verá no log: 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 — prefira validate ou update
  • ❌ 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.

🌟 Ideal para portfólio, estudos ou protótipos!

🔗 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

Nenhum comentário:

Postar um comentário

 

bobox

Blogger news