Skip to content

Commit 2b6873e

Browse files
committed
fix(deploy): build from clean release checkout
1 parent b4a418b commit 2b6873e

3 files changed

Lines changed: 26 additions & 24 deletions

File tree

.github/workflows/deploy.yml

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,8 @@ jobs:
1414
username: root
1515
key: ${{ secrets.VPS_SSH_KEY }}
1616
script: |
17-
cd /root/cross-subject-knowledge
18-
git pull origin main
17+
RELEASE_ROOT="$(mktemp -d /tmp/csk-release.XXXXXX)"
18+
git clone --depth 1 --branch main https://github.com/ieduer/cross-subject-knowledge.git "$RELEASE_ROOT"
19+
cd "$RELEASE_ROOT"
1920
chmod +x scripts/deploy_vps.sh
20-
./scripts/deploy_vps.sh
21+
RUNTIME_ROOT=/root/cross-subject-knowledge ./scripts/deploy_vps.sh

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -290,7 +290,7 @@ docker run -d --name textbook-knowledge \
290290
项目利用 GitHub Actions 实现了完全自动化的持续部署:
291291
1. 开发者在本地修改代码后,`git push` 到 GitHub `main` 分支。
292292
2. GitHub Actions 自动触发,SSH 连入生产服务器 (VPS: `sun.bdfz.net`)。
293-
3. 在 VPS 上执行 `git pull` 拉取最新代码
293+
3. 在 VPS 上创建临时的干净 release checkout,避免生产目录里历史热补丁或临时改动阻塞发布
294294
4. 在 VPS 上先构建新镜像,再停旧容器,避免“构建失败直接打挂线上”。
295295
5. 新容器通过 `/api/health` 健康检查后才算部署成功;失败则自动回滚到上一镜像。
296296
6. 运行时模型缓存保存在宿主机 `state/cache/`,避免每次发版都把 Hugging Face 缓存烘进镜像。

scripts/deploy_vps.sh

Lines changed: 21 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,29 @@
11
#!/usr/bin/env bash
22
set -euo pipefail
33

4-
APP_ROOT="/root/cross-subject-knowledge"
4+
SOURCE_ROOT="$(cd "$(dirname "$0")/.." && pwd)"
5+
RUNTIME_ROOT="${RUNTIME_ROOT:-/root/cross-subject-knowledge}"
56
CONTAINER_NAME="textbook-knowledge"
67
REPO_NAME="textbook-knowledge"
78
EMBEDDER_NAME="${EMBEDDER_NAME:-BAAI/bge-m3}"
89

9-
cd "$APP_ROOT"
10+
cd "$SOURCE_ROOT"
1011

1112
mkdir -p \
12-
data/index \
13-
state/logs \
14-
state/cache/huggingface \
15-
state/cache/sentence_transformers \
16-
state/tmp \
17-
state/batch
18-
19-
if [ ! -f data/index/textbook_mineru_fts.db ]; then
20-
echo "ERROR: missing runtime DB data/index/textbook_mineru_fts.db"
13+
"${RUNTIME_ROOT}/data/index" \
14+
"${RUNTIME_ROOT}/state/logs" \
15+
"${RUNTIME_ROOT}/state/cache/huggingface" \
16+
"${RUNTIME_ROOT}/state/cache/sentence_transformers" \
17+
"${RUNTIME_ROOT}/state/tmp" \
18+
"${RUNTIME_ROOT}/state/batch"
19+
20+
if [ ! -f "${RUNTIME_ROOT}/data/index/textbook_mineru_fts.db" ]; then
21+
echo "ERROR: missing runtime DB ${RUNTIME_ROOT}/data/index/textbook_mineru_fts.db"
2122
exit 1
2223
fi
2324

24-
if [ ! -f data/index/textbook_chunks.index ]; then
25-
echo "ERROR: missing runtime FAISS index data/index/textbook_chunks.index"
25+
if [ ! -f "${RUNTIME_ROOT}/data/index/textbook_chunks.index" ]; then
26+
echo "ERROR: missing runtime FAISS index ${RUNTIME_ROOT}/data/index/textbook_chunks.index"
2627
exit 1
2728
fi
2829

@@ -33,7 +34,7 @@ backup_tag="${REPO_NAME}:pre-${build_stamp}"
3334
rollback_image=""
3435

3536
host_cache_has_model() {
36-
find "${APP_ROOT}/state/cache/huggingface" -type f | grep -q .
37+
find "${RUNTIME_ROOT}/state/cache/huggingface" -type f | grep -q .
3738
}
3839

3940
echo "=== deploy start $(date -u '+%Y-%m-%d %H:%M:%S UTC') commit=${commit_sha} ==="
@@ -53,7 +54,7 @@ docker build --pull -t "${build_tag}" -t "${REPO_NAME}:latest" .
5354
if ! host_cache_has_model; then
5455
echo "=== bootstrapping host model cache ==="
5556
if docker ps -a --format '{{.Names}}' | grep -qx "${CONTAINER_NAME}"; then
56-
docker cp "${CONTAINER_NAME}:/root/.cache/huggingface/." "${APP_ROOT}/state/cache/huggingface/" >/dev/null 2>&1 || true
57+
docker cp "${CONTAINER_NAME}:/root/.cache/huggingface/." "${RUNTIME_ROOT}/state/cache/huggingface/" >/dev/null 2>&1 || true
5758
fi
5859
fi
5960

@@ -63,7 +64,7 @@ if ! host_cache_has_model; then
6364
-e HF_HOME=/state/cache/huggingface \
6465
-e SENTENCE_TRANSFORMERS_HOME=/state/cache/sentence_transformers \
6566
-e TRANSFORMERS_CACHE=/state/cache/huggingface/transformers \
66-
-v "${APP_ROOT}/state:/state" \
67+
-v "${RUNTIME_ROOT}/state:/state" \
6768
"${build_tag}" \
6869
python -c "from sentence_transformers import SentenceTransformer; SentenceTransformer('${EMBEDDER_NAME}')"
6970
fi
@@ -81,8 +82,8 @@ docker run -d \
8182
-e HF_HOME=/state/cache/huggingface \
8283
-e SENTENCE_TRANSFORMERS_HOME=/state/cache/sentence_transformers \
8384
-e TRANSFORMERS_CACHE=/state/cache/huggingface/transformers \
84-
-v "${APP_ROOT}/data:/data" \
85-
-v "${APP_ROOT}/state:/state" \
85+
-v "${RUNTIME_ROOT}/data:/data" \
86+
-v "${RUNTIME_ROOT}/state:/state" \
8687
"${build_tag}" >/dev/null
8788

8889
healthy="false"
@@ -114,8 +115,8 @@ if [ "${healthy}" != "true" ]; then
114115
-e HF_HOME=/state/cache/huggingface \
115116
-e SENTENCE_TRANSFORMERS_HOME=/state/cache/sentence_transformers \
116117
-e TRANSFORMERS_CACHE=/state/cache/huggingface/transformers \
117-
-v "${APP_ROOT}/data:/data" \
118-
-v "${APP_ROOT}/state:/state" \
118+
-v "${RUNTIME_ROOT}/data:/data" \
119+
-v "${RUNTIME_ROOT}/state:/state" \
119120
"${rollback_image}" >/dev/null
120121
fi
121122
exit 1

0 commit comments

Comments
 (0)