ly0303521

前端npm run dev -> npm run build,前端后端服务使用pm2管理,提高稳定性

# Shared Configuration
PUBLIC_IP="106.120.52.146"
export PUBLIC_IP="106.120.52.146"
# Ports (External Access)
LOCAL_BACKEND_PORT="9998"
PUBLIC_BACKEND_PORT="39998"
LOCAL_FRONTEND_PORT="9013"
PUBLIC_FRONTEND_PORT="39013"
LOCAL_TURBO_PORT="7002"
PUBLIC_TURBO_PORT="37002"
PUBLIC_OSS_PORT="34000"
PUBLIC_ZIMAGE_PORT="39009"
export LOCAL_BACKEND_PORT="7000"
export PUBLIC_BACKEND_PORT="37000"
export LOCAL_FRONTEND_PORT="7001"
export PUBLIC_FRONTEND_PORT="37001"
export LOCAL_TURBO_PORT="7002"
export PUBLIC_TURBO_PORT="37002"
export PUBLIC_OSS_PORT="34000"
export PUBLIC_ZIMAGE_PORT="39009"
# Business Logic Configuration
VIDEO_GENERATION_LIMIT="1"
LIKES_FOR_REWARD="5"
export VIDEO_GENERATION_LIMIT="1"
export LIKES_FOR_REWARD="5"
# pm2 name set
export BACKEND_NAME="backend_beta"
export FRONTEND_NAME="frontend_beta"
... ...
const path = require('path');
module.exports = {
apps: [
{
name: process.env.BACKEND_NAME || "z-image-backend",
script: "./venv/bin/uvicorn",
// Use LOCAL_BACKEND_PORT from environment, default to 7000
args: `backend.main:app --host 0.0.0.0 --port ${process.env.LOCAL_BACKEND_PORT || 7000}`,
cwd: __dirname,
interpreter: "none",
autorestart: true,
watch: false,
max_memory_restart: '1G'
},
{
name: process.env.FRONTEND_NAME || "z-image-frontend",
script: "serve",
env: {
// Use LOCAL_FRONTEND_PORT from environment, default to 7001
PM2_SERVE_PATH: path.join(__dirname, 'z-image-generator/dist'),
PM2_SERVE_PORT: process.env.LOCAL_FRONTEND_PORT || 7001,
PM2_SERVE_SPA: 'true',
PM2_SERVE_HOMEPAGE: '/index.html'
}
}
]
};
... ...
... ... @@ -16,33 +16,18 @@ export NO_PROXY="localhost,127.0.0.1,0.0.0.0,::1"
FRONTEND_DIR="$BASE_DIR/z-image-generator"
BACKEND_DIR="$BASE_DIR"
CONSTANTS_FILE="$FRONTEND_DIR/constants.ts"
CONFIG_JS_FILE="$BASE_DIR/public/config.js"
LOGS_DIR="$BASE_DIR/logs"
# Ensure logs directory exists
mkdir -p "$LOGS_DIR"
# Function to rotate logs
rotate_log() {
local log_file="$1"
if [ -f "$log_file" ]; then
local timestamp=$(date +"%Y%m%d_%H%M%S")
local filename=$(basename "$log_file")
local archived_log="$LOGS_DIR/${filename%.*}_$timestamp.log"
echo "Rotating log: $log_file -> $archived_log"
mv "$log_file" "$archived_log"
fi
}
echo "=================================================="
echo "Initializing Front-Backend Z-Image Services"
echo "Initializing Front-Backend Z-Image Services (PM2)"
echo "=================================================="
# 1. Generate Runtime Config (config.js)
echo "Generating runtime configuration in $CONFIG_JS_FILE..."
# Ensure directory exists
mkdir -p "$(dirname "$CONFIG_JS_FILE")"
cat > "$CONFIG_JS_FILE" <<EOF
... ... @@ -57,52 +42,34 @@ window.APP_CONFIG = {
EOF
export TURBO_DIFFUSION_LOCAL_URL="http://127.0.0.1:$LOCAL_TURBO_PORT"
export VITE_API_BASE_URL="http://$PUBLIC_IP:$PUBLIC_BACKEND_PORT"
export WHITELIST_PATH="/home/inspur/work_space/gen_img_video/TurboDiffusion-Space/TurboDiffusion/front_backend_zImage/backend/whitelist.txt"
export WHITELIST_PATH="$BASE_DIR/backend/whitelist.txt"
echo "Configuration generated."
# 2. Start Backend Service
echo "--------------------------------------------------"
echo "Starting Backend Service..."
echo "Host: 0.0.0.0, Port: $LOCAL_BACKEND_PORT"
echo "Public URL: http://$PUBLIC_IP:$PUBLIC_BACKEND_PORT"
cd "$BACKEND_DIR" || exit 1
PID_BACKEND=$(lsof -t -i:$LOCAL_BACKEND_PORT)
if [ -n "$PID_BACKEND" ]; then
echo "Killing existing backend process on port $LOCAL_BACKEND_PORT (PID: $PID_BACKEND)..."
kill -9 "$PID_BACKEND"
# 2. Check/Build Frontend
echo "Checking frontend build..."
if [ ! -d "$FRONTEND_DIR/dist" ]; then
echo "Dist folder not found. Building frontend..."
cd "$FRONTEND_DIR"
npm run build
cd "$BASE_DIR"
fi
rotate_log "$BASE_DIR/backend.log"
# Use venv uvicorn
UVICORN_BIN="$BASE_DIR/venv/bin/uvicorn"
if [ ! -f "$UVICORN_BIN" ]; then
echo "Warning: venv uvicorn not found at $UVICORN_BIN, trying system uvicorn..."
UVICORN_BIN="uvicorn"
fi
nohup "$UVICORN_BIN" backend.main:app --host 0.0.0.0 --port "$LOCAL_BACKEND_PORT" > backend.log 2>&1 &
echo "Backend started with PID: $!"
# 3. Start Frontend Service
echo "--------------------------------------------------"
echo "Starting Frontend Service..."
echo "Host: 0.0.0.0, Port: $LOCAL_FRONTEND_PORT"
echo "Public URL: http://$PUBLIC_IP:$PUBLIC_FRONTEND_PORT"
cd "$FRONTEND_DIR" || exit 1
PID_FRONTEND=$(lsof -t -i:$LOCAL_FRONTEND_PORT)
if [ -n "$PID_FRONTEND" ]; then
echo "Killing existing frontend process on port $LOCAL_FRONTEND_PORT (PID: $PID_FRONTEND)..."
kill -9 "$PID_FRONTEND"
# 3. Start PM2
echo "Starting services with PM2..."
cd "$BASE_DIR"
if command -v pm2 &> /dev/null; then
# 显式指定配置文件,并使用 --update-env 确保环境变量同步
pm2 start ecosystem.config.js --update-env
pm2 save
echo "Services started via PM2."
pm2 list
else
echo "Error: PM2 not found. Please install pm2 (npm install -g pm2) or use old start script."
exit 1
fi
rotate_log "$BASE_DIR/frontend.log"
nohup npm run dev -- --port "$LOCAL_FRONTEND_PORT" --host 0.0.0.0 > ../frontend.log 2>&1 &
echo "Frontend started with PID: $!"
echo "=================================================="
echo "All services initiated."
echo "Frontend: http://$PUBLIC_IP:$PUBLIC_FRONTEND_PORT (Mapped from $LOCAL_FRONTEND_PORT)"
echo "Backend: http://$PUBLIC_IP:$PUBLIC_BACKEND_PORT (Mapped from $LOCAL_BACKEND_PORT)"
echo "=================================================="
... ...
#!/bin/bash
BASE_DIR=$(cd "$(dirname "$0")"; pwd)
# Load shared configuration
# Load shared configuration to get ports
if [ -f "$BASE_DIR/.env.sh" ]; then
source "$BASE_DIR/.env.sh"
else
... ... @@ -10,33 +9,19 @@ else
exit 1
fi
echo "=================================================="
echo "Stopping Front-Backend Z-Image Services"
echo "=================================================="
# 1. Stop Backend Service
echo "Checking Backend Service on port $LOCAL_BACKEND_PORT..."
PID_BACKEND=$(lsof -t -i:$LOCAL_BACKEND_PORT)
if [ -n "$PID_BACKEND" ]; then
echo "Found backend process (PID: $PID_BACKEND). Stopping..."
kill -9 "$PID_BACKEND"
echo "Backend service stopped."
else
echo "No backend service found running on port $LOCAL_BACKEND_PORT."
fi
echo "--------------------------------------------------"
echo "Stopping Z-Image Services..."
# 2. Stop Frontend Service
echo "Checking Frontend Service on port $LOCAL_FRONTEND_PORT..."
PID_FRONTEND=$(lsof -t -i:$LOCAL_FRONTEND_PORT)
if [ -n "$PID_FRONTEND" ]; then
echo "Found frontend process (PID: $PID_FRONTEND). Stopping..."
kill -9 "$PID_FRONTEND"
echo "Frontend service stopped."
if command -v pm2 &> /dev/null; then
pm2 stop z-image-backend z-image-frontend
pm2 delete z-image-backend z-image-frontend
echo "Stopped via PM2."
else
echo "No frontend service found running on port $LOCAL_FRONTEND_PORT."
# Fallback to port-based kill using variables from .env.sh
pids=$(lsof -t -i:$LOCAL_BACKEND_PORT -i:$LOCAL_FRONTEND_PORT)
if [ -n "$pids" ]; then
kill -9 $pids
echo "Killed PIDs on ports $LOCAL_BACKEND_PORT and $LOCAL_FRONTEND_PORT: $pids"
else
echo "No processes found on ports $LOCAL_BACKEND_PORT/$LOCAL_FRONTEND_PORT"
fi
fi
echo "=================================================="
echo "All Z-Image services stopped."
... ...