arcticaurora commited on
Commit
c541380
·
verified ·
1 Parent(s): 2b856e0

Update start.sh

Browse files
Files changed (1) hide show
  1. start.sh +50 -37
start.sh CHANGED
@@ -1,75 +1,88 @@
1
  #!/bin/bash
2
- # 确保任何命令失败都会立即退出脚本
3
  set -e
4
 
5
- # ======================= 配置区 =======================
6
- export REPO_ID="arcticaurora/mcp-settings"
7
- # ======================================================
 
 
 
8
 
9
- # --- 定义路径 ---
10
- # 只读的源码目录,由 Dockerfile 构建
11
  APP_SRC_DIR="/app"
12
- # 【关键修复】在 /tmp 下创建可写的运行时目录
13
  RUN_DIR="/tmp/mcphub"
14
  CONFIG_FILE_NAME="mcp_settings.json"
15
  CONFIG_FILE_PATH="${RUN_DIR}/${CONFIG_FILE_NAME}"
16
 
17
- export HF_HOME="/tmp/.cache/huggingface"
18
 
19
- echo "--- MCPHub Persistence Wrapper (v8 - /tmp Runtime) ---"
20
-
21
- # 1. 创建运行时目录并复制应用文件
22
  echo "Creating writable runtime directory at ${RUN_DIR}..."
23
  mkdir -p "$RUN_DIR"
24
- echo "Copying application files from ${APP_SRC_DIR}..."
25
  cp -a "${APP_SRC_DIR}/." "$RUN_DIR/"
26
 
27
- # 2. 登录 Hugging Face Hub
28
- echo "Logging into Hugging Face Hub..."
29
- huggingface-cli login --token "$HF_TOKEN" &> /dev/null
30
-
31
- # 3. 下载或创建配置文件到可写目录
32
- echo "Preparing config file at ${CONFIG_FILE_PATH}..."
33
- # 先下载到 /tmp,然后移动到最终位置
34
- TEMP_DOWNLOAD_PATH="/tmp/${CONFIG_FILE_NAME}"
35
- python3 -c "from huggingface_hub import hf_hub_download; hf_hub_download(repo_id='$REPO_ID', filename='$CONFIG_FILE_NAME', repo_type='dataset', local_dir='/tmp', etag_timeout=10, resume_download=True)" &> /dev/null
36
 
37
- if [ -f "$TEMP_DOWNLOAD_PATH" ]; then
38
- mv "$TEMP_DOWNLOAD_PATH" "$CONFIG_FILE_PATH"
 
 
39
  else
 
40
  echo "{}" > "$CONFIG_FILE_PATH"
41
- huggingface-cli upload "$REPO_ID" "$CONFIG_FILE_PATH" --repo-type dataset --commit-message "feat: Initial empty config" &> /dev/null
42
  fi
43
- echo "Config is ready."
44
 
45
- # 4. 启动后台持久化脚本
46
- echo "Starting persistence sync script in background..."
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
47
  (
48
- # 初始化哈希值
49
  LAST_HASH=""
50
  if [ -f "$CONFIG_FILE_PATH" ]; then
51
  LAST_HASH=$(md5sum "$CONFIG_FILE_PATH" | awk '{ print $1 }')
52
  fi
53
  echo "Initial config hash: $LAST_HASH"
54
-
55
  while true; do
56
- sleep 60
 
57
  if [ -f "$CONFIG_FILE_PATH" ]; then
58
  CURRENT_HASH=$(md5sum "$CONFIG_FILE_PATH" | awk '{ print $1 }')
 
59
  if [ "$CURRENT_HASH" != "$LAST_HASH" ]; then
60
- echo "[Sync] Config changed, uploading to Hub..."
61
- huggingface-cli upload "$REPO_ID" "$CONFIG_FILE_PATH" --repo-type dataset --commit-message "chore: Auto-sync settings"
62
  LAST_HASH=$CURRENT_HASH
63
  fi
64
  fi
65
  done
66
  ) &
67
 
68
- # 5. 【关键修复】切换到可写的运行时目录,然后启动应用
69
- echo "Changing directory to ${RUN_DIR}..."
70
  cd "$RUN_DIR"
71
-
72
- echo "Starting MCPHub server in foreground on port ${PORT}..."
73
  npm start
74
 
75
- echo "MCPHub server exited. Container will now stop."
 
1
  #!/bin/bash
 
2
  set -e
3
 
4
+ # ======================= Supabase Config =======================
5
+ # THESE WILL COME FROM HUGGING FACE SECRETS - DON'T PUT ACTUAL VALUES HERE
6
+ export SUPABASE_URL="${SUPABASE_URL}"
7
+ export SUPABASE_ANON_KEY="${SUPABASE_ANON_KEY}"
8
+ export CONFIG_ID="mcp_settings"
9
+ # ================================================================
10
 
11
+ # --- Define paths ---
 
12
  APP_SRC_DIR="/app"
 
13
  RUN_DIR="/tmp/mcphub"
14
  CONFIG_FILE_NAME="mcp_settings.json"
15
  CONFIG_FILE_PATH="${RUN_DIR}/${CONFIG_FILE_NAME}"
16
 
17
+ echo "--- MCPHub with Supabase Storage ---"
18
 
19
+ # 1. Create runtime directory and copy files
 
 
20
  echo "Creating writable runtime directory at ${RUN_DIR}..."
21
  mkdir -p "$RUN_DIR"
22
+ echo "Copying application files..."
23
  cp -a "${APP_SRC_DIR}/." "$RUN_DIR/"
24
 
25
+ # 2. Download config from Supabase
26
+ echo "Fetching config from Supabase..."
27
+ RESPONSE=$(curl -s -X GET \
28
+ "${SUPABASE_URL}/rest/v1/configs?id=eq.${CONFIG_ID}&select=content" \
29
+ -H "apikey: ${SUPABASE_ANON_KEY}" \
30
+ -H "Authorization: Bearer ${SUPABASE_ANON_KEY}")
 
 
 
31
 
32
+ # Extract JSON content from response
33
+ if [ -n "$RESPONSE" ] && [ "$RESPONSE" != "[]" ]; then
34
+ echo "$RESPONSE" | python3 -c "import sys, json; data=json.load(sys.stdin); print(json.dumps(data[0]['content'] if data else {}))" > "$CONFIG_FILE_PATH"
35
+ echo "✅ Config downloaded successfully."
36
  else
37
+ echo "⚠️ No config found in Supabase, creating empty file..."
38
  echo "{}" > "$CONFIG_FILE_PATH"
 
39
  fi
 
40
 
41
+ # 3. Function to sync file to Supabase
42
+ sync_to_supabase() {
43
+ if [ -f "$CONFIG_FILE_PATH" ]; then
44
+ FILE_CONTENT=$(cat "$CONFIG_FILE_PATH" | python3 -c "import sys, json; print(json.dumps(json.load(sys.stdin)))")
45
+
46
+ curl -s -X PATCH \
47
+ "${SUPABASE_URL}/rest/v1/configs?id=eq.${CONFIG_ID}" \
48
+ -H "apikey: ${SUPABASE_ANON_KEY}" \
49
+ -H "Authorization: Bearer ${SUPABASE_ANON_KEY}" \
50
+ -H "Content-Type: application/json" \
51
+ -H "Prefer: return=minimal" \
52
+ -d "{\"content\":${FILE_CONTENT},\"updated_at\":\"$(date -u +%Y-%m-%dT%H:%M:%S)\"}" \
53
+ > /dev/null
54
+
55
+ echo "✅ [Sync] Config uploaded to Supabase at $(date)"
56
+ fi
57
+ }
58
+
59
+ # 4. Start background sync process
60
+ echo "Starting Supabase sync in background..."
61
  (
 
62
  LAST_HASH=""
63
  if [ -f "$CONFIG_FILE_PATH" ]; then
64
  LAST_HASH=$(md5sum "$CONFIG_FILE_PATH" | awk '{ print $1 }')
65
  fi
66
  echo "Initial config hash: $LAST_HASH"
67
+
68
  while true; do
69
+ sleep 30
70
+
71
  if [ -f "$CONFIG_FILE_PATH" ]; then
72
  CURRENT_HASH=$(md5sum "$CONFIG_FILE_PATH" | awk '{ print $1 }')
73
+
74
  if [ "$CURRENT_HASH" != "$LAST_HASH" ]; then
75
+ echo "📤 [Sync] Config changed, syncing to Supabase..."
76
+ sync_to_supabase
77
  LAST_HASH=$CURRENT_HASH
78
  fi
79
  fi
80
  done
81
  ) &
82
 
83
+ # 5. Change to runtime directory and start app
84
+ echo "🚀 Starting MCPHub server on port ${PORT}..."
85
  cd "$RUN_DIR"
 
 
86
  npm start
87
 
88
+ echo "MCPHub server exited."