Files
mates-server-maintenance/scripts/docker-update.sh
T
mates fba29e5171 feat: systemd timery + skripty pro udrzbu serveru
Skripty (4):
- update.sh: apt update + upgrade + restart kdyz nutny + Telegram
- docker-update.sh: docker compose pull + up -d pro vsechny sluzby
- docker-zalohy.sh: tar.zst zaloha data/ adresaru na NAS
- server-report.sh: denni Telegram report (uptime, RAM, disk, Docker)

Systemd (8 - 4x service + 4x timer):
- docker-update: kazdou sobotu 18:00
- docker-zalohy: kazde utery 20:00
- server-report: kazdy den 09:30
- update-rpi: kazdy patek 18:00

Konfigurace:
- conf/telegram.conf.example: sablona pro Telegram credentials
- vsechny skripty ctou z /home/<user>/.telegram.conf (chmod 600)

Poznamka:
- vsechny cesty (/home/mates) a hostname jsou pevne v service souborech
- pro jineho uzivatele uprav User=, WorkingDirectory=, ExecStart=
- zadne IP adresy, tokeny ani PII v gitu
2026-08-01 22:26:40 +02:00

123 lines
3.1 KiB
Bash

#!/bin/bash
#
# docker-update.sh - aktualizace Docker Compose projektu na tomto serveru
# (docker compose pull + up -d) + Telegram notifikace.
#
# Spust jednou rucne: bash docker-update.sh
# Spust automaticky: systemd timer docker-update.timer (kazdou sobotu 18:00)
#
# Konfigurace: /home/mates/.telegram.conf
# Log: /home/mates/skripty/update-docker-script/docker-update.log
#
set -euo pipefail
# === KONFIGURACE ===
USER_NAME="mates"
WORK_DIR="/home/$USER_NAME"
ZAKLADNI_SLOZKA="$WORK_DIR/docker"
LOG="$WORK_DIR/skripty/update-docker-script/docker-update.log"
CONFIG_FILE="$WORK_DIR/.telegram.conf"
DATUM=$(date '+%Y-%m-%d %H:%M:%S')
HOST=$(hostname)
# Seznam sluzeb k aktualizaci (uprav podle potreby)
AKTUALIZOVAT=(
audiobookshelf
calibre-web
glance
homeassistant
jswiki
plex
portainer
rustdesk
speedtest
vaultwarden
nginx
)
# === TELEGRAM KONFIGURACE ===
if [[ -f "$CONFIG_FILE" ]]; then
# shellcheck disable=SC1090
source "$CONFIG_FILE"
fi
TELEGRAM_BOT_TOKEN="${TELEGRAM_BOT_TOKEN:-}"
TELEGRAM_CHAT_ID="${TELEGRAM_CHAT_ID:-}"
# === TELEGRAM HELPER ===
send_msg() {
local TEXT="$1"
if [[ -z "$TELEGRAM_BOT_TOKEN" || -z "$TELEGRAM_CHAT_ID" ]]; then
echo "$DATUM ⚠️ Telegram neni nakonfigurovan, preskakuji" >> "$LOG"
return 0
fi
curl -s -X POST "https://api.telegram.org/bot${TELEGRAM_BOT_TOKEN}/sendMessage" \
-d chat_id="${TELEGRAM_CHAT_ID}" \
-d text="$TEXT" \
-d parse_mode="Markdown" \
--max-time 10 \
--retry 3 > /dev/null || echo "$DATUM ⚠️ Telegram chyba" >> "$LOG"
}
# === HLAVNI LOGIKA ===
echo "$DATUM === docker-update.sh spusten ===" >> "$LOG"
send_msg "🔄 *[$HOST]* Spoustim aktualizaci Docker kontejneru..."
# Vytvor log adresar pokud neexistuje
mkdir -p "$(dirname "$LOG")"
AKTUALIZOVANO=()
CHYBY=()
for SLUZBA in "${AKTUALIZOVAT[@]}"; do
SLUZBA_PATH="$ZAKLADNI_SLOZKA/$SLUZBA"
if [[ ! -d "$SLUZBA_PATH" ]]; then
echo "$DATUM SKIP: $SLUZBA (slozka neexistuje)" >> "$LOG"
continue
fi
if [[ ! -f "$SLUZBA_PATH/docker-compose.yml" ]]; then
echo "$DATUM SKIP: $SLUZBA (docker-compose.yml chybi)" >> "$LOG"
continue
fi
echo "$DATUM === Aktualizuji: $SLUZBA ===" >> "$LOG"
cd "$SLUZBA_PATH"
# Stahnout nove image
if docker compose pull 2>>"$LOG"; then
# Restart s novym image
if docker compose up -d 2>>"$LOG"; then
AKTUALIZOVANO+=("$SLUZBA")
echo "$DATUM OK: $SLUZBA aktualizovan" >> "$LOG"
else
CHYBY+=("$SLUZBA (up)")
echo "$DATUM CHYBA: $SLUZBA - up -d selhalo" >> "$LOG"
fi
else
CHYBY+=("$SLUZBA (pull)")
echo "$DATUM CHYBA: $SLUZBA - pull selhalo" >> "$LOG"
fi
done
# === SOUHRN ===
POCET_OK=${#AKTUALIZOVANO[@]}
POCET_CHYB=${#CHYBY[@]}
if [[ $POCET_CHYB -eq 0 ]]; then
send_msg "✅ *[$HOST]* Docker aktualizace dokoncena.
Aktualizovano: $POCET_OK sluzeb
Seznam: ${AKTUALIZOVANO[*]}"
else
send_msg "⚠️ *[$HOST]* Docker aktualizace dokoncena s chybami.
Aktualizovano: $POCET_OK
Chyby: ${CHYBY[*]}"
fi
echo "$DATUM === docker-update.sh dokoncen ===" >> "$LOG"
exit 0