#!/usr/bin/env bash
set -Eeuo pipefail
# Uses SQLite Online Backup API
# Logs to journal
# View the logs with journalctl -t weewx-backup --since "1 hour ago"
#
# Add to crontab to run daily at 2 AM:
# 0 2 * * * /usr/bin/env bash /usr/local/bin/weewx-backup.sh
#
DB="/var/lib/weewx/weewx.sdb"
BACKUPDIR="/var/tmp/wxbackups"
TIMESTAMP="$(date +%Y%m%d-%H%M%S)"
BACKUP_PATH="${BACKUPDIR}/weewx-${TIMESTAMP}.sdb"
ARCHIVE_PATH="${BACKUP_PATH}.gz"
mkdir -p "$BACKUPDIR"
exec 1> >(logger -t weewx-backup) 2>&1
log() {
echo "[$(date -Is)] $*"
}
log "Starting weewx backup"
if [ ! -f "$DB" ]; then
log "ERROR: database not found: $DB"
exit 1
fi
if ! command -v sqlite3 >/dev/null 2>&1; then
log "ERROR: sqlite3 is not installed"
exit 1
fi
log "Creating SQLite backup: $BACKUP_PATH"
if ! sqlite3 "$DB" ".backup '$BACKUP_PATH'"; then
log "ERROR: SQLite backup failed"
exit 1
fi
log "Checking database integrity"
if ! sqlite3 "$BACKUP_PATH" "PRAGMA integrity_check;" | grep -qi '^ok$'; then
log "ERROR: backup integrity check failed"
rm -f "$BACKUP_PATH"
exit 1
fi
log "Compressing backup"
gzip -9 "$BACKUP_PATH"
log "Removing backups older than 30 days"
find "$BACKUPDIR" -type f -name 'weewx-*.sdb.gz' -mtime +30 -delete
log "Backup complete: $ARCHIVE_PATH"
exit 0