Spaces:
Running
Running
Hermes Agent commited on
Commit Β·
6137b1d
1
Parent(s): ec2b16b
Eliminate directory collision for storage.sqlite and consolidate unified backup pipeline for storage.sqlite and state directories
Browse files- entrypoint.sh +49 -5
entrypoint.sh
CHANGED
|
@@ -58,13 +58,19 @@ BACKUP_DIR="/data/omniroute/backups"
|
|
| 58 |
RUNTIME_DIR="/root/.omniroute"
|
| 59 |
RUNTIME_DB="/root/.omniroute/storage.sqlite"
|
| 60 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 61 |
mkdir -p "$PERSIST_DIR" "$BACKUP_DIR" "$RUNTIME_DIR" 2>/dev/null || true
|
| 62 |
|
| 63 |
echo "[PERSISTENCE] Storage mount inspection:"
|
| 64 |
mount | grep -E 'hf|bucket|data|fuse|nfs' || echo "[STORAGE] /data info: $(df -h /data 2>&1 || true)"
|
| 65 |
|
| 66 |
-
# ββ Snapshot Restoration on Boot ββββββββββββββββββββββββββββββββββββββ
|
| 67 |
-
if [ -s "$PERSIST_DB" ]; then
|
| 68 |
_INIT_SIZE=$(wc -c < "$PERSIST_DB" 2>/dev/null | tr -d ' \t\n\r' || echo "0")
|
| 69 |
echo "[PERSISTENCE] Found OmniRoute snapshot at: ${PERSIST_DB} (${_INIT_SIZE} bytes)"
|
| 70 |
if command -v sqlite3 >/dev/null 2>&1; then
|
|
@@ -84,28 +90,66 @@ else
|
|
| 84 |
echo "[PERSISTENCE] No snapshot found at ${PERSIST_DB}. Initializing fresh OmniRoute database."
|
| 85 |
fi
|
| 86 |
|
| 87 |
-
#
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 88 |
sync_omniroute_db() {
|
| 89 |
if [ -f "$RUNTIME_DB" ] && [ -s "$RUNTIME_DB" ]; then
|
| 90 |
mkdir -p "$PERSIST_DIR" "$BACKUP_DIR" 2>/dev/null || true
|
|
|
|
|
|
|
| 91 |
if command -v sqlite3 >/dev/null 2>&1; then
|
| 92 |
sqlite3 "$RUNTIME_DB" ".backup '$PERSIST_DB'" 2>/dev/null || cp -f "$RUNTIME_DB" "$PERSIST_DB" 2>/dev/null || true
|
| 93 |
else
|
| 94 |
cp -f "$RUNTIME_DB" "$PERSIST_DB" 2>/dev/null || true
|
| 95 |
fi
|
| 96 |
|
| 97 |
-
# Verify
|
| 98 |
_CHK="ok"
|
| 99 |
if command -v sqlite3 >/dev/null 2>&1; then
|
| 100 |
_CHK=$(sqlite3 "$PERSIST_DB" "PRAGMA quick_check;" 2>/dev/null || echo "failed")
|
| 101 |
fi
|
| 102 |
|
| 103 |
if [ "$_CHK" = "ok" ]; then
|
| 104 |
-
# Rotate backups (keep last-known-good + rolling
|
| 105 |
cp -f "$PERSIST_DB" "${BACKUP_DIR}/last-known-good.sqlite" 2>/dev/null || true
|
| 106 |
TIMESTAMP=$(date +%Y%m%d-%H%M)
|
| 107 |
cp -f "$PERSIST_DB" "${BACKUP_DIR}/storage-${TIMESTAMP}.sqlite" 2>/dev/null || true
|
| 108 |
ls -t "${BACKUP_DIR}"/storage-*.sqlite 2>/dev/null | tail -n +6 | xargs rm -f 2>/dev/null || true
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 109 |
_SIZE=$(wc -c < "$PERSIST_DB" 2>/dev/null | tr -d ' \t\n\r' || echo "0")
|
| 110 |
echo "[PERSISTENCE] Snapshot OK: ${_SIZE} bytes synced to ${PERSIST_DB}"
|
| 111 |
else
|
|
|
|
| 58 |
RUNTIME_DIR="/root/.omniroute"
|
| 59 |
RUNTIME_DB="/root/.omniroute/storage.sqlite"
|
| 60 |
|
| 61 |
+
# Clean up legacy directory collision if storage.sqlite was created as a folder
|
| 62 |
+
if [ -d "$PERSIST_DB" ]; then
|
| 63 |
+
echo "[PERSISTENCE] Fixing directory collision: removing directory $PERSIST_DB..."
|
| 64 |
+
rm -rf "$PERSIST_DB"
|
| 65 |
+
fi
|
| 66 |
+
|
| 67 |
mkdir -p "$PERSIST_DIR" "$BACKUP_DIR" "$RUNTIME_DIR" 2>/dev/null || true
|
| 68 |
|
| 69 |
echo "[PERSISTENCE] Storage mount inspection:"
|
| 70 |
mount | grep -E 'hf|bucket|data|fuse|nfs' || echo "[STORAGE] /data info: $(df -h /data 2>&1 || true)"
|
| 71 |
|
| 72 |
+
# ββ Snapshot & State Restoration on Boot ββββββββββββββββββββββββββββββββββββββ
|
| 73 |
+
if [ -f "$PERSIST_DB" ] && [ -s "$PERSIST_DB" ]; then
|
| 74 |
_INIT_SIZE=$(wc -c < "$PERSIST_DB" 2>/dev/null | tr -d ' \t\n\r' || echo "0")
|
| 75 |
echo "[PERSISTENCE] Found OmniRoute snapshot at: ${PERSIST_DB} (${_INIT_SIZE} bytes)"
|
| 76 |
if command -v sqlite3 >/dev/null 2>&1; then
|
|
|
|
| 90 |
echo "[PERSISTENCE] No snapshot found at ${PERSIST_DB}. Initializing fresh OmniRoute database."
|
| 91 |
fi
|
| 92 |
|
| 93 |
+
# Restore supplementary state directories (oauth, credentials, runtime, gemini_cli, config_dir)
|
| 94 |
+
for _ITEM in oauth credentials runtime gemini_cli config_dir; do
|
| 95 |
+
if [ -d "${PERSIST_DIR}/${_ITEM}" ]; then
|
| 96 |
+
if [ "$_ITEM" = "gemini_cli" ]; then
|
| 97 |
+
mkdir -p /root/.gemini 2>/dev/null || true
|
| 98 |
+
cp -af "${PERSIST_DIR}/gemini_cli/"* /root/.gemini/ 2>/dev/null || true
|
| 99 |
+
elif [ "$_ITEM" = "config_dir" ]; then
|
| 100 |
+
mkdir -p /root/.config 2>/dev/null || true
|
| 101 |
+
cp -af "${PERSIST_DIR}/config_dir/"* /root/.config/ 2>/dev/null || true
|
| 102 |
+
else
|
| 103 |
+
mkdir -p "${RUNTIME_DIR}/${_ITEM}" 2>/dev/null || true
|
| 104 |
+
cp -af "${PERSIST_DIR}/${_ITEM}/"* "${RUNTIME_DIR}/${_ITEM}/" 2>/dev/null || true
|
| 105 |
+
fi
|
| 106 |
+
echo "[PERSISTENCE] Restored persistent state directory: ${_ITEM}"
|
| 107 |
+
fi
|
| 108 |
+
done
|
| 109 |
+
|
| 110 |
+
# ββ Unified Single Backup Pipeline βββββββββββββββββββββββββββββββββββββββββββ
|
| 111 |
sync_omniroute_db() {
|
| 112 |
if [ -f "$RUNTIME_DB" ] && [ -s "$RUNTIME_DB" ]; then
|
| 113 |
mkdir -p "$PERSIST_DIR" "$BACKUP_DIR" 2>/dev/null || true
|
| 114 |
+
|
| 115 |
+
# 1. SQLite WAL-aware database backup
|
| 116 |
if command -v sqlite3 >/dev/null 2>&1; then
|
| 117 |
sqlite3 "$RUNTIME_DB" ".backup '$PERSIST_DB'" 2>/dev/null || cp -f "$RUNTIME_DB" "$PERSIST_DB" 2>/dev/null || true
|
| 118 |
else
|
| 119 |
cp -f "$RUNTIME_DB" "$PERSIST_DB" 2>/dev/null || true
|
| 120 |
fi
|
| 121 |
|
| 122 |
+
# 2. Verify persistent snapshot integrity
|
| 123 |
_CHK="ok"
|
| 124 |
if command -v sqlite3 >/dev/null 2>&1; then
|
| 125 |
_CHK=$(sqlite3 "$PERSIST_DB" "PRAGMA quick_check;" 2>/dev/null || echo "failed")
|
| 126 |
fi
|
| 127 |
|
| 128 |
if [ "$_CHK" = "ok" ]; then
|
| 129 |
+
# Rotate database backups (keep last-known-good + 5 rolling snapshots)
|
| 130 |
cp -f "$PERSIST_DB" "${BACKUP_DIR}/last-known-good.sqlite" 2>/dev/null || true
|
| 131 |
TIMESTAMP=$(date +%Y%m%d-%H%M)
|
| 132 |
cp -f "$PERSIST_DB" "${BACKUP_DIR}/storage-${TIMESTAMP}.sqlite" 2>/dev/null || true
|
| 133 |
ls -t "${BACKUP_DIR}"/storage-*.sqlite 2>/dev/null | tail -n +6 | xargs rm -f 2>/dev/null || true
|
| 134 |
+
|
| 135 |
+
# 3. Synchronize supplementary state directories
|
| 136 |
+
for _ITEM in oauth credentials runtime; do
|
| 137 |
+
if [ -d "${RUNTIME_DIR}/${_ITEM}" ]; then
|
| 138 |
+
mkdir -p "${PERSIST_DIR}/${_ITEM}" 2>/dev/null || true
|
| 139 |
+
cp -af "${RUNTIME_DIR}/${_ITEM}/"* "${PERSIST_DIR}/${_ITEM}/" 2>/dev/null || true
|
| 140 |
+
fi
|
| 141 |
+
done
|
| 142 |
+
|
| 143 |
+
if [ -d "/root/.gemini" ]; then
|
| 144 |
+
mkdir -p "${PERSIST_DIR}/gemini_cli" 2>/dev/null || true
|
| 145 |
+
cp -af /root/.gemini/* "${PERSIST_DIR}/gemini_cli/" 2>/dev/null || true
|
| 146 |
+
fi
|
| 147 |
+
|
| 148 |
+
if [ -d "/root/.config" ]; then
|
| 149 |
+
mkdir -p "${PERSIST_DIR}/config_dir" 2>/dev/null || true
|
| 150 |
+
cp -af /root/.config/* "${PERSIST_DIR}/config_dir/" 2>/dev/null || true
|
| 151 |
+
fi
|
| 152 |
+
|
| 153 |
_SIZE=$(wc -c < "$PERSIST_DB" 2>/dev/null | tr -d ' \t\n\r' || echo "0")
|
| 154 |
echo "[PERSISTENCE] Snapshot OK: ${_SIZE} bytes synced to ${PERSIST_DB}"
|
| 155 |
else
|