Aller au contenu

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

  1. Se connecter a l'interface web de l'ancien Zabbix
  2. Aller dans ConfigurationTemplates
  3. Cocher les templates personnalises (non fournis par defaut)
  4. Cliquer sur Export en bas de page → Format YAML
  5. Sauvegarder le fichier templates_export.yaml

Export des hosts

  1. Aller dans ConfigurationHosts
  2. Selectionner tous les hosts
  3. Cliquer sur Export → Format YAML
  4. Sauvegarder le fichier hosts_export.yaml

Export des elements complementaires

Exporter egalement si des personnalisations ont ete faites :

  • AdministrationMedia types → selectionner → Export (YAML)
  • ConfigurationActions → selectionner → Export (YAML)
  • AdministrationUser 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

  1. Se connecter au tableau de bord Cloudflare Zero Trust : https://one.dash.cloudflare.com/
  2. NetworksTunnelsCreate a tunnel
  3. Nommer le tunnel : srza-tunnel
  4. 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 :

  1. Ouvrir https://cockpit-srza.oxyane-na.fr
  2. Se connecter
  3. 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

  1. Ouvrir https://zabbix.oxyane-na.fr
  2. Identifiants par defaut :
  3. Login : Admin (avec majuscule)
  4. Mot de passe : zabbix

Changer le mot de passe immediatement

User settings (icone utilisateur) → Change password

  1. Configurer la langue francaise :
  2. User settingsLanguageFrench (fr_FR)
  3. Ou globalement : AdministrationGeneralGUIDefault languageFrench (fr_FR)

Etape 7 -- Import des templates et hosts

Import des templates

  1. ConfigurationTemplatesImport (en haut a droite)
  2. Charger templates_export.yaml
  3. Cocher Create new + Update existing
  4. Import

Import des hosts

  1. ConfigurationHostsImport
  2. Charger hosts_export.yaml
  3. Cocher Create new + Update existing
  4. 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 :

  1. Ouvrir https://cockpit-srza.oxyane-na.fr
  2. NetworkingFirewall
  3. Add Rule :
  4. Port : 10051
  5. Protocol : TCP
  6. Source IP : IP de l'agent
  7. 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 : MonitoringHosts → 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

  1. Attendre 48h avec les deux serveurs en parallele
  2. Verifier que les 42 agents sont au vert sur le nouveau serveur
  3. Verifier qu'aucune alerte n'est manquee
  4. Couper l'ancien VPS
  5. Attendre 24h supplementaires
  6. 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

  1. NetworkingFirewall
  2. Add Rule : port, protocol, source IP
  3. Les regles sont persistantes (sauvees dans UFW)

Verification des regles

sudo ufw status numbered

Suppression d'une regle

  1. Cockpit : NetworkingFirewall → supprimer la regle
  2. 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/