Date de création : 2026-06-27
Dernière mise à jour : 2026-06-27
Statut : En cours
local:vztmpl/debian-13-standard_13.1-2_amd64.tar.zst)Compute-VM-1Terra avec espace libreExécuté depuis : ssh root@192.168.202.101
pct create 120 local:vztmpl/debian-13-standard_13.1-2_amd64.tar.zst \
--hostname infra-mgmt \
--storage Compute-VM-1Terra \
--rootfs Compute-VM-1Terra:30 \
--cores 2 \
--memory 4096 \
--swap 1024 \
--net0 name=eth0,bridge=vmbr0,ip=192.168.202.50/24,gw=192.168.202.254 \
--nameserver 192.168.202.24 \
--searchdomain dev13.fr \
--unprivileged 1 \
--features nesting=1 \
--onboot 1 \
--start 1
pct create 121 local:vztmpl/debian-13-standard_13.1-2_amd64.tar.zst \
--hostname uptime-monitor \
--storage Compute-VM-1Terra \
--rootfs Compute-VM-1Terra:8 \
--cores 1 \
--memory 512 \
--swap 256 \
--net0 name=eth0,bridge=vmbr0,ip=192.168.202.51/24,gw=192.168.202.254 \
--nameserver 192.168.202.24 \
--searchdomain dev13.fr \
--unprivileged 1 \
--features nesting=1 \
--onboot 1 \
--start 1
pct create 122 local:vztmpl/debian-13-standard_13.1-2_amd64.tar.zst \
--hostname netbox \
--storage Compute-VM-1Terra \
--rootfs Compute-VM-1Terra:15 \
--cores 2 \
--memory 2048 \
--swap 512 \
--net0 name=eth0,bridge=vmbr0,ip=192.168.202.52/24,gw=192.168.202.254 \
--nameserver 192.168.202.24 \
--searchdomain dev13.fr \
--unprivileged 1 \
--features nesting=1 \
--onboot 1 \
--start 1
✅ Résultat : 3 LXCs créés et démarrés (120 et 121 running, 122 à démarrer manuellement si besoin).
Exécuté depuis : pct enter 120 (sur pve-main)
apt update && apt upgrade -y && apt install -y \
ansible \
git \
curl \
wget \
nano \
htop \
jq \
unzip \
net-tools \
dnsutils \
sudo \
openssh-client \
sshpass \
python3-pip \
python3-venv
Symptôme :
ERROR: Ansible could not initialize the preferred locale: unsupported locale setting
Cause : Les LXCs Proxmox sont créés sans locale configurée. Ansible a besoin d'une locale UTF-8.
Correction :
apt install -y locales
sed -i 's/# fr_FR.UTF-8/fr_FR.UTF-8/' /etc/locale.gen
locale-gen
update-locale LANG=fr_FR.UTF-8
export LANG=fr_FR.UTF-8
Pour rendre permanent (survivre au reboot) — le update-locale s'en charge, mais pour la session courante il faut aussi export.
ansible --version
Résultat attendu :
ansible [core 2.19.4]
python version = 3.13.5
Exécuté depuis : pct enter 120 (dans le LXC infra-mgmt)
ssh-keygen -t ed25519 -C "ansible-admin@infra-mgmt" -f /root/.ssh/id_ed25519 -N ""
Résultat : clé générée dans /root/.ssh/id_ed25519 (privée) et /root/.ssh/id_ed25519.pub (publique)
Fingerprint : SHA256:lNZrGrJNX+nraxAW5Ov298F71f0Bc4rMx5VZZfvhyic
ssh-copy-id -o StrictHostKeyChecking=accept-new <user>@<ip>
Fonctionne pour : pve-main, pve-nuc, vm-hestiacp (loicadmin), vm-rustdesk-n8n (loic)
Depuis pve-main (pas dans un LXC) :
# Reset mot de passe si nécessaire
pct exec <ID> -- passwd root
# Ou injection directe de la clé (plus rapide) :
KEY=$(pct exec 120 -- cat /root/.ssh/id_ed25519.pub)
for CT in 101 104 113; do
pct exec $CT -- mkdir -p /root/.ssh
pct exec $CT -- chmod 700 /root/.ssh
echo "$KEY" | pct exec $CT -- tee -a /root/.ssh/authorized_keys
pct exec $CT -- chmod 600 /root/.ssh/authorized_keys
done
Pour configurer sudo NOPASSWD sur les VMs sans accès root SSH :
qm guest exec 110 -- bash -c "echo 'loicadmin ALL=(ALL) NOPASSWD:ALL' > /etc/sudoers.d/loicadmin && chmod 440 /etc/sudoers.d/loicadmin"
qm guest exec 106 -- bash -c "echo 'loic ALL=(ALL) NOPASSWD:ALL' > /etc/sudoers.d/loic && chmod 440 /etc/sudoers.d/loic"
Symptôme : ssh-copy-id déploie la mauvaise clé (celle de pve /root/.ssh/id_rsa.pub au lieu de celle d'infra-mgmt)
Cause : Commandes exécutées depuis pve-main au lieu du LXC infra-mgmt
Correction : Toujours exécuter les ssh-copy-id depuis pct enter 120 (infra-mgmt), ou utiliser la méthode d'injection directe via pct exec
| Machine | IP | User | Status |
|---|---|---|---|
| pve-main | 192.168.202.101 | root | ✅ Clé déployée |
| pve-nuc | 192.168.150.249 | root | ✅ Clé déployée |
| nginx-proxy-manager | 192.168.202.10 | root | ✅ Injection directe |
| wireguard | 192.168.202.26 | root | ✅ Injection directe |
| lxc-llm | 192.168.202.14 | root | ✅ Injection directe |
| vm-hestiacp | 192.168.202.12 | loicadmin (sudo) | ✅ ssh-copy-id + NOPASSWD |
| vm-rustdesk-n8n | 192.168.202.9 | loic (sudo) | ✅ ssh-copy-id + NOPASSWD |
| vm-adguard | 192.168.202.24 | ? | ❌ À faire (user inconnu) |
| vm-homeassistant | 192.168.202.20 | — | ❌ SSH désactivé (activer addon) |
| vm-admin | 192.168.202.108 | — | ❌ Windows 11 (WinRM) |
Création de l'inventaire minimal :
mkdir -p /opt/ansible
cat > /opt/ansible/hosts.yml << 'EOF'
all:
children:
proxmox_hosts:
hosts:
pve-main:
ansible_host: 192.168.202.101
ansible_user: root
pve-nuc:
ansible_host: 192.168.150.249
ansible_user: root
lxc:
hosts:
nginx-proxy-manager:
ansible_host: 192.168.202.10
ansible_user: root
wireguard:
ansible_host: 192.168.202.26
ansible_user: root
lxc-llm:
ansible_host: 192.168.202.14
ansible_user: root
vms:
hosts:
vm-hestiacp:
ansible_host: 192.168.202.12
ansible_user: loicadmin
ansible_become: true
vm-rustdesk-n8n:
ansible_host: 192.168.202.9
ansible_user: loic
ansible_become: true
EOF
Test :
ansible -i /opt/ansible/hosts.yml all -m ping
✅ Résultat : 7/7 SUCCESS (pve-main, pve-nuc, nginx-proxy-manager, wireguard, lxc-llm, vm-hestiacp, vm-rustdesk-n8n)
ansible.cfg qui fixe l'interpréteur| Erreur | Cause | Correction |
|---|---|---|
unsupported locale setting |
Locale non configurée sur LXC frais | locale-gen + update-locale + export dans .bashrc |
pct: command not found |
Commande exécutée dans un LXC au lieu de Proxmox | exit pour revenir sur pve-main |
Telnet session au lieu de SSH |
MobaXterm configuré en Telnet | Utiliser Session → SSH (port 22) |
Permission denied sur ssh-copy-id LXC |
Mot de passe root oublié | Reset via pct exec <ID> -- passwd root depuis pve-main |
| sudo demande un mot de passe | NOPASSWD pas configuré | qm guest exec <ID> -- bash -c "echo 'user ALL=(ALL) NOPASSWD:ALL' > /etc/sudoers.d/user" |
| ssh-copy-id déploie la mauvaise clé | Exécuté depuis pve-main au lieu d'infra-mgmt | Injection directe via pct exec ou pct enter 120 d'abord |
Exécuté depuis infra-mgmt. Résultat de l'audit :
| Machine | OS | Kernel | Services | Disque | Alerte |
|---|---|---|---|---|---|
| nginx-proxy-manager | Debian 12 | 6.17-pve | NPM (pas Docker) | 75% (947Mo libres) | ⚠️ CRITIQUE — agrandir disque |
| wireguard | Debian 12 | 6.17-pve | wg-dashboard.service | 57% (1.8Go libres) | OK |
| lxc-llm | Debian 12 | 6.17-pve | ollama.service + Docker (open-webui) | 81% (13Go libres) | Surveiller |
| vm-hestiacp | Debian 12 | 6.1-amd64 | hestia.service + nginx | 35% (8.3Go libres) | ⚠️ Kernel très ancien, ne pas toucher sans check HestiaCP |
| vm-rustdesk-n8n | Debian 13 | 6.12-amd64 | nginx uniquement | 38% (11Go libres) | ❓ Docker absent — conteneurs arrêtés ? |
nginx-proxy-manager (LXC 101)
pct resize 101 rootfs +6G depuis pve-main avant toute opérationwireguard (LXC 104)
lxc-llm (LXC 113)
vm-hestiacp (VM 110)
vm-rustdesk-n8n (VM 106)
docker ps mais les services étaient censés tournerdocker ps -a pour voir les conteneurs arrêtés| Machine | Packages installés | Timezone | NTP | Locale |
|---|---|---|---|---|
| nginx-proxy-manager | dnsutils, htop, jq, net-tools + deps | Déjà OK | ✅ Configuré | ✅ fr_FR.UTF-8 |
| wireguard | dnsutils, htop, jq + deps | Déjà OK | ✅ Configuré | ✅ fr_FR.UTF-8 |
| lxc-llm | dnsutils, htop, jq, net-tools, unzip + deps | UTC→Paris | ✅ Configuré | ✅ fr_FR.UTF-8 |
| vm-hestiacp | htop | Déjà OK | ✅ Configuré | Déjà OK |
| vm-rustdesk-n8n | jq, net-tools, unzip + deps | Déjà OK | ✅ Configuré | Déjà OK |
Symptôme : apt install échoue avec Unmet dependencies sur le LXC wireguard
Cause : Le LXC (helper script) avait des packages linux-image-rt-amd64 installés (inutile dans un LXC, le kernel est celui de Proxmox). Le miroir Debian ne proposait plus la version demandée (404).
Correction :
ssh root@192.168.202.26 "apt purge -y linux-image-6.1.0-29-rt-amd64 linux-image-6.1.0-30-rt-amd64 linux-image-rt-amd64 && apt autoremove -y && apt --fix-broken install -y && apt update"
Vérification : wg show + systemctl is-active wg-dashboard → tout fonctionne après nettoyage.
Leçon : Les LXCs installés via helper scripts peuvent contenir des packages inappropriés (kernels). Toujours auditer avant d'appliquer des playbooks.
Le LXC nginx-proxy-manager avait seulement 947 Mo libres (disque 4 Go sur local-lvm). Résolu par :
# Depuis pve-main
pct resize 101 rootfs 10G
Résultat : 6.6 Go libres après resize.
Les LXCs infra-mgmt, uptime-monitor et netbox sont en Debian 13 Trixie. Différences par rapport à Debian 12 :
| Problème | Cause | Solution |
|---|---|---|
gpg: command not found |
gpg pas installé par défaut sur Trixie minimal | apt install -y gnupg AVANT d'ajouter des repos externes |
software-properties-common introuvable |
Package renommé/supprimé dans Trixie | Ne pas l'utiliser, ajouter les repos manuellement |
sqv au lieu de gpg pour apt |
Trixie utilise Sequoia (sqv) pour vérifier les signatures APT | Toujours créer le keyring avec gpg --dearmor dans /etc/apt/keyrings/ |
| Locale warnings | Pas de locale configurée par défaut | locale-gen fr_FR.UTF-8 + export dans .bashrc |
apt install -y gnupg curl
mkdir -p /etc/apt/keyrings
Toujours faire ça EN PREMIER avant de curl | gpg --dearmor.
Playbook : /opt/ansible/repo/ansible/playbooks/02-node-exporter.yml
Résultat : 7/7 SUCCESS + installation manuelle sur infra-mgmt lui-même.
Port : 9100 sur chaque machine.
/usr/local/bin/prometheus/etc/prometheus/prometheus.yml/var/lib/prometheusprometheus.servicegrafana (repo officiel apt.grafana.com)http://192.168.202.50:3000grafana.dev13.fr → http://192.168.202.50:3000 dans NPMdocker run -d --name cadvisor --restart always -p 8080:8080 \
-v /:/rootfs:ro -v /var/run:/var/run:ro -v /sys:/sys:ro \
-v /var/lib/docker/:/var/lib/docker:ro gcr.io/cadvisor/cadvisor:latest
Port : 8080 sur vm-rustdesk-n8n (192.168.202.9)
Dashboard Grafana recommandé : ID 14282 (cAdvisor)
Cause : Le playbook Ansible a installé node_exporter sur les machines distantes mais pas sur infra-mgmt lui-même (il n'est pas dans son propre inventaire en tant que cible).
Correction : Installation manuelle directe (curl + tar + cp + service systemd)
Cause : L'ajout automatique via API curl -X POST http://admin:admin@... n'a pas fonctionné car le mot de passe admin avait été changé au premier login.
Correction : Ajouter manuellement via l'UI (Connections → Data sources → Add → Prometheus → URL localhost:9090 → Save & Test)
| Service | URL | Port |
|---|---|---|
| Prometheus | http://192.168.202.50:9090 | 9090 |
| Grafana | http://192.168.202.50:3000 | 3000 |
| Node Exporter (chaque machine) | http://:9100 | 9100 |
| cAdvisor (Docker) | http://192.168.202.9:8080 | 8080 |
| Type | Nom | Cible |
|---|---|---|
| HTTP | Proxmox PVE | https://192.168.202.101:8006 |
| HTTP | Grafana | http://192.168.202.50:3000 |
| HTTP | N8N | http://192.168.202.9:5678 |
| HTTP | Home Assistant | http://192.168.202.20:8123 |
| HTTP | AdGuard | http://192.168.202.24:80 |
| HTTP | NPM Dashboard | http://192.168.202.10:81 |
| HTTP | HestiaCP Panel | https://192.168.202.12:8083 |
| TCP | HestiaCP SMTP | 192.168.202.12:587 |
| TCP | HestiaCP IMAP | 192.168.202.12:993 |
| TCP | WireGuard | 192.168.202.26:5554 |
| HTTP | Ollama API | http://192.168.202.14:11434 |
| TCP | Rustdesk | 192.168.202.9:21115 |
| TCP | TeamSpeak | 192.168.202.9:9987 |
| HTTP | Proxmox NUC | https://192.168.150.249:8006 |
| Ping | PBS | 192.168.150.10 |
Symptôme : SQLITE_CONSTRAINT: NOT NULL constraint failed: monitor.conditions
Cause : La version récente d'Uptime Kuma exige un champ conditions et accepted_statuscodes que la librairie Python ne fournit pas.
Correction : Utiliser directement les WebSockets avec python-socketio :
import socketio
sio = socketio.Client()
# Émettre 'add' avec conditions=[] et accepted_statuscodes=['200-299']
Leçon : Toujours vérifier la compatibilité des librairies tierces avec la version installée du service.
Ports détectés par machine :
| Machine | Ports TCP ouverts |
|---|---|
| NPM (192.168.202.10) | 22, 80, 81, 443, 3000, 9100 |
| WireGuard (192.168.202.26) | 22, 9100 |
| LXC-LLM (192.168.202.14) | 22, 3000, 9100 |
| AdGuard (192.168.202.24) | 22, 53, 80 |
| HestiaCP (192.168.202.12) | 22, 25, 53, 80, 110, 143, 443, 465, 587, 993, 995, 8080, 8443, 9100 |
| Rustdesk-N8N (192.168.202.9) | 22, 80, 8080, 8443, 9100 |
| infra-mgmt (192.168.202.50) | 22, 3000, 9100 |
| uptime-monitor (192.168.202.51) | 22 |
| pve-main (192.168.202.101) | 22, 111, 3128, 8008, 9100 |
| pve-nuc (192.168.150.249) | 22, 111, 3128, 9100 |
Première vague (15) + deuxième vague (14) basée sur le scan.
AdGuard (192.168.202.24) n'a PAS node_exporter installé (pas dans le scan : pas de port 9100).
Il faudra l'installer plus tard pour avoir ses métriques dans Prometheus.
Pas bloquant — Uptime Kuma le surveille déjà via HTTP port 80.
| Erreur | Cause | Correction |
|---|---|---|
bash: !J5: event not found |
Caractères spéciaux (!, &, )) dans le mot de passe interprétés par bash |
Utiliser un fichier de config temporaire au lieu de passer en argument |
| Pas de mail reçu après alerte | Config SMTP dans Uptime Kuma mal renseignée (mot de passe ou STARTTLS) | Vérifier via "Modifier" dans l'UI et cliquer "Tester" |
| Composant | Statut | URL |
|---|---|---|
| Node Exporter (8 machines) | ✅ | :9100/metrics |
| Prometheus (10 targets UP) | ✅ | http://192.168.202.50:9090 |
| Grafana (dashboards) | ✅ | http://192.168.202.50:3000 |
| cAdvisor (Docker) | ✅ | http://192.168.202.9:8080 |
| Uptime Kuma (29 monitors) | ✅ | http://192.168.202.51:3001 |
| Alertes email | ✅ | alertes@scijoly.fr → lpascalin@scijoly.fr |
Uptime Kuma détecte service DOWN
→ Email d'alerte avec bouton [RESTART]
→ Bouton = lien webhook N8N
→ N8N SSH vers infra-mgmt
→ Script restart-service.sh
→ SSH vers la machine cible
→ systemctl restart / docker restart
service_id en argumenthttp://192.168.202.9:5678/webhook/restart/{serviceId}La clé privée d'infra-mgmt a été copiée dans le conteneur Docker N8N :
/home/node/.ssh/id_ed25519restart-service.sh ollama → Ollama redémarré → Uptime Kuma détecte UP → email reçu ✅/opt/ansible/scripts/restart-service.sh {service_id}/opt/ansible/scripts/restart-service.sh ollamaSymptôme : "Unrecognized node type: n8n-nodes-base.executeCommand"
Cause : N8N 2.12.3 n'a plus le nœud "Execute Command" (local). Il a été remplacé par le nœud SSH qui se connecte à un serveur distant.
Correction : Utiliser le nœud SSH natif avec des credentials SSH (host + private key)
| Erreur | Cause | Correction |
|---|---|---|
Unable to locate executable '/usr/bin/node' |
Node.js pas installé sur infra-mgmt | apt install nodejs via repo nodesource |
stdin: not in gzip format (téléchargement wiki.js) |
GitHub redirige le download, curl ne suivait pas | Utiliser l'URL directe du release v2.5.306 |
ni ceci ni aucun de ses répertoires parents n'est un dépôt git |
Le clone initial via l'UI Wiki.js a échoué | Clone manuel dans /opt/wikijs/data/repo/ puis "Import Everything" |
| Service | URL | Port |
|---|---|---|
| Wiki.js | http://192.168.202.50:3002 | 3002 |