# 宝塔 + 宿主机 MySQL + Docker 应用(内网 30327) 与查价项目同一套模式:**MySQL 在宝塔,应用在 Docker**。 适用于: - MySQL:**宝塔面板**,库名 `email_forecast` - 应用:**Docker 容器**(web + worker) - 代码目录:`/home/project/yubao` - 访问:内网 `http://服务器IP:30327` --- ## 一、宝塔 MySQL 准备 1. 创建数据库 **`email_forecast`** - 字符集:**utf8mb4** - 校对规则:**utf8mb4_unicode_ci**(与 SQL 一致;选错会出现「字符集不一致可能导致恢复失败」) 2. 创建用户 **`email_forecast`**,赋予该库全部权限 3. 授权 Docker 网段(容器经 `host.docker.internal` 连宿主机): ```sql -- 在宝塔 phpMyAdmin 或终端执行(按实际密码改) CREATE USER 'email_forecast'@'172.%' IDENTIFIED BY '你的强密码'; GRANT ALL PRIVILEGES ON email_forecast.* TO 'email_forecast'@'172.%'; FLUSH PRIVILEGES; ``` 4. **推荐**:导入 `数据库/email_forecast.sql`(本机完整数据);也可不导入,由 install 脚本 `prisma db push` + seed ### 测试(在服务器上) ```bash mysql -h 127.0.0.1 -u email_forecast -p email_forecast ``` --- ## 二、开发机打包 ```powershell cd X:\work\yx powershell -ExecutionPolicy Bypass -File deploy\pack-server-upload.ps1 # 可选压缩便于上传 Compress-Archive -Path "上传到服务器\代码\*" -DestinationPath "yubao-code.zip" -Force ``` 将 **`上传到服务器/代码/`** 解压到服务器 `/home/project/yubao/`。 --- ## 三、配置 .env ```bash cd /home/project/yubao cp deploy/.env.bt-host-mysql.example .env nano .env ``` 必改项: | 变量 | 说明 | |------|------| | `APP_PORT` | 对外端口,默认 `30327`(勿与 chajia 30325 冲突) | | `PUBLIC_HOST` | 服务器内网 IP | | `MYSQL_PASSWORD` | 宝塔里 email_forecast 用户密码 | | `DATABASE_URL` | `mysql://email_forecast:密码@host.docker.internal:3306/email_forecast` | | `SESSION_SECRET` | ≥32 字符随机串 | | `APP_ADMIN_PASS` / `APP_OPS_PASS` | **不能**用 admin123/ops123,且二者须不同 | | `OAUTH_PUBLIC_BASE_URL` | `http://内网IP:30327` | | `CC_MOCK` | 无 CC 账号时 `true`;有账号改 `false` 并在设置页填凭据 | 密码含 `@`、`#` 等需 [URL 编码](https://www.urlencoder.org/)。 --- ## 四、首次启动 ```bash chmod +x deploy/install-bt-host-mysql.sh bash deploy/install-bt-host-mysql.sh ``` 脚本会:校验 MySQL → 构建 web/worker → `prisma db push` → seed 账号 → 健康检查。 **不要**用根目录 `docker-compose.yml` 里的容器 MySQL(那是本地开发用的 7023 端口)。 --- ## 五、更新代码 ```bash bash deploy/update-code-only-bt-host-mysql.sh # Prisma schema 有变更时: bash deploy/update-code-only-bt-host-mysql.sh --db-push ``` --- ## 六、内网访问 | 用途 | 地址 | |------|------| | 登录 | `http://192.168.x.x:30327/login` | | 邮件 | `http://192.168.x.x:30327/mails` | | 健康检查 | `http://192.168.x.x:30327/api/health` | --- ## 七、宝塔防火墙 - 放行 **30327**(内网即可) - **不要**对公网开放 3306 --- ## 八、架构示意 ``` 内网浏览器 ──HTTP:30327──► [Docker] web (Next.js :3100) │ ├──► [Docker] worker (IMAP 拉取 + 解析) │ └──► host.docker.internal:3306 │ [宝塔] MySQL email_forecast ``` --- ## 九、故障排查 | 现象 | 处理 | |------|------| | `Can't connect to MySQL` | 用户是否授权 `172.%`;`DATABASE_URL` 是否用 `host.docker.internal` | | 生产启动报 SESSION_SECRET / 弱口令 | 改 `.env` 中 `SESSION_SECRET`、`APP_*_PASS` | | Worker 不拉信 | `docker compose -f deploy/docker-compose.bt-host-mysql.yml logs -f worker`;检查设置页邮箱绑定 | | 端口不通 | 宝塔防火墙、安全组是否放行 30327 | | API 404(带 `[id]` 的路由) | Windows 打包方括号路径丢失;重新 `pack-server-upload.ps1` 并核对 RequiredRoutes | --- ## 十、导出本机库 ```bash # 本机(需 MySQL 客户端 + 本地 docker mysql 在跑) bash deploy/database/export-local.sh # 或直接: # docker exec yx-mysql-1 mysqldump -uapp -papp email_forecast > deploy/database/email_forecast.sql ```