
Pri Docker kontajneroch nie je samotná aktualizácia zložitá, ale pred každým update je dobré myslieť aj na zálohu a základnú kontrolu služieb.
Úvod
V tomto článku si ukážeme dva jednoduché Bash skripty, ktoré používam na aktualizáciu Zabbixu a Graylogu. Skripty pred samotnou aktualizáciou vytvoria zálohu databázy a až následne aktualizujú príslušné Docker kontajnery.
1. Prečo používať vlastný update skript
Vlastný aktualizačný skript nám môže celý proces výrazne zjednodušiť:
- pred aktualizáciou sa automaticky vytvorí záloha,
- skript overí, či záloha skutočne vznikla,
- aktualizujú sa iba požadované kontajnery,
- nemusíme si pamätať jednotlivé Docker príkazy,
- celý update spustíme jedným príkazom.
2. Aktualizácia Zabbixu
Pre Zabbix vytvoríme skript:
nano /usr/local/bin/update-zabbix.sh
Do súboru vložíme
#!/bin/bash
set -e
BACKUP_DIR="/home/ivan/zabbix/backups"
BACKUP_FILE="$BACKUP_DIR/zabbix-before-update-$(date +%F-%H%M).sql"
KEEP_BACKUPS=3
mkdir -p "$BACKUP_DIR"
echo "=== Zabbix DB backup ==="
echo "Backup: $BACKUP_FILE"
docker exec zabbix-mariadb sh -c \
'mariadb-dump -uroot -p"$MYSQL_ROOT_PASSWORD" --single-transaction --routines --triggers zabbix' \
> "$BACKUP_FILE"
if [ ! -s "$BACKUP_FILE" ]; then
echo "CHYBA: backup je prazdny. Update sa nespusti."
rm -f "$BACKUP_FILE"
exit 1
fi
if ! tail -n 20 "$BACKUP_FILE" | grep -q "Dump completed"; then
echo "CHYBA: backup nevyzera byt korektne dokonceny. Update sa nespusti."
rm -f "$BACKUP_FILE"
exit 1
fi
echo "Backup OK:"
ls -lh "$BACKUP_FILE"
echo
echo "=== Zabbix update ==="
docker run --rm \
-v /var/run/docker.sock:/var/run/docker.sock \
-e WATCHTOWER_NOTIFICATION_URL=/notify/notification-url.txt \
-e WATCHTOWER_NOTIFICATION_REPORT=true \
-e WATCHTOWER_NOTIFICATION_TEMPLATE_FILE=/notify/update-template.txt \
-e WATCHTOWER_NOTIFICATIONS_HOSTNAME=zabbix-10.10.8.5 \
-v /etc/watchtower-notify/notification-url.txt:/notify/notification-url.txt:ro \
-v /etc/watchtower-notify/update-template.txt:/notify/update-template.txt:ro \
nickfedor/watchtower:latest \
--run-once \
zabbix-server zabbix-web
echo
echo "=== Cistenie starych backupov ==="
mapfile -t OLD_BACKUPS < <(
find "$BACKUP_DIR" \
-maxdepth 1 \
-type f \
-name 'zabbix-before-update-*.sql' \
-printf '%T@ %p\n' \
| sort -rn \
| tail -n +"$((KEEP_BACKUPS + 1))" \
| cut -d' ' -f2-
)
if [ "${#OLD_BACKUPS[@]}" -gt 0 ]; then
printf 'Mazem: %s\n' "${OLD_BACKUPS[@]}"
rm -f -- "${OLD_BACKUPS[@]}"
else
echo "Nie su ziadne stare backupy na zmazanie."
fi
echo
echo "=== Aktualne backupy ==="
ls -lh "$BACKUP_DIR"
echo
echo "=== Hotovo ==="
echo "Novy backup:"
echo "$BACKUP_FILE"
Následne skriptu nastavíme právo na spustenie:
sudo chmod +x /usr/local/bin/update-zabbix.sh
Syntax môžeme pred prvým spustením overiť:
sudo bash -n /usr/local/bin/update-zabbix.sh
Ak sa nezobrazí žiadna chyba, skript môžeme spustiť:
sudo /usr/local/bin/update-zabbix.sh
Skript najskôr vytvorí zálohu databázy MariaDB. Ak je backup prázdny alebo sa dump nedokončí korektne, aktualizácia sa nespustí.
Až po úspešnej kontrole zálohy sa pomocou Watchtower aktualizujú kontajnery:
zabbix-serverzabbix-web
3. Aktualizácia Graylogu
Podobný princíp môžeme použiť aj pre Graylog.
Vytvoríme skript:
sudo nano /usr/local/bin/update-graylog.sh
Do súboru vložíme:
#!/bin/bash
set -e
GRAYLOG_DIR="/home/ivan/graylog"
BACKUP_DIR="$GRAYLOG_DIR/backups"
BACKUP_FILE="$BACKUP_DIR/graylog-mongodb-before-update-$(date +%F-%H%M).archive"
KEEP_BACKUPS=3
mkdir -p "$BACKUP_DIR"
echo "=== Graylog MongoDB backup ==="
echo "Backup: $BACKUP_FILE"
docker exec graylog-mongodb \
mongodump \
--archive=/tmp/graylog-backup.archive \
--gzip
docker cp \
graylog-mongodb:/tmp/graylog-backup.archive \
"$BACKUP_FILE"
docker exec graylog-mongodb \
rm -f /tmp/graylog-backup.archive
if [ ! -s "$BACKUP_FILE" ]; then
echo "CHYBA: backup je prazdny. Update sa nespusti."
rm -f "$BACKUP_FILE"
exit 1
fi
echo "Backup OK:"
ls -lh "$BACKUP_FILE"
echo
echo "=== Graylog update ==="
cd "$GRAYLOG_DIR"
docker-compose pull graylog datanode
docker-compose up -d graylog datanode
echo
echo "=== Stav Graylog kontajnerov ==="
docker ps \
--format 'table {{.Names}}\t{{.Image}}\t{{.Status}}' \
| grep -E 'graylog|datanode'
echo
echo "=== Cistenie starych backupov ==="
mapfile -t OLD_BACKUPS < <(
find "$BACKUP_DIR" \
-maxdepth 1 \
-type f \
-name 'graylog-mongodb-before-update-*.archive' \
-printf '%T@ %p\n' \
| sort -rn \
| tail -n +"$((KEEP_BACKUPS + 1))" \
| cut -d' ' -f2-
)
if [ "${#OLD_BACKUPS[@]}" -gt 0 ]; then
printf 'Mazem: %s\n' "${OLD_BACKUPS[@]}"
rm -f -- "${OLD_BACKUPS[@]}"
else
echo "Nie su ziadne stare backupy na zmazanie."
fi
echo
echo "=== Aktualne backupy ==="
ls -lh "$BACKUP_DIR"
echo
echo "=== Hotovo ==="
echo "Novy backup:"
echo "$BACKUP_FILE"
Aj tomuto skriptu nastavíme právo na spustenie:
sudo chmod +x /usr/local/bin/update-graylog.sh
A overíme syntax:
sudo bash -n /usr/local/bin/update-graylog.sh
Ak nevypíše nič, tak syntax je správny a môžemespustiť skript.
Aktualizáciu následne spustíme:
sudo /usr/local/bin/update-graylog.sh
Skript najskôr pomocou mongodump vytvorí zálohu MongoDB.
Po úspešnom vytvorení backupu aktualizuje iba služby:
graylogdatanode
MongoDB kontajner sa pri tejto aktualizácii nemení.
4. Kontrola po aktualizácii
Po aktualizácii je dobré vždy overiť stav kontajnerov.
Pre Graylog môžeme použiť:
sudo docker ps --format 'table {{.Names}}\t{{.Status}}' | grep graylog
Ak chceme skontrolovať log:
sudo docker logs graylog --tail 100
Pri správnom štarte by mal Graylog po chvíli prejsť do stavu:
healthy
Rovnaký princíp môžeme použiť aj pri ostatných Docker službách.
Záver
Takýmto spôsobom máme aktualizáciu Zabbixu aj Graylogu zjednodušenú na jeden príkaz a zároveň máme pred každou aktualizáciou vytvorenú aktuálnu zálohu databázy.
Pri Zabbixe sa pred update vytvorí SQL dump MariaDB a pri Graylogu záloha MongoDB. Ak záloha nevznikne správne, aktualizácia sa nespustí.
Je to jednoduché riešenie, ale pri pravidelnej údržbe Docker servera dokáže ušetriť množstvo času a zároveň znižuje riziko, že na zálohu pred aktualizáciou zabudneme.















