Introdução
Desenvolver uma aplicação Java é apenas metade do trabalho. A segunda parte, igualmente importante, é o deploy adequado em um servidor de produção. Muitos desenvolvedores enfrentam dificuldades ao transferir uma aplicação da máquina local para um VPS: configuração do ambiente, build, execução em segundo plano, garantia de segurança. Neste artigo, vamos analisar o processo completo de deploy de uma aplicação Java em um VPS (Virtual Private Server) — desde a compra do servidor até a configuração de HTTPS. Todas as etapas serão acompanhadas de exemplos de código e configurações.
Usaremos Ubuntu 22.04 LTS como sistema operacional do VPS e, como exemplo de aplicação Java, uma aplicação Spring Boot REST simples, empacotada em um arquivo JAR. Se você estiver usando outro framework (Jakarta EE, Micronaut, Quarkus), os princípios gerais permanecem os mesmos.
1. Preparação do VPS e instalação do Java
1.1. Conexão ao servidor
Após comprar o VPS, você receberá um endereço IP, um nome de usuário (geralmente root) e uma senha ou chave SSH. Conecte-se ao servidor via terminal:
ssh root@seu-ip-do-servidorSe estiver usando uma chave SSH, especifique o caminho para ela:
ssh -i /caminho/para/chave_privada root@seu-ip-do-servidor1.2. Atualização do sistema e instalação do Java
Primeiramente, vamos atualizar o gerenciador de pacotes e instalar o Java Development Kit (JDK). Para a maioria das aplicações Java modernas, OpenJDK 17 ou 21 é suficiente:
apt update && apt upgrade -yapt install openjdk-17-jdk -yVerifique a instalação:
java -versionVocê deve ver algo como:
openjdk version "17.0.10" 2024-01-16 LTSOpenJDK Runtime Environment (build 17.0.10+7-Ubuntu-122.04.1)OpenJDK 64-Bit Server VM (build 17.0.10+7-Ubuntu-122.04.1, mixed mode, sharing)1.3. Configuração de variáveis de ambiente (opcional)
Se sua aplicação exigir variáveis específicas (por exemplo, JAVA_HOME), adicione-as ao arquivo ~/.bashrc ou /etc/environment:
echo "export JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64" >> ~/.bashrcsource ~/.bashrc2. Build e upload da aplicação para o servidor
2.1. Build do JAR/WAR na máquina local
Suponha que você tenha um projeto Maven. Execute o build:
mvn clean package -DskipTestsComo resultado, na pasta target/ aparecerá o arquivo myapp-0.0.1-SNAPSHOT.jar (ou .war para aplicações web).
2.2. Upload do arquivo JAR para o VPS
Use scp para copiar o arquivo para o servidor:
scp target/myapp-0.0.1-SNAPSHOT.jar root@seu-ip-do-servidor:/opt/myapp/Crie um diretório para a aplicação no servidor, se ele não existir:
mkdir -p /opt/myapp2.3. Verificação da estrutura no servidor
Após o upload, verifique se o arquivo está no lugar:
ls -la /opt/myapp/Você deve ver myapp-0.0.1-SNAPSHOT.jar.
3. Configuração da execução da aplicação (systemd + Nginx)
3.1. Execução manual do arquivo JAR (teste)
Antes de configurar a execução permanente, certifique-se de que a aplicação inicia corretamente:
java -jar /opt/myapp/myapp-0.0.1-SNAPSHOT.jar --server.port=8080Se a aplicação iniciar sem erros, prossiga para a criação do serviço systemd.
3.2. Criação do serviço systemd
O systemd permite executar a aplicação Java como um daemon (em segundo plano) e reiniciá-la automaticamente em caso de falha ou reinicialização do servidor.
Crie o arquivo de serviço:
nano /etc/systemd/system/myapp.serviceInsira a seguinte configuração:
[Unit]Description=My Java ApplicationAfter=network.target
[Service]Type=simpleUser=rootWorkingDirectory=/opt/myappExecStart=/usr/bin/java -jar /opt/myapp/myapp-0.0.1-SNAPSHOT.jar --server.port=8080Restart=on-failureRestartSec=10
[Install]WantedBy=multi-user.target3.3. Inicialização e ativação do serviço
Após criar o arquivo, recarregue o systemd, inicie o serviço e ative-o para iniciar automaticamente com o sistema:
systemctl daemon-reloadsystemctl start myappsystemctl enable myappVerifique o status do serviço:
systemctl status myappVocê deve ver algo como active (running).
3.4. Visualização dos logs
Para ver os logs da aplicação em tempo real:
journalctl -u myapp -fPara ver as últimas 50 linhas:
journalctl -u myapp -n 50 --no-pager4. Configuração do Nginx como proxy reverso
4.1. Instalação do Nginx
Instale o Nginx no servidor:
apt install nginx -y4.2. Criação da configuração do proxy reverso
Crie um arquivo de configuração para sua aplicação:
nano /etc/nginx/sites-available/myappInsira a seguinte configuração:
server { listen 80; server_name seu-dominio.com www.seu-dominio.com;
location / { proxy_pass http://localhost:8080; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; }}Ative a configuração criando um link simbólico:
ln -s /etc/nginx/sites-available/myapp /etc/nginx/sites-enabled/Teste a configuração do Nginx:
nginx -tSe não houver erros, reinicie o Nginx:
systemctl restart nginx5. Configuração do HTTPS (Let's Encrypt)
5.1. Instalação do Certbot
Instale o Certbot e o plugin do Nginx:
apt install certbot python3-certbot-nginx -y5.2. Obtenção do certificado SSL
Execute o Certbot para obter e instalar automaticamente o certificado:
certbot --nginx -d seu-dominio.com -d www.seu-dominio.comSiga as instruções interativas. Após a conclusão, o Certbot modificará automaticamente a configuração do Nginx para usar HTTPS.
5.3. Verificação da renovação automática
Os certificados Let's Encrypt expiram após 90 dias. Verifique se a renovação automática está configurada:
certbot renew --dry-runSe o comando for executado sem erros, a renovação automática está funcionando.
6. Configuração do firewall (UFW)
Configure o firewall para permitir apenas tráfego HTTP, HTTPS e SSH:
ufw allow OpenSSHufw allow 'Nginx Full'ufw enableVerifique o status:
ufw statusVocê deve ver algo como:
Status: active
To Action From-- ------ ----OpenSSH ALLOW AnywhereNginx Full ALLOW AnywhereOpenSSH (v6) ALLOW Anywhere (v6)Nginx Full (v6) ALLOW Anywhere (v6)7. Conclusão e recomendações
Parabéns! Você concluiu o deploy da sua aplicação Java em um VPS. Recapitulando as etapas principais:
- Preparação do servidor e instalação do Java
- Build e upload da aplicação
- Criação de um serviço systemd para execução automática
- Configuração do Nginx como proxy reverso
- Configuração do HTTPS via Let's Encrypt
- Configuração do firewall
Recomendações adicionais:
- Monitoramento: Configure ferramentas de monitoramento (Prometheus + Grafana, New Relic, Datadog) para acompanhar a saúde da aplicação.
- Backup: Faça backups regulares do JAR e dos arquivos de configuração.
- CI/CD: Automatize o processo de deploy usando GitHub Actions, GitLab CI ou Jenkins.
- Segurança: Execute a aplicação com um usuário não-root, use variáveis de ambiente para dados sensíveis e mantenha o sistema atualizado.
Se você tiver dúvidas ou encontrar problemas, consulte a documentação oficial do Spring Boot, Nginx e systemd. Boa sorte com seus deploys!