Spaces:
Running
Running
Update backup.sh
Browse files
backup.sh
CHANGED
|
@@ -1,23 +1,15 @@
|
|
| 1 |
#!/bin/bash
|
| 2 |
set -e
|
| 3 |
|
| 4 |
-
# ============================================
|
| 5 |
-
# CONFIGURATION
|
| 6 |
-
# ============================================
|
| 7 |
DB_PATH="/data/.flowise/database.sqlite"
|
| 8 |
BACKUP_INTERVAL=${BACKUP_INTERVAL_SECONDS:-86400}
|
| 9 |
NEON_CONNECTION="postgresql://${NEON_USER}@${NEON_HOST}/${NEON_DB}?sslmode=require"
|
| 10 |
|
| 11 |
-
# Logging
|
| 12 |
log() {
|
| 13 |
echo "[$(date +'%Y-%m-%d %H:%M:%S')] [BACKUP] $1"
|
| 14 |
}
|
| 15 |
|
| 16 |
-
# ============================================
|
| 17 |
-
# BACKUP FUNCTION
|
| 18 |
-
# ============================================
|
| 19 |
backup_to_neon() {
|
| 20 |
-
# Check prerequisites
|
| 21 |
if [ ! -f "$DB_PATH" ]; then
|
| 22 |
return 0
|
| 23 |
fi
|
|
@@ -26,70 +18,53 @@ backup_to_neon() {
|
|
| 26 |
return 0
|
| 27 |
fi
|
| 28 |
|
| 29 |
-
# Count current data
|
| 30 |
USER_COUNT=$(sqlite3 "$DB_PATH" "SELECT COUNT(*) FROM user;" 2>/dev/null || echo "0")
|
| 31 |
ORG_COUNT=$(sqlite3 "$DB_PATH" "SELECT COUNT(*) FROM organization;" 2>/dev/null || echo "0")
|
| 32 |
CF_COUNT=$(sqlite3 "$DB_PATH" "SELECT COUNT(*) FROM chat_flow;" 2>/dev/null || echo "0")
|
| 33 |
CRED_COUNT=$(sqlite3 "$DB_PATH" "SELECT COUNT(*) FROM credential;" 2>/dev/null || echo "0")
|
| 34 |
|
| 35 |
-
# Skip if no meaningful data
|
| 36 |
if [ "$USER_COUNT" -eq 0 ] && [ "$ORG_COUNT" -eq 0 ]; then
|
| 37 |
return 0
|
| 38 |
fi
|
| 39 |
|
| 40 |
-
# Create SQL dump - FULL BACKUP (no filtering for simplicity)
|
| 41 |
sqlite3 "$DB_PATH" .dump > /tmp/flowise_backup.sql 2>/dev/null || true
|
| 42 |
|
| 43 |
BACKUP_SIZE=$(wc -c < /tmp/flowise_backup.sql 2>/dev/null || echo "0")
|
| 44 |
|
| 45 |
-
# Skip if backup too small (likely failed)
|
| 46 |
if [ "$BACKUP_SIZE" -lt 1000 ]; then
|
| 47 |
rm -f /tmp/flowise_backup.sql 2>/dev/null || true
|
| 48 |
return 0
|
| 49 |
fi
|
| 50 |
|
| 51 |
-
|
| 52 |
-
|
|
|
|
| 53 |
CREATE TABLE IF NOT EXISTS flowise_backups (
|
| 54 |
id SERIAL PRIMARY KEY,
|
| 55 |
backup_date TIMESTAMP DEFAULT NOW(),
|
| 56 |
-
|
| 57 |
metadata JSONB
|
| 58 |
);
|
| 59 |
-
|
| 60 |
-
|
| 61 |
-
WHERE id NOT IN (
|
| 62 |
-
SELECT id FROM flowise_backups
|
| 63 |
-
ORDER BY backup_date DESC
|
| 64 |
-
LIMIT 7
|
| 65 |
-
);
|
| 66 |
-
|
| 67 |
-
INSERT INTO flowise_backups (sql_content, metadata)
|
| 68 |
-
VALUES (
|
| 69 |
-
\$SQL\$$(cat /tmp/flowise_backup.sql)\$SQL\$,
|
| 70 |
-
'{"users": $USER_COUNT, "orgs": $ORG_COUNT, "flows": $CF_COUNT, "creds": $CRED_COUNT, "bytes": $BACKUP_SIZE}'::jsonb
|
| 71 |
);
|
|
|
|
|
|
|
| 72 |
EOF
|
| 73 |
|
| 74 |
if [ $? -eq 0 ]; then
|
| 75 |
BACKUP_SIZE_KB=$((BACKUP_SIZE / 1024))
|
| 76 |
log "✅ Backup complete: ${BACKUP_SIZE_KB}KB | $CF_COUNT flows, $CRED_COUNT creds"
|
|
|
|
|
|
|
| 77 |
fi
|
| 78 |
|
| 79 |
rm -f /tmp/flowise_backup.sql 2>/dev/null || true
|
| 80 |
}
|
| 81 |
|
| 82 |
-
# ============================================
|
| 83 |
-
# MAIN LOOP
|
| 84 |
-
# ============================================
|
| 85 |
-
|
| 86 |
-
# Initial delay (let Flowise fully initialize)
|
| 87 |
sleep 120
|
| 88 |
-
|
| 89 |
-
# First backup
|
| 90 |
backup_to_neon
|
| 91 |
|
| 92 |
-
# Continuous backup loop
|
| 93 |
INTERVAL_HOURS=$((BACKUP_INTERVAL / 3600))
|
| 94 |
log "🔄 Backup loop started (every ${INTERVAL_HOURS}h)"
|
| 95 |
|
|
|
|
| 1 |
#!/bin/bash
|
| 2 |
set -e
|
| 3 |
|
|
|
|
|
|
|
|
|
|
| 4 |
DB_PATH="/data/.flowise/database.sqlite"
|
| 5 |
BACKUP_INTERVAL=${BACKUP_INTERVAL_SECONDS:-86400}
|
| 6 |
NEON_CONNECTION="postgresql://${NEON_USER}@${NEON_HOST}/${NEON_DB}?sslmode=require"
|
| 7 |
|
|
|
|
| 8 |
log() {
|
| 9 |
echo "[$(date +'%Y-%m-%d %H:%M:%S')] [BACKUP] $1"
|
| 10 |
}
|
| 11 |
|
|
|
|
|
|
|
|
|
|
| 12 |
backup_to_neon() {
|
|
|
|
| 13 |
if [ ! -f "$DB_PATH" ]; then
|
| 14 |
return 0
|
| 15 |
fi
|
|
|
|
| 18 |
return 0
|
| 19 |
fi
|
| 20 |
|
|
|
|
| 21 |
USER_COUNT=$(sqlite3 "$DB_PATH" "SELECT COUNT(*) FROM user;" 2>/dev/null || echo "0")
|
| 22 |
ORG_COUNT=$(sqlite3 "$DB_PATH" "SELECT COUNT(*) FROM organization;" 2>/dev/null || echo "0")
|
| 23 |
CF_COUNT=$(sqlite3 "$DB_PATH" "SELECT COUNT(*) FROM chat_flow;" 2>/dev/null || echo "0")
|
| 24 |
CRED_COUNT=$(sqlite3 "$DB_PATH" "SELECT COUNT(*) FROM credential;" 2>/dev/null || echo "0")
|
| 25 |
|
|
|
|
| 26 |
if [ "$USER_COUNT" -eq 0 ] && [ "$ORG_COUNT" -eq 0 ]; then
|
| 27 |
return 0
|
| 28 |
fi
|
| 29 |
|
|
|
|
| 30 |
sqlite3 "$DB_PATH" .dump > /tmp/flowise_backup.sql 2>/dev/null || true
|
| 31 |
|
| 32 |
BACKUP_SIZE=$(wc -c < /tmp/flowise_backup.sql 2>/dev/null || echo "0")
|
| 33 |
|
|
|
|
| 34 |
if [ "$BACKUP_SIZE" -lt 1000 ]; then
|
| 35 |
rm -f /tmp/flowise_backup.sql 2>/dev/null || true
|
| 36 |
return 0
|
| 37 |
fi
|
| 38 |
|
| 39 |
+
BASE64_CONTENT=$(base64 -w 0 /tmp/flowise_backup.sql)
|
| 40 |
+
|
| 41 |
+
PGPASSWORD="$NEON_PASSWORD" psql "$NEON_CONNECTION" -v ON_ERROR_STOP=1 <<EOF 2>&1 | grep -i "error" && log "❌ Upload error" || true
|
| 42 |
CREATE TABLE IF NOT EXISTS flowise_backups (
|
| 43 |
id SERIAL PRIMARY KEY,
|
| 44 |
backup_date TIMESTAMP DEFAULT NOW(),
|
| 45 |
+
sql_content_b64 TEXT,
|
| 46 |
metadata JSONB
|
| 47 |
);
|
| 48 |
+
DELETE FROM flowise_backups WHERE id NOT IN (
|
| 49 |
+
SELECT id FROM flowise_backups ORDER BY backup_date DESC LIMIT 7
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 50 |
);
|
| 51 |
+
INSERT INTO flowise_backups (sql_content_b64, metadata)
|
| 52 |
+
VALUES ('$BASE64_CONTENT', '{"users": $USER_COUNT, "orgs": $ORG_COUNT, "flows": $CF_COUNT, "creds": $CRED_COUNT, "bytes": $BACKUP_SIZE}'::jsonb);
|
| 53 |
EOF
|
| 54 |
|
| 55 |
if [ $? -eq 0 ]; then
|
| 56 |
BACKUP_SIZE_KB=$((BACKUP_SIZE / 1024))
|
| 57 |
log "✅ Backup complete: ${BACKUP_SIZE_KB}KB | $CF_COUNT flows, $CRED_COUNT creds"
|
| 58 |
+
else
|
| 59 |
+
log "❌ Backup failed"
|
| 60 |
fi
|
| 61 |
|
| 62 |
rm -f /tmp/flowise_backup.sql 2>/dev/null || true
|
| 63 |
}
|
| 64 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 65 |
sleep 120
|
|
|
|
|
|
|
| 66 |
backup_to_neon
|
| 67 |
|
|
|
|
| 68 |
INTERVAL_HOURS=$((BACKUP_INTERVAL / 3600))
|
| 69 |
log "🔄 Backup loop started (every ${INTERVAL_HOURS}h)"
|
| 70 |
|