Files
blog/deploy/cn-certkeeper/Dockerfile
T

38 lines
1.6 KiB
Docker
Raw Normal View History

# cn-certkeeper 镜像 —— 零 npm 依赖,所以没有 package.json / 锁文件 / npm ci
#
# 作用:在国内机上跑证书的「探针 → 签发 → 部署」整条链路。
# 为什么不在 Worker 里跑:见 src/serve.mjs 顶部注释 ——
# Workers 免费版 CPU 硬顶 10ms(Cron 也是 10ms),付费版 $5/月≈¥36。
# 实测一次签发的密码学工作量约 3~4ms,乘上「Workers 比本地慢」的系数后
# 正好擦着 10ms 上限跑。国内机 CPU 不受限、Docker 也现成,搬过来更划算。
#
# ★ lib/ 是 blog-admin 的 tsc 编译产物,**不随仓库走**(已 gitignore)。
# 构建前先在 blog-admin 里跑 `npm run selftest:ssl:build`,
# 再 `cp -r blog-admin/.selftest-ssl/lib deploy/cn-certkeeper/lib`。
# 好处是:业务代码只有一份(blog-admin/src/lib/*.ts),Worker 与国内机
# 跑的是同一份编译产物,不会出现「两边逻辑漂移」。
#
# ★ apk 源换阿里云:国内机器直连 dl-cdn.alpinelinux.org 慢到不可用。
FROM node:22-alpine
ARG APK_MIRROR=mirrors.aliyun.com
RUN if [ -n "$APK_MIRROR" ]; then \
sed -i "s#dl-cdn.alpinelinux.org#$APK_MIRROR#g" /etc/apk/repositories; \
fi \
&& apk add --no-cache ca-certificates tzdata
WORKDIR /app
ENV NODE_ENV=production
COPY lib/ ./lib/
COPY src/ ./src/
# 数据目录(compose 里挂卷进来)
VOLUME ["/data"]
EXPOSE 8019
# 缺 AUTH_TOKEN / TOKEN_SECRET 时 serve.mjs 会自己 process.exit(1),容器随即退出 ——
# 刻意的:宁可起不来,也不能以「无鉴权」或「解不开凭据」的状态空转。
CMD ["node", "src/serve.mjs"]