Introdução: por que a implantação avançada de Rust em VPS é uma necessidade
Desenvolver em Rust é apenas metade do trabalho. A segunda parte, igualmente importante, é uma implantação confiável e segura. Métodos básicos, como compilação manual e execução via cargo run, não são adequados para produção. No nível avançado, são necessários automação, isolamento de processos, monitoramento e garantia de alta disponibilidade.
Neste artigo, vamos abordar como configurar a implantação de uma aplicação Rust em VPS usando Docker, CI/CD (GitHub Actions), systemd para inicialização automática e Nginx como proxy reverso. Todos os exemplos de código são fornecidos em Rust e Bash.
1. Preparação do VPS e do ambiente
1.1. Configuração básica do servidor
Supondo que você tenha um VPS rodando Ubuntu 22.04 LTS. Primeiro, atualizamos os pacotes e instalamos as ferramentas necessárias:
sudo apt update && sudo apt upgrade -ysudo apt install -y curl git build-essential pkg-config libssl-devInstalamos o Rust via rustup:
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | shsource $HOME/.cargo/envrustc --version # verificação1.2. Instalação do Docker
O Docker garantirá isolamento e reprodutibilidade do ambiente:
sudo apt install -y docker.iosudo systemctl enable --now dockersudo usermod -aG docker $USERnewgrp docker1.3. Instalação do Nginx
O Nginx atuará como proxy reverso e balanceador de carga:
sudo apt install -y nginxsudo systemctl enable --now nginx2. Containerização da aplicação Rust com Docker
2.1. Compilação em múltiplos estágios (multi-stage build)
Para reduzir o tamanho da imagem, usamos compilação em múltiplos estágios. Crie um Dockerfile na raiz do projeto:
# Estágio de compilaçãoFROM rust:1.75-slim-bookworm AS builderWORKDIR /appCOPY Cargo.toml Cargo.lock ./COPY src ./srcRUN cargo build --release
# Estágio finalFROM debian:bookworm-slimRUN apt update && apt install -y ca-certificates && rm -rf /var/lib/apt/lists/*WORKDIR /appCOPY --from=builder /app/target/release/my_app .EXPOSE 8080CMD ["./my_app"]Aqui, my_app é o nome do seu arquivo binário. Certifique-se de que em Cargo.toml está definido name = "my_app".
2.2. Compilação e execução do container
docker build -t my_app:latest .docker run -d --name my_app -p 8080:8080 my_app:latestVerifique se a aplicação responde:
curl http://localhost:80803. Configuração de inicialização automática e monitoramento (systemd + Docker Compose)
3.1. Docker Compose para gerenciar serviços
Crie um docker-compose.yml:
version: '3.8'services: app: image: my_app:latest restart: always ports: - "127.0.0.1:8080:8080" environment: - RUST_LOG=info healthcheck: test: ["CMD", "curl", "-f", "http://localhost:8080/health"] interval: 30s timeout: 10s retries: 3Observe: ports está vinculado a 127.0.0.1 para que requisições externas passem apenas pelo Nginx.
3.2. Unit do Systemd para gerenciar o serviço
Crie o arquivo /etc/systemd/system/my_app.service:
[Unit]Description=Minha Aplicação RustAfter=docker.serviceRequires=docker.service
[Service]Type=oneshotRemainAfterExit=yesWorkingDirectory=/opt/my_appExecStart=/usr/bin/docker compose up -dExecStop=/usr/bin/docker compose downUser=deployGroup=deploy
[Install]WantedBy=multi-user.targetAtive e inicie:
sudo systemctl daemon-reloadsudo systemctl enable my_appsudo systemctl start my_app