Update entrypoint.sh
Browse files- entrypoint.sh +41 -22
entrypoint.sh
CHANGED
|
@@ -82,7 +82,7 @@ if [ -f /app/security-check.sh ]; then
|
|
| 82 |
fi
|
| 83 |
|
| 84 |
# ----------------------------------------------------------------
|
| 85 |
-
#
|
| 86 |
# ----------------------------------------------------------------
|
| 87 |
STATE_DB="$OPENCLAW_HOME/.openclaw/state/openclaw.sqlite"
|
| 88 |
|
|
@@ -106,7 +106,7 @@ dump_owner() {
|
|
| 106 |
const { DatabaseSync } = require('node:sqlite');
|
| 107 |
try {
|
| 108 |
const db = new DatabaseSync(process.env.DBPATH, { readOnly: true });
|
| 109 |
-
const tables = db.prepare("SELECT name FROM sqlite_master WHERE type='table' AND (name LIKE '%owner%' OR name LIKE '%lock%' OR name LIKE '%lease%' OR name LIKE '%heartbeat%'
|
| 110 |
for (const t of tables) {
|
| 111 |
console.log('[owner-dump] table ' + t.name);
|
| 112 |
for (const r of db.prepare('SELECT * FROM "' + t.name + '" LIMIT 5').all()) {
|
|
@@ -118,6 +118,26 @@ try {
|
|
| 118 |
JSEOF
|
| 119 |
}
|
| 120 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 121 |
# Move retired Telegram JSON state aside (blocks doctor migration; kept as backup)
|
| 122 |
LEGACY_BAK="$OPENCLAW_HOME/legacy-telegram-backup"
|
| 123 |
mkdir -p "$LEGACY_BAK"
|
|
@@ -129,6 +149,19 @@ for f in "$OPENCLAW_HOME"/.openclaw/telegram/update-offset-*.json \
|
|
| 129 |
fi
|
| 130 |
done
|
| 131 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 132 |
# If the state DB is corrupt, restore from doctor's own pre-migration backup
|
| 133 |
if [ -f "$STATE_DB" ] && ! check_db "$STATE_DB" 2>/dev/null; then
|
| 134 |
warn "State DB failed integrity check - looking for an intact backup..."
|
|
@@ -146,38 +179,23 @@ if [ -f "$STATE_DB" ] && ! check_db "$STATE_DB" 2>/dev/null; then
|
|
| 146 |
fi
|
| 147 |
|
| 148 |
# ----------------------------------------------------------------
|
| 149 |
-
# Doctor (state migration)
|
| 150 |
# ----------------------------------------------------------------
|
| 151 |
-
run_doctor() {
|
| 152 |
-
timeout 300 openclaw doctor --fix --non-interactive </dev/null >/tmp/doctor.out 2>&1
|
| 153 |
-
cat /tmp/doctor.out
|
| 154 |
-
}
|
| 155 |
-
doctor_locked() {
|
| 156 |
-
grep -q "could not enter maintenance" /tmp/doctor.out
|
| 157 |
-
}
|
| 158 |
-
|
| 159 |
log "Running openclaw doctor --fix (state migration)..."
|
|
|
|
| 160 |
run_doctor
|
| 161 |
if doctor_locked; then
|
| 162 |
warn "doctor blocked by state ownership lock - diagnostics follow"
|
| 163 |
log "now (UTC): $(date -u +%Y-%m-%dT%H:%M:%S)"
|
| 164 |
dump_owner "$STATE_DB" 2>/dev/null
|
| 165 |
-
find "$OPENCLAW_HOME/.openclaw" -maxdepth 3
|
| 166 |
warn "retrying doctor in 30s..."
|
| 167 |
sleep 30
|
|
|
|
| 168 |
run_doctor
|
| 169 |
fi
|
| 170 |
if doctor_locked; then
|
| 171 |
-
|
| 172 |
-
warn "still locked, and the one-time fallback was already used - not touching the DB again"
|
| 173 |
-
else
|
| 174 |
-
warn "still locked - moving state DB aside (one time) and retrying on a fresh DB"
|
| 175 |
-
TSX=$(date +%s)
|
| 176 |
-
for f in "$STATE_DB" "$STATE_DB-wal" "$STATE_DB-shm"; do
|
| 177 |
-
[ -e "$f" ] && mv "$f" "$f.locked-$TSX"
|
| 178 |
-
done
|
| 179 |
-
run_doctor
|
| 180 |
-
fi
|
| 181 |
fi
|
| 182 |
log "Doctor step done."
|
| 183 |
|
|
@@ -232,6 +250,7 @@ JSEOF
|
|
| 232 |
log "Starting gateway loop..."
|
| 233 |
|
| 234 |
while true; do
|
|
|
|
| 235 |
log "Gateway starting..."
|
| 236 |
|
| 237 |
openclaw gateway \
|
|
|
|
| 82 |
fi
|
| 83 |
|
| 84 |
# ----------------------------------------------------------------
|
| 85 |
+
# Helpers
|
| 86 |
# ----------------------------------------------------------------
|
| 87 |
STATE_DB="$OPENCLAW_HOME/.openclaw/state/openclaw.sqlite"
|
| 88 |
|
|
|
|
| 106 |
const { DatabaseSync } = require('node:sqlite');
|
| 107 |
try {
|
| 108 |
const db = new DatabaseSync(process.env.DBPATH, { readOnly: true });
|
| 109 |
+
const tables = db.prepare("SELECT name FROM sqlite_master WHERE type='table' AND (name LIKE '%owner%' OR name LIKE '%lock%' OR name LIKE '%lease%' OR name LIKE '%heartbeat%')").all();
|
| 110 |
for (const t of tables) {
|
| 111 |
console.log('[owner-dump] table ' + t.name);
|
| 112 |
for (const r of db.prepare('SELECT * FROM "' + t.name + '" LIMIT 5').all()) {
|
|
|
|
| 118 |
JSEOF
|
| 119 |
}
|
| 120 |
|
| 121 |
+
# Stale lock files left on the persistent volume by a crashed gateway
|
| 122 |
+
clear_stale_locks() {
|
| 123 |
+
for d in "$OPENCLAW_HOME"/.openclaw/tmp/openclaw-*; do
|
| 124 |
+
[ -d "$d" ] || continue
|
| 125 |
+
for l in "$d"/*.lock; do
|
| 126 |
+
[ -e "$l" ] || continue
|
| 127 |
+
INFO=$(head -c 160 "$l" 2>/dev/null | tr '\n' ' ')
|
| 128 |
+
rm -rf "$l" && log "Removed stale lock: $l [$INFO]"
|
| 129 |
+
done
|
| 130 |
+
done
|
| 131 |
+
}
|
| 132 |
+
|
| 133 |
+
run_doctor() {
|
| 134 |
+
timeout 300 openclaw doctor --fix --non-interactive </dev/null >/tmp/doctor.out 2>&1
|
| 135 |
+
cat /tmp/doctor.out
|
| 136 |
+
}
|
| 137 |
+
doctor_locked() {
|
| 138 |
+
grep -q "could not enter maintenance" /tmp/doctor.out
|
| 139 |
+
}
|
| 140 |
+
|
| 141 |
# Move retired Telegram JSON state aside (blocks doctor migration; kept as backup)
|
| 142 |
LEGACY_BAK="$OPENCLAW_HOME/legacy-telegram-backup"
|
| 143 |
mkdir -p "$LEGACY_BAK"
|
|
|
|
| 149 |
fi
|
| 150 |
done
|
| 151 |
|
| 152 |
+
# ----------------------------------------------------------------
|
| 153 |
+
# Restore a state DB that an earlier boot moved aside
|
| 154 |
+
# ----------------------------------------------------------------
|
| 155 |
+
LOCKED=$(ls -t "$STATE_DB".locked-* 2>/dev/null | head -n1)
|
| 156 |
+
if [ -n "$LOCKED" ]; then
|
| 157 |
+
warn "Found a state DB moved aside by an earlier boot - restoring: $LOCKED"
|
| 158 |
+
if [ -e "$STATE_DB" ]; then
|
| 159 |
+
mv "$STATE_DB" "$STATE_DB.fresh-$(date +%s)"
|
| 160 |
+
fi
|
| 161 |
+
rm -f "$STATE_DB-wal" "$STATE_DB-shm"
|
| 162 |
+
mv "$LOCKED" "$STATE_DB" && log "Restored state DB from $LOCKED"
|
| 163 |
+
fi
|
| 164 |
+
|
| 165 |
# If the state DB is corrupt, restore from doctor's own pre-migration backup
|
| 166 |
if [ -f "$STATE_DB" ] && ! check_db "$STATE_DB" 2>/dev/null; then
|
| 167 |
warn "State DB failed integrity check - looking for an intact backup..."
|
|
|
|
| 179 |
fi
|
| 180 |
|
| 181 |
# ----------------------------------------------------------------
|
| 182 |
+
# Doctor (state migration)
|
| 183 |
# ----------------------------------------------------------------
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 184 |
log "Running openclaw doctor --fix (state migration)..."
|
| 185 |
+
clear_stale_locks
|
| 186 |
run_doctor
|
| 187 |
if doctor_locked; then
|
| 188 |
warn "doctor blocked by state ownership lock - diagnostics follow"
|
| 189 |
log "now (UTC): $(date -u +%Y-%m-%dT%H:%M:%S)"
|
| 190 |
dump_owner "$STATE_DB" 2>/dev/null
|
| 191 |
+
find "$OPENCLAW_HOME/.openclaw/tmp" -maxdepth 3 2>/dev/null | head -n 30
|
| 192 |
warn "retrying doctor in 30s..."
|
| 193 |
sleep 30
|
| 194 |
+
clear_stale_locks
|
| 195 |
run_doctor
|
| 196 |
fi
|
| 197 |
if doctor_locked; then
|
| 198 |
+
warn "doctor still blocked by the state lock - not touching any data"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 199 |
fi
|
| 200 |
log "Doctor step done."
|
| 201 |
|
|
|
|
| 250 |
log "Starting gateway loop..."
|
| 251 |
|
| 252 |
while true; do
|
| 253 |
+
clear_stale_locks
|
| 254 |
log "Gateway starting..."
|
| 255 |
|
| 256 |
openclaw gateway \
|