Systemd : Creer un daemon actix sous Debian
Je trouve que Rust est un chouette langage. Et le truc encore plus chouette avec Rust c'est la quantité de libs cool qu'on trouve sur crates.io.
J'utilise pour plusieurs projets professionnels des back-end web écrits en Rust grace à la lib Actix. On va voir comment, en quelques minutes, on peut creer un daemon web actix grace à Systemd.
Actix
Actix est un serveur web capable, entre autre, d'interpreter des requetes HTTP et de les traiter. L'idée ici est d'utiliser actix pour effectuer en Rust les traitement qu'on ferait habituellement en PHP.
Actix fonctionne de manière un peu différente de PHP. Au lieu d'utiliser CGI (ou FastCGI), il va simplement ecouter sur un socket réseau.
La documentation officielle explique comment creer un serveur en Rust avec actix en moins de 5 minutes.
Ce qui m'interesse ici c'est d'etre capable de lancer le binaire du serveur grace à des commandes de systemd, du style systemctl restart ma-super-appli-web.service.
Le truc cool, c'est qu'Actix est deja en mesure d'interpreter les interruptions systemes classique.
Placer le binaire au bon endroit
Une fois le binaire compilé avec un bon cargo build --release il va falloir le copier dans un endroit approprié du systeme.
Admettons que votre projet s'appelle, avec beaucoup d'originalité, serveur-rust il vous faudra récuperer le binaire du meme nom se trouvant dans le dossier target/release/ de votre projet.
On le placera par exemple dans /usr/local/sbin/ de manière à ce qu'il se trouve dans le PATH du systeme.
Creer le fichier Unit pour Systemd
C'est presque le plus simple.
Il suffit de creer un fichier dans /etc/systemd/system/ avec le nom de votre service et le contenu tel que decrit ci dessous.
Exemple avec un service qu'on va nommer serveur-rust. On creer le fichier /etc/systemd/system/serveur-rust.service (en root):
[Unit]
Description=Actix-web rust server app launcher
After=network.target
[Service]
Type=simple
# Ici le chemin du binaire. A remplacer par le votre.
ExecStart=/usr/local/sbin/serveur-rust
[Install]
WantedBy=multi-user.target
Il n'y a plus qu'a activer le service (en root):
systemctl enable serveur-rust.service
Grace a cette commande, le serveur sera lancé au démarrage de la machine
Lancer le service
Pour démarrer le service immediatement :
systemctl start serveur-rust.service
Pour vérifier que le service fonctionne :
systemctl status serveur-rust.service
Et la, magie ! ca fonctionne.