@powerhousedao/ph-cli 0.40.85-dev.1 → 0.40.85-dev.3
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/dist/package.json +1 -1
- package/dist/scripts/manage-environment +125 -0
- package/dist/scripts/setup-environment +126 -55
- package/dist/scripts/setup-environment.ps1 +4 -4
- package/dist/src/commands/service.d.ts +1 -1
- package/dist/src/commands/service.d.ts.map +1 -1
- package/dist/src/commands/service.js +37 -126
- package/dist/src/commands/service.js.map +1 -1
- package/dist/src/commands/setup-service.js +11 -5
- package/dist/src/commands/setup-service.js.map +1 -1
- package/dist/src/version.d.ts +1 -1
- package/dist/src/version.js +1 -1
- package/dist/tsconfig.lib.tsbuildinfo +1 -1
- package/package.json +9 -9
package/dist/package.json
CHANGED
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
|
|
3
|
+
# =============================================================================
|
|
4
|
+
# Configuration
|
|
5
|
+
# =============================================================================
|
|
6
|
+
PROJECT_NAME=${1:-"global"}
|
|
7
|
+
ACTION=${2:-"status"}
|
|
8
|
+
|
|
9
|
+
# =============================================================================
|
|
10
|
+
# OS Detection and Windows Handling
|
|
11
|
+
# =============================================================================
|
|
12
|
+
if [[ "$OSTYPE" == "msys" || "$OSTYPE" == "win32" ]]; then
|
|
13
|
+
if [ -f "$0.ps1" ]; then
|
|
14
|
+
powershell -ExecutionPolicy Bypass -File "$0.ps1" -PROJECT_NAME "$PROJECT_NAME" -ACTION "$ACTION"
|
|
15
|
+
else
|
|
16
|
+
echo "Error: Windows management script (manage-environment.ps1) not found"
|
|
17
|
+
exit 1
|
|
18
|
+
fi
|
|
19
|
+
else
|
|
20
|
+
# =============================================================================
|
|
21
|
+
# Service Management
|
|
22
|
+
# =============================================================================
|
|
23
|
+
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
|
24
|
+
echo " Managing project: $PROJECT_NAME"
|
|
25
|
+
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
|
26
|
+
|
|
27
|
+
# Function to enable/disable Nginx site
|
|
28
|
+
manage_nginx_site() {
|
|
29
|
+
local action=$1
|
|
30
|
+
local site_path="/etc/nginx/sites-available/$PROJECT_NAME"
|
|
31
|
+
local enabled_path="/etc/nginx/sites-enabled/$PROJECT_NAME"
|
|
32
|
+
|
|
33
|
+
if [ ! -f "$site_path" ]; then
|
|
34
|
+
echo "Error: Nginx site configuration for $PROJECT_NAME not found"
|
|
35
|
+
return 1
|
|
36
|
+
fi
|
|
37
|
+
|
|
38
|
+
case "$action" in
|
|
39
|
+
"enable")
|
|
40
|
+
if [ ! -L "$enabled_path" ]; then
|
|
41
|
+
sudo ln -sf "$site_path" "$enabled_path"
|
|
42
|
+
sudo nginx -t && sudo nginx -s reload
|
|
43
|
+
fi
|
|
44
|
+
;;
|
|
45
|
+
"disable")
|
|
46
|
+
if [ -L "$enabled_path" ]; then
|
|
47
|
+
sudo rm -f "$enabled_path"
|
|
48
|
+
sudo nginx -t && sudo nginx -s reload
|
|
49
|
+
fi
|
|
50
|
+
;;
|
|
51
|
+
esac
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
case "$ACTION" in
|
|
55
|
+
"start")
|
|
56
|
+
echo "Starting services..."
|
|
57
|
+
# Build Connect
|
|
58
|
+
echo "Building Connect..."
|
|
59
|
+
ph connect build
|
|
60
|
+
|
|
61
|
+
# Enable Nginx site
|
|
62
|
+
manage_nginx_site "enable"
|
|
63
|
+
|
|
64
|
+
# Start Switchboard via PM2
|
|
65
|
+
if ! pm2 list | grep -q "switchboard_${PROJECT_NAME}"; then
|
|
66
|
+
cd $PROJECT_NAME
|
|
67
|
+
pm2 start "pnpm switchboard" --name "switchboard_${PROJECT_NAME}"
|
|
68
|
+
pm2 save
|
|
69
|
+
else
|
|
70
|
+
pm2 start "switchboard_${PROJECT_NAME}"
|
|
71
|
+
fi
|
|
72
|
+
;;
|
|
73
|
+
|
|
74
|
+
"stop")
|
|
75
|
+
echo "Stopping services..."
|
|
76
|
+
# Stop Switchboard via PM2
|
|
77
|
+
if pm2 list | grep -q "switchboard_${PROJECT_NAME}"; then
|
|
78
|
+
pm2 stop "switchboard_${PROJECT_NAME}"
|
|
79
|
+
fi
|
|
80
|
+
|
|
81
|
+
# Disable Nginx site
|
|
82
|
+
manage_nginx_site "disable"
|
|
83
|
+
;;
|
|
84
|
+
|
|
85
|
+
"restart")
|
|
86
|
+
echo "Restarting services..."
|
|
87
|
+
# Build Connect
|
|
88
|
+
echo "Building Connect..."
|
|
89
|
+
ph connect build
|
|
90
|
+
|
|
91
|
+
# Restart Nginx site
|
|
92
|
+
manage_nginx_site "disable"
|
|
93
|
+
manage_nginx_site "enable"
|
|
94
|
+
|
|
95
|
+
# Restart Switchboard via PM2
|
|
96
|
+
if pm2 list | grep -q "switchboard_${PROJECT_NAME}"; then
|
|
97
|
+
pm2 restart "switchboard_${PROJECT_NAME}"
|
|
98
|
+
else
|
|
99
|
+
cd $PROJECT_NAME
|
|
100
|
+
pm2 start "pnpm switchboard" --name "switchboard_${PROJECT_NAME}"
|
|
101
|
+
pm2 save
|
|
102
|
+
fi
|
|
103
|
+
;;
|
|
104
|
+
|
|
105
|
+
"status")
|
|
106
|
+
echo "Checking service status..."
|
|
107
|
+
echo "Nginx site status:"
|
|
108
|
+
if [ -L "/etc/nginx/sites-enabled/$PROJECT_NAME" ]; then
|
|
109
|
+
echo "Site is enabled"
|
|
110
|
+
else
|
|
111
|
+
echo "Site is disabled"
|
|
112
|
+
fi
|
|
113
|
+
|
|
114
|
+
echo -e "\nSwitchboard status:"
|
|
115
|
+
pm2 list | grep "switchboard_${PROJECT_NAME}"
|
|
116
|
+
;;
|
|
117
|
+
|
|
118
|
+
*)
|
|
119
|
+
echo "Usage: $0 [project_name] {start|stop|restart|status}"
|
|
120
|
+
echo "Default project_name: global"
|
|
121
|
+
echo "Default action: status"
|
|
122
|
+
exit 1
|
|
123
|
+
;;
|
|
124
|
+
esac
|
|
125
|
+
fi
|
|
@@ -4,6 +4,7 @@
|
|
|
4
4
|
# Configuration
|
|
5
5
|
# =============================================================================
|
|
6
6
|
TARGET_TAG=${1:-"latest"}
|
|
7
|
+
PROJECT_NAME=${2:-"global"}
|
|
7
8
|
|
|
8
9
|
# =============================================================================
|
|
9
10
|
# OS Detection and Windows Handling
|
|
@@ -22,19 +23,15 @@ else
|
|
|
22
23
|
sudo apt install -y postgresql postgresql-contrib nginx
|
|
23
24
|
|
|
24
25
|
# =============================================================================
|
|
25
|
-
#
|
|
26
|
+
# Project Setup
|
|
26
27
|
# =============================================================================
|
|
27
28
|
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
|
28
|
-
echo " Setting up
|
|
29
|
+
echo " Setting up project: $PROJECT_NAME"
|
|
29
30
|
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
|
30
31
|
|
|
31
|
-
|
|
32
|
-
cd
|
|
33
|
-
|
|
34
|
-
ph init powerhouse
|
|
35
|
-
cd powerhouse
|
|
32
|
+
ph init $PROJECT_NAME --$TARGET_TAG
|
|
33
|
+
cd $PROJECT_NAME
|
|
36
34
|
ph use $TARGET_TAG
|
|
37
|
-
ph connect build
|
|
38
35
|
|
|
39
36
|
# =============================================================================
|
|
40
37
|
# Interactive Package Installation
|
|
@@ -50,6 +47,11 @@ else
|
|
|
50
47
|
ph install "$package_name"
|
|
51
48
|
done
|
|
52
49
|
|
|
50
|
+
# =============================================================================
|
|
51
|
+
# Connect Build
|
|
52
|
+
# =============================================================================
|
|
53
|
+
ph connect build
|
|
54
|
+
|
|
53
55
|
# =============================================================================
|
|
54
56
|
# Database Configuration
|
|
55
57
|
# =============================================================================
|
|
@@ -67,11 +69,30 @@ else
|
|
|
67
69
|
# Generate database credentials
|
|
68
70
|
DB_PASSWORD="powerhouse"
|
|
69
71
|
DB_USER="powerhouse"
|
|
70
|
-
DB_NAME="
|
|
72
|
+
DB_NAME="powerhouse_${PROJECT_NAME}"
|
|
71
73
|
|
|
72
|
-
#
|
|
74
|
+
# Check if database already exists
|
|
75
|
+
if sudo -u postgres psql -lqt | cut -d \| -f 1 | grep -qw $DB_NAME; then
|
|
76
|
+
echo "Database $DB_NAME already exists"
|
|
77
|
+
read -p "Do you want to recreate it? (y/n): " recreate_db
|
|
78
|
+
if [ "$recreate_db" = "y" ]; then
|
|
79
|
+
sudo -u postgres psql -c "DROP DATABASE $DB_NAME;"
|
|
80
|
+
else
|
|
81
|
+
echo "Using existing database"
|
|
82
|
+
fi
|
|
83
|
+
fi
|
|
84
|
+
|
|
85
|
+
# Create database and user if they don't exist
|
|
73
86
|
sudo -u postgres psql << EOF
|
|
74
|
-
|
|
87
|
+
DO
|
|
88
|
+
\$do\$
|
|
89
|
+
BEGIN
|
|
90
|
+
IF NOT EXISTS (SELECT FROM pg_catalog.pg_roles WHERE rolname = '$DB_USER') THEN
|
|
91
|
+
CREATE USER $DB_USER WITH PASSWORD '$DB_PASSWORD';
|
|
92
|
+
END IF;
|
|
93
|
+
END
|
|
94
|
+
\$do\$;
|
|
95
|
+
|
|
75
96
|
CREATE DATABASE $DB_NAME OWNER $DB_USER;
|
|
76
97
|
GRANT ALL PRIVILEGES ON DATABASE $DB_NAME TO $DB_USER;
|
|
77
98
|
EOF
|
|
@@ -92,7 +113,7 @@ EOF
|
|
|
92
113
|
fi
|
|
93
114
|
|
|
94
115
|
# Save DATABASE_URL to .env file
|
|
95
|
-
echo "DATABASE_URL=$DATABASE_URL" | sudo tee -a
|
|
116
|
+
echo "DATABASE_URL=$DATABASE_URL" | sudo tee -a .env
|
|
96
117
|
|
|
97
118
|
# =============================================================================
|
|
98
119
|
# SSL Configuration
|
|
@@ -115,17 +136,8 @@ EOF
|
|
|
115
136
|
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
|
116
137
|
echo " Domain Setup"
|
|
117
138
|
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
|
118
|
-
read -p "Enter
|
|
119
|
-
read -p "Enter
|
|
120
|
-
read -p "Enter subdomain for Switchboard service (default: switchboard): " switchboard_subdomain
|
|
121
|
-
|
|
122
|
-
# Set default subdomains
|
|
123
|
-
connect_subdomain=${connect_subdomain:-connect}
|
|
124
|
-
switchboard_subdomain=${switchboard_subdomain:-switchboard}
|
|
125
|
-
|
|
126
|
-
# Construct full domains
|
|
127
|
-
connect_domain="${connect_subdomain}.${base_domain}"
|
|
128
|
-
switchboard_domain="${switchboard_subdomain}.${base_domain}"
|
|
139
|
+
read -p "Enter Connect domain (e.g. connect.google.com): " connect_domain
|
|
140
|
+
read -p "Enter Switchboard domain (e.g. switchboard.google.com): " switchboard_domain
|
|
129
141
|
|
|
130
142
|
echo "Using domains:"
|
|
131
143
|
echo "Connect: $connect_domain"
|
|
@@ -137,12 +149,19 @@ EOF
|
|
|
137
149
|
sudo openssl req -x509 -nodes -days 1 -newkey rsa:2048 \
|
|
138
150
|
-keyout /etc/nginx/ssl/temp.key \
|
|
139
151
|
-out /etc/nginx/ssl/temp.crt \
|
|
140
|
-
-subj "/CN=$
|
|
152
|
+
-subj "/CN=$connect_domain" \
|
|
141
153
|
-addext "subjectAltName = DNS:$connect_domain,DNS:$switchboard_domain"
|
|
142
154
|
|
|
143
|
-
#
|
|
144
|
-
|
|
145
|
-
|
|
155
|
+
# Check if Nginx configuration already exists
|
|
156
|
+
if [ -f "/etc/nginx/sites-available/$PROJECT_NAME" ]; then
|
|
157
|
+
echo "Nginx configuration for $PROJECT_NAME already exists"
|
|
158
|
+
read -p "Do you want to overwrite it? (y/n): " overwrite_nginx
|
|
159
|
+
if [ "$overwrite_nginx" != "y" ]; then
|
|
160
|
+
echo "Keeping existing Nginx configuration"
|
|
161
|
+
else
|
|
162
|
+
# Create Nginx configuration for domains
|
|
163
|
+
echo "Creating Nginx configuration..."
|
|
164
|
+
sudo tee /etc/nginx/sites-available/$PROJECT_NAME > /dev/null << EOF
|
|
146
165
|
# Security headers
|
|
147
166
|
add_header Strict-Transport-Security "max-age=63072000" always;
|
|
148
167
|
add_header X-Frame-Options DENY;
|
|
@@ -206,18 +225,86 @@ server {
|
|
|
206
225
|
}
|
|
207
226
|
}
|
|
208
227
|
EOF
|
|
228
|
+
fi
|
|
229
|
+
else
|
|
230
|
+
# Create Nginx configuration for domains
|
|
231
|
+
echo "Creating Nginx configuration..."
|
|
232
|
+
sudo tee /etc/nginx/sites-available/$PROJECT_NAME > /dev/null << EOF
|
|
233
|
+
# Security headers
|
|
234
|
+
add_header Strict-Transport-Security "max-age=63072000" always;
|
|
235
|
+
add_header X-Frame-Options DENY;
|
|
236
|
+
add_header X-Content-Type-Options nosniff;
|
|
237
|
+
add_header X-XSS-Protection "1; mode=block";
|
|
238
|
+
|
|
239
|
+
server {
|
|
240
|
+
listen 80;
|
|
241
|
+
server_name $connect_domain $switchboard_domain;
|
|
242
|
+
return 301 https://\$host\$request_uri;
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
server {
|
|
246
|
+
listen 443 ssl http2;
|
|
247
|
+
server_name $connect_domain;
|
|
248
|
+
|
|
249
|
+
ssl_certificate /etc/nginx/ssl/temp.crt;
|
|
250
|
+
ssl_certificate_key /etc/nginx/ssl/temp.key;
|
|
251
|
+
|
|
252
|
+
# SSL configuration
|
|
253
|
+
ssl_protocols TLSv1.2 TLSv1.3;
|
|
254
|
+
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;
|
|
255
|
+
ssl_prefer_server_ciphers off;
|
|
256
|
+
ssl_session_timeout 1d;
|
|
257
|
+
ssl_session_cache shared:SSL:50m;
|
|
258
|
+
ssl_session_tickets off;
|
|
259
|
+
ssl_stapling on;
|
|
260
|
+
ssl_stapling_verify on;
|
|
261
|
+
|
|
262
|
+
if (\$http_x_forwarded_proto = "http") {
|
|
263
|
+
return 301 https://\$server_name\$request_uri;
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
location / {
|
|
267
|
+
root /var/www/powerhouse/.ph/connect-build/dist;
|
|
268
|
+
try_files \$uri \$uri/ /index.html;
|
|
269
|
+
add_header Cache-Control "no-cache";
|
|
270
|
+
add_header X-Forwarded-Proto \$scheme;
|
|
271
|
+
add_header X-Forwarded-Host \$host;
|
|
272
|
+
add_header X-Forwarded-Port \$server_port;
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
server {
|
|
277
|
+
listen 443 ssl http2;
|
|
278
|
+
server_name $switchboard_domain;
|
|
279
|
+
|
|
280
|
+
ssl_certificate /etc/nginx/ssl/temp.crt;
|
|
281
|
+
ssl_certificate_key /etc/nginx/ssl/temp.key;
|
|
282
|
+
|
|
283
|
+
location / {
|
|
284
|
+
proxy_pass http://localhost:4001;
|
|
285
|
+
proxy_http_version 1.1;
|
|
286
|
+
proxy_set_header Upgrade \$http_upgrade;
|
|
287
|
+
proxy_set_header Connection 'upgrade';
|
|
288
|
+
proxy_set_header Host \$host;
|
|
289
|
+
proxy_cache_bypass \$http_upgrade;
|
|
290
|
+
proxy_set_header X-Real-IP \$remote_addr;
|
|
291
|
+
proxy_set_header X-Forwarded-For \$proxy_add_x_forwarded_for;
|
|
292
|
+
proxy_set_header X-Forwarded-Proto \$scheme;
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
EOF
|
|
296
|
+
fi
|
|
209
297
|
|
|
210
298
|
# Enable the site
|
|
211
|
-
sudo ln -sf /etc/nginx/sites-available
|
|
299
|
+
sudo ln -sf /etc/nginx/sites-available/$PROJECT_NAME /etc/nginx/sites-enabled/
|
|
212
300
|
sudo rm -f /etc/nginx/sites-enabled/default
|
|
213
301
|
|
|
214
|
-
# Test
|
|
302
|
+
# Test Nginx configuration
|
|
215
303
|
sudo nginx -t
|
|
216
|
-
sudo systemctl restart nginx
|
|
217
304
|
|
|
218
305
|
# Obtain SSL certificates
|
|
219
306
|
echo "Obtaining SSL certificates..."
|
|
220
|
-
sudo certbot --nginx -d $connect_domain -d $switchboard_domain --non-interactive --agree-tos --email admin@$
|
|
307
|
+
sudo certbot --nginx -d $connect_domain -d $switchboard_domain --non-interactive --agree-tos --email admin@$connect_domain
|
|
221
308
|
|
|
222
309
|
# Remove temporary certificates
|
|
223
310
|
sudo rm -f /etc/nginx/ssl/temp.*
|
|
@@ -236,7 +323,7 @@ EOF
|
|
|
236
323
|
|
|
237
324
|
# Create Nginx configuration for self-signed
|
|
238
325
|
echo "Creating Nginx configuration..."
|
|
239
|
-
sudo tee /etc/nginx/sites-available
|
|
326
|
+
sudo tee /etc/nginx/sites-available/$PROJECT_NAME > /dev/null << EOF
|
|
240
327
|
# Security headers
|
|
241
328
|
add_header Strict-Transport-Security "max-age=63072000" always;
|
|
242
329
|
add_header X-Frame-Options DENY;
|
|
@@ -283,36 +370,20 @@ server {
|
|
|
283
370
|
EOF
|
|
284
371
|
|
|
285
372
|
# Enable the site
|
|
286
|
-
sudo ln -sf /etc/nginx/sites-available
|
|
373
|
+
sudo ln -sf /etc/nginx/sites-available/$PROJECT_NAME /etc/nginx/sites-enabled/
|
|
287
374
|
sudo rm -f /etc/nginx/sites-enabled/default
|
|
288
375
|
|
|
289
|
-
# Test
|
|
376
|
+
# Test Nginx configuration
|
|
290
377
|
sudo nginx -t
|
|
291
|
-
sudo systemctl restart nginx
|
|
292
378
|
fi
|
|
293
379
|
|
|
294
380
|
# =============================================================================
|
|
295
|
-
#
|
|
381
|
+
# Database Schema Setup
|
|
296
382
|
# =============================================================================
|
|
297
|
-
# Install PM2 globally if not already installed
|
|
298
|
-
if ! command -v pm2 &> /dev/null; then
|
|
299
|
-
pnpm install -g pm2
|
|
300
|
-
fi
|
|
301
|
-
|
|
302
383
|
pnpm prisma db push --schema node_modules/document-drive/dist/prisma/schema.prisma
|
|
303
|
-
pnpm add @powerhousedao/switchboard@dev
|
|
304
384
|
|
|
305
|
-
|
|
306
|
-
echo "
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
pm2 start pnpm switchboard --name "switchboard" -- --base-path /switchboard
|
|
310
|
-
else
|
|
311
|
-
# Let's Encrypt - no base paths needed
|
|
312
|
-
pm2 start "pnpm switchboard" --name "switchboard"
|
|
313
|
-
fi
|
|
314
|
-
|
|
315
|
-
# Save PM2 process list and setup startup script
|
|
316
|
-
pm2 save
|
|
317
|
-
pm2 startup
|
|
385
|
+
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
|
386
|
+
echo " Environment setup complete!"
|
|
387
|
+
echo " Use 'ph service start' to start services"
|
|
388
|
+
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
|
318
389
|
fi
|
|
@@ -33,10 +33,8 @@ if (-not (Test-Path $installPath)) {
|
|
|
33
33
|
Set-Location $installPath
|
|
34
34
|
|
|
35
35
|
# Initialize Powerhouse project
|
|
36
|
-
ph init powerhouse
|
|
36
|
+
ph init powerhouse --$TARGET_TAG
|
|
37
37
|
Set-Location powerhouse
|
|
38
|
-
ph use $TARGET_TAG
|
|
39
|
-
ph connect build
|
|
40
38
|
|
|
41
39
|
# Interactive package installation loop
|
|
42
40
|
Write-Host "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
|
@@ -50,6 +48,9 @@ while ($true) {
|
|
|
50
48
|
ph install $package_name
|
|
51
49
|
}
|
|
52
50
|
|
|
51
|
+
# Build Connect
|
|
52
|
+
ph connect build
|
|
53
|
+
|
|
53
54
|
# Database Configuration
|
|
54
55
|
Write-Host "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
|
55
56
|
Write-Host " Database Configuration"
|
|
@@ -296,7 +297,6 @@ if (-not (Get-Command pm2 -ErrorAction SilentlyContinue)) {
|
|
|
296
297
|
|
|
297
298
|
# Run database migrations
|
|
298
299
|
pnpm prisma db push --schema node_modules/document-drive/dist/prisma/schema.prisma
|
|
299
|
-
pnpm add @powerhousedao/switchboard@dev
|
|
300
300
|
|
|
301
301
|
# Start services with PM2
|
|
302
302
|
Write-Host "Starting services with PM2..."
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { type Command } from "commander";
|
|
2
2
|
import { type CommandActionType } from "../types.js";
|
|
3
|
-
export declare const manageService: CommandActionType<[string
|
|
3
|
+
export declare const manageService: CommandActionType<[string]>;
|
|
4
4
|
export declare function serviceCommand(program: Command): void;
|
|
5
5
|
//# sourceMappingURL=service.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../../src/commands/service.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../../src/commands/service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAY,KAAK,OAAO,EAAE,MAAM,WAAW,CAAC;AAKnD,OAAO,EAAE,KAAK,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAKrD,eAAO,MAAM,aAAa,EAAE,iBAAiB,CAAC,CAAC,MAAM,CAAC,CAsDrD,CAAC;AAEF,wBAAgB,cAAc,CAAC,OAAO,EAAE,OAAO,QAQ9C"}
|
|
@@ -1,145 +1,56 @@
|
|
|
1
|
-
import { getConfig } from "@powerhousedao/config/utils";
|
|
2
1
|
import { Argument } from "commander";
|
|
3
2
|
import { execSync } from "node:child_process";
|
|
4
3
|
import path from "node:path";
|
|
5
4
|
import { fileURLToPath } from "node:url";
|
|
6
|
-
import pm2 from "pm2";
|
|
7
5
|
import { serviceHelp } from "../help.js";
|
|
8
6
|
import { setCustomHelp } from "../utils.js";
|
|
9
|
-
const actions = ["start", "stop", "status", "
|
|
10
|
-
const
|
|
11
|
-
let switchboardPort = 8442;
|
|
12
|
-
let connectPort = 8443;
|
|
13
|
-
export const manageService = async (action, service) => {
|
|
7
|
+
const actions = ["start", "stop", "status", "setup"];
|
|
8
|
+
export const manageService = async (action) => {
|
|
14
9
|
try {
|
|
15
|
-
const
|
|
16
|
-
|
|
17
|
-
|
|
10
|
+
const dirname = path.dirname(fileURLToPath(import.meta.url));
|
|
11
|
+
const manageScriptPath = path.join(dirname, "..", "scripts", "manage-environment");
|
|
12
|
+
const setupScriptPath = path.join(dirname, "..", "scripts", "setup-environment");
|
|
13
|
+
// Get the current directory name as project name
|
|
14
|
+
const projectName = path.basename(process.cwd());
|
|
15
|
+
switch (action) {
|
|
16
|
+
case "start":
|
|
17
|
+
console.log("Starting environment...");
|
|
18
|
+
execSync(`bash ${manageScriptPath} ${projectName} start`, {
|
|
19
|
+
stdio: "inherit",
|
|
20
|
+
});
|
|
21
|
+
break;
|
|
22
|
+
case "stop":
|
|
23
|
+
console.log("Stopping environment...");
|
|
24
|
+
execSync(`bash ${manageScriptPath} ${projectName} stop`, {
|
|
25
|
+
stdio: "inherit",
|
|
26
|
+
});
|
|
27
|
+
break;
|
|
28
|
+
case "status":
|
|
29
|
+
console.log("Checking environment status...");
|
|
30
|
+
execSync(`bash ${manageScriptPath} ${projectName} status`, {
|
|
31
|
+
stdio: "inherit",
|
|
32
|
+
});
|
|
33
|
+
break;
|
|
34
|
+
case "setup":
|
|
35
|
+
console.log("Setting up environment...");
|
|
36
|
+
execSync(`bash ${setupScriptPath}`, { stdio: "inherit" });
|
|
37
|
+
break;
|
|
38
|
+
default:
|
|
39
|
+
console.log("Unknown action:", action);
|
|
40
|
+
process.exit(1);
|
|
18
41
|
}
|
|
19
|
-
if (config.studio?.port) {
|
|
20
|
-
connectPort = config.studio.port;
|
|
21
|
-
}
|
|
22
|
-
pm2.connect((err) => {
|
|
23
|
-
switch (action) {
|
|
24
|
-
case "start":
|
|
25
|
-
startServices(service);
|
|
26
|
-
break;
|
|
27
|
-
case "stop":
|
|
28
|
-
stopServices(service);
|
|
29
|
-
break;
|
|
30
|
-
case "startup":
|
|
31
|
-
startupServices();
|
|
32
|
-
break;
|
|
33
|
-
case "unstartup":
|
|
34
|
-
unstartupServices();
|
|
35
|
-
break;
|
|
36
|
-
default:
|
|
37
|
-
statusServices();
|
|
38
|
-
break;
|
|
39
|
-
}
|
|
40
|
-
});
|
|
41
42
|
}
|
|
42
43
|
catch (error) {
|
|
43
|
-
console.error(error);
|
|
44
|
+
console.error("Error:", error);
|
|
45
|
+
process.exit(1);
|
|
44
46
|
}
|
|
45
47
|
};
|
|
46
48
|
export function serviceCommand(program) {
|
|
47
49
|
const command = program
|
|
48
50
|
.command("service")
|
|
49
|
-
.description("Manage services")
|
|
50
|
-
.addArgument(new Argument("action").choices(actions).default("
|
|
51
|
-
.addArgument(new Argument("service").choices(services).argOptional().default("all"))
|
|
51
|
+
.description("Manage environment services")
|
|
52
|
+
.addArgument(new Argument("action").choices(actions).default("status"))
|
|
52
53
|
.action(manageService);
|
|
53
54
|
setCustomHelp(command, serviceHelp);
|
|
54
55
|
}
|
|
55
|
-
function startServices(service) {
|
|
56
|
-
if (service === "switchboard" || service === "all") {
|
|
57
|
-
const switchboardOptions = {
|
|
58
|
-
name: "switchboard",
|
|
59
|
-
script: "npx ph-cli switchboard",
|
|
60
|
-
};
|
|
61
|
-
console.log("Starting Switchboard...");
|
|
62
|
-
pm2.start(switchboardOptions, (err) => {
|
|
63
|
-
if (err) {
|
|
64
|
-
console.log(err.name);
|
|
65
|
-
// throw new Error(err.message);
|
|
66
|
-
}
|
|
67
|
-
dumpServices();
|
|
68
|
-
});
|
|
69
|
-
console.log("Switchboard started");
|
|
70
|
-
}
|
|
71
|
-
if (service === "connect" || service === "all") {
|
|
72
|
-
const connectOptions = {
|
|
73
|
-
name: "connect",
|
|
74
|
-
script: "npx ph-cli connect",
|
|
75
|
-
args: ["--port", connectPort.toString()],
|
|
76
|
-
};
|
|
77
|
-
console.log("Starting connect...");
|
|
78
|
-
pm2.start(connectOptions, (err) => {
|
|
79
|
-
if (err) {
|
|
80
|
-
throw new Error(err.message);
|
|
81
|
-
}
|
|
82
|
-
dumpServices();
|
|
83
|
-
});
|
|
84
|
-
console.log("Connect started");
|
|
85
|
-
}
|
|
86
|
-
}
|
|
87
|
-
function dumpServices() {
|
|
88
|
-
pm2.dump((err) => {
|
|
89
|
-
if (err) {
|
|
90
|
-
throw new Error(err.message);
|
|
91
|
-
}
|
|
92
|
-
statusServices();
|
|
93
|
-
});
|
|
94
|
-
}
|
|
95
|
-
function stopServices(service) {
|
|
96
|
-
if (service === "all" || service === "connect") {
|
|
97
|
-
pm2.stop("connect", (err) => {
|
|
98
|
-
if (err) {
|
|
99
|
-
throw new Error(err.message);
|
|
100
|
-
}
|
|
101
|
-
dumpServices();
|
|
102
|
-
});
|
|
103
|
-
}
|
|
104
|
-
if (service === "all" || service === "switchboard") {
|
|
105
|
-
pm2.stop("switchboard", (err) => {
|
|
106
|
-
if (err) {
|
|
107
|
-
throw new Error(err.message);
|
|
108
|
-
}
|
|
109
|
-
dumpServices();
|
|
110
|
-
});
|
|
111
|
-
}
|
|
112
|
-
}
|
|
113
|
-
function statusServices() {
|
|
114
|
-
pm2.list((err, list) => {
|
|
115
|
-
const formattedList = list.map((item) => {
|
|
116
|
-
return {
|
|
117
|
-
id: item.pm_id,
|
|
118
|
-
name: item.name,
|
|
119
|
-
pid: item.pid,
|
|
120
|
-
uptime: item.pm2_env?.pm_uptime,
|
|
121
|
-
restarts: item.pm2_env?.unstable_restarts,
|
|
122
|
-
status: item.pm2_env?.status,
|
|
123
|
-
mem: item.monit?.memory,
|
|
124
|
-
cpu: item.monit?.cpu,
|
|
125
|
-
};
|
|
126
|
-
});
|
|
127
|
-
console.table(formattedList);
|
|
128
|
-
process.exit(0);
|
|
129
|
-
});
|
|
130
|
-
}
|
|
131
|
-
function startupServices() {
|
|
132
|
-
const dirname = import.meta.dirname || path.dirname(fileURLToPath(import.meta.url));
|
|
133
|
-
const scriptPath = path.join(dirname, "..", "scripts", "service-startup.sh");
|
|
134
|
-
const result = execSync(`bash ${scriptPath}`).toString();
|
|
135
|
-
console.log(result);
|
|
136
|
-
process.exit(0);
|
|
137
|
-
}
|
|
138
|
-
function unstartupServices() {
|
|
139
|
-
const dirname = import.meta.dirname || path.dirname(fileURLToPath(import.meta.url));
|
|
140
|
-
const scriptPath = path.join(dirname, "..", "scripts", "service-unstartup.sh");
|
|
141
|
-
const result = execSync(`bash ${scriptPath}`).toString();
|
|
142
|
-
console.log(result);
|
|
143
|
-
process.exit(0);
|
|
144
|
-
}
|
|
145
56
|
//# sourceMappingURL=service.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"service.js","sourceRoot":"","sources":["../../../src/commands/service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"service.js","sourceRoot":"","sources":["../../../src/commands/service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAgB,MAAM,WAAW,CAAC;AACnD,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAEzC,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5C,MAAM,OAAO,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;AAErD,MAAM,CAAC,MAAM,aAAa,GAAgC,KAAK,EAAE,MAAM,EAAE,EAAE;IACzE,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;QAC7D,MAAM,gBAAgB,GAAG,IAAI,CAAC,IAAI,CAChC,OAAO,EACP,IAAI,EACJ,SAAS,EACT,oBAAoB,CACrB,CAAC;QACF,MAAM,eAAe,GAAG,IAAI,CAAC,IAAI,CAC/B,OAAO,EACP,IAAI,EACJ,SAAS,EACT,mBAAmB,CACpB,CAAC;QAEF,iDAAiD;QACjD,MAAM,WAAW,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;QAEjD,QAAQ,MAAM,EAAE,CAAC;YACf,KAAK,OAAO;gBACV,OAAO,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAC;gBACvC,QAAQ,CAAC,QAAQ,gBAAgB,IAAI,WAAW,QAAQ,EAAE;oBACxD,KAAK,EAAE,SAAS;iBACjB,CAAC,CAAC;gBACH,MAAM;YAER,KAAK,MAAM;gBACT,OAAO,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAC;gBACvC,QAAQ,CAAC,QAAQ,gBAAgB,IAAI,WAAW,OAAO,EAAE;oBACvD,KAAK,EAAE,SAAS;iBACjB,CAAC,CAAC;gBACH,MAAM;YAER,KAAK,QAAQ;gBACX,OAAO,CAAC,GAAG,CAAC,gCAAgC,CAAC,CAAC;gBAC9C,QAAQ,CAAC,QAAQ,gBAAgB,IAAI,WAAW,SAAS,EAAE;oBACzD,KAAK,EAAE,SAAS;iBACjB,CAAC,CAAC;gBACH,MAAM;YAER,KAAK,OAAO;gBACV,OAAO,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAC;gBACzC,QAAQ,CAAC,QAAQ,eAAe,EAAE,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;gBAC1D,MAAM;YAER;gBACE,OAAO,CAAC,GAAG,CAAC,iBAAiB,EAAE,MAAM,CAAC,CAAC;gBACvC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACpB,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;QAC/B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC;AAEF,MAAM,UAAU,cAAc,CAAC,OAAgB;IAC7C,MAAM,OAAO,GAAG,OAAO;SACpB,OAAO,CAAC,SAAS,CAAC;SAClB,WAAW,CAAC,6BAA6B,CAAC;SAC1C,WAAW,CAAC,IAAI,QAAQ,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;SACtE,MAAM,CAAC,aAAa,CAAC,CAAC;IAEzB,aAAa,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;AACtC,CAAC"}
|