start_all.sh 3.16 KB
#!/bin/bash

BASE_DIR=$(cd "$(dirname "$0")"; pwd)

# Load shared configuration
if [ -f "$BASE_DIR/.env.sh" ]; then
    source "$BASE_DIR/.env.sh"
else
    echo "Error: .env.sh not found in $BASE_DIR"
    exit 1
fi
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 "=================================================="

# 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
window.APP_CONFIG = {
  Z_IMAGE_DIRECT_BASE_URL: "http://$PUBLIC_IP:$PUBLIC_ZIMAGE_PORT",
  TURBO_DIFFUSION_API_URL: "http://$PUBLIC_IP:$PUBLIC_TURBO_PORT",
  VIDEO_OSS_BASE_URL: "http://$PUBLIC_IP:$PUBLIC_OSS_PORT",
  API_BASE_URL: "http://$PUBLIC_IP:$PUBLIC_BACKEND_PORT",
  VIDEO_GENERATION_LIMIT: ${VIDEO_GENERATION_LIMIT:-1},
  LIKES_FOR_REWARD: ${LIKES_FOR_REWARD:-5}
};
EOF

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"
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"
fi

rotate_log "$BASE_DIR/frontend.log"

export VITE_API_BASE_URL="http://$PUBLIC_IP:$PUBLIC_BACKEND_PORT"

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."