Add PM2 deployment support

This commit is contained in:
lofyer
2026-08-24 17:59:49 +08:00
parent 5ff80caf7e
commit 63bbbac922
16 changed files with 450 additions and 55 deletions
+38 -29
View File
@@ -56,31 +56,10 @@ cp .env.example .env
编辑 `.env`:
- 将 `FEEDBACK_DOMAIN` 改为真实域名
- 用至少 32 字节的随机值替换 `APP_SECRET`
- 设置 `INITIAL_ADMIN_EMAIL` 和 `INITIAL_ADMIN_PASSWORD`
- 可按需设置 `INITIAL_ADMIN_NAME`
可用以下方式生成 secret:
```sh
APP_SECRET="$(openssl rand -hex 32)"
sed -i "s|^APP_SECRET=.*|APP_SECRET=${APP_SECRET}|" .env
unset APP_SECRET
chmod 600 .env
```
构建镜像并创建首个管理员:
```sh
docker compose build
read -rsp "Administrator password: " PRODUCT_ISSUE_ADMIN_PASSWORD
echo
export PRODUCT_ISSUE_ADMIN_PASSWORD
docker compose run --rm \
-e PRODUCT_ISSUE_ADMIN_PASSWORD \
app node dist/server/server/cli/create-admin.js \
--email admin@example.com \
--name "MesaLogo Admin"
unset PRODUCT_ISSUE_ADMIN_PASSWORD
```
`APP_SECRET` 可以留空,应用会在数据目录生成并持久化随机 secret。
启动服务:
@@ -90,17 +69,23 @@ docker compose ps
curl "https://feedback.example.com/health"
```
首次启动只在数据库没有管理员时根据 `.env` 创建初始管理员,不会在后续
重启时重置密码。创建完成后建议从 `.env` 删除
`INITIAL_ADMIN_PASSWORD`。
将示例域名替换为 `.env` 中的真实域名。管理后台位于
`https://你的域名/admin/`。
> 管理员创建命令也用于密码重置。重置后,该管理员的所有既有会话会立即
> 失效。不要把密码写入 `.env`、命令参数或 Git。
> `admin:create` 命令仍可用于创建或重置其他管理员。重置后,该管理员的
> 所有既有会话会立即失效。
## 本地开发
要求 Node.js 24 或更新版本。
```sh
cp .env.example .env
# 示例配置可直接启动;对外部署前必须修改初始管理员凭据
npm ci
npm run typecheck
npm test
@@ -108,9 +93,12 @@ npm run lint
npm run build
```
开发服务器需要通过进程环境提供 `APP_SECRET` 和其他配置。后端默认监听
`127.0.0.1:3000`,管理后台 Vite 服务默认监听 `127.0.0.1:5174` 并代理
`/api`:
Node 后端和管理员 CLI 会自动读取项目根目录的 `.env`。已由 shell、PM2
或系统服务注入的同名环境变量优先,不会被文件中的值覆盖。可通过
`ENV_FILE=/path/to/file` 指定其他配置文件。
后端默认监听 `127.0.0.1:3000`,管理后台 Vite 服务默认监听
`127.0.0.1:5174` 并代理 `/api`:
```sh
npm run dev
@@ -118,6 +106,27 @@ npm run dev
npm run dev:admin
```
## PM2 运行
没有 Docker 时可使用 PM2 直接管理构建后的 Node 进程:
```sh
npm install --global pm2
cp .env.example .env
# 示例配置可直接启动;生产环境必须先修改初始管理员凭据
npm run pm2:start
pm2 save
```
初始管理员仅在数据库为空时创建。确认可以登录后,建议删除 `.env` 中的
`INITIAL_ADMIN_PASSWORD`,再执行 `npm run pm2:reload`。未设置
`APP_SECRET` 时,应用会把自动生成的 secret 保存到
`DATA_DIRECTORY/.app-secret`。
更新代码后运行 `npm run pm2:reload`,查看日志使用
`pm2 logs product-issue`。默认访问地址为
`http://127.0.0.1:3000/admin/`。
## 文档
- [公共 API 契约](docs/api.md)