Merged PR 51: Update for fixing duplicate frontend pnpm install execution and temp file cleanup logic

Update for fixing duplicate frontend pnpm install execution and temp file cleanup logic
This commit is contained in:
Tianyong Qiu 2025-03-21 17:16:01 +00:00
commit c551feeb35

View File

@ -49,6 +49,7 @@ exit_with_message() {
exit $code
}
detect_os() {
if [[ "$OSTYPE" == "darwin"* ]]; then
echo "darwin"
@ -461,11 +462,11 @@ inspect_args() {
install_docker() {
log_info "==> Installing Docker..."
log_info "Installing Docker..."
# Check if Docker is already installed
if command -v docker &>/dev/null; then
log_info "==> Docker is already installed."
log_info "Docker is already installed."
return 0
fi
@ -541,11 +542,11 @@ install_docker() {
}
check_docker_running() {
log_info "==> Checking if Docker service is running..."
log_info "Checking if Docker service is running..."
# if Docker CLI is installed and Docker daemon is running
if docker info >/dev/null 2>&1; then
log_info "==> Docker is running."
log_info "Docker is running."
return 0
fi
@ -553,7 +554,7 @@ check_docker_running() {
if grep -qi microsoft /proc/version; then
log_info "Detected WSL environment. Verifying /var/run/docker.sock..."
if [ -S /var/run/docker.sock ]; then
log_info "==> Docker socket found. Docker should be available via Docker Desktop."
log_info "Docker socket found. Docker should be available via Docker Desktop."
return 0
else
log_error "Docker socket not found in WSL environment."
@ -561,26 +562,26 @@ check_docker_running() {
fi
fi
log_info "==> Docker is not running. Attempting to start it..."
log_info "Docker is not running. Attempting to start it..."
# Start Docker service using systemctl or service command
if command -v systemctl &>/dev/null; then
if systemctl list-units --type=service | grep -q "docker.service"; then
log_info "==> Starting Docker with systemctl..."
sudo systemctl start docker && log_info "==> Docker started successfully." && return 0
log_info "Starting Docker with systemctl..."
sudo systemctl start docker && log_info "Docker started successfully." && return 0
fi
fi
if command -v service &>/dev/null; then
if service --status-all | grep -q "docker"; then
log_info "==> Starting Docker with service..."
sudo service docker start && log_info "==> Docker started successfully." && return 0
log_info "Starting Docker with service..."
sudo service docker start && log_info "Docker started successfully." && return 0
fi
fi
if command -v snap &>/dev/null && snap list | grep -q "docker"; then
log_info "==> Starting Docker with snap..."
sudo snap start docker && log_info "==> Docker started successfully." && return 0
log_info "Starting Docker with snap..."
sudo snap start docker && log_info "Docker started successfully." && return 0
fi
log_error "Unable to start Docker automatically. Please start it manually."
@ -589,7 +590,7 @@ check_docker_running() {
build_local_image() {
local dockerfile_path="$1"
log_info "==> [Build] use Dockerfile: $(grep '^FROM' "$dockerfile_path")"
log_info "[Build] use Dockerfile: $(grep '^FROM' "$dockerfile_path")"
# Check if the image already exists
docker rmi -f $devbox_full_image 2>/dev/null || true
@ -634,17 +635,6 @@ get_port() {
done
}
# Build the local image
build_local_image() {
local dockerfile_path="$1"
log_info "==> [BUILD] Building local image..."
docker buildx build \
--platform linux/amd64 \
--build-arg BUILDARCH="x86-64-v3" \
-t $devbox_full_image \
-f "$dockerfile_path" .
}
###############################################
# Initialize the development environment
@ -794,18 +784,37 @@ if true ; then
# 3⃣ Clean up old dependencies
if [ -f "pnpm-lock.yaml" ]; then
mv pnpm-lock.yaml /tmp/pnpm-lock.yaml.bak
cp pnpm-lock.yaml /tmp/pnpm-lock.yaml.bak
fi
rm -rf node_modules pnpm-lock.yaml
rm -rf node_modules
# 4⃣ Install dependencies (ensuring lockfile updates)
pnpm install --no-frozen-lockfile
pnpm install --no-frozen-lockfile \\
--shamefully-hoist \\
--link-workspace-packages false \\
--store-dir /home/devbox/.pnpm-store
# 4⃣ Build the frontend
pnpm run build
echo "==> [INIT] Backend and frontend environment initialization completed."
# 5⃣ Check git status
echo
echo "[INIT] \$(date '+%Y-%m-%d %H:%M:%S') Checking git status..."
echo
git config --global --add safe.directory /home/devbox/freeleaps
git status -s
echo
echo "[INIT] \$(date '+%Y-%m-%d %H:%M:%S') Git status check completed."
echo
echo "[INIT] \$(date '+%Y-%m-%d %H:%M:%S') Backend and frontend environment initialization completed."
fi
EOF
@ -876,7 +885,7 @@ docker exec -i "$DEVBOX_NAME" bash <<EOF
echo
echo "============================================================================================"
echo
echo "[BACKEND] \$(date '+%Y-%m-%d %H:%M:%S') [WARNING] Backend service is running with PID: \$backend_pid, if you want to restart, please stop it first or run devbox restart -e backend."
echo "[BACKEND] [WARNING] Backend service is running with PID: \$backend_pid, if you want to restart, please stop it first or run devbox restart -e backend."
echo
echo "============================================================================================"
echo
@ -905,6 +914,10 @@ docker exec -i "$DEVBOX_NAME" bash <<EOF
echo
echo "============================================"
echo
# rm baseline_backend
rm -f "\$baseline_backend"
exit 1
fi
@ -925,6 +938,8 @@ docker exec -i "$DEVBOX_NAME" bash <<EOF
echo
echo "============================================"
echo
rm -f "\$baseline_backend"
exit 1
fi
@ -1155,6 +1170,7 @@ docker exec -i "$DEVBOX_NAME" bash <<EOF
baseline_frontend=\$(mktemp)
git config --global --add safe.directory /home/devbox/freeleaps
git status -s > "\$baseline_frontend"
echo "[FRONTEND] \$(date '+%Y-%m-%d %H:%M:%S') Recorded baseline before compilation: \$baseline_frontend"
# Check if the frontend service is already running according to the package.json and pnpm-lock.yaml files timestamps
@ -1163,12 +1179,18 @@ docker exec -i "$DEVBOX_NAME" bash <<EOF
lock_time=\$(stat -c "%Y" pnpm-lock.yaml)
modules_time=\$(stat -c "%Y" node_modules)
# Calculate the time difference between the lock file and the modules file
# Calculate the absolute value of the time difference between the lock file and the modules file
time_diff=\$(( lock_time - modules_time ))
if [ \$time_diff -lt 0 ]; then
time_diff=\$(( -time_diff ))
fi
# Set the threshold for the time difference
threshold=150
echo "[FRONTEND] \$(date '+%Y-%m-%d %H:%M:%S') Checking frontend dependencies..."
echo "[FRONTEND] \$(date '+%Y-%m-%d %H:%M:%S') Time difference: \$time_diff seconds, lock_time: \$lock_time, modules_time: \$modules_time"
if [[ ! -d "node_modules" || "package.json" -nt "node_modules" || \$time_diff -gt \$threshold ]]; then
echo "[FRONTEND] \$(date '+%Y-%m-%d %H:%M:%S') Installing/Updating frontend dependencies..."
@ -1180,8 +1202,16 @@ docker exec -i "$DEVBOX_NAME" bash <<EOF
mv pnpm-lock.yaml /tmp/pnpm-lock.yaml.bak
fi
# if /home/devbox/.pnpm-store exists, remove it
if [ -d "/home/devbox/.pnpm-store" ]; then
rm -rf /home/devbox/.pnpm-store
fi
# Install dependencies
pnpm install --no-frozen-lockfile || {
pnpm install --no-frozen-lockfile \\
--shamefully-hoist \\
--link-workspace-packages false \\
--store-dir /home/devbox/.pnpm-store || {
echo
echo "============================================================================================"
echo
@ -1189,6 +1219,11 @@ docker exec -i "$DEVBOX_NAME" bash <<EOF
echo
echo "============================================================================================"
echo
# rm baseline_frontend if it exists
if [ -f "\$baseline_frontend" ]; then
rm "\$baseline_frontend"
fi
exit 1
}
fi
@ -1204,6 +1239,10 @@ docker exec -i "$DEVBOX_NAME" bash <<EOF
echo
echo "============================================================================================"
echo
if [ -f "\$baseline_frontend" ]; then
rm "\$baseline_frontend"
fi
exit 1
}
@ -1216,6 +1255,10 @@ docker exec -i "$DEVBOX_NAME" bash <<EOF
echo
echo "============================================================================================"
echo
if [ -f "\$baseline_frontend" ]; then
rm "\$baseline_frontend"
fi
exit 1
fi
fi
@ -1224,6 +1267,15 @@ docker exec -i "$DEVBOX_NAME" bash <<EOF
echo "[FRONTEND] \$(date '+%Y-%m-%d %H:%M:%S') Start frontend service..."
nohup pnpm run dev > /home/devbox/logs/frontend.logs 2>&1 &
# Check git status
echo
echo "[FRONTEND] \$(date '+%Y-%m-%d %H:%M:%S') Checking git status..."
echo
git status -s
echo
echo "[FRONTEND] \$(date '+%Y-%m-%d %H:%M:%S') Git status check completed."
echo
# Check the health of the frontend service: poll to detect HTTP status
MAX_ATTEMPTS=30
ATTEMPT=0
@ -1244,17 +1296,6 @@ docker exec -i "$DEVBOX_NAME" bash <<EOF
sleep 10
fi
done
if [ \$ATTEMPT -eq \$MAX_ATTEMPTS ]; then
echo
echo "============================================================================================"
echo
echo "[FRONTEND] [ERROR] Frontend service startup failed. Please check the logs for more information. Logs: ${WORKING_HOME}/logs/frontend.logs"
echo
echo "============================================================================================"
echo
exit 1
fi
# if /tmp/pnpm-lock.yaml.bak exists, restore it
if [ -f "/tmp/pnpm-lock.yaml.bak" ];
@ -1283,12 +1324,38 @@ docker exec -i "$DEVBOX_NAME" bash <<EOF
popd > /dev/null
if [ \$ATTEMPT -eq \$MAX_ATTEMPTS ]; then
echo
echo "============================================================================================"
echo
echo "[FRONTEND] [ERROR] Frontend service startup failed. Please check the logs for more information. Logs: ${WORKING_HOME}/logs/frontend.logs"
echo
echo "============================================================================================"
echo
exit 1
fi
echo
echo "[FRONTEND] \$(date '+%Y-%m-%d %H:%M:%S') Frontend compilation and startup completed."
echo
EOF
}
reset_freeleaps_repo() {
echo "[INIT] $(date '+%Y-%m-%d %H:%M:%S') Resetting FreeLeaps repository..."
devbox_container_id_file_path="${WORKING_HOME}/.devbox-instance"
DEVBOX_NAME=$(cat "$devbox_container_id_file_path")
docker exec -i "$DEVBOX_NAME" bash <<EOF
echo "[INIT] \$(date '+%Y-%m-%d %H:%M:%S') Resetting FreeLeaps repository..."
pushd /home/devbox/freeleaps > /dev/null
git config --global --add safe.directory /home/devbox/freeleaps
git reset --hard HEAD
popd > /dev/null
echo "[INIT] \$(date '+%Y-%m-%d %H:%M:%S') FreeLeaps repository reset completed."
EOF
}
# :command.command_functions
# :command.function
devbox_init_command() {
@ -1386,8 +1453,8 @@ devbox_init_command() {
# If is_pull_all_components is true, then pull all components
if [[ "$is_pull_all_components" == true ]]; then
start_components=("${components[@]}")
log_info "==> Pulling all components..."
log_info "==> start components: ${start_components[@]}"
log_info "Pulling all components..."
log_info "start components: ${start_components[@]}"
fi
# Remove duplicated components
@ -1422,9 +1489,9 @@ devbox_init_command() {
# Auto detected $OS
if [[ "$OS" == "auto" ]]; then
log_info "==> Auto detecting OS..."
log_info "Auto detecting OS..."
OS="$(detect_os)"
log_info "==> Detected OS: $OS"
log_info "Detected OS: $OS"
fi
if [[ "$ARCH" != "auto" && "$ARCH" != "amd64" && "$ARCH" != "arm64" ]]; then
@ -1440,7 +1507,7 @@ devbox_init_command() {
if grep -q avx2 /proc/cpuinfo; then
ARCH="amd64"
ARCH_MICRO="v3"
log_info "==> Detected AMD64 architecture."
log_info "Detected AMD64 architecture."
else
ARCH="amd64"
fi
@ -1540,7 +1607,7 @@ devbox_init_command() {
# Check if Installed the net-tools netstat under MacOS, WSL2 and Linux OS
if [[ "$OS" == "darwin" || "$OS" == "wsl2" || "$OS" == "linux" ]]; then
if ! command -v netstat &>/dev/null; then
log_info "==> Installing net-tools package..."
log_info "Installing net-tools package..."
if [[ "$OS" == "darwin" ]]; then
brew install net-tools
elif [[ "$OS" == "wsl2" ]]; then
@ -1553,11 +1620,11 @@ devbox_init_command() {
exit_with_message " Failed install net-tools package on OS: $OS, please install it manually." 1
fi
else
log_info "==> net-tools package already installed."
log_info "net-tools package already installed."
fi
fi
log_info "==> Checking if the ports are in use..."
log_info "Checking if the ports are in use..."
# Check if the gittea, mongodb, rabbitmq, redis ports are in use
if netstat -tuln | grep -q ":3000"; then
exit_with_message " gitea port 3000 is already in use, please stop the service." 1
@ -1579,16 +1646,16 @@ devbox_init_command() {
exit_with_message " redis port 6379 is already in use, please stop the service." 1
fi
log_info "==> Checking if the ports are in use... Done."
log_info "Checking if the ports are in use... Done."
local devbox_full_image="${DEVBOX_REPO}/${DEVBOX_IMAGE}:${DEVBOX_TAG}"
# Check local and remote version. User doesnt need to rebuild devbox if local version is consistent with remote version
if [[ -n "$DEVBOX_REPO" && -n "$DEVBOX_IMAGE" && -n "$DEVBOX_TAG" ]]; then
if docker images --format '{{.Repository}}:{{.Tag}}' | grep -q "^${DEVBOX_REPO}/${DEVBOX_IMAGE}:${DEVBOX_TAG}\$"; then
log_info "==> DevBox image $devbox_full_image already exists."
log_info "DevBox image $devbox_full_image already exists."
else
log_info "==> Pulling DevBox image $devbox_full_image..."
log_info "Pulling DevBox image $devbox_full_image..."
docker pull "$devbox_full_image"
fi
else
@ -1598,7 +1665,7 @@ devbox_init_command() {
# If container with same name exists, remove it
if docker ps -a --format '{{.Names}}' | grep -q "^${DEVBOX_NAME}\$"; then
if [[ -n "$FORCE_INIT" ]]; then
log_info "==> Removing existing container named $DEVBOX_NAME ..."
log_info "Removing existing container named $DEVBOX_NAME ..."
docker stop "$DEVBOX_NAME" &>/dev/null || true
docker rm "$DEVBOX_NAME" &>/dev/null || true
@ -1619,10 +1686,10 @@ devbox_init_command() {
log_info ' Starting DevBox environment initialization...'
# Check if docker network create devbox_freeleaps2-network
if ! docker network ls | grep -q "$DEVBOX_FREELEAPS2_NETWORK"; then
log_info "==> Creating Docker network: $DEVBOX_FREELEAPS2_NETWORK"
log_info "Creating Docker network: $DEVBOX_FREELEAPS2_NETWORK"
docker network create "$DEVBOX_FREELEAPS2_NETWORK"
else
log_info "==> Docker network devbox_freeleaps2-network already exists."
log_info "Docker network devbox_freeleaps2-network already exists."
fi
# Check if use custom repository
@ -1666,7 +1733,7 @@ devbox_init_command() {
ENCODEING_FREELEAPS_USERNAME=$(url_encode "$FREELEAPS_USERNAME")
ENCODEING_FREELEAPS_PASSWORD=$(url_encode "$FREELEAPS_PASSWORD")
# Test if the user can access the freeleaps.com repository
log_info "==> Testing access to freeleaps.com repository..."
log_info "Testing access to freeleaps.com repository..."
if ! git ls-remote "https://$ENCODEING_FREELEAPS_USERNAME:$ENCODEING_FREELEAPS_PASSWORD@freeleaps.com:3443/products/freeleaps.git" &>/dev/null; then
exit_with_message " Failed to access freeleaps.com repository. Please check your username and password." 1
fi
@ -1708,7 +1775,7 @@ devbox_init_command() {
# Check if the custom repository is a git repository
# Test if the user can access the custom repository
log_info "==> Testing access to custom repository..."
log_info "Testing access to custom repository..."
if ! git ls-remote "$USE_CUSTOM_REPOSITORY" &>/dev/null; then
exit_with_message " Failed to access custom repository. Please check the repository URL." 1
fi
@ -1751,7 +1818,7 @@ devbox_init_command() {
# 6. linbwang: pull and start other components
# -------------------------------------------------------------------
log_info "==> [INIT] Starting Freeleaps services... Use Local component $USE_LOCAL_COMPONENT_VAL"
log_info "[INIT] Starting Freeleaps services... Use Local component $USE_LOCAL_COMPONENT_VAL"
export ARCH="$ARCH"
export WORKING_HOME="$WORKING_HOME"
@ -1768,10 +1835,10 @@ if [[ -n "$USE_CUSTOM_REPOSITORY" ]]; then
echo
echo "==========================================================="
echo
log_info "==> [INIT] Custom repository initialization completed."
log_info "==> Custom repository is located at: ${WORKING_HOME}/${CUSTOM_FOLDER_NAME}"
log_info "==> Custom repository URL: $ECHO_USE_CUSTOM_REPOSITORY"
log_info "==> Custom repository is ready for use."
log_info "[INIT] Custom repository initialization completed."
log_info "Custom repository is located at: ${WORKING_HOME}/${CUSTOM_FOLDER_NAME}"
log_info "Custom repository URL: $ECHO_USE_CUSTOM_REPOSITORY"
log_info "Custom repository is ready for use."
echo
echo "==========================================================="
echo
@ -1780,7 +1847,7 @@ if [[ -n "$USE_CUSTOM_REPOSITORY" ]]; then
fi
# Check if docker-compose command exists
log_info "==> Cehck if docker-compose command exists"
log_info "Cehck if docker-compose command exists"
# Check if docker-compose is installed
local DC_CMD
if command -v docker-compose >/dev/null 2>&1; then
@ -1798,7 +1865,7 @@ fi
# If USE_LOCAL_COMPONENT is true, then use local components
if [[ $USE_LOCAL_COMPONENT_VAL == true ]]; then
log_info ' ===> Using local components for Freeleaps services.'
log_info ' = Using local components for Freeleaps services.'
export DEVSVC_IMAGE_TAG="$component_tag"
export CONTENT_IMAGE_TAG="$component_tag"
@ -1856,7 +1923,7 @@ if [[ $USE_LOCAL_COMPONENT_VAL == true ]]; then
done
# Start Gitea, MongoDB, RabbitMQ and other components containers
log_info "===> start Gitea, MongoDB, RabbitMQ and other components containers"
log_info "start Gitea, MongoDB, RabbitMQ and other components containers"
$DC_CMD -f docker-compose.yaml up -d mongodb rabbitmq gitea redis "${start_components[@]}"
gitea_container_id=$(docker ps --no-trunc -a --filter "name=^freeleaps2-gitea$" --format "{{.ID}}")
@ -1887,9 +1954,9 @@ if [[ $USE_LOCAL_COMPONENT_VAL == true ]]; then
fi
done
else
echo '============================================'
log_info ' ===> Using online components for Freeleaps services.'
echo '============================================'
echo '============================================================'
log_info 'Using online components for Freeleaps services.'
echo '============================================================'
# Start Gitea, MongoDB, RabbitMQ containers
$DC_CMD -f docker-compose.yaml up -d mongodb rabbitmq redis
@ -1942,28 +2009,23 @@ IS_START_FRONTEND=true
compile_backend_service
compile_frontend_service
docker exec -i "$DEVBOX_NAME" bash <<EOF
echo "[INFO] \$(date '+%Y-%m-%d %H:%M:%S') Reset git changes caused by compilation"
pushd /home/devbox/freeleaps
git config --global --add safe.directory /home/devbox/freeleaps
git reset --hard
EOF
reset_freeleaps_repo
# -------------------------------------------------------------------
# 10. Final notification
# -------------------------------------------------------------------
echo
echo "==========================================================="
log_info "DevBox init completed successfully!"
log_info "DevBox Environment Details:"
log_info "1. Code repository is located at: ${WORKING_HOME}/freeleaps"
log_info "2. Open up the frontend by visiting: http://localhost:${DEVBOX_FRONTEND_PORT}"
log_info "3. Log files can be viewed at:"
log_info " - Backend logs: ${WORKING_HOME}/logs/backend.logs"
log_info " - Frontend logs: ${WORKING_HOME}/logs/frontend.logs"
log_info " DevBox container ID: $WORKING_HOME/.devbox-instance"
log_info " Backend PID: $WORKING_HOME/.backend.pid"
log_info " Frontend PID: $WORKING_HOME/.frontend.pid"
echo "DevBox init completed successfully!"
echo "DevBox Environment Details:"
echo "1. Code repository is located at: ${WORKING_HOME}/freeleaps"
echo "2. Open up the frontend by visiting: http://localhost:${DEVBOX_FRONTEND_PORT}"
echo "3. Log files can be viewed at:"
echo " - Backend logs: ${WORKING_HOME}/logs/backend.logs"
echo " - Frontend logs: ${WORKING_HOME}/logs/frontend.logs"
echo "DevBox container ID: $WORKING_HOME/.devbox-instance"
echo "Backend PID: $WORKING_HOME/.backend.pid"
echo "Frontend PID: $WORKING_HOME/.frontend.pid"
echo "==========================================================="
echo
}
@ -1979,20 +2041,20 @@ devbox_deinit_command() {
local CLEAR_ALL="$(get_arg '--clear-all')"
# print the parameters
log_info "==> Deinitialization parameters:"
log_info "Deinitialization parameters:"
log_info " WORKING_HOME = $WORKING_HOME"
log_info " CLEAR_LOGS = $CLEAR_LOGS"
log_info " CLEAR_REPO = $CLEAR_REPO"
log_info " CLEAR_ALL = $CLEAR_ALL"
log_info "==> Starting DevBox deinitialization..."
log_info "Starting DevBox deinitialization..."
# Stop and remove DevBox container
if [[ -f "$WORKING_HOME/.devbox-instance" ]]; then
local container_id
container_id=$(cat "$WORKING_HOME/.devbox-instance")
log_info "==> Stopping and removing DevBox container: $container_id"
log_info "Stopping and removing DevBox container: $container_id"
docker stop "$container_id" &>/dev/null || true
docker rm "$container_id" &>/dev/null || true
@ -2006,14 +2068,14 @@ devbox_deinit_command() {
rm -f "$WORKING_HOME/.backend.pid"
rm -f "$WORKING_HOME/.frontend.pid"
else
echo "==> DevBox container is not running."
log_info "DevBox container is not running."
if [[ -n "$(docker ps -a --format '{{.Names}}' | grep "^devbox\$")" ]]; then
# Get the container ID of the DevBox container
echo "==> DevBox container is stopped."
log_info "DevBox container is stopped."
local container_id
container_id=$(docker ps -a --format '{{.Names}}' | grep "^devbox\$")
log_info "==> Stopping and removing DevBox container: $container_id"
log_info "Stopping and removing DevBox container: $container_id"
docker stop "$container_id" &>/dev/null || true
docker rm "$container_id" &>/dev/null || true
fi
@ -2022,13 +2084,13 @@ devbox_deinit_command() {
if [[ -f "$WORKING_HOME/.gitea-instance" ]]; then
local gitea_container_id
gitea_container_id=$(cat "$WORKING_HOME/.gitea-instance")
log_info "==> Stopping and removing Gitea container: $gitea_container_id"
log_info "Stopping and removing Gitea container: $gitea_container_id"
docker stop "$gitea_container_id" &>/dev/null || true
docker rm "$gitea_container_id" &>/dev/null || true
# Check if the Gitea container is still running, then use docker compose down to stop and remove the container
if [[ -n "$(docker ps -a --format '{{.Names}}' | grep "^freeleaps2-gitea\$")" ]]; then
log_info "==> Using docker-compose down to stop and remove Gitea container."
log_info "Using docker-compose down to stop and remove Gitea container."
$DC_CMD -f docker-compose.yaml down gitea
fi
@ -2039,13 +2101,13 @@ devbox_deinit_command() {
if [[ -f "$WORKING_HOME/.mongodb-instance" ]]; then
local mongodb_container_id
mongodb_container_id=$(cat "$WORKING_HOME/.mongodb-instance")
log_info "==> Stopping and removing MongoDB container: $mongodb_container_id"
log_info "Stopping and removing MongoDB container: $mongodb_container_id"
docker stop "$mongodb_container_id" &>/dev/null || true
docker rm "$mongodb_container_id" &>/dev/null || true
# Check if the MongoDB container is still running, then use docker compose down to stop and remove the container
if [[ -n "$(docker ps -a --format '{{.Names}}' | grep "^freeleaps2-mongodb\$")" ]]; then
log_info "==> Using docker-compose down to stop and remove MongoDB container."
log_info "Using docker-compose down to stop and remove MongoDB container."
$DC_CMD -f docker-compose.yaml down mongodb
fi
@ -2055,13 +2117,13 @@ devbox_deinit_command() {
if [[ -f "$WORKING_HOME/.redis-instance" ]]; then
local redis_container_id
redis_container_id=$(cat "$WORKING_HOME/.redis-instance")
log_info "==> Stopping and removing Redis container: $redis_container_id"
log_info "Stopping and removing Redis container: $redis_container_id"
docker stop "$redis_container_id" &>/dev/null || true
docker rm "$redis_container_id" &>/dev/null || true
# Check if the Redis container is still running, then use docker compose down to stop and remove the container
if [[ -n "$(docker ps -a --format '{{.Names}}' | grep "^freeleaps2-redis\$")" ]]; then
log_info "==> Using docker-compose down to stop and remove Redis container."
log_info "Using docker-compose down to stop and remove Redis container."
$DC_CMD -f docker-compose.yaml down redis
fi
@ -2072,13 +2134,13 @@ devbox_deinit_command() {
if [[ -f "$WORKING_HOME/.rabbitmq-instance" ]]; then
local rabbitmq_container_id
rabbitmq_container_id=$(cat "$WORKING_HOME/.rabbitmq-instance")
log_info "==> Stopping and removing RabbitMQ container: $rabbitmq_container_id"
log_info "Stopping and removing RabbitMQ container: $rabbitmq_container_id"
docker stop "$rabbitmq_container_id" &>/dev/null || true
docker rm "$rabbitmq_container_id" &>/dev/null || true
# Check if the RabbitMQ container is still running, then use docker compose down to stop and remove the container
if [[ -n "$(docker ps -a --format '{{.Names}}' | grep "^freeleaps2-rabbitmq\$")" ]]; then
log_info "==> Using docker-compose down to stop and remove RabbitMQ container."
log_info "Using docker-compose down to stop and remove RabbitMQ container."
$DC_CMD -f docker-compose.yaml down rabbitmq
fi
@ -2091,13 +2153,13 @@ devbox_deinit_command() {
if [[ -f "$WORKING_HOME/.${component}-instance" ]]; then
local component_container_id
component_container_id=$(cat "$WORKING_HOME/.${component}-instance")
log_info "==> Stopping and removing ${component} container: $component_container_id"
log_info "Stopping and removing ${component} container: $component_container_id"
docker stop "$component_container_id" &>/dev/null || true
docker rm "$component_container_id" &>/dev/null || true
# Check if the component is still running, then use docker compose down to stop and remove the container
if [[ -n "$(docker ps -a --format '{{.Names}}' | grep "^$component\$")" ]]; then
log_info "==> Using docker-compose down to stop and remove $component container."
log_info "Using docker-compose down to stop and remove $component container."
$DC_CMD -f docker-compose.yaml down "$component"
fi
@ -2108,7 +2170,7 @@ devbox_deinit_command() {
# Clear the DevBox container logs
if [[ "$CLEAR_LOGS" == "true" ]]; then
log_info "==> Clearing logs in $WORKING_HOME/logs..."
log_info "Clearing logs in $WORKING_HOME/logs..."
if [[ -d "$WORKING_HOME/logs" ]]; then
uid=$(id -u)
gid=$(id -g)
@ -2117,19 +2179,19 @@ devbox_deinit_command() {
mkdir -p "$WORKING_HOME/logs" 2>/dev/null || true
fi
else
log_info "==> Skipping log clearing."
log_info "Skipping log clearing."
fi
# Clear the source repository
if [[ "$CLEAR_REPO" == "true" && -d "$WORKING_HOME/freeleaps" ]]; then
log_info "==> Deleting source repository at $WORKING_HOME/freeleaps"
log_info "Deleting source repository at $WORKING_HOME/freeleaps"
uid=$(id -u)
gid=$(id -g)
sudo chown -R ${uid}:${gid} "$WORKING_HOME/freeleaps"
rm -rf "$WORKING_HOME/freeleaps" 2>/dev/null || true
rmdir "$WORKING_HOME/freeleaps" 2>/dev/null || true
else
log_info "==> Skipping repository deletion."
log_info "Skipping repository deletion."
fi
if [[ "$CLEAR_LOGS" == "true" ]]; then
@ -2138,7 +2200,7 @@ devbox_deinit_command() {
log_warn " $WORKING_HOME/logs still exists after removal."
rm -rf "$WORKING_HOME/logs"
else
log_info "==> Logs directory removed successfully."
log_info "Logs directory removed successfully."
fi
fi
@ -2151,7 +2213,7 @@ devbox_deinit_command() {
REMOVE_WORKING_HOME=true
# Remove the working home directory
log_info "==> Removing working home directory: $WORKING_HOME"
log_info "Removing working home directory: $WORKING_HOME"
if [[ -d "$WORKING_HOME" ]]; then
uid=$(id -u)
gid=$(id -g)
@ -2159,17 +2221,18 @@ devbox_deinit_command() {
rm -rf "$WORKING_HOME" 2>/dev/null || true
rmdir "$WORKING_HOME" 2>/dev/null || true
fi
log_info "==> Working home directory removed successfully."
log_info "Working home directory removed successfully."
else
REMOVE_WORKING_HOME=false
log_info "==> Skipping working home directory removal."
log_info "Skipping working home directory removal."
fi
fi
# Sleep 5 seconds to allow the services to stop, for each second echo 5 seconds increase from 1 to 5 in each second by -
for i in {1..5}; do
echo -n "="
sleep 1
echo -n "[INFO] $(date '+%Y-%m-%d %H:%M:%S') Stopping services"
for i in {1..10}; do
echo -n "."
sleep 0.5
done
echo
@ -2177,7 +2240,7 @@ devbox_deinit_command() {
# Remove the use-local-component file
rm -f "$WORKING_HOME/.use-local-component"
log_info "==> DevBox deinitialization completed."
exit_with_message "DevBox deinitialization completed." 0
}
# :command.function
@ -2217,10 +2280,10 @@ devbox_start_command() {
fi
if [[ "$(lower "$USE_LOCAL_COMPONENT")" == "true" ]]; then
log_info "==> Using local components for Freeleaps services."
log_info "Using local components for Freeleaps services."
USE_LOCAL_COMPONENT="true"
else
log_info "==> Using online components for Freeleaps services."
log_info "Using online components for Freeleaps services."
USE_LOCAL_COMPONENT="false"
fi
@ -2237,7 +2300,7 @@ devbox_start_command() {
COMPONENTS=("mongodb" "rabbitmq" "devbox")
else
if [[ "$COMPONENT" == "devsvc" || "$COMPONENT" == "notification" || "$COMPONENT" == "content" || "$COMPONENT" == "central_storage" || "$COMPONENT" == "chat" || "$COMPONENT" == "authentication" ]]; then
exit_with_message "ERROR: Remote component $COMPONENT cannot be restarted, please use local components." 1
exit_with_message "Remote component $COMPONENT cannot be restarted, please use local components." 1
fi
COMPONENTS=("$COMPONENT")
@ -2248,7 +2311,7 @@ devbox_start_command() {
for comp in "${COMPONENTS[@]}"; do
case "$comp" in
"gitea" | "mongodb" | "rabbitmq" | "devbox" | "devsvc" | "notification" | "content" | "central_storage" | "chat" | "authentication")
log_info "==> Starting $comp service..."
log_info "Starting $comp service..."
# Check if the component container file exists
local component_container_id_file_path="${WORKING_HOME}/.${comp}-instance"
if [[ ! -f "$component_container_id_file_path" ]]; then
@ -2256,15 +2319,15 @@ devbox_start_command() {
else
local component_container_id=$(cat "$component_container_id_file_path")
if ! docker ps --no-trunc --format '{{.ID}}' | grep -q "^${component_container_id}\$"; then
log_info "==> $comp container is not running, starting container..."
log_info "$comp container is not running, starting container..."
# Start the container
if ! docker start "${component_container_id}"; then
log_error "Failed to start $comp container."
else
log_info "==> $comp container started successfully."
log_info "$comp container started successfully."
fi
else
log_info "==> $comp container is already running."
log_info "$comp container is already running."
fi
fi
;;
@ -2287,7 +2350,7 @@ devbox_start_command() {
done
if docker ps --no-trunc --format '{{.ID}}' | grep -q "^${devbox_container_id}\$"; then
log_info "==> Starting Freeleaps frontend and backend services..."
log_info "Starting Freeleaps frontend and backend services..."
# Check if start backend service
if [[ "${START_BACKEND}" == "true" ]]; then
compile_backend_service
@ -2302,7 +2365,7 @@ devbox_start_command() {
fi
fi
success_message="==> Freeleaps services started successfully. "
success_message=" Freeleaps services started successfully. "
frontend_port=$(cat "${WORKING_HOME}/.devbox-frontend-port")
if [[ "${START_FRONTEND}" == "true" && "${START_BACKEND}" == "true" ]]; then
@ -2352,7 +2415,7 @@ devbox_stop_command() {
if [[ -f "${WORKING_HOME}/.backend.pid" ]]; then
stop_backend_service
else
log_info "==> Backend service is not running."
log_info "Backend service is not running."
fi
fi
@ -2361,7 +2424,7 @@ devbox_stop_command() {
if [[ -f "${WORKING_HOME}/.frontend.pid" ]]; then
stop_frontend_service
else
log_info "==> Frontend service is not running."
log_info "Frontend service is not running."
fi
fi
fi
@ -2407,16 +2470,16 @@ devbox_stop_command() {
local container_id
container_id=$(cat "${WORKING_HOME}/.devbox-instance")
if docker ps --no-trunc --format '{{.ID}}' | grep -q "^${container_id}\$"; then
log_info "==> Stopping devbox..."
log_info "Stopping devbox..."
docker stop "$container_id" &>/dev/null || true
# Remove the frontend and backend pid files
rm -f "${WORKING_HOME}/.backend.pid"
rm -f "${WORKING_HOME}/.frontend.pid"
else
log_info "==> DevBox container is not running."
log_info "DevBox container is not running."
fi
else
log_info "==> Backend service is not running."
log_info "Backend service is not running."
fi
;;
@ -2425,13 +2488,13 @@ devbox_stop_command() {
local container_id
container_id=$(cat "${WORKING_HOME}/.${comp}-instance")
if docker ps --no-trunc --format '{{.ID}}' | grep -q "^${container_id}\$"; then
log_info "==> Stopping $comp service..."
log_info "Stopping $comp service..."
docker stop "$container_id" &>/dev/null || true
else
log_info "==> $comp service is not running."
log_info "$comp service is not running."
fi
else
log_info "==> $comp service is not running."
log_info "$comp service is not running."
fi
;;
*)
@ -2440,14 +2503,14 @@ devbox_stop_command() {
esac
done
exit_with_message "[INFO] Stopped Freeleaps services successfully. " 0
exit_with_message "Stopped Freeleaps services successfully. " 0
}
# :command.function
devbox_status_command() {
log_info "==> Checking DevBox services status..."
log_info "Checking DevBox services status..."
local COMPONENT="$(get_arg '--component')"
local WORKING_HOME="$(get_arg '--working-home' "${HOME}/devbox")"
@ -2474,7 +2537,7 @@ devbox_status_command() {
for comp in "${COMPONENTS[@]}"; do
case "$comp" in
"mongodb")
log_info "==> Checking MongoDB status..."
log_info "Checking MongoDB status..."
if [[ -f "${WORKING_HOME}/.mongodb-instance" ]]; then
local container_id
container_id=$(cat "${WORKING_HOME}/.mongodb-instance")
@ -2489,7 +2552,7 @@ devbox_status_command() {
;;
"rabbitmq")
log_info "==> Checking RabbitMQ status..."
log_info "Checking RabbitMQ status..."
if [[ -f "${WORKING_HOME}/.rabbitmq-instance" ]]; then
local container_id
container_id=$(cat "${WORKING_HOME}/.rabbitmq-instance")
@ -2504,7 +2567,7 @@ devbox_status_command() {
;;
"devbox")
log_info "==> Checking devbox service status..."
log_info "Checking devbox service status..."
if [[ -f "${WORKING_HOME}/.devbox-instance" ]]; then
local container_id
container_id=$(cat "${WORKING_HOME}/.devbox-instance")
@ -2519,7 +2582,7 @@ devbox_status_command() {
;;
"devsvc" | "notification" | "content" | "central_storage" | "chat" | "authentication")
log_info "==> Checking $comp service status..."
log_info "Checking $comp service status..."
if [[ -f "${WORKING_HOME}/.${comp}-instance" ]]; then
local container_id
container_id=$(cat "${WORKING_HOME}/.${comp}-instance")
@ -2538,12 +2601,12 @@ devbox_status_command() {
;;
esac
done
exit_with_message "==> DevBox services status checked successfully." 0
exit_with_message " DevBox services status checked successfully." 0
}
# :command.function
devbox_restart_command() {
log_info "==> Restarting DevBox services..."
log_info "Restarting DevBox services..."
local COMPONENT="$(get_arg '--component')"
local WORKING_HOME="$(get_arg '--working-home' "${HOME}/devbox")"
local FREELEAPS_ENDPOINT="$(get_arg '--freeleaps-endpoint')"
@ -2574,7 +2637,7 @@ devbox_restart_command() {
devbox_container_id=$(cat "${WORKING_HOME}/.devbox-instance")
log_info "docker ps --no-trunc --format ${devbox_container_id} "
if docker ps --no-trunc --format '{{.ID}}' | grep -q "${devbox_container_id}\$"; then
log_info "==> Starting Freeleaps frontend and backend services..."
log_info "Starting Freeleaps frontend and backend services..."
# Check if start backend service
if [[ "${START_BACKEND}" == "true" ]]; then
stop_backend_service
@ -2609,14 +2672,14 @@ devbox_restart_command() {
# Check if current environment is using local components
USE_LOCAL_COMPONENT=$(cat "${WORKING_HOME}/.use-local-component" 2>/dev/null || true)
if [[ "$USE_LOCAL_COMPONENT" == "true" ]]; then
log_info "==> Using local components..."
log_info "Using local components..."
if [[ -z "$COMPONENT" ]]; then
COMPONENTS=("gitea" "mongodb" "rabbitmq" "devbox" "devsvc" "notification" "content" "central_storage" "chat" "authentication")
else
COMPONENTS=("$COMPONENT")
fi
else
log_info "==> Using remote components..."
log_info "Using remote components..."
if [[ -z "$COMPONENT" ]]; then
COMPONENTS=("mongodb" "rabbitmq" "devbox")
else
@ -2635,14 +2698,14 @@ devbox_restart_command() {
if [[ -f "${WORKING_HOME}/.devbox-instance" ]]; then
local container_id
container_id=$(cat "${WORKING_HOME}/.devbox-instance")
log_info "==> Stopping devbox service..."
log_info "Stopping devbox service..."
docker stop "$container_id" &>/dev/null || true
# Remove the frontend and backend pid files
rm -f "${WORKING_HOME}/.backend.pid"
rm -f "${WORKING_HOME}/.frontend.pid"
else
log_info "==> Devbox is not running."
log_info "Devbox is not running."
fi
;;
@ -2651,10 +2714,10 @@ devbox_restart_command() {
if [[ -f "${WORKING_HOME}/.${comp}-instance" ]]; then
local container_id
container_id=$(cat "${WORKING_HOME}/.${comp}-instance")
log_info "==> Stopping $comp service..."
log_info "Stopping $comp service..."
docker stop "$container_id" &>/dev/null || true
else
log_info "==> $comp service is not running."
log_info "$comp service is not running."
fi
;;
*)
@ -2667,13 +2730,13 @@ devbox_restart_command() {
for comp in "${COMPONENTS[@]}"; do
case "$comp" in
"gitea" | "mongodb" | "rabbitmq" | "devbox" | "devsvc" | "notification" | "content" | "central_storage" | "chat" | "authentication")
log_info "==> Restarting $comp service..."
log_info "Restarting $comp service..."
if [[ -f "${WORKING_HOME}/.${comp}-instance" ]]; then
local container_id
container_id=$(cat "${WORKING_HOME}/.${comp}-instance")
docker start "$container_id" &>/dev/null || true
else
log_info "==> $comp service is not running."
log_info "$comp service is not running."
fi
;;
*)
@ -2682,7 +2745,7 @@ devbox_restart_command() {
esac
done
exit_with_message "==> DevBox services restarted successfully." 0
exit_with_message " DevBox services restarted successfully." 0
}
# :command.parse_requirements