Le déploiement écrit /etc/motd partout et compte sur pam_motd pour le montrer — vrai des quatre images cloud, faux ici : sshd rend « printmotd no » et le PAM n'en contient aucun. Le guide était écrit, complet, et personne ne le lisait. Il gagne un bloc propre à NixOS, dont le piège qu'il existe pour dire — /etc/nixos/erplibre.nix est réécrit par « make install_os », et ce qu'on y ajoute disparaît sans un mot. La locale demandée ne s'appliquait pas : cloud-init passe par locale-gen et update-locale, absents ici. Mesuré — fr_CA demandé, en_US obtenu. Rien n'est imposé à une NixOS qu'on avait déjà. --- EN --- Deployment writes /etc/motd everywhere and relies on pam_motd to show it — true of the four cloud images, false here: sshd returns "printmotd no" and the PAM stack holds none. The guide was written, complete, and nobody read it. It gains a NixOS block, including the trap it exists to name — /etc/nixos/erplibre.nix is rewritten by "make install_os", and what you add there vanishes without a word. The requested locale did not apply: cloud-init goes through locale-gen and update-locale, absent here. Measured — fr_CA asked, en_US obtained. Nothing is imposed on a NixOS one already had. Assisted-by: Claude Opus 5
122 lines
4.8 KiB
Bash
Executable file
122 lines
4.8 KiB
Bash
Executable file
#!/usr/bin/env bash
|
|
# © 2026 TechnoLibre (http://www.technolibre.ca)
|
|
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl)
|
|
#
|
|
# Dépendances système ERPLibre pour NixOS.
|
|
#
|
|
# Les quatre autres scripts de distribution POSENT des paquets. Celui-ci n'en
|
|
# pose aucun : il dépose une déclaration et demande au système de s'y
|
|
# conformer. C'est la seule façon dont une dépendance dure sur NixOS — ce qui
|
|
# est installé à la main vit hors de la configuration et disparaît à la
|
|
# reconstruction suivante.
|
|
#
|
|
# Idempotent : relancé, il réécrit le module, n'ajoute pas deux fois l'import,
|
|
# et « nixos-rebuild switch » ne fait rien s'il n'y a rien à changer.
|
|
set -e
|
|
|
|
. ./env_var.sh
|
|
|
|
EL_USER=${USER}
|
|
# Le répertoire du service, pris du checkout QUI POSE le module : « make
|
|
# install_os » tourne à la racine du dépôt, et c'est ce dépôt-là que le
|
|
# service doit lancer. Deviner « /home/$USER/git/erplibre » se tromperait sur
|
|
# une installation de production, qui vit sous /opt.
|
|
EL_DIR=${EL_DIR:-${PWD}}
|
|
# Les réglages régionaux que le DÉPLOIEMENT a demandés, lus là où cloud-init
|
|
# garde ce qu'il a reçu. Vides quand rien ne les a demandés — une NixOS que
|
|
# l'on avait déjà —, et le module laisse alors les réglages en place.
|
|
EL_CLOUD_CFG=/var/lib/cloud/instance/cloud-config.txt
|
|
lire_seed() {
|
|
sudo grep -m1 -E "^${1}: " "${EL_CLOUD_CFG}" 2>/dev/null |
|
|
cut -d" " -f2- | tr -d "\r" || true
|
|
}
|
|
EL_LOCALE=${EL_LOCALE:-$(lire_seed locale)}
|
|
EL_TZ=${EL_TZ:-$(lire_seed timezone)}
|
|
MODULE_SRC="conf/nixos/erplibre.nix"
|
|
MODULE_DST="/etc/nixos/erplibre.nix"
|
|
CONFIG="/etc/nixos/configuration.nix"
|
|
|
|
if [ ! -f /etc/os-release ] || ! grep -q '^ID=nixos' /etc/os-release; then
|
|
echo "Ce script ne vaut que pour NixOS."
|
|
exit 1
|
|
fi
|
|
|
|
if [ ! -f "${MODULE_SRC}" ]; then
|
|
echo "Module absent : ${MODULE_SRC} (lancer depuis la racine du dépôt)."
|
|
exit 1
|
|
fi
|
|
|
|
echo -e "\n---- Module ERPLibre pour NixOS ----"
|
|
# Le nom du compte est substitué comme le user-data cloud-init l'est : le
|
|
# module déclare un rôle PostgreSQL, et un rôle porte un nom.
|
|
sed -e "s/@EL_USER@/${EL_USER}/g" -e "s#@EL_DIR@#${EL_DIR}#g" \
|
|
-e "s/@EL_LOCALE@/${EL_LOCALE}/g" -e "s#@EL_TZ@#${EL_TZ}#g" \
|
|
"${MODULE_SRC}" | sudo tee "${MODULE_DST}" > /dev/null
|
|
echo " posé : ${MODULE_DST} (compte ${EL_USER}, dépôt ${EL_DIR})"
|
|
echo " régional : locale « ${EL_LOCALE:-non demandée} »," \
|
|
"fuseau « ${EL_TZ:-non demandé} »"
|
|
|
|
if [ ! -f "${CONFIG}" ]; then
|
|
echo "Configuration introuvable : ${CONFIG}"
|
|
exit 1
|
|
fi
|
|
|
|
# L'import, une fois. Sans lui le module est un fichier mort : NixOS ne lit
|
|
# que ce que la configuration importe.
|
|
if grep -q "erplibre.nix" "${CONFIG}"; then
|
|
echo " import déjà présent dans ${CONFIG}"
|
|
else
|
|
sudo sed -i '0,/imports *= *\[/s//imports = [\n .\/erplibre.nix/' "${CONFIG}"
|
|
if grep -q "erplibre.nix" "${CONFIG}"; then
|
|
echo " import ajouté à ${CONFIG}"
|
|
else
|
|
echo "Aucun bloc « imports = [ » dans ${CONFIG} : ajoutez-y"
|
|
echo " ./erplibre.nix"
|
|
exit 1
|
|
fi
|
|
fi
|
|
|
|
echo -e "\n---- nixos-rebuild switch ----"
|
|
# La reconstruction télécharge et bâtit : elle est LONGUE au premier passage,
|
|
# et c'est elle qui pose PostgreSQL, node, le compilateur, nix-ld et envfs.
|
|
#
|
|
# Son code de retour n'est PAS le verdict. « switch-to-configuration » rend 4
|
|
# quand une unité n'a pas pu redémarrer, alors que le système est bel et bien
|
|
# activé : sur une VM cloud-init, cloud-config est un service à un coup, et
|
|
# toute reconstruction ultérieure le trouve mort. Prendre ce 4 pour un échec
|
|
# ferait échouer chaque redéploiement d'une machine déjà installée. C'est la
|
|
# vérification ci-dessous qui tranche, sur l'état du système.
|
|
if sudo nixos-rebuild switch; then
|
|
echo " reconstruction appliquée"
|
|
else
|
|
echo " ⚠ nixos-rebuild rend $? : une unité n'a pas redémarré."
|
|
echo " Le système peut être activé quand même — vérification ci-dessous."
|
|
fi
|
|
|
|
echo -e "\n---- Vérification ----"
|
|
manque=0
|
|
# La version voulue vient du dépôt, pas d'une valeur écrite ici : le module
|
|
# déclare python312 parce que .python-odoo-version dit 3.12.x, et les deux
|
|
# doivent se répondre. « 3.12.10 » -> « 3.12 », qui est ce que
|
|
# lib_python_provider.sh cherche en /usr/bin.
|
|
PY_WANT="$(cat .python-odoo-version 2> /dev/null | xargs)"
|
|
PY_MM="${PY_WANT%.*}"
|
|
for chemin in /bin/bash /usr/bin/env "/usr/bin/python${PY_MM}"; do
|
|
if [ -e "${chemin}" ]; then
|
|
echo " ${chemin}"
|
|
else
|
|
echo " MANQUE : ${chemin}"
|
|
manque=1
|
|
fi
|
|
done
|
|
if ! command -v psql > /dev/null 2>&1; then
|
|
echo " MANQUE : psql"
|
|
manque=1
|
|
fi
|
|
if [ "${manque}" -ne 0 ]; then
|
|
# Sans /bin/bash, la moindre cible make échoue avant sa première ligne :
|
|
# continuer ferait échouer l'installation une heure plus tard, ailleurs.
|
|
echo "Le système n'est pas conforme au module : voir services.envfs.enable."
|
|
exit 1
|
|
fi
|
|
echo " système conforme au module ERPLibre."
|