89 lines
5.3 KiB
Markdown
89 lines
5.3 KiB
Markdown
# 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)。
|