Skip to content

部署清单

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 -d

Redis 没有应用依赖边,只在明确接入时启用。生产数据库密码、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
  • 确认日志、支付和渠道配置中没有泄露密钥。
  • 已有数据库升级前先备份并核对迁移清单;不得再次运行空库安装器。

Peanut Admin 公开文档