[PT-BR] Subindo um Docker na nuvem Render
Tags: java, springboot, dio, render
Published: 2024-03-20 16:27:09

## Repositório que estará sendo utilizado como exemplo

{% embed https://github.com/digitalinnovationone/santander-dev-week-2023-api %}
 
## Diferença entre nuvens

O ***Railway*** tem um interpretador para aplicações Spring Boot, então pelo repositório fornecido ele identifica o arquivo .jar necessário para aplicação.

O ***Render*** não, o que ele nos permite é gerar um serviço web, como um API, por exemplo, mas precisamos instruí-lo a montar o ambiente necessário para que a aplicação seja executada, faremos isso através de um Docker, mas não se assuste, é bem simples.

Caso você desconheça esta tecnologia, saiba mais através deste [artigo](https://www.dio.me/articles/o-que-voce-precisa-saber-antes-de-aprender-docker).
 
## Passo a passo

 
> Se busca por rapidez e eficiência recomendo seguir por este caminho:


{% embed https://dev.to/lucas-adm/pt-br-subindo-um-docker-compose-na-nuvem-render-odc %}

 
- Alterar o `ddl-auto` no perfil de produção:

```
📂santander-dev-week-2023-api
 ┣ 📂.gradle
 ┣ 📂.idea
 ┣ 📂gradle
 ┣ 📂src
 ┃ ┗ 📂main
 ┃    ┗ 📂java
 ┃    ┗ 📂resources
 ┃       ┗ 📛application-dev.yml
 ┃       ┗ 📛application-prd.yml ←
 ┣ 🚫.gitignore
 ┣ 🐘build.gradle
 ┣ » gradlew
 ┣ » gradlew.bat
 ┣ 🐘settings.gradle
```

```yml
spring:
  datasource:
    url: jdbc:postgresql://${PGHOST}:${PGPORT}/${PGDATABASE}
    username: ${PGUSER}
    password: ${PGPASSWORD}
  jpa:
    open-in-view: false
    hibernate:
      ddl-auto: update ←
```
 
- Descobrindo o nome do arquivo .jar

> Execute:

![bootJar](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/xnb91wkbp7dqqef87sdl.png)

ou se preferir também é possível pelo terminal:

```
.\gradlew bootJar
```

> Guarde o nome do arquivo .jar gerado dentro de build/libs:

```
📂santander-dev-week-2023-api
 ┣ 📂.gradle
 ┣ 📂.idea
 ┣ 📂build
 ┃ ┗ 📂libs
 ┃    ┗ ⚙santander-dev-week-2023-api-0.0.1-SNAPSHOT.jar ←
 ┣ 📂gradle
 ┣ 📂src
 ┣ 🚫.gitignore
 ┣ 🐘build.gradle
 ┣ » gradlew
 ┣ » gradlew.bat
 ┣ 🐘settings.gradle
```

> Feito isto você pode excluir a pasta build ou executar o comando no terminal `.\gradlew clean`, pois não terá mais utilidade

 
- Criando o `Dockerfile` na raiz do projeto e preenchendo-o: 

###### É um arquivo simples sem extensão.

```
📂santander-dev-week-2023-api
 ┣ 📂.gradle
 ┣ 📂.idea
 ┣ 📂gradle
 ┣ 📂src
 ┣ 🚫.gitignore
 ┣ 🐘build.gradle
 ┣ 🐋Dockerfile ←
 ┣ » gradlew
 ┣ » gradlew.bat
 ┣ 🐘settings.gradle
```

```docker
# Define a imagem base para a etapa de construção, que será uma versão do Debian
FROM debian:latest AS BUILD

# Atualiza os repositórios de pacotes e instala o JDK 17
RUN apt-get update && apt-get install -y openjdk-17-jdk

# Copia todo o conteúdo do diretório atual para o contexto de construção do Docker
COPY . .

# Concede permissão de execução ao script gradlew e executa os comandos clean e bootJar com ele
RUN chmod +x gradlew && ./gradlew clean bootJar

# Define a imagem base para a execução, que será uma versão mais leve do JDK 17
FROM openjdk:17-jdk-slim

# Copia o arquivo .jar da etapa de construção para o diretório atual do contêiner e o renomeia para app.jar
# Se atente ao nome do arquivo .jar gerado no passo anterior
COPY --from=build ./build/libs/santander-dev-week-2023-api-0.0.1-SNAPSHOT.jar app.jar

# Define o ponto de entrada do contêiner como a execução do arquivo .jar com a ativação do perfil "prd"
ENTRYPOINT ["java", "-jar", "-Dspring.profiles.active=prd", "app.jar"]
```
 
- Finalizado, faça um ***push*** das modificações para seu repositório Github.

> Caso esteja seguindo por um clone do repositório de exemplo, execute o seguinte comando e suba para um novo repositório Github:

```bash
~/Desktop/santander-dev-week-2023-api
rm -rf .git ←

~/Desktop/santander-dev-week-2023-api
git init ←
```
 
- Criar uma [conta](https://dashboard.render.com/register) no Render vinculada ao <u>Github ou Google</u>.

> *É importante ser vinculada à alguma conta para liberar o plano grátis*
 

- Criar um novo Banco de Dados [PostgreSQL](https://dashboard.render.com/new/database)

> Preencher o campo ***name*** e prosseguir
 

- Criar um novo [Web Service](https://dashboard.render.com/create?type=web)

![New Web Service](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/83iur8z1fx2fsgj2v77r.png)
 
- Passar a URL do repositório Github criado e prosseguir:

![Repo URL](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/mxlpz0olfuanlca9xzp0.png)

> Preencher o campo ***name*** e as variáveis de ambiente de acordo com o arquivo `application-prd.yml` e as configurações de `Connections` do PostgreSQL

![PSQL Connection](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/pe2p7ttvsjy8ponyx1pp.png)

![Env VARS](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/kch2y6on6ohumd6klm3d.png)
 
- Copiar o endereço da documentação do Swagger

> `url do seu web-service` + `/swagger-ui.html`

###### No meu caso seria `https://renderyaml.onrender.com` + `/swagger-ui.html` como pode-se averiguar:

![Successful deploy](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/agmti3dqpdewrdxnv628.png)
 
- Mantendo o serviço ativo

Como fora abordado, o Render tem uma política de hibernar todo serviço grátis que não interagir dentro de um intervalo de 15 minutos.

Mas podemos utilizar o monitorador de serviços online [UptimeRobot](https://uptimerobot.com) para enviar requisições a cada 5 minutos mantendo nosso serviço sempre interagindo.

Basta:

1. Se [registrar](https://uptimerobot.com) no ***UptimeRobot***;
2. Tornando-se um usuário você pode criar um serviço de monitoramento acessando este [link](https://dashboard.uptimerobot.com/monitors/new/http);
3. O tipo de monitoramento `Monitor Type` deve ser `HTTP`;
4. E em `URL to monitor:` basta colocar a URL do Swagger: `url do seu web-service` + `/swagger-ui.html`;
5. Caso não queira ser atualizado sobre o status do seu serviço basta desmarcar a caixa `Email`;
6. Pronto, basta criar seu monitor através do botão `Create Monitor`.

 

### 🎉 Parabéns! Agora você tem uma aplicação Spring Boot documentada pelo Swagger em produção!