2020 字
10 分钟
失落的龙约私服部署教程

前言#

《失落的龙约》(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 即可
DockerDocker Engine + Compose 插件docker compose version 能输出版本号
域名(可选)一个解析到服务器的子域名公网部署强烈建议,配 HTTPS
客户端Android 设备或模拟器配合 Dragalipatch 改服务器地址

安装 Docker(以 Debian/Ubuntu 为例,已安装可跳过):

Terminal window
curl -fsSL https://get.docker.com | sh

创建工作目录,后续所有文件都放在这里:

Terminal window
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,填入自己的凭据:

Terminal window
# PostgreSQL 连接密码(必填)
POSTGRES_PASSWORD=<自定义强密码>
# PostgreSQL 用户名
POSTGRES_USER=postgres
# PostgreSQL 数据库名
POSTGRES_DB=DragaliaAPI
# 管理端点(如手动导入存档)的 Bearer Token
DEVELOPER_TOKEN=<自定义随机 Token>
# 日志上下文中的主机名,可留空
HOSTNAME=

启动服务:

Terminal window
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:删掉 dragaliaapiports 段(80 端口让给 Caddy),加入 caddywebsite 两个服务:

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 配置文件:

Terminal window
mkdir -p ./config && touch ./config/Caddyfile

Caddyfile 内容如下。游戏客户端请求的路径前缀是固定的,必须逐条转发给 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 # 其余流量给网页前端
}

重启整套服务:

Terminal window
docker compose up -d

浏览器访问 http://203.0.113.10,能看到网页前端即为成功。前端「新闻」页面此时内容为空是正常现象(数据库还没有公告数据);只要页面能正常渲染,就说明前端、API、数据库的链路已通。

第三步:域名与 HTTPS#

公网开放时,务必启用 HTTPS。Caddy 内置 ACME 客户端,可以自动签发 Let’s Encrypt 证书,共四步:

  1. 在域名服务商处添加 A 记录,把 dl.example.com 解析到 203.0.113.10
  2. Caddyfile 第一行的 :80 改成 dl.example.com
  3. docker-compose.ymlcaddy 服务中追加 - "443:443" 端口映射;
  4. 重启服务:docker compose up -d,等待 Caddy 自动完成 ACME 验证(日志出现 certificate obtained 即可)。

完成后访问 https://dl.example.com 确认证书生效。使用自签证书、已购证书或套 Cloudflare 代理等场景的配置方式不同,参考 Caddy 官方文档调整。

第四步:客户端连接#

  1. 在 Android 设备(或模拟器)上安装原版游戏与 Dragalipatch
  2. 打开 Dragalipatch,服务器地址填 https://dl.example.com(必须带 http://https:// 前缀,不带前缀时 Dragalipatch 默认按 HTTPS 处理);
  3. 资源 CDN 保持默认的公共源即可,自建资源服务属于进阶内容(见文末);
  4. 启动游戏,注册账号并登录。

账号认证由 BaaS 服务负责。本文的部署方式不包含自建 BaaS,客户端默认使用社区托管的公共实例;如果希望账号体系完全自托管,参考 DragaliaBaasServer 项目自行部署,属于进阶内容。

日常维护#

升级版本:到 package 页面确认 dragalia-apidawnshard-website 的最新 tag,更新 docker-compose.yml 中的镜像 tag,然后:

Terminal window
docker compose down
docker compose up -d

备份数据:玩家数据全部存放在 pgdata 卷中。定期执行:

Terminal window
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。修改内核参数前先确认自己了解安全影响。

健康检查不通过/healthApiContext 不健康时,通常是数据库连接信息有误:检查 .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 及社区逆向团队的持续维护。

失落的龙约私服部署教程
https://blog.anyul.cn/posts/dragalia-private-server/
作者
安雨落
发布于
2026-09-03
许可协议
CC BY-NC-SA 4.0

分享文章

生成精美分享图或复制链接,与更多人分享本文。