From 0d2c4f1a295fe57a3c1f9032cb7a4128059921d3 Mon Sep 17 00:00:00 2001 From: Tianyong Qiu Date: Thu, 27 Feb 2025 13:44:49 +0800 Subject: [PATCH 1/5] Update for add chat component in devbox --- devbox/devbox.local/cli/devbox | 193 +++++++++++------- .../cli/docker-compose.dev.arm64.new.yaml | 52 +++++ 2 files changed, 171 insertions(+), 74 deletions(-) diff --git a/devbox/devbox.local/cli/devbox b/devbox/devbox.local/cli/devbox index fe1ce9d..e1f9b61 100644 --- a/devbox/devbox.local/cli/devbox +++ b/devbox/devbox.local/cli/devbox @@ -105,6 +105,10 @@ devbox_init_usage() { printf " --authentication-image-repo -V [Optional] : Specifies the repository for authentication component.\n" printf " --authentication-image-name -L [Optional] : Specifies the image name for authentication component.\n" printf " --authentication-image-tag -W [Optional] : Specifies the image tag for authentication component. Default: latest.\n" + printf " --chat-image-repo -B [Optional] : Specifies the repository for chat component.\n" + printf " --chat-image-name -N [Optional] : Specifies the image name for chat component.\n" + printf " --chat-image-tag -T [Optional] : Specifies the image tag for chat component. Default: latest.\n" + printf " --force -f [Optional] : Force initialization even if resources already exist.\n\n" printf "Global Arguments\n" @@ -151,8 +155,8 @@ devbox_start_usage() { printf " devbox start : Start the local development environment based on DevBox container.\n\n" printf "Arguments\n" - printf " --component COMPONENT [Optional] : Specifies the name of the component to start (e.g., mongodb, rabbitmq, backend, frontend, devsvc, content, central_storage, authentication).\n\n" - printf " --freeleaps-endpoint -e [Optional] : Specifies the Freeleaps.com endpoint to start in the DevBox container.\n\n" + printf " --component COMPONENT [Optional] : Specifies the name of the component to start (e.g., mongodb, rabbitmq, devsvc, content, central_storage, notification, chat, authentication).\n\n" + printf " --freeleaps-endpoint -e [Optional] : Specifies the Freeleaps.com endpoint backend & frontend to start in the DevBox container.\n\n" printf "Global Arguments\n" printf " --help, -h : Show this help message and exit.\n\n" @@ -174,7 +178,7 @@ devbox_stop_usage() { printf "Command\n" printf " devbox stop : Stop the local development environment based on DevBox container.\n\n" printf "Arguments\n" - printf " --component -c [Optional] : Specifies the name of the component to stop (e.g., mongodb, rabbitmq, devbox, devsvc, content, central_storage, authentication).\n\n" + printf " --component -c [Optional] : Specifies the name of the component to stop (e.g., mongodb, rabbitmq, devbox, devsvc, content, central_storage, notification, chat, authentication).\n\n" printf "Global Arguments\n" printf " --help -h : Show this help message and exit.\n\n" printf "Examples\n" @@ -195,7 +199,7 @@ devbox_status_usage() { printf " devbox status : Display the status of the local development environment based on DevBox container.\n\n" printf "Arguments\n" - printf " --component -c [Optional] : Specifies the component to show status (e.g., devbox, devsvc, etc.).\n\n" + printf " --component -c [Optional] : Specifies the component to show status (e.g., devbox, devsvc, content, central_storage, notification, chat, authentication).\n\n" printf "Global Arguments\n" printf " --help -h : Show this help message and exit.\n\n" @@ -217,9 +221,9 @@ devbox_restart_usage() { printf "Command\n" printf " devbox restart : Restart the local development environment based on DevBox container.\n\n" printf "Arguments\n" - printf " --component -c [Optional] : Specifies the component to restart (e.g., backend, frontend, etc.).\n" - printf " --freeleaps-endpoint -e [Optional] : Specifies the Freeleaps.com endpoint to restart in the DevBox container.\n" - printf " --force -f : Force the restart operation without prompt.\n\n" + printf " --component -c [Optional] : Specifies the component to restart (e.g., devbox, devsvc, content, central_storage, notification, chat, authentication).\n" + printf " --freeleaps-endpoint -e [Optional] : Specifies the Freeleaps.com backend & frontend to restart in the DevBox container.\n" + printf " --force -f [Optional] : Force the restart operation without prompt.\n\n" printf "Global Arguments\n" printf " --help -h : Show this help message and exit.\n" printf "Examples\n" @@ -430,8 +434,11 @@ check_docker_running() { } # Define the local components and their corresponding ports -local_components_ports_keys=("devsvc" "notification" "content" "central_storage" "authentication") -local_components_ports_values=("8007" "8003" "8013" "8005" "8004") +# local_components_ports_keys=("devsvc" "notification" "content" "central_storage" "chat" "authentication") + +declare -g local_components_ports_keys=("devsvc" "notification" "content" "central_storage" "chat" "authentication") + +local_components_ports_values=("8007" "8003" "8013" "8005" "8012" "8004") # Get the port number for a local component get_port() { @@ -494,6 +501,10 @@ devbox_init_command() { local NOTIFICATION_IMAGE="$args_notification_image_image" # --notification-image-image local NOTIFICATION_TAG="$args_notification_image_tag" # --notification-image-tag + local CHAT_REPO="$args_chat_image_repo" # --chat-image-repo + local CHAT_IMAGE="$args_chat_image_image" # --chat-image-image + local CHAT_TAG="$args_chat_image_tag" # --chat-image-tag + local CUSTOM_GIT_REPO="$args_custom_git_repo" # --custom-git-repo # --force flag to overwrite existing resources @@ -527,12 +538,16 @@ devbox_init_command() { local NOTIFICATION_REPO="$(get_arg '--notification-image-repo')" local NOTIFICATION_IMAGE="$(get_arg '--notification-image-name')" local NOTIFICATION_TAG="$(get_arg '--notification-image-tag')" + local CHAT_REPO="$(get_arg '--chat-image-repo')" + local CHAT_IMAGE="$(get_arg '--chat-image-name')" + local CHAT_TAG="$(get_arg '--chat-image-tag')" + local CUSTOM_GIT_REPO="$(get_arg '--custom-git-repo')" local FORCE_INIT="$(get_arg '--force')" local is_pull_all_components=true - local components=("devsvc" "notification" "content" "central_storage" "authentication") + local components=("devsvc" "notification" "content" "central_storage" "chat" "authentication") local start_components=() # Check if using local components @@ -583,6 +598,12 @@ devbox_init_command() { elif [[ "$ARCH" == "arm64" && "$component" == "notification" ]]; then NOTIFICATION_TAG="latest-linux-arm64" fi + + if [[ "$ARCH" == "amd64" && "$component" == "chat" ]]; then + CHAT_TAG="latest-linux-amd64" + elif [[ "$ARCH" == "arm64" && "$component" == "chat" ]]; then + CHAT_TAG="latest-linux-arm64" + fi done @@ -621,6 +642,9 @@ devbox_init_command() { echo " NOTIFICATION_REPO = $NOTIFICATION_REPO" echo " NOTIFICATION_IMAGE= $NOTIFICATION_IMAGE" echo " NOTIFICATION_TAG = $NOTIFICATION_TAG" + echo " CHAT_REPO = $CHAT_REPO" + echo " CHAT_IMAGE = $CHAT_IMAGE" + echo " CHAT_TAG = $CHAT_TAG" echo " FORCE_INIT = $FORCE_INIT" echo @@ -814,46 +838,8 @@ if [[ $USE_LOCAL_COMPONENT_VAL == true ]]; then echo "ERROR: Failed to extract gitea data backup." exit 1 fi - - - - echo "==> Starting Gitea, MongoDB, RabbitMQ containers..." - # Start local components by docker compose file and start up specified services. docker compose file is in the same directory as the script (docker-compose.dev.arm64.new.yaml) - docker-compose -f docker-compose.dev.arm64.new.yaml up -d mongodb rabbitmq gitea - - sleep 5 - - # start component service from start_components array - docker-compose -f docker-compose.dev.arm64.new.yaml up -d "${start_components[@]}" - - - gitea_container_id=$(docker ps --no-trunc -a --filter "name=^freeleaps2-gitea$" --format "{{.ID}}") - echo "$gitea_container_id" > "$WORKING_HOME/.gitea-instance" - - mongo_container_id=$(docker ps --no-trunc -a --filter "name=^freeleaps2-mongodb$" --format "{{.ID}}") - echo "$mongo_container_id" > "$WORKING_HOME/.mongodb-instance" - - rabbitmq_container_id=$(docker ps --no-trunc -a --filter "name=^freeleaps2-rabbitmq$" --format "{{.ID}}") - echo "$rabbitmq_container_id" > "$WORKING_HOME/.rabbitmq-instance" - - - # Get all components container ids and save to .component-instance file - for component in "${start_components[@]}"; do - tmp_container_id=$(docker ps --no-trunc -a --filter "name=^$component$" --format "{{.ID}}") - echo "$tmp_container_id" > "$WORKING_HOME/.${component}-instance" - done - - echo "${component} container created: $component_container_id" - - # Get the owner group of the WORKING_HOME - if [[ "$(uname)" == "Darwin" ]]; then - OWNER_GROUP=$(stat -f "%Su:%Sg" "${WORKING_HOME}") - else - OWNER_GROUP=$(stat -c "%U:%G" "${WORKING_HOME}") - fi - - # Echo OWNER_GROUP + # Echo OWNER_GROUP echo "OWNER_GROUP: $OWNER_GROUP" # Copy gitea data to the gitea container @@ -879,17 +865,35 @@ if [[ $USE_LOCAL_COMPONENT_VAL == true ]]; then exit 1 fi - # restart gitea container - docker-compose -f docker-compose.dev.arm64.new.yaml restart rabbitmq - sleep 10 + # Start Gitea, MongoDB, RabbitMQ and other components containers + echo "===> start Gitea, MongoDB, RabbitMQ and other components containers" + docker-compose -f docker-compose.dev.arm64.new.yaml up -d mongodb rabbitmq gitea "${start_components[@]}" - docker-compose -f docker-compose.dev.arm64.new.yaml restart gitea - sleep 5 + gitea_container_id=$(docker ps --no-trunc -a --filter "name=^freeleaps2-gitea$" --format "{{.ID}}") + echo "$gitea_container_id" > "$WORKING_HOME/.gitea-instance" - # restart notification if it is in the start_components - if [[ " ${start_components[@]} " =~ "notification" ]]; then - docker-compose -f docker-compose.dev.arm64.new.yaml restart notification + mongo_container_id=$(docker ps --no-trunc -a --filter "name=^freeleaps2-mongodb$" --format "{{.ID}}") + echo "$mongo_container_id" > "$WORKING_HOME/.mongodb-instance" + + rabbitmq_container_id=$(docker ps --no-trunc -a --filter "name=^freeleaps2-rabbitmq$" --format "{{.ID}}") + echo "$rabbitmq_container_id" > "$WORKING_HOME/.rabbitmq-instance" + + + # Get all components container ids and save to .component-instance file + for component in "${start_components[@]}"; do + tmp_container_id=$(docker ps --no-trunc -a --filter "name=^$component$" --format "{{.ID}}") + echo "$tmp_container_id" > "$WORKING_HOME/.${component}-instance" + done + + echo "${component} container created: $component_container_id" + + # Get the owner group of the WORKING_HOME + if [[ "$(uname)" == "Darwin" ]]; then + OWNER_GROUP=$(stat -f "%Su:%Sg" "${WORKING_HOME}") + else + OWNER_GROUP=$(stat -c "%U:%G" "${WORKING_HOME}") fi + else echo '============================================' echo ' ===> Using online components for Freeleaps services.' @@ -955,21 +959,32 @@ if ! git ls-remote "https://$FREELEAPS_USERNAME:$FREELEAPS_PASSWORD@freeleaps.co exit 1 fi +FREELEAPS_DIR="$WORKING_HOME/freeleaps" FRONTEND_GIT_URL="https://$FREELEAPS_USERNAME:$FREELEAPS_PASSWORD@freeleaps.com:3443/products/freeleaps.git" # Check if freeleaps2-frontend exists, if not git clone it -if [ ! -d $WORKING_HOME/freeleaps ]; then +if [ ! -d "$FREELEAPS_DIR" ]; then echo "Git cloning freeleaps.com:3443/products/freeleaps.git" - git clone --depth 5 $FRONTEND_GIT_URL + git clone --depth 5 $FRONTEND_GIT_URL else - pushd $WORKING_HOME/freeleaps + pushd "$FREELEAPS_DIR" > /dev/null # Check $WORKING_HOME/freeleaps exists and it is a git repository, if not git clone it if ! git rev-parse --is-inside-work-tree &>/dev/null; then - echo "Git cloning freeleaps.com:3443/products/freeleaps.git" - git clone --depth 5 $FRONTEND_GIT_URL + popd > /dev/null # Exit from $FREELEAPS_DIR + rm -rf "$FREELEAPS_DIR" # Remove $FREELEAPS_DIR + ls -la "$WORKING_HOME" + rmdir "$FREELEAPS_DIR" # Remove $FREELEAPS_DIR + ls -la "$WORKING_HOME" + + # Git clone freeleaps.com:3443/products/freeleaps.git + echo "Cloning repository again: $FRONTEND_GIT_URL" + sudo chown -R "$OWNER_GROUP" "$WORKING_HOME" + git clone --depth 5 "$FRONTEND_GIT_URL" else echo "Git pulling freeleaps.com:3443/products/freeleaps.git" git pull fi + + popd > /dev/null fi @@ -1316,7 +1331,7 @@ devbox_deinit_command() { fi # Stop and remove other components - local components=("devsvc" "notification" "content" "central_storage" "authentication") + local components=("devsvc" "notification" "content" "central_storage" "chat" "authentication") for component in "${components[@]}"; do if [[ -f "$WORKING_HOME/.${component}-instance" ]]; then local component_container_id @@ -1407,7 +1422,7 @@ devbox_start_command() { if [[ "$USE_LOCAL_COMPONENT" == "true" ]]; then # If no component is specified, start all components if [[ -z "$COMPONENT" ]]; then - COMPONENTS=( "gitea" "mongodb" "rabbitmq" "devbox" "devsvc" "notification" "content" "central_storage" "authentication") + COMPONENTS=( "gitea" "mongodb" "rabbitmq" "devbox" "devsvc" "notification" "content" "central_storage" "chat" "authentication") else COMPONENTS=("$COMPONENT") fi @@ -1416,7 +1431,7 @@ devbox_start_command() { if [[ -z "$COMPONENT" ]]; then COMPONENTS=("mongodb" "rabbitmq" "devbox") else - if [[ "$COMPONENT" == "devsvc" || "$COMPONENT" == "notification" || "$COMPONENT" == "content" || "$COMPONENT" == "central_storage" || "$COMPONENT" == "authentication" ]]; then + if [[ "$COMPONENT" == "devsvc" || "$COMPONENT" == "notification" || "$COMPONENT" == "content" || "$COMPONENT" == "central_storage" || "$COMPONENT" == "chat" || "$COMPONENT" == "authentication" ]]; then echo "ERROR: Remote component $COMPONENT cannot be restarted." exit 1 fi @@ -1429,7 +1444,7 @@ devbox_start_command() { # Start the specified components for comp in "${COMPONENTS[@]}"; do case "$comp" in - "gitea" | "mongodb" | "rabbitmq" | "devbox" | "devsvc" | "notification" | "content" | "central_storage" | "authentication") + "gitea" | "mongodb" | "rabbitmq" | "devbox" | "devsvc" | "notification" | "content" | "central_storage" | "chat" | "authentication") echo "==> Starting $comp service..." # Check if the component container file exists local component_container_id_file_path="${WORKING_HOME}/.${comp}-instance" @@ -1607,7 +1622,7 @@ devbox_stop_command() { # If the DevBox container is not running, exit if [[ -z "$COMPONENT" ]]; then - COMPONENTS=("gitea" "mongodb" "rabbitmq" "devbox" "devsvc" "notification" "content" "central_storage" "authentication") + COMPONENTS=("gitea" "mongodb" "rabbitmq" "devbox" "devsvc" "notification" "content" "central_storage" "chat" "authentication") else COMPONENTS=("$COMPONENT") fi @@ -1633,7 +1648,7 @@ devbox_stop_command() { fi ;; - "gitea"| "mongodb"| "rabbitmq" | "devsvc" | "notification" | "content" | "central_storage" | "authentication") + "gitea"| "mongodb"| "rabbitmq" | "devsvc" | "notification" | "content" | "central_storage" | "chat" | "authentication") if [[ -f "${WORKING_HOME}/.${comp}-instance" ]]; then local container_id container_id=$(cat "${WORKING_HOME}/.${comp}-instance") @@ -1679,7 +1694,7 @@ devbox_status_command() { # If no component is specified, check all components if [[ -z "$COMPONENT" ]]; then - COMPONENTS=("mongodb" "rabbitmq" "devbox" "devsvc" "notification" "content" "central_storage" "authentication") + COMPONENTS=("mongodb" "rabbitmq" "devbox" "devsvc" "notification" "content" "central_storage" "chat" "authentication") else COMPONENTS=("$COMPONENT") fi @@ -1732,7 +1747,7 @@ devbox_status_command() { fi ;; - "devsvc" | "notification" | "content" | "central_storage" | "authentication") + "devsvc" | "notification" | "content" | "central_storage" | "chat" | "authentication") echo "==> Checking $comp service status..." if [[ -f "${WORKING_HOME}/.${comp}-instance" ]]; then local container_id @@ -1777,7 +1792,7 @@ devbox_restart_command() { if [[ "$USE_LOCAL_COMPONENT" == "true" ]]; then echo "==> Using local components..." if [[ -z "$COMPONENT" ]]; then - COMPONENTS=("gitea" "mongodb" "rabbitmq" "devbox" "devsvc" "notification" "content" "central_storage" "authentication") + COMPONENTS=("gitea" "mongodb" "rabbitmq" "devbox" "devsvc" "notification" "content" "central_storage" "chat" "authentication") else COMPONENTS=("$COMPONENT") fi @@ -1786,7 +1801,7 @@ devbox_restart_command() { if [[ -z "$COMPONENT" ]]; then COMPONENTS=("mongodb" "rabbitmq" "devbox") else - if [[ "$COMPONENT" == "devsvc" || "$COMPONENT" == "notification" || "$COMPONENT" == "content" || "$COMPONENT" == "central_storage" || "$COMPONENT" == "authentication" ]]; then + if [[ "$COMPONENT" == "devsvc" || "$COMPONENT" == "notification" || "$COMPONENT" == "content" || "$COMPONENT" == "central_storage" || "$COMPONENT" == "chat" || "$COMPONENT" == "authentication" ]]; then echo "ERROR: Remote component $COMPONENT cannot be restarted." exit 1 fi @@ -1813,7 +1828,7 @@ devbox_restart_command() { fi ;; - "gitea" | "mongodb" | "rabbitmq" | "devsvc" | "notification" | "content" | "central_storage" | "authentication") + "gitea" | "mongodb" | "rabbitmq" | "devsvc" | "notification" | "content" | "central_storage" | "chat" | "authentication") if [[ -f "${WORKING_HOME}/.${comp}-instance" ]]; then local container_id @@ -1834,7 +1849,7 @@ devbox_restart_command() { # Start the specified components for comp in "${COMPONENTS[@]}"; do case "$comp" in - "gitea" | "mongodb" | "rabbitmq" | "devbox" | "devsvc" | "notification" | "content" | "central_storage" | "authentication") + "gitea" | "mongodb" | "rabbitmq" | "devbox" | "devsvc" | "notification" | "content" | "central_storage" | "chat" | "authentication") echo "==> Restarting $comp service..." if [[ -f "${WORKING_HOME}/.${comp}-instance" ]]; then local container_id @@ -2415,6 +2430,36 @@ devbox_init_parse_requirements() { fi ;; # :flag.case + --chat-image-repo | -B) + if [[ -n ${2+x} ]]; then + add_arg '--chat-image-repo' "$2" + shift 2 + else + printf "%s\n" "--chat-image-repo requires an argument: --chat-image-repo FREELEAPS_CHAT_IMAGE_REPO" >&2 + exit 1 + fi + ;; + # :flag.case + --chat-image-name | -N) + if [[ -n ${2+x} ]]; then + add_arg '--chat-image-name' "$2" + shift 2 + else + printf "%s\n" "--chat-image-name requires an argument: --chat-image-name FREELEAPS_CHAT_IMAGE_NAME" >&2 + exit 1 + fi + ;; + # :flag.case + --chat-image-tag | -T) + if [[ -n ${2+x} ]]; then + add_arg '--chat-image-tag' "$2" + shift 2 + else + printf "%s\n" "--chat-image-tag requires an argument: --chat-image-tag FREELEAPS_CHAT_IMAGE_TAG" >&2 + exit 1 + fi + ;; + # :flag.case --force | -f) # :flag.case_no_arg add_arg '--force' '1' diff --git a/devbox/devbox.local/cli/docker-compose.dev.arm64.new.yaml b/devbox/devbox.local/cli/docker-compose.dev.arm64.new.yaml index f5f74ea..4103272 100644 --- a/devbox/devbox.local/cli/docker-compose.dev.arm64.new.yaml +++ b/devbox/devbox.local/cli/docker-compose.dev.arm64.new.yaml @@ -48,6 +48,10 @@ services: container_name: devsvc image: freeleaps/devsvc:${DEVSVC_IMAGE_TAG:-latest-linux-arm64} restart: always + depends_on: + - gitea + - mongodb + - rabbitmq environment: - APP_NAME=devsvc - SERVICE_API_ACCESS_HOST=localhost @@ -181,6 +185,8 @@ services: # profiles: [ prod, alpha, dev ] platform: linux/${ARCH:-arm64} restart: always + depends_on: + - rabbitmq environment: - APP_NAME=notification - SERVICE_API_ACCESS_HOST=localhost @@ -243,6 +249,52 @@ services: - type: bind source: /var/lib/docker/app/payment/log target: /app/log/payment + chat: + container_name: chat + image: freeleaps/chat:${NOTIFICATION_IMAGE_TAG:-latest-linux-arm64} + platform: linux/${ARCH:-arm64} + restart: always + depends_on: + - mongodb + - rabbitmq + ports: + - 8012:8012 + environment: + - APP_NAME=chat + - CERT_PATH=/app/certs + - EMAIL_FROM=freeleaps@freeleaps.com + - MONGODB_NAME=freeleaps2 + - MONGODB_URI=mongodb://freeleaps2-mongodb:27017/ + - SITE_URL_ROOT=http://localhost + - JWT_SECRET_KEY=8f87ca8c3c9c3df09a9c78e0adb0927855568f6072d9efc892534aee35f5867b + - JWT_ALGORITHM=HS256 + - SERVICE_API_ACCESS_PORT=8012 + - RABBITMQ_HOST=freeleaps2-rabbitmq + - RABBITMQ_PORT=5672 + - LOG_BASE_PATH=/app/log/freeleaps-chat + - BACKEND_LOG_FILE_NAME=freeleaps-chat.log + - APPLICATION_ACTIVITY_LOG=freeleaps-chat.application.log + - FREELEAPS_ENV=dev + - FREELEAPS_CHAT_ENDPOINT=http://freeleaps-alpha.com/api/chat/ + - FREELEAPS_DEVSVC_ENDPOINT=http://devsvc:8007/api/devsvc/ + - FREELEAPS_CONTENT_ENDPOINT=http://content:8013/api/content/ + - FREELEAPS_NOTIFICATION_ENDPOINT=http://notification:8003/api/notification/ + - FREELEAPS_CENTRAL_STORAGE_ENDPOINT=http://central_storage:8005/api/central_storage/ + - FREELEAPS_AUTHENTICATION_ENDPOINT=http://authentication:8004/api/auth/ + - TZ=Asia/Shanghai + command: + # Use a conditional check for RabbitMQ in alpha profile + - /bin/sh + - -c + - | + uvicorn chat.main:app --reload --host=0.0.0.0 --port=8012 --workers 4 --timeout-keep-alive 120 --log-level info + - echo "Chat service is up and running $CONTAINER_APP_ROOT" + volumes: + - type: bind + source: ${WORKING_HOME}/logs/freeleaps-chat + target: /app/log/freeleaps-chat + networks: + - devbox_freeleaps2-network volumes: freeleaps2-mongodb-data: freeleaps2-gitea-data: From 9897bcc927333390acd11a2901c84913f0f5ef95 Mon Sep 17 00:00:00 2001 From: Tianyong Qiu Date: Thu, 27 Feb 2025 14:14:13 +0800 Subject: [PATCH 2/5] update for clear docker compose file --- devbox/devbox.local/cli/docker-compose.dev.arm64.new.yaml | 1 - 1 file changed, 1 deletion(-) diff --git a/devbox/devbox.local/cli/docker-compose.dev.arm64.new.yaml b/devbox/devbox.local/cli/docker-compose.dev.arm64.new.yaml index 4103272..511db6d 100644 --- a/devbox/devbox.local/cli/docker-compose.dev.arm64.new.yaml +++ b/devbox/devbox.local/cli/docker-compose.dev.arm64.new.yaml @@ -288,7 +288,6 @@ services: - -c - | uvicorn chat.main:app --reload --host=0.0.0.0 --port=8012 --workers 4 --timeout-keep-alive 120 --log-level info - - echo "Chat service is up and running $CONTAINER_APP_ROOT" volumes: - type: bind source: ${WORKING_HOME}/logs/freeleaps-chat From 20cfc792b0e8afcffed5d075d6c287375b73a3b9 Mon Sep 17 00:00:00 2001 From: Tianyong Qiu Date: Thu, 27 Feb 2025 14:21:05 +0800 Subject: [PATCH 3/5] Update for CHAT_IMAGE_TAG to docker compose --- devbox/devbox.local/cli/devbox | 1 + devbox/devbox.local/cli/docker-compose.dev.arm64.new.yaml | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/devbox/devbox.local/cli/devbox b/devbox/devbox.local/cli/devbox index e1f9b61..e140fdb 100644 --- a/devbox/devbox.local/cli/devbox +++ b/devbox/devbox.local/cli/devbox @@ -823,6 +823,7 @@ if [[ $USE_LOCAL_COMPONENT_VAL == true ]]; then export CENTRAL_STORAGE_IMAGE_TAG="$CENTRAL_STORAGE_TAG" export AUTHENTICATION_IMAGE_TAG="$AUTHENTICATION_TAG" export NOTIFICATION_IMAGE_TAG="$NOTIFICATION_TAG" + export CHAT_IMAGE_TAG="$CHAT_TAG" # Check if gitea_data_backup.tar.gz exists at current script directory, if not exit if [[ ! -f "gitea_data_backup.tar.gz" ]]; then diff --git a/devbox/devbox.local/cli/docker-compose.dev.arm64.new.yaml b/devbox/devbox.local/cli/docker-compose.dev.arm64.new.yaml index 511db6d..dff71bd 100644 --- a/devbox/devbox.local/cli/docker-compose.dev.arm64.new.yaml +++ b/devbox/devbox.local/cli/docker-compose.dev.arm64.new.yaml @@ -251,7 +251,7 @@ services: target: /app/log/payment chat: container_name: chat - image: freeleaps/chat:${NOTIFICATION_IMAGE_TAG:-latest-linux-arm64} + image: freeleaps/chat:${CHAT_IMAGE_TAG:-latest-linux-arm64} platform: linux/${ARCH:-arm64} restart: always depends_on: From f9f48115499d7345827f09a25ac2635a58e0f062 Mon Sep 17 00:00:00 2001 From: Tianyong Qiu Date: Fri, 28 Feb 2025 10:42:39 +0800 Subject: [PATCH 4/5] Update for support chat --- devbox/devbox.local/cli/devbox | 96 ++++++++++--------- .../cli/docker-compose.dev.arm64.new.yaml | 5 +- devbox/devbox.local/cli/freeleaps | 1 + 3 files changed, 55 insertions(+), 47 deletions(-) create mode 160000 devbox/devbox.local/cli/freeleaps diff --git a/devbox/devbox.local/cli/devbox b/devbox/devbox.local/cli/devbox index e140fdb..9758f2c 100644 --- a/devbox/devbox.local/cli/devbox +++ b/devbox/devbox.local/cli/devbox @@ -803,7 +803,54 @@ devbox_init_command() { # record container id, DEVBOX_FRONTEND_PORT, DEVBOX_BACKEND_PORT echo "$container_id" > "$WORKING_HOME/.devbox-instance" echo "$DEVBOX_FRONTEND_PORT" > "$WORKING_HOME/.devbox-frontend-port" - echo "$DEVBOX_BACKEND_PORT" > "$WORKING_HOME/.devbox-backend-port" + echo "$DEVBOX_BACKEND_PORT" > "$WORKING_HOME/.devbox-backend-port"] + + # Check if username and password are set + if [[ -z "$FREELEAPS_USERNAME" || -z "$FREELEAPS_PASSWORD" ]]; then + echo "Warining: Username and password are required to pull freeleaps.com code." + echo "==> [INIT] DevBox environment initialization completed." + exit 1 + fi + + # Test if the user can access the freeleaps.com repository + echo "==> Testing access to freeleaps.com repository..." + if ! git ls-remote "https://$FREELEAPS_USERNAME:$FREELEAPS_PASSWORD@freeleaps.com:3443/products/freeleaps.git" &>/dev/null; then + echo "ERROR: Failed to access freeleaps.com repository. Please check your username and password." + echo "==> [INIT] DevBox environment initialization completed successfully, but access to the freeleaps.com repository failed." + exit 1 + fi + + DOVBOX_CLI_DIR=$(pwd) + + FREELEAPS_DIR="$WORKING_HOME/freeleaps" + FRONTEND_GIT_URL="https://$FREELEAPS_USERNAME:$FREELEAPS_PASSWORD@freeleaps.com:3443/products/freeleaps.git" + # Check if freeleaps2-frontend exists, if not git clone it + if [ ! -d "$FREELEAPS_DIR" ]; then + pushd "$WORKING_HOME" > /dev/null + echo "Git cloning freeleaps.com:3443/products/freeleaps.git 1" + git clone --depth 5 $FRONTEND_GIT_URL + else + echo "Git pulling 2" + pushd "$FREELEAPS_DIR" > /dev/null + # Check $WORKING_HOME/freeleaps exists and it is a git repository, if not git clone it + if ! git rev-parse --is-inside-work-tree &>/dev/null; then + popd > /dev/null # Exit from $FREELEAPS_DIR + rm -rf "$FREELEAPS_DIR" # Remove $FREELEAPS_DIR + rmdir "$FREELEAPS_DIR" # Remove $FREELEAPS_DIR + + # Git clone freeleaps.com:3443/products/freeleaps.git + echo "Cloning repository again: $FRONTEND_GIT_URL" + sudo chown -R "$OWNER_GROUP" "$WORKING_HOME" + git clone --depth 5 "$FRONTEND_GIT_URL" + else + echo "Git pulling freeleaps.com:3443/products/freeleaps.git" + git pull + fi + + popd > /dev/null + fi + + pushd $DOVBOX_CLI_DIR > /dev/null # ------------------------------------------------------------------- # 6. linbwang: pull and start other components @@ -824,7 +871,7 @@ if [[ $USE_LOCAL_COMPONENT_VAL == true ]]; then export AUTHENTICATION_IMAGE_TAG="$AUTHENTICATION_TAG" export NOTIFICATION_IMAGE_TAG="$NOTIFICATION_TAG" export CHAT_IMAGE_TAG="$CHAT_TAG" - + # Check if gitea_data_backup.tar.gz exists at current script directory, if not exit if [[ ! -f "gitea_data_backup.tar.gz" ]]; then echo "ERROR: gitea_data_backup.tar.gz not found. Please make sure it exists in the current directory." @@ -866,6 +913,8 @@ if [[ $USE_LOCAL_COMPONENT_VAL == true ]]; then exit 1 fi + + # Start Gitea, MongoDB, RabbitMQ and other components containers echo "===> start Gitea, MongoDB, RabbitMQ and other components containers" docker-compose -f docker-compose.dev.arm64.new.yaml up -d mongodb rabbitmq gitea "${start_components[@]}" @@ -945,49 +994,6 @@ fi IS_START_FRONTEND=true -# Check if username and password are set -if [[ -z "$FREELEAPS_USERNAME" || -z "$FREELEAPS_PASSWORD" ]]; then - echo "Warining: Username and password are required to pull freeleaps.com code." - echo "==> [INIT] DevBox environment initialization completed." - exit 1 -fi - -# Test if the user can access the freeleaps.com repository -echo "==> Testing access to freeleaps.com repository..." -if ! git ls-remote "https://$FREELEAPS_USERNAME:$FREELEAPS_PASSWORD@freeleaps.com:3443/products/freeleaps.git" &>/dev/null; then - echo "ERROR: Failed to access freeleaps.com repository. Please check your username and password." - echo "==> [INIT] DevBox environment initialization completed successfully, but access to the freeleaps.com repository failed." - exit 1 -fi - -FREELEAPS_DIR="$WORKING_HOME/freeleaps" -FRONTEND_GIT_URL="https://$FREELEAPS_USERNAME:$FREELEAPS_PASSWORD@freeleaps.com:3443/products/freeleaps.git" -# Check if freeleaps2-frontend exists, if not git clone it -if [ ! -d "$FREELEAPS_DIR" ]; then - echo "Git cloning freeleaps.com:3443/products/freeleaps.git" - git clone --depth 5 $FRONTEND_GIT_URL -else - pushd "$FREELEAPS_DIR" > /dev/null - # Check $WORKING_HOME/freeleaps exists and it is a git repository, if not git clone it - if ! git rev-parse --is-inside-work-tree &>/dev/null; then - popd > /dev/null # Exit from $FREELEAPS_DIR - rm -rf "$FREELEAPS_DIR" # Remove $FREELEAPS_DIR - ls -la "$WORKING_HOME" - rmdir "$FREELEAPS_DIR" # Remove $FREELEAPS_DIR - ls -la "$WORKING_HOME" - - # Git clone freeleaps.com:3443/products/freeleaps.git - echo "Cloning repository again: $FRONTEND_GIT_URL" - sudo chown -R "$OWNER_GROUP" "$WORKING_HOME" - git clone --depth 5 "$FRONTEND_GIT_URL" - else - echo "Git pulling freeleaps.com:3443/products/freeleaps.git" - git pull - fi - - popd > /dev/null -fi - # Run banckend service and frontend service in the container docker exec -i "$DEVBOX_NAME" bash < Date: Fri, 28 Feb 2025 16:14:13 +0800 Subject: [PATCH 5/5] Add health check for rabbitmq & mongodb startup --- devbox/devbox.local/cli/devbox | 20 +++++++++- .../cli/docker-compose.dev.arm64.new.yaml | 39 ++++++++++++++----- 2 files changed, 48 insertions(+), 11 deletions(-) diff --git a/devbox/devbox.local/cli/devbox b/devbox/devbox.local/cli/devbox index 9758f2c..9f37a08 100644 --- a/devbox/devbox.local/cli/devbox +++ b/devbox/devbox.local/cli/devbox @@ -860,6 +860,9 @@ echo "==> [INIT] Starting Freeleaps services... Use Local component $USE_LOCAL_C export ARCH="$ARCH" export WORKING_HOME="$WORKING_HOME" + + + # Check if [[ $USE_LOCAL_COMPONENT_VAL == true ]]; then @@ -913,7 +916,22 @@ if [[ $USE_LOCAL_COMPONENT_VAL == true ]]; then exit 1 fi - + + mkdir -p ${WORKING_HOME}/logs + mkdir -p ${WORKING_HOME}/logs/devsvc + mkdir -p ${WORKING_HOME}/logs/content + mkdir -p ${WORKING_HOME}/logs/central_storage + mkdir -p ${WORKING_HOME}/logs/authentication + mkdir -p ${WORKING_HOME}/logs/notification + mkdir -p ${WORKING_HOME}/logs/chat + + + # for each component create log directory + for component in "${start_components[@]}"; do + if [[ ! -d "${WORKING_HOME}/log/${component}" ]]; then + mkdir -p "${WORKING_HOME}/log/${component}" + fi + done # Start Gitea, MongoDB, RabbitMQ and other components containers echo "===> start Gitea, MongoDB, RabbitMQ and other components containers" diff --git a/devbox/devbox.local/cli/docker-compose.dev.arm64.new.yaml b/devbox/devbox.local/cli/docker-compose.dev.arm64.new.yaml index b089397..c203f24 100644 --- a/devbox/devbox.local/cli/docker-compose.dev.arm64.new.yaml +++ b/devbox/devbox.local/cli/docker-compose.dev.arm64.new.yaml @@ -14,6 +14,12 @@ services: - ${WORKING_HOME}/freeleaps2-gitea:/data:Z networks: - devbox_freeleaps2-network + healthcheck: + test: ["CMD", "curl", "-f", "http://localhost:3000/"] + interval: 10s + timeout: 5s + retries: 5 + start_period: 40s mongodb: # For apple chip, add: platform: linux/amd64 @@ -29,6 +35,12 @@ services: networks: - devbox_freeleaps2-network command: ["mongod", "--bind_ip_all"] + healthcheck: + test: ["CMD", "mongosh", "--eval", "db.adminCommand('ping')"] + interval: 10s + timeout: 5s + retries: 5 + start_period: 40s rabbitmq: # For apple chip, add: platform: linux/amd64 @@ -43,15 +55,23 @@ services: - ${WORKING_HOME}/freeleaps2-rabbitmq-data:/var/lib/rabbitmq networks: - devbox_freeleaps2-network + healthcheck: + test: ["CMD", "rabbitmq-diagnostics", "status"] + interval: 10s + timeout: 5s + retries: 5 devsvc: container_name: devsvc image: freeleaps/devsvc:${DEVSVC_IMAGE_TAG:-latest-linux-arm64} restart: always depends_on: - - gitea - - mongodb - - rabbitmq + mongodb: + condition: service_healthy + rabbitmq: + condition: service_healthy + gitea: + condition: service_healthy environment: - APP_NAME=devsvc - SERVICE_API_ACCESS_HOST=localhost @@ -85,7 +105,6 @@ services: central_storage: container_name: central_storage image: freeleaps/central_storage:${CENTRAL_STORAGE_IMAGE_TAG:-latest-linux-arm64} - # profiles: [ prod, alpha, dev ] platform: linux/${ARCH:-arm64} restart: always environment: @@ -117,7 +136,6 @@ services: authentication: container_name: authentication image: freeleaps/authentication:${AUTHENTICATION_IMAGE_TAG:-latest-linux-arm64} - # profiles: [ prod, alpha, dev ] platform: linux/${ARCH:-arm64} restart: always environment: @@ -151,7 +169,6 @@ services: content: container_name: content image: freeleaps/content:${CONTENT_IMAGE_TAG:-latest-linux-arm64} - # profiles: [ prod, alpha, dev ] platform: linux/${ARCH:-arm64} restart: always environment: @@ -182,11 +199,11 @@ services: notification: container_name: notification image: freeleaps/notification:${NOTIFICATION_IMAGE_TAG:-latest-linux-arm64} - # profiles: [ prod, alpha, dev ] platform: linux/${ARCH:-arm64} restart: always depends_on: - - rabbitmq + rabbitmq: + condition: service_healthy environment: - APP_NAME=notification - SERVICE_API_ACCESS_HOST=localhost @@ -256,8 +273,10 @@ services: dockerfile: ${WORKING_HOME}/freeleaps/apps/chat/Dockerfile restart: always depends_on: - - mongodb - - rabbitmq + mongodb: + condition: service_healthy + rabbitmq: + condition: service_healthy ports: - 8012:8012 environment: