From 03c56a20db7e64ce79524bda69ebf6cf1fbaf197 Mon Sep 17 00:00:00 2001 From: admin <572701190@qq.com> Date: Wed, 20 May 2026 01:41:38 +0800 Subject: [PATCH] pin reactive resume image digest --- compose-Nas.yml | 4 +- compose.yml | 2 +- dist/SHA256SUMS | 6 +-- dist/SHA256SUMS-20260520 | 6 +-- ...reactive-resume-clean-install-20260520.zip | Bin 5491 -> 5610 bytes ...active-resume-personal-direct-20260520.zip | Bin 12540426 -> 12540488 bytes ...tive-resume-personal-qnap-nas-20260520.zip | Bin 12539135 -> 12539188 bytes .../compose-Nas.yml | 4 +- .../reactive-resume-clean-install/compose.yml | 2 +- .../compose.yml | 2 +- .../compose-Nas.yml | 4 +- scripts/test-personal-install-packages.sh | 49 +++++++++++++----- 12 files changed, 51 insertions(+), 28 deletions(-) diff --git a/compose-Nas.yml b/compose-Nas.yml index c288cf7..58233fb 100644 --- a/compose-Nas.yml +++ b/compose-Nas.yml @@ -31,7 +31,7 @@ services: retries: 10 reactive_resume_app: - image: amruthpillai/reactive-resume:latest + image: amruthpillai/reactive-resume@sha256:b760446c4301af067e7d595537a877e378363aa6ce921b7349e62983621826aa restart: unless-stopped depends_on: reactive_resume_permissions: @@ -97,7 +97,7 @@ services: # QTS/Container Station 版默认启动 frpc。 # 为避免 QTS 把 frpc 配置文件挂载路径改到应用临时目录,这里不挂载 frpc.yaml, # 而是在容器启动时自动写入 /tmp/frpc.toml。 - image: snowdreamtech/frpc:latest + image: fatedier/frpc:v0.68.0 restart: unless-stopped entrypoint: ["/bin/sh"] command: diff --git a/compose.yml b/compose.yml index d115490..0d58041 100644 --- a/compose.yml +++ b/compose.yml @@ -19,7 +19,7 @@ services: retries: 10 reactive-resume: - image: amruthpillai/reactive-resume:latest + image: amruthpillai/reactive-resume@sha256:b760446c4301af067e7d595537a877e378363aa6ce921b7349e62983621826aa restart: unless-stopped env_file: - .env diff --git a/dist/SHA256SUMS b/dist/SHA256SUMS index 227f15b..5a2b15c 100644 --- a/dist/SHA256SUMS +++ b/dist/SHA256SUMS @@ -1,3 +1,3 @@ -fa3b2b64a9afd7af60f57cfda8431af4e171cc1cdba4a6a2b89d50000a574f54 reactive-resume-clean-install-20260520.zip -6724400586b14de9a954dcb22e1b7150d8339b3ebf07bb5b0685a5aa60009bc9 reactive-resume-personal-direct-20260520.zip -21e588dc25e90e358f823175cfab7ef4b4880fed959bab8d9d7c65200848b6d0 reactive-resume-personal-qnap-nas-20260520.zip +62d2a619dbade4a2fad0a9fbf4ff3389fed7afd9b5556b5d1e0a414d69ccd9dd reactive-resume-clean-install-20260520.zip +b737f2e75437c25e32760ca81532c27bfc0f5455e12afca14a3439af8b2851c1 reactive-resume-personal-direct-20260520.zip +c3414564cadd093e93b2bf9769bbb9eafc8e760cf98a216340516db2aea3007f reactive-resume-personal-qnap-nas-20260520.zip diff --git a/dist/SHA256SUMS-20260520 b/dist/SHA256SUMS-20260520 index 227f15b..5a2b15c 100644 --- a/dist/SHA256SUMS-20260520 +++ b/dist/SHA256SUMS-20260520 @@ -1,3 +1,3 @@ -fa3b2b64a9afd7af60f57cfda8431af4e171cc1cdba4a6a2b89d50000a574f54 reactive-resume-clean-install-20260520.zip -6724400586b14de9a954dcb22e1b7150d8339b3ebf07bb5b0685a5aa60009bc9 reactive-resume-personal-direct-20260520.zip -21e588dc25e90e358f823175cfab7ef4b4880fed959bab8d9d7c65200848b6d0 reactive-resume-personal-qnap-nas-20260520.zip +62d2a619dbade4a2fad0a9fbf4ff3389fed7afd9b5556b5d1e0a414d69ccd9dd reactive-resume-clean-install-20260520.zip +b737f2e75437c25e32760ca81532c27bfc0f5455e12afca14a3439af8b2851c1 reactive-resume-personal-direct-20260520.zip +c3414564cadd093e93b2bf9769bbb9eafc8e760cf98a216340516db2aea3007f reactive-resume-personal-qnap-nas-20260520.zip diff --git a/dist/reactive-resume-clean-install-20260520.zip b/dist/reactive-resume-clean-install-20260520.zip index 34d405584134cd86119819f08f012359959eac74..82011aeb7af007cdab9e2f2a0fcc5a871db00acc 100644 GIT binary patch delta 2698 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 E3#ELa^Z)<= diff --git a/dist/reactive-resume-personal-direct-20260520.zip b/dist/reactive-resume-personal-direct-20260520.zip index 3ac46c535413f440e31d4515e49a0ef52f004f88..039160d81c8c228c6d736a4da2844edc4a5ece19 100644 GIT binary patch delta 2442 zcmY+`2~<;88VB%@gs=oKEE*snvdAW&EGi;ufCNysup3cv06|m`5kwXV78@`iYt3~7 zw^Ar5vehWdyxLPyTh~rqs8t+BT2RzMh6>|0|A^I2&iUoM`~SXsbMJZQoflch8`Vpo zB?@3LHEGIE3%gQlA?tOG*2ZnMWYmY!uUxIJ+rsWxO`EhlzlTAiS)gxDb*QT)5eX=5 zi3W|KY*xzL!KSG&htc!?t0yXD%e@7hx6fj|)KwqT>a6ay9^No?rbDBXE>5{?_s20? z<|+?AfmNlYU6xn%y9d|s zd4Az9FE|~`W(hP?nj^<0!RjG>^BWg@SLr9V$Yu>XtYRx&lU{MOo(X~ z$h{LAPpFHpL`R#+xlIpW*MzLy*&p-3%wp+jC%I{$`OvW$Nlmw6#|E?2#Oyi$iLx?m zYF=|R$kyw7t+5)%@Zj(61UtT6yj8YWuXfj@_0Lyp(=V(p;MLi(q^NFFYO^50|HEy!o|6c4MeO`^l4MZnZ{%+5vek>6t0J>Sv|9 zxtyA0-5S`!lcfhF_1p?)h@!F1y_3S#iqhEv)tp zIUY5^i6aRM3NMc&3S913y2`!q2=FueYgsm?- z_U({f)rp_$dN=aEIJa$?MMZ_sgCo`+4kiO!nZtn8a`#BDNc7FEry(&XZ@&AfTQ@AD zW;`*rVvl;KUQWvcny+V`DbI4}MWek*XG-3M9>@!{&9a}i)~wH3y4gL#@6prK0{dNK zVfX$$ZK2Ql65b2mR*mfsZ&sSlFp=mK?KDY!+m_Vb|EM~@TCuY~V=}|Wmgn%T-8Esv z@PL$6yw{Gu1R%)YXyhVUYYoTSJhi_Mtmn)_iTL=+dFg9R01r2CJYG z?&kuTB^fc=RU+TR7P6e{t*>^}M;2dDl-`)FH`tj!I&|XleN$)qBH!f$`)%ALsb}rJ zYRhz&pNeyeQ7b%f!|{Mb(@Fm0q|3@RSGimKcBgLF;ZEa~=WjGvk}*GjVqsQad%Z|J z{nnUdkuYH|ovf{cz9=K-ii<|tZr8~CePKo6Y@gp&E z>#m$<&YKh*>h!po|K?X?y2dw>576wTydh7A#EaG;dI{_Mqc+uf*oR$mUhsU?=#Vk1 zuqUna$l}~swVH!QuW8kq%s~35hq`?mv)u8|aW&T^>*Mtamx4d9@$eV&U5ogxDnJJY zFhLbqpa$xo0h+)DEzkxXmRtY9`+ zgALe%9oWMhZ~#Yeg1ImcoWTW@XK{o1umBcU{3<_a4 zd=645f@0VMGAMyk*b8M)4i!)dRZtCIz&?-zf&Fj*4#FWg3^h;-N8l(NgX3@lzJxmX z3hJQ&zJ^9B9ID;;FE>LGH;3{y zq_?n1qYovdzphcfE=_g*|6NH;1eD-IjZ3lxloi9DNh4ly3D%@nKzTFjKa8qRGBwF! zA;o8mIKQtuk&{BoTP2)47gB`L@A5v3Ao+fjIvMoE%na90(JIC~&N}6)Ylyo)YQ0mV zWb&IoC1kME*OAaiiZoKYobqK{+Z|85WQl7D`}24+vLS-9Akr1oOh#N>f^vmaGCcsh zQ2b;4R99Lkr9-|Cz%p^NL}j#%NCGK7-Hk!c2T~mj)wXo}EN_nFEr3vwoknn@R_kkDuhL@E@QOpC@*_3f2O3f*nahssLa zgU8X7H(mZINum!rek>c3H;$AZQ59ph(~_y!X$i$98OmgsKb71SQx2?Od?@_w`X82p B`Go)g delta 2444 zcmY+_3pmv29tZGY+%IK_ltf4vjhNPDjgniWM2OK4A*Cg(qEut$QZ6C!>asAQ?l8h;_XS7 zQKE@Ijk1L*Hge5HD$xZeNP7UKQOHwZlquBnn7Z=ro^%>*K#@jck^!|)LvqB0Qspbs z=$ulOXn)w1tW1-V8NsBPFX6`N9sRa*rXBbl*HuccMcC=|tLio1uZawJSyGVrI?FOQ zn%VG;`G}F-ChjEltWLK-{z*u`DoZL{`1b8s>&K+riwpEseW^EbWfl z#@ZMRvrf~r-~65t^Hj=(-_G)GFzg9o80UGn{A|#{9t}4s9_nGdXt3l|@8QLyi@tr{ zWm8Gh8WZ(p4gYFpw|DOKqBHiLC-)z|TRk}JSZR=3p_NrFA`|bo>G!GYjO3M+R_}1u z4>t3-!O0oP0dka1MIRqpM| zg@vMLomExsY=v%Dg9X>l1WQeDx|H0nWVyYI*|E+f|9qHLCU+=k_SxrGU6xpE${v2I z)Xm5+*7)JlSXse^@6O-ND>$ln)xw0UIYl=ceN%j2dsDHA!`$qvEo+LR2S4ViU*|{< zxqW!L=FsD3k57B_I=x@`PL1#JpZ0B|NlFaP#GcRj{NxiY_7jQ6PMOF4R1()1Xp}SY z{f&RE{mb0iv zkkW5Im|5MuIHY?B(jEiI~9hJT*DqM|@J zb|U=7gQ}*F#+8ZVzvnNzHhqD$Ld)--aaxsp`Q4@yUT>sYCX{nUjlb}2@)cG#l((h} z)TCzJYhP8mQQNC3+%DpOO@sS5=PYipALqx|R9Fbo_qM6?t~o{Jv8)!n=sRa^;q>rB z^5J)bme~Ra{^T+1RaI9_O1pl$#xJT*5&oi{_=G+XnZ#nT!@kmfDVI^=7G2WRs-vPN zSKoDZ_!Ea87DBN82(WB=vx9k@m+%(_)X_)U)Q7FG!P86g%K5kZ^ z+P!jd=k4Kr$1n8!oMXe*AB|}f8M-|9SaY^N_R4H3LDL~wSrmMqGu_!I95m)Pt=5R_ z?X5Uy95UE(R55n@oj#X=>PKOTZyg@&HoaouF*+$5CA9K6sdy=Hkzk7BWc}Lpr`q0~ zsXyF(p}Q>fo?F6NoA}6}H%E4vE*r0DC!%*{-DGFcX7 zJT3j{l-9}C^Jb1Kt%xUMEB)!H*44`7Fa4`7^0!L*`+C4C^{;Cj>4OK@SqIosAPsbo z0a=g(c~AgFPy%I80acg8GE!e^5U=JK{fEBP39AOnWfit*(E4aaG za0d@q1D>!J)`1tS2XF9!4d4rY;13%i00MyvL9hvU5DX!L1MJP8{rHb}k#$ck6vAK& zghK>G!d8faZLl4pVF!ExF%SzoAr9gp0ltJp*af>G36fzC?1dEA2m9dw@F5kxf;2b? z>5u`LkOha}Fl0jxsSRl#2fyb&1f0T1Z!tp%oRfjfspa^)y zD@R5sgP3|?!kze;D1^Kj5~!0W9+VrsAU&M?s@oh-cp2d;q|%QvAm6XS%8a%|NP6LJ z72@SdxzhJMh!jU5t0ez1d#ff9ilcGqC~@>9N!oyh#p}?p zvo=98EA?{1T*CCitol>1Xn^zY?_k`e4do#e|4WhGDS!$xdSU5c7{m-YeF z2D->pTr48B0hA|w+>9bVOo~a&0?|H@Ia8UECrnC@G>D_BrJo`-V$Y(~i8B}ZJC3Bw Z7Y>v%xhzhq9VLlY5M?fR%9+A%`5z%XG?V}U diff --git a/dist/reactive-resume-personal-qnap-nas-20260520.zip b/dist/reactive-resume-personal-qnap-nas-20260520.zip index bdea25763fd6191eb179ede51d439786b37f9f60..d7cd31620573e88e8c9c049c0369074d84f3356c 100644 GIT binary patch delta 3464 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 D__Y(C delta 3392 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/dev/null | grep -E 'isiseg|10004|Reactive_Resume_Personal|/share/Container/Reactive_Resume_Personal' >/dev/null; then fail "QNAP zip 中仍有旧域名、旧端口或旧路径" 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 包并检查健康状态" cleanup_direct @@ -102,7 +109,7 @@ fi log "离线检查 arm64/QNAP 镜像布局" ARM64_DIGEST="$( - docker manifest inspect "$IMAGE" \ + docker manifest inspect "$IMAGE_INDEX" \ | node -e ' let source = ""; process.stdin.on("data", (chunk) => source += chunk); @@ -116,15 +123,31 @@ process.stdin.on("end", () => { )" 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 镜像容器用于离线检查" docker export "$CID" -o "$TMP_DIR/arm64-root.tar" docker rm "$CID" >/dev/null mkdir -p "$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" -[ -d "$TMP_DIR/arm64-root/app/apps/web/dist/assets" ] || fail "arm64 镜像中未找到 /app/apps/web/dist/assets" +if [ -f "$TMP_DIR/arm64-root/app/apps/server/dist/index.mjs" ]; then + 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 " 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 失败" } -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" -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 未改为按标题下载" -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" -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 未改为按标题生成下载文件名" perl -0pe " @@ -165,10 +188,10 @@ PATH="$TMP_DIR/fakebin:$PATH" sh "$TMP_DIR/entrypoint-arm64-test.sh" >/tmp/react fail "arm64 entrypoint 选择测试失败" } -grep -q "PWD=$TMP_DIR/arm64-root/app" "$TMP_DIR/entrypoint-result.txt" \ - || fail "arm64 entrypoint 未切换到 /app" -grep -q "ARGS=node apps/server/dist/index.mjs" "$TMP_DIR/entrypoint-result.txt" \ - || fail "arm64 entrypoint 未选择 apps/server/dist/index.mjs" +grep -q "PWD=$EXPECTED_ENTRYPOINT_PWD" "$TMP_DIR/entrypoint-result.txt" \ + || fail "arm64 entrypoint 未切换到预期目录:$EXPECTED_ENTRYPOINT_PWD" +grep -q "ARGS=$EXPECTED_ENTRYPOINT_ARGS" "$TMP_DIR/entrypoint-result.txt" \ + || fail "arm64 entrypoint 未选择预期入口:$EXPECTED_ENTRYPOINT_ARGS" log "清理 direct 测试容器" cleanup_direct