@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 CHANGED
@@ -1,6 +1,6 @@
1
1
  # SpecGen App - Complete Platform
2
2
 
3
- [![Version](https://img.shields.io/badge/version-0.17.0-blue.svg)](https://github.com/gv-sh/specgen-app)
3
+ [![Version](https://img.shields.io/badge/version-0.18.0-blue.svg)](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.17.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.4"
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