#!/bin/bash # # docker-zalohy.sh - zaloha Docker Compose projektu a jejich dat (./data adresaru) # na NAS (nebo jiny backup disk) + Telegram notifikace. # # Spust jednou rucne: bash docker-zalohy.sh # Spust automaticky: systemd timer docker-zalohy.timer (kazde utery 20:00) # # Konfigurace: /home/mates/.telegram.conf # Log: /home/mates/zalohy/docker/docker.log # set -euo pipefail # === KONFIGURACE === USER_NAME="mates" WORK_DIR="/home/$USER_NAME" SOURCE_DIR="$WORK_DIR/docker" BACKUP_DIR="$WORK_DIR/zalohy/docker" LOG_FILE="$BACKUP_DIR/docker.log" CONFIG_FILE="$WORK_DIR/.telegram.conf" # Seznam sluzeb k zalohovani (uprav podle potreby) APP_DIRS=( audiobookshelf calibre-web flatnotes homeassistant jswiki miniflux nginx plex speedtest vaultwarden wiki glance ) DATE_DIR=$(date +"%Y%m%d") TIMESTAMP=$(date +"%H%M%S") HOST=$(hostname) # === 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 "[$(date '+%Y-%m-%d %H:%M:%S')] Telegram neni nakonfigurovan, preskakuji" >> "$LOG_FILE" 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 "[$(date '+%Y-%m-%d %H:%M:%S')] ️ Telegram chyba" >> "$LOG_FILE" } # === HLAVNI LOGIKA === mkdir -p "$BACKUP_DIR/$DATE_DIR" START_TIME=$(date +%s) ZALOHOVANO=() CHYBY=() for APP in "${APP_DIRS[@]}"; do APP_PATH="$SOURCE_DIR/$APP" if [[ ! -d "$APP_PATH" ]]; then continue fi cd "$APP_PATH" # Pokud existuje data/ adresar, zalohuj ho if [[ -d "./data" ]]; then BACKUP_FILE="$BACKUP_DIR/$DATE_DIR/${APP}-${TIMESTAMP}.tar.zst" if tar --zstd -cf "$BACKUP_FILE" -C "$APP_PATH" data 2>>"$LOG_FILE"; then ZALOHOVANO+=("$APP ($(du -h "$BACKUP_FILE" | cut -f1))") else CHYBY+=("$APP") fi fi done END_TIME=$(date +%s) DURATION=$((END_TIME - START_TIME)) if [[ ${#CHYBY[@]} -eq 0 ]]; then send_msg " *[$HOST]* Docker zalohy dokonceny (${DURATION}s). Zalohovano: ${#ZALOHOVANO[@]} sluzeb Adresar: \`$BACKUP_DIR/$DATE_DIR\`" else send_msg "️ *[$HOST]* Docker zalohy dokonceny s chybami. Zalohovano: ${#ZALOHOVANO[@]} Chyby: ${CHYBY[*]}" fi exit 0