Files
thebet365/docs/Docker部署指南.md
Mars d5913b6301 fix(deploy): use ASCII player assets and harden Docker Linux builds
Rename Chinese public paths and image filenames so Vite builds succeed on Linux, strip legacy public dirs in Dockerfiles, and document clean redeploy steps.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-08 17:28:15 +08:00

6.9 KiB
Raw Blame History

TheBet365 Docker 全栈部署指南

本文档说明如何使用 Docker 一键部署 API、玩家前台、管理后台、PostgreSQL 与 Redis。

本地开发仍可使用根目录 docker-compose.yml 仅启动数据库,应用在本机 pnpm dev 运行。


一、架构

浏览器
  ├─ :8080  player (Nginx) ── /api、/uploads ──► api (NestJS :3000)
  └─ :8081  admin  (Nginx) ── /api ────────────► api (NestJS :3000)

api ──► postgres:5432
    └──► redis:6379
容器 默认端口 说明
thebet365-player 8080 玩家 H5 前台
thebet365-admin 8081 管理后台(平台 + 代理)
thebet365-api 3000 NestJS API / Swagger
thebet365-postgres 不对外暴露 PostgreSQL 16
thebet365-redis 不对外暴露 Redis 7

二、服务器要求

项目 要求
系统 Linux推荐 Ubuntu 22.04+
Docker 24+
Docker Compose v2docker compose
内存 建议 ≥ 2 GB首次构建需更多
磁盘 建议 ≥ 10 GB

宝塔面板:左侧 Docker → 确认 Docker 服务已安装并运行。


三、一键部署(命令行)

1. 上传代码

将项目放到服务器,例如 /www/wwwroot/thebet365(宝塔 文件 上传或 git clone)。

2. 配置环境变量

cd /www/wwwroot/thebet365
cp .env.docker.example .env.docker

生产环境务必修改:

  • POSTGRES_PASSWORD — 数据库密码
  • JWT_SECRET — 足够长的随机字符串
  • 首次部署可保持 SEED_DATABASE=true,写入演示账号与默认数据;种子跑完后改回 false 并重启 api

3. 构建并启动

docker compose -f docker-compose.prod.yml --env-file .env.docker up -d --build

或使用脚本:

chmod +x scripts/docker-up.sh
./scripts/docker-up.sh

4. 查看状态

docker compose -f docker-compose.prod.yml --env-file .env.docker ps
docker compose -f docker-compose.prod.yml --env-file .env.docker logs -f api

启动成功后访问:

服务 地址
玩家前台 http://服务器IP:8080
管理后台 http://服务器IP:8081
API 文档 http://服务器IP:3000/api/docs

四、宝塔面板操作

方式 A容器编排推荐

  1. 文件 — 上传/克隆项目到 /www/wwwroot/thebet365
  2. 终端 — 执行 cp .env.docker.example .env.docker 并编辑密钥
  3. Docker容器编排添加
    • 编排文件:选择 docker-compose.prod.yml
    • 环境文件:选择 .env.docker(若面板支持)
  4. 构建并启动

若面板不支持指定 env 文件,在 终端 中执行第三节第 3 步命令即可。

方式 B绑定域名Nginx 反代)

在宝塔 网站 中为玩家站、管理站分别建站,使用 PHP只做反向代理

玩家站(根目录可留空或任意):

location / {
    proxy_pass http://127.0.0.1:8080;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
}

管理站 — 将 8080 改为 8081

API 端口 3000 建议不要直接公网暴露Swagger 仅供内网或通过 VPN 访问。


五、演示账号

SEED_DATABASE=true 首次启动后可用(详见 默认数据说明.md

角色 用户名 密码 入口
平台管理员 admin Admin@123 管理后台 :8081
一级代理 agent1 Agent@123 管理后台 :8081
玩家 player1 Player@123 玩家前台 :8080

六、常用命令

# 停止
docker compose -f docker-compose.prod.yml --env-file .env.docker down

# 停止并删除数据卷(清空数据库,慎用)
docker compose -f docker-compose.prod.yml --env-file .env.docker down -v

# 仅重建 API
docker compose -f docker-compose.prod.yml --env-file .env.docker up -d --build api

# 手动种子(容器已运行时)
docker compose -f docker-compose.prod.yml --env-file .env.docker exec api npx prisma db seed

# 查看 API 日志
docker compose -f docker-compose.prod.yml --env-file .env.docker logs -f api

根目录 package.json 快捷脚本(需已存在 .env.docker

pnpm docker:up
pnpm docker:down
pnpm docker:logs
pnpm docker:ps

七、数据持久化

卷名 内容
postgres_data 数据库
redis_data Redis
uploads_data Banner 等用户上传文件

备份 PostgreSQL 示例:

docker exec thebet365-postgres pg_dump -U thebet365 thebet365 > backup.sql

八、更新部署

推荐:先删旧代码再解压新 zip(避免 packages/shared/public/球员 等中文目录残留导致 Vite 构建失败)。

cd /www/wwwroot
mv thebet365 thebet365.bak.$(date +%Y%m%d)   # 备份旧目录(保留 .env.docker
mkdir thebet365 && cd thebet365
# 上传并解压新 zip 到当前目录
cp ../thebet365.bak.*/.env.docker . 2>/dev/null || cp .env.docker.example .env.docker

docker compose -f docker-compose.prod.yml --env-file .env.docker build --no-cache
docker compose -f docker-compose.prod.yml --env-file .env.docker up -d

若仍覆盖解压,构建前可手动清理:

find packages/shared/public -mindepth 1 -maxdepth 1 -type d \
  ! -name flags ! -name players -exec rm -rf {} +

API 容器启动时会自动执行 prisma migrate deploy,无需手动迁移。


九、故障排查

1. API 一直重启

docker logs thebet365-api

常见原因:数据库未就绪(稍等重试)、DATABASE_URL 密码与 POSTGRES_PASSWORD 不一致。

2. 前端 502 / 接口失败

确认 thebet365-api 为 running且 player/admin 容器能解析主机名 api(同一 compose 网络)。

3. 构建慢或内存不足

首次 docker compose build 会安装 pnpm 依赖并编译三端,建议服务器 ≥ 2 GB 内存;可在低峰期构建。

4. 端口被占用

修改 .env.docker 中的 API_PORT / PLAYER_PORT / ADMIN_PORT 后重新 up -d

5. player/admin 构建报错 ENOENT ... packages/shared/public/球员

旧版中文目录 球员 在 Linux 上编码异常。确认已使用含 packages/shared/public/players/ 的新代码包,并:

find packages/shared/public -mindepth 1 -maxdepth 1 -type d \
  ! -name flags ! -name players -exec rm -rf {} +
docker compose -f docker-compose.prod.yml --env-file .env.docker build --no-cache player admin

十、与本地开发的区别

场景 命令
本地开发(仅 DB 用 Docker docker compose up -d + pnpm dev
生产全栈 Docker docker compose -f docker-compose.prod.yml --env-file .env.docker up -d --build

相关文档:项目启动指南.md