# © 2026 TechnoLibre (http://www.technolibre.ca) # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl) # # Dépendances système d'ERPLibre, pour NixOS. # # Le pendant DÉCLARATIF des quatre install__dependency.sh. Ceux-là # posent des paquets par apt, dnf, pacman ou zypper ; ici rien ne s'installe # par une commande — ce qui doit rester se déclare, et ce fichier est cette # déclaration. Un « nixos-rebuild switch » l'applique ; ce qui aurait été posé # à la main disparaîtrait à la reconstruction suivante. # # Déposé en /etc/nixos/erplibre.nix par script/install/install_nixos_dependency.sh, # qui l'ajoute aussi aux « imports » de la configuration de la machine. # # DEUX options portent tout le reste, et sans elles rien de ce dépôt ne # fonctionne sur NixOS : # # services.envfs.enable — NixOS ne peuple pas /bin ni /usr/bin. Or le # Makefile force « SHELL := /bin/bash » (toute cible make échouerait avant # sa première ligne) et lib_python_provider.sh ne cherche l'interpréteur du # système qu'en /usr/bin/pythonX.Y, jamais dans le PATH. envfs fabrique ces # deux répertoires à la volée depuis le PATH : les scripts du dépôt marchent # alors sans être réécrits. # # programs.nix-ld.enable — les binaires téléchargés (roues manylinux de pip, # CPython précompilé de mise, archives amont) sont liés à # /lib64/ld-linux-x86-64.so.2, qui n'existe pas ici. nix-ld le fournit et # leur donne les bibliothèques listées plus bas. { config, lib, pkgs, ... }: { # ── Ce que /bin, /usr/bin et l'éditeur de liens doivent porter ────────── services.envfs.enable = true; programs.nix-ld.enable = true; # Les bibliothèques que réclament les roues manylinux d'Odoo : psycopg2 veut # libpq, lxml veut libxml2/libxslt, cryptography veut openssl, pillow veut # zlib et freetype. Une roue qui n'en trouve pas une échoue à l'IMPORT, pas # à l'installation — donc bien après, et sans rapport apparent. programs.nix-ld.libraries = with pkgs; [ stdenv.cc.cc.lib zlib openssl libxml2 libxslt libffi libpq freetype fontconfig libjpeg glib expat bzip2 xz ncurses readline sqlite util-linux openldap cyrus_sasl cups libmysqlclient ]; # ── La base de données ─────────────────────────────────────────────────── # Le compte de service est SUPERUSER comme sur les autres distributions : # ERPLibre crée et détruit des bases (migrations, copies neutralisées), ce # qu'un rôle ordinaire ne peut pas faire. services.postgresql = { enable = true; # PostGIS comme les quatre autres scripts de distribution le posent. Ici # c'est une extension DU SERVEUR, pas un paquet du système : déclarée # ailleurs, elle ne serait pas chargeable par « CREATE EXTENSION ». extensions = ps: with ps; [ postgis ]; ensureUsers = [ { name = "@EL_USER@"; ensureClauses.superuser = true; ensureClauses.createdb = true; ensureClauses.login = true; } ]; }; # ── Les outils ─────────────────────────────────────────────────────────── # python3.12 : la version qu'attend ERPLibre (.python-odoo-version). envfs # la rend visible en /usr/bin/python3.12, où lib_python_provider.sh la # cherche — ni mise ni pyenv n'ont alors à télécharger quoi que ce soit. # # Les sorties « .dev » portent les en-têtes : sans elles, une roue absente # du dépôt amont devrait se compiler et ne trouverait ni libpq-fe.h ni # openssl/ssl.h. Elles ne servent qu'à ce cas, et ne coûtent que du disque. environment.systemPackages = with pkgs; [ python312 python312Packages.pip python312Packages.virtualenv uv nodejs_22 postgresql postgresql.dev git gnumake gcc pkg-config openssl openssl.dev zlib zlib.dev libxml2 libxml2.dev libxslt libxslt.dev libffi libffi.dev # python-ldap n'a PAS de roue amont : il compile, et réclame lber.h # (openldap) plus sasl.h. Sans ces sorties « .dev », « poetry install » # s'arrête sur « fatal error: lber.h: No such file or directory ». openldap openldap.dev cyrus_sasl cyrus_sasl.dev # « pg_config » est une dérivation à PART dans nixpkgs : il n'est ni dans # postgresql ni dans sa sortie « .dev », et psycopg2 s'arrête sur # « Error: pg_config executable not found ». postgresql.pg_config # pycups veut cups/http.h, mysqlclient veut mysql.h. Les quatre autres # scripts posent les mêmes (libcups2-dev, cups-devel, # mariadb-connector-c-devel, mariadb-libs). cups # « cups.lib » porte libcups.so, que « out » n'a pas : sans elle la # compilation de pycups PASSE et l'édition de liens échoue sur « -lcups ». cups.lib cups.dev libmysqlclient libmysqlclient.dev # « less » est le PAGINATEUR ; « nodePackages.less » est lessc, le # compilateur LESS des assets Odoo. Les quatre autres scripts les posent # tous deux, l'un par le gestionnaire du système et l'autre par « npm # install -g » — geste impossible ici, le préfixe npm étant le store, en # lecture seule. nixpkgs les porte : ils se déclarent comme le reste. less nodePackages.less nodePackages.rtlcss sshpass curl wget unzip wkhtmltopdf ]; # Le profil du système ne porte PAS « /include » : la liste par défaut de # ce qui y est lié ne contient ni les en-têtes ni les fichiers pkg-config. # Sans cette ligne, déclarer une sortie « .dev » ne met rien nulle part, et # « fatal error: lber.h: No such file or directory » reste entier. environment.pathsToLink = [ "/include" "/lib/pkgconfig" ]; # Les manuels HTML, et EUX SEULS, sont écartés. # # NixOS installe la sortie « doc » de CHAQUE paquet du système # (environment.extraOutputsToInstall vaut « man info doc »). Celle de # CPython n'est pas dans le cache binaire : le premier « nixos-rebuild » # la BÂTIT — un Sphinx qui lit puis écrit 3 000 pages. Sur une VM de 4 Go # et 4 cœurs, cela domine le temps d'installation ; sur une de 2 Go, la # machine cesse de répondre pendant la construction. # # « documentation.doc » et non « documentation » : les pages de manuel et # info restent, elles se lisent depuis un terminal et ne coûtent rien. documentation.doc.enable = false; # « sessionVariables » et NON « variables » : la seconde n'écrit que dans # /etc/set-environment, que seul un shell de CONNEXION lit. Or le # déploiement installe par « ssh hôte 'commande' », qui n'en est pas un — # la variable y serait vide. sessionVariables passe par pam_env, que toute # session traverse, y compris celle-là. environment.sessionVariables = { CPATH = "/run/current-system/sw/include"; LIBRARY_PATH = "/run/current-system/sw/lib"; PKG_CONFIG_PATH = "/run/current-system/sw/lib/pkgconfig"; }; }