1
0
forked from boos/BoosAPI

feat: 更新 Dockerfile 和启动脚本,改用 Debian slim 基础镜像,增强 Node.js ABI 兼容性检查

This commit is contained in:
cita
2026-03-01 17:52:36 +08:00
parent 05a5ee9b9e
commit 5c1bbd0c62
5 changed files with 60 additions and 12 deletions
+8 -5
View File
@@ -183,7 +183,7 @@ Metapi 作为这些中转站之上的聚合层,把多个站点统一到 **一
### 📦 轻量部署
- **单 Docker 容器**,内置 SQLite,无外部依赖
- Alpine 基础镜像,体积精简
- Debian slim 基础镜像,兼顾兼容性与体积
- 数据完整导入导出,迁移无忧
---
@@ -278,11 +278,14 @@ $env:DATA_DIR="./data"
`start.sh` / `start.bat` 的作用是:
- 先执行数据库迁移:`node dist/server/db/migrate.js`
- 再启动服务:`node dist/server/index.js`
- 先检查 `better-sqlite3` 与当前 Node.js ABI 是否兼容
- 若检测到 ABI 不匹配,会自动尝试 `npm rebuild better-sqlite3`
- 若重建失败,会回退到 `npm ci --omit=dev` 重新安装运行时依赖
- 最后执行数据库迁移并启动服务
> [!NOTE]
> Release 包依赖本机安装 Node.js(建议 20+)。
> Release 包依赖本机安装 Node.js(支持 20+,推荐 22 LTS)。
> 如果本机 Node 主版本与打包时不同(例如包内依赖基于 Node 22,而本机是 Node 24),首次启动可能触发自动重建,需联网。
### 升级
@@ -496,7 +499,7 @@ location / {
| **数据库** | SQLite ([better-sqlite3](https://github.com/WiseLibs/better-sqlite3)) + [Drizzle ORM](https://orm.drizzle.team) |
| **数据可视化** | [VChart](https://visactor.io/vchart) (@visactor/react-vchart) |
| **定时任务** | [node-cron](https://github.com/node-cron/node-cron) |
| **容器化** | Docker (Alpine) + Docker Compose |
| **容器化** | Docker (Debian slim) + Docker Compose |
| **测试** | [Vitest](https://vitest.dev) |
---
+8 -5
View File
@@ -183,7 +183,7 @@ Alert scenarios: low balance warning, site/account anomalies, check-in failures,
### Lightweight Deployment
- **Single Docker container** with built-in SQLite — no external dependencies
- Alpine base image, minimal footprint
- Debian slim base image, balancing compatibility and image size
- Full data import/export for worry-free migration
---
@@ -278,11 +278,14 @@ $env:DATA_DIR="./data"
`start.sh` / `start.bat` will:
- Run database migrations: `node dist/server/db/migrate.js`
- Start the service: `node dist/server/index.js`
- Check whether `better-sqlite3` matches the current Node.js ABI
- If ABI mismatch is detected, automatically run `npm rebuild better-sqlite3`
- If rebuild fails, fall back to `npm ci --omit=dev` to reinstall runtime dependencies
- Then run database migrations and start the service
> [!NOTE]
> The Release package requires Node.js installed locally (20+ recommended).
> The Release package requires Node.js installed locally (supports 20+, recommends 22 LTS).
> If your local Node major version differs from the one used during packaging (for example, package built with Node 22 while local is Node 24), first startup may trigger automatic rebuild and requires network access.
### Upgrade
@@ -496,7 +499,7 @@ For detailed integration instructions: [docs/client-integration.md](docs/client-
| **Database** | SQLite ([better-sqlite3](https://github.com/WiseLibs/better-sqlite3)) + [Drizzle ORM](https://orm.drizzle.team) |
| **Charts** | [VChart](https://visactor.io/vchart) (@visactor/react-vchart) |
| **Scheduling** | [node-cron](https://github.com/node-cron/node-cron) |
| **Containerization** | Docker (Alpine) + Docker Compose |
| **Containerization** | Docker (Debian slim) + Docker Compose |
| **Testing** | [Vitest](https://vitest.dev) |
---
+3 -2
View File
@@ -1,4 +1,4 @@
FROM node:20-alpine AS builder
FROM node:20-bookworm-slim AS builder
WORKDIR /app
@@ -7,8 +7,9 @@ RUN npm ci
COPY . .
RUN npm run build
RUN npm prune --omit=dev
FROM node:20-alpine
FROM node:20-bookworm-slim
WORKDIR /app
+23
View File
@@ -1,6 +1,29 @@
@echo off
setlocal
rem Check whether better-sqlite3 matches the current Node.js ABI.
node -e "try{require('better-sqlite3');process.exit(0);}catch(err){if(err&&err.code==='ERR_DLOPEN_FAILED'&&String(err.message||'').includes('NODE_MODULE_VERSION')){process.exit(42);}console.error(err);process.exit(1);}"
set "NATIVE_CHECK_CODE=%errorlevel%"
if %NATIVE_CHECK_CODE% EQU 42 (
echo [metapi] Detected Node.js/native module ABI mismatch. Rebuilding better-sqlite3...
call npm rebuild better-sqlite3 --no-audit --fund=false
if errorlevel 1 (
echo [metapi] npm rebuild failed. Running npm ci --omit=dev as fallback...
call npm ci --omit=dev --no-audit --fund=false
if errorlevel 1 exit /b %errorlevel%
)
node -e "try{require('better-sqlite3');process.exit(0);}catch(err){console.error(err);process.exit(1);}"
if errorlevel 1 (
echo [metapi] better-sqlite3 is still incompatible with current Node.js.
echo [metapi] Recommended: use Node.js 22 LTS or run Docker image 1467078763/metapi:latest.
exit /b %errorlevel%
)
) else if NOT %NATIVE_CHECK_CODE% EQU 0 (
exit /b %NATIVE_CHECK_CODE%
)
node dist/server/db/migrate.js
if errorlevel 1 exit /b %errorlevel%
+18
View File
@@ -1,5 +1,23 @@
#!/usr/bin/env sh
set -eu
# Check whether better-sqlite3 matches the current Node.js ABI.
set +e
node -e "try{require('better-sqlite3');process.exit(0);}catch(err){if(err&&err.code==='ERR_DLOPEN_FAILED'&&String(err.message||'').includes('NODE_MODULE_VERSION')){process.exit(42);}console.error(err);process.exit(1);}"
native_check_code=$?
set -e
if [ "$native_check_code" -eq 42 ]; then
echo "[metapi] Detected Node.js/native module ABI mismatch. Rebuilding better-sqlite3..."
if ! npm rebuild better-sqlite3 --no-audit --fund=false; then
echo "[metapi] npm rebuild failed. Running npm ci --omit=dev as fallback..."
npm ci --omit=dev --no-audit --fund=false
fi
node -e "try{require('better-sqlite3');process.exit(0);}catch(err){console.error(err);process.exit(1);}"
elif [ "$native_check_code" -ne 0 ]; then
exit "$native_check_code"
fi
node dist/server/db/migrate.js
exec node dist/server/index.js