#!/bin/bash set -e # ─── Config ─────────────────────────────────────────────────── BACKUP_DATASET="${HF_BACKUP_DATASET:-soloew/entrypoint-backup}" DB_PATH="/app/data/kuma.db" BACKUP_PATH="/tmp/kuma-backup.db" BACKUP_INTERVAL="${BACKUP_INTERVAL_MINUTES:-10}" # ─── Validate HF token ─────────────────────────────────────── if [ -z "$HF_TOKEN" ]; then echo "[WARN] HF_TOKEN not set — backups and restores will fail." fi # ─── Restore DB from dataset on startup ────────────────────── echo "[entrypoint] Restoring database from dataset $BACKUP_DATASET ..." if hf download "$BACKUP_DATASET" kuma.db --local-dir /tmp/hf-restore 2>/dev/null; then if [ -f /tmp/hf-restore/kuma.db ]; then mkdir -p /app/data cp /tmp/hf-restore/kuma.db "$DB_PATH" chown node:node "$DB_PATH" 2>/dev/null || true echo "[entrypoint] Database restored successfully." else echo "[entrypoint] No backup found in dataset — starting fresh." fi else echo "[entrypoint] Could not download backup — starting fresh." fi # ─── Backup function ───────────────────────────────────────── backup_db() { if [ ! -f "$DB_PATH" ]; then echo "[backup] No database file found, skipping." return fi echo "[backup] Creating consistent SQLite backup..." sqlite3 "$DB_PATH" ".backup '$BACKUP_PATH'" echo "[backup] Uploading to $BACKUP_DATASET ..." if hf upload "$BACKUP_DATASET" "$BACKUP_PATH" kuma.db \ --commit-message "Automated backup $(date -u '+%Y-%m-%d %H:%M:%S UTC')" 2>&1; then echo "[backup] Upload complete." else echo "[backup] Upload FAILED." fi rm -f "$BACKUP_PATH" } # ─── Schedule cron for periodic backups ─────────────────────── echo "[entrypoint] Scheduling backups every ${BACKUP_INTERVAL} minutes." CRON_JOB="*/${BACKUP_INTERVAL} * * * * HF_TOKEN=\"$HF_TOKEN\" HF_BACKUP_DATASET=\"$BACKUP_DATASET\" /backup.sh >> /proc/1/fd/1 2>&1" # Write the backup script (cron can't run inline bash easily) cat > /backup.sh << 'BACKUP_EOF' #!/bin/bash BACKUP_DATASET="${HF_BACKUP_DATASET:-soloew/entrypoint-backup}" DB_PATH="/app/data/kuma.db" BACKUP_PATH="/tmp/kuma-backup.db" if [ ! -f "$DB_PATH" ]; then echo "[backup] No database file found, skipping." exit 0 fi echo "[backup] $(date -u '+%H:%M:%S UTC') Creating SQLite backup..." sqlite3 "$DB_PATH" ".backup '$BACKUP_PATH'" echo "[backup] Uploading to $BACKUP_DATASET ..." hf upload "$BACKUP_DATASET" "$BACKUP_PATH" kuma.db \ --commit-message "Automated backup $(date -u '+%Y-%m-%d %H:%M:%S UTC')" 2>&1 echo "[backup] Done." rm -f "$BACKUP_PATH" BACKUP_EOF chmod +x /backup.sh echo "$CRON_JOB" | crontab - service cron start # ─── Run initial backup in background after 60s ────────────── ( sleep 60 && backup_db ) & # ─── Start Uptime Kuma ─────────────────────────────────────── echo "[entrypoint] Starting Uptime Kuma..." exec node server/server.js