Delete start.sh
Browse files
start.sh
DELETED
|
@@ -1,155 +0,0 @@
|
|
| 1 |
-
#!/usr/bin/env bash
|
| 2 |
-
set -euo pipefail
|
| 3 |
-
|
| 4 |
-
PORT="${PORT:-7860}"
|
| 5 |
-
HOST="${HOST:-0.0.0.0}"
|
| 6 |
-
|
| 7 |
-
export HOME="${HOME:-/home/node}"
|
| 8 |
-
|
| 9 |
-
# 1) 公网安全:必须有 basic auth 密码
|
| 10 |
-
if [[ -z "${OPENCODE_SERVER_PASSWORD:-}" ]]; then
|
| 11 |
-
echo "[FATAL] OPENCODE_SERVER_PASSWORD is not set. Refusing to start."
|
| 12 |
-
exit 1
|
| 13 |
-
fi
|
| 14 |
-
|
| 15 |
-
# 2) 关键修复:把 huggingface_hub / hf-xet 的本地目录指到可写位置
|
| 16 |
-
# 官方定义:HF_HOME 是根目录;HF_XET_CACHE 默认在 $HF_HOME/xet <!--citation:1-->
|
| 17 |
-
export HF_HOME="${HF_HOME:-${HOME}/.cache/huggingface}"
|
| 18 |
-
export HF_HUB_CACHE="${HF_HUB_CACHE:-${HF_HOME}/hub}"
|
| 19 |
-
export HF_XET_CACHE="${HF_XET_CACHE:-${HF_HOME}/xet}"
|
| 20 |
-
export HF_ASSETS_CACHE="${HF_ASSETS_CACHE:-${HF_HOME}/assets}"
|
| 21 |
-
export HF_HUB_DISABLE_PROGRESS_BARS=1
|
| 22 |
-
|
| 23 |
-
mkdir -p "${HF_HOME}" "${HF_HUB_CACHE}" "${HF_XET_CACHE}" "${HF_ASSETS_CACHE}"
|
| 24 |
-
|
| 25 |
-
# 3) 持久化参数
|
| 26 |
-
BACKUP_INTERVAL_SECONDS="${BACKUP_INTERVAL_SECONDS:-120}"
|
| 27 |
-
BUCKET_PREFIX="${BUCKET_PREFIX:-opencode-backup}"
|
| 28 |
-
BACKUP_AUTH_JSON="${BACKUP_AUTH_JSON:-0}"
|
| 29 |
-
|
| 30 |
-
bucket_ready() {
|
| 31 |
-
[[ -n "${HF_TOKEN:-}" && -n "${HF_BUCKET_ID:-}" ]]
|
| 32 |
-
}
|
| 33 |
-
|
| 34 |
-
# OpenCode paths
|
| 35 |
-
LOCAL_CONFIG_DIR="${HOME}/.config/opencode"
|
| 36 |
-
LOCAL_DATA_DIR="${HOME}/.local/share/opencode"
|
| 37 |
-
LOCAL_DB="${LOCAL_DATA_DIR}/opencode.db"
|
| 38 |
-
LOCAL_AUTH="${LOCAL_DATA_DIR}/auth.json"
|
| 39 |
-
LOCAL_OPENCODE_JSON="${LOCAL_CONFIG_DIR}/opencode.json"
|
| 40 |
-
|
| 41 |
-
mkdir -p "${LOCAL_CONFIG_DIR}" "${LOCAL_DATA_DIR}"
|
| 42 |
-
|
| 43 |
-
REMOTE_BASE="hf://buckets/${HF_BUCKET_ID}/${BUCKET_PREFIX}"
|
| 44 |
-
REMOTE_DB="${REMOTE_BASE}/opencode.db"
|
| 45 |
-
REMOTE_AUTH="${REMOTE_BASE}/auth.json"
|
| 46 |
-
REMOTE_OPENCODE_JSON="${REMOTE_BASE}/opencode.json"
|
| 47 |
-
|
| 48 |
-
hf_cp() {
|
| 49 |
-
hf buckets cp --token "${HF_TOKEN}" "$1" "$2"
|
| 50 |
-
}
|
| 51 |
-
|
| 52 |
-
hf_cp_maybe() {
|
| 53 |
-
set +e
|
| 54 |
-
hf_cp "$1" "$2"
|
| 55 |
-
local code=$?
|
| 56 |
-
set -e
|
| 57 |
-
return $code
|
| 58 |
-
}
|
| 59 |
-
|
| 60 |
-
echo "===== Startup diagnostics ====="
|
| 61 |
-
echo "[INFO] id: $(id || true)"
|
| 62 |
-
echo "[INFO] HOME=${HOME}"
|
| 63 |
-
echo "[INFO] HF_HOME=${HF_HOME}"
|
| 64 |
-
echo "[INFO] HF_XET_CACHE=${HF_XET_CACHE}"
|
| 65 |
-
echo "[INFO] HF_BUCKET_ID=${HF_BUCKET_ID:-<empty>}"
|
| 66 |
-
echo "[INFO] bucket_ready? $(bucket_ready && echo yes || echo no)"
|
| 67 |
-
echo "[INFO] Remote base: ${REMOTE_BASE}"
|
| 68 |
-
|
| 69 |
-
# (可选)打印 /data 挂载状态,便于你继续跟踪 HF 的 mount 权限问题
|
| 70 |
-
if [[ -d "/data" ]]; then
|
| 71 |
-
echo "[INFO] /data perms:"
|
| 72 |
-
ls -ld /data || true
|
| 73 |
-
echo "[INFO] /data mount:"
|
| 74 |
-
grep -E "[[:space:]]/data[[:space:]]" /proc/mounts || true
|
| 75 |
-
fi
|
| 76 |
-
|
| 77 |
-
# 4) 启动前:尽力从 bucket 恢复(首次没有文件会提示 not found,属正常)
|
| 78 |
-
if bucket_ready; then
|
| 79 |
-
echo "[INFO] Restoring from bucket (best effort)..."
|
| 80 |
-
|
| 81 |
-
if [[ ! -f "${LOCAL_OPENCODE_JSON}" ]]; then
|
| 82 |
-
hf_cp_maybe "${REMOTE_OPENCODE_JSON}" "${LOCAL_OPENCODE_JSON}" \
|
| 83 |
-
&& echo "[INFO] Restored opencode.json" \
|
| 84 |
-
|| echo "[INFO] No remote opencode.json (ok on first run)."
|
| 85 |
-
fi
|
| 86 |
-
|
| 87 |
-
if [[ ! -f "${LOCAL_DB}" ]]; then
|
| 88 |
-
hf_cp_maybe "${REMOTE_DB}" "${LOCAL_DB}" \
|
| 89 |
-
&& echo "[INFO] Restored opencode.db" \
|
| 90 |
-
|| echo "[INFO] No remote opencode.db (ok on first run)."
|
| 91 |
-
fi
|
| 92 |
-
|
| 93 |
-
if [[ "${BACKUP_AUTH_JSON}" == "1" && ! -f "${LOCAL_AUTH}" ]]; then
|
| 94 |
-
hf_cp_maybe "${REMOTE_AUTH}" "${LOCAL_AUTH}" \
|
| 95 |
-
&& echo "[INFO] Restored auth.json" \
|
| 96 |
-
|| echo "[INFO] No remote auth.json (ok on first run)."
|
| 97 |
-
fi
|
| 98 |
-
else
|
| 99 |
-
echo "[WARN] Persistence disabled: HF_TOKEN or HF_BUCKET_ID missing."
|
| 100 |
-
fi
|
| 101 |
-
|
| 102 |
-
# 5) 确保 config 存在(env 注入优先)
|
| 103 |
-
if [[ -n "${OPENCODE_CONFIG_CONTENT:-}" ]]; then
|
| 104 |
-
echo "[INFO] Writing opencode.json from OPENCODE_CONFIG_CONTENT"
|
| 105 |
-
printf "%s" "${OPENCODE_CONFIG_CONTENT}" > "${LOCAL_OPENCODE_JSON}"
|
| 106 |
-
elif [[ ! -f "${LOCAL_OPENCODE_JSON}" ]]; then
|
| 107 |
-
echo "[INFO] No opencode.json found; copying example."
|
| 108 |
-
cp -f "${HOME}/opencode.json.example" "${LOCAL_OPENCODE_JSON}"
|
| 109 |
-
fi
|
| 110 |
-
|
| 111 |
-
# 6) 后台备份:SQLite 用 .backup 生成一致性快照再上传
|
| 112 |
-
backup_loop() {
|
| 113 |
-
echo "[INFO] Backup loop started (interval=${BACKUP_INTERVAL_SECONDS}s)."
|
| 114 |
-
while true; do
|
| 115 |
-
if bucket_ready; then
|
| 116 |
-
if [[ -f "${LOCAL_DB}" ]]; then
|
| 117 |
-
TMP_DB="/tmp/opencode.db.backup"
|
| 118 |
-
if sqlite3 "${LOCAL_DB}" ".backup '${TMP_DB}'" >/dev/null 2>&1; then
|
| 119 |
-
hf_cp_maybe "${TMP_DB}" "${REMOTE_DB}" \
|
| 120 |
-
&& echo "[INFO] Uploaded DB -> ${REMOTE_DB}" \
|
| 121 |
-
|| echo "[WARN] Failed to upload DB."
|
| 122 |
-
else
|
| 123 |
-
echo "[WARN] sqlite3 .backup failed."
|
| 124 |
-
fi
|
| 125 |
-
fi
|
| 126 |
-
|
| 127 |
-
if [[ -f "${LOCAL_OPENCODE_JSON}" ]]; then
|
| 128 |
-
hf_cp_maybe "${LOCAL_OPENCODE_JSON}" "${REMOTE_OPENCODE_JSON}" \
|
| 129 |
-
&& echo "[INFO] Uploaded opencode.json -> ${REMOTE_OPENCODE_JSON}" \
|
| 130 |
-
|| echo "[WARN] Failed to upload opencode.json."
|
| 131 |
-
fi
|
| 132 |
-
|
| 133 |
-
if [[ "${BACKUP_AUTH_JSON}" == "1" && -f "${LOCAL_AUTH}" ]]; then
|
| 134 |
-
hf_cp_maybe "${LOCAL_AUTH}" "${REMOTE_AUTH}" \
|
| 135 |
-
&& echo "[INFO] Uploaded auth.json -> ${REMOTE_AUTH}" \
|
| 136 |
-
|| echo "[WARN] Failed to upload auth.json."
|
| 137 |
-
fi
|
| 138 |
-
fi
|
| 139 |
-
sleep "${BACKUP_INTERVAL_SECONDS}"
|
| 140 |
-
done
|
| 141 |
-
}
|
| 142 |
-
|
| 143 |
-
backup_loop &
|
| 144 |
-
|
| 145 |
-
# 7) 启动 opencode web
|
| 146 |
-
export XDG_CACHE_HOME="/tmp/.cache"
|
| 147 |
-
export TMPDIR="/tmp"
|
| 148 |
-
mkdir -p "${XDG_CACHE_HOME}" "${TMPDIR}"
|
| 149 |
-
|
| 150 |
-
echo "[INFO] Starting: opencode web --hostname ${HOST} --port ${PORT}"
|
| 151 |
-
exec opencode web \
|
| 152 |
-
--hostname "${HOST}" \
|
| 153 |
-
--port "${PORT}" \
|
| 154 |
-
--print-logs \
|
| 155 |
-
--log-level INFO
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|