pin reactive resume image digest
This commit is contained in:
@@ -31,7 +31,7 @@ services:
|
|||||||
retries: 10
|
retries: 10
|
||||||
|
|
||||||
reactive_resume_app:
|
reactive_resume_app:
|
||||||
image: amruthpillai/reactive-resume:latest
|
image: amruthpillai/reactive-resume@sha256:b760446c4301af067e7d595537a877e378363aa6ce921b7349e62983621826aa
|
||||||
restart: unless-stopped
|
restart: unless-stopped
|
||||||
depends_on:
|
depends_on:
|
||||||
reactive_resume_permissions:
|
reactive_resume_permissions:
|
||||||
@@ -97,7 +97,7 @@ services:
|
|||||||
# QTS/Container Station 版默认启动 frpc。
|
# QTS/Container Station 版默认启动 frpc。
|
||||||
# 为避免 QTS 把 frpc 配置文件挂载路径改到应用临时目录,这里不挂载 frpc.yaml,
|
# 为避免 QTS 把 frpc 配置文件挂载路径改到应用临时目录,这里不挂载 frpc.yaml,
|
||||||
# 而是在容器启动时自动写入 /tmp/frpc.toml。
|
# 而是在容器启动时自动写入 /tmp/frpc.toml。
|
||||||
image: snowdreamtech/frpc:latest
|
image: fatedier/frpc:v0.68.0
|
||||||
restart: unless-stopped
|
restart: unless-stopped
|
||||||
entrypoint: ["/bin/sh"]
|
entrypoint: ["/bin/sh"]
|
||||||
command:
|
command:
|
||||||
|
|||||||
@@ -19,7 +19,7 @@ services:
|
|||||||
retries: 10
|
retries: 10
|
||||||
|
|
||||||
reactive-resume:
|
reactive-resume:
|
||||||
image: amruthpillai/reactive-resume:latest
|
image: amruthpillai/reactive-resume@sha256:b760446c4301af067e7d595537a877e378363aa6ce921b7349e62983621826aa
|
||||||
restart: unless-stopped
|
restart: unless-stopped
|
||||||
env_file:
|
env_file:
|
||||||
- .env
|
- .env
|
||||||
|
|||||||
6
dist/SHA256SUMS
vendored
6
dist/SHA256SUMS
vendored
@@ -1,3 +1,3 @@
|
|||||||
fa3b2b64a9afd7af60f57cfda8431af4e171cc1cdba4a6a2b89d50000a574f54 reactive-resume-clean-install-20260520.zip
|
62d2a619dbade4a2fad0a9fbf4ff3389fed7afd9b5556b5d1e0a414d69ccd9dd reactive-resume-clean-install-20260520.zip
|
||||||
6724400586b14de9a954dcb22e1b7150d8339b3ebf07bb5b0685a5aa60009bc9 reactive-resume-personal-direct-20260520.zip
|
b737f2e75437c25e32760ca81532c27bfc0f5455e12afca14a3439af8b2851c1 reactive-resume-personal-direct-20260520.zip
|
||||||
21e588dc25e90e358f823175cfab7ef4b4880fed959bab8d9d7c65200848b6d0 reactive-resume-personal-qnap-nas-20260520.zip
|
c3414564cadd093e93b2bf9769bbb9eafc8e760cf98a216340516db2aea3007f reactive-resume-personal-qnap-nas-20260520.zip
|
||||||
|
|||||||
6
dist/SHA256SUMS-20260520
vendored
6
dist/SHA256SUMS-20260520
vendored
@@ -1,3 +1,3 @@
|
|||||||
fa3b2b64a9afd7af60f57cfda8431af4e171cc1cdba4a6a2b89d50000a574f54 reactive-resume-clean-install-20260520.zip
|
62d2a619dbade4a2fad0a9fbf4ff3389fed7afd9b5556b5d1e0a414d69ccd9dd reactive-resume-clean-install-20260520.zip
|
||||||
6724400586b14de9a954dcb22e1b7150d8339b3ebf07bb5b0685a5aa60009bc9 reactive-resume-personal-direct-20260520.zip
|
b737f2e75437c25e32760ca81532c27bfc0f5455e12afca14a3439af8b2851c1 reactive-resume-personal-direct-20260520.zip
|
||||||
21e588dc25e90e358f823175cfab7ef4b4880fed959bab8d9d7c65200848b6d0 reactive-resume-personal-qnap-nas-20260520.zip
|
c3414564cadd093e93b2bf9769bbb9eafc8e760cf98a216340516db2aea3007f reactive-resume-personal-qnap-nas-20260520.zip
|
||||||
|
|||||||
BIN
dist/reactive-resume-clean-install-20260520.zip
vendored
BIN
dist/reactive-resume-clean-install-20260520.zip
vendored
Binary file not shown.
BIN
dist/reactive-resume-personal-direct-20260520.zip
vendored
BIN
dist/reactive-resume-personal-direct-20260520.zip
vendored
Binary file not shown.
BIN
dist/reactive-resume-personal-qnap-nas-20260520.zip
vendored
BIN
dist/reactive-resume-personal-qnap-nas-20260520.zip
vendored
Binary file not shown.
@@ -34,7 +34,7 @@ services:
|
|||||||
retries: 10
|
retries: 10
|
||||||
|
|
||||||
reactive_resume_app:
|
reactive_resume_app:
|
||||||
image: amruthpillai/reactive-resume:latest
|
image: amruthpillai/reactive-resume@sha256:b760446c4301af067e7d595537a877e378363aa6ce921b7349e62983621826aa
|
||||||
restart: unless-stopped
|
restart: unless-stopped
|
||||||
depends_on:
|
depends_on:
|
||||||
reactive_resume_permissions:
|
reactive_resume_permissions:
|
||||||
@@ -68,7 +68,7 @@ services:
|
|||||||
start_period: 30s
|
start_period: 30s
|
||||||
|
|
||||||
reactive_resume_frpc:
|
reactive_resume_frpc:
|
||||||
image: snowdreamtech/frpc:latest
|
image: fatedier/frpc:v0.68.0
|
||||||
restart: unless-stopped
|
restart: unless-stopped
|
||||||
entrypoint: ["/bin/sh"]
|
entrypoint: ["/bin/sh"]
|
||||||
command:
|
command:
|
||||||
|
|||||||
@@ -22,7 +22,7 @@ services:
|
|||||||
retries: 10
|
retries: 10
|
||||||
|
|
||||||
reactive-resume:
|
reactive-resume:
|
||||||
image: amruthpillai/reactive-resume:latest
|
image: amruthpillai/reactive-resume@sha256:b760446c4301af067e7d595537a877e378363aa6ce921b7349e62983621826aa
|
||||||
restart: unless-stopped
|
restart: unless-stopped
|
||||||
env_file:
|
env_file:
|
||||||
- .env
|
- .env
|
||||||
|
|||||||
@@ -19,7 +19,7 @@ services:
|
|||||||
retries: 10
|
retries: 10
|
||||||
|
|
||||||
reactive-resume:
|
reactive-resume:
|
||||||
image: amruthpillai/reactive-resume:latest
|
image: amruthpillai/reactive-resume@sha256:b760446c4301af067e7d595537a877e378363aa6ce921b7349e62983621826aa
|
||||||
restart: unless-stopped
|
restart: unless-stopped
|
||||||
entrypoint: ["/bin/sh", "/opt/reactive-resume-patches/reactive-resume-entrypoint.sh"]
|
entrypoint: ["/bin/sh", "/opt/reactive-resume-patches/reactive-resume-entrypoint.sh"]
|
||||||
env_file:
|
env_file:
|
||||||
|
|||||||
@@ -42,7 +42,7 @@ services:
|
|||||||
retries: 10
|
retries: 10
|
||||||
|
|
||||||
reactive_resume_app:
|
reactive_resume_app:
|
||||||
image: amruthpillai/reactive-resume:latest
|
image: amruthpillai/reactive-resume@sha256:b760446c4301af067e7d595537a877e378363aa6ce921b7349e62983621826aa
|
||||||
restart: unless-stopped
|
restart: unless-stopped
|
||||||
entrypoint: ["/bin/sh", "/opt/reactive-resume-patches/reactive-resume-entrypoint.sh"]
|
entrypoint: ["/bin/sh", "/opt/reactive-resume-patches/reactive-resume-entrypoint.sh"]
|
||||||
depends_on:
|
depends_on:
|
||||||
@@ -144,7 +144,7 @@ services:
|
|||||||
condition: service_healthy
|
condition: service_healthy
|
||||||
|
|
||||||
reactive_resume_frpc:
|
reactive_resume_frpc:
|
||||||
image: snowdreamtech/frpc:latest
|
image: fatedier/frpc:v0.68.0
|
||||||
restart: unless-stopped
|
restart: unless-stopped
|
||||||
environment:
|
environment:
|
||||||
HTTP_PROXY: http://192.168.3.12:7893
|
HTTP_PROXY: http://192.168.3.12:7893
|
||||||
|
|||||||
@@ -9,7 +9,8 @@ QNAP_PATCH_DIR="$ROOT_DIR/packages/reactive-resume-personal-qnap-nas/patches"
|
|||||||
DIRECT_PATCH_DIR="$ROOT_DIR/packages/reactive-resume-personal-direct/patches"
|
DIRECT_PATCH_DIR="$ROOT_DIR/packages/reactive-resume-personal-direct/patches"
|
||||||
QNAP_ZIP="$ROOT_DIR/dist/reactive-resume-personal-qnap-nas-20260520.zip"
|
QNAP_ZIP="$ROOT_DIR/dist/reactive-resume-personal-qnap-nas-20260520.zip"
|
||||||
DIRECT_ZIP="$ROOT_DIR/dist/reactive-resume-personal-direct-20260520.zip"
|
DIRECT_ZIP="$ROOT_DIR/dist/reactive-resume-personal-direct-20260520.zip"
|
||||||
IMAGE="amruthpillai/reactive-resume:latest"
|
IMAGE_REPO="amruthpillai/reactive-resume"
|
||||||
|
IMAGE_INDEX="$IMAGE_REPO@sha256:b760446c4301af067e7d595537a877e378363aa6ce921b7349e62983621826aa"
|
||||||
PROJECT="reactive-resume-personal"
|
PROJECT="reactive-resume-personal"
|
||||||
|
|
||||||
log() {
|
log() {
|
||||||
@@ -64,6 +65,12 @@ unzip -l "$DIRECT_ZIP" | grep -q 'reactive-resume-personal-direct/patches/reacti
|
|||||||
if unzip -p "$QNAP_ZIP" 'reactive_resume/*' 2>/dev/null | grep -E 'isiseg|10004|Reactive_Resume_Personal|/share/Container/Reactive_Resume_Personal' >/dev/null; then
|
if unzip -p "$QNAP_ZIP" 'reactive_resume/*' 2>/dev/null | grep -E 'isiseg|10004|Reactive_Resume_Personal|/share/Container/Reactive_Resume_Personal' >/dev/null; then
|
||||||
fail "QNAP zip 中仍有旧域名、旧端口或旧路径"
|
fail "QNAP zip 中仍有旧域名、旧端口或旧路径"
|
||||||
fi
|
fi
|
||||||
|
if unzip -p "$QNAP_ZIP" 'reactive_resume/*' 2>/dev/null | grep -E 'amruthpillai/reactive-resume:latest|snowdreamtech/frpc:latest' >/dev/null; then
|
||||||
|
fail "QNAP zip 中仍有 latest 镜像"
|
||||||
|
fi
|
||||||
|
if unzip -p "$DIRECT_ZIP" 'reactive-resume-personal-direct/*' 2>/dev/null | grep -E 'amruthpillai/reactive-resume:latest|snowdreamtech/frpc:latest' >/dev/null; then
|
||||||
|
fail "direct zip 中仍有 latest 镜像"
|
||||||
|
fi
|
||||||
|
|
||||||
log "真实启动 direct 包并检查健康状态"
|
log "真实启动 direct 包并检查健康状态"
|
||||||
cleanup_direct
|
cleanup_direct
|
||||||
@@ -102,7 +109,7 @@ fi
|
|||||||
|
|
||||||
log "离线检查 arm64/QNAP 镜像布局"
|
log "离线检查 arm64/QNAP 镜像布局"
|
||||||
ARM64_DIGEST="$(
|
ARM64_DIGEST="$(
|
||||||
docker manifest inspect "$IMAGE" \
|
docker manifest inspect "$IMAGE_INDEX" \
|
||||||
| node -e '
|
| node -e '
|
||||||
let source = "";
|
let source = "";
|
||||||
process.stdin.on("data", (chunk) => source += chunk);
|
process.stdin.on("data", (chunk) => source += chunk);
|
||||||
@@ -116,15 +123,31 @@ process.stdin.on("end", () => {
|
|||||||
)"
|
)"
|
||||||
|
|
||||||
TMP_DIR="$(mktemp -d)"
|
TMP_DIR="$(mktemp -d)"
|
||||||
CID="$(docker create --platform linux/arm64 "$IMAGE@$ARM64_DIGEST" 2>/dev/null || true)"
|
CID="$(docker create --platform linux/arm64 "$IMAGE_INDEX" 2>/dev/null || true)"
|
||||||
[ -n "$CID" ] || fail "无法创建 arm64 镜像容器用于离线检查"
|
[ -n "$CID" ] || fail "无法创建 arm64 镜像容器用于离线检查"
|
||||||
docker export "$CID" -o "$TMP_DIR/arm64-root.tar"
|
docker export "$CID" -o "$TMP_DIR/arm64-root.tar"
|
||||||
docker rm "$CID" >/dev/null
|
docker rm "$CID" >/dev/null
|
||||||
mkdir -p "$TMP_DIR/arm64-root"
|
mkdir -p "$TMP_DIR/arm64-root"
|
||||||
tar -xf "$TMP_DIR/arm64-root.tar" -C "$TMP_DIR/arm64-root"
|
tar -xf "$TMP_DIR/arm64-root.tar" -C "$TMP_DIR/arm64-root"
|
||||||
|
|
||||||
[ -f "$TMP_DIR/arm64-root/app/apps/server/dist/index.mjs" ] || fail "arm64 镜像中未找到 /app/apps/server/dist/index.mjs"
|
if [ -f "$TMP_DIR/arm64-root/app/apps/server/dist/index.mjs" ]; then
|
||||||
[ -d "$TMP_DIR/arm64-root/app/apps/web/dist/assets" ] || fail "arm64 镜像中未找到 /app/apps/web/dist/assets"
|
ARM64_SERVER_ENTRY="$TMP_DIR/arm64-root/app/apps/server/dist/index.mjs"
|
||||||
|
ARM64_FILENAME_ENTRY="$ARM64_SERVER_ENTRY"
|
||||||
|
ARM64_ASSETS_DIR="$TMP_DIR/arm64-root/app/apps/web/dist/assets"
|
||||||
|
EXPECTED_ENTRYPOINT_PWD="$TMP_DIR/arm64-root/app"
|
||||||
|
EXPECTED_ENTRYPOINT_ARGS="node apps/server/dist/index.mjs"
|
||||||
|
elif [ -f "$TMP_DIR/arm64-root/app/apps/web/.output/server/index.mjs" ]; then
|
||||||
|
ARM64_SERVER_ENTRY="$TMP_DIR/arm64-root/app/apps/web/.output/server/index.mjs"
|
||||||
|
ARM64_FILENAME_ENTRY="$(grep -Rsl 'function generateFilename' "$TMP_DIR/arm64-root/app/apps/web/.output/server/_ssr" 2>/dev/null | head -n 1 || true)"
|
||||||
|
[ -n "$ARM64_FILENAME_ENTRY" ] || fail "arm64 .output 布局中未找到 generateFilename SSR bundle"
|
||||||
|
ARM64_ASSETS_DIR="$TMP_DIR/arm64-root/app/apps/web/.output/public/assets"
|
||||||
|
EXPECTED_ENTRYPOINT_PWD="$TMP_DIR/arm64-root/app/apps/web"
|
||||||
|
EXPECTED_ENTRYPOINT_ARGS="node .output/server/index.mjs"
|
||||||
|
else
|
||||||
|
find "$TMP_DIR/arm64-root/app" -maxdepth 6 \( -name index.mjs -o -name server.js -o -name main.js \) 2>/dev/null >&2 || true
|
||||||
|
fail "arm64 镜像中未找到支持的服务入口"
|
||||||
|
fi
|
||||||
|
[ -d "$ARM64_ASSETS_DIR" ] || fail "arm64 镜像中未找到 assets 目录:$ARM64_ASSETS_DIR"
|
||||||
|
|
||||||
perl -0pe "
|
perl -0pe "
|
||||||
s#/app/apps#$TMP_DIR/arm64-root/app/apps#g;
|
s#/app/apps#$TMP_DIR/arm64-root/app/apps#g;
|
||||||
@@ -138,13 +161,13 @@ sh "$TMP_DIR/runtime-patch-arm64-test.sh" >/tmp/reactive-resume-arm64-runtime.lo
|
|||||||
fail "arm64 离线运行 runtime patch 失败"
|
fail "arm64 离线运行 runtime patch 失败"
|
||||||
}
|
}
|
||||||
|
|
||||||
grep -R 'rr-browser-buffer-polyfill' "$TMP_DIR/arm64-root/app/apps/web/dist/assets" >/dev/null \
|
grep -R 'rr-browser-buffer-polyfill' "$ARM64_ASSETS_DIR" >/dev/null \
|
||||||
|| fail "arm64 public PDF bundle 未注入 Buffer polyfill"
|
|| fail "arm64 public PDF bundle 未注入 Buffer polyfill"
|
||||||
grep -R -F 'replace(/[\\/:*?"<>|]/g' "$TMP_DIR/arm64-root/app/apps/web/dist/assets" >/dev/null \
|
grep -R -F 'replace(/[\\/:*?"<>|]/g' "$ARM64_ASSETS_DIR" >/dev/null \
|
||||||
|| fail "arm64 文件名 bundle 未改为按标题下载"
|
|| fail "arm64 文件名 bundle 未改为按标题下载"
|
||||||
grep -q 'function generateFilename(prefix, extension)' "$TMP_DIR/arm64-root/app/apps/server/dist/index.mjs" \
|
grep -q 'function generateFilename(prefix, extension)' "$ARM64_FILENAME_ENTRY" \
|
||||||
|| fail "arm64 server entry 未包含 generateFilename"
|
|| fail "arm64 server entry 未包含 generateFilename"
|
||||||
grep -F 'filename.replace(/[\\/:*?"<>|]/g' "$TMP_DIR/arm64-root/app/apps/server/dist/index.mjs" >/dev/null \
|
grep -F 'filename.replace(/[\\/:*?"<>|]/g' "$ARM64_FILENAME_ENTRY" >/dev/null \
|
||||||
|| fail "arm64 server entry 未改为按标题生成下载文件名"
|
|| fail "arm64 server entry 未改为按标题生成下载文件名"
|
||||||
|
|
||||||
perl -0pe "
|
perl -0pe "
|
||||||
@@ -165,10 +188,10 @@ PATH="$TMP_DIR/fakebin:$PATH" sh "$TMP_DIR/entrypoint-arm64-test.sh" >/tmp/react
|
|||||||
fail "arm64 entrypoint 选择测试失败"
|
fail "arm64 entrypoint 选择测试失败"
|
||||||
}
|
}
|
||||||
|
|
||||||
grep -q "PWD=$TMP_DIR/arm64-root/app" "$TMP_DIR/entrypoint-result.txt" \
|
grep -q "PWD=$EXPECTED_ENTRYPOINT_PWD" "$TMP_DIR/entrypoint-result.txt" \
|
||||||
|| fail "arm64 entrypoint 未切换到 /app"
|
|| fail "arm64 entrypoint 未切换到预期目录:$EXPECTED_ENTRYPOINT_PWD"
|
||||||
grep -q "ARGS=node apps/server/dist/index.mjs" "$TMP_DIR/entrypoint-result.txt" \
|
grep -q "ARGS=$EXPECTED_ENTRYPOINT_ARGS" "$TMP_DIR/entrypoint-result.txt" \
|
||||||
|| fail "arm64 entrypoint 未选择 apps/server/dist/index.mjs"
|
|| fail "arm64 entrypoint 未选择预期入口:$EXPECTED_ENTRYPOINT_ARGS"
|
||||||
|
|
||||||
log "清理 direct 测试容器"
|
log "清理 direct 测试容器"
|
||||||
cleanup_direct
|
cleanup_direct
|
||||||
|
|||||||
Reference in New Issue
Block a user