Appearance
部署清单
Peanut Admin 的生产部署面向已经存在的应用仓。服务器只需要 Git 和 Docker Compose;生产 Compose 在容器内完成 web 管理端、uniapp H5、Nuxt SSR、PHP 依赖和服务启动,宿主机不需要 Node.js、PHP 或 Composer。
版本范围
- PHP 8.3.x。
- MySQL 8.0.36+ 或 8.4.x。
- Nginx 1.24+;Redis 7.x 可选且默认不启动。
- 构建机使用 Node.js 20/22、pnpm 9 和 Composer 2.8。
Node.js、pnpm 和 Composer 只在开发机或 Docker 构建容器中使用。PC 端保留 Nuxt 3 SSR,因此生产 Compose 会运行一个 Node SSR 容器;这不改变宿主机无需 Node.js 的要求。原生发布包仍可作为不使用 Docker 时的备选。
Docker 生产部署(推荐)
生产和开发 Compose 严格分离:生产使用 deploy/docker-compose.prod.yml,开发使用 deploy/docker-compose.dev.yml,不要混用。首次部署时拉取已经存在的应用仓、复制受保护的环境文件,然后只执行一条构建并启动命令:
bash
git clone git@github.com:peanut-business/peanut-admin.git /srv/peanut-admin
cd /srv/peanut-admin
cp deploy/production.env.example deploy/production.env
chmod 600 deploy/production.env
# 编辑 deploy/production.env,填写数据库密码和 JWT_SECRET
docker compose --env-file deploy/production.env \
-f deploy/docker-compose.prod.yml up -d --build生产镜像是多阶段构建:web 管理端静态文件放到 server/public/admin/(访问 /admin/),uniapp H5 放到 server/public/mobile/(访问 /mobile/),Nuxt 3 SSR 保留在 pc Node 容器(访问 /pc/),API 统一走 /api/。PHP 容器入口会自动执行可跳过已安装数据库的安装器,不需要额外启动 MySQL 或手动 run 安装命令。
默认服务为 MySQL、PHP-FPM、Nginx、PC Node SSR 和后端 scheduler。需要 Redis 时显式启用可选 profile:
bash
docker compose --env-file deploy/production.env \
-f deploy/docker-compose.prod.yml --profile redis up -dRedis 没有应用依赖边,只在明确接入时启用。生产数据库密码、MySQL root 密码和 JWT_SECRET 均为必填项。
Compose 默认把 Nginx 绑定到宿主机 127.0.0.1:18082。宝塔面板新增反向代理,目标填写 http://127.0.0.1:18082;Cloudflare DNS 对应记录开启代理(橙色云朵)。不要直接暴露 PHP-FPM、PC Node 或 MySQL。
原生发布包(备选)
无法使用 Docker 时,可以在构建机生成原生发布包,再交给 PHP-FPM 和 Nginx 主机:
bash
./scripts/package-release.sh release/peanut-admin-<version>脚本按 lockfile 构建 web/dist/,复制到发布暂存目录的 server/public/admin/,安装生产 Composer 依赖,并生成目录和 .tar.gz。发布包不包含 .env、Node 依赖和运行日志。原生部署仍需宿主机 PHP-FPM、Nginx、MySQL 和系统 cron;要同时提供 /mobile/ 与保留 /pc/ SSR,需要另外构建 H5 产物并运行 Nuxt Node 进程。Docker 多阶段方案仍是三端一起发布的推荐路径。
Nginx 根目录指向发布制品的 server/public/:
nginx
location = / {
return 302 /admin/;
}
location = /admin {
return 302 /admin/;
}
location ~ ^/admin/login/(?:login|logout)/?$ {
try_files $uri /index.php?$query_string;
}
location ^~ /api/ {
try_files $uri /index.php?$query_string;
}
location /admin/ {
try_files $uri $uri/ /admin/index.html;
}
location /mobile/ {
try_files $uri $uri/ /mobile/index.html;
}
location /pc/ {
proxy_pass http://127.0.0.1:3000;
proxy_http_version 1.1;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
location / {
try_files $uri $uri/ /admin/index.html;
}
location ^~ /storage/ {
try_files $uri =404;
}管理端静态文件位于 server/public/admin/,H5 静态文件位于 server/public/mobile/,Nuxt SSR 通过 /pc/ 转发到 Node 进程;/ 重定向到 /admin/,/api/ 和 legacy /admin/login/* 进入 ThinkPHP。实际域名、PHP-FPM socket、目录和 HTTPS 证书按目标环境配置。
周期任务
原生部署通过 ThinkPHP Console 和系统 cron 执行周期任务;Docker 生产配置已包含同等调度器。原生调度器每分钟执行一次:
cron
* * * * * cd /var/www/peanut-admin/server && /usr/bin/php think crontab >> /var/log/peanut-crontab.log 2>&1命令必须来自 server/config/console.php 中的显式注册项。
发布后检查
- 确认服务器没有使用开发 Compose,三端均由生产 Compose 构建并运行。
- 确认
/、/admin/、/mobile/、/pc/和/api/的入口分别符合路由契约。 - 登录并确认管理端菜单与当前角色一致。
- 检查
/api请求、上传和导出目录权限。 - 用受限账号验证一个列表、详情和写操作,确认权限拒绝仍返回
40300。 - 确认日志、支付和渠道配置中没有泄露密钥。
- 已有数据库升级前先备份并核对迁移清单;不得再次运行空库安装器。