unknownfriend00007 commited on
Commit
21f4427
·
verified ·
1 Parent(s): ae9647c

Update backup.sh

Browse files
Files changed (1) hide show
  1. backup.sh +108 -74
backup.sh CHANGED
@@ -1,74 +1,108 @@
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
16
-
17
- if [ -z "$NEON_PASSWORD" ] || [ -z "$NEON_HOST" ]; then
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
-
71
- while true; do
72
- sleep "$BACKUP_INTERVAL"
73
- backup_to_neon
74
- done
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
+ # Early exit if no database
14
+ if [ ! -f "$DB_PATH" ]; then
15
+ return 0
16
+ fi
17
+
18
+ # Early exit if Neon not configured
19
+ if [ -z "$NEON_PASSWORD" ] || [ -z "$NEON_HOST" ]; then
20
+ return 0
21
+ fi
22
+
23
+ # Get metadata
24
+ USER_COUNT=$(sqlite3 "$DB_PATH" "SELECT COUNT(*) FROM user;" 2>/dev/null || echo "0")
25
+ ORG_COUNT=$(sqlite3 "$DB_PATH" "SELECT COUNT(*) FROM organization;" 2>/dev/null || echo "0")
26
+ CF_COUNT=$(sqlite3 "$DB_PATH" "SELECT COUNT(*) FROM chat_flow;" 2>/dev/null || echo "0")
27
+ CRED_COUNT=$(sqlite3 "$DB_PATH" "SELECT COUNT(*) FROM credential;" 2>/dev/null || echo "0")
28
+
29
+ # Skip if empty database (nothing to backup)
30
+ if [ "$USER_COUNT" -eq 0 ] && [ "$ORG_COUNT" -eq 0 ]; then
31
+ return 0
32
+ fi
33
+
34
+ # ✅ FIX: Fail if SQLite dump fails (don't use || true)
35
+ if ! sqlite3 "$DB_PATH" .dump > /tmp/flowise_backup.sql 2>/dev/null; then
36
+ log "❌ SQLite dump failed - skipping backup"
37
+ rm -f /tmp/flowise_backup.sql 2>/dev/null || true
38
+ return 1
39
+ fi
40
+
41
+ BACKUP_SIZE=$(wc -c < /tmp/flowise_backup.sql 2>/dev/null || echo "0")
42
+
43
+ # Validate dump size
44
+ if [ "$BACKUP_SIZE" -lt 1000 ]; then
45
+ log "⚠️ Backup too small (${BACKUP_SIZE} bytes) - skipping"
46
+ rm -f /tmp/flowise_backup.sql 2>/dev/null || true
47
+ return 0
48
+ fi
49
+
50
+ # Encode to base64
51
+ BASE64_CONTENT=$(base64 -w 0 /tmp/flowise_backup.sql)
52
+
53
+ # ✅ CRITICAL FIX: Use psql properly without grep pipeline
54
+ # ✅ SECURITY FIX: Use psql variable instead of direct substitution
55
+ if ! PGPASSWORD="$NEON_PASSWORD" psql "$NEON_CONNECTION" -v ON_ERROR_STOP=1 \
56
+ -v backup_b64="$BASE64_CONTENT" \
57
+ -v user_count="$USER_COUNT" \
58
+ -v org_count="$ORG_COUNT" \
59
+ -v flow_count="$CF_COUNT" \
60
+ -v cred_count="$CRED_COUNT" \
61
+ -v backup_bytes="$BACKUP_SIZE" \
62
+ <<EOF 2>&1
63
+ CREATE TABLE IF NOT EXISTS flowise_backups (
64
+ id SERIAL PRIMARY KEY,
65
+ backup_date TIMESTAMP DEFAULT NOW(),
66
+ sql_content_b64 TEXT,
67
+ metadata JSONB
68
+ );
69
+ DELETE FROM flowise_backups WHERE id NOT IN (
70
+ SELECT id FROM flowise_backups ORDER BY backup_date DESC LIMIT 7
71
+ );
72
+ INSERT INTO flowise_backups (sql_content_b64, metadata)
73
+ VALUES (
74
+ :'backup_b64',
75
+ jsonb_build_object(
76
+ 'users', :user_count::int,
77
+ 'orgs', :org_count::int,
78
+ 'flows', :flow_count::int,
79
+ 'creds', :cred_count::int,
80
+ 'bytes', :backup_bytes::int
81
+ )
82
+ );
83
+ EOF
84
+ then
85
+ log "❌ Backup upload FAILED to Neon"
86
+ rm -f /tmp/flowise_backup.sql 2>/dev/null || true
87
+ return 1
88
+ fi
89
+
90
+ # Success
91
+ BACKUP_SIZE_KB=$((BACKUP_SIZE / 1024))
92
+ log "✅ Backup complete: ${BACKUP_SIZE_KB}KB | $CF_COUNT flows, $CRED_COUNT creds"
93
+
94
+ rm -f /tmp/flowise_backup.sql 2>/dev/null || true
95
+ }
96
+
97
+ # Initial delay before first backup
98
+ sleep 120
99
+ backup_to_neon
100
+
101
+ INTERVAL_HOURS=$((BACKUP_INTERVAL / 3600))
102
+ log "🔄 Backup loop started (every ${INTERVAL_HOURS}h)"
103
+
104
+ # Continuous backup loop
105
+ while true; do
106
+ sleep "$BACKUP_INTERVAL"
107
+ backup_to_neon || log "⚠️ Backup cycle failed - will retry next interval"
108
+ done