fix(deploy): 修复生产 CMS 解密失败与媒体库 500
- deploy.sh 构建时从 .env.production 显式注入 NEXT_PUBLIC_ENCRYPTION_SECRET, 避免 .env.local 开发密钥覆盖生产密钥,导致前端 chunk 与后端 ENCRYPTION_SECRET 不匹配,CMS 所有列表/仪表盘解密失败(The operation failed for an operation-specific reason) - Dockerfile.prod 新增 sharp-deps 阶段,为 Alpine 容器补充 @img/sharp-linuxmusl-x64 平台依赖,修复媒体库接口缺失 musl 二进制导致的 500
This commit is contained in:
@@ -1,3 +1,14 @@
|
|||||||
|
# ---------- sharp 平台依赖构建阶段 ----------
|
||||||
|
# 本地构建产物仅包含 darwin 平台二进制(@img/sharp-darwin-arm64),
|
||||||
|
# 容器运行于 Alpine(linuxmusl-x64),需补充 musl 平台二进制,否则媒体库接口报 500。
|
||||||
|
FROM node:20-alpine AS sharp-deps
|
||||||
|
WORKDIR /sharp
|
||||||
|
# 使用空 package.json,仅安装两个 musl 平台包,避免安装完整依赖树撑爆磁盘
|
||||||
|
RUN npm init -y >/dev/null 2>&1 && \
|
||||||
|
npm install --no-save --os=linux --cpu=x64 --libc=musl \
|
||||||
|
@img/sharp-linuxmusl-x64@0.35.3 \
|
||||||
|
@img/sharp-libvips-linuxmusl-x64@1.3.2
|
||||||
|
|
||||||
FROM node:20-alpine AS runner
|
FROM node:20-alpine AS runner
|
||||||
WORKDIR /app
|
WORKDIR /app
|
||||||
|
|
||||||
@@ -15,6 +26,8 @@ COPY dist/standalone ./
|
|||||||
COPY dist/static ./dist/static
|
COPY dist/static ./dist/static
|
||||||
# 公共静态资源(图片、字体、favicon、uploads 等)
|
# 公共静态资源(图片、字体、favicon、uploads 等)
|
||||||
COPY public ./public
|
COPY public ./public
|
||||||
|
# 覆盖 sharp 平台依赖为 musl 版本(standalone 仅含 darwin 二进制)
|
||||||
|
COPY --from=sharp-deps /sharp/node_modules/@img /app/node_modules/@img
|
||||||
|
|
||||||
RUN chown -R nextjs:nodejs /app
|
RUN chown -R nextjs:nodejs /app
|
||||||
|
|
||||||
|
|||||||
@@ -130,6 +130,24 @@ cmd_build() {
|
|||||||
log "📋 构建静态站点"
|
log "📋 构建静态站点"
|
||||||
log "=========================================="
|
log "=========================================="
|
||||||
cd "$PROJECT_ROOT"
|
cd "$PROJECT_ROOT"
|
||||||
|
|
||||||
|
# 生产构建必须注入 .env.production 中的前后端加密密钥。
|
||||||
|
# Next.js 加载 env 的优先级为 .env.local > .env.production,
|
||||||
|
# 若不显式注入,构建时会使用 .env.local 中的开发密钥,
|
||||||
|
# 导致前端 chunk 密钥与后端 ENCRYPTION_SECRET 不匹配,
|
||||||
|
# CMS 所有列表/仪表盘解密失败(The operation failed for an operation-specific reason)。
|
||||||
|
if [[ -f "$PROJECT_ROOT/.env.production" ]]; then
|
||||||
|
PROD_ENC_SECRET=$(grep '^NEXT_PUBLIC_ENCRYPTION_SECRET=' "$PROJECT_ROOT/.env.production" | head -1 | cut -d= -f2- | tr -d '"')
|
||||||
|
if [[ -n "$PROD_ENC_SECRET" ]]; then
|
||||||
|
export NEXT_PUBLIC_ENCRYPTION_SECRET="$PROD_ENC_SECRET"
|
||||||
|
log "✅ 已注入生产加密密钥到构建环境"
|
||||||
|
else
|
||||||
|
log "⚠️ .env.production 中未找到 NEXT_PUBLIC_ENCRYPTION_SECRET,请检查配置"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
log "⚠️ 未找到 .env.production,无法注入生产加密密钥"
|
||||||
|
fi
|
||||||
|
|
||||||
if [[ "$CLEAN_BUILD" == "1" ]]; then
|
if [[ "$CLEAN_BUILD" == "1" ]]; then
|
||||||
npm run build:clean
|
npm run build:clean
|
||||||
else
|
else
|
||||||
|
|||||||
Reference in New Issue
Block a user