Elysiadev11 commited on
Commit
2b85938
Β·
verified Β·
1 Parent(s): 25e6a19

Update start-openclaw.sh

Browse files
Files changed (1) hide show
  1. start-openclaw.sh +59 -31
start-openclaw.sh CHANGED
@@ -9,7 +9,6 @@ set +e
9
  echo "===== OpenClaw Startup ====="
10
 
11
  # ── TRAP: Backup saat container mati ─────────────────────────
12
- # Kalau HF Spaces kill container (restart/idle), backup jalan dulu
13
  trap 'echo ">>> [TRAP] Container stopping β€” final backup..."; python3 /app/sync.py backup; echo ">>> [TRAP] Done."' EXIT SIGTERM SIGINT
14
 
15
  # ── 1. Direktori ──────────────────────────────────────────────
@@ -47,15 +46,18 @@ else
47
  echo ">>> Chromium found: $CHROMIUM_PATH"
48
  fi
49
 
50
- # ── 5. Bersihkan OPENAI_API_BASE ─────────────────────────────
51
  CLEAN_BASE=$(echo "$OPENAI_API_BASE" \
52
  | sed "s|/chat/completions||g" \
53
  | sed "s|/v1/|/v1|g" \
54
  | sed "s|/v1$|/v1|g")
55
 
56
- # ── 6. Generate openclaw.json ─────────────────────────────────
57
- # openclaw.json selalu di-generate ulang dari env vars (tidak di-backup)
58
- cat > /root/.openclaw/openclaw.json <<EOF
 
 
 
59
  {
60
  "models": {
61
  "providers": {
@@ -72,8 +74,8 @@ cat > /root/.openclaw/openclaw.json <<EOF
72
  "apiKey": "$OPENAI_API_KEY",
73
  "api": "openai-completions",
74
  "models": [
75
- { "id": "$MODEL", "name": "$MODEL", "contextWindow": 128000 },
76
- { "id": "${VISION_MODEL:-$MODEL}", "name": "Nvidia Vision", "contextWindow": 128000, "input": ["text", "image"] }
77
  ]
78
  }
79
  }
@@ -86,6 +88,10 @@ cat > /root/.openclaw/openclaw.json <<EOF
86
  },
87
  "imageModel": {
88
  "primary": "nvidia/${VISION_MODEL:-$MODEL}"
 
 
 
 
89
  }
90
  }
91
  },
@@ -110,7 +116,7 @@ cat > /root/.openclaw/openclaw.json <<EOF
110
  "enabled": true,
111
  "botToken": "$TELEGRAM_BOT_TOKEN",
112
  "dmPolicy": "allowlist",
113
- "allowFrom": ["$TELEGRAM_ALLOW_ID"],
114
  "webhookUrl": "https://elysiadev11-openclaw.hf.space/telegram/webhook",
115
  "webhookSecret": "$OPENCLAW_GATEWAY_PASSWORD",
116
  "webhookPath": "/telegram/webhook",
@@ -140,8 +146,16 @@ cat > /root/.openclaw/openclaw.json <<EOF
140
  }
141
  }
142
  }
143
- EOF
144
- echo ">>> openclaw.json generated."
 
 
 
 
 
 
 
 
145
 
146
  # ── 7. Node.js reverse proxy (ANTI-TIMEOUT TRICK) ─────────────
147
  node -e "
@@ -160,10 +174,9 @@ function proxyHttp(req, res, targetPort) {
160
  res.writeHead(r.statusCode, r.headers);
161
  r.pipe(res, { end: true });
162
  });
163
-
164
  pr.on('error', (e) => {
165
  res.writeHead(200, { 'Content-Type': 'text/html' });
166
- res.end('<html style=\"background:#1e1e2e; color:#cdd6f4; font-family:sans-serif; text-align:center; padding-top:20%;\"><body><h2>πŸš€ OpenClaw is warming up...</h2><p>Hugging Face is downloading dependencies. Please refresh in a few seconds.</p></body></html>');
167
  });
168
  req.pipe(pr, { end: true });
169
  }
@@ -179,7 +192,7 @@ function proxyWs(req, socket, head, targetPort) {
179
  socket.pipe(conn);
180
  conn.pipe(socket);
181
  });
182
- conn.on('error', (e) => { socket.destroy(); });
183
  socket.on('error', () => conn.destroy());
184
  }
185
 
@@ -187,22 +200,20 @@ const server = http.createServer((req, res) => {
187
  const port = req.url.startsWith('/telegram/webhook') ? 8787 : 7862;
188
  proxyHttp(req, res, port);
189
  });
190
-
191
  server.on('upgrade', (req, socket, head) => {
192
  const port = req.url.startsWith('/telegram/webhook') ? 8787 : 7862;
193
  proxyWs(req, socket, head, port);
194
  });
195
-
196
  server.listen(7860, '0.0.0.0', () => {
197
  console.log('Proxy (HTTP+WebSocket) on port 7860 (Anti-Timeout Active)');
198
  });
199
  " &
200
  echo ">>> Node.js WebSocket proxy started on port 7860."
201
 
202
- # ── 8. Backup otomatis setiap 5 menit ────────────────────────
203
  (
204
- sleep 30
205
- echo ">>> Initial backup (30s after startup)..."
206
  python3 /app/sync.py backup
207
 
208
  while true; do
@@ -212,24 +223,41 @@ echo ">>> Node.js WebSocket proxy started on port 7860."
212
  done
213
  ) &
214
 
215
- # ── 9. Jalankan OpenClaw (dengan restart loop) ───────────────
216
- # Pakai loop instead of exec supaya:
217
- # - Kalau gateway restart/crash, backup dulu sebelum nyala lagi
218
- # - Kalau gagal restart, ada cooldown + retry otomatis
219
- # - Container tidak langsung mati kalau gateway exit
220
- echo ">>> Running openclaw doctor --fix..."
221
- openclaw doctor --fix
222
-
223
  RESTART_COUNT=0
224
  while true; do
225
  RESTART_COUNT=$((RESTART_COUNT + 1))
 
 
 
 
 
 
 
 
 
 
 
 
226
  echo ">>> [Loop #$RESTART_COUNT] Starting OpenClaw gateway on port 7862..."
227
 
228
- openclaw gateway run --port 7862
229
- EXIT_CODE=$?
 
 
 
 
 
 
 
 
 
 
 
 
230
 
231
- echo ">>> [Loop #$RESTART_COUNT] Gateway stopped (exit code: $EXIT_CODE) β€” backing up..."
232
  python3 /app/sync.py backup
233
- echo ">>> Backup done. Restarting gateway in 5 seconds..."
234
  sleep 5
235
- done
 
9
  echo "===== OpenClaw Startup ====="
10
 
11
  # ── TRAP: Backup saat container mati ─────────────────────────
 
12
  trap 'echo ">>> [TRAP] Container stopping β€” final backup..."; python3 /app/sync.py backup; echo ">>> [TRAP] Done."' EXIT SIGTERM SIGINT
13
 
14
  # ── 1. Direktori ──────────────────────────────────────────────
 
46
  echo ">>> Chromium found: $CHROMIUM_PATH"
47
  fi
48
 
49
+ # ── 5. Bersihkan Variabel ────────────────────────────────────
50
  CLEAN_BASE=$(echo "$OPENAI_API_BASE" \
51
  | sed "s|/chat/completions||g" \
52
  | sed "s|/v1/|/v1|g" \
53
  | sed "s|/v1$|/v1|g")
54
 
55
+ ALLOW_ID_SAFE=${TELEGRAM_ALLOW_ID:-0}
56
+
57
+ # ── 6. Fungsi Auto-Fix JSON (Template Aman Kita) ──────────────
58
+ generate_safe_json() {
59
+ echo ">>> [AUTO-FIX] Menulis ulang openclaw.json ke pengaturan aman..."
60
+ cat > /root/.openclaw/openclaw.json <<JSONEOF
61
  {
62
  "models": {
63
  "providers": {
 
74
  "apiKey": "$OPENAI_API_KEY",
75
  "api": "openai-completions",
76
  "models": [
77
+ { "id": "$MODEL", "name": "$MODEL", "contextWindow": 65536 },
78
+ { "id": "${VISION_MODEL:-$MODEL}", "name": "Nvidia Vision", "contextWindow": 65536, "input": ["text", "image"] }
79
  ]
80
  }
81
  }
 
88
  },
89
  "imageModel": {
90
  "primary": "nvidia/${VISION_MODEL:-$MODEL}"
91
+ },
92
+ "llm": {
93
+ "idleTimeoutSeconds": 0,
94
+ "maxTokens": 16384
95
  }
96
  }
97
  },
 
116
  "enabled": true,
117
  "botToken": "$TELEGRAM_BOT_TOKEN",
118
  "dmPolicy": "allowlist",
119
+ "allowFrom": [$ALLOW_ID_SAFE],
120
  "webhookUrl": "https://elysiadev11-openclaw.hf.space/telegram/webhook",
121
  "webhookSecret": "$OPENCLAW_GATEWAY_PASSWORD",
122
  "webhookPath": "/telegram/webhook",
 
146
  }
147
  }
148
  }
149
+ JSONEOF
150
+ }
151
+
152
+ # Cek integritas JSON di awal. Kalau valid dari backup, biarkan. Kalau rusak/kosong, timpa!
153
+ echo ">>> Memeriksa integritas file openclaw.json..."
154
+ if [ ! -f /root/.openclaw/openclaw.json ] || ! python3 -c 'import json; json.load(open("/root/.openclaw/openclaw.json"))' 2>/dev/null; then
155
+ generate_safe_json
156
+ else
157
+ echo ">>> File openclaw.json yang valid ditemukan (Editan AI aman dijaga)."
158
+ fi
159
 
160
  # ── 7. Node.js reverse proxy (ANTI-TIMEOUT TRICK) ─────────────
161
  node -e "
 
174
  res.writeHead(r.statusCode, r.headers);
175
  r.pipe(res, { end: true });
176
  });
 
177
  pr.on('error', (e) => {
178
  res.writeHead(200, { 'Content-Type': 'text/html' });
179
+ res.end('<html style=\"background:#1e1e2e; color:#cdd6f4; font-family:sans-serif; text-align:center; padding-top:20%;\"><body><h2>πŸš€ OpenClaw is warming up...</h2><p>Please refresh in a few seconds.</p></body></html>');
180
  });
181
  req.pipe(pr, { end: true });
182
  }
 
192
  socket.pipe(conn);
193
  conn.pipe(socket);
194
  });
195
+ conn.on('error', () => { socket.destroy(); });
196
  socket.on('error', () => conn.destroy());
197
  }
198
 
 
200
  const port = req.url.startsWith('/telegram/webhook') ? 8787 : 7862;
201
  proxyHttp(req, res, port);
202
  });
 
203
  server.on('upgrade', (req, socket, head) => {
204
  const port = req.url.startsWith('/telegram/webhook') ? 8787 : 7862;
205
  proxyWs(req, socket, head, port);
206
  });
 
207
  server.listen(7860, '0.0.0.0', () => {
208
  console.log('Proxy (HTTP+WebSocket) on port 7860 (Anti-Timeout Active)');
209
  });
210
  " &
211
  echo ">>> Node.js WebSocket proxy started on port 7860."
212
 
213
+ # ── 8. Backup otomatis setiap 1 Jam ──────────────────────────
214
  (
215
+ sleep 60
216
+ echo ">>> Initial backup (60s after startup)..."
217
  python3 /app/sync.py backup
218
 
219
  while true; do
 
223
  done
224
  ) &
225
 
226
+ # ── 9. Jalankan OpenClaw (Cerdas & Auto-Healing) ──────────────
 
 
 
 
 
 
 
227
  RESTART_COUNT=0
228
  while true; do
229
  RESTART_COUNT=$((RESTART_COUNT + 1))
230
+
231
+ echo ">>> Running openclaw doctor --fix..."
232
+ openclaw doctor --fix
233
+ DOC_EXIT=$?
234
+
235
+ # Kalau doctor gagal memvalidasi karena editan AI ngaco, langsung auto-fix
236
+ if [ $DOC_EXIT -ne 0 ]; then
237
+ echo ">>> [WARNING] OpenClaw Doctor menemukan error fatal di config! Memulai auto-fix..."
238
+ generate_safe_json
239
+ openclaw doctor --fix
240
+ fi
241
+
242
  echo ">>> [Loop #$RESTART_COUNT] Starting OpenClaw gateway on port 7862..."
243
 
244
+ # LOG FILTER ULTIMATE: Membungkam segala jenis spam log dari Telegram
245
+ openclaw gateway run --port 7862 2>&1 | grep --line-buffered -viE "pairing required|native approval handler|GatewayClientRequestError|security audit: device access upgrade requested"
246
+
247
+ # Ambil exit code asli aplikasi (bukan dari grep)
248
+ EXIT_CODE=${PIPESTATUS[0]}
249
+
250
+ echo ">>> [Loop #$RESTART_COUNT] Gateway stopped (exit code: $EXIT_CODE)."
251
+
252
+ # Cek penyebab berhentinya. Code 0 (sukses) atau 143 (di-restart manual) aman.
253
+ # Kalau selain itu (misal Code 1 atau 78 karena crash/error), jalankan auto-fix!
254
+ if [ "$EXIT_CODE" -ne 0 ] && [ "$EXIT_CODE" -ne 143 ]; then
255
+ echo ">>> [CRITICAL] Gateway CRASH dengan exit code $EXIT_CODE! Mengembalikan config ke pengaturan aman..."
256
+ generate_safe_json
257
+ fi
258
 
259
+ echo ">>> Backing up..."
260
  python3 /app/sync.py backup
261
+ echo ">>> Restarting gateway in 5 seconds..."
262
  sleep 5
263
+ done