Introduction : pourquoi un déploiement avancé de Rust sur VPS est une nécessité
\nLe développement en Rust n'est que la moitié du travail. La seconde moitié, tout aussi importante, est un déploiement fiable et sécurisé. Les méthodes de base, comme la compilation manuelle et l'exécution via cargo run, ne conviennent pas à la production. Au niveau avancé, l'automatisation, l'isolation des processus, la surveillance et la garantie d'une haute disponibilité sont nécessaires.
Dans cet article, nous allons voir comment configurer le déploiement d'une application Rust sur VPS en utilisant Docker, CI/CD (GitHub Actions), systemd pour le démarrage automatique et Nginx comme proxy inverse. Tous les exemples de code sont donnés en Rust et Bash.
\n\n1. Préparation du VPS et de l'environnement
\n1.1. Configuration de base du serveur
\nSupposons que vous ayez un VPS sous Ubuntu 22.04 LTS. Commencez par mettre à jour les paquets et installer les outils nécessaires :
\nsudo apt update && sudo apt upgrade -y\nsudo apt install -y curl git build-essential pkg-config libssl-dev\nInstallez Rust via rustup :
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh\nsource $HOME/.cargo/env\nrustc --version # vérification\n1.2. Installation de Docker
\nDocker assurera l'isolation et la reproductibilité de l'environnement :
\nsudo apt install -y docker.io\nsudo systemctl enable --now docker\nsudo usermod -aG docker $USER\nnewgrp docker\n1.3. Installation de Nginx
\nNginx agira comme proxy inverse et équilibreur de charge :
\nsudo apt install -y nginx\nsudo systemctl enable --now nginx\n\n2. Conteneurisation de l'application Rust avec Docker
\n2.1. Construction multi-étapes (multi-stage build)
\nPour réduire la taille de l'image, utilisez une construction multi-étapes. Créez un Dockerfile à la racine du projet :
# Étape de construction\nFROM rust:1.75-slim-bookworm AS builder\nWORKDIR /app\nCOPY Cargo.toml Cargo.lock ./\nCOPY src ./src\nRUN cargo build --release\n\n# Étape finale\nFROM debian:bookworm-slim\nRUN apt update && apt install -y ca-certificates && rm -rf /var/lib/apt/lists/*\nWORKDIR /app\nCOPY --from=builder /app/target/release/my_app .\nEXPOSE 8080\nCMD ["./my_app"]\nIci, my_app est le nom de votre fichier binaire. Assurez-vous que Cargo.toml contient name = "my_app".
2.2. Construction et exécution du conteneur
\ndocker build -t my_app:latest .\ndocker run -d --name my_app -p 8080:8080 my_app:latest\nVérifiez que l'application répond :
\ncurl http://localhost:8080\n\n3. Configuration du démarrage automatique et de la surveillance (systemd + Docker Compose)
\n3.1. Docker Compose pour la gestion des services
\nCréez un fichier docker-compose.yml :
version: '3.8'\nservices:\n app:\n image: my_app:latest\n restart: always\n ports:\n - "127.0.0.1:8080:8080"\n environment:\n - RUST_LOG=info\n healthcheck:\n test: ["CMD", "curl", "-f", "http://localhost:8080/health"]\n interval: 30s\n timeout: 10s\n retries: 3\nNotez que ports est lié à 127.0.0.1 afin que les requêtes externes passent uniquement par Nginx.
3.2. Unité Systemd pour la gestion du service
\nCréez le fichier /etc/systemd/system/my_app.service :
[Unit]\nDescription=Mon application Rust\nAfter=docker.service\nRequires=docker.service\n\n[Service]\nType=oneshot\nRemainAfterExit=yes\nWorkingDirectory=/opt/my_app\nExecStart=/usr/bin/docker compose up -d\nExecStop=/usr/bin/docker compose down\nUser=deploy\nGroup=deploy\n\n[Install]\nWantedBy=multi-user.target\nActivez et démarrez :
\nsudo systemctl daemon-reload\nsudo systemctl enable my_app\nsudo systemctl start my_app\n\n