Maintenir et mettre à jour NetBox

Des sauvegardes nocturnes que tu as restaurées au moins une fois, une mise à jour que tu sais annuler, la tâche d'entretien, la rotation des logs, et une sonde qui dit si NetBox est vivant.

intermédiaire~35 min de manipulation
#netbox#backup#postgresql#systemd#upgrade#monitoring

Pas encore validée de bout en bout — sois le premier.Signaler un problème

Brouillon — pas encore exécuté de bout en bout. Cette page est écrite mais son auteur ne l'a pas encore déroulée sur une vraie machine. Des commandes peuvent être fausses : lis avant de lancer, et dis-nous ce qui casse.

En un coup d'œilCe qui tourne chaque nuit, et ce que tu lances exprès
Planifié sur le serveur
Serveur NetBox
02:30writesgit checkout restart
Timer nocturne02:30 · netbox-backup.timer
Script de sauvegardepg_dump -Fc · tar
Répertoire de sauvegarde
Releases NetBoxgit tags ·
upgrade.shvenv · migrations · static
netbox · netbox-rqsystemctl restart

Un timer dumpe la base et archive les fichiers dans le répertoire de sauvegarde ; avec l'option distante ils sont poussés ailleurs. Une mise à jour, c'est un tag extrait de git, appliqué par upgrade.sh, vérifié par une sonde sur /api/status/.

Une instance que personne ne maintient est une bombe à retardement : le jour où elle casse est le jour où tu découvres que la sauvegarde n'a jamais été testée. Cette page met en place une sauvegarde nocturne et la restaure une fois, met NetBox à jour vers une version choisie exprès, branche la tâche d'entretien, et laisse derrière elle une sonde qui te prévient quand quelque chose cloche.

Avant de commencer

Vérification
$systemctl is-active netbox netbox-rq postgresql
Retour attendu
active
active
active

Sauvegardes nocturnes

$sudo mkdir -p && sudo chmod 700
/usr/local/sbin/netbox-backup.sh
#!/usr/bin/env bash
set -euo pipefail
stamp=$(date +%Y%m%d-%H%M)
dest=
sudo -u postgres pg_dump -Fc netbox > "$dest/netbox-$stamp.dump"
files=(netbox/media netbox/netbox/configuration.py)
for f in netbox/netbox/ldap_config.py local_requirements.txt gunicorn.py; do
if [ -e "/$f" ]; then files+=("$f"); fi
done
tar -czf "$dest/netbox-files-$stamp.tar.gz" -C "${files[@]}"
find "$dest" -name 'netbox-*' -mtime + -delete
$sudo chmod 750 /usr/local/sbin/netbox-backup.sh
$sudo systemctl daemon-reload
$sudo systemctl enable --now netbox-backup.timer
$sudo systemctl start netbox-backup.service
Vérification
$systemctl is-active netbox-backup.timer
Retour attendu
active
Vérification
$ls  | sed 's/-[0-9]*-[0-9]*\././' | LC_ALL=C sort -u
Retour attendu
netbox-files.tar.gz
netbox.dump
Si le service échoue

journalctl -u netbox-backup -n 20 donne la raison. Les habituelles : pg_dump ne peut pas se connecter (PostgreSQL est arrêté, ou pg_hba.conf a perdu sa ligne local all postgres peer) ; tar se plaint d'un netbox/media manquant (le dossier a été déplacé, corrige le chemin) ; plus de place dans .

Exercice de restauration

$latest=$(ls -t /netbox-*.dump | head -1)
$sudo -u postgres createdb -O netbox netbox_drill
$sudo -u postgres pg_restore --no-owner --role=netbox -d netbox_drill < "$latest"
Vérification
$sudo -u postgres psql -d netbox_drill -tAc 'SELECT count(*) > 0 FROM dcim_site'
Retour attendu
t
Commande sensible — supprime une base de données. Vérifie avant d'exécuter.
$sudo -u postgres dropdb netbox_drill

Mettre NetBox à jour

$sudo systemctl start netbox-backup.service
$cd
$sudo git fetch --tags
$sudo git checkout
$sudo ./upgrade.sh
$sudo systemctl restart netbox netbox-rq
Vérification
$sudo git -C  describe --tags --exact-match
Retour attendu
Vérification
$curl -skf -H 'Authorization: Token ' https:///api/status/ | python3 -c 'import sys,json; print("v" + json.load(sys.stdin)["netbox-version"])'
Retour attendu
Vérification
$curl -sk -o /dev/null -w '%{http_code}' https:///login/
Retour attendu
200

Ensuite, ouvre https:/// et clique sur une page d'équipement et une recherche : que l'API réponde ne veut pas dire que l'interface s'affiche, puisque les fichiers statiques et les plugins peuvent casser l'un sans l'autre.

Si un plugin bloque la mise à jour

  • Regarde le tableau de compatibilité du plugin sur son dépôt. S'il existe une release compatible, fige-la dans local_requirements.txt (netbox-bgp==0.15.0) et relance sudo ./upgrade.sh.
  • S'il n'en existe pas, retire le plugin de PLUGINS dans configuration.py et de local_requirements.txt, mets à jour, et remets-le quand le plugin aura rattrapé. Ses tables restent dans la base ; rien n'est perdu, les pages disparaissent juste en attendant.
  • Si les notes de version disent que le plugin est devenu une fonction native (ça arrive), migre les données avec les instructions du plugin avant la mise à jour.

Retour arrière

Commande sensible — supprime une base de données. Vérifie avant d'exécuter.
$sudo systemctl stop netbox netbox-rq
$cd
$sudo git checkout $(sudo git describe --tags --abbrev=0 ^)
$latest=$(ls -t /netbox-*.dump | head -1)
$sudo -u postgres dropdb netbox && sudo -u postgres createdb -O netbox netbox
$sudo -u postgres pg_restore --no-owner --role=netbox -d netbox < "$latest"
$sudo ./upgrade.sh
$sudo systemctl start netbox netbox-rq

Entretien

$sudo ln -sf /contrib/netbox-housekeeping.sh /etc/cron.daily/netbox-housekeeping
$sudo /venv/bin/python /netbox/manage.py housekeeping
Vérification
$run-parts --test /etc/cron.daily | grep netbox
Retour attendu
/etc/cron.daily/netbox-housekeeping

Logs et disque : gunicorn écrit sur la sortie standard, que systemd capture dans le journal ; plafonne-le. nginx et Apache font tourner leurs propres fichiers via logrotate, livré avec le paquet.

/etc/systemd/journald.conf.d/netbox.conf
[Journal]
SystemMaxUse=500M

Puis sudo systemctl restart systemd-journald.

Chaque semaine, cinq minutes :

VérificationCommandeAttendu
Les deux services tournentsystemctl is-active netbox netbox-rqactive deux fois
La dernière sauvegarde a tournésystemctl list-timers netbox-backup.timerun LAST de moins de 24 h
Taille de sauvegarde cohérentels -lh ${BACKUP_DIR}des tailles du même ordre que la semaine dernière
Disquedf -h /sous 80 %
File calmeredis-cli info memoryused_memory_human stable
Nouvelle release ?page des releaseslire les notes, planifier la mise à jour

Supervision de base

Commande sensible — exécute un script distant. Vérifie avant d'exécuter.
$systemctl status netbox netbox-rq --no-pager | grep Active
$curl -skf -H "Authorization: Token " https:///api/status/ | python3 -m json.tool
Vérification
$curl -skf -H 'Authorization: Token ' https:///api/status/ | python3 -c 'import sys,json; print(json.load(sys.stdin)["rq-workers-running"] >= 1)'
Retour attendu
True

Terminé

Chaque nuit un dump et une archive atterrissent dans , tu en as restauré un à la main, NetBox tourne en , le journal des changements est purgé chaque jour, et une sonde sait quand les workers s'arrêtent. La page suivante arrête de cliquer : un utilisateur d'automatisation, pynetbox, des imports en masse, des webhooks et des scripts personnalisés.

Tout a fonctionné ?

Si tu as suivi cette page jusqu'au bout sur une vraie machine, dis-le. Ta validation est datée et enregistre ta stack : le prochain lecteur sur le même chemin sait que ça marche toujours.

Cette copie est en lecture seule. Pour dire que ça marche, ou que ça ne marche pas, ouvre une issue

Seuls tes choix de stack sont enregistrés, jamais tes valeurs. Le pseudo reste sur ce navigateur.