{title}đź”—
In blog/ Electronic/
Introduction
Inventree est une application web qui permet de gérer un stock de composants électroniques
Déploiement d'Inventree en production bare métal
Récapitulatif
De nombreuses étapes sont nécessaires pour déployer Inventree dans un environnement de production. Mais avant de les lister, il faut quand même que je détaille mes choix d'installation.
- D'abord, on va utiliser une base de données SQLite. Dans le cadre de mon utilisation quasiment mono-utilisateur, c'est overkilling d'utiliser un vrai SGBDR comme PostgreSQL.
- Ensuite, je vais accéder à l'application via une URL dédiée et non un virtualhost.
Création d'un compte dédié
En termes de sécurité, mieux vaut confiner l'application à un compte dédié. Cela permet d'éviter qu'en cas de corruption de l'application ou d'une faille de sécurité dans le code, l'attaquant dispose de beaucoup de droits et fasse de nombreux dommages dans tous le système.
adduser --disabled-password inventree chmod 755
Dépendances
Pour installer Inventree, nous allons avoir besoin de quelques paquets, principalement des paquets python3, mais pas que.
apt install python3-venv libpango-1.0-0
Récupération des sources et création de l'environnement virtuel
Il reste à récupérer les sources et à déployer l'application après avoir crée un environnement virtuel Python3 dédié. Cet environnement virtuel va récupérer tous les paquets Python3 indispensables à l'application. Car, fondammentalement, c'est ce qui permet de déployer l'application sur Debian Bookworm. En effet, les versions requises par Inventree dépassent largement les versions disponibles sous Debian. Utiliser un environnement virtuel permet de récupérer les bonnes versions.
Après analyse du fichier requirements.txt, il y a plein de paquets qui me posent question, notamment l'utilisation d'Opentelemetry ou de sentry.io dont je n'aurais jamais l'utilisation et qui reposent sur des plate-formes tierces sur lesquelles je n'ai pas la main. Mais, comme ils sont indispensables à l'application, il n'y a guère le choix de les installer sans péter toute l'application. Si j'avais un peu de courage ou si je voulais faire un déploiement corporate, je prendrais le temps de lire le code et de désactiver complètement l'utilisation de ces paquets.
su - inventree cd ~ python3 -m venv venv git clone --depth 1 --single-branch --branch 0.17.14 https://github.com/inventree/InvenTree.git InvenTree ln -s InvenTree/src/backend/InvenTree inventree source venv/bin/activate cd InvenTree python3 -m pip install invoke
Voilà , à ce stade, nous avons tout ce qu'il faut pour déployer l'application. L'installation d'invoke via pip permet de disposer de la commande invoke, une sorte de make en Python. Inventree a défini un ensemble de tâches pour faciliter le déploiement. Toutefois, son utilisation implique de disposer d'un fichier de configuration minimal de l'application, car une partie de l'installation implique d'ajouter du code ou le build de la partie HTML/JS/CSS dans l'application. Et il faut savoir où mettre ça.
Configuration de l'application
Selon la documentation, le fichier de configuration peut être indiqué par la variable d'environnement INVENTREE_CONFIG_FILE ou directement dans le répertoire de l'application, soit src/backend/InvenTree (ou inventree/config.yaml dans notre cas). Le fichier de configuration est au format yaml.
Attention, il y a des pièges dans la configuration, notamment sur l'URL du site: il faut toujours mettre l'URL racine du site, sinon ça se termine mal pour la configuration CORS.
Mise Ă jour de l'installation
C'est la dernière étape avant d'avoir une application fonctionnelle, mais c'est une étape qui fait beaucoup de boulot.
cd ~/InvenTree invoke update ln -s InvenTree/src/backend/InvenTree/static_i18n/i18n inventry/static/i18n
invoke install permet de récupérer tous les paquets Python indispensables au fonctionnement de l'application, y compris si vous avez activé des plugins spécifiques.
invoke migrate permet de gérer l'aspect base de données. Notamment, ça créé la base de données ainsi que les tables pour faire fonctionner l'application. Pour que ça fonctionne, la configuration de la base de données doit avoir été renseignée correctement dans le fichier de configuration.
Intégration dans Apache2
Introduction
Ok, Inventree fonctionne en mode développement, en utilisant le serveur web de Django. Mais pour un déploiement plus sécurisé, il est de bon ton de le placer derrière un frontal, de manière à empêcher l'exploitation de failles de sécurité.
Par ailleurs, il est important de noter que le backend Inventree ne gère pas certaines opérations, notamment la délivrance des fichiers de média (les images notamment).
J'utilise Apache comme serveur web et pour protéger Inventree et gérer les accès, plusieurs techniques sont possibles, de la plus simple à la plus complexe:
- Utiliser gunicorn et mod_proxy d'Apache.
- Utiliser uwsgi et mod_proxy_uwsgi d'Apache.
- Utiliser mod_wsgi d'Apache.
Pour ma part, j'ai choisi d'implémenter mod_wsgi sous Apache. Pourquoi ? Simplement parce que j'ai déjà un service qui repose sur cette architecture et la réutiliser permet d'économiser des ressources (d'espace disque pour les packages installés et réduction de l'empreinte mémoire en évitant d'avoir deux binaires qui tournent au lieu d'un seul).
Attention, pour le moment, InvenTree ne fonctionne correctement que si l'application est déployée dans un virtualhost dédié. On ne peut pas la créer depuis un sous-répertoire d'un serveur web. C'est essentiellement à cause du code interne qui semble ne pas être assez générique pour coder les URLS correctement, notamment les URLs statiques.
Déploiement et configuration de mod_wsgi
mod_wsgi est un module Apache codé en C qui permet de lancer des applications WSGI depuis Apache. Il est très léger, rapide et finalement assez facile à configurer. C'est la meilleure option selon moi, plus facile que uwsgi.
On commence par ajouter le module mod_wsgi, si ce n'est pas déjà fait:
apt install libapache2-mod-wsgi-py3
Ensuite, il reste à configurer l'application Inventree dans Apache et c'est là que ça se complique. D'abord, il va falloir vous assurer que vous avez bien défini un nom de domaine pour le virtualhost. Il y a donc une configuration DNS à créer et, comme ça dépend de chaque hébergement, je ne peux pas vous aider sur ce point. Il faut juste un champ CNAME qui rajoute votre nouvel alias.
Je vous épargne aussi la configuration du certificat TLS qui prendra en compte votre nouveau nom de domaine.
Ce que je peux faire en revanche, c'est vous montrer une configuration Apache qui fonctionne, une fois que le DNS et la partie TLS sont gérés.
# Configuration d'InventTree par mod_wsgi <IfModule ssl_module> WSGIDaemonProcess inventree processes=2 threads=4 home=/home/inventree/inventree user=inventree group=inventree python-home=/home/inventree/venv WSGIProcessGroup inventree WSGIScriptAlias / /home/inventree/inventree/InvenTree/wsgi.py <Directory /home/inventree/inventree/InvenTree> Require all granted </Directory> </IfModule>