33 lines
1.2 KiB
Docker
33 lines
1.2 KiB
Docker
# 每日签到面板 — Docker 镜像(Node 运行时,不依赖 Cloudflare)
|
||
#
|
||
# 一套代码两种跑法:Cloudflare Workers(wrangler deploy)和 Docker(本镜像),
|
||
# 面板代码 src/ 完全共用,差异由 docker/adapter.mjs 抹平。
|
||
|
||
FROM node:24-slim
|
||
|
||
WORKDIR /app
|
||
|
||
# telegram(gramjs)是 Telegram 签到(MTProto 用户身份)要用的;
|
||
# 其他站点零依赖,node:sqlite 是 Node 24 内置模块。
|
||
# --ignore-scripts:telegram 把 bufferutil 列为普通依赖,slim 镜像里没有 Python,
|
||
# 装它会触发 node-gyp 编译失败;跳过安装脚本后 bufferutil/utf-8-validate
|
||
# 会自动用纯 JS 回退(fallback.js),功能不受影响。
|
||
COPY package.json ./
|
||
RUN npm install --omit=dev --omit=optional --ignore-scripts --no-audit --no-fund
|
||
COPY src/ ./src/
|
||
COPY public/ ./public/
|
||
COPY docker/ ./docker/
|
||
|
||
ENV NODE_ENV=production \
|
||
PORT=8787 \
|
||
DB_PATH=/data/checkin.sqlite
|
||
|
||
VOLUME ["/data"]
|
||
EXPOSE 8787
|
||
|
||
# /api/status 无需登录,适合做健康检查
|
||
HEALTHCHECK --interval=30s --timeout=5s --start-period=15s --retries=3 \
|
||
CMD node -e "fetch('http://127.0.0.1:8787/api/status').then(r=>{if(!r.ok)process.exit(1)}).catch(()=>process.exit(1))"
|
||
|
||
CMD ["node", "docker/server.mjs"]
|