Files
mole404 c9a4ea1471 docs: README 整篇重写为介绍 + 部署;补 CI/构建卫生
README(659 行 → 176 行):只保留「这是什么」与「怎么部署/维护」——快速开始、首次安装、
升级(注明不需要 --force-recreate)、回滚(给真实存在的 sha-<commit> 标签)、备份与恢复
(整目录 tar,并说明 SQLite 开了 WAL 会短暂出现 -wal/-shm)、常见配置(端口/证书路径/
APACHE_* 六个变量与实际默认值)、许可与致谢。不再记录任何修复史或差异逐条。
所有具体值(镜像名、容器名、端口、卷路径、WEB_PORT/HTTPS_PORT、MPM 默认值、PHP/Laravel
版本、回滚标签)都对着源码与实机逐条核过。

构建与 CI:
- .dockerignore 补 src/storage/logs/*(+ 保留 .gitignore 占位):本机开发日志会被
  COPY src/ 带进镜像(含本机绝对路径与错误栈)。用一份 moby 语义 matcher 验过排除生效、
  且不影响 fontawesome 字体等构建必需品。
- update-composer-lock.yaml:两处 curl … | php 改成与 Dockerfile 同款「先落盘 → 官方
  installer.sig → 校验 96 位 hex → sha384sum -c - → 再执行 → 删临时文件」(哈希不写死);
  注释里的 9.52.17 与「5 条公告」校正为 9.52.22 / 4 条(OSV 实查)。
- build-image.yaml:扩展自证那段的结论文案改成与实际一致(硬断言只有 pdo_sqlite,
  其余仅打印供人工比对)——sqlite3 对本站不是必需,钉死它会在无害变动时误红。
- tools/vendor-upstream.sh:去掉不存在的 test/run.sh,改为 cd test && npm test。
2026-09-30 09:03:04 +08:00

88 lines
3.6 KiB
Bash
Executable File
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/usr/bin/env bash
# ---------------------------------------------------------------------------
# 用途:把本仓库 src/ 换成上游另一个 commit 的完整快照(重新 vendor)。
#
# 什么时候用:上游万一又有提交、你想跟上去的时候。
# 注意:三个补丁文件(见 PATCHED 列表)不会被覆盖 —— 脚本会把上游版本存到
# /tmp 下并逐条打印 diff,需要你确认后把补丁重新贴到 src/ 里(或反过来弃用)。
# 跑完必须:① 更新 Dockerfile 里的 LSKY_COMMIT 与两道自证的 md5
# ② 重新生成 patches/ios-longpress.patch
# ③ 跑 test/ 的行为测试(cd test && npm test)
#
# 依赖:git、md5sum(需要能访问 github.com)
# 用法:bash tools/vendor-upstream.sh <上游 commit>
# ---------------------------------------------------------------------------
set -euo pipefail
cd "$(dirname "$0")/.."
COMMIT="${1:-}"
if [ -z "$COMMIT" ]; then
echo "用法:bash tools/vendor-upstream.sh <上游 commit>" >&2
exit 2
fi
case "$COMMIT" in
*[!0-9a-f]*) echo "看起来不像 commit SHA:$COMMIT" >&2; exit 2 ;;
esac
PATCHED="resources/js/context-js.js
public/js/context-js/context-js.js
resources/views/user/images.blade.php"
TMP="$(mktemp -d)"
trap 'rm -rf "$TMP"' EXIT
echo "[1/4] 拉取上游快照 ${COMMIT:0:9} …"
git init -q "$TMP/up"
git -C "$TMP/up" remote add origin https://github.com/lsky-org/lsky-pro.git
git -C "$TMP/up" fetch -q --depth 1 origin "$COMMIT"
git -C "$TMP/up" checkout -q FETCH_HEAD
REAL="$(git -C "$TMP/up" rev-parse HEAD)"
echo " 实际 commit = $REAL"
[ "$REAL" = "$COMMIT" ] || { echo "❌ 拉到的不是指定 commit,先停下" >&2; exit 1; }
# 源码已经 vendored 进仓库,src/ 下的改动就是产品本身 —— 擦除前必须确认都已提交,
# 否则"重新 vendor"会把它们静默抹掉(这是唯一一处不可逆操作)。
echo "[2/5] 安全检查:src/ 里不能有未提交的改动 …"
if [ -n "$(git status --porcelain -- src)" ]; then
echo "❌ src/ 下有未提交的改动,请先 commit 或 stash,否则跑下去会丢:" >&2
git status --short -- src >&2
exit 1
fi
echo " src/ 工作区干净 ✅"
echo "[3/5] 把补丁文件先留档(免得被覆盖)…"
mkdir -p "$TMP/patched"
for f in $PATCHED; do
cp -a "src/$f" "$TMP/patched/$(echo "$f" | tr / _)"
done
echo "[4/5] 替换 src/ …"
find src -mindepth 1 -maxdepth 1 -exec rm -rf {} +
tar -C "$TMP/up" --exclude=./.git -cf - . | tar -C src -xf -
for f in $PATCHED; do
cp -a "$TMP/patched/$(echo "$f" | tr / _)" "src/$f"
done
echo " 完成,src/ 现在 = 上游 $REAL + 我们的三个补丁文件"
echo
echo "[5/5] 上游新版里这三个文件与我们的补丁版本的差异(人工看,必要时重新贴补丁):"
for f in $PATCHED; do
echo "---- $f"
if diff -q "$TMP/up/$f" "src/$f" >/dev/null; then
echo " 上游与我们的一致(说明这是上游也改过的文件,补丁可能已合并/被覆盖,务必人工确认)"
else
diff -u "$TMP/up/$f" "src/$f" | head -80 || true
fi
done
cat <<EOF
接下来必须做的事:
1) 更新 Dockerfile 里的 ARG LSKY_COMMIT=$REAL
2) 更新「自证 1」(上游纯净性)与「自证 2」(补丁产物)里的 md5 期望值:
cd src && printf '%s\n' '...' | md5sum -c - # 生成/校验用这条
3) 重新生成 patches/ios-longpress.patch(bash tools/diff-vs-upstream.sh)
4) 跑行为测试:cd test && npm ci && npm test
5) 提交后看 CI:镜像自证 + 真容器三场景会给出最终结论
EOF