From 62b94efec23df748b986d19245fd99d576c649c7 Mon Sep 17 00:00:00 2001 From: Rohit T P Date: Sat, 27 Apr 2024 18:14:06 +0000 Subject: [PATCH] chore: auto-detect existing path --- docker-compose/setup-script/noco.sh | 416 ++++++++++++++-------------- 1 file changed, 208 insertions(+), 208 deletions(-) diff --git a/docker-compose/setup-script/noco.sh b/docker-compose/setup-script/noco.sh index a241d8d1d5..9cbf69ebfe 100755 --- a/docker-compose/setup-script/noco.sh +++ b/docker-compose/setup-script/noco.sh @@ -14,7 +14,7 @@ ORANGE='\033[0;33m' BOLD='\033[1m' NC='\033[0m' -NOCO_HOME="${HOME}/.nocodb/" +NOCO_HOME="${HOME}/.nocodb" # ***************** GLOBAL VARIABLES END *********************************** # ****************************************************************************** @@ -132,6 +132,184 @@ check_if_docker_is_running() { # ***************** HELPER FUNCTIONS END *********************************** # ****************************************************************************** +# ***************************************************************************** +# *************************** Management ************************************* + +# Function to display the menu +show_menu() { + clear + check_if_docker_is_running + echo "" + echo $MSG + echo -e "\t\t${BOLD}Service Management Menu${NC}" + echo -e " ${GREEN}1. Start Service" + echo -e " ${ORANGE}2. Stop Service" + echo -e " ${CYAN}3. Logs" + echo -e " ${MAGENTA}4. Restart" + echo -e " ${BLUE}5. Upgrade" + echo -e " 6. Scale" + echo -e " 7. Monitoring" + echo -e " ${RED}0. Exit${NC}" +} + +# Function to start the service +start_service() { + echo -e "\nStarting nocodb..." + $DOCKER_COMMAND compose up -d +} + +# Function to stop the service +stop_service() { + echo -e "\nStopping nocodb..." + $DOCKER_COMMAND compose stop +} + +show_logs_sub_menu() { + clear + echo "Select a replica for $1:" + for i in $(seq 1 $2); do + echo "$i. $1 replica $i" + done + echo "A. All" + echo "0. Back to Logs Menu" + echo "Enter replica number: " + read replica_choice + + if [[ "$replica_choice" =~ ^[0-9]+$ ]] && [ "$replica_choice" -gt 0 ] && [ "$replica_choice" -le "$2" ]; then + container_id=$($DOCKER_COMMAND compose ps | grep "$1-$replica_choice" | cut -d " " -f 1) + $DOCKER_COMMAND logs -f "$container_id" + elif [ "$replica_choice" == "A" ] || [ "$replica_choice" == "a" ]; then + $DOCKER_COMMAND compose logs -f $1 + elif [ "$replica_choice" == "0" ]; then + show_logs + else + show_logs_sub_menu "$1" "$2" + fi +} + + +# Function to show logs +show_logs() { + clear + echo "Select a container for logs:" + + # Fetch the list of services + services=() + while IFS= read -r service; do + services+=("$service") + done < <($DOCKER_COMMAND compose ps --services) + + service_replicas=() + count=0 + + # For each service, count the number of running instances + for service in "${services[@]}"; do + # Count the number of lines that have the service name, which corresponds to the number of replicas + replicas=$($DOCKER_COMMAND compose ps $service | grep "$service" | wc -l) + service_replicas["$count"]=$replicas + count=$((count + 1)) + done + + count=1 + + for service in "${services[@]}"; do + echo "$count. $service (${service_replicas[(($count - 1))]} replicas)" + count=$((count + 1)) + done + + echo "A. All" + echo "0. Back to main menu" + echo "Enter your choice: " + read log_choice + echo + + if [[ "$log_choice" =~ ^[0-9]+$ ]] && [ "$log_choice" -gt 0 ] && [ "$log_choice" -lt "$count" ]; then + service_index=$((log_choice-1)) + service="${services[$service_index]}" + num_replicas="${service_replicas[$service_index]}" + + if [ "$num_replicas" -gt 1 ]; then + trap 'show_logs_sub_menu "$service" "$num_replicas"' INT + show_logs_sub_menu "$service" "$num_replicas" + trap - INT + else + trap 'show_logs' INT + $DOCKER_COMMAND compose logs -f "$service" + fi + elif [ "$log_choice" == "A" ] || [ "$log_choice" == "a" ]; then + trap 'show_logs' INT + $DOCKER_COMMAND compose logs -f + elif [ "$log_choice" == "0" ]; then + return + else + show_logs + fi + + trap - INT +} + +# Function to restart the service +restart_service() { + echo -e "\nRestarting nocodb..." + $DOCKER_COMMAND compose restart +} + +# Function to upgrade the service +upgrade_service() { + echo -e "\nUpgrading nocodb..." + $DOCKER_COMMAND compose pull + $DOCKER_COMMAND compose up -d --force-recreate + $DOCKER_COMMAND image prune -a -f +} + +# Function to scale the service +scale_service() { + num_cores=$(nproc || sysctl -n hw.ncpu || echo 1) + current_scale=$($DOCKER_COMMAND compose ps -q nocodb | wc -l) + echo -e "\nCurrent number of instances: $current_scale" + echo "How many instances of NocoDB do you want to run (Maximum: ${num_cores}) ? (default: 1): " + scale_num=$(read_number_range 1 $num_cores) + + if [ $scale_num -eq $current_scale ]; then + echo "Number of instances is already set to $scale_num. Returning to main menu." + return + fi + + $DOCKER_COMMAND compose up -d --scale nocodb=$scale_num +} + +# Function for basic monitoring +monitoring_service() { + echo -e '\nLoading stats...' + trap ' ' INT + $DOCKER_COMMAND stats +} + +management_menu() { + # Main program loop + while true; do + trap - INT + show_menu + echo "Enter your choice: " + + read choice + case $choice in + 1) start_service && MSG="NocoDB Started" ;; + 2) stop_service && MSG="NocoDB Stopped" ;; + 3) show_logs ;; + 4) restart_service && MSG="NocoDB Restarted" ;; + 5) upgrade_service && MSG="NocoDB has been upgraded to latest version" ;; + 6) scale_service && MSG="NocoDB has been scaled" ;; + 7) monitoring_service ;; + 0) exit 0 ;; + *) MSG="\nInvalid choice. Please select a correct option." ;; + esac + done +} + +# ****************************************************************************** +# *************************** Management END ********************************** + # ****************************************************************************** # ***************** Existing Install Test ************************************ @@ -141,24 +319,23 @@ DOCKER_COMMAND=$([ "$IS_DOCKER_REQUIRE_SUDO" = "y" ] && echo "sudo docker" || ec NOCO_FOUND=false -# Check if $NOCO_HOME exists as directory or symbolic link -if [ -d "$NOCO_HOME" ] || [ -L "$NOCO_HOME" ]; then +# Check if $NOCO_HOME exists as directory +if [ -d "$NOCO_HOME" ]; then NOCO_FOUND=true -elif $DOCKER_COMMAND ps -a --format '{{.Names}}' | grep -q nocodb; then - echo "Found NocoDB running, but was unable to auto locate the installation directory." - echo "Please provide the path to the NocoDB installation directory: " - read -r CUSATOM_NOCO_HOME +elif $DOCKER_COMMAND ps --format '{{.Names}}' | grep -q "nocodb"; then + NOCO_ID=$(docker ps | grep "nocodb/nocodb" | cut -d ' ' -f 1) + CUSTOM_HOME=$(docker inspect --format='{{index .Mounts 0}}' "$NOCO_ID" | cut -d ' ' -f 3) + PARENT_DIR=$(dirname "$CUSTOM_HOME") - if [ -d "$CUSATOM_NOCO_HOME" ]; then - echo "NocoDB installation directory is required." - exit 1 - fi + ln -s "$PARENT_DIR" "$NOCO_HOME" + basename "$PARENT_DIR" > "$NOCO_HOME/.COMPOSE_PROJECT_NAME" - ln -s "$CUSATOM_NOCO_HOME" "$NOCO_HOME" NOCO_FOUND=true +else + mkdir -p "$NOCO_HOME" fi -cd "$NOCO_HOME" || exit +cd "$NOCO_HOME" || exit 1 # Check if nocodb is already installed if [ "$NOCO_FOUND" = true ]; then @@ -166,12 +343,23 @@ if [ "$NOCO_FOUND" = true ]; then echo "Do you want to reinstall NocoDB? [Y/N] (default: N): " read -r REINSTALL + if [ -f "$NOCO_HOME/.COMPOSE_PROJECT_NAME" ]; then + export COMPOSE_PROJECT_NAME=$(cat "$NOCO_HOME/.COMPOSE_PROJECT_NAME") + fi + if [ "$REINSTALL" != "Y" ] && [ "$REINSTALL" != "y" ]; then - management_menu() + management_menu exit 0 else echo "Reinstalling NocoDB..." $DOCKER_COMMAND compose down + + unset COMPOSE_PROJECT_NAME + cd /tmp + rm -rf "$NOCO_HOME" + + mkdir -p "$NOCO_HOME" + cd "$NOCO_HOME" || exit 1 fi fi @@ -206,11 +394,6 @@ for tool in docker lsof openssl; do fi done -# e. Check if NocoDB is already installed and its expected version -# echo "Checking if NocoDB is already installed and its expected version..." -# Replace the following command with the actual command to check NocoDB installation and version -# Example: nocodb_version=$(command_to_get_nocodb_version) -# echo "NocoDB version: $nocodb_install_version" # f. Port mapping check echo " | Checking port accessibility..." @@ -236,19 +419,7 @@ if [ -z "$PUBLIC_IP" ]; then PUBLIC_IP="localhost" fi -# generate a folder for the docker-compose file which is not existing and do the setup within the folder -# Define the folder name -FOLDER_NAME="nocodb_$(date +"%Y%m%d_%H%M%S")" - -# prompt for custom folder name and if left empty skip -#echo "Enter a custom folder name or press Enter to use the default folder name ($FOLDER_NAME): " -#read CUSTOM_FOLDER_NAME - -message_arr+=("Setup folder: $FOLDER_NAME") - -if [ -n "$CUSTOM_FOLDER_NAME" ]; then - FOLDER_NAME="$CUSTOM_FOLDER_NAME" -fi +message_arr+=("Setup folder: $NOCO_HOME") # ******************** SYSTEM REQUIREMENTS CHECK END ************************** # ****************************************************************************** @@ -642,180 +813,9 @@ print_box_message "${message_arr[@]}" # *************************** SETUP END ************************************* # **************************************************************************** -# ***************************************************************************** -# *************************** Management ************************************* - -# Function to display the menu -show_menu() { - clear - check_if_docker_is_running - echo "" - echo $MSG - echo -e "\t\t${BOLD}Service Management Menu${NC}" - echo -e " ${GREEN}1. Start Service" - echo -e " ${ORANGE}2. Stop Service" - echo -e " ${CYAN}3. Logs" - echo -e " ${MAGENTA}4. Restart" - echo -e " ${BLUE}5. Upgrade" - echo -e " 6. Scale" - echo -e " 7. Monitoring" - echo -e " ${RED}0. Exit${NC}" -} - -# Function to start the service -start_service() { - echo -e "\nStarting nocodb..." - $DOCKER_COMMAND compose up -d -} +echo "Do you want to start the management menu [Y/N] (default: Y): " +read -r MANAGEMENT_MENU -# Function to stop the service -stop_service() { - echo -e "\nStopping nocodb..." - $DOCKER_COMMAND compose stop -} - -show_logs_sub_menu() { - clear - echo "Select a replica for $1:" - for i in $(seq 1 $2); do - echo "$i. $1 replica $i" - done - echo "A. All" - echo "0. Back to Logs Menu" - echo "Enter replica number: " - read replica_choice - - if [[ "$replica_choice" =~ ^[0-9]+$ ]] && [ "$replica_choice" -gt 0 ] && [ "$replica_choice" -le "$2" ]; then - container_id=$($DOCKER_COMMAND compose ps | grep "$1-$replica_choice" | cut -d " " -f 1) - $DOCKER_COMMAND logs -f "$container_id" - elif [ "$replica_choice" == "A" ] || [ "$replica_choice" == "a" ]; then - $DOCKER_COMMAND compose logs -f $1 - elif [ "$replica_choice" == "0" ]; then - show_logs - else - show_logs_sub_menu "$1" "$2" - fi -} - - -# Function to show logs -show_logs() { - clear - echo "Select a container for logs:" - - # Fetch the list of services - services=() - while IFS= read -r service; do - services+=("$service") - done < <($DOCKER_COMMAND compose ps --services) - - service_replicas=() - count=0 - - # For each service, count the number of running instances - for service in "${services[@]}"; do - # Count the number of lines that have the service name, which corresponds to the number of replicas - replicas=$($DOCKER_COMMAND compose ps $service | grep "$service" | wc -l) - service_replicas["$count"]=$replicas - count=$((count + 1)) - done - - count=1 - - for service in "${services[@]}"; do - echo "$count. $service (${service_replicas[(($count - 1))]} replicas)" - count=$((count + 1)) - done - - echo "A. All" - echo "0. Back to main menu" - echo "Enter your choice: " - read log_choice - echo - - if [[ "$log_choice" =~ ^[0-9]+$ ]] && [ "$log_choice" -gt 0 ] && [ "$log_choice" -lt "$count" ]; then - service_index=$((log_choice-1)) - service="${services[$service_index]}" - num_replicas="${service_replicas[$service_index]}" - - if [ "$num_replicas" -gt 1 ]; then - trap 'show_logs_sub_menu "$service" "$num_replicas"' INT - show_logs_sub_menu "$service" "$num_replicas" - trap - INT - else - trap 'show_logs' INT - $DOCKER_COMMAND compose logs -f "$service" - fi - elif [ "$log_choice" == "A" ] || [ "$log_choice" == "a" ]; then - trap 'show_logs' INT - $DOCKER_COMMAND compose logs -f - elif [ "$log_choice" == "0" ]; then - return - else - show_logs - fi - - trap - INT -} - -# Function to restart the service -restart_service() { - echo -e "\nRestarting nocodb..." - $DOCKER_COMMAND compose restart -} - -# Function to upgrade the service -upgrade_service() { - echo -e "\nUpgrading nocodb..." - $DOCKER_COMMAND compose pull - $DOCKER_COMMAND compose up -d --force-recreate - $DOCKER_COMMAND image prune -a -f -} - -# Function to scale the service -scale_service() { - num_cores=$(nproc || sysctl -n hw.ncpu || echo 1) - current_scale=$($DOCKER_COMMAND compose ps -q nocodb | wc -l) - echo -e "\nCurrent number of instances: $current_scale" - echo "How many instances of NocoDB do you want to run (Maximum: ${num_cores}) ? (default: 1): " - scale_num=$(read_number_range 1 $num_cores) - - if [ $scale_num -eq $current_scale ]; then - echo "Number of instances is already set to $scale_num. Returning to main menu." - return - fi - - $DOCKER_COMMAND compose up -d --scale nocodb=$scale_num -} - -# Function for basic monitoring -monitoring_service() { - echo -e '\nLoading stats...' - trap ' ' INT - $DOCKER_COMMAND stats -} - -management_menu() { - # Main program loop - while true; do - trap - INT - show_menu - echo "Enter your choice: " - - read choice - case $choice in - 1) start_service && MSG="NocoDB Started" ;; - 2) stop_service && MSG="NocoDB Stopped" ;; - 3) show_logs ;; - 4) restart_service && MSG="NocoDB Restarted" ;; - 5) upgrade_service && MSG="NocoDB has been upgraded to latest version" ;; - 6) scale_service && MSG="NocoDB has been scaled" ;; - 7) monitoring_service ;; - 0) exit 0 ;; - *) MSG="\nInvalid choice. Please select a correct option." ;; - esac - done -} - -# ****************************************************************************** -# *************************** Management END ********************************** \ No newline at end of file +if [ -z "$MANAGEMENT_MENU" ] || { [ "$MANAGEMENT_MENU" != "N" ] && [ "$MANAGEMENT_MENU" != "n" ]; }; then + management_menu +fi \ No newline at end of file