Files

89 lines
5.3 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Windows Server 发布与启动
该包为 Windows x64 AIServer,提供登录、WebSocket、`/game/state` 和 `/game/command`,玩法配置已编译进 exe。使用静态 VC 运行库,不需要安装 .NET 或 Visual Studio。建议 Windows Server 2016 或更新版本。
## 1. 上传
将 ZIP 解压到服务器 `C:\Services\AIGame`。不要放到网站静态资源目录,也不要覆盖现有 Kestrel 服务文件。该目录应有 `aiserver.exe`、以下脚本与本文档。
本包不含任何开发账号数据库。首次启动创建 `data\aiserver.db`;后续更新保留该文件及其 `-wal` / `-shm` 配套文件,先停服再替换 exe。已有线上 ASP.NET/Kestrel 的账号、token 和存档不会自动迁入本服务。若已有正式玩家,需要先做数据迁移;不要将旧后端的数据库直接改名覆盖。本机已在小游戏中创建的游客账号可以在新服务中重新注册,但不会自动带入旧服存档。
## 2. 首次前台运行
打开 PowerShell:
```powershell
cd C:\Services\AIGame
powershell.exe -NoProfile -ExecutionPolicy Bypass -File .\Run-Server.ps1
```
另开窗口检查:
```powershell
powershell.exe -NoProfile -ExecutionPolicy Bypass -File C:\Services\AIGame\Test-Server.ps1
```
默认只监听 `127.0.0.1:15888`。`/health` 应返回 `service=aiserver`、`gameProtocol=1`;无登录令牌访问 `/game/state` 返回 **401** 是正常的,404 表示反代仍指向旧后端。
## 3. 开机后台启动
先关闭前台测试进程,再以管理员身份打开 PowerShell:
```powershell
cd C:\Services\AIGame
powershell.exe -NoProfile -ExecutionPolicy Bypass -File .\Install-StartupTask.ps1
Get-ScheduledTask -TaskName AIGame-AIServer
```
脚本注册计划任务,以 Local Service 运行,开机自动启动,退出后每分钟重试,日志写入 `logs\`;不是通过 `sc.exe create` 注册的原生 Windows Service。AIServer 只监听环回地址。公网 15888 由 Caddy 监听,需要在服务器防火墙和云安全组允许 TCP 15888。更换端口时使用 `-Port` 并同步反代。停止和卸载:
安装前会检查通配/环回地址的端口占用,启动后确认 `/health` 真正由 AIServer 返回,失败会报错;仅注册计划任务不能证明服务已运行。
```powershell
powershell.exe -NoProfile -ExecutionPolicy Bypass -File .\Stop-Server.ps1
# 如需同时移除开机任务:增加 -UninstallTask。数据库和日志保留。
```
## 4. 将游戏域名切到新后端
客户端登录/玩法 HTTP:`https://BuddyDefense.xworld.ren:15888`;WebSocket:`wss://BuddyDefense.xworld.ren:15888/ws?pid=...&token=...`。
先给 `BuddyDefense.xworld.ren` 配置指向服务器公网 IPv4 的 DNS A 记录,再准备由 Caddy 管理的该域名有效证书。默认 ACME 需要公网 80/443 的挑战入口,已有 Caddy 继续统一管理证书。微信后台也需更新 request/socket 合法域名配置。
**本机 Caddy 与 AIServer 都使用 15888 时,必须分别绑定网卡 IP 和 127.0.0.1,不能让 Caddy 默认监听全部网卡。** 在服务器运行以下脚本,会自动识别唯一默认网关的 IPv4 网卡并生成配置片段;多网卡时使用 `-ListenIp` 指定:
```powershell
powershell.exe -NoProfile -ExecutionPolicy Bypass -File .\New-CaddySite.ps1
# 多网卡示例:-ListenIp 10.0.0.5(替换成服务器实际网卡 IPv4)
```
将生成的 `BuddyDefense.caddyfile` 内容合入现有 Caddyfile。示意如下,`SERVER_NIC_IPV4` 必须替换为服务器实际网卡地址;云主机有 NAT 时使用网卡上的私网 IPv4,不要填写未分配给网卡的公网地址:
```caddyfile
https://BuddyDefense.xworld.ren:15888 {
bind SERVER_NIC_IPV4
reverse_proxy 127.0.0.1:15888 {
transport http {
read_timeout 0
write_timeout 0
}
}
}
```
对实际使用的 Caddyfile 执行 `caddy.exe validate --config <实际配置路径>`,通过后执行 `caddy.exe reload --config <实际配置路径>`。不要用示例文件替换整个多站点配置;如果当前入口为 IIS/Nginx,在该入口将游戏域名的完整路径反代到同一个地址并启用 WebSocket。
**`/register`、`/login`、`/ws`、`/game/state`、`/game/command` 必须指向同一个 AIServer。不能只转发 `/game/*`:旧 Kestrel 签发的 token 无法由新的 SQLite 服务验证。** `/health` 同样转发用于确认切换。
公网验证:
```powershell
powershell.exe -NoProfile -ExecutionPolicy Bypass -File .\Test-Server.ps1 -BaseUrl https://BuddyDefense.xworld.ren:15888
# 可选完整联调,会新增一个 deploy_probe_* 测试账号:
powershell.exe -NoProfile -ExecutionPolicy Bypass -File .\Test-Server.ps1 -BaseUrl https://BuddyDefense.xworld.ren:15888 -ExerciseAccount
```
切换后,小游戏重新登录获取新服务的 token。旧服务和数据库暂时保留,便于必要时恢复原反代配置。不要将新服务对旧 token 返回的 401 与缺少路由的 404 混淆。
参考:[Windows 计划任务账户](https://learn.microsoft.com/en-us/powershell/module/scheduledtasks/new-scheduledtaskprincipal)、[任务重启设置](https://learn.microsoft.com/en-us/powershell/module/scheduledtasks/new-scheduledtasksettingsset)、[Caddy 反向代理](https://caddyserver.com/docs/caddyfile/directives/reverse_proxy)、[Caddy bind](https://caddyserver.com/docs/caddyfile/directives/bind)。