前言
《失落的龙约》(Dragalia Lost)是任天堂与 Cygames 合作推出的手游,已于 2022 年 11 月 30 日停服。社区通过逆向工程实现了服务器模拟器,让这款游戏能在私人服务器上继续运行。目前主要的模拟器项目是 Dawnshard(C# / ASP.NET Core,MIT 协议),配套的账号认证服务是 DragaliaBaas,客户端改版工具是 LukeFZ 的 Dragalipatch。
本文基于上述项目的官方自托管文档,介绍在一张 VPS 上部署完整私服的流程:最小服务端 → 网页前端与反向代理 → 域名与 HTTPS → 客户端连接 → 日常维护。
[!WARNING] 免责声明 失落的龙约的商标与全部游戏资源归任天堂、Cygames 所有。部署私服仅供个人学习与 Preservation 研究用途,请勿将服务对公众开放运营、不要分发游戏客户端与资源文件。由此产生的一切后果自行承担。
准备工作
开始之前,确认以下条件全部满足:
| 项目 | 要求 | 说明 |
|---|---|---|
| 服务器 | 1 台 VPS,2 核 2G 起 | 游戏资源默认走社区公共 CDN,服务器本身压力不大 |
| 操作系统 | Ubuntu 22.04 / Debian 12 等 | 能装 Docker 即可 |
| Docker | Docker Engine + Compose 插件 | docker compose version 能输出版本号 |
| 域名(可选) | 一个解析到服务器的子域名 | 公网部署强烈建议,配 HTTPS |
| 客户端 | Android 设备或模拟器 | 配合 Dragalipatch 改服务器地址 |
安装 Docker(以 Debian/Ubuntu 为例,已安装可跳过):
curl -fsSL https://get.docker.com | sh创建工作目录,后续所有文件都放在这里:
mkdir -p ~/dragalia && cd ~/dragalia第一步:最小可用服务端
这一步启动三个容器:游戏 API(dragaliaapi)、PostgreSQL 数据库、Redis 缓存。
新建 docker-compose.yml,内容如下:
volumes: pgdata:services: dragaliaapi: image: ghcr.io/sapiensanatis/dragalia-api:4.0.59 environment: - ConnectionStrings__Postgres=Host=postgres;User ID=${POSTGRES_USER};Password=${POSTGRES_PASSWORD};Database=${POSTGRES_DB} - ConnectionStrings__Redis=redis ports: - "80:8080" # 监听 80 端口;公网 HTTP 入口 env_file: - .env postgres: hostname: postgres image: postgres:17 env_file: - .env volumes: - pgdata:/var/lib/postgresql/data redis: hostname: redis image: redis:8镜像 tag 4.0.59 是写作时的版本。官方更新较频繁,部署前到 package 页面确认最新 tag 并替换。
在同目录新建 .env,填入自己的凭据:
# PostgreSQL 连接密码(必填)POSTGRES_PASSWORD=<自定义强密码># PostgreSQL 用户名POSTGRES_USER=postgres# PostgreSQL 数据库名POSTGRES_DB=DragaliaAPI# 管理端点(如手动导入存档)的 Bearer TokenDEVELOPER_TOKEN=<自定义随机 Token># 日志上下文中的主机名,可留空HOSTNAME=启动服务:
docker compose up -d验证部署结果。浏览器访问 http://203.0.113.10/health,三个检查项均为 Healthy 即为成功:
{ "status": "Healthy", "results": { "self": { "status": "Healthy" }, "ApiContext": { "status": "Healthy" }, "Redis": { "status": "Healthy" } }}任何一项不是 Healthy,先用 docker compose logs dragaliaapi 查看日志,再按文末「故障排查」处理。
第二步:网页前端 + 反向代理
第一步的裸 API 只适合本机验证。公网部署需要再加两个组件:
- Caddy 反向代理:API 不支持 CORS,网页前端和游戏 API 必须从同一个域名、同一个端口对外服务,由 Caddy 按路径分发;
- dawnshard-website:官方网页前端,提供公告、排行、存档管理等页面。
修改 docker-compose.yml:删掉 dragaliaapi 的 ports 段(80 端口让给 Caddy),加入 caddy 和 website 两个服务:
volumes: pgdata: caddydata:services: caddy: image: docker.io/caddy:2 ports: - "80:80" volumes: - ./config:/etc/caddy # Caddyfile - caddydata:/data # 证书等持久化数据
dragaliaapi: image: ghcr.io/sapiensanatis/dragalia-api:4.0.59 environment: - ConnectionStrings__Postgres=Host=postgres;User ID=${POSTGRES_USER};Password=${POSTGRES_PASSWORD};Database=${POSTGRES_DB} - ConnectionStrings__Redis=redis env_file: - .env
website: image: ghcr.io/sapiensanatis/dawnshard-website:1.0.138 environment: - DAWNSHARD_API_URL_SSR=http://dragaliaapi:8080
postgres: hostname: postgres image: postgres:17 env_file: - .env volumes: - pgdata:/var/lib/postgresql/data
redis: hostname: redis image: redis:8创建 Caddy 配置文件:
mkdir -p ./config && touch ./config/CaddyfileCaddyfile 内容如下。游戏客户端请求的路径前缀是固定的,必须逐条转发给 API,其余流量交给网页前端:
:80 { # 屏蔽健康检查端点的外部访问 respond /health 404 respond /ping 404 respond /metrics 404 reverse_proxy /api/* dragaliaapi:8080 # 网页前端调用的 API reverse_proxy /2.19.0_20220714193707/* dragaliaapi:8080 # 安卓客户端 reverse_proxy /2.19.0_20220719103923/* dragaliaapi:8080 # iOS 客户端 reverse_proxy /dragalipatch/config dragaliaapi:8080 # Dragalipatch 配置 reverse_proxy website:3000 # 其余流量给网页前端}重启整套服务:
docker compose up -d浏览器访问 http://203.0.113.10,能看到网页前端即为成功。前端「新闻」页面此时内容为空是正常现象(数据库还没有公告数据);只要页面能正常渲染,就说明前端、API、数据库的链路已通。
第三步:域名与 HTTPS
公网开放时,务必启用 HTTPS。Caddy 内置 ACME 客户端,可以自动签发 Let’s Encrypt 证书,共四步:
- 在域名服务商处添加 A 记录,把
dl.example.com解析到203.0.113.10; - 把
Caddyfile第一行的:80改成dl.example.com; - 在
docker-compose.yml的caddy服务中追加- "443:443"端口映射; - 重启服务:
docker compose up -d,等待 Caddy 自动完成 ACME 验证(日志出现 certificate obtained 即可)。
完成后访问 https://dl.example.com 确认证书生效。使用自签证书、已购证书或套 Cloudflare 代理等场景的配置方式不同,参考 Caddy 官方文档调整。
第四步:客户端连接
- 在 Android 设备(或模拟器)上安装原版游戏与 Dragalipatch;
- 打开 Dragalipatch,服务器地址填
https://dl.example.com(必须带http://或https://前缀,不带前缀时 Dragalipatch 默认按 HTTPS 处理); - 资源 CDN 保持默认的公共源即可,自建资源服务属于进阶内容(见文末);
- 启动游戏,注册账号并登录。
账号认证由 BaaS 服务负责。本文的部署方式不包含自建 BaaS,客户端默认使用社区托管的公共实例;如果希望账号体系完全自托管,参考 DragaliaBaasServer 项目自行部署,属于进阶内容。
日常维护
升级版本:到 package 页面确认 dragalia-api 与 dawnshard-website 的最新 tag,更新 docker-compose.yml 中的镜像 tag,然后:
docker compose downdocker compose up -d备份数据:玩家数据全部存放在 pgdata 卷中。定期执行:
docker compose exec postgres pg_dump -U postgres DragaliaAPI > backup_$(date +%F).sql查看日志:docker compose logs -f dragaliaapi。正常的 API 请求日志形如 HTTP GET /api/news responded 200,出现 500 或持续重启再排查。
故障排查
80 端口绑定失败。Linux 上以 rootless 模式运行 Docker 时,绑定 1024 以下端口会被拒绝,报错包含 cannot expose privileged port 80。两种解法任选其一:把 compose 里的端口映射改成 8080:80(Caddy 对外仍走反代或改由外层网关承接),或按官方文档把 net.ipv4.ip_unprivileged_port_start=80 写入 /etc/sysctl.d/ 后执行 sudo sysctl --system。修改内核参数前先确认自己了解安全影响。
健康检查不通过。/health 中 ApiContext 不健康时,通常是数据库连接信息有误:检查 .env 中的 POSTGRES_* 三项与 compose 中连接字符串是否一致。Redis 不健康时,检查 redis 容器是否启动、ConnectionStrings__Redis 是否为 redis。
客户端连不上。按顺序检查:域名解析是否生效(ping dl.example.com 返回服务器 IP)、Caddy 是否拿到证书、Caddyfile 中两条版本号路径转发是否原样保留(路径中的版本号不是占位符,不能改)。
已知边界
- 联机(共斗):需要额外部署 Photon Server,官方授权费用较高,个人部署通常只玩单机内容;
- 自建资源 CDN:全量资源约 10 GB,含历史活动资源超过 50 GB,且分发游戏资源存在版权风险,默认公共 CDN 不可用时再考虑,方案见官方 Wiki 的 Assets 一节;
- 版本兼容:API 不遵循语义化版本,升级前留意官方公告,保留旧镜像 tag 以便回滚。
参考
最后,感谢 Dawnshard 及社区逆向团队的持续维护。
分享文章
生成精美分享图或复制链接,与更多人分享本文。
最后更新于 ,距今已过 0 天
部分内容可能已过时