8900 commited on
Commit
d01b2b2
·
verified ·
1 Parent(s): c9a6780

Update setup-hf-config.mjs

Browse files
Files changed (1) hide show
  1. setup-hf-config.mjs +40 -147
setup-hf-config.mjs CHANGED
@@ -1,189 +1,89 @@
1
- import fs from "node:fs";
2
  import path from "node:path";
3
  import https from "node:https";
4
 
5
- // ============================================================
6
- // OpenClaw HF Spaces - Production Config Writer
7
- // Called ONCE per container lifetime by entrypoint.sh.
8
- // Always writes fresh config from env vars on first boot.
9
- // ============================================================
10
-
11
- var HOME = process.env.OPENCLAW_HOME || process.env.HOME || "/home/user";
12
- var STATE_DIR = path.join(HOME, ".openclaw");
13
- var CONFIG_PATH = path.join(STATE_DIR, "openclaw.json");
14
- var WORKSPACE = path.join(STATE_DIR, "workspace");
15
- var SPACE_HOST = (process.env.SPACE_HOST || "").trim();
16
 
17
  console.log("[setup] Starting… HOME=" + HOME);
18
 
19
  function parseList(val) {
20
  if (!val || !val.trim()) return [];
21
- return val.split(",").map(function(s) { return s.trim(); }).filter(Boolean);
22
  }
23
 
24
  function envStr(key) {
25
  return (process.env[key] || "").trim();
26
  }
27
 
28
- // -- auth ---------------------------------------------------
29
-
30
- var gatewayToken = envStr("OPENCLAW_GATEWAY_TOKEN");
31
- var gatewayPassword = envStr("OPENCLAW_GATEWAY_PASSWORD");
32
 
33
  if (!gatewayToken && !gatewayPassword) {
34
  console.error("[setup] FATAL: set OPENCLAW_GATEWAY_TOKEN or OPENCLAW_GATEWAY_PASSWORD");
35
  process.exit(0);
36
  }
37
 
38
- // -- model --------------------------------------------------
39
-
40
- var defaultModel = envStr("OPENCLAW_HF_DEFAULT_MODEL") || "google/gemini-2.0-flash";
41
-
42
- // -- provider keys ------------------------------------------
43
 
44
- var EXCLUDE_PREFIXES = [
45
- "OPENCLAW_", "SPACE_", "SYSTEM_", "HF_",
46
- "NODE_", "PATH", "HOME", "USER", "PWD", "LANG", "LC_",
47
- "npm_", "HOSTNAME", "SHELL", "TERM", "SHLVL"
48
- ];
49
- var INCLUDE_SUFFIXES = [
50
- "_API_KEY", "_SECRET_KEY", "_ACCESS_TOKEN",
51
- "_BOT_TOKEN", "_AUTH_TOKEN", "_APP_KEY"
52
- ];
53
 
54
  function isProviderKey(k) {
55
- var i;
56
- for (i = 0; i < EXCLUDE_PREFIXES.length; i++) {
57
- if (k.indexOf(EXCLUDE_PREFIXES[i]) === 0) return false;
58
- }
59
- for (i = 0; i < INCLUDE_SUFFIXES.length; i++) {
60
- var s = INCLUDE_SUFFIXES[i];
61
- if (k.length > s.length && k.indexOf(s) === k.length - s.length) return true;
62
- }
63
  return false;
64
  }
65
 
66
- var providerKeys = Object.keys(process.env).filter(function(k) {
67
- return isProviderKey(k) && (process.env[k] || "").trim();
68
- }).sort();
69
-
70
- console.log("[setup] Detected provider keys (" + providerKeys.length + "):");
71
- providerKeys.forEach(function(k) { console.log(" + " + k); });
72
-
73
- // -- trusted proxies ---------------------------------------
74
-
75
- var envProxies = parseList(envStr("OPENCLAW_GATEWAY_TRUSTED_PROXIES"));
76
- var trustedProxies = envProxies.length > 0 ? envProxies : [
77
- "10.0.0.0/8",
78
- "172.16.0.0/12",
79
- "192.168.0.0/16",
80
- "10.16.0.0/12", "10.20.0.0/12",
81
- "10.16.4.123", "10.16.7.92", "10.16.18.232",
82
- "10.16.34.155", "10.16.43.133", "10.16.1.206",
83
- "10.16.37.110", "10.16.43.246",
84
- "10.20.1.9", "10.20.1.222",
85
- "10.20.26.157", "10.20.31.87",
86
- "10.20.0.1", "172.17.0.1",
87
- "127.0.0.1"
88
- ];
89
-
90
- // -- build config ------------------------------------------
91
-
92
- var config = {
93
  gateway: {
94
- auth: gatewayToken
95
- ? { mode: "token", token: gatewayToken }
96
- : { mode: "password", password: gatewayPassword },
97
  controlUi: {
98
- allowInsecureAuth: true,
99
- allowedOrigins: ["*"],
100
- dangerouslyDisableDeviceAuth: true,
101
- dangerouslyAllowHostHeaderOriginFallback: true
 
102
  },
103
- trustedProxies: trustedProxies
 
104
  },
105
  agents: {
106
- defaults: {
107
- model: defaultModel,
108
- workspace: WORKSPACE
109
- }
110
  },
111
  env: { vars: {} }
112
  };
113
 
114
- providerKeys.forEach(function(pk) {
115
  config.env.vars[pk] = (process.env[pk] || "").trim();
116
  });
117
 
118
- // -- Telegram ----------------------------------------------
119
-
120
- function tgRequest(token, method, body) {
121
- return new Promise(function(resolve) {
122
- var data = JSON.stringify(body || {});
123
- var req = https.request({
124
- hostname: "api.telegram.org",
125
- path: "/bot" + token + "/" + method,
126
- method: "POST",
127
- headers: {
128
- "Content-Type": "application/json",
129
- "Content-Length": Buffer.byteLength(data)
130
- }
131
- }, function(res) {
132
- var buf = "";
133
- res.on("data", function(c) { buf += c; });
134
- res.on("end", function() {
135
- try { resolve(JSON.parse(buf)); } catch (e) { resolve(null); }
136
- });
137
- });
138
- req.on("error", function() { resolve(null); });
139
- req.setTimeout(8000, function() { req.destroy(); resolve(null); });
140
- req.write(data);
141
- req.end();
142
- });
143
- }
144
-
145
  async function setupTelegram() {
146
- var token = envStr("TELEGRAM_BOT_TOKEN");
147
  if (!token) {
148
- console.log("[setup] Telegram: disabled (no TELEGRAM_BOT_TOKEN)");
149
  return;
150
  }
151
-
152
- if (SPACE_HOST) {
153
- var webhookUrl = "https://" + SPACE_HOST + "/tg-webhook";
154
- var r = await tgRequest(token, "setWebhook", {
155
- url: webhookUrl,
156
- drop_pending_updates: true,
157
- max_connections: 10
158
- });
159
- if (r && r.ok) {
160
- console.log("[setup] Telegram: webhook registered -> " + webhookUrl);
161
- } else {
162
- console.log("[setup] Telegram: auto-registration failed");
163
- console.log("[setup] Open this URL in your browser once:");
164
- console.log(" https://api.telegram.org/bot" + token +
165
- "/setWebhook?url=" + webhookUrl + "&drop_pending_updates=true");
166
- }
167
- } else {
168
- console.log("[setup] Telegram: set SPACE_HOST for auto webhook");
169
- }
170
-
171
- config.channels = {
172
- telegram: {
173
- enabled: true,
174
- accounts: {
175
- main: { botToken: token, apiRoot: "https://api.telegram.org" }
176
- }
177
- }
178
- };
179
  console.log("[setup] Telegram: configured");
180
  }
181
 
182
- // -- main --------------------------------------------------
183
-
184
  (async function() {
185
  fs.mkdirSync(STATE_DIR, { recursive: true });
186
- fs.mkdirSync(WORKSPACE, { recursive: true });
187
  fs.mkdirSync(path.join(WORKSPACE, "memory"), { recursive: true });
188
 
189
  await setupTelegram();
@@ -194,13 +94,6 @@ async function setupTelegram() {
194
  fs.writeFileSync(CONFIG_PATH, JSON.stringify(config, null, 2), "utf-8");
195
 
196
  console.log("[setup] Done.");
197
- console.log("[setup] auth = " + (gatewayToken ? "token" : "password"));
198
- console.log("[setup] model = " + defaultModel);
199
- console.log("[setup] workspace = " + WORKSPACE);
200
- console.log("[setup] proxies = " + trustedProxies.length);
201
- console.log("[setup] env.vars = " + providerKeys.length);
202
- console.log("[setup] config = " + CONFIG_PATH);
203
- })().catch(function(e) {
204
  console.error("[setup] Fatal: " + e.message);
205
- process.exit(0);
206
  });
 
1
+ import fs from "node:fs";
2
  import path from "node:path";
3
  import https from "node:https";
4
 
5
+ const HOME = process.env.OPENCLAW_HOME || process.env.HOME || "/home/user";
6
+ const STATE_DIR = path.join(HOME, ".openclaw");
7
+ const CONFIG_PATH = path.join(STATE_DIR, "openclaw.json");
8
+ const WORKSPACE = path.join(STATE_DIR, "workspace");
9
+ const SPACE_HOST = (process.env.SPACE_HOST || "").trim();
 
 
 
 
 
 
10
 
11
  console.log("[setup] Starting… HOME=" + HOME);
12
 
13
  function parseList(val) {
14
  if (!val || !val.trim()) return [];
15
+ return val.split(",").map(s => s.trim()).filter(Boolean);
16
  }
17
 
18
  function envStr(key) {
19
  return (process.env[key] || "").trim();
20
  }
21
 
22
+ const gatewayToken = envStr("OPENCLAW_GATEWAY_TOKEN");
23
+ const gatewayPassword = envStr("OPENCLAW_GATEWAY_PASSWORD");
 
 
24
 
25
  if (!gatewayToken && !gatewayPassword) {
26
  console.error("[setup] FATAL: set OPENCLAW_GATEWAY_TOKEN or OPENCLAW_GATEWAY_PASSWORD");
27
  process.exit(0);
28
  }
29
 
30
+ const defaultModel = envStr("OPENCLAW_HF_DEFAULT_MODEL") || "google/gemini-2.0-flash";
 
 
 
 
31
 
32
+ const EXCLUDE_PREFIXES = ["OPENCLAW_", "SPACE_", "SYSTEM_", "HF_", "NODE_", "PATH", "HOME", "USER", "PWD", "LANG", "LC_", "npm_", "HOSTNAME", "SHELL", "TERM", "SHLVL"];
33
+ const INCLUDE_SUFFIXES = ["_API_KEY", "_SECRET_KEY", "_ACCESS_TOKEN", "_BOT_TOKEN", "_AUTH_TOKEN", "_APP_KEY"];
 
 
 
 
 
 
 
34
 
35
  function isProviderKey(k) {
36
+ for (const prefix of EXCLUDE_PREFIXES) if (k.startsWith(prefix)) return false;
37
+ for (const suffix of INCLUDE_SUFFIXES) if (k.endsWith(suffix)) return true;
 
 
 
 
 
 
38
  return false;
39
  }
40
 
41
+ const providerKeys = Object.keys(process.env)
42
+ .filter(k => isProviderKey(k) && (process.env[k] || "").trim())
43
+ .sort();
44
+
45
+ console.log(`[setup] Detected provider keys (${providerKeys.length}):`);
46
+ providerKeys.forEach(k => console.log(" + " + k));
47
+
48
+ const trustedProxies = parseList(envStr("OPENCLAW_GATEWAY_TRUSTED_PROXIES")).length > 0
49
+ ? parseList(envStr("OPENCLAW_GATEWAY_TRUSTED_PROXIES"))
50
+ : ["10.0.0.0/8", "172.16.0.0/12", "192.168.0.0/16", "10.16.0.0/12", "10.20.0.0/12", "127.0.0.1"];
51
+
52
+ const config = {
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
53
  gateway: {
54
+ auth: gatewayToken ? { mode: "token", token: gatewayToken } : { mode: "password", password: gatewayPassword },
 
 
55
  controlUi: {
56
+ allowInsecureAuth: true,
57
+ allowedOrigins: ["*"],
58
+ dangerouslyDisableDeviceAuth: true,
59
+ dangerouslyAllowHostHeaderOriginFallback: true,
60
+ reloadMode: "hybrid" // <--- 尝试强制 hybrid 模式,减少重启
61
  },
62
+ trustedProxies: trustedProxies,
63
+ reload: { mode: "hybrid" } // <--- 增加这行
64
  },
65
  agents: {
66
+ defaults: { model: defaultModel, workspace: WORKSPACE }
 
 
 
67
  },
68
  env: { vars: {} }
69
  };
70
 
71
+ providerKeys.forEach(pk => {
72
  config.env.vars[pk] = (process.env[pk] || "").trim();
73
  });
74
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
75
  async function setupTelegram() {
76
+ const token = envStr("TELEGRAM_BOT_TOKEN");
77
  if (!token) {
78
+ console.log("[setup] Telegram: disabled");
79
  return;
80
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
81
  console.log("[setup] Telegram: configured");
82
  }
83
 
 
 
84
  (async function() {
85
  fs.mkdirSync(STATE_DIR, { recursive: true });
86
+ fs.mkdirSync(WORKSPACE, { recursive: true });
87
  fs.mkdirSync(path.join(WORKSPACE, "memory"), { recursive: true });
88
 
89
  await setupTelegram();
 
94
  fs.writeFileSync(CONFIG_PATH, JSON.stringify(config, null, 2), "utf-8");
95
 
96
  console.log("[setup] Done.");
97
+ })().catch(e => {
 
 
 
 
 
 
98
  console.error("[setup] Fatal: " + e.message);
 
99
  });