@gv-sh/specgen-app 0.17.0 โ 0.18.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/package.json +4 -2
- package/scripts/backup-database.sh +147 -0
- package/scripts/restore-database.sh +313 -0
package/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# SpecGen App - Complete Platform
|
|
2
2
|
|
|
3
|
-
[](https://github.com/gv-sh/specgen-app)
|
|
4
4
|
|
|
5
5
|
A unified deployment package for the SpecGen speculative fiction generator platform. **Optimized for port 80 deployment with low memory usage.**
|
|
6
6
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@gv-sh/specgen-app",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.18.0",
|
|
4
4
|
"description": "Complete SpecGen application with server, admin, and user interfaces",
|
|
5
5
|
"main": "index.js",
|
|
6
6
|
"bin": {
|
|
@@ -13,12 +13,14 @@
|
|
|
13
13
|
"start": "cd server && npm start",
|
|
14
14
|
"deploy": "chmod +x scripts/deploy.sh && ./scripts/deploy.sh",
|
|
15
15
|
"deploy:ec2": "chmod +x scripts/deploy-ec2.sh && ./scripts/deploy-ec2.sh",
|
|
16
|
+
"backup:database": "chmod +x scripts/backup-database.sh && ./scripts/backup-database.sh",
|
|
17
|
+
"restore:database": "chmod +x scripts/restore-database.sh && ./scripts/restore-database.sh",
|
|
16
18
|
"postinstall": "chmod +x bin/cli.js"
|
|
17
19
|
},
|
|
18
20
|
"dependencies": {
|
|
19
21
|
"@gv-sh/specgen-server": "0.11.1",
|
|
20
22
|
"@gv-sh/specgen-admin": "0.11.0",
|
|
21
|
-
"@gv-sh/specgen-user": "0.14.
|
|
23
|
+
"@gv-sh/specgen-user": "0.14.9"
|
|
22
24
|
},
|
|
23
25
|
"devDependencies": {
|
|
24
26
|
"concurrently": "^8.2.2"
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
|
|
3
|
+
# SpecGen Database Backup Script
|
|
4
|
+
# Creates remote backup and downloads to local machine
|
|
5
|
+
|
|
6
|
+
set -e
|
|
7
|
+
|
|
8
|
+
# Configuration
|
|
9
|
+
EC2_HOST="ubuntu@ec2-52-66-251-12.ap-south-1.compute.amazonaws.com"
|
|
10
|
+
EC2_KEY="debanshu.pem"
|
|
11
|
+
APP_DIR="/home/ubuntu/specgen-app"
|
|
12
|
+
LOCAL_BACKUP_DIR="backups"
|
|
13
|
+
|
|
14
|
+
# Create timestamp for backup
|
|
15
|
+
TIMESTAMP=$(date +"%Y-%m-%d_%H-%M-%S")
|
|
16
|
+
BACKUP_NAME="specgen-backup-$TIMESTAMP"
|
|
17
|
+
BACKUP_ARCHIVE="$BACKUP_NAME.tar.gz"
|
|
18
|
+
|
|
19
|
+
echo "๐๏ธ SpecGen Database Backup Starting..."
|
|
20
|
+
echo "๐
Timestamp: $TIMESTAMP"
|
|
21
|
+
echo "๐ก Target: $EC2_HOST"
|
|
22
|
+
|
|
23
|
+
# Check if key file exists
|
|
24
|
+
if [ ! -f "$EC2_KEY" ]; then
|
|
25
|
+
echo "โ SSH key file '$EC2_KEY' not found!"
|
|
26
|
+
echo "Please ensure the key file is in the current directory."
|
|
27
|
+
exit 1
|
|
28
|
+
fi
|
|
29
|
+
|
|
30
|
+
# Function to run commands on EC2
|
|
31
|
+
run_on_ec2() {
|
|
32
|
+
ssh -i "$EC2_KEY" "$EC2_HOST" "$1"
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
# Check if remote app directory exists
|
|
36
|
+
echo "๐ Checking remote application..."
|
|
37
|
+
if ! run_on_ec2 "[ -d '$APP_DIR' ]"; then
|
|
38
|
+
echo "โ Remote application directory not found: $APP_DIR"
|
|
39
|
+
echo "Please ensure SpecGen is deployed on the EC2 instance."
|
|
40
|
+
exit 1
|
|
41
|
+
fi
|
|
42
|
+
|
|
43
|
+
# Check if database files exist
|
|
44
|
+
echo "๐ Verifying database files..."
|
|
45
|
+
run_on_ec2 "
|
|
46
|
+
missing_files=''
|
|
47
|
+
for file in '$APP_DIR/server/data/database.json' '$APP_DIR/server/data/generated-content.db' '$APP_DIR/server/data/settings.json'; do
|
|
48
|
+
if [ ! -f \"\$file\" ]; then
|
|
49
|
+
missing_files=\"\$missing_files \$(basename \$file)\"
|
|
50
|
+
fi
|
|
51
|
+
done
|
|
52
|
+
|
|
53
|
+
if [ ! -z \"\$missing_files\" ]; then
|
|
54
|
+
echo \"โ Missing database files:\$missing_files\"
|
|
55
|
+
exit 1
|
|
56
|
+
fi
|
|
57
|
+
|
|
58
|
+
echo \"โ
All database files found\"
|
|
59
|
+
"
|
|
60
|
+
|
|
61
|
+
# Create remote backup directory and archive
|
|
62
|
+
echo "๐ฆ Creating backup on EC2..."
|
|
63
|
+
run_on_ec2 "
|
|
64
|
+
cd '$APP_DIR'
|
|
65
|
+
|
|
66
|
+
# Create backup directory
|
|
67
|
+
mkdir -p backups/'$BACKUP_NAME'
|
|
68
|
+
|
|
69
|
+
# Copy database files to backup directory
|
|
70
|
+
echo 'Copying database files...'
|
|
71
|
+
cp server/data/database.json backups/'$BACKUP_NAME'/
|
|
72
|
+
cp server/data/generated-content.db backups/'$BACKUP_NAME'/
|
|
73
|
+
cp server/data/settings.json backups/'$BACKUP_NAME'/
|
|
74
|
+
|
|
75
|
+
# Create metadata file
|
|
76
|
+
cat > backups/'$BACKUP_NAME'/backup-info.txt << 'EOF'
|
|
77
|
+
Backup Created: $TIMESTAMP
|
|
78
|
+
Source: $APP_DIR/server/data/
|
|
79
|
+
Files:
|
|
80
|
+
- database.json (categories and parameters)
|
|
81
|
+
- generated-content.db (SQLite database)
|
|
82
|
+
- settings.json (system configuration)
|
|
83
|
+
EOF
|
|
84
|
+
|
|
85
|
+
# Create compressed archive
|
|
86
|
+
echo 'Creating compressed archive...'
|
|
87
|
+
cd backups
|
|
88
|
+
tar -czf '$BACKUP_ARCHIVE' '$BACKUP_NAME'/
|
|
89
|
+
|
|
90
|
+
# Verify archive
|
|
91
|
+
if [ -f '$BACKUP_ARCHIVE' ]; then
|
|
92
|
+
size=\$(du -h '$BACKUP_ARCHIVE' | cut -f1)
|
|
93
|
+
echo \"โ
Backup archive created: '$BACKUP_ARCHIVE' (\$size)\"
|
|
94
|
+
else
|
|
95
|
+
echo \"โ Failed to create backup archive\"
|
|
96
|
+
exit 1
|
|
97
|
+
fi
|
|
98
|
+
"
|
|
99
|
+
|
|
100
|
+
# Create local backup directory
|
|
101
|
+
echo "๐ Preparing local backup directory..."
|
|
102
|
+
mkdir -p "$LOCAL_BACKUP_DIR"
|
|
103
|
+
|
|
104
|
+
# Download backup from EC2
|
|
105
|
+
echo "โฌ๏ธ Downloading backup to local machine..."
|
|
106
|
+
if scp -i "$EC2_KEY" "$EC2_HOST:$APP_DIR/backups/$BACKUP_ARCHIVE" "$LOCAL_BACKUP_DIR/"; then
|
|
107
|
+
echo "โ
Backup downloaded successfully to: $LOCAL_BACKUP_DIR/$BACKUP_ARCHIVE"
|
|
108
|
+
|
|
109
|
+
# Verify local backup
|
|
110
|
+
if [ -f "$LOCAL_BACKUP_DIR/$BACKUP_ARCHIVE" ]; then
|
|
111
|
+
local_size=$(du -h "$LOCAL_BACKUP_DIR/$BACKUP_ARCHIVE" | cut -f1)
|
|
112
|
+
echo "๐ Local backup size: $local_size"
|
|
113
|
+
fi
|
|
114
|
+
else
|
|
115
|
+
echo "โ Failed to download backup from EC2"
|
|
116
|
+
exit 1
|
|
117
|
+
fi
|
|
118
|
+
|
|
119
|
+
# Ask if user wants to keep remote backup
|
|
120
|
+
echo ""
|
|
121
|
+
read -p "๐๏ธ Keep backup on EC2? (y/n, default: n): " keep_remote
|
|
122
|
+
keep_remote=${keep_remote:-n}
|
|
123
|
+
|
|
124
|
+
if [[ "$keep_remote" =~ ^[Yy]$ ]]; then
|
|
125
|
+
echo "โ
Remote backup preserved on EC2"
|
|
126
|
+
else
|
|
127
|
+
echo "๐งน Cleaning up remote backup..."
|
|
128
|
+
run_on_ec2 "
|
|
129
|
+
cd '$APP_DIR/backups'
|
|
130
|
+
rm -rf '$BACKUP_NAME' '$BACKUP_ARCHIVE'
|
|
131
|
+
echo 'Remote backup files removed'
|
|
132
|
+
"
|
|
133
|
+
fi
|
|
134
|
+
|
|
135
|
+
# List local backups
|
|
136
|
+
echo ""
|
|
137
|
+
echo "๐ Local backups available:"
|
|
138
|
+
ls -lh "$LOCAL_BACKUP_DIR"/ 2>/dev/null || echo "No previous backups found"
|
|
139
|
+
|
|
140
|
+
echo ""
|
|
141
|
+
echo "โ
Database backup completed successfully!"
|
|
142
|
+
echo ""
|
|
143
|
+
echo "๐ Backup location: $LOCAL_BACKUP_DIR/$BACKUP_ARCHIVE"
|
|
144
|
+
echo "๐ Timestamp: $TIMESTAMP"
|
|
145
|
+
echo ""
|
|
146
|
+
echo "To restore this backup, use:"
|
|
147
|
+
echo " ./scripts/restore-database.sh"
|
|
@@ -0,0 +1,313 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
|
|
3
|
+
# SpecGen Database Restore Script
|
|
4
|
+
# Restores database from local or remote backup
|
|
5
|
+
|
|
6
|
+
set -e
|
|
7
|
+
|
|
8
|
+
# Configuration
|
|
9
|
+
EC2_HOST="ubuntu@ec2-52-66-251-12.ap-south-1.compute.amazonaws.com"
|
|
10
|
+
EC2_KEY="debanshu.pem"
|
|
11
|
+
APP_DIR="/home/ubuntu/specgen-app"
|
|
12
|
+
LOCAL_BACKUP_DIR="backups"
|
|
13
|
+
|
|
14
|
+
echo "๐ SpecGen Database Restore Starting..."
|
|
15
|
+
echo "๐ก Target: $EC2_HOST"
|
|
16
|
+
|
|
17
|
+
# Check if key file exists
|
|
18
|
+
if [ ! -f "$EC2_KEY" ]; then
|
|
19
|
+
echo "โ SSH key file '$EC2_KEY' not found!"
|
|
20
|
+
echo "Please ensure the key file is in the current directory."
|
|
21
|
+
exit 1
|
|
22
|
+
fi
|
|
23
|
+
|
|
24
|
+
# Function to run commands on EC2
|
|
25
|
+
run_on_ec2() {
|
|
26
|
+
ssh -i "$EC2_KEY" "$EC2_HOST" "$1"
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
# Check if remote app directory exists
|
|
30
|
+
echo "๐ Checking remote application..."
|
|
31
|
+
if ! run_on_ec2 "[ -d '$APP_DIR' ]"; then
|
|
32
|
+
echo "โ Remote application directory not found: $APP_DIR"
|
|
33
|
+
echo "Please ensure SpecGen is deployed on the EC2 instance."
|
|
34
|
+
exit 1
|
|
35
|
+
fi
|
|
36
|
+
|
|
37
|
+
# Function to list local backups
|
|
38
|
+
list_local_backups() {
|
|
39
|
+
if [ -d "$LOCAL_BACKUP_DIR" ]; then
|
|
40
|
+
local_backups=($(ls -1 "$LOCAL_BACKUP_DIR"/*.tar.gz 2>/dev/null | sort -r | head -10))
|
|
41
|
+
if [ ${#local_backups[@]} -gt 0 ]; then
|
|
42
|
+
echo "๐ Local backups available:"
|
|
43
|
+
for i in "${!local_backups[@]}"; do
|
|
44
|
+
backup_file=$(basename "${local_backups[$i]}")
|
|
45
|
+
size=$(du -h "${local_backups[$i]}" | cut -f1)
|
|
46
|
+
echo " $((i+1)). $backup_file ($size)"
|
|
47
|
+
done
|
|
48
|
+
return 0
|
|
49
|
+
fi
|
|
50
|
+
fi
|
|
51
|
+
echo "๐ No local backups found"
|
|
52
|
+
return 1
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
# Function to list remote backups
|
|
56
|
+
list_remote_backups() {
|
|
57
|
+
remote_list=$(run_on_ec2 "
|
|
58
|
+
if [ -d '$APP_DIR/backups' ]; then
|
|
59
|
+
cd '$APP_DIR/backups'
|
|
60
|
+
ls -1 *.tar.gz 2>/dev/null | sort -r | head -10
|
|
61
|
+
fi
|
|
62
|
+
" 2>/dev/null)
|
|
63
|
+
|
|
64
|
+
if [ ! -z "$remote_list" ]; then
|
|
65
|
+
echo "โ๏ธ Remote backups available:"
|
|
66
|
+
echo "$remote_list" | nl -w2 -s'. '
|
|
67
|
+
return 0
|
|
68
|
+
else
|
|
69
|
+
echo "โ๏ธ No remote backups found"
|
|
70
|
+
return 1
|
|
71
|
+
fi
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
# Show available backups
|
|
75
|
+
echo ""
|
|
76
|
+
has_local=$(list_local_backups && echo "true" || echo "false")
|
|
77
|
+
echo ""
|
|
78
|
+
has_remote=$(list_remote_backups && echo "true" || echo "false")
|
|
79
|
+
echo ""
|
|
80
|
+
|
|
81
|
+
if [ "$has_local" = "false" ] && [ "$has_remote" = "false" ]; then
|
|
82
|
+
echo "โ No backups found locally or remotely!"
|
|
83
|
+
echo "Please create a backup first using: ./scripts/backup-database.sh"
|
|
84
|
+
exit 1
|
|
85
|
+
fi
|
|
86
|
+
|
|
87
|
+
# Choose backup source
|
|
88
|
+
echo "Select backup source:"
|
|
89
|
+
if [ "$has_local" = "true" ]; then
|
|
90
|
+
echo " 1. Local backup"
|
|
91
|
+
fi
|
|
92
|
+
if [ "$has_remote" = "true" ]; then
|
|
93
|
+
echo " 2. Remote backup"
|
|
94
|
+
fi
|
|
95
|
+
echo " 0. Cancel"
|
|
96
|
+
|
|
97
|
+
read -p "Choice: " source_choice
|
|
98
|
+
|
|
99
|
+
case $source_choice in
|
|
100
|
+
1)
|
|
101
|
+
if [ "$has_local" = "false" ]; then
|
|
102
|
+
echo "โ No local backups available"
|
|
103
|
+
exit 1
|
|
104
|
+
fi
|
|
105
|
+
source_type="local"
|
|
106
|
+
;;
|
|
107
|
+
2)
|
|
108
|
+
if [ "$has_remote" = "false" ]; then
|
|
109
|
+
echo "โ No remote backups available"
|
|
110
|
+
exit 1
|
|
111
|
+
fi
|
|
112
|
+
source_type="remote"
|
|
113
|
+
;;
|
|
114
|
+
0)
|
|
115
|
+
echo "โ Restore cancelled"
|
|
116
|
+
exit 0
|
|
117
|
+
;;
|
|
118
|
+
*)
|
|
119
|
+
echo "โ Invalid choice"
|
|
120
|
+
exit 1
|
|
121
|
+
;;
|
|
122
|
+
esac
|
|
123
|
+
|
|
124
|
+
# Select specific backup
|
|
125
|
+
if [ "$source_type" = "local" ]; then
|
|
126
|
+
echo ""
|
|
127
|
+
list_local_backups
|
|
128
|
+
echo ""
|
|
129
|
+
read -p "Select backup number (1-10): " backup_choice
|
|
130
|
+
|
|
131
|
+
local_backups=($(ls -1 "$LOCAL_BACKUP_DIR"/*.tar.gz 2>/dev/null | sort -r | head -10))
|
|
132
|
+
if [ "$backup_choice" -ge 1 ] && [ "$backup_choice" -le ${#local_backups[@]} ]; then
|
|
133
|
+
selected_backup="${local_backups[$((backup_choice-1))]}"
|
|
134
|
+
backup_name=$(basename "$selected_backup")
|
|
135
|
+
else
|
|
136
|
+
echo "โ Invalid backup selection"
|
|
137
|
+
exit 1
|
|
138
|
+
fi
|
|
139
|
+
else
|
|
140
|
+
echo ""
|
|
141
|
+
list_remote_backups
|
|
142
|
+
echo ""
|
|
143
|
+
read -p "Select backup number (1-10): " backup_choice
|
|
144
|
+
|
|
145
|
+
remote_backups=($(run_on_ec2 "cd '$APP_DIR/backups' && ls -1 *.tar.gz 2>/dev/null | sort -r | head -10"))
|
|
146
|
+
if [ "$backup_choice" -ge 1 ] && [ "$backup_choice" -le ${#remote_backups[@]} ]; then
|
|
147
|
+
backup_name="${remote_backups[$((backup_choice-1))]}"
|
|
148
|
+
else
|
|
149
|
+
echo "โ Invalid backup selection"
|
|
150
|
+
exit 1
|
|
151
|
+
fi
|
|
152
|
+
fi
|
|
153
|
+
|
|
154
|
+
echo "๐ Selected backup: $backup_name"
|
|
155
|
+
echo ""
|
|
156
|
+
|
|
157
|
+
# Confirm restore
|
|
158
|
+
echo "โ ๏ธ WARNING: This will replace the current database files on EC2!"
|
|
159
|
+
read -p "Are you sure you want to restore? (yes/no): " confirm
|
|
160
|
+
|
|
161
|
+
if [ "$confirm" != "yes" ]; then
|
|
162
|
+
echo "โ Restore cancelled"
|
|
163
|
+
exit 0
|
|
164
|
+
fi
|
|
165
|
+
|
|
166
|
+
# Create safety backup of current state
|
|
167
|
+
echo "๐ก๏ธ Creating safety backup of current state..."
|
|
168
|
+
SAFETY_TIMESTAMP=$(date +"%Y-%m-%d_%H-%M-%S")
|
|
169
|
+
SAFETY_BACKUP="safety-backup-$SAFETY_TIMESTAMP"
|
|
170
|
+
|
|
171
|
+
run_on_ec2 "
|
|
172
|
+
cd '$APP_DIR'
|
|
173
|
+
mkdir -p backups/'$SAFETY_BACKUP'
|
|
174
|
+
|
|
175
|
+
# Copy current database files
|
|
176
|
+
cp server/data/database.json backups/'$SAFETY_BACKUP'/ 2>/dev/null || echo 'database.json not found'
|
|
177
|
+
cp server/data/generated-content.db backups/'$SAFETY_BACKUP'/ 2>/dev/null || echo 'generated-content.db not found'
|
|
178
|
+
cp server/data/settings.json backups/'$SAFETY_BACKUP'/ 2>/dev/null || echo 'settings.json not found'
|
|
179
|
+
|
|
180
|
+
# Create safety backup archive
|
|
181
|
+
cd backups
|
|
182
|
+
tar -czf '$SAFETY_BACKUP.tar.gz' '$SAFETY_BACKUP'/
|
|
183
|
+
rm -rf '$SAFETY_BACKUP'
|
|
184
|
+
|
|
185
|
+
echo 'โ
Safety backup created: $SAFETY_BACKUP.tar.gz'
|
|
186
|
+
"
|
|
187
|
+
|
|
188
|
+
# Handle local backup upload if needed
|
|
189
|
+
if [ "$source_type" = "local" ]; then
|
|
190
|
+
echo "โฌ๏ธ Uploading backup to EC2..."
|
|
191
|
+
if ! scp -i "$EC2_KEY" "$selected_backup" "$EC2_HOST:$APP_DIR/backups/"; then
|
|
192
|
+
echo "โ Failed to upload backup to EC2"
|
|
193
|
+
exit 1
|
|
194
|
+
fi
|
|
195
|
+
echo "โ
Backup uploaded successfully"
|
|
196
|
+
fi
|
|
197
|
+
|
|
198
|
+
# Stop PM2 service
|
|
199
|
+
echo "๐ Stopping SpecGen service..."
|
|
200
|
+
run_on_ec2 "
|
|
201
|
+
cd '$APP_DIR/server'
|
|
202
|
+
npx pm2 stop specgen 2>/dev/null || echo 'Service not running'
|
|
203
|
+
"
|
|
204
|
+
|
|
205
|
+
# Restore database files
|
|
206
|
+
echo "๐ Restoring database files..."
|
|
207
|
+
run_on_ec2 "
|
|
208
|
+
cd '$APP_DIR/backups'
|
|
209
|
+
|
|
210
|
+
# Extract backup
|
|
211
|
+
if [ ! -f '$backup_name' ]; then
|
|
212
|
+
echo 'โ Backup file not found: $backup_name'
|
|
213
|
+
exit 1
|
|
214
|
+
fi
|
|
215
|
+
|
|
216
|
+
# Create temporary extraction directory
|
|
217
|
+
temp_dir='restore_temp_$(date +%s)'
|
|
218
|
+
mkdir -p \"\$temp_dir\"
|
|
219
|
+
|
|
220
|
+
# Extract archive
|
|
221
|
+
if ! tar -xzf '$backup_name' -C \"\$temp_dir\"; then
|
|
222
|
+
echo 'โ Failed to extract backup archive'
|
|
223
|
+
rm -rf \"\$temp_dir\"
|
|
224
|
+
exit 1
|
|
225
|
+
fi
|
|
226
|
+
|
|
227
|
+
# Find the backup directory inside extracted content
|
|
228
|
+
backup_dir=\$(ls -1 \"\$temp_dir\" | head -1)
|
|
229
|
+
|
|
230
|
+
if [ -z \"\$backup_dir\" ]; then
|
|
231
|
+
echo 'โ No backup directory found in archive'
|
|
232
|
+
rm -rf \"\$temp_dir\"
|
|
233
|
+
exit 1
|
|
234
|
+
fi
|
|
235
|
+
|
|
236
|
+
# Restore files
|
|
237
|
+
echo 'Restoring database files...'
|
|
238
|
+
cp \"\$temp_dir/\$backup_dir/database.json\" '$APP_DIR/server/data/' 2>/dev/null || echo 'database.json not in backup'
|
|
239
|
+
cp \"\$temp_dir/\$backup_dir/generated-content.db\" '$APP_DIR/server/data/' 2>/dev/null || echo 'generated-content.db not in backup'
|
|
240
|
+
cp \"\$temp_dir/\$backup_dir/settings.json\" '$APP_DIR/server/data/' 2>/dev/null || echo 'settings.json not in backup'
|
|
241
|
+
|
|
242
|
+
# Cleanup
|
|
243
|
+
rm -rf \"\$temp_dir\"
|
|
244
|
+
|
|
245
|
+
echo 'โ
Database files restored successfully'
|
|
246
|
+
"
|
|
247
|
+
|
|
248
|
+
# Clean up uploaded backup if it was local
|
|
249
|
+
if [ "$source_type" = "local" ]; then
|
|
250
|
+
run_on_ec2 "rm -f '$APP_DIR/backups/$backup_name'"
|
|
251
|
+
fi
|
|
252
|
+
|
|
253
|
+
# Restart PM2 service
|
|
254
|
+
echo "๐ Starting SpecGen service..."
|
|
255
|
+
run_on_ec2 "
|
|
256
|
+
cd '$APP_DIR/server'
|
|
257
|
+
|
|
258
|
+
# Start service
|
|
259
|
+
if [ -f deploy/ecosystem.config.js ]; then
|
|
260
|
+
npx pm2 start deploy/ecosystem.config.js
|
|
261
|
+
else
|
|
262
|
+
npx pm2 start index.js --name specgen
|
|
263
|
+
fi
|
|
264
|
+
"
|
|
265
|
+
|
|
266
|
+
# Wait for service to start
|
|
267
|
+
echo "โณ Waiting for service to start..."
|
|
268
|
+
sleep 5
|
|
269
|
+
|
|
270
|
+
# Verify restore
|
|
271
|
+
echo "๐งช Verifying restore..."
|
|
272
|
+
HEALTH_CHECK=$(run_on_ec2 "curl -s http://localhost:80/api/health | jq -r '.status' 2>/dev/null || echo 'failed'")
|
|
273
|
+
|
|
274
|
+
if [ "$HEALTH_CHECK" = "healthy" ]; then
|
|
275
|
+
echo "โ
Database restore completed successfully!"
|
|
276
|
+
echo ""
|
|
277
|
+
echo "๐ Restored from: $backup_name"
|
|
278
|
+
echo "๐ก๏ธ Safety backup: $SAFETY_BACKUP.tar.gz"
|
|
279
|
+
echo "๐ Service status: Healthy"
|
|
280
|
+
echo ""
|
|
281
|
+
echo "๐ PM2 Status:"
|
|
282
|
+
run_on_ec2 "cd '$APP_DIR/server' && npx pm2 status"
|
|
283
|
+
else
|
|
284
|
+
echo "โ Service health check failed after restore!"
|
|
285
|
+
echo "๐ Rolling back to safety backup..."
|
|
286
|
+
|
|
287
|
+
# Rollback using safety backup
|
|
288
|
+
run_on_ec2 "
|
|
289
|
+
cd '$APP_DIR/server'
|
|
290
|
+
npx pm2 stop specgen 2>/dev/null || true
|
|
291
|
+
|
|
292
|
+
cd '$APP_DIR/backups'
|
|
293
|
+
temp_dir='rollback_temp_$(date +%s)'
|
|
294
|
+
mkdir -p \"\$temp_dir\"
|
|
295
|
+
tar -xzf '$SAFETY_BACKUP.tar.gz' -C \"\$temp_dir\"
|
|
296
|
+
backup_dir=\$(ls -1 \"\$temp_dir\" | head -1)
|
|
297
|
+
|
|
298
|
+
cp \"\$temp_dir/\$backup_dir/\"* '$APP_DIR/server/data/'
|
|
299
|
+
rm -rf \"\$temp_dir\"
|
|
300
|
+
|
|
301
|
+
cd '$APP_DIR/server'
|
|
302
|
+
if [ -f deploy/ecosystem.config.js ]; then
|
|
303
|
+
npx pm2 start deploy/ecosystem.config.js
|
|
304
|
+
else
|
|
305
|
+
npx pm2 start index.js --name specgen
|
|
306
|
+
fi
|
|
307
|
+
|
|
308
|
+
echo 'Rollback completed'
|
|
309
|
+
"
|
|
310
|
+
|
|
311
|
+
echo "๐ Rolled back to previous state"
|
|
312
|
+
exit 1
|
|
313
|
+
fi
|