From a24daf48620c96469931eeecf122c8957182070f Mon Sep 17 00:00:00 2001 From: Tianyong Qiu Date: Sun, 23 Feb 2025 23:22:37 +0800 Subject: [PATCH] Update for rename default devbox workspace name from .devbox to devbox --- devbox/devbox.local/{ => cli}/devbox | 95 ++++--- .../cli/docker-compose.dev.arm64.new.yaml | 266 ++++++++++++++++++ .../devbox.local/cli/gitea_data_backup.tar.gz | Bin 0 -> 46922 bytes .../docker-compose.dev.arm64.new.yaml | 3 +- 4 files changed, 317 insertions(+), 47 deletions(-) rename devbox/devbox.local/{ => cli}/devbox (97%) create mode 100644 devbox/devbox.local/cli/docker-compose.dev.arm64.new.yaml create mode 100644 devbox/devbox.local/cli/gitea_data_backup.tar.gz diff --git a/devbox/devbox.local/devbox b/devbox/devbox.local/cli/devbox similarity index 97% rename from devbox/devbox.local/devbox rename to devbox/devbox.local/cli/devbox index f123934..fe1ce9d 100644 --- a/devbox/devbox.local/devbox +++ b/devbox/devbox.local/cli/devbox @@ -79,7 +79,7 @@ devbox_init_usage() { printf "Arguments\n" printf " --os -o [Optional] : Specifies the operating system. Default: auto.\n" printf " --arch -a [Optional] : Specifies the architecture. Default: auto.\n" - printf " --working-home -w [Optional] : Specifies the working home of DevBox CLI. Default: %s/.devbox\n" "$HOME" + printf " --working-home -w [Optional] : Specifies the working home of DevBox CLI. Default: %s/devbox\n" "$HOME" printf " --devbox-container-name -N [Optional] : Specifies the DevBox container name. Default: devbox.\n" printf " --devbox-container-port -P [Optional] : Specifies the container port for DevBox SSH access. Default: 22222.\n" printf " --devbox-image-repo -R [Optional] : Specifies the DevBox container image repository. Default: docker.io/freeleaps.\n" @@ -127,7 +127,7 @@ devbox_deinit_usage() { printf " devbox deinit : De-initialize the local development environment based on DevBox container.\n\n" printf "Arguments\n" - printf " --working-home -w [Optional] : Specifies the working home of DevBox CLI. Default: %s/.devbox\n" "$HOME" + printf " --working-home -w [Optional] : Specifies the working home of DevBox CLI. Default: %s/devbox\n" "$HOME" printf " --clear-logs -l [Optional] : Specifies whether to clear log files. Default: true\n" printf " --clear-repo -r [Optional] : Specifies whether to delete the source repository. Default: false\n\n" @@ -466,7 +466,7 @@ devbox_init_command() { local DEVBOX_REPO="$args_devbox_image_repo" # --devbox-image-repo local DEVBOX_IMAGE="$args_devbox_image_name" # --devbox-image-name local DEVBOX_TAG="$args_devbox_image_tag" # --devbox-image-tag - local WORKING_HOME="${args_working_home:-${WORKING_HOME:-${HOME}/.devbox}}" + local WORKING_HOME="${args_working_home:-${WORKING_HOME:-${HOME}/devbox}}" local FREELEAPS_USERNAME="$args_freeleaps_username" # --freeleaps-username local FREELEAPS_PASSWORD="$args_freeleaps_password" # --freeleaps-password @@ -508,7 +508,7 @@ devbox_init_command() { local DEVBOX_REPO="$(get_arg '--devbox-image-repo')" local DEVBOX_IMAGE="$(get_arg '--devbox-image-name')" local DEVBOX_TAG="$(get_arg '--devbox-image-tag')" - local WORKING_HOME="$(get_arg '--working-home' "${WORKING_HOME:-${HOME}/.devbox}")" + local WORKING_HOME="$(get_arg '--working-home' "${WORKING_HOME:-${HOME}/devbox}")" local FREELEAPS_USERNAME="$(get_arg '--freeleaps-username')" local FREELEAPS_PASSWORD="$(get_arg '--freeleaps-password')" local USE_LOCAL_COMPONENT="$(get_arg '--use-local-component')" @@ -765,7 +765,7 @@ devbox_init_command() { -p "${DEVBOX_PORT}:22" \ -p "${DEVBOX_FRONTEND_PORT}:5173" \ -p "${DEVBOX_BACKEND_PORT}:8002" \ - -v "$WORKING_HOME:/home/.devbox" \ + -v "$WORKING_HOME:/home/devbox" \ -v /var/run/docker.sock:/var/run/docker.sock \ --network "$DEVBOX_FREELEAPS2_NETWORK" \ "$devbox_full_image" 2>/dev/null @@ -984,15 +984,15 @@ export DEVBOX_BACKEND_PORT="${DEVBOX_BACKEND_PORT}" export DEVBOX_FRONTEND_PORT="${DEVBOX_FRONTEND_PORT}" -# Check if useing local component and update /home/.devbox/freeleaps/.dev.env -echo "step 2: Update /home/.devbox/freeleaps/apps/.env" +# Check if useing local component and update /home/devbox/freeleaps/.dev.env +echo "step 2: Update /home/devbox/freeleaps/apps/.env" # Get default IP address DEFAULT_IP=\$(ip route | grep default | sed -n 's/.*default via \([^ ]*\).*/\1/p') if [[ \$USE_LOCAL_COMPONENT_VAL == true ]]; then echo "==> Using local components" # Local components for Freeleaps services (devsvc, notification, content, central_storage, authentication) - cat << 'EOFinner' > /home/.devbox/freeleaps/apps/.env + cat << 'EOFinner' > /home/devbox/freeleaps/apps/.env # Online endpoint info export MONGODB_NAME=freeleaps2 export MONGODB_URI=mongodb://freeleaps2-mongodb:27017/ @@ -1019,7 +1019,7 @@ if [[ \$USE_LOCAL_COMPONENT_VAL == true ]]; then EOFinner else echo "==> Using online components" - cat << 'EOFinner' > /home/.devbox/freeleaps/apps/.env + cat << 'EOFinner' > /home/devbox/freeleaps/apps/.env # Online endpoint info export MONGODB_NAME=freeleaps2 export MONGODB_PORT=27017 @@ -1047,15 +1047,15 @@ fi # Effect the environment variables in the current shell -source /home/.devbox/freeleaps/apps/.env +source /home/devbox/freeleaps/apps/.env -# Ensure /home/.devbox/logs exists -mkdir -p /home/.devbox/logs +# Ensure /home/devbox/logs exists +mkdir -p /home/devbox/logs # Start WebAPI service echo "Starting WebAPI service..." -pushd /home/.devbox/freeleaps/apps -cp /home/.devbox/freeleaps/backend_env.sh /home/.devbox/freeleaps/apps/backend_env.sh +pushd /home/devbox/freeleaps/apps +cp /home/devbox/freeleaps/backend_env.sh /home/devbox/freeleaps/apps/backend_env.sh # 5. Istall python3.10 and venv module echo "5. Istall python3.10 and venv module" @@ -1089,7 +1089,7 @@ echo '============================================' echo ' Start to activate virtual environment' echo '============================================' source venv_t/bin/activate -source /home/.devbox/freeleaps/apps/.env +source /home/devbox/freeleaps/apps/.env # Verify the virtual environment is activated if [[ "\$VIRTUAL_ENV" != "" ]]; then @@ -1099,19 +1099,22 @@ else exit 1 fi + echo '============================================' echo ' Install requirements' echo '============================================' -pip install -r /home/.devbox/freeleaps/apps/requirements.txt +pip install -r /home/devbox/freeleaps/apps/requirements.txt + + echo '============================================' echo 'Start to run start_webapi.sh' echo '============================================' -./start_webapi.sh > /home/.devbox/logs/backend.logs 2>&1 & +./start_webapi.sh > /home/devbox/logs/backend.logs 2>&1 & BACKEND_PID=\$! # Save BACKEND_PID to a file \${WORKING_HOME}/.backend.pid: Stores the process id of backend process. -echo "\$BACKEND_PID" > /home/.devbox/.backend.pid +echo "\$BACKEND_PID" > /home/devbox/.backend.pid echo '============================================' echo 'Check if the WebAPI service started successfully' @@ -1147,7 +1150,7 @@ fi echo '============================================' echo ' Start frontend service locally' echo '============================================' -pushd /home/.devbox/freeleaps/frontend +pushd /home/devbox/freeleaps/frontend # start the frontend service export VITE_API_URL='http://127.0.0.1:8002' @@ -1182,11 +1185,11 @@ npm run build # 6️⃣ Format the code (Optional) npm run format # Start the frontend service with nohup in order to keep it running after the SSH session is closed. Save the process ID of the frontend service -nohup npm run dev > /home/.devbox/logs/frontend.logs 2>&1 & +nohup npm run dev > /home/devbox/logs/frontend.logs 2>&1 & FRONTEND_PID=\$! echo "npm run dev has been started with PID: \$FRONTEND_PID" -echo "\$FRONTEND_PID" > /home/.devbox/.frontend.pid +echo "\$FRONTEND_PID" > /home/devbox/.frontend.pid echo '============================================' @@ -1250,7 +1253,7 @@ devbox_deinit_command() { # src/deinit_command.sh echo "# It contains the implementation for the 'devbox deinit' command." - local WORKING_HOME="$(get_arg '--working-home' "${HOME}/.devbox")" + local WORKING_HOME="$(get_arg '--working-home' "${HOME}/devbox")" local CLEAR_LOGS="$(get_arg '--clear-logs')" local CLEAR_REPO="$(get_arg '--clear-repo')" @@ -1374,7 +1377,7 @@ devbox_deinit_command() { devbox_start_command() { local COMPONENT="$(get_arg '--component')" - local WORKING_HOME="$(get_arg '--working-home' "${HOME}/.devbox")" + local WORKING_HOME="$(get_arg '--working-home' "${HOME}/devbox")" local FREELEAPS_ENDPOINT="$(get_arg '--freeleaps-endpoint')" # Check if the DevBox container is running @@ -1478,7 +1481,7 @@ echo "Starting backend and frontend services..." echo '============================================' echo ' Start to run webapi.main:app ' echo '============================================' -pushd /home/.devbox/freeleaps/apps +pushd /home/devbox/freeleaps/apps # CHeck if the virtual environment is created if [ ! -f "venv_t/bin/activate" ]; then @@ -1490,7 +1493,7 @@ echo '============================================' echo ' Start to activate virtual environment' echo '============================================' source venv_t/bin/activate -source /home/.devbox/freeleaps/apps/.env +source /home/devbox/freeleaps/apps/.env # Verify the virtual environment is activated if [[ "\$VIRTUAL_ENV" != "" ]]; then @@ -1501,12 +1504,12 @@ else fi # Check if the backend service is already running -SERVICE_API_ACCESS_PORT=\$(cat /home/.devbox/.devbox-backend-port) -uvicorn freeleaps.webapi.main:app --reload --host 0.0.0.0 --port \$SERVICE_API_ACCESS_PORT > /home/.devbox/logs/backend.logs 2>&1 & +SERVICE_API_ACCESS_PORT=\$(cat /home/devbox/.devbox-backend-port) +uvicorn freeleaps.webapi.main:app --reload --host 0.0.0.0 --port \$SERVICE_API_ACCESS_PORT > /home/devbox/logs/backend.logs 2>&1 & BACKEND_PID=\$! # Save BACKEND_PID to a file \${WORKING_HOME}/.backend.pid: Stores the process id of backend process. -echo "\$BACKEND_PID" > /home/.devbox/.backend.pid +echo "\$BACKEND_PID" > /home/devbox/.backend.pid # Check if the backend service started successfully sleep 10 @@ -1542,12 +1545,12 @@ fi echo '============================================' echo ' Start frontend service locally' echo '============================================' -pushd /home/.devbox/freeleaps/frontend +pushd /home/devbox/freeleaps/frontend -npm run dev > /home/.devbox/logs/frontend.logs 2>&1 & +npm run dev > /home/devbox/logs/frontend.logs 2>&1 & FRONTEND_PID=\$! -echo "\$FRONTEND_PID" > /home/.devbox/.frontend.pid +echo "\$FRONTEND_PID" > /home/devbox/.frontend.pid # Check if the frontend service started successfully sleep 10 @@ -1559,7 +1562,7 @@ fi # Test the frontend service -WEB_APP_ACCESS_PORT=\$(cat /home/.devbox/.devbox-frontend-port) +WEB_APP_ACCESS_PORT=\$(cat /home/devbox/.devbox-frontend-port) echo "Testing frontend service... PORT: \$WEB_APP_ACCESS_PORT" attempt=0 @@ -1600,7 +1603,7 @@ fi devbox_stop_command() { echo "==> Stopping DevBox services..." local COMPONENT="$(get_arg '--component')" - local WORKING_HOME="$(get_arg '--working-home' "${HOME}/.devbox")" + local WORKING_HOME="$(get_arg '--working-home' "${HOME}/devbox")" # If the DevBox container is not running, exit if [[ -z "$COMPONENT" ]]; then @@ -1658,7 +1661,7 @@ devbox_status_command() { echo "==> Checking DevBox services status..." local COMPONENT="$(get_arg '--component')" - local WORKING_HOME="$(get_arg '--working-home' "${HOME}/.devbox")" + local WORKING_HOME="$(get_arg '--working-home' "${HOME}/devbox")" # Check if .devbox-instance file exists if [[ ! -f "${WORKING_HOME}/.devbox-instance" ]]; then @@ -1757,7 +1760,7 @@ devbox_status_command() { devbox_restart_command() { echo "==> Restarting DevBox services..." local COMPONENT="$(get_arg '--component')" - local WORKING_HOME="$(get_arg '--working-home' "${HOME}/.devbox")" + local WORKING_HOME="$(get_arg '--working-home' "${HOME}/devbox")" local FREELEAPS_ENDPOINT="$(get_arg '--freeleaps-endpoint')" # Check devbox container file path @@ -1868,7 +1871,7 @@ echo '============================================' echo ' Start to run webapi.main:app' echo '============================================' -pushd /home/.devbox/freeleaps/apps +pushd /home/devbox/freeleaps/apps # CHeck if the virtual environment is created @@ -1881,7 +1884,7 @@ echo '============================================' echo ' Start to activate virtual environment' echo '============================================' source venv_t/bin/activate -source /home/.devbox/freeleaps/apps/.env +source /home/devbox/freeleaps/apps/.env # Verify the virtual environment is activated if [[ "\$VIRTUAL_ENV" != "" ]]; then @@ -1892,12 +1895,12 @@ else fi # Check if the backend service is already running -SERVICE_API_ACCESS_PORT=\$(cat /home/.devbox/.devbox-backend-port) -uvicorn freeleaps.webapi.main:app --reload --host 0.0.0.0 --port \$SERVICE_API_ACCESS_PORT > /home/.devbox/logs/backend.logs 2>&1 & +SERVICE_API_ACCESS_PORT=\$(cat /home/devbox/.devbox-backend-port) +uvicorn freeleaps.webapi.main:app --reload --host 0.0.0.0 --port \$SERVICE_API_ACCESS_PORT > /home/devbox/logs/backend.logs 2>&1 & BACKEND_PID=\$! # Save BACKEND_PID to a file \${WORKING_HOME}/.backend.pid: Stores the process id of backend process. -echo "\$BACKEND_PID" > /home/.devbox/.backend.pid +echo "\$BACKEND_PID" > /home/devbox/.backend.pid # Check if the backend service started successfully sleep 10 @@ -1933,12 +1936,12 @@ fi echo '============================================' echo ' Start frontend service locally' echo '============================================' -pushd /home/.devbox/freeleaps/frontend +pushd /home/devbox/freeleaps/frontend -npm run dev > /home/.devbox/logs/frontend.logs 2>&1 & +npm run dev > /home/devbox/logs/frontend.logs 2>&1 & FRONTEND_PID=\$! -echo "\$FRONTEND_PID" > /home/.devbox/.frontend.pid +echo "\$FRONTEND_PID" > /home/devbox/.frontend.pid # Check if the frontend service started successfully sleep 10 @@ -1949,7 +1952,7 @@ fi # Test the frontend service -WEB_APP_ACCESS_PORT=\$(cat /home/.devbox/.devbox-frontend-port) +WEB_APP_ACCESS_PORT=\$(cat /home/devbox/.devbox-frontend-port) echo "Testing frontend service..." attempt=0 @@ -2484,7 +2487,7 @@ devbox_init_parse_requirements() { fi if [ -z "$(get_arg '--working-home')" ]; then - add_arg '--working-home' "${HOME}/.devbox" + add_arg '--working-home' "${HOME}/devbox" fi if [ -z "$(get_arg '--use-local-component')" ]; then @@ -2578,7 +2581,7 @@ devbox_deinit_parse_requirements() { # :command.default_assignments if [ -z "$(get_arg '--working-home')" ]; then - add_arg '--working-home' "${HOME}/.devbox" + add_arg '--working-home' "${HOME}/devbox" fi if [ -z "$(get_arg '--clear-logs')" ]; then add_arg '--clear-logs' "false" diff --git a/devbox/devbox.local/cli/docker-compose.dev.arm64.new.yaml b/devbox/devbox.local/cli/docker-compose.dev.arm64.new.yaml new file mode 100644 index 0000000..7c2861e --- /dev/null +++ b/devbox/devbox.local/cli/docker-compose.dev.arm64.new.yaml @@ -0,0 +1,266 @@ +services: + gitea: + # For apple chip, add: platform: linux/amd64 + container_name: freeleaps2-gitea + platform: linux/${ARCH:-arm64} + image: gitea/gitea:latest + restart: always + ports: + - "3000:3000" + environment: + - DISABLE_REGISTRATION=true + - REQUIRE_SIGNIN_VIEW=true + volumes: + - ${WORKING_HOME}/freeleaps2-gitea:/data:Z + networks: + - devbox_freeleaps2-network + + chat: + container_name: freeleaps-chat + build: + context: ${WORKING_HOME}/freeleaps/apps + dockerfile: ${WORKING_HOME}/freeleaps/dockers/dev.chat.Dockerfile + args: + CONTAINER_APP_ROOT: app + restart: always + ports: + - 8012:8012 + environment: + - 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 + - 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/ + - CERT_PATH=/app/certs + - 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 + volumes: + - type: bind + source: ${WORKING_HOME}/freeleaps/apps + target: /app/log/freeleaps-chat + networks: + - devbox_freeleaps2-network + + mongodb: + # For apple chip, add: platform: linux/amd64 + # For apple chip, you may want to downgrade to public mongo:4.4 for log support + container_name: freeleaps2-mongodb + platform: linux/${ARCH:-arm64} + image: mongo:latest + restart: always + ports: + - "27017:27017" + volumes: + - ${WORKING_HOME}/freeleaps2-mongodb-data:/data/db + networks: + - devbox_freeleaps2-network + + rabbitmq: + # For apple chip, add: platform: linux/amd64 + platform: linux/${ARCH:-arm64} + container_name: freeleaps2-rabbitmq + image: rabbitmq:latest + restart: always + ports: + - "5672:5672" + - "15672:15672" + volumes: + - ${WORKING_HOME}/freeleaps2-rabbitmq-data:/var/lib/rabbitmq + networks: + - devbox_freeleaps2-network + + devsvc: + container_name: devsvc + image: freeleaps/devsvc:${DEVSVC_IMAGE_TAG:-latest-linux-arm64} + restart: always + environment: + - APP_NAME=devsvc + - SERVICE_API_ACCESS_HOST=localhost + - SERVICE_API_ACCESS_PORT=8007 + - MONGODB_NAME=freeleaps2 + - MONGODB_URI=mongodb://freeleaps2-mongodb:27017/ + - GITEA_TOKEN=6786dc398b77d2a9c454b1943019425049deb667 + - GITEA_URL=http://freeleaps2-gitea:3000 + - CODE_DEPOT_HTTP_PORT=3443 + - CODE_DEPOT_SSH_PORT=22 + - CODE_DEPOT_DOMAIN_NAME=localhost + - RABBITMQ_HOST=freeleaps2-rabbitmq + - RABBITMQ_PORT=5672 + - LOG_BASE_PATH=/app/log/devsvc + - BACKEND_LOG_FILE_NAME=devsvc.log + - APPLICATION_ACTIVITY_LOG=devsvc-application.log + ports: + - 8007:8007 + command: + - /bin/sh + - -c + - | + uvicorn webapi.main:app --reload --port=8007 --host=0.0.0.0 + volumes: + - type: bind + source: ${WORKING_HOME}/logs/devsvc + target: /app/log/devsvc + networks: + - devbox_freeleaps2-network + + 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: + - APP_NAME=central_storage + - MONGODB_NAME=freeleaps2 + - MONGODB_PORT=27017 + - MONGODB_URI=mongodb://freeleaps2-mongodb:27017/ + - SERVICE_API_ACCESS_HOST=localhost + - SERVICE_API_ACCESS_PORT=8005 + - AZURE_STORAGE_DOCUMENT_API_KEY=Cg+wtKpHt6Bo6bTUtjic40cRNRZ8NCI3JYBY69BNPgFJARVx/c18iVC7cASbJfzukyu4pksyhUep+AStFdpH7Q== + - AZURE_STORAGE_DOCUMENT_API_ENDPOINT=https://freeleaps1document.blob.core.windows.net/ + - LOG_BASE_PATH=/app/log/central_storage + - BACKEND_LOG_FILE_NAME=central_storage.log + - APPLICATION_ACTIVITY_LOG=central_storage-application.log + ports: + - 8005:8005 + command: + - /bin/sh + - -c + - | + uvicorn webapi.main:app --reload --port=8005 --host=0.0.0.0 + networks: + - devbox_freeleaps2-network + volumes: + - type: bind + source: ${WORKING_HOME}/logs/central_storage + target: /app/log/central_storage + + authentication: + container_name: authentication + image: freeleaps/authentication:${AUTHENTICATION_IMAGE_TAG:-latest-linux-arm64} + # profiles: [ prod, alpha, dev ] + platform: linux/${ARCH:-arm64} + restart: always + environment: + - APP_NAME=authentication + - MONGODB_NAME=freeleaps2 + - MONGODB_PORT=27017 + - MONGODB_URI=mongodb://freeleaps2-mongodb:27017/ + - SERVICE_API_ACCESS_HOST=localhost + - SERVICE_API_ACCESS_PORT=8004 + - LOG_BASE_PATH=/app/log/authentication + - BACKEND_LOG_FILE_NAME=authentication.log + - APPLICATION_ACTIVITY_LOG=authentication-application.log + - NOTIFICATION_WEBAPI_URL_BASE=http://notification:8003/api/notification/ + - DEVSVC_WEBAPI_URL_BASE=http://devsvc:8007/api/devsvc + - JWT_SECRET_KEY=8f87ca8c3c9c3df09a9c78e0adb0927855568f6072d9efc892534aee35f5867b + - JWT_ALGORITHM=HS256 + ports: + - 8004:8004 + command: + - /bin/sh + - -c + - | + uvicorn webapi.main:app --reload --port=8004 --host=0.0.0.0 + networks: + - devbox_freeleaps2-network + volumes: + - type: bind + source: ${WORKING_HOME}/logs/authentication + target: /app/log/authentication + + content: + container_name: content + image: freeleaps/content:${CONTENT_IMAGE_TAG:-latest-linux-arm64} + # profiles: [ prod, alpha, dev ] + platform: linux/${ARCH:-arm64} + restart: always + environment: + - APP_NAME=content + - SERVICE_API_ACCESS_HOST=localhost + - SERVICE_API_ACCESS_PORT=8013 + - MONGODB_NAME=freeleaps2 + - MONGODB_URI=mongodb://freeleaps2-mongodb:27017/ + - FREELEAPS_WWW_AS_AZURE_CLIENT_SECRET=jTu8Q~WceiK-5dfZB44Ww-K4fVGi3_5tHNWYYbdX + - CENTRAL_STORAGE_WEBAPI_URL_BASE=http://central_storage:8005/api/central_storage/ + - LOG_BASE_PATH=/app/log/content + - BACKEND_LOG_FILE_NAME=content.log + - APPLICATION_ACTIVITY_LOG=content-application.log + ports: + - 8013:8013 + command: + - /bin/sh + - -c + - | + uvicorn webapi.main:app --reload --port=8013 --host=0.0.0.0 + networks: + - devbox_freeleaps2-network + volumes: + - type: bind + source: ${WORKING_HOME}/logs/content + target: /app/log/content + + notification: + container_name: notification + image: freeleaps/notification:${NOTIFICATION_IMAGE_TAG:-latest-linux-arm64} + # profiles: [ prod, alpha, dev ] + platform: linux/${ARCH:-arm64} + restart: always + environment: + - APP_NAME=notification + - SERVICE_API_ACCESS_HOST=localhost + - SERVICE_API_ACCESS_PORT=8003 + - RABBITMQ_HOST=freeleaps2-rabbitmq + - RABBITMQ_PORT=5672 + - SYSTEM_USER_ID=117f191e810c19729de860aa + - SMS_FROM=+16898887156 + - EMAIL_FROM=freeleaps@freeleaps.com + - SECRET_KEY=8f87ca8c3c9c3df09a9c78e0adb0927855568f6072d9efc892534aee35f5867b + - SENDGRID_API_KEY=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 + - TWILIO_ACCOUNT_SID=ACf8c9283a6acda060258eadb29be58bc8 + - TWILIO_AUTH_TOKEN=120165c0550111ddfd58efc97dafc2fe + - LOG_BASE_PATH=/app/log/notification + - BACKEND_LOG_FILE_NAME=notification.log + - APPLICATION_ACTIVITY_LOG=notification-application.log + ports: + - 8003:8003 + command: + - /bin/sh + - -c + - | + uvicorn webapi.main:app --reload --port=8003 --host=0.0.0.0 + networks: + - devbox_freeleaps2-network + volumes: + - type: bind + source: ${WORKING_HOME}/logs/notification + target: /app/log/notification + +volumes: + freeleaps2-mongodb-data: + freeleaps2-gitea-data: + freeleaps2-rabbitmq-data: + + +networks: + devbox_freeleaps2-network: + external: true diff --git a/devbox/devbox.local/cli/gitea_data_backup.tar.gz b/devbox/devbox.local/cli/gitea_data_backup.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..550787f1b0cb5fc5e3a94bf4ec29914d0d8ba3e9 GIT binary patch literal 46922 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

$mR%qvd*C#3U-Nob>b_yR%5L&yQ|~$vWbryd3ru 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Ð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