Update for new change

This commit is contained in:
Tianyong Qiu 2025-02-08 16:50:43 +08:00
parent 0aef2aaae6
commit 4c3c0274cc

View File

@ -83,141 +83,161 @@ devbox_init_usage() {
printf "%s\n" "Options:" printf "%s\n" "Options:"
# :command.usage_flags # :command.usage_flags
# :flag.usage # :flag.usage os (auto, linux, darwin, wsl2)
printf " %s\n" "--os OS" printf " %s\n" "--os OS"
printf " Specifies the operating system (auto, linux, darwin, wsl2). Default is auto.\n" printf " Specifies the operating system (auto, linux, darwin, wsl2). Default is auto.\n"
printf " %s\n" "Default: auto" printf " %s\n" "Default: auto"
echo echo
# :flag.usage # :flag.usage arch
printf " %s\n" "--arch ARCH" printf " %s\n" "--arch ARCH"
printf " Specifies the architecture (auto, amd64, arm64). Default is auto.\n" printf " Specifies the architecture (auto, amd64, arm64). Default is auto.\n"
printf " %s\n" "Default: auto" printf " %s\n" "Default: auto"
echo echo
# :flag.usage # :flag.usage devbox container name
printf " %s\n" "--devbox-container-name DEVBOX_CONTAINER_NAME" printf " %s\n" "--devbox-container-name DEVBOX_CONTAINER_NAME"
printf " Specifies the DevBox container name. Default is devbox.\n" printf " Specifies the DevBox container name. Default is devbox.\n"
printf " %s\n" "Default: devbox" printf " %s\n" "Default: devbox"
echo echo
# :flag.usage # :flag.usage devbox container port
printf " %s\n" "--devbox-container-port 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 " Specifies the container port for DevBox SSH access. Default is 22222.\n"
printf " %s\n" "Default: 22222" printf " %s\n" "Default: 22222"
echo echo
# :flag.usage # :flag.usage devbox image repo
printf " %s\n" "--devbox-image-repo 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 " Specifies the DevBox container image repository. Default is\n docker.io/freeleaps.\n"
printf " %s\n" "Default: docker.io/freeleaps" printf " %s\n" "Default: docker.io/freeleaps"
echo 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 " %s\n" "--devbox-image-name DEVBOX_IMAGE_NAME"
printf " Specifies the DevBox container image name. Default is devbox.\n" printf " Specifies the DevBox container image name. Default is devbox.\n"
printf " %s\n" "Default: devbox" printf " %s\n" "Default: devbox"
echo echo
# :flag.usage # :flag.usage devbox image tag
printf " %s\n" "--devbox-image-tag DEVBOX_IMAGE_TAG" printf " %s\n" "--devbox-image-tag DEVBOX_IMAGE_TAG"
printf " Specifies the DevBox container image tag. Default is latest.\n" printf " Specifies the DevBox container image tag. Default is latest.\n"
printf " %s\n" "Default: latest" printf " %s\n" "Default: latest"
echo echo
# :flag.usage # :flag.usage working home
printf " %s\n" "--working-home WORKING_HOME" printf " %s\n" "--working-home WORKING_HOME"
printf " Specifies the working home of DevBox CLI. Default is ${HOME}/.devbox.\n" printf " Specifies the working home of DevBox CLI. Default is ${HOME}/.devbox.\n"
echo echo
# :flag.usage # :flag.usage freeleaps username
printf " %s\n" "--freeleaps-username FREELEAPS_USERNAME (required)" 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 echo
# :flag.usage # :flag.usage freeleaps password
printf " %s\n" "--freeleaps-password FREELEAPS_PASSWORD (required)" 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 echo
# :flag.usage # :flag.usage use local component
printf " %s\n" "--use-local-component IS_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" printf " Check if use local component or use online dev environment. (Default: false, use online service) (Optional)\n"
echo echo
# :flag.usage # :flag.usage devsvc image repo
printf " %s\n" "--devsvc-image-repo DEVSVC_IMAGE_REPO" printf " %s\n" "--devsvc-image-repo DEVSVC_IMAGE_REPO"
printf " Specifies the repository for devsvc component. (Optional)\n" printf " Specifies the repository for devsvc component. (Optional)\n"
echo echo
# :flag.usage # :flag.usage devsvc image name
printf " %s\n" "--devsvc-image-name DEVSVC_IMAGE_NAME" printf " %s\n" "--devsvc-image-name DEVSVC_IMAGE_NAME"
printf " Specifies the image name for devsvc component. (Optional)\n" printf " Specifies the image name for devsvc component. (Optional)\n"
echo echo
# :flag.usage # :flag.usage devsvc image tag
printf " %s\n" "--devsvc-image-tag 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 " Specifies the image tag for devsvc component. (Optional, default=latest)\n"
printf " %s\n" "Default: latest" printf " %s\n" "Default: latest"
echo echo
# 用于 notification 组件的 usage 说明 # :flag.usage notification image repo
printf " %s\n" "--notification-image-repo NOTIFICATION_IMAGE_REPO" printf " %s\n" "--notification-image-repo NOTIFICATION_IMAGE_REPO"
printf " Specifies the repository for notification component. (Optional)\n" printf " Specifies the repository for notification component. (Optional)\n"
echo echo
# :flag.usage notification image name
printf " %s\n" "--notification-image-name NOTIFICATION_IMAGE_NAME" printf " %s\n" "--notification-image-name NOTIFICATION_IMAGE_NAME"
printf " Specifies the image name for notification component. (Optional)\n" printf " Specifies the image name for notification component. (Optional)\n"
echo echo
# :flag.usage notification image tag
printf " %s\n" "--notification-image-tag 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 " Specifies the image tag for notification component. (Optional, default=latest)\n"
printf " %s\n" "Default: latest" printf " %s\n" "Default: latest"
echo echo
# 用于 content 组件的 usage 说明 # :flag.usage content image repo
printf " %s\n" "--content-image-repo CONTENT_IMAGE_REPO" printf " %s\n" "--content-image-repo CONTENT_IMAGE_REPO"
printf " Specifies the repository for content component. (Optional)\n" printf " Specifies the repository for content component. (Optional)\n"
echo echo
# :flag.usage content image name
printf " %s\n" "--content-image-name CONTENT_IMAGE_NAME" printf " %s\n" "--content-image-name CONTENT_IMAGE_NAME"
printf " Specifies the image name for content component. (Optional)\n" printf " Specifies the image name for content component. (Optional)\n"
echo echo
# :flag.usage content image tag
printf " %s\n" "--content-image-tag 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 " Specifies the image tag for content component. (Optional, default=latest)\n"
printf " %s\n" "Default: latest" printf " %s\n" "Default: latest"
echo echo
# 用于 central_storage 组件的 usage 说明 # :flag.usage central storage image repo
printf " %s\n" "--central_storage-image-repo 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" printf " Specifies the repository for central_storage component. (Optional)\n"
echo echo
# :flag.usage central storage image name
printf " %s\n" "--central_storage-image-name 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" printf " Specifies the image name for central_storage component. (Optional)\n"
echo echo
# :flag.usage central storage image tag
printf " %s\n" "--central_storage-image-tag 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 " Specifies the image tag for central_storage component. (Optional, default=latest)\n"
printf " %s\n" "Default: latest" printf " %s\n" "Default: latest"
echo echo
# 用于 authentication 组件的 usage 说明 # :flag.usage authentication image repo
printf " %s\n" "--authentication-image-repo AUTHENTICATION_IMAGE_REPO" printf " %s\n" "--authentication-image-repo AUTHENTICATION_IMAGE_REPO"
printf " Specifies the repository for authentication component. (Optional)\n" printf " Specifies the repository for authentication component. (Optional)\n"
echo echo
# :flag.usage authentication image name
printf " %s\n" "--authentication-image-name AUTHENTICATION_IMAGE_NAME" printf " %s\n" "--authentication-image-name AUTHENTICATION_IMAGE_NAME"
printf " Specifies the image name for authentication component. (Optional)\n" printf " Specifies the image name for authentication component. (Optional)\n"
echo echo
# :flag.usage authentication image tag
printf " %s\n" "--authentication-image-tag 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 " Specifies the image tag for authentication component. (Optional, default=latest)\n"
printf " %s\n" "Default: latest" printf " %s\n" "Default: latest"
echo echo
# :flag.usage # :flag.usage force
printf " %s\n" "--force, -f" printf " %s\n" "--force, -f"
printf " Force initialization even if resources already exist.\n" printf " Force initialization even if resources already exist.\n"
echo echo
@ -640,6 +660,7 @@ devbox_init_command() {
-p "${DEVBOX_PORT}:22" \ -p "${DEVBOX_PORT}:22" \
-p "${DEVBOX_FRONTEND_PORT}:5173" \ -p "${DEVBOX_FRONTEND_PORT}:5173" \
-p "${DEVBOX_BACKEND_PORT}:8002" \ -p "${DEVBOX_BACKEND_PORT}:8002" \
-v "$WORKING_HOME:/home/.devbox" \
-v /var/run/docker.sock:/var/run/docker.sock \ -v /var/run/docker.sock:/var/run/docker.sock \
"$devbox_full_image" 2>/dev/null "$devbox_full_image" 2>/dev/null
)" )"
@ -648,10 +669,10 @@ devbox_init_command() {
echo "ERROR: Failed to create DevBox container." echo "ERROR: Failed to create DevBox container."
exit 1 exit 1
fi fi
echo "DevBox container created: $container_id"
# record 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 # 6. linbwang: pull and start other components
@ -706,12 +727,111 @@ if [[ "${USE_LOCAL_COMPONENT,,}" == "true" ]]; then
if [[ -z "$component_container_id" ]]; 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." echo "WARNING: Failed to create ${component} container. please Check the image and specify it to initialize the component."
fi fi
echo "$component_container_id" > "${WORKING_HOME}/.${component}-instance" echo "$component_container_id" > "/home/.devbox/.${component}-instance"
echo "${component} container created: $component_container_id" echo "${component} container created: $component_container_id"
done done
# 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 else
echo '============================================'
echo ' ===> Using online components for Freeleaps services.' echo ' ===> Using online components for Freeleaps services.'
echo '============================================'
fi 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 <<EOF docker exec -i "$DEVBOX_NAME" bash <<EOF
@ -719,13 +839,18 @@ docker exec -i "$DEVBOX_NAME" bash <<EOF
export DEBIAN_FRONTEND=noninteractive export DEBIAN_FRONTEND=noninteractive
export FREELEAPS_USERNAME="${FREELEAPS_USERNAME}" export FREELEAPS_USERNAME="${FREELEAPS_USERNAME}"
export FREELEAPS_PASSWORD="${FREELEAPS_PASSWORD}" export FREELEAPS_PASSWORD="${FREELEAPS_PASSWORD}"
export WORKING_HOME="${WORKING_HOME}"
export USE_LOCAL_COMPONENT="${USE_LOCAL_COMPONENT}" export USE_LOCAL_COMPONENT="${USE_LOCAL_COMPONENT}"
export DEVBOX_BACKEND_PORT="${DEVBOX_BACKEND_PORT}" export DEVBOX_BACKEND_PORT="${DEVBOX_BACKEND_PORT}"
export DEVBOX_FRONTEND_PORT="${DEVBOX_FRONTEND_PORT}" export DEVBOX_FRONTEND_PORT="${DEVBOX_FRONTEND_PORT}"
export OSTYPE="${OSTYPE}"
# Ensure /home/.devbox/logs exists
mkdir -p "/home/.devbox/logs"
# Get default IP address
DEFAULT_IP=\$(ip route | grep default | sed -n 's/.*default via \([^ ]*\).*/\1/p') DEFAULT_IP=\$(ip route | grep default | sed -n 's/.*default via \([^ ]*\).*/\1/p')
export OSTYPE="${OSTYPE}"
echo "Starting freeleaps services..." echo "Starting freeleaps services..."
@ -756,6 +881,7 @@ echo "step 2: Update ~/freeleaps_home/freeleaps/.dev.env"
if [[ "${USE_LOCAL_COMPONENT,,}" == "true" ]]; then if [[ "${USE_LOCAL_COMPONENT,,}" == "true" ]]; then
echo "==> Using local components" echo "==> Using local components"
# Local components for Freeleaps services (devsvc, notification, content, central_storage, authentication)
cat << 'EOFinner' > ~/freeleaps_home/freeleaps/.dev.env cat << 'EOFinner' > ~/freeleaps_home/freeleaps/.dev.env
# Online endpoint info # Online endpoint info
export MONGODB_NAME=freeleaps2 export MONGODB_NAME=freeleaps2
@ -778,21 +904,24 @@ EOFinner
else else
cat << 'EOFinner' > ~/freeleaps_home/freeleaps/.dev.env cat << 'EOFinner' > ~/freeleaps_home/freeleaps/.dev.env
# Online endpoint info # Online endpoint info
export MONGODB_NAME=freeleaps2-mongo export MONGODB_NAME=freeleaps2
export MONGODB_URI=mongodb://\$DEFAULT_IP:27017/ export MONGODB_PORT=27017
export SITE_ACCESS_PORT=80 export MONGODB_URI='mongodb+srv://jetli:8IHKx6dZK8BfugGp@freeleaps2.hanbj.mongodb.net/'
export FREELEAPS_ENV=dev export RABBITMQ_HOSTNAME=\$DEFAULT_IP
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 RABBITMQ_HOST=\$DEFAULT_IP export RABBITMQ_HOST=\$DEFAULT_IP
export RABBITMQ_PORT=5672 export RABBITMQ_PORT=5672
export FREELEAPS_DEVSVC_ENDPOINT=http://localhost:8007/api/devsvc/ export FREELEAPS_ENV=dev
export FREELEAPS_CONTENT_ENDPOINT=http://localhost:8013/api/content/ export STRIPE_API_KEY=sk_test_51Ogsw5B0IyqaSJBrwczlr820jnmvA1qQQGoLZ2XxOsIzikpmXo4pRLjw4XVMTEBR8DdVTYySiAv1XX53Zv5xqynF00GfMqttFd
export FREELEAPS_CENTRAL_STORAGE_ENDPOINT=http://localhost:8005/api/central_storage/ export STRIPE_WEBHOOK_SECRET=whsec_S6ZWjSAdR5Cpsn2USH6ZRBqbdBIENjTC
export JWT_SECRET_KEY=8f87ca8c3c9c3df09a9c78e0adb0927855568f6072d9efc892534aee35f5867b export STRIPE_ACCOUNT_WEBHOOK_SECRET=whsec_PgPnkWGhEUiQfnV8aIb5Wmruz7XETJLm
export FREELEAPS_AUTHENTICATION_ENDPOINT=http://localhost:8004/api/auth/ 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 export EMAIL_FROM=freeleaps@freeleaps.com
EOFinner EOFinner
fi 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/.dev.env
source ~/freeleaps_home/freeleaps/apps/.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 # Run start_webapi.sh and check if success started
echo "Step 4: 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 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 # make sore python3.10 is installed
if ! command -v python3.10 &>/dev/null; then if ! command -v python3.10 &>/dev/null; then
echo "ERROR: Python3.10 is not installed." echo "ERROR: Python3.10 is not installed."
exit 1 exit 1
fi 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" echo "7. Upgrade pip and install virtualenv"
python3.10 -m ensurepip --upgrade python3.10 -m ensurepip --upgrade
python3.10 -m pip install --upgrade pip python3.10 -m pip install --upgrade pip
echo '============================================'
echo 'Current path: '
pwd
echo '============================================'
# 8. Create and activate a virtual environment # 8. Create and activate a virtual environment
echo "8. Create and activate a virtual environment" echo "8. Create and activate a virtual environment"
python3.10 -m venv venv_t python3.10 -m venv venv_t
@ -1012,7 +970,7 @@ sleep 5
# CHeck if the virtual environment is created # CHeck if the virtual environment is created
if [ ! -f "venv_t/bin/activate" ]; then if [ ! -f "venv_t/bin/activate" ]; then
echo "ERROR: 虚拟环境没有创建成功" echo "ERROR: The virtual environment cannot be created"
exit 1 exit 1
fi fi
@ -1040,7 +998,7 @@ pip install -r ~/freeleaps_home/freeleaps/apps/requirements.txt
echo '============================================' echo '============================================'
echo 'Start to run start_webapi.sh' echo 'Start to run start_webapi.sh'
echo '============================================' echo '============================================'
./start_webapi.sh > /tmp/webapi.logs 2>&1 & ./start_webapi.sh > /home/.devbox/logs/backend.logs 2>&1 &
WEBAPI_PID=\$! WEBAPI_PID=\$!
@ -1050,21 +1008,22 @@ echo '============================================'
sleep 30 sleep 30
MAX_ATTEMPTS=30 # 30次尝试每次10秒总等待5分钟 # 30 attempts, 5 seconds each, total wait time 2.5 minutes
MAX_ATTEMPTS=30
ATTEMPT=0 ATTEMPT=0
echo "Waiting for WebAPI service to become healthy..." echo "Waiting for WebAPI service to become healthy..."
while [ \$ATTEMPT -lt \$MAX_ATTEMPTS ]; do while [ \$ATTEMPT -lt \$MAX_ATTEMPTS ]; do
HTTP_CODE=\$(curl -s -o /dev/null -w "%{http_code}" "http://localhost:\$DEVBOX_BACKEND_PORT/docs") 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 if [ "\$HTTP_CODE" -eq 200 ]; then
echo "Backend Swagger UI is available at \$URL (HTTP \$HTTP_CODE)" echo "Backend Swagger UI is available at \$URL (HTTP \$HTTP_CODE)"
break break
else else
echo "Waiting for Swagger UI to become available... Attempt \$((ATTEMPT+1))" echo "Waiting for Swagger UI to become available... Attempt \$((ATTEMPT+1))"
ATTEMPT=\$((ATTEMPT+1)) ATTEMPT=\$((ATTEMPT+1))
sleep 5 # 等待 5 秒后重试 sleep 5 # Wait 5 seconds
fi fi
done done
@ -1091,13 +1050,13 @@ npm install -g pnpm
pnpm install pnpm install
npm run build npm run build
npm run format npm run format
# 静默后台启动 npm run dev将输出重定向到 /dev/null # Start the frontend service with nohup in order to keep it running after the SSH session is closed
nohup npm run dev > /dev/null 2>&1 & nohup npm run dev > /home/.devbox/logs/frontend.logs > /dev/null 2>&1 &
# 获取后台启动进程的 PID可选 # Save the process ID of the frontend service
DEV_PID=$! DEV_PID=$!
echo "npm run dev 已启动,进程号: \$DEV_PID" echo "npm run dev has been started with PID: \$DEV_PID"
echo '============================================' echo '============================================'
@ -1135,7 +1094,7 @@ EOF
# ------------------------------------------------------------------- # -------------------------------------------------------------------
# 10. Final # 10. Final notification
# ------------------------------------------------------------------- # -------------------------------------------------------------------
echo echo
echo "===========================================================" echo "==========================================================="
@ -1143,8 +1102,8 @@ EOF
echo " DevBox container ID: $container_id" echo " DevBox container ID: $container_id"
[[ -f "${WORKING_HOME}/.devsvc-instance" ]] && echo " devsvc container ID: $(cat "${WORKING_HOME}/.devsvc-instance")" [[ -f "${WORKING_HOME}/.devsvc-instance" ]] && echo " devsvc container ID: $(cat "${WORKING_HOME}/.devsvc-instance")"
echo " Repository cloned to: $repo_dir" echo " Repository cloned to: $repo_dir"
echo " Back-end logs: $WORKING_HOME/logs/back-end.logs" echo " Backend logs: $WORKING_HOME/logs/backend.logs"
echo " Front-end logs: $WORKING_HOME/logs/front-end.logs" echo " Frontend logs: $WORKING_HOME/logs/frontend.logs"
echo "===========================================================" echo "==========================================================="
echo echo