File size: 3,435 Bytes
2d27ef4
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
#!/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