Guide de migration Zabbix 7.0 vers 7.2 -- SRZA¶
Ce guide decrit la procedure complete de migration du serveur de supervision Zabbix depuis l'ancien VPS vers le nouveau serveur SRZA, avec deploiement via Docker, securisation UFW et acces Cloudflare.
Criticite C1
Planifier la migration en heures creuses. Prevoir une fenetre de 48h de fonctionnement en parallele des deux serveurs.
Plan du guide¶
Le guide est organise en 2 phases :
Phase A — Setup initial via SSH (etapes 1 a 4) : preparation du VPS, installation des paquets, securisation, mise en place de Cockpit + tunnel Cloudflare.
Phase B — Deploiement via Cockpit (etapes 5 a 11) : tout le reste se fait depuis le navigateur via le terminal web Cockpit (https://cockpit-srza.oxyane-na.fr).
Phase A — Setup initial (SSH)¶
Ces etapes necessitent un acces SSH direct au VPS.
ssh debian@51.77.150.97
Etape 1 -- Preparation de l'ancien serveur Zabbix 7.0¶
Export des templates personnalises¶
- Se connecter a l'interface web de l'ancien Zabbix
- Aller dans Configuration → Templates
- Cocher les templates personnalises (non fournis par defaut)
- Cliquer sur Export en bas de page → Format YAML
- Sauvegarder le fichier
templates_export.yaml
Export des hosts¶
- Aller dans Configuration → Hosts
- Selectionner tous les hosts
- Cliquer sur Export → Format YAML
- Sauvegarder le fichier
hosts_export.yaml
Export des elements complementaires¶
Exporter egalement si des personnalisations ont ete faites :
- Administration → Media types → selectionner → Export (YAML)
- Configuration → Actions → selectionner → Export (YAML)
- Administration → User groups → noter les groupes et permissions personnalises
Transfert vers le nouveau serveur¶
mkdir -p ~/zabbix-export
# Copier tous les fichiers YAML exportes dans ce dossier
scp ~/zabbix-export/*.yaml debian@51.77.150.97:~/zabbix-export/
Etape 2 -- Installation du VPS et securisation¶
Mise a jour du systeme¶
sudo apt update && sudo apt full-upgrade -y
Installation des paquets¶
sudo apt install -y docker.io docker-compose-plugin ufw cockpit
Activation des services¶
sudo systemctl enable --now docker
sudo systemctl enable --now cockpit.socket
sudo usermod -aG docker debian
Reconnexion necessaire
Se deconnecter et se reconnecter pour que l'ajout au groupe Docker prenne effet.
Correction du contournement Docker/UFW¶
CRITIQUE — a faire AVANT toute autre configuration
Docker contourne UFW par defaut en manipulant directement iptables. Sans cette correction, les ports Docker sont accessibles meme si UFW les bloque.
sudo tee /etc/docker/daemon.json > /dev/null <<'EOF'
{
"iptables": false
}
EOF
sudo systemctl restart docker
Configuration UFW (firewall)¶
sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw allow ssh
sudo ufw allow 10051/tcp comment "Zabbix agents"
sudo ufw allow 9090/tcp comment "Cockpit"
sudo ufw enable
Verification UFW¶
sudo ufw status verbose
Resultat attendu :
Status: active
Default: deny (incoming), allow (outgoing)
To Action From
-- ------ ----
22/tcp ALLOW IN Anywhere
10051/tcp ALLOW IN Anywhere # Zabbix agents
9090/tcp ALLOW IN Anywhere # Cockpit
Port 10051 ouvert globalement
Le port 10051 est ouvert a tous pour permettre les connexions initiales des agents. Il sera restreint par IP source via Cockpit une fois les agents configures (etape 9).
Etape 3 -- Configuration DNS¶
Creer les enregistrements DNS dans Cloudflare (zone oxyane-na.fr) :
| Type | Nom | Valeur | Proxy |
|---|---|---|---|
| A | srza |
51.77.150.97 |
DNS only (pas de proxy orange) |
| AAAA | srza |
2001:41d0:404:200::1688 |
DNS only |
DNS only, pas Proxied
L'enregistrement DNS pour srza.oxyane-na.fr doit etre en mode DNS only (icone grise, pas orange). Le port 10051 (agents Zabbix) est du TCP brut que Cloudflare proxy ne supporte pas.
Verification¶
dig srza.oxyane-na.fr A +short
# Doit afficher : 51.77.150.97
Etape 4 -- Tunnel Cloudflare + acces Cockpit¶
Creation du tunnel¶
- Se connecter au tableau de bord Cloudflare Zero Trust : https://one.dash.cloudflare.com/
- Networks → Tunnels → Create a tunnel
- Nommer le tunnel :
srza-tunnel - Copier le token du tunnel (on en aura besoin a l'etape 5)
Configuration des routes du tunnel¶
| Hostname public | Service Type | URL du service | Options |
|---|---|---|---|
zabbix.oxyane-na.fr |
HTTP | http://zabbix-web:8443 |
— |
cockpit-srza.oxyane-na.fr |
HTTPS | https://localhost:9090 |
No TLS Verify = ON |
No TLS Verify pour Cockpit
Cockpit utilise un certificat auto-signe. L'option "No TLS Verify" dans Cloudflare tunnel permet d'accepter ce certificat sans erreur.
Test de Cockpit¶
Ouvrir dans un navigateur : https://cockpit-srza.oxyane-na.fr
Se connecter avec :
- Utilisateur : debian
- Mot de passe : le mot de passe du VPS
Si Cockpit s'affiche, la Phase A est terminee. Le reste se fait via Cockpit.
Phase B — Deploiement via Cockpit (navigateur)¶
A partir de maintenant, toutes les commandes sont a executer dans le terminal web Cockpit :
- Ouvrir
https://cockpit-srza.oxyane-na.fr - Se connecter
- Aller dans l'onglet Terminal
Etape 5 -- Variables d'environnement et Docker Compose¶
Variables d'environnement¶
Voici les variables necessaires au deploiement. Preparer les valeurs avant de creer les fichiers.
| Variable | Description | Exemple |
|---|---|---|
ZABBIX_DB_PASSWORD |
Mot de passe PostgreSQL Zabbix | Mot de passe fort (generer avec openssl rand -base64 24) |
CLOUDFLARE_TUNNEL_TOKEN |
Token du tunnel cree a l'etape 4 | eyJhIjoiNjg3... (copie depuis Cloudflare) |
Creation du fichier .env¶
Dans le terminal Cockpit :
sudo mkdir -p /opt/zabbix
sudo tee /opt/zabbix/.env > /dev/null <<'EOF'
# === Variables d'environnement Zabbix ===
# Genere avec : openssl rand -base64 24
ZABBIX_DB_PASSWORD=REMPLACER_PAR_MOT_DE_PASSE_FORT
# Token du tunnel Cloudflare (copie depuis le dashboard Zero Trust)
CLOUDFLARE_TUNNEL_TOKEN=REMPLACER_PAR_TOKEN_TUNNEL
EOF
sudo chmod 600 /opt/zabbix/.env
Securite
Le fichier .env contient les secrets. Il est en chmod 600 (lisible uniquement par root). Ne jamais le commiter dans un depot Git.
Verification¶
sudo cat /opt/zabbix/.env
Verifier que les 2 valeurs sont renseignees (pas les placeholders).
Creation du fichier Docker Compose¶
sudo tee /opt/zabbix/docker-compose.yml > /dev/null <<'COMPOSE'
services:
zabbix-db:
image: postgres:16-alpine
container_name: zabbix-db
restart: unless-stopped
environment:
POSTGRES_DB: zabbix
POSTGRES_USER: zabbix
POSTGRES_PASSWORD: ${ZABBIX_DB_PASSWORD}
volumes:
- zabbix_db_data:/var/lib/postgresql/data
networks:
- zabbix-net
healthcheck:
test: ["CMD-SHELL", "pg_isready -U zabbix"]
interval: 10s
timeout: 5s
retries: 5
labels:
- "com.centurylinklabs.watchtower.enable=false"
zabbix-server:
image: zabbix/zabbix-server-pgsql:alpine-7.2-latest
container_name: zabbix-server
restart: unless-stopped
environment:
DB_SERVER_HOST: zabbix-db
POSTGRES_DB: zabbix
POSTGRES_USER: zabbix
POSTGRES_PASSWORD: ${ZABBIX_DB_PASSWORD}
ports:
- "10051:10051"
volumes:
- zabbix_server_alertscripts:/usr/lib/zabbix/alertscripts
- zabbix_server_externalscripts:/usr/lib/zabbix/externalscripts
networks:
- zabbix-net
depends_on:
zabbix-db:
condition: service_healthy
zabbix-web:
image: zabbix/zabbix-web-nginx-pgsql:alpine-7.2-latest
container_name: zabbix-web
restart: unless-stopped
environment:
ZBX_SERVER_HOST: zabbix-server
DB_SERVER_HOST: zabbix-db
POSTGRES_DB: zabbix
POSTGRES_USER: zabbix
POSTGRES_PASSWORD: ${ZABBIX_DB_PASSWORD}
PHP_TZ: Europe/Paris
ports:
- "8443:8443"
networks:
- zabbix-net
depends_on:
- zabbix-server
zabbix-agent2:
image: zabbix/zabbix-agent2:alpine-7.2-latest
container_name: zabbix-agent2
restart: unless-stopped
environment:
ZBX_HOSTNAME: "SRZA"
ZBX_SERVER_HOST: zabbix-server
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
networks:
- zabbix-net
depends_on:
- zabbix-server
cloudflared:
image: cloudflare/cloudflared:latest
container_name: cloudflared
restart: unless-stopped
command: tunnel run
environment:
TUNNEL_TOKEN: ${CLOUDFLARE_TUNNEL_TOKEN}
networks:
- zabbix-net
networks:
zabbix-net:
driver: bridge
volumes:
zabbix_db_data:
zabbix_server_alertscripts:
zabbix_server_externalscripts:
COMPOSE
Deploiement¶
cd /opt/zabbix
sudo docker compose up -d
Verification¶
sudo docker compose ps
Tous les conteneurs doivent etre running. Attendre 30-60s que zabbix-db passe en healthy et que zabbix-server demarre.
sudo docker compose logs --tail=20 zabbix-server
# Chercher "server #0 started" dans les logs
Etape 6 -- Premier login Zabbix¶
- Ouvrir
https://zabbix.oxyane-na.fr - Identifiants par defaut :
- Login :
Admin(avec majuscule) - Mot de passe :
zabbix
Changer le mot de passe immediatement
User settings (icone utilisateur) → Change password
- Configurer la langue francaise :
- User settings → Language → French (fr_FR)
- Ou globalement : Administration → General → GUI → Default language → French (fr_FR)
Etape 7 -- Import des templates et hosts¶
Import des templates¶
- Configuration → Templates → Import (en haut a droite)
- Charger
templates_export.yaml - Cocher Create new + Update existing
- Import
Import des hosts¶
- Configuration → Hosts → Import
- Charger
hosts_export.yaml - Cocher Create new + Update existing
- Import
Verification¶
- Les templates personnalises sont presents
- Les hosts sont listes avec leurs templates assignes
- Les hosts sont en rouge (normal — les agents pointent encore vers l'ancien serveur)
Etape 8 -- Reconfiguration des 42 agents¶
Agents Docker¶
Pour chaque serveur avec un agent Docker, modifier la variable d'environnement :
# Ancien
ZBX_SERVER_HOST: ancien-serveur.example.com
# Nouveau
ZBX_SERVER_HOST: srza.oxyane-na.fr
Puis redemarrer :
sudo docker compose restart zabbix-agent2
Agents natifs (installes sur l'OS)¶
sudo nano /etc/zabbix/zabbix_agent2.conf
Modifier :
Server=srza.oxyane-na.fr
ServerActive=srza.oxyane-na.fr
Redemarrer :
sudo systemctl restart zabbix-agent2
Ajout de l'IP dans le firewall (via Cockpit)¶
Pour chaque agent reconfigure :
- Ouvrir
https://cockpit-srza.oxyane-na.fr - Networking → Firewall
- Add Rule :
- Port :
10051 - Protocol : TCP
- Source IP : IP de l'agent
- Save
Ou en ligne de commande via le terminal Cockpit :
sudo ufw allow from <IP_AGENT> to any port 10051 proto tcp comment "Agent Zabbix - <NOM_SERVEUR>"
Verification¶
Dans Zabbix : Monitoring → Hosts → l'agent doit passer au vert (icone ZBX verte).
Etape 9 -- Securisation finale du port 10051¶
Une fois tous les agents reconfigures et au vert, supprimer la regle globale qui ouvre le port 10051 a tout le monde :
# Lister les regles numerotees
sudo ufw status numbered
# Trouver la regle "10051/tcp ALLOW IN Anywhere" et la supprimer
sudo ufw delete <numero_de_la_regle>
Verifier que seules les regles par IP restent :
sudo ufw status verbose
Resultat attendu
Le port 10051 ne doit etre ouvert QUE pour les IPs des agents, plus en global.
Etape 10 -- Validation¶
Checklist¶
- Zabbix web accessible via
https://zabbix.oxyane-na.fr - Cockpit accessible via
https://cockpit-srza.oxyane-na.fr - Mot de passe Admin change
- Templates personnalises importes
- Hosts importes
- Au moins 1 agent connecte et au vert
- Port 10051 accessible depuis les agents (
telnet srza.oxyane-na.fr 10051) - UFW actif avec regles correctes
- Docker/UFW bypass corrige (
cat /etc/docker/daemon.json)
Test de connectivite depuis un agent¶
telnet srza.oxyane-na.fr 10051
# Doit se connecter sans timeout
Etape 11 -- Couper l'ancien serveur¶
- Attendre 48h avec les deux serveurs en parallele
- Verifier que les 42 agents sont au vert sur le nouveau serveur
- Verifier qu'aucune alerte n'est manquee
- Couper l'ancien VPS
- Attendre 24h supplementaires
- Si OK, supprimer l'ancien VPS chez l'hebergeur
Sauvegarde
Conserver un snapshot de l'ancien VPS pendant 30 jours apres la migration.
Depannage¶
| Probleme | Cause probable | Solution |
|---|---|---|
| Agent "Unavailable" (rouge) | IP non autorisee dans UFW | Ajouter l'IP via Cockpit → Firewall |
| Agent "Unavailable" (rouge) | DNS non resolu | dig srza.oxyane-na.fr depuis l'agent |
| "Get value from agent failed" | Agent pointe vers l'ancien serveur | Verifier Server= dans la config agent |
| Interface web inaccessible | Tunnel Cloudflare | sudo docker compose logs cloudflared |
| Conteneurs restart loop | Erreur config/dependance | sudo docker compose logs <conteneur> |
| Erreur BDD | Mot de passe .env incorrect | Verifier /opt/zabbix/.env et redemarrer |
| Port 10051 inaccessible | UFW ou Docker bypass | cat /etc/docker/daemon.json + sudo ufw status |
Cockpit -- Reference rapide¶
Acces¶
- URL :
https://cockpit-srza.oxyane-na.fr - Utilisateur :
debian
Gestion du firewall¶
- Networking → Firewall
- Add Rule : port, protocol, source IP
- Les regles sont persistantes (sauvees dans UFW)
Verification des regles¶
sudo ufw status numbered
Suppression d'une regle¶
- Cockpit : Networking → Firewall → supprimer la regle
- Ou CLI :
sudo ufw delete <numero>
Terminal web¶
L'onglet Terminal de Cockpit donne un shell complet — equivalent a SSH dans le navigateur. Toutes les commandes Docker, UFW, apt sont disponibles.
Mises a jour¶
Zabbix (Docker)¶
Modifier les tags d'image dans /opt/zabbix/docker-compose.yml :
# Exemple : passer de 7.2 a 7.4
sudo sed -i 's/alpine-7.2-latest/alpine-7.4-latest/g' /opt/zabbix/docker-compose.yml
cd /opt/zabbix
sudo docker compose pull
sudo docker compose down
sudo docker compose up -d
Toujours consulter les notes de version Zabbix avant une montee de version.
Cockpit¶
sudo apt update && sudo apt upgrade cockpit -y
OS¶
sudo apt update && sudo apt full-upgrade -y
sudo reboot
Apres reboot, verifier les conteneurs :
cd /opt/zabbix && sudo docker compose ps
Voir aussi¶
- fiche-srza -- Fiche d'identification du serveur SRZA
- Documentation Zabbix 7.2 : https://www.zabbix.com/documentation/7.2/
- Documentation Cockpit : https://cockpit-project.org/documentation
- Documentation Cloudflare Tunnels : https://developers.cloudflare.com/cloudflare-one/connections/connect-networks/