feat: 更新 Dockerfile 和启动脚本,改用 Debian slim 基础镜像,增强 Node.js ABI 兼容性检查
This commit is contained in:
@@ -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
@@ -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
@@ -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
|
||||
|
||||
|
||||
@@ -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%
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user