Add OpenClaw, backup automation, health checks, Telegram notifications
Deploy Dashboard / deploy (push) Failing after 1m52s
Deploy Dashboard / deploy (push) Failing after 1m52s
Phase 6: OpenClaw docker-compose (port 3100) with health check Phase 9: Enhanced backup.sh with full DB/config coverage + Telegram alerts Phase 10: Health checks on all compose files, /api/system/notify endpoint
This commit is contained in:
@@ -1,63 +1,73 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Configuration
|
||||
# NAS Backup Script — runs daily via cron
|
||||
# Crontab: 0 3 * * * /volume1/docker/nas-tools/backup.sh >> /volume1/backups/nas-tools/backup.log 2>&1
|
||||
|
||||
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
|
||||
BACKUP_DIR="/volume1/backups/nas-tools"
|
||||
DATE=$(date +%Y%m%d_%H%M%S)
|
||||
RETENTION_DAYS=7
|
||||
ERRORS=0
|
||||
|
||||
[ -f "$SCRIPT_DIR/.env" ] && source "$SCRIPT_DIR/.env"
|
||||
|
||||
# Ensure backup directory exists
|
||||
mkdir -p "$BACKUP_DIR"
|
||||
|
||||
log() {
|
||||
echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1"
|
||||
log() { echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1"; }
|
||||
|
||||
notify() {
|
||||
if [ -n "$TELEGRAM_BOT_TOKEN" ] && [ -n "$TELEGRAM_CHAT_ID" ]; then
|
||||
curl -s -X POST "https://api.telegram.org/bot${TELEGRAM_BOT_TOKEN}/sendMessage" \
|
||||
-d chat_id="$TELEGRAM_CHAT_ID" -d text="$1" -d parse_mode="Markdown" > /dev/null
|
||||
fi
|
||||
}
|
||||
|
||||
log "Starting backup..."
|
||||
run_backup() {
|
||||
local desc="$1"; shift
|
||||
log "Backing up $desc..."
|
||||
if "$@"; then
|
||||
log "$desc OK"
|
||||
else
|
||||
log "FAILED: $desc"
|
||||
ERRORS=$((ERRORS + 1))
|
||||
fi
|
||||
}
|
||||
|
||||
# 1. Database Dumps
|
||||
log "Dumping databases..."
|
||||
log "=== Backup started ==="
|
||||
|
||||
# Gitea DB
|
||||
docker exec gitea-db pg_dump -U gitea gitea > "$BACKUP_DIR/gitea_db_$DATE.sql"
|
||||
if [ $? -eq 0 ]; then
|
||||
log "Gitea DB dumped successfully."
|
||||
else
|
||||
log "Error dumping Gitea DB!"
|
||||
# Database dumps
|
||||
run_backup "Gitea DB" docker exec gitea-db pg_dump -U gitea -f /tmp/gitea_dump.sql gitea
|
||||
docker cp gitea-db:/tmp/gitea_dump.sql "$BACKUP_DIR/gitea_db_$DATE.sql" 2>/dev/null
|
||||
|
||||
run_backup "Immich DB" docker exec immich-db pg_dump -U postgres -f /tmp/immich_dump.sql immich
|
||||
docker cp immich-db:/tmp/immich_dump.sql "$BACKUP_DIR/immich_db_$DATE.sql" 2>/dev/null
|
||||
|
||||
# Config backups
|
||||
CONFIGS=()
|
||||
for p in \
|
||||
/volume1/docker/nas-dashboard/.env \
|
||||
/volume1/docker/nas-dashboard/auth.json \
|
||||
/volume1/docker/gitea/conf \
|
||||
/volume1/docker/immich/.env \
|
||||
/volume1/docker/navidrome/data/navidrome.db \
|
||||
/volume1/docker/openclaw/data; do
|
||||
[ -e "$p" ] && CONFIGS+=("$p")
|
||||
done
|
||||
|
||||
if [ ${#CONFIGS[@]} -gt 0 ]; then
|
||||
run_backup "Configs" tar -czf "$BACKUP_DIR/configs_$DATE.tar.gz" "${CONFIGS[@]}"
|
||||
fi
|
||||
|
||||
# Immich DB
|
||||
docker exec immich-db pg_dump -U postgres immich > "$BACKUP_DIR/immich_db_$DATE.sql"
|
||||
if [ $? -eq 0 ]; then
|
||||
log "Immich DB dumped successfully."
|
||||
# Cleanup old backups
|
||||
log "Cleaning backups older than $RETENTION_DAYS days..."
|
||||
find "$BACKUP_DIR" -type f \( -name "*.sql" -o -name "*.tar.gz" \) -mtime +$RETENTION_DAYS -delete
|
||||
|
||||
# Summary
|
||||
log "=== Backup finished ($ERRORS errors) ==="
|
||||
|
||||
if [ $ERRORS -gt 0 ]; then
|
||||
notify "🔴 *NAS Backup FAILED* ($DATE)
|
||||
$ERRORS error(s) — check logs"
|
||||
else
|
||||
log "Error dumping Immich DB!"
|
||||
notify "🟢 *NAS Backup OK* ($DATE)"
|
||||
fi
|
||||
|
||||
# 2. File Backups (Configs & Data)
|
||||
# Exclude heavy media files if handled separately, but for now backing up key configs
|
||||
log "Compressing configuration files..."
|
||||
|
||||
# Dashboard & Gitea & Immich configs
|
||||
# Assuming /volume1/docker structure
|
||||
tar -czf "$BACKUP_DIR/configs_$DATE.tar.gz" \
|
||||
-C /volume1/docker \
|
||||
nas-dashboard/backend/config.py \
|
||||
nas-dashboard/.env \
|
||||
gitea/conf \
|
||||
immich/.env \
|
||||
--exclude='gitea/data' \
|
||||
--exclude='immich/upload' \
|
||||
--exclude='immich/thumbs'
|
||||
|
||||
if [ $? -eq 0 ]; then
|
||||
log "Configs compressed successfully."
|
||||
else
|
||||
log "Error compressing configs!"
|
||||
fi
|
||||
|
||||
# 3. Cleanup Old Backups
|
||||
log "Cleaning up backups older than $RETENTION_DAYS days..."
|
||||
find "$BACKUP_DIR" -type f -name "*_db_*.sql" -mtime +$RETENTION_DAYS -delete
|
||||
find "$BACKUP_DIR" -type f -name "configs_*.tar.gz" -mtime +$RETENTION_DAYS -delete
|
||||
|
||||
log "Backup completed."
|
||||
|
||||
Reference in New Issue
Block a user