Selenith
Projets, mémos et infos diverses

Systemd : Creer un daemon actix sous Debian

Publié le 13/04/2021

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.

Systemd aime actix

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.