Моя шпаргалка :)

Мануалы и настройки => Настройки *nix (почта, web, система etc) => Тема начата: George от Май 22, 2026, 01:56

Название: Автоматическое обновление Docker-ноды (APT + reboot + возврат из maintenance)
Отправлено: George от Май 22, 2026, 01:56
Автоматическое обновление Docker-ноды (APT + reboot + возврат из maintenance)

Описание
Скрипт выполняет:

---

1. Создание скрипта

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

---

2. systemd service

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

---

3. systemd timer

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

---

4. Активация

systemctl daemon-reload
systemctl enable --now docker-apt-upgrade.timer
systemctl enable docker-apt-upgrade.service

---

Результат
Название: От: Автоматическое обновление Docker-ноды (APT + reboot + возврат из maintenance)
Отправлено: George от Май 22, 2026, 02:03
Мониторинг (минимальный, но рабочий)

1. Лог-файл

Docker:
tail -f /var/log/docker-apt-upgrade.log

HAProxy:
tail -f /var/log/haproxy-upgrade.log

---

2. Проверка через systemd

systemctl status docker-apt-upgrade.service
systemctl status haproxy-upgrade.service

---

3. Уведомление в Telegram (простой вариант)

Добавить в конец скрипта:

curl -s -X POST https://api.telegram.org/botTOKEN/sendMessage
-d chat_id=CHAT_ID
-d text="Upgrade done on $(hostname)"

---

4. Проверка кластера после обновления

Docker:
docker node ls
docker service ls

---

5. Health endpoint (если нет)

echo OK | nc -l -p 8080

или через nginx.

---

Результат
Название: От: Автоматическое обновление Docker-ноды (APT + reboot + возврат из maintenance)
Отправлено: George от Май 22, 2026, 03:10
Автообновление Docker-ноды с Galera (без потери кворума)

Описание
Скрипт выполняет:

---

⚠️ ВАЖНО

---

1. Скрипт

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 ====="

---

2. systemd service

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

---

3. systemd timer

nano /etc/systemd/system/docker-galera-upgrade.timer

[Unit]
Description=Node upgrade timer

[Timer]
OnCalendar=*-*-* 04:00:00
Persistent=true

[Install]
WantedBy=timers.target

---

4. Активация

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

---