feat: Dataset 改为有改动即同步(inotify);支持 XDG_DATA_HOME 直接接外部存储
Browse files- Dockerfile +2 -1
- README.md +11 -1
- scripts/entrypoint.sh +24 -12
Dockerfile
CHANGED
|
@@ -6,12 +6,13 @@ FROM ubuntu:24.04
|
|
| 6 |
# 避免交互式提示
|
| 7 |
ENV DEBIAN_FRONTEND=noninteractive
|
| 8 |
|
| 9 |
-
# 安装依赖:
|
| 10 |
RUN apt-get update && apt-get install -y --no-install-recommends \
|
| 11 |
ca-certificates \
|
| 12 |
curl \
|
| 13 |
tar \
|
| 14 |
git \
|
|
|
|
| 15 |
python3 \
|
| 16 |
python3-pip \
|
| 17 |
&& pip3 install --break-system-packages huggingface_hub \
|
|
|
|
| 6 |
# 避免交互式提示
|
| 7 |
ENV DEBIAN_FRONTEND=noninteractive
|
| 8 |
|
| 9 |
+
# 安装依赖:inotify-tools 用于「有改动即同步」Dataset
|
| 10 |
RUN apt-get update && apt-get install -y --no-install-recommends \
|
| 11 |
ca-certificates \
|
| 12 |
curl \
|
| 13 |
tar \
|
| 14 |
git \
|
| 15 |
+
inotify-tools \
|
| 16 |
python3 \
|
| 17 |
python3-pip \
|
| 18 |
&& pip3 install --break-system-packages huggingface_hub \
|
README.md
CHANGED
|
@@ -40,9 +40,19 @@ pinned: false
|
|
| 40 |
|
| 41 |
3. **行为**
|
| 42 |
- 启动时:从该 Dataset 拉取已有数据到 `~/.local/share/opencode`(若有)。
|
| 43 |
-
- 运行中:
|
| 44 |
- 未设置上述两个变量时,与之前一致:不恢复、不保存,重启后数据丢失。
|
| 45 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 46 |
## 参考
|
| 47 |
|
| 48 |
- [Spaces 配置说明](https://huggingface.co/docs/hub/spaces-config-reference)
|
|
|
|
| 40 |
|
| 41 |
3. **行为**
|
| 42 |
- 启动时:从该 Dataset 拉取已有数据到 `~/.local/share/opencode`(若有)。
|
| 43 |
+
- 运行中:**有改动即同步**(inotify 监听,约 20 秒防抖后上传),不再按固定间隔。
|
| 44 |
- 未设置上述两个变量时,与之前一致:不恢复、不保存,重启后数据丢失。
|
| 45 |
|
| 46 |
+
## 直接使用外部存储(自建/本地跑容器时)
|
| 47 |
+
|
| 48 |
+
若你在**自己的机器或 VPS** 上跑本镜像,希望 OpenCode **直接读写**某块盘或网络存储(不经过 Dataset 同步):
|
| 49 |
+
|
| 50 |
+
1. 把外部存储挂载到容器内某路径,例如 `/mnt/opencode-data`(NFS、云盘、本地卷均可)。
|
| 51 |
+
2. 设置环境变量:**`XDG_DATA_HOME=/mnt/opencode-data`**(可选再加 `XDG_CONFIG_HOME=/mnt/opencode-data/.config`)。
|
| 52 |
+
3. 启动容器。OpenCode 会直接读写该路径,无需 HF_TOKEN / Dataset,也不会跑任何同步脚本。
|
| 53 |
+
|
| 54 |
+
在 **Hugging Face Spaces** 里无法挂载自定义卷,因此「直接外部存储」仅适用于自建/本地部署。
|
| 55 |
+
|
| 56 |
## 参考
|
| 57 |
|
| 58 |
- [Spaces 配置说明](https://huggingface.co/docs/hub/spaces-config-reference)
|
scripts/entrypoint.sh
CHANGED
|
@@ -1,31 +1,43 @@
|
|
| 1 |
#!/bin/sh
|
| 2 |
-
# 若设置了
|
| 3 |
-
#
|
|
|
|
| 4 |
|
| 5 |
set -e
|
| 6 |
-
DATA_DIR="${HOME
|
| 7 |
OPENCODE_BIN="/home/user/.opencode/bin/opencode"
|
| 8 |
SCRIPT_DIR="/home/user/app/scripts"
|
| 9 |
-
|
| 10 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 11 |
if [ -n "$HF_TOKEN" ] && [ -n "$OPENCODE_DATASET_REPO" ]; then
|
| 12 |
-
# 从 Dataset 恢复
|
| 13 |
python3 "$SCRIPT_DIR/restore_from_dataset.py" || true
|
| 14 |
-
|
| 15 |
-
trap 'kill -TERM $OPENCODE_PID 2>/dev/null' TERM INT
|
| 16 |
$OPENCODE_BIN serve --port 7860 --hostname 0.0.0.0 \
|
| 17 |
--cors https://tacits-candy-shop.vercel.app \
|
| 18 |
--cors https://opencode-web-pearl.vercel.app &
|
| 19 |
OPENCODE_PID=$!
|
| 20 |
-
|
| 21 |
-
|
| 22 |
-
|
| 23 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
| 24 |
wait $OPENCODE_PID
|
| 25 |
exit $?
|
| 26 |
fi
|
| 27 |
|
| 28 |
-
# 未配置
|
| 29 |
exec $OPENCODE_BIN serve --port 7860 --hostname 0.0.0.0 \
|
| 30 |
--cors https://tacits-candy-shop.vercel.app \
|
| 31 |
--cors https://opencode-web-pearl.vercel.app
|
|
|
|
| 1 |
#!/bin/sh
|
| 2 |
+
# 1) 若设置了 XDG_DATA_HOME:视为直接使用外部存储(挂载点),只启动 opencode,不做任何同步。
|
| 3 |
+
# 2) 若设置了 HF_TOKEN + OPENCODE_DATASET_REPO:从 Dataset 恢复,并用 inotify 在「有改动时」同步到 Dataset。
|
| 4 |
+
# 3) 否则:直接启动 opencode serve(与原先行为一致)。
|
| 5 |
|
| 6 |
set -e
|
| 7 |
+
DATA_DIR="${XDG_DATA_HOME:-$HOME/.local/share/opencode}"
|
| 8 |
OPENCODE_BIN="/home/user/.opencode/bin/opencode"
|
| 9 |
SCRIPT_DIR="/home/user/app/scripts"
|
| 10 |
+
DEBOUNCE=20
|
| 11 |
|
| 12 |
+
# 1) 直接使用外部存储:不恢复、不同步,只启动
|
| 13 |
+
if [ -n "$XDG_DATA_HOME" ]; then
|
| 14 |
+
exec $OPENCODE_BIN serve --port 7860 --hostname 0.0.0.0 \
|
| 15 |
+
--cors https://tacits-candy-shop.vercel.app \
|
| 16 |
+
--cors https://opencode-web-pearl.vercel.app
|
| 17 |
+
fi
|
| 18 |
+
|
| 19 |
+
# 2) Dataset 模式:恢复 + 有改动就同步(inotify + 防抖)
|
| 20 |
if [ -n "$HF_TOKEN" ] && [ -n "$OPENCODE_DATASET_REPO" ]; then
|
|
|
|
| 21 |
python3 "$SCRIPT_DIR/restore_from_dataset.py" || true
|
| 22 |
+
mkdir -p "$DATA_DIR"
|
| 23 |
+
trap 'kill -TERM $OPENCODE_PID 2>/dev/null; kill $INOTIFY_PID 2>/dev/null' TERM INT
|
| 24 |
$OPENCODE_BIN serve --port 7860 --hostname 0.0.0.0 \
|
| 25 |
--cors https://tacits-candy-shop.vercel.app \
|
| 26 |
--cors https://opencode-web-pearl.vercel.app &
|
| 27 |
OPENCODE_PID=$!
|
| 28 |
+
(
|
| 29 |
+
while kill -0 $OPENCODE_PID 2>/dev/null; do
|
| 30 |
+
inotifywait -r -q -e modify,create,delete,move "$DATA_DIR" 2>/dev/null || sleep 60
|
| 31 |
+
sleep $DEBOUNCE
|
| 32 |
+
python3 "$SCRIPT_DIR/save_to_dataset.py" || true
|
| 33 |
+
done
|
| 34 |
+
) &
|
| 35 |
+
INOTIFY_PID=$!
|
| 36 |
wait $OPENCODE_PID
|
| 37 |
exit $?
|
| 38 |
fi
|
| 39 |
|
| 40 |
+
# 3) 未配置:直接启动
|
| 41 |
exec $OPENCODE_BIN serve --port 7860 --hostname 0.0.0.0 \
|
| 42 |
--cors https://tacits-candy-shop.vercel.app \
|
| 43 |
--cors https://opencode-web-pearl.vercel.app
|