tao-shen Cursor commited on
Commit
7472e7a
·
1 Parent(s): 140619f

feat: Dataset 改为有改动即同步(inotify);支持 XDG_DATA_HOME 直接接外部存储

Browse files
Files changed (3) hide show
  1. Dockerfile +2 -1
  2. README.md +11 -1
  3. scripts/entrypoint.sh +24 -12
Dockerfile CHANGED
@@ -6,12 +6,13 @@ FROM ubuntu:24.04
6
  # 避免交互式提示
7
  ENV DEBIAN_FRONTEND=noninteractive
8
 
9
- # 安装依赖:curl/tar/git 用于 opencode,python3/huggingface_hub 用于 Dataset 持久化
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
- - 运行中: 5 分钟把当前数据上传回该 Dataset
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
- # 若设置了 HF_TOKEN 与 OPENCODE_DATASET_REPO则从 Dataset 恢复并定期保存到 Dataset;
3
- # 否则直接启动 opencode serve(与原先行为一致)
 
4
 
5
  set -e
6
- DATA_DIR="${HOME}/.local/share/opencode"
7
  OPENCODE_BIN="/home/user/.opencode/bin/opencode"
8
  SCRIPT_DIR="/home/user/app/scripts"
9
- SAVE_INTERVAL=300
10
 
 
 
 
 
 
 
 
 
11
  if [ -n "$HF_TOKEN" ] && [ -n "$OPENCODE_DATASET_REPO" ]; then
12
- # 从 Dataset 恢复
13
  python3 "$SCRIPT_DIR/restore_from_dataset.py" || true
14
- # 后台启动 opencode,并定期保存到 Dataset
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
- while kill -0 $OPENCODE_PID 2>/dev/null; do
21
- sleep $SAVE_INTERVAL
22
- python3 "$SCRIPT_DIR/save_to_dataset.py" || true
23
- done
 
 
 
 
24
  wait $OPENCODE_PID
25
  exit $?
26
  fi
27
 
28
- # 未配置 Dataset 时直接启动(与原先 CMD 一致)
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