xlyu0523 commited on
Commit
4e9b719
ยท
verified ยท
1 Parent(s): f21a27b

Update start.sh

Browse files
Files changed (1) hide show
  1. start.sh +47 -86
start.sh CHANGED
@@ -2,79 +2,41 @@
2
  set -euo pipefail
3
 
4
  # โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
5
- # ๐Ÿ”ฅ ้˜ถๆฎตไธ€๏ผš็‰นๆƒๅˆๅง‹ๅŒ–ไธŽๅญ˜ๅ‚จๆกถๅผบๅŠ›ๆธ…ๆด—ใ€ๅ…จ้‡ๆƒ้™ๅผบๅˆท๏ผˆRoot ็ฉบ้—ด่กŒไธบ๏ผ‰
6
  # โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
7
- if [ "$(id -u)" -eq 0 ]; then
8
- echo "[Storage-Sanitizer] Executing root initialization and aggressive privilege correction..."
9
-
10
- TARGET_HOME="${HERMES_HOME:-/opt/data}"
11
-
12
- # 1. ๅผบ่กŒ้ข„ๅ…ˆๅปบ็ซ‹ๅฅฝๅŽŸๆœฌๅฑžไบŽ hermes ็”จๆˆท็š„ๅฎŒๆ•ดๅญ˜ๅ‚จๅฑ‚็บงๆ‹“ๆ‰‘
13
- mkdir -p "$TARGET_HOME"/{cron,sessions,logs,hooks,memories,skills,skins,plans,workspace,home,plugins}
14
- mkdir -p "$TARGET_HOME/.local/bin"
15
-
16
- # 2. ๅฝปๅบ•ๆธ…้™คไธŠไธ€ๆฌก่ฟ่กŒๆˆ–้—ช้€€ๅœจๅญ˜ๅ‚จๆกถ้‡Œ็•™ไธ‹็š„ๆ‰€ๆœ‰ๅนฝ็ต้”ไธŽๅƒตๅฐธ PID ๆ–‡ไปถ๏ผˆๆถˆ็ญ็œ‹ๆฟๅˆๅง‹ๅŒ–ๆƒ้™ๆญป้”๏ผ‰
17
- echo "[Storage-Sanitizer] Scrubbing lingering initialization locks and process pids..."
18
- find "$TARGET_HOME" -name "*.lock" -delete 2>/dev/null || true
19
- find "$TARGET_HOME" -name "*.pid" -delete 2>/dev/null || true
20
- rm -f "$TARGET_HOME/kanban.db.init.lock" 2>/dev/null || true
21
-
22
- # 3. ้™ๆƒๅ‰๏ผŒๆ— ๆกไปถๆŠŠๆ•ดไธชๆŒ‚่ฝฝ็›ฎๅฝ•ๆ ‘็š„ๅฑžไธปๅ…จ้ƒจๅผบๅˆทไธบ hermes ็”จๆˆท
23
- echo "[Storage-Sanitizer] Recurse-chown on $TARGET_HOME to user 'hermes'..."
24
- chown -R hermes:hermes "$TARGET_HOME" 2>/dev/null || true
25
- chown -R hermes:hermes /opt/huggingmes 2>/dev/null || true
26
-
27
- echo "[Storage-Sanitizer] Dropping privileges safely to user 'hermes'."
28
- # ๆบๅธฆๆ•ดๅฅ—ไธšๅŠกๅบ•ๅบงๆ‰€้œ€็š„ๅ…จ้ƒจ็Žฏๅขƒๅ˜้‡๏ผŒๆ— ็ผๅฐ†ไธป่ฟ›็จ‹ๆŽงๅˆถๆƒไบคๅ›ž็”จๆˆท็ฉบ้—ด
29
- exec runuser -u hermes -- env \
30
- PATH="/opt/hermes/.venv/bin:/opt/data/.local/bin:$PATH" \
31
- HOME="$HOME" \
32
- HERMES_HOME="$TARGET_HOME" \
33
- DEV_MODE="${DEV_MODE:-true}" \
34
- GATEWAY_TOKEN="${GATEWAY_TOKEN:-}" \
35
- API_SERVER_KEY="${API_SERVER_KEY:-}" \
36
- API_SERVER_ENABLED="${API_SERVER_ENABLED:-true}" \
37
- API_SERVER_HOST="${API_SERVER_HOST:-127.0.0.1}" \
38
- API_SERVER_PORT="${API_SERVER_PORT:-8642}" \
39
- GATEWAY_HEALTH_URL="${GATEWAY_HEALTH_URL:-http://127.0.0.1:8642}" \
40
- TELEGRAM_WEBHOOK_PORT="${TELEGRAM_WEBHOOK_PORT:-8765}" \
41
- PORT="${PORT:-7861}" \
42
- HERMES_MODEL="${HERMES_MODEL:-}" \
43
- LLM_MODEL="${LLM_MODEL:-}" \
44
- HERMES_INFERENCE_PROVIDER="${HERMES_INFERENCE_PROVIDER:-auto}" \
45
- LLM_API_KEY="${LLM_API_KEY:-}" \
46
- CUSTOM_BASE_URL="${CUSTOM_BASE_URL:-}" \
47
- CUSTOM_PROVIDER="${CUSTOM_PROVIDER:-}" \
48
- CUSTOM_API_KEY="${CUSTOM_API_KEY:-}" \
49
- CLOUDFLARE_WORKERS_TOKEN="${CLOUDFLARE_WORKERS_TOKEN:-}" \
50
- CLOUDFLARE_PROXY_URL="${CLOUDFLARE_PROXY_URL:-}" \
51
- TELEGRAM_BOT_TOKEN="${TELEGRAM_BOT_TOKEN:-}" \
52
- SPACE_HOST="${SPACE_HOST:-}" \
53
- TELEGRAM_MODE="${TELEGRAM_MODE:-}" \
54
- TELEGRAM_ALLOWED_USERS="${TELEGRAM_ALLOWED_USERS:-}" \
55
- TELEGRAM_USER_IDS="${TELEGRAM_USER_IDS:-}" \
56
- HUGGINGMES_APT_PACKAGES="${HUGGINGMES_APT_PACKAGES:-}" \
57
- HUGGINGMES_PIP_PACKAGES="${HUGGINGMES_PIP_PACKAGES:-}" \
58
- HUGGINGMES_NPM_PACKAGES="${HUGGINGMES_NPM_PACKAGES:-}" \
59
- HUGGINGMES_RUN="${HUGGINGMES_RUN:-}" \
60
- /bin/bash "$0" "$@"
61
- fi
62
 
63
  # โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
64
  # ๐Ÿ›ก๏ธ ้˜ถๆฎตไบŒ๏ผšๅฎ‰ๅ…จ้™ๆƒๆฒ™็ฎฑ่ฟ่กŒ๏ผˆHermes ็ฉบ้—ด่กŒไธบ๏ผ‰
65
  # โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€๏ฟฝ๏ฟฝโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
66
- umask 0077
67
 
68
  APP_DIR="${HUGGINGMES_APP_DIR:-/opt/huggingmes}"
69
- HERMES_HOME="${HERMES_HOME:-/opt/data}"
70
  PUBLIC_PORT="${PORT:-7861}"
71
  GATEWAY_API_PORT="${API_SERVER_PORT:-8642}"
72
  DASHBOARD_PORT="${DASHBOARD_PORT:-9119}"
73
  TELEGRAM_WEBHOOK_PORT="${TELEGRAM_WEBHOOK_PORT:-8765}"
74
  CF_PROXY_ENV_FILE="/tmp/huggingmes-cloudflare-proxy.env"
75
- STARTUP_FILE="$HERMES_HOME/workspace/startup.sh"
76
 
77
- export HERMES_HOME
78
  export API_SERVER_ENABLED="${API_SERVER_ENABLED:-true}"
79
  export API_SERVER_HOST="${API_SERVER_HOST:-127.0.0.1}"
80
  export API_SERVER_PORT="$GATEWAY_API_PORT"
@@ -104,19 +66,15 @@ fi
104
  # ๅผบ่กŒๅฏน้ฝๅ…จๅฑ€ๅ˜้‡ๆ–ญ่จ€๏ผŒ็กฎไฟๅฎ˜ๆ–นๅ‰็ซฏ Terminal ๆกๆ‰‹ๆˆๅŠŸไธๆŠฅ้”™
105
  export GATEWAY_TOKEN="$API_SERVER_KEY"
106
 
107
- # ็ณป็ปŸๆœฌๅœฐ่ฟ่กŒไพ่ต–ๆ ‘ๆ‹“ๆ‰‘็”Ÿๆˆ
108
- mkdir -p "$HERMES_HOME"/{cron,sessions,logs,hooks,memories,skills,skins,plans,workspace,home,plugins}
109
- mkdir -p "$HERMES_HOME/.local/bin"
110
-
111
- if [ ! -L "$HERMES_HOME/.local/bin/hermes" ]; then
112
- rm -f "$HERMES_HOME/.local/bin/hermes"
113
- ln -sfn /opt/hermes/.venv/bin/hermes "$HERMES_HOME/.local/bin/hermes"
114
  fi
115
 
116
  if [ ! -L "${HOME}/.hermes/plugins" ]; then
117
- mkdir -p "${HOME}/.hermes"
118
- rm -rf "${HOME}/.hermes/plugins"
119
- ln -sfn "$HERMES_HOME/plugins" "${HOME}/.hermes/plugins"
120
  fi
121
 
122
  # Cloudflare ็ฝ‘็ปœๅฑ‚ไปฃ็†ๅๅ‘ๆž„ๅปบ
@@ -150,7 +108,7 @@ if [ -n "${TELEGRAM_BOT_TOKEN:-}" ] && [ -n "${SPACE_HOST:-}" ] && [ -z "${TELEG
150
  fi
151
 
152
  if [ -n "${TELEGRAM_WEBHOOK_URL:-}" ] && [ -z "${TELEGRAM_WEBHOOK_SECRET:-}" ]; then
153
- SECRET_FILE="$HERMES_HOME/.huggingmes-telegram-webhook-secret"
154
  if [ -f "$SECRET_FILE" ]; then
155
  TELEGRAM_WEBHOOK_SECRET="$(cat "$SECRET_FILE")"
156
  export TELEGRAM_WEBHOOK_SECRET
@@ -160,13 +118,13 @@ import secrets
160
  print(secrets.token_hex(32))
161
  PY
162
  )"
163
- printf '%s' "$TELEGRAM_WEBHOOK_SECRET" > "$SECRET_FILE"
164
- chmod 600 "$SECRET_FILE"
165
  export TELEGRAM_WEBHOOK_SECRET
166
  fi
167
  fi
168
 
169
- # ๅคงๆจกๅž‹ๅคšๅ‰็ผ€ๆๅ–ไธŽ่ฝฌๆข็Ÿฉ้˜ต็Ÿฉ้˜ต
170
  MODEL_INPUT="${HERMES_MODEL:-${LLM_MODEL:-}}"
171
  MODEL_FOR_CONFIG="$MODEL_INPUT"
172
  PROVIDER_FOR_CONFIG="${HERMES_INFERENCE_PROVIDER:-auto}"
@@ -317,7 +275,10 @@ if os.environ.get("TELEGRAM_BOT_TOKEN"):
317
  ])
318
 
319
  path.write_text(yaml.safe_dump(config, sort_keys=False), encoding="utf-8")
320
- path.chmod(0o664)
 
 
 
321
  PY
322
 
323
  HERMES_RUNTIME_VERSION="$(/opt/hermes/.venv/bin/hermes --version 2>/dev/null | awk '{print $NF; exit}' || true)"
@@ -343,10 +304,10 @@ start_jupyter() {
343
 
344
  export JUPYTER_TOKEN="$GATEWAY_TOKEN"
345
  local VENV_PYTHON="/opt/hermes/.venv/bin/python"
346
- local root_dir="${JUPYTER_ROOT_DIR:-$HERMES_HOME/workspace}"
347
- mkdir -p "$root_dir"
348
 
349
- ln -sfn "$HERMES_HOME" "$root_dir/HuggingMes" 2>/dev/null || true
350
 
351
  echo "Starting JupyterLab terminal on port 8888 (root: $root_dir)"
352
  "$VENV_PYTHON" -m jupyterlab \
@@ -367,7 +328,7 @@ start_jupyter() {
367
  --LabApp.check_for_updates_class=jupyterlab.NeverCheckForUpdate \
368
  --ServerApp.log_level=WARN \
369
  --ServerApp.root_dir="$root_dir" \
370
- >> "$HERMES_HOME/logs/jupyter.log" 2>&1 &
371
  JUPYTER_PID=$!
372
  export JUPYTER_PID
373
  echo "JupyterLab started (PID: $JUPYTER_PID)"
@@ -382,7 +343,7 @@ trap graceful_shutdown SIGTERM SIGINT
382
 
383
  # Terminal ๅ‘ฝไปคๆ•่ŽทไธŽๆŒไน…ๅŒ–ๅŒๆญฅๅ™จ (.bashrc ๅ…จ้‡ๆณจๅ…ฅ)
384
  if [ ! -f "$STARTUP_FILE" ]; then
385
- touch "$STARTUP_FILE" && chmod +x "$STARTUP_FILE"
386
  fi
387
  cat > "$HOME/.bashrc" << 'BASHRC'
388
  export PATH="/opt/hermes/.venv/bin:/opt/data/.local/bin:$PATH"
@@ -393,9 +354,9 @@ STARTUP_FILE="$HERMES_HOME/workspace/startup.sh"
393
  _hm_append() {
394
  [ "${HUGGINGMES_CAPTURE_DISABLE:-0}" = "1" ] && return 0
395
  local line="$*"
396
- mkdir -p "$(dirname "$STARTUP_FILE")"
397
- touch "$STARTUP_FILE" && chmod +x "$STARTUP_FILE" 2>/dev/null || true
398
- grep -qxF "$line" "$STARTUP_FILE" 2>/dev/null || echo "$line" >> "$STARTUP_FILE"
399
  }
400
  _hm_quote_args() {
401
  local quoted=() arg
@@ -515,7 +476,7 @@ HEALTH_PID=$!
515
  start_dashboard_once() {
516
  if [ -n "${DASHBOARD_PID:-}" ] && kill -0 "$DASHBOARD_PID" 2>/dev/null; then return 0; fi
517
  echo "Launching Hermes dashboard..."
518
- (hermes dashboard --host 127.0.0.1 --insecure 2>&1 | tee -a "$HERMES_HOME/logs/dashboard.log") &
519
  DASHBOARD_PID=$!
520
  }
521
 
@@ -540,7 +501,7 @@ while true; do
540
  fi
541
 
542
  echo "Launching Hermes gateway..."
543
- (hermes gateway run 2>&1 | tee -a "$HERMES_HOME/logs/gateway.log") &
544
  GATEWAY_PID=$!
545
 
546
  ready=false
@@ -555,7 +516,7 @@ while true; do
555
 
556
  if [ "$ready" != "true" ]; then
557
  echo "Hermes gateway failed to expose ports. Logs tail:"
558
- tail -40 "$HERMES_HOME/logs/gateway.log" || true
559
  exit 1
560
  fi
561
 
 
2
  set -euo pipefail
3
 
4
  # โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
5
+ # ๐Ÿ›ก๏ธ ้˜ถๆฎตไธ€๏ผš็”จๆˆท็ฉบ้—ดๅผบๅŠ›้”ๆ“ฆ้™คไธŽๅŠจๆ€ๆƒ้™ๅฎฝๅฎน๏ผˆ้กบๅบ” Rootless ็Žฏๅขƒ๏ผ‰
6
  # โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
7
+ TARGET_HOME="${HERMES_HOME:-/opt/data}"
8
+
9
+ echo "[Sandbox-Initializer] Running fallback initialization inside rootless user space..."
10
+
11
+ # 1. ๅฐ่ฏ•็”จๅฝ“ๅ‰ๆœ€ๅคงๆƒ้™ๅˆ›ๅปบ่ฟ่กŒๆ‰€้œ€ๆ‹“ๆ‰‘
12
+ mkdir -p "$TARGET_HOME"/{cron,sessions,logs,hooks,memories,skills,skins,plans,workspace,home,plugins} 2>/dev/null || true
13
+ mkdir -p "$TARGET_HOME/.local/bin" 2>/dev/null || true
14
+
15
+ # 2. ็‰ฉ็†ๆธ…้™คๆ‰€ๆœ‰ๅนฝ็ต้”ๆ–‡ไปถ๏ผˆๆ ธๅฟƒๆญป้”่งฃ้™ค็‚น๏ผ‰
16
+ # ๅณไฝฟ็”ฑไบŽๅކๅฒๅŽŸๅ› ๆ–‡ไปถๆ‰€ๆœ‰่€…ไธๅฑžไบŽๅฝ“ๅ‰็”จๆˆท๏ผŒๅช่ฆๆœ‰ๅ†™ๆƒ้™ๆˆ–ไธŠๅฑ‚็›ฎๅฝ•ๆ”พๅผ€ไบ† 777๏ผŒๅฐฑ่ƒฝๅผบ่กŒๆŠน้™ค
17
+ echo "[Sandbox-Initializer] Clearing lingering init locks to prevent Kanban deadlocks..."
18
+ find "$TARGET_HOME" -name "*.lock" -delete 2>/dev/null || true
19
+ find "$TARGET_HOME" -name "*.pid" -delete 2>/dev/null || true
20
+ rm -f "$TARGET_HOME/kanban.db.init.lock" 2>/dev/null || true
21
+ rm -f "$TARGET_HOME/logs/container-boot.log" 2>/dev/null || true
22
+
23
+ # 3. ๅŠจๆ€ๅฎฝๅฎน๏ผšๆ”พๅผ€ๅฏน็”Ÿๆˆๆ–‡ไปถ็š„ๆŽงๅˆถ๏ผŒ็กฎไฟๅŽ็ปญๅญ่ฟ›็จ‹ open("a+b") ๆˆ–่ฏปๅ†™ๆ—ถไธ่ธฉๅ‘
24
+ chmod -R 777 "$TARGET_HOME" 2>/dev/null || true
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
25
 
26
  # โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
27
  # ๐Ÿ›ก๏ธ ้˜ถๆฎตไบŒ๏ผšๅฎ‰ๅ…จ้™ๆƒๆฒ™็ฎฑ่ฟ่กŒ๏ผˆHermes ็ฉบ้—ด่กŒไธบ๏ผ‰
28
  # โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€๏ฟฝ๏ฟฝโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
29
+ umask 0000
30
 
31
  APP_DIR="${HUGGINGMES_APP_DIR:-/opt/huggingmes}"
 
32
  PUBLIC_PORT="${PORT:-7861}"
33
  GATEWAY_API_PORT="${API_SERVER_PORT:-8642}"
34
  DASHBOARD_PORT="${DASHBOARD_PORT:-9119}"
35
  TELEGRAM_WEBHOOK_PORT="${TELEGRAM_WEBHOOK_PORT:-8765}"
36
  CF_PROXY_ENV_FILE="/tmp/huggingmes-cloudflare-proxy.env"
37
+ STARTUP_FILE="$TARGET_HOME/workspace/startup.sh"
38
 
39
+ export HERMES_HOME="$TARGET_HOME"
40
  export API_SERVER_ENABLED="${API_SERVER_ENABLED:-true}"
41
  export API_SERVER_HOST="${API_SERVER_HOST:-127.0.0.1}"
42
  export API_SERVER_PORT="$GATEWAY_API_PORT"
 
66
  # ๅผบ่กŒๅฏน้ฝๅ…จๅฑ€ๅ˜้‡ๆ–ญ่จ€๏ผŒ็กฎไฟๅฎ˜ๆ–นๅ‰็ซฏ Terminal ๆกๆ‰‹ๆˆๅŠŸไธๆŠฅ้”™
67
  export GATEWAY_TOKEN="$API_SERVER_KEY"
68
 
69
+ if [ ! -L "$TARGET_HOME/.local/bin/hermes" ]; then
70
+ rm -f "$TARGET_HOME/.local/bin/hermes" 2>/dev/null || true
71
+ ln -sfn /opt/hermes/.venv/bin/hermes "$TARGET_HOME/.local/bin/hermes" 2>/dev/null || true
 
 
 
 
72
  fi
73
 
74
  if [ ! -L "${HOME}/.hermes/plugins" ]; then
75
+ mkdir -p "${HOME}/.hermes" 2>/dev/null || true
76
+ rm -rf "${HOME}/.hermes/plugins" 2>/dev/null || true
77
+ ln -sfn "$TARGET_HOME/plugins" "${HOME}/.hermes/plugins" 2>/dev/null || true
78
  fi
79
 
80
  # Cloudflare ็ฝ‘็ปœๅฑ‚ไปฃ็†ๅๅ‘ๆž„ๅปบ
 
108
  fi
109
 
110
  if [ -n "${TELEGRAM_WEBHOOK_URL:-}" ] && [ -z "${TELEGRAM_WEBHOOK_SECRET:-}" ]; then
111
+ SECRET_FILE="$TARGET_HOME/.huggingmes-telegram-webhook-secret"
112
  if [ -f "$SECRET_FILE" ]; then
113
  TELEGRAM_WEBHOOK_SECRET="$(cat "$SECRET_FILE")"
114
  export TELEGRAM_WEBHOOK_SECRET
 
118
  print(secrets.token_hex(32))
119
  PY
120
  )"
121
+ printf '%s' "$TELEGRAM_WEBHOOK_SECRET" > "$SECRET_FILE" 2>/dev/null || true
122
+ chmod 600 "$SECRET_FILE" 2>/dev/null || true
123
  export TELEGRAM_WEBHOOK_SECRET
124
  fi
125
  fi
126
 
127
+ # ๅคงๆจกๅž‹ๅคšๅ‰็ผ€ๆๅ–ไธŽ่ฝฌๆข็Ÿฉ้˜ต
128
  MODEL_INPUT="${HERMES_MODEL:-${LLM_MODEL:-}}"
129
  MODEL_FOR_CONFIG="$MODEL_INPUT"
130
  PROVIDER_FOR_CONFIG="${HERMES_INFERENCE_PROVIDER:-auto}"
 
275
  ])
276
 
277
  path.write_text(yaml.safe_dump(config, sort_keys=False), encoding="utf-8")
278
+ try:
279
+ path.chmod(0o777)
280
+ except Exception:
281
+ pass
282
  PY
283
 
284
  HERMES_RUNTIME_VERSION="$(/opt/hermes/.venv/bin/hermes --version 2>/dev/null | awk '{print $NF; exit}' || true)"
 
304
 
305
  export JUPYTER_TOKEN="$GATEWAY_TOKEN"
306
  local VENV_PYTHON="/opt/hermes/.venv/bin/python"
307
+ local root_dir="${JUPYTER_ROOT_DIR:-$TARGET_HOME/workspace}"
308
+ mkdir -p "$root_dir" 2>/dev/null || true
309
 
310
+ ln -sfn "$TARGET_HOME" "$root_dir/HuggingMes" 2>/dev/null || true
311
 
312
  echo "Starting JupyterLab terminal on port 8888 (root: $root_dir)"
313
  "$VENV_PYTHON" -m jupyterlab \
 
328
  --LabApp.check_for_updates_class=jupyterlab.NeverCheckForUpdate \
329
  --ServerApp.log_level=WARN \
330
  --ServerApp.root_dir="$root_dir" \
331
+ >> "$TARGET_HOME/logs/jupyter.log" 2>&1 &
332
  JUPYTER_PID=$!
333
  export JUPYTER_PID
334
  echo "JupyterLab started (PID: $JUPYTER_PID)"
 
343
 
344
  # Terminal ๅ‘ฝไปคๆ•่ŽทไธŽๆŒไน…ๅŒ–ๅŒๆญฅๅ™จ (.bashrc ๅ…จ้‡ๆณจๅ…ฅ)
345
  if [ ! -f "$STARTUP_FILE" ]; then
346
+ touch "$STARTUP_FILE" 2>/dev/null && chmod +x "$STARTUP_FILE" 2>/dev/null || true
347
  fi
348
  cat > "$HOME/.bashrc" << 'BASHRC'
349
  export PATH="/opt/hermes/.venv/bin:/opt/data/.local/bin:$PATH"
 
354
  _hm_append() {
355
  [ "${HUGGINGMES_CAPTURE_DISABLE:-0}" = "1" ] && return 0
356
  local line="$*"
357
+ mkdir -p "$(dirname "$STARTUP_FILE")" 2>/dev/null || true
358
+ touch "$STARTUP_FILE" 2>/dev/null && chmod +x "$STARTUP_FILE" 2>/dev/null || true
359
+ grep -qxF "$line" "$STARTUP_FILE" 2>/dev/null || echo "$line" >> "$STARTUP_FILE" 2>/dev/null || true
360
  }
361
  _hm_quote_args() {
362
  local quoted=() arg
 
476
  start_dashboard_once() {
477
  if [ -n "${DASHBOARD_PID:-}" ] && kill -0 "$DASHBOARD_PID" 2>/dev/null; then return 0; fi
478
  echo "Launching Hermes dashboard..."
479
+ (hermes dashboard --host 127.0.0.1 --insecure 2>&1 | tee -a "$TARGET_HOME/logs/dashboard.log") &
480
  DASHBOARD_PID=$!
481
  }
482
 
 
501
  fi
502
 
503
  echo "Launching Hermes gateway..."
504
+ (hermes gateway run 2>&1 | tee -a "$TARGET_HOME/logs/gateway.log") &
505
  GATEWAY_PID=$!
506
 
507
  ready=false
 
516
 
517
  if [ "$ready" != "true" ]; then
518
  echo "Hermes gateway failed to expose ports. Logs tail:"
519
+ tail -40 "$TARGET_HOME/logs/gateway.log" || true
520
  exit 1
521
  fi
522