Como criar uma aplicação Spring Boot e hospedá-la gratuitamente na Oracle Cloud

Erick de Miranda Oliveira
8 min readMay 10, 2021

Desenvolvedores, de tempos em tempos, seja por necessidade própria, profissional ou ainda um desafio de uma vaga que se candidatou, querem inicializar uma aplicação Spring Boot conectado a um banco de dados ambos na nuvem. Sempre há o receio de custos ou simplesmente não querem ter custos!. Neste artigo você vai aprender sobre como fazer isso!

Hoje temos várias soluções e alternativas, porém a maioria tem uma possuem uma política de precificação que lhe permite experimentar o serviço mas inviabiliza o uso pessoal mesmo que para pequenas aplicações e projetos pessoais

Na

(onde trabalho, e inclusive está com vagas abertas), uso soluções de alta tecnologia na AWS e vi a necessidade de ter uma ambiente na cloud para um projeto pessoal 24x7 de baixo custo. Pensando em como atingir esse objetivo, falei com meu mentor , que acabou me dando a dica da Oracle Cloud e com isso resolvi experimentar seus serviços Always-free e compartilhar aqui.

Serviços always-free e com créditos do trial.

A Oracle oferece alguns serviços Always-free (sempre gratuitos), onde, mesmo que seu período de trial acabe, você continuará com eles, sem pagar nada.Durante o período de avaliação de 30 dias o custo por outros serviços são descontados de seu crédito bônus e após a avaliação caso precise fazer um upgrade, você terá que mudar seu plano e aí sim começa a cobrança.

Abaixo uma tabela dos serviços:

Descrição dos serviços oferecidos como always-free

Com isso, pretendo ao “tutorial” de como deixar sua aplicação Spring Boot rodando em uma instância virtual e um Mysql em outra, de forma gratuita.

Vamos começar!

Criando a conta na Oracle Cloud

Aqui não tem muito segredo. Basta entrar nesse link e clicar em “SIGN UP” e preencher os dados solicitados:

Tela de criação de conta da Oracle Cloud

Após esses passos vem a tela que, sempre tenho “receio”: Colocar os dados do cartão de crédito para validarem a forma de pagamento.

Não se preocupe, será gerado uma cobrança de valores pequenos apenas para validação do cartão, que é logo estornada. Comigo foi :)

Criando instancia Mysql

Primeiro de tudo, vamos:

Criar um COMPARTMENT:

  1. Vá no menu de navegação e clique em “Identity & Security”. Depois em “Identity”, e por último: “Compartments”.
  2. Clique em “Create Compartment”.
  3. Preencha os dados:
  • Name: <your-compartment-name>
  • Description: Compartment for <your-description>.
  • Parent Compartment: <your-tenancy>(root)

4. Para finalizar: “Create Compartment”.

Criar instancia MySQL

Na tela de “Get Started” / “Quick Actions”, podemos clicar “Create a VM Instance”.

Coloque o nome que desejar e selecione o compartment criado nos passos anteriores.

Para ser “Always free Elegible”, as configurações de placement e Image and shape, serão:

Placement: Availability Domain: AD-1 Always Free Eligible
Image and shape: Shape: VM.Standard.E2.1.Micro Always Free Eligible

Aqui você pode editar e escolher outras imagens de OS, eu vou seguir com Oracle linux, mas tem essas “Always free eligible” também:

Em “Networking”, eu selecionei para criar uma nova para mostrar a criação de uma VCN, e não a que eu já tinha.

O importante aqui é se atentar para deixar selecionado: Assign a public IPv4 address. Preste atenção também no nome, pois vamos usar a mesma VCN para a instância do spring boot.

SSH Keys: Aqui temos que enviar a ssh que iremos usar para conectar na instância.

Para criar a ssh, basta ir no terminal da sua máquina e executar:

$ ssh-keygen -t rsa

Depois disso, só clicar em criar instância.

Depois de uns segundos, a instância já está de pé e rodando. Para conectarmos nela, clique nela e dentro de “Instance Information”, na parte de “Instance Access”, podemos ver o ip público criado para ela, o qual vamos usar para conectar e instalar o mysql e o usuário logo abaixo.
Com isso rodamos o comando abaixo (note que o último parâmetro é o local aonde está salva sua ssh pública) e validamos a conexão:

$ ssh opc@152.70.222.140 -i /home/erick.oliveira/Documentos/Dextra/artigoOracle/keys

Para instalar o mysql, se rodarmos o seguinte comando, ele tenta instalar o MariaDB:

$ sudo yum install mysql

Para instalarmos a versão real do MySQL, podemos fazer o download do rpm direto no site da oracle. Como estamos usando oracle linux 7.9, vou baixar o “mysql80-community-release-el7–3.noarch.rpm”

Após isso, podemos rodar o seguinte comando para subir o rpm na instancia:

$ scp -i /home/erick.oliveira/Documentos/Dextra/artigoOracle/keys /home/erick.oliveira/Downloads/mysql80-community-release-el7–3.noarch.rpm opc@152.70.222.140:~/

Agora conectamos na maquina, vamos na pasta aonde upamos o rpm e instalamos ele com o comando:

$ sudo yum localinstall mysql80-community-release-el7–3.noarch.rpm

Com o MySQL repository ajustado,podemos instalar o MySQL Community edition server.

$ sudo yum install mysql-community-server

Instalação concluída. Agora podemos startar e confirmar se está up mesmo:

$ sudo service mysqld start && sudo service mysqld status

Durante o processo de instalação, o ‘root’@’localhost’ é criado automaticamente. Para recuperar a senha, podemos executar o comando:

$ sudo grep 'temporary password' /var/log/mysqld.log

Com isso, podemos logar no MySQL e alterar a senha:

$ mysql -uroot -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 8
Server version: 8.0.24
Copyright (c) 2000, 2021, Oracle and/or its affiliates.Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY 'N3wP4ssW0rd678!';
Query OK, 0 rows affected (0,00 sec)

Vamos já adiantar e criar o database e usuário que a aplicação irá usar:

mysql> create database db_example; -- Creates the new database
mysql> create user 'springuser'@'%' identified by 'ThePassword123!'; -- Creates the user
mysql> grant all on db_example.* to 'springuser'@'%'; -- Gives all privileges to the new user on the newly created database

Por último, vamos aproveitar que estamos nessa instância e liberar a porta 3306 no firewall. Para isso basta dar um exit no MySQL para voltar para o bash da instancia mysql e executar esses dois comandos:

$ sudo firewall-cmd --permanent --add-port=3306/tcp
$ sudo firewall-cmd --reload

Criando instância da aplicação.

Aqui seguimos bem parecido com a criação da instancia mysql.
Alterei o nome para “dextra-app”.
Importante confirmar que tudo está “Always free eligible”, o compartimento é o mesmo da instancia mysql e que em “NETWORKING” selecione a mesma VCN também, com o Assign a public IPv4 address: YES.
Eu usei a mesma chave ssh da instancia mysql para conectar nessa também.

Antes de conectar nela, vamos ter que fazer alguns passos para liberar a porta 8080:

Vamos clicar na instancia que foi criada, para ver os detalhes dela.
Em “Instance Information” ->“ Instance Details”, clicar em Virtual Cloud Network.

Nessa pagina de detalhes da VCN, vamos clicar na SUBNET listada.

Agora em “SECURITY LISTS”:

Aqui vão aparecer as regras para essa rede.
Vamos criar uma nova em “Add ingress rules” e preencher assim:
Stateless: Checked

  • Source Type: CIDR
  • Source CIDR: 0.0.0.0/0
  • IP Protocol: TCP
  • Source port range: (leave-blank)
  • Destination Port Range: 8080
  • Description: Allow HTTP connections

Vamos aproveitar que estamos aqui e criar já a rule para a porta do mysql:

Stateless: Unchecked

  • Source Type: CIDR
  • Source CIDR: 0.0.0.0/0
  • IP Protocol: TCP
  • Source port range: (leave-blank)
  • Destination Port Range: 3306
  • Description: mysql port

Agora vamos conectar (pegar o ip publico dessa nova instancia), liberar a porta no firewall e instalar o que precisamos:

$ ssh opc@152.70.212.228 -i /home/erick.oliveira/Documentos/Dextra/artigoOracle/keys

Liberar porta 8080 no firewall:

$ sudo firewall-cmd --permanent --add-port=8080/tcp
$ sudo firewall-cmd --reload

Agora vamos rodar os comandos para instalar o básico:

#criar um folder para salvar os arquivos de instalalção
$ mkdir installFiles
$ cd installFiles#update yum
$ sudo yum update -y
#install git
$ sudo yum install git -y
#install java
$ sudo yum install java-1.8.0-openjdk-devel
$ vi ~/.bashrc$ export JAVA_HOME=/etc/alternatives/java_sdk$ source ~/.bashrc#install maven
$ wget http://apache.mirrors.pair.com/maven/maven-3/3.6.3/binaries/apache-maven-3.6.3-bin.tar.gz
$ sudo tar xvfz apache-maven-3.6.3-bin.tar.gz$ sudo mv apache-maven-3.6.3 /opt/$ vi ~/.bashrc$ export PATH=$PATH:/opt/apache-maven-3.6.3/bin$ source ~/.bashrc

Com tudo instalado, vamos usar para exemplo, um repositório de exemplo de spring boot + mysql, do spring-guides.
Basta executar o comando abaixo para clonar na pasta raiz:

$ git clone https://github.com/spring-guides/gs-accessing-data-mysql.git

Repositório clonado, vamos nos arquivos de propriedades, para alterar umas coisas:

$ vi /home/opc/gs-accessing-data-mysql/complete/src/main/resources/application.properties

O meu ficou assim, se atentar a trocar o ip publico no datasource.url:

spring.jpa.hibernate.ddl-auto=update
spring.datasource.url=jdbc:mysql://152.70.222.140:3306/db_example
spring.datasource.username=springuser
spring.datasource.password=ThePassword123!
spring.datasource.driver-class-name =com.mysql.jdbc.Driver
#spring.jpa.show-sql: true

Agora vamos entrar na pasta para gerar o jar e em seguida, subir a aplicação:

$ cd gs-accessing-data-mysql/complete/
$ mvn clean install
$ cd target/
$ java -jar accessing-data-mysql-0.0.1-SNAPSHOT.jar

Em outro terminal, podemos executar (alterar para seu ip público)

$ curl 152.70.212.228:8080/demo/add -d name=First -d  email=someemail@someemailprovider.comSaved$ curl 152.70.212.228:8080/demo/all
[{"id":1,"name":"First","email":"someemail@someemailprovider.com"}]

Caso queira ter certeza que está salvando no banco, e não em memória, pode consultar na outra instância (mysql), e fazer a query ou derrubar o spring e subir novamente e logo em seguida executar o segundo curl que retorna os que estão salvos no banco.

Feito! Agora você tem sua aplicação rodando em uma instância e um banco em outra, de GRAÇA.

Antes de finalizar, queria agradecer o

por ter me dado esta dica, ajudado com algumas anotações dele e me incentivado a escrever esse artigo.

Também ao

por ter me incentivado e também apoiado na escrita!

Referências:

https://docs.oracle.com/pt-br/iaas/Content/FreeTier/resourceref.htm

https://medium.com/danieldiasjava/executando-sua-aplica%C3%A7%C3%A3o-java-na-oracle-cloud-infrastructure-d8ce55e74d61

https://docs.oracle.com/en-us/iaas/developer-tutorials/tutorials/spring-on-ol/01oci-ol-spring-summary.htm

https://loiane.com/2019/03/setting-up-mysql-on-oracle-cloud-connecting-with-mysql-workbench/

https://scriptingmysql.wordpress.com/2019/11/14/installing-mysql-on-oracle-clouds-always-free-compute-instance/

--

--