From 4c3c0274ccbd4771f9a1bbc7bb0e8a324e3baffa Mon Sep 17 00:00:00 2001 From: Tianyong Qiu Date: Sat, 8 Feb 2025 16:50:43 +0800 Subject: [PATCH] Update for new change --- devbox/devbox.local/devbox | 413 +++++++++++++++++-------------------- 1 file changed, 186 insertions(+), 227 deletions(-) diff --git a/devbox/devbox.local/devbox b/devbox/devbox.local/devbox index f250a00..e8db385 100644 --- a/devbox/devbox.local/devbox +++ b/devbox/devbox.local/devbox @@ -83,141 +83,161 @@ devbox_init_usage() { printf "%s\n" "Options:" # :command.usage_flags - # :flag.usage + # :flag.usage os (auto, linux, darwin, wsl2) printf " %s\n" "--os OS" printf " Specifies the operating system (auto, linux, darwin, wsl2). Default is auto.\n" printf " %s\n" "Default: auto" echo - # :flag.usage + # :flag.usage arch printf " %s\n" "--arch ARCH" printf " Specifies the architecture (auto, amd64, arm64). Default is auto.\n" printf " %s\n" "Default: auto" echo - # :flag.usage + # :flag.usage devbox container name printf " %s\n" "--devbox-container-name DEVBOX_CONTAINER_NAME" printf " Specifies the DevBox container name. Default is devbox.\n" printf " %s\n" "Default: devbox" echo - # :flag.usage + # :flag.usage devbox container port printf " %s\n" "--devbox-container-port DEVBOX_CONTAINER_PORT" printf " Specifies the container port for DevBox SSH access. Default is 22222.\n" printf " %s\n" "Default: 22222" echo - # :flag.usage + # :flag.usage devbox image repo printf " %s\n" "--devbox-image-repo DEVBOX_IMAGE_REPO" printf " Specifies the DevBox container image repository. Default is\n docker.io/freeleaps.\n" printf " %s\n" "Default: docker.io/freeleaps" echo - # :flag.usage + # :flag.usage devbox frontend port + printf " %s\n" "--devbox-frontend-port DEVBOX_FRONTEND_PORT" + printf " Specifies the container port for DevBox frontend access. Default is 5173.\n" + printf " %s\n" "Default: 5173" + echo + + # :flag.usage devbox backend port + printf " %s\n" "--devbox-backend-port DEVBOX_BACKEND_PORT" + printf " Specifies the container port for DevBox backend access. Default is 8002.\n" + printf " %s\n" "Default: 8002" + echo + + # :flag.usage devbox image name printf " %s\n" "--devbox-image-name DEVBOX_IMAGE_NAME" printf " Specifies the DevBox container image name. Default is devbox.\n" printf " %s\n" "Default: devbox" echo - # :flag.usage + # :flag.usage devbox image tag printf " %s\n" "--devbox-image-tag DEVBOX_IMAGE_TAG" printf " Specifies the DevBox container image tag. Default is latest.\n" printf " %s\n" "Default: latest" echo - # :flag.usage + # :flag.usage working home printf " %s\n" "--working-home WORKING_HOME" printf " Specifies the working home of DevBox CLI. Default is ${HOME}/.devbox.\n" echo - # :flag.usage + # :flag.usage freeleaps username printf " %s\n" "--freeleaps-username FREELEAPS_USERNAME (required)" - printf " Specifies the Freeleaps.com username (Required).\n" + printf " Specifies the Freeleaps.com repository username (Required).\n" echo - # :flag.usage + # :flag.usage freeleaps password printf " %s\n" "--freeleaps-password FREELEAPS_PASSWORD (required)" - printf " Specifies the Freeleaps.com password (Required).\n" + printf " Specifies the Freeleaps.com password repository (Required).\n" echo - # :flag.usage + # :flag.usage use local component printf " %s\n" "--use-local-component IS_USE_LOCAL_COMPONENT" printf " Check if use local component or use online dev environment. (Default: false, use online service) (Optional)\n" echo - # :flag.usage + # :flag.usage devsvc image repo printf " %s\n" "--devsvc-image-repo DEVSVC_IMAGE_REPO" printf " Specifies the repository for devsvc component. (Optional)\n" echo - # :flag.usage + # :flag.usage devsvc image name printf " %s\n" "--devsvc-image-name DEVSVC_IMAGE_NAME" printf " Specifies the image name for devsvc component. (Optional)\n" echo - # :flag.usage + # :flag.usage devsvc image tag printf " %s\n" "--devsvc-image-tag DEVSVC_IMAGE_TAG" printf " Specifies the image tag for devsvc component. (Optional, default=latest)\n" printf " %s\n" "Default: latest" echo - # 用于 notification 组件的 usage 说明 + # :flag.usage notification image repo printf " %s\n" "--notification-image-repo NOTIFICATION_IMAGE_REPO" printf " Specifies the repository for notification component. (Optional)\n" echo + # :flag.usage notification image name printf " %s\n" "--notification-image-name NOTIFICATION_IMAGE_NAME" printf " Specifies the image name for notification component. (Optional)\n" echo + # :flag.usage notification image tag printf " %s\n" "--notification-image-tag NOTIFICATION_IMAGE_TAG" printf " Specifies the image tag for notification component. (Optional, default=latest)\n" printf " %s\n" "Default: latest" echo - # 用于 content 组件的 usage 说明 + # :flag.usage content image repo printf " %s\n" "--content-image-repo CONTENT_IMAGE_REPO" printf " Specifies the repository for content component. (Optional)\n" echo + # :flag.usage content image name printf " %s\n" "--content-image-name CONTENT_IMAGE_NAME" printf " Specifies the image name for content component. (Optional)\n" echo + # :flag.usage content image tag printf " %s\n" "--content-image-tag CONTENT_IMAGE_TAG" printf " Specifies the image tag for content component. (Optional, default=latest)\n" printf " %s\n" "Default: latest" echo - # 用于 central_storage 组件的 usage 说明 + # :flag.usage central storage image repo printf " %s\n" "--central_storage-image-repo CENTRAL_STORAGE_IMAGE_REPO" printf " Specifies the repository for central_storage component. (Optional)\n" echo + # :flag.usage central storage image name printf " %s\n" "--central_storage-image-name CENTRAL_STORAGE_IMAGE_NAME" printf " Specifies the image name for central_storage component. (Optional)\n" echo + # :flag.usage central storage image tag printf " %s\n" "--central_storage-image-tag CENTRAL_STORAGE_IMAGE_TAG" printf " Specifies the image tag for central_storage component. (Optional, default=latest)\n" printf " %s\n" "Default: latest" echo - # 用于 authentication 组件的 usage 说明 + # :flag.usage authentication image repo printf " %s\n" "--authentication-image-repo AUTHENTICATION_IMAGE_REPO" printf " Specifies the repository for authentication component. (Optional)\n" echo + # :flag.usage authentication image name printf " %s\n" "--authentication-image-name AUTHENTICATION_IMAGE_NAME" printf " Specifies the image name for authentication component. (Optional)\n" echo + # :flag.usage authentication image tag printf " %s\n" "--authentication-image-tag AUTHENTICATION_IMAGE_TAG" printf " Specifies the image tag for authentication component. (Optional, default=latest)\n" printf " %s\n" "Default: latest" echo - # :flag.usage + # :flag.usage force printf " %s\n" "--force, -f" printf " Force initialization even if resources already exist.\n" echo @@ -631,7 +651,7 @@ devbox_init_command() { fi fi - + # Create and start DevBox container local container_id container_id="$( @@ -640,6 +660,7 @@ devbox_init_command() { -p "${DEVBOX_PORT}:22" \ -p "${DEVBOX_FRONTEND_PORT}:5173" \ -p "${DEVBOX_BACKEND_PORT}:8002" \ + -v "$WORKING_HOME:/home/.devbox" \ -v /var/run/docker.sock:/var/run/docker.sock \ "$devbox_full_image" 2>/dev/null )" @@ -648,10 +669,10 @@ devbox_init_command() { echo "ERROR: Failed to create DevBox container." exit 1 fi - echo "DevBox container created: $container_id" # record container id - echo "$container_id" > "${WORKING_HOME}/.devbox-instance" + echo "$container_id" > "$WORKING_HOME/.devbox-instance" + # ------------------------------------------------------------------- # 6. linbwang: pull and start other components @@ -706,26 +727,130 @@ if [[ "${USE_LOCAL_COMPONENT,,}" == "true" ]]; then if [[ -z "$component_container_id" ]]; then echo "WARNING: Failed to create ${component} container. please Check the image and specify it to initialize the component." fi - echo "$component_container_id" > "${WORKING_HOME}/.${component}-instance" + echo "$component_container_id" > "/home/.devbox/.${component}-instance" echo "${component} container created: $component_container_id" done -else - echo ' ===> Using online components for Freeleaps services.' -fi + + # 3.Create and start MongoDB container + echo "Step 3. [INFO] Starting MongoDB container..." + + MONGO_CONTAINER_NAME="freeleaps2-mongo" + MONGO_IMAGE="mongo:latest" + + # if a container with the same name exists, remove it + if docker ps -a --format '{{.Names}}' | grep -q "^${MONGO_CONTAINER_NAME}\$"; then + echo "==> Removing existing MongoDB container..." + docker stop "$MONGO_CONTAINER_NAME" &>/dev/null || true + docker rm "$MONGO_CONTAINER_NAME" &>/dev/null || true + fi + + echo "==> Pulling MongoDB image: $MONGO_IMAGE" + if ! docker pull "$MONGO_IMAGE"; then + echo "ERROR: Failed to pull MongoDB image: $MONGO_IMAGE" + exit 1 + fi + + echo "==> Starting MongoDB container..." + mongo_container_id=$(docker run -d --name "$MONGO_CONTAINER_NAME" -p 27017:27017 "$MONGO_IMAGE") + if [[ -z "$mongo_container_id" ]]; then + echo "ERROR: Failed to start MongoDB container." + exit 1 + fi + echo "MongoDB container started successfully: $mongo_container_id" + + sleep 10 + + + echo '============================================' + + MAX_ATTEMPTS=10 + ATTEMPT=0 + while [ $ATTEMPT -lt $MAX_ATTEMPTS ]; do + if docker exec "$MONGO_CONTAINER_NAME" mongosh --eval "db.adminCommand('ping')" 2>/dev/null | grep -q '{ ok: 1 }'; then + echo "MongoDB health check passed." + break + fi + echo "Waiting for MongoDB to be ready... (Attempt $((ATTEMPT+1)))" + sleep 10 + ATTEMPT=$((ATTEMPT+1)) + done + + if [ $ATTEMPT -eq $MAX_ATTEMPTS ]; then + echo "ERROR: MongoDB health check failed." + exit 1 + fi + + echo "Step 4. [INFO] Starting MongoDB container..." + +else + echo '============================================' + echo ' ===> Using online components for Freeleaps services.' + echo '============================================' +fi + # 4. Pull and start RabbitMQ container + echo "Step 4. [INFO] Starting RabbitMQ container..." + + RABBITMQ_CONTAINER_NAME="freeleaps2-rabbitmq" + RABBITMQ_IMAGE="rabbitmq:latest" + + # If a container with the same name exists, remove it + if docker ps -a --format '{{.Names}}' | grep -q "^${RABBITMQ_CONTAINER_NAME}\$"; then + echo "==> Removing existing RabbitMQ container..." + docker stop "${RABBITMQ_CONTAINER_NAME}" &>/dev/null || true + docker rm "${RABBITMQ_CONTAINER_NAME}" &>/dev/null || true + fi + + # Pull the RabbitMQ image + echo "==> Pulling RabbitMQ image: ${RABBITMQ_IMAGE}" + if ! docker pull "${RABBITMQ_IMAGE}"; then + echo "ERROR: Failed to pull RabbitMQ image: ${RABBITMQ_IMAGE}" + exit 1 + fi + + # Run the RabbitMQ container mapping port 5672 + echo "==> Starting RabbitMQ container..." + rabbitmq_container_id=$(docker run -d --name "${RABBITMQ_CONTAINER_NAME}" -p 5672:5672 "${RABBITMQ_IMAGE}") + + if [[ -z "${rabbitmq_container_id}" ]]; then + echo "ERROR: Failed to start RabbitMQ container." + exit 1 + fi + echo "RabbitMQ container started successfully: ${rabbitmq_container_id}" + + # Allow RabbitMQ some time to initialize + sleep 20 + + # Check RabbitMQ health via rabbitmqctl + if docker exec "${RABBITMQ_CONTAINER_NAME}" rabbitmqctl status &>/dev/null; then + echo "RabbitMQ health check passed." + else + echo "ERROR: RabbitMQ health check failed." + exit 1 + fi + echo "Step 5. [INFO] Starting RabbitMQ container..." + + + + docker exec -i "$DEVBOX_NAME" bash < Using local components" + # Local components for Freeleaps services (devsvc, notification, content, central_storage, authentication) cat << 'EOFinner' > ~/freeleaps_home/freeleaps/.dev.env # Online endpoint info export MONGODB_NAME=freeleaps2 @@ -778,21 +904,24 @@ EOFinner else cat << 'EOFinner' > ~/freeleaps_home/freeleaps/.dev.env # Online endpoint info - export MONGODB_NAME=freeleaps2-mongo - export MONGODB_URI=mongodb://\$DEFAULT_IP:27017/ - export SITE_ACCESS_PORT=80 - export FREELEAPS_ENV=dev - export STRIPE_API_KEY=sk_test_51Ogsw5B0IyqaSJBrwczlr820jnmvA1qQQGoLZ2XxOsIzikpmXo4pRLjw4XVMTEBR8DdVTYySiAv1XX53Zv5xqynF00GfMqttFd - export STRIPE_WEBHOOK_SECRET= - export SITE_URL_ROOT=http://localhost/ - export BLOB_STORE_CONNECTION_STR="DefaultEndpointsProtocol=https;AccountName=freeleaps1static;AccountKey=SIk7S3RviJxl1XhGiDZKA3cvzfxNrSbsBMfJ3EbKTsKPeMwhy8FTLpJliRLzQVE6uaSX8giDYw2h+ASt5MmHxQ==;EndpointSuffix=core.windows.net" + export MONGODB_NAME=freeleaps2 + export MONGODB_PORT=27017 + export MONGODB_URI='mongodb+srv://jetli:8IHKx6dZK8BfugGp@freeleaps2.hanbj.mongodb.net/' + export RABBITMQ_HOSTNAME=\$DEFAULT_IP export RABBITMQ_HOST=\$DEFAULT_IP export RABBITMQ_PORT=5672 - export FREELEAPS_DEVSVC_ENDPOINT=http://localhost:8007/api/devsvc/ - export FREELEAPS_CONTENT_ENDPOINT=http://localhost:8013/api/content/ - export FREELEAPS_CENTRAL_STORAGE_ENDPOINT=http://localhost:8005/api/central_storage/ - export JWT_SECRET_KEY=8f87ca8c3c9c3df09a9c78e0adb0927855568f6072d9efc892534aee35f5867b - export FREELEAPS_AUTHENTICATION_ENDPOINT=http://localhost:8004/api/auth/ + export FREELEAPS_ENV=dev + export STRIPE_API_KEY=sk_test_51Ogsw5B0IyqaSJBrwczlr820jnmvA1qQQGoLZ2XxOsIzikpmXo4pRLjw4XVMTEBR8DdVTYySiAv1XX53Zv5xqynF00GfMqttFd + export STRIPE_WEBHOOK_SECRET=whsec_S6ZWjSAdR5Cpsn2USH6ZRBqbdBIENjTC + export STRIPE_ACCOUNT_WEBHOOK_SECRET=whsec_PgPnkWGhEUiQfnV8aIb5Wmruz7XETJLm + export SITE_URL_ROOT=http://localhost/ + export FREELEAPS_DEVSVC_ENDPOINT=http://ip: 52.149.3.85:8007/api/devsvc/ + export FREELEAPS_CONTENT_ENDPOINT=http://52.149.35.244:8013/api/content/ + export FREELEAPS_PAYMENT_ENDPOINT=http://52.149.35.244:8006/api/payment/ + export FREELEAPS_CENTRAL_STORAGE_ENDPOINT=http://52.149.35.244:8005/api/central_storage/ + export FREELEAPS_AUTHENTICATION_ENDPOINT=http://52.149.35.244:8004/api/auth/ + export FREELEAPS_AILAB_ENDPOINT=https://as010-w2-re-vm.mathmast.com:8009/api/ + export KAFKA_SERVER_URL='' export EMAIL_FROM=freeleaps@freeleaps.com EOFinner fi @@ -804,161 +933,6 @@ cp ~/freeleaps_home/freeleaps/.dev.env ~/freeleaps_home/freeleaps/.env source ~/freeleaps_home/freeleaps/.dev.env source ~/freeleaps_home/freeleaps/apps/.env -echo "Step 3. [INFO] Checking Docker installation..." - - # 1. Check docker CLI installted - if ! command -v docker >/dev/null 2>&1; then - echo "[ERROR] Docker CLI is not installed." - exit 1 - fi - - echo "[INFO] Docker CLI is installed. Checking daemon..." - - # 2. Check if Docker Daemon running - if docker info >/dev/null 2>&1; then - echo '============================================' - echo "[OK] Docker daemon is running." - echo '============================================' - else - - if grep -qi microsoft /proc/version; then - echo "[INFO] Detected WSL environment. Verifying Docker socket..." - if [ -S /var/run/docker.sock ]; then - echo "[OK] Docker socket found." - else - # WSL 2 with Docker Desktop - if [[ "$OSTYPE" == "linux-gnu"* ]]; then - echo "[INFO] Running on Linux. Attempting to start Docker service..." - if command -v systemctl >/dev/null 2>&1; then - echo "[INFO] Starting Docker with systemctl..." - sudo systemctl start docker - sleep 2 - if systemctl is-active --quiet docker; then - echo "[OK] Docker service started successfully via systemctl." - else - echo "[ERROR] Failed to start Docker using systemctl." - exit 1 - fi - elif command -v service >/dev/null 2>&1; then - echo "[INFO] systemctl not found, trying to start Docker using service..." - sudo service docker start - sleep 2 - if docker info >/dev/null 2>&1; then - echo "[OK] Docker service started successfully via service command." - else - echo "[ERROR] Failed to start Docker using service command." - exit 1 - fi - else - echo "[ERROR] Neither systemctl nor service command found. Please start Docker manually." - exit 1 - fi - fi - - fi - fi - fi - - - -# 3.Create and start MongoDB container -echo "Step 4=2. [INFO] Starting MongoDB container..." - -MONGO_CONTAINER_NAME="freeleaps2-mongo" -MONGO_IMAGE="mongo:latest" - -# if a container with the same name exists, remove it -if docker ps -a --format '{{.Names}}' | grep -q "^\${MONGO_CONTAINER_NAME}\$"; then - echo "==> Removing existing MongoDB container..." - docker stop "\$MONGO_CONTAINER_NAME" &>/dev/null || true - docker rm "\$MONGO_CONTAINER_NAME" &>/dev/null || true -fi - -echo "==> Pulling MongoDB image: \$MONGO_IMAGE" -if ! docker pull "\$MONGO_IMAGE"; then - echo "ERROR: Failed to pull MongoDB image: \$MONGO_IMAGE" - exit 1 -fi - -echo "==> Starting MongoDB container..." -mongo_container_id=\$(docker run -d --name "\$MONGO_CONTAINER_NAME" -p 27017:27017 "\$MONGO_IMAGE") -if [[ -z "\$mongo_container_id" ]]; then - echo "ERROR: Failed to start MongoDB container." - exit 1 -fi -echo "MongoDB container started successfully: \$mongo_container_id" - -sleep 10 - - -echo '============================================' - -MAX_ATTEMPTS=10 -ATTEMPT=0 -while [ \$ATTEMPT -lt \$MAX_ATTEMPTS ]; do - if docker exec "\$MONGO_CONTAINER_NAME" mongosh --eval "db.adminCommand('ping')" 2>/dev/null | grep -q '{ ok: 1 }'; then - echo "MongoDB health check passed." - break - fi - echo "Waiting for MongoDB to be ready... (Attempt \$((ATTEMPT+1)))" - sleep 10 - ATTEMPT=\$((ATTEMPT+1)) -done - -if [ \$ATTEMPT -eq \$MAX_ATTEMPTS ]; then - echo "ERROR: MongoDB health check failed." - exit 1 -fi - -echo "Step 4. [INFO] Starting MongoDB container..." - - -pushd ~/freeleaps_home/freeleaps - -# 4. 安装RABBITMQ_HOST=localhost, RABBITMQ_PORT=5672 docker 容器镜像,并检查是否成功启动 -echo "Step 4. [INFO] Starting RabbitMQ container..." - -RABBITMQ_CONTAINER_NAME="freeleaps2-rabbitmq" -RABBITMQ_IMAGE="rabbitmq:latest" - -# If a container with the same name exists, remove it -if docker ps -a --format '{{.Names}}' | grep -q "^\${RABBITMQ_CONTAINER_NAME}\$"; then - echo "==> Removing existing RabbitMQ container..." - docker stop "\${RABBITMQ_CONTAINER_NAME}" &>/dev/null || true - docker rm "\${RABBITMQ_CONTAINER_NAME}" &>/dev/null || true -fi - -# Pull the RabbitMQ image -echo "==> Pulling RabbitMQ image: \${RABBITMQ_IMAGE}" -if ! docker pull "\${RABBITMQ_IMAGE}"; then - echo "ERROR: Failed to pull RabbitMQ image: \${RABBITMQ_IMAGE}" - exit 1 -fi - -# Run the RabbitMQ container mapping port 5672 -echo "==> Starting RabbitMQ container..." -rabbitmq_container_id=\$(docker run -d --name "\${RABBITMQ_CONTAINER_NAME}" -p 5672:5672 "\${RABBITMQ_IMAGE}") - -if [[ -z "\${rabbitmq_container_id}" ]]; then - echo "ERROR: Failed to start RabbitMQ container." - exit 1 -fi -echo "RabbitMQ container started successfully: \${rabbitmq_container_id}" - -# Allow RabbitMQ some time to initialize -sleep 20 - -# Check RabbitMQ health via rabbitmqctl -if docker exec "\${RABBITMQ_CONTAINER_NAME}" rabbitmqctl status &>/dev/null; then - echo "RabbitMQ health check passed." -else - echo "ERROR: RabbitMQ health check failed." - exit 1 -fi -echo "Step 5. [INFO] Starting RabbitMQ container..." - -echo '============================================' - # Run start_webapi.sh and check if success started echo "Step 4: Run start_webapi.sh and check if success started" @@ -976,34 +950,18 @@ sudo apt update sudo apt install python3.10 python3.10-venv -y -echo '============================================1' -dpkg -l | grep python3.10-venv - -echo '============================================1' # make sore python3.10 is installed if ! command -v python3.10 &>/dev/null; then echo "ERROR: Python3.10 is not installed." exit 1 fi -# Set python3.10 as default python3 -echo "6.1. Set Python3.10 as default Python3" -sudo update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.10 1 -sudo update-alternatives --config python3 -# Check if the ladvei +# Upgrade pip and install virtualenv echo "7. Upgrade pip and install virtualenv" python3.10 -m ensurepip --upgrade python3.10 -m pip install --upgrade pip - -echo '============================================' - -echo 'Current path: ' -pwd - -echo '============================================' - # 8. Create and activate a virtual environment echo "8. Create and activate a virtual environment" python3.10 -m venv venv_t @@ -1012,7 +970,7 @@ sleep 5 # CHeck if the virtual environment is created if [ ! -f "venv_t/bin/activate" ]; then - echo "ERROR: 虚拟环境没有创建成功" + echo "ERROR: The virtual environment cannot be created" exit 1 fi @@ -1040,7 +998,7 @@ pip install -r ~/freeleaps_home/freeleaps/apps/requirements.txt echo '============================================' echo 'Start to run start_webapi.sh' echo '============================================' -./start_webapi.sh > /tmp/webapi.logs 2>&1 & +./start_webapi.sh > /home/.devbox/logs/backend.logs 2>&1 & WEBAPI_PID=\$! @@ -1050,21 +1008,22 @@ echo '============================================' sleep 30 -MAX_ATTEMPTS=30 # 30次尝试,每次10秒,总等待5分钟 +# 30 attempts, 5 seconds each, total wait time 2.5 minutes +MAX_ATTEMPTS=30 ATTEMPT=0 echo "Waiting for WebAPI service to become healthy..." while [ \$ATTEMPT -lt \$MAX_ATTEMPTS ]; do HTTP_CODE=\$(curl -s -o /dev/null -w "%{http_code}" "http://localhost:\$DEVBOX_BACKEND_PORT/docs") - # 判断返回的状态码是否为 200 + # Check HTTP Code 200 if [ "\$HTTP_CODE" -eq 200 ]; then echo "Backend Swagger UI is available at \$URL (HTTP \$HTTP_CODE)" break else echo "Waiting for Swagger UI to become available... Attempt \$((ATTEMPT+1))" ATTEMPT=\$((ATTEMPT+1)) - sleep 5 # 等待 5 秒后重试 + sleep 5 # Wait 5 seconds fi done @@ -1091,13 +1050,13 @@ npm install -g pnpm pnpm install npm run build npm run format -# 静默后台启动 npm run dev,将输出重定向到 /dev/null -nohup npm run dev > /dev/null 2>&1 & +# Start the frontend service with nohup in order to keep it running after the SSH session is closed +nohup npm run dev > /home/.devbox/logs/frontend.logs > /dev/null 2>&1 & -# 获取后台启动进程的 PID(可选) +# Save the process ID of the frontend service DEV_PID=$! -echo "npm run dev 已启动,进程号: \$DEV_PID" +echo "npm run dev has been started with PID: \$DEV_PID" echo '============================================' @@ -1135,7 +1094,7 @@ EOF # ------------------------------------------------------------------- - # 10. Final + # 10. Final notification # ------------------------------------------------------------------- echo echo "===========================================================" @@ -1143,8 +1102,8 @@ EOF echo " DevBox container ID: $container_id" [[ -f "${WORKING_HOME}/.devsvc-instance" ]] && echo " devsvc container ID: $(cat "${WORKING_HOME}/.devsvc-instance")" echo " Repository cloned to: $repo_dir" - echo " Back-end logs: $WORKING_HOME/logs/back-end.logs" - echo " Front-end logs: $WORKING_HOME/logs/front-end.logs" + echo " Backend logs: $WORKING_HOME/logs/backend.logs" + echo " Frontend logs: $WORKING_HOME/logs/frontend.logs" echo "===========================================================" echo