| 
                        123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192 | 
                        - #!/usr/bin/env bash
 - 
 - set -e
 - 
 - # -----------------------------------------------------------------------------
 - # Usage and command-line argument parsing
 - # -----------------------------------------------------------------------------
 - function usage() {
 -     echo "Usage: $0 [--disable-webserver] [--disable-taskexecutor] [--consumer-no-beg=<num>] [--consumer-no-end=<num>] [--workers=<num>] [--host-id=<string>]"
 -     echo
 -     echo "  --disable-webserver             Disables the web server (nginx + ragflow_server)."
 -     echo "  --disable-taskexecutor          Disables task executor workers."
 -     echo "  --enable-mcpserver              Enables the MCP server."
 -     echo "  --consumer-no-beg=<num>         Start range for consumers (if using range-based)."
 -     echo "  --consumer-no-end=<num>         End range for consumers (if using range-based)."
 -     echo "  --workers=<num>                 Number of task executors to run (if range is not used)."
 -     echo "  --host-id=<string>              Unique ID for the host (defaults to \`hostname\`)."
 -     echo
 -     echo "Examples:"
 -     echo "  $0 --disable-taskexecutor"
 -     echo "  $0 --disable-webserver --consumer-no-beg=0 --consumer-no-end=5"
 -     echo "  $0 --disable-webserver --workers=2 --host-id=myhost123"
 -     echo "  $0 --enable-mcpserver"
 -     exit 1
 - }
 - 
 - ENABLE_WEBSERVER=1 # Default to enable web server
 - ENABLE_TASKEXECUTOR=1  # Default to enable task executor
 - ENABLE_MCP_SERVER=0
 - CONSUMER_NO_BEG=0
 - CONSUMER_NO_END=0
 - WORKERS=1
 - 
 - MCP_HOST="127.0.0.1"
 - MCP_PORT=9382
 - MCP_BASE_URL="http://127.0.0.1:9380"
 - MCP_SCRIPT_PATH="/ragflow/mcp/server/server.py"
 - MCP_MODE="self-host"
 - MCP_HOST_API_KEY=""
 - 
 - # -----------------------------------------------------------------------------
 - # Host ID logic:
 - #   1. By default, use the system hostname if length <= 32
 - #   2. Otherwise, use the full MD5 hash of the hostname (32 hex chars)
 - # -----------------------------------------------------------------------------
 - CURRENT_HOSTNAME="$(hostname)"
 - if [ ${#CURRENT_HOSTNAME} -le 32 ]; then
 -   DEFAULT_HOST_ID="$CURRENT_HOSTNAME"
 - else
 -   DEFAULT_HOST_ID="$(echo -n "$CURRENT_HOSTNAME" | md5sum | cut -d ' ' -f 1)"
 - fi
 - 
 - HOST_ID="$DEFAULT_HOST_ID"
 - 
 - # Parse arguments
 - for arg in "$@"; do
 -   case $arg in
 -     --disable-webserver)
 -       ENABLE_WEBSERVER=0
 -       shift
 -       ;;
 -     --disable-taskexecutor)
 -       ENABLE_TASKEXECUTOR=0
 -       shift
 -       ;;
 -     --enable-mcpserver)
 -       ENABLE_MCP_SERVER=1
 -       shift
 -       ;;
 -     --mcp-host=*)
 -       MCP_HOST="${arg#*=}"
 -       shift
 -       ;;
 -     --mcp-port=*)
 -       MCP_PORT="${arg#*=}"
 -       shift
 -       ;;
 -     --mcp-base-url=*)
 -       MCP_BASE_URL="${arg#*=}"
 -       shift
 -       ;;
 -     --mcp-mode=*)
 -       MCP_MODE="${arg#*=}"
 -       shift
 -       ;;
 -     --mcp-host-api-key=*)
 -       MCP_HOST_API_KEY="${arg#*=}"
 -       shift
 -       ;;
 -     --mcp-script-path=*)
 -       MCP_SCRIPT_PATH="${arg#*=}"
 -       shift
 -       ;;
 -     --consumer-no-beg=*)
 -       CONSUMER_NO_BEG="${arg#*=}"
 -       shift
 -       ;;
 -     --consumer-no-end=*)
 -       CONSUMER_NO_END="${arg#*=}"
 -       shift
 -       ;;
 -     --workers=*)
 -       WORKERS="${arg#*=}"
 -       shift
 -       ;;
 -     --host-id=*)
 -       HOST_ID="${arg#*=}"
 -       shift
 -       ;;
 -     *)
 -       usage
 -       ;;
 -   esac
 - done
 - 
 - # -----------------------------------------------------------------------------
 - # Replace env variables in the service_conf.yaml file
 - # -----------------------------------------------------------------------------
 - CONF_DIR="/ragflow/conf"
 - TEMPLATE_FILE="${CONF_DIR}/service_conf.yaml.template"
 - CONF_FILE="${CONF_DIR}/service_conf.yaml"
 - 
 - rm -f "${CONF_FILE}"
 - while IFS= read -r line || [[ -n "$line" ]]; do
 -     eval "echo \"$line\"" >> "${CONF_FILE}"
 - done < "${TEMPLATE_FILE}"
 - 
 - export LD_LIBRARY_PATH="/usr/lib/x86_64-linux-gnu/"
 - PY=python3
 - 
 - # -----------------------------------------------------------------------------
 - # Function(s)
 - # -----------------------------------------------------------------------------
 - 
 - function task_exe() {
 -     local consumer_id="$1"
 -     local host_id="$2"
 - 
 -     JEMALLOC_PATH="$(pkg-config --variable=libdir jemalloc)/libjemalloc.so"
 -     while true; do
 -         LD_PRELOAD="$JEMALLOC_PATH" \
 -         "$PY" rag/svr/task_executor.py "${host_id}_${consumer_id}"
 -     done
 - }
 - 
 - function start_mcp_server() {
 -     echo "Starting MCP Server on ${MCP_HOST}:${MCP_PORT} with base URL ${MCP_BASE_URL}..."
 -     "$PY" "${MCP_SCRIPT_PATH}" \
 -         --host="${MCP_HOST}" \
 -         --port="${MCP_PORT}" \
 -         --base-url="${MCP_BASE_URL}" \
 -         --mode="${MCP_MODE}" \
 -         --api-key="${MCP_HOST_API_KEY}" &
 - }
 - 
 - # -----------------------------------------------------------------------------
 - # Start components based on flags
 - # -----------------------------------------------------------------------------
 - 
 - if [[ "${ENABLE_WEBSERVER}" -eq 1 ]]; then
 -     echo "Starting nginx..."
 -     /usr/sbin/nginx
 - 
 -     echo "Starting ragflow_server..."
 -     while true; do
 -         "$PY" api/ragflow_server.py
 -     done &
 - fi
 - 
 - 
 - if [[ "${ENABLE_MCP_SERVER}" -eq 1 ]]; then
 -     start_mcp_server
 - fi
 - 
 - if [[ "${ENABLE_TASKEXECUTOR}" -eq 1 ]]; then
 -     if [[ "${CONSUMER_NO_END}" -gt "${CONSUMER_NO_BEG}" ]]; then
 -         echo "Starting task executors on host '${HOST_ID}' for IDs in [${CONSUMER_NO_BEG}, ${CONSUMER_NO_END})..."
 -         for (( i=CONSUMER_NO_BEG; i<CONSUMER_NO_END; i++ ))
 -         do
 -           task_exe "${i}" "${HOST_ID}" &
 -         done
 -     else
 -         # Otherwise, start a fixed number of workers
 -         echo "Starting ${WORKERS} task executor(s) on host '${HOST_ID}'..."
 -         for (( i=0; i<WORKERS; i++ ))
 -         do
 -           task_exe "${i}" "${HOST_ID}" &
 -         done
 -     fi
 - fi
 - 
 - wait
 
 
  |