nano /usr/local/sbin/docker-apt-upgrade.sh
#!/bin/bash
set -euo pipefail
export DEBIAN_FRONTEND=noninteractive
LOG="/var/log/docker-apt-upgrade.log"
STATE_FILE="/var/run/docker-upgrade.state"
NODE=$(hostname)
log() {
echo "[$(date '+%F %T')] $*" | tee -a "$LOG"
}
log "===== START DOCKER NODE UPGRADE ====="
if docker info 2>/dev/null | grep -q "Swarm: active"; then
SWARM=1
else
SWARM=0
fi
if [ -f "$STATE_FILE" ]; then
log "Post-reboot detected → restoring node"
```
if [ "$SWARM" -eq 1 ]; then
docker node update --availability active "$NODE" || true
fi
rm -f "$STATE_FILE"
exit 0
```
fi
if [ "$SWARM" -eq 1 ]; then
docker node update --availability drain "$NODE"
fi
touch "$STATE_FILE"
apt update >> "$LOG" 2>&1
apt upgrade -y >> "$LOG" 2>&1
if [ -f /var/run/reboot-required ]; then
reboot
fi
if [ "$SWARM" -eq 1 ]; then
docker node update --availability active "$NODE"
fi
rm -f "$STATE_FILE"
chmod +x /usr/local/sbin/docker-apt-upgrade.sh
nano /etc/systemd/system/docker-apt-upgrade.service
[Unit]
Description=Docker node upgrade
After=network-online.target docker.service
Requires=docker.service
[Service]
Type=oneshot
ExecStart=/usr/local/sbin/docker-apt-upgrade.sh
[Install]
WantedBy=multi-user.target
nano /etc/systemd/system/docker-apt-upgrade.timer
[Unit]
Description=Docker node upgrade timer
[Timer]
OnCalendar=*-*-* 03:30:00
Persistent=true
[Install]
WantedBy=timers.target
systemctl daemon-reload
systemctl enable --now docker-apt-upgrade.timer
systemctl enable docker-apt-upgrade.service
tail -f /var/log/docker-apt-upgrade.log
tail -f /var/log/haproxy-upgrade.log
systemctl status docker-apt-upgrade.service
systemctl status haproxy-upgrade.service
curl -s -X POST https://api.telegram.org/botTOKEN/sendMessage
-d chat_id=CHAT_ID
-d text="Upgrade done on $(hostname)"
docker node ls
docker service ls
echo OK | nc -l -p 8080
nano /usr/local/sbin/docker-galera-upgrade.sh
#!/bin/bash
set -euo pipefail
export DEBIAN_FRONTEND=noninteractive
LOG="/var/log/docker-galera-upgrade.log"
STATE_FILE="/var/run/docker-galera-upgrade.state"
NODE=$(hostname)
log() {
echo "[$(date '+%F %T')] $*" | tee -a "$LOG"
}
log "===== START NODE UPGRADE (DOCKER + GALERA) ====="
# --- функции Galera ---
galera_size() {
mysql -Nse "SHOW STATUS LIKE 'wsrep_cluster_size'" | awk '{print $2}'
}
galera_ready() {
mysql -Nse "SHOW STATUS LIKE 'wsrep_ready'" | grep -q ON
}
# --- swarm check ---
if docker info 2>/dev/null | grep -q "Swarm: active"; then
SWARM=1
else
SWARM=0
fi
# --- POST REBOOT ---
if [ -f "$STATE_FILE" ]; then
log "Post-reboot stage"
```
# ждём Galera
until galera_ready; do
log "Waiting Galera..."
sleep 5
done
# возвращаем Docker
if [ "$SWARM" -eq 1 ]; then
docker node update --availability active "$NODE" || true
fi
rm -f "$STATE_FILE"
log "Node restored"
exit 0
```
fi
# --- PRECHECK Galera ---
SIZE=$(galera_size)
if [ "$SIZE" -le 1 ]; then
log "Cluster size too small → abort"
exit 1
fi
log "Galera size OK: $SIZE"
# --- drain docker ---
if [ "$SWARM" -eq 1 ]; then
docker node update --availability drain "$NODE"
fi
# --- graceful Galera leave ---
log "Stopping MariaDB (leave cluster)"
systemctl stop mariadb
touch "$STATE_FILE"
# --- upgrade ---
apt update >> "$LOG" 2>&1
apt upgrade -y >> "$LOG" 2>&1
# --- reboot ---
if [ -f /var/run/reboot-required ]; then
reboot
fi
# --- start MariaDB ---
systemctl start mariadb
# ждём Galera
until galera_ready; do
sleep 5
done
# --- restore docker ---
if [ "$SWARM" -eq 1 ]; then
docker node update --availability active "$NODE"
fi
rm -f "$STATE_FILE"
log "===== DONE ====="
nano /etc/systemd/system/docker-galera-upgrade.service
[Unit]
Description=Docker + Galera node upgrade
After=network-online.target docker.service mariadb.service
Requires=docker.service mariadb.service
[Service]
Type=oneshot
ExecStart=/usr/local/sbin/docker-galera-upgrade.sh
[Install]
WantedBy=multi-user.target
nano /etc/systemd/system/docker-galera-upgrade.timer
[Unit]
Description=Node upgrade timer
[Timer]
OnCalendar=*-*-* 04:00:00
Persistent=true
[Install]
WantedBy=timers.target
systemctl daemon-reload
systemctl enable --now docker-galera-upgrade.timer
systemctl enable docker-galera-upgrade.service
mysql -e "SHOW STATUS LIKE 'wsrep_cluster_size';"
docker node ls