# 下载主页与域名 HTTPS

2026-09-04 已接入 `redraingame.duckdns.org`，A 记录为台北 `43.212.199.97`。

- 下载首页：`https://redraingame.duckdns.org/`
- 管理后台：`https://redraingame.duckdns.org/admin`，原管理员密钥不变。
- 下载：`/downloads/TeamTunnel-0.6.1-windows-x64.zip`，17,990,437 字节。
- SHA-256：`c48f3ffd8562ed33cf6dcad42c7e400b54b05b745f35dbce63a7594423d88206`。

发布的是已验收 0.6.1 原包，客户端代码和身份未改；仍需 .NET 8 Desktop Runtime x64，页面提供微软官方下载入口。包内没有实际管理员密钥、激活码、私钥或设备状态；保留原构建路径调试元数据，不宣称完全移除个人元数据。包内旧文档仍可能列出 IP 管理地址，日常管理请用域名。

## 服务与兼容边界

nginx 承担公网 80/443。80 仅证书 HTTP-01 验证，其余请求跳转固定域名 HTTPS。443 默认虚拟主机保留 `/etc/teamtunnel-catalog/server.crt` 和 `.key`，旧 IP API 不跳转；精确域名 SNI 使用 Let's Encrypt 证书。不能用域名证书覆盖旧 IP 证书：现有客户端固定原证书 SHA-256。

管理进程仍使用原 release、数据库和密钥，只有 systemd drop-in 修改为 `127.0.0.1:8787`；节点控制仍在 `127.0.0.1:8788`。nginx 仅转发白名单公共路由到 8787，不转发 8788。公开静态根 `/var/www/teamtunnel` 只有网页、CSS、ZIP 和校验文件的精确下载路由，不公开项目、配置或备份目录。

- 配置源码：`deployment/web/`；部署位置为 `/etc/nginx/conf.d/teamtunnel-{http,https}.conf` 与 `/etc/nginx/teamtunnel-{common,static-headers}.conf`。
- 管理覆盖配置：`/etc/systemd/system/teamtunnel-catalog.service.d/website.conf`。
- 一次性切换代码：`deployment/enable-website.py`，含本轮固定 stage 路径及已部署保护，不能当作通用重部署器直接重跑。
- 配置备份：`/var/backups/teamtunnel-web/20260904-domain`，没有回滚数据库。

## 证书续期

证书名 `teamtunnel-web`，当前证书有效期至 2026-12-03。文件在 `/etc/letsencrypt/live/teamtunnel-web/`，私钥只留服务器受保护目录。

`certbot.timer` 已启用；deploy hook `/etc/letsencrypt/renewal-hooks/deploy/teamtunnel-nginx` 先检查 nginx 配置，再只 reload nginx，不重启管理或网关。HTTP-01 模拟续期及 hook 已通过。证书续期要求 80 端口继续可达、域名仍指向本机；未登记通知邮箱或另建监控任务。

若 AWS 公网 IP 变化，除了更新 DNS，还必须评估硬编码 IP 的旧客户端与节点配置迁移，不能仅靠免费域名更新承诺客户端无感。

## 本轮验证

`deployment/test_website_deployment.py`：4 项离线回滚测试在 Windows/Linux 通过。原 nginx 失败导致跳过控制服务恢复的问题已修复并独立复核；回滚只移除本轮新配置，不恢复旧数据库。

`deployment/check-website.py`：通过系统公信 TLS 验证网页/后台，未授权接口拒绝、内部及未知路径 404，完整 ZIP 字节数和哈希、Range/HEAD，旧 IP 固定证书与旧 API 不重定向。测试没有登录、创建或修改设备。

实际切换用时约 0.97 秒，Tailscale 和网关 PID 保持不变；只重启了管理服务。该耗时不等于所有既有连接绝无中断。没有在备用 Windows 做新的 TUN 实测，也没有证明所有同事网络都能直连此免费域名。
