Files
Xboard/deploy/xboard-server
yinjianm a4e78b864a fix(api): 修复邮件队列超时并补齐调度进程
延长 SendEmailJob 超时并改为超时直接失败,补充重试退避、
失败日志与收件人脱敏,避免 send_email 队列批量超时重试。

新增 MAIL_TIMEOUT 与 QUEUE_RETRY_AFTER 配置,并抽出邮件运行时
配置与 HTML 内容服务,确保 Horizon 常驻进程使用最新邮件配置。

为 Docker、supervisor 与 compose 样例补齐 scheduler 进程,并在
节点管理端开启墙检测托管时立即触发一次检测,保证定时任务持续生效。
2026-04-28 13:32:58 +08:00
..

Xboard 服务器部署模板

这个目录是一套可复制到服务器的 Compose 部署模板,拓扑对齐当前生产用法:

  • web: Laravel Octane HTTP 服务,默认发布宿主机 7001
  • horizon: 队列进程
  • scheduler: Laravel Scheduler,负责持续触发 sync:server-gfw-checks 等定时任务
  • admin: 独立管理端前端容器,默认发布宿主机 7002
  • ws-server: 节点 WebSocket 服务,默认发布宿主机 8076
  • redis: 通过 redis-data 卷提供 /data/redis.sock

模板默认不包含 MySQL。数据库继续使用宿主机、面板或云数据库中的外部 MySQL。

首次部署

服务器需要已安装 Docker,并支持 docker compose 命令。

cd xboard-server
sh ./scripts/init.sh
vi .env
sh ./scripts/deploy.sh

.env 至少需要检查这些项:

  • APP_URL: 对外访问域名,例如 https://example.com
  • APP_KEY: 新安装可留空后通过 xboard:install 生成;已安装实例必须填原来的值
  • DB_HOST / DB_PORT / DB_DATABASE / DB_USERNAME / DB_PASSWORD: 外部 MySQL 连接
  • MAIL_*: 邮件发送配置
  • WEB_PORT / ADMIN_PORT / WS_PORT: 宿主机端口,和现有服务冲突时修改
  • XBOARD_UPLOAD_UPSTREAM: 管理端图片上传反向代理目标

初始化或迁移数据库

全新安装时,先确认 .env 里的数据库指向正确,再执行交互式安装:

docker compose exec web php artisan xboard:install

已有数据库升级时,不要重新执行安装命令。需要迁移时执行:

docker compose exec -T web php artisan migrate --force

项目自带更新命令也会执行迁移、默认插件检查和缓存刷新:

docker compose exec -T web php artisan xboard:update

启动与更新

启动或重新拉起服务:

docker compose up -d

更新镜像但不自动迁移数据库:

sh ./scripts/update.sh

更新镜像并显式执行数据库迁移:

sh ./scripts/update.sh --migrate

查看服务状态:

docker compose ps

查看日志:

docker compose logs -f web
docker compose logs -f horizon
docker compose logs -f scheduler
docker compose logs -f ws-server
docker compose logs -f admin

Scheduler 检查

自动墙检测依赖 scheduler 容器持续运行。该容器执行 php artisan schedule:work。节点开启墙检测托管后,sync:server-gfw-checks 默认每 30 分钟由 Laravel Scheduler 创建检测任务。

常用检查命令:

docker compose ps scheduler
docker compose logs -f scheduler
docker compose exec -T web php artisan schedule:list

手动触发一次墙检测同步:

docker compose exec -T web php artisan sync:server-gfw-checks

如果节点页一直显示“未检测”或“等待节点领取”,优先检查:

  • scheduler 是否在线
  • php artisan schedule:list 是否能列出 sync:server-gfw-checks
  • ws-server 是否在线,节点端是否已连接
  • 节点是否是父节点;子节点不会单独创建检测任务
  • 目标节点是否开启了墙检测托管

管理端代理

admin 容器通过环境变量把管理端请求代理到后端:

XBOARD_BACKEND_UPSTREAM=http://web:7001
XBOARD_UPLOAD_UPSTREAM=https://pic.535888.xyz

在默认 Compose 网络内,http://web:7001 是后端服务地址,不需要改成宿主机 IP。只有上传服务需要按你的实际图片上传入口调整。

目录说明

  • .env: 服务器真实配置,不应提交到仓库
  • .docker/.data/: Xboard 容器运行时数据
  • storage/logs/: Laravel 日志
  • storage/theme/: 主题资源
  • plugins/: 插件目录
  • redis-data: Docker 命名卷,保存 Redis socket 和持久化数据