预填充¶
预填充会在人们连接之前把游戏下载进你的缓存。等客人到场时,每次安装都从你的缓存读取,而不是走公共互联网——满速 LAN,没有带宽瓶颈。
Steam、Epic、Battle.net、Riot 和 Xbox 各自在独立的容器中运行,因此你可以同时预填充所有平台而互不干扰。进度会实时推送到 UI。

选择一个平台,开始一次预填充会话
要求¶
- 已挂载 Docker 套接字(
/var/run/docker.sock) - 以管理员或普通用户账号登录 LANCache Manager(访客只能在管理员授权的平台上进行预填充)
- 预填充容器可以访问到你的缓存服务器(参见下方的网络设置)
运行一次预填充¶
每个平台的流程都一样:
- 打开预填充标签页,选择 Steam、Epic Games、Battle.net、Riot Games 或 Xbox
- 登录(Steam 通过 Steam Guard 验证,Epic 通过 OAuth,Xbox 通过 Microsoft 设备代码;Battle.net 和 Riot 无需登录)
- 从你的游戏库中选择游戏
- 点击开始会话
就这么简单。让它继续运行——等客人到达时,一切都已经缓存好了。
Note
预填充构建在社区守护进程之上:
- Steam:steam-prefill-daemon,steam-lancache-prefill 的分支,原作者 @tpill90
- Epic:epic-prefill-daemon——通过 OAuth 登录账号
- Battle.net:battlenet-prefill-daemon——完全匿名,无需账号
- Riot:riot-prefill-daemon,基于 @tpill90 的 lancache-prefill 系列工具构建——完全匿名;覆盖英雄联盟和无畏契约
- Xbox:xbox-prefill-daemon——使用 Microsoft 设备代码登录(与 Epic 一样需要账号)
导入 Steam App ID¶
手头有来自 steam-lancache-prefill 或其他地方的 App ID 列表?可以跳过库浏览器:
- 点击选择应用
- 点击导入应用 ID
- 以下列任一格式粘贴你的 ID:
- 逗号分隔:
730, 570, 440 - JSON 数组:
[730, 570, 440] - 每行一个
- 点击导入
对话框会告诉你添加了多少个游戏、有多少已经在选中列表中、以及有多少 ID 不在你的 Steam 游戏库中(这些不会被加入你的选择)。
Tip
从 steam-lancache-prefill 迁移过来? 打开 selectedAppsToPrefill.json,把内容直接粘贴到导入框中——JSON 数组会按原样解析。
计划预填充¶
配置一次,从此不必在每场活动前手动预填充。打开管理 → 计划任务,找到计划预填充卡片。卡片只有一个全局运行操作和一个全局操作菜单。运行会立即启动已启用的已保存计划。操作菜单用于打开“活动”和“共享容器设置”。
每个服务都会用独立的行列出其已保存计划。每一行对应一条确切的已保存计划;该行的运行只会启动这条计划。选择编辑计划会打开这条记录。保存更改并关闭编辑窗口,然后从对应行选择运行此计划。未保存的更改不会影响运行。
为服务添加计划和复制都会打开一份草稿。只有选择保存计划后,系统才会创建计划。删除已保存的计划不会停止服务容器,也不会删除已缓存的游戏;每个服务必须保留至少一条已保存计划。
每个服务只有一个由其所有计划共享的容器。通过管理此服务的容器启动容器并登录。计划运行只会复用已经运行的容器,绝不会自行启动容器。如果需要账号的服务尚未就绪,其计划会以“需要登录”状态跳过,其他服务仍会继续。若所有计划都被跳过,本次运行会报告为未成功,并在通知中显示原因。
共享容器设置为所有服务容器提供默认值。服务已有的重启后覆盖设置仍会优先生效。停止服务容器会将其注销并清除保存的登录。Steam、Epic 或 Xbox 的登录只能由保存该登录的 LANCache 账号复用。Battle.net 和 Riot 采用匿名方式,无需账号,但它们的共享服务容器仍必须处于运行状态。
活动会在同一视图中显示 Steam、Epic、Xbox、Battle.net 和 Riot。你可以查看当前下载和运行历史,也可以取消当前下载。游戏选择属于确切的已保存计划。若要删除已缓存的游戏内容,请使用管理 → 游戏缓存移除,不要通过删除计划来处理。
其他计划行为仍按服务区分:
- 间隔和状态。 每条已保存计划都有自己的“运行频率”间隔。你可以暂停计划,也可以将其设置为仅在启动时运行。首次自动运行会在保存后的一个间隔之后触发;保存本身不会开始运行。
- 预设或手动选择游戏。 预设有全部、最近和前 N 项三种。Epic 没有“最近”,因为它的 API 不提供最近游玩数据。Battle.net 和 Riot 只支持“全部”。为某条计划选择的游戏会覆盖其预设。
- 新计划历史。 新的已保存计划会一直显示“上次运行:从未运行”,直到该计划首次运行完成。下次运行时间按其间隔推算。
- 目标平台。 只有 Steam 支持 Windows、Linux 和 macOS depot 筛选,默认值为 Windows。
- 下载控制。 强制重新下载默认关闭。连接数可以是自动,也可以固定为 1 到 256。每条计划都可以正常显示运行通知或静默运行。
默认值和限制:
| 设置项 | 默认值 |
|---|---|
| 运行频率(每计划) | 24 小时 |
| 预设 | 全部("前 N 项"预设使用排名前 50 的游戏) |
| 持久登录有效期 | 90 天 |
| 无进展超时(每次计划运行) | 30 分钟 |
| 强制下载 | 关闭 |
| 最大并发数 | 自动(固定范围:1-256) |
| 单服务最长运行时间 | 12 小时 |
计划任务页面的其余部分,对每个后台服务都采用相同的方式工作——日志轮转、失效扫描、游戏检测、缓存快照等等。每个服务都是一行,各有自己的间隔,行尾带一个运行控件。这里也有一行 Xbox 游戏映射,让 Xbox 游戏目录能按自己的计划刷新。
网络设置¶
大多数安装无需任何配置。 如果你运行的是标准的 lancache + lancache-dns 容器,lancache-manager 会自动检测它们,预填充无需额外设置即可工作。
如果你的 DNS 不是标准的 lancache-dns(比如使用 AdGuard Home、Pi-hole、公共 DNS 等)或者路由方式比较特殊,设置一个环境变量就能解决:
| 你的环境 | 需要设置什么 |
|---|---|
标准 lancache + lancache-dns 容器 |
无需设置 |
| 单机安装(lancache 与 lancache-manager 在同一主机) | 无需设置 |
| AdGuard Home、Pi-hole 或任何 DNS 替代方案 | Prefill__LancacheIp=<你的缓存 IP> |
| 主机网络模式,且主机 DNS 未将 CDN 路由到你的缓存 | 通常无需设置——缓存会通过网桥网关自动检测并经心跳验证;如果网络面板仍然警告,再设置 Prefill__LancacheIp=<你的缓存 IP> |
Caddy/Squid 等按 Host: 头路由的非 nginx 缓存 |
Prefill__LancacheIp=<你的缓存 IP> |
| 希望无论环境如何都有可预测的行为 | 始终设置 Prefill__LancacheIp |
Tip
Prefill__LancacheIp 是通用覆盖项。 设置后,预填充会直接通过 IP 与你的缓存通信,完全不再询问 DNS 缓存在哪里。网络模式和 DNS 服务器设置对 CDN 流量不再有影响。
Prefill__LancacheIp、Prefill__LancacheDnsIp 和 Prefill__NetworkMode 的完整说明与默认值位于配置 → 预填充参考表中。
Important
LancacheIp 和 LancacheDnsIp 是两个不同的服务,即使在同一台机器上也是如此。
| 是什么 | 端口 | 作用 | |
|---|---|---|---|
LancacheIp |
缓存服务器(lancachenet/monolithic,或任何 HTTP 缓存) |
HTTP / 80 | 保存实际的缓存游戏文件 |
LancacheDnsIp |
DNS 服务器(lancachenet/lancache-dns、AdGuard Home、Pi-hole 等) |
DNS / 53 | 把 lancache.steamcontent.com 转换成缓存的 IP |
想象一座小镇:缓存是存放书的图书馆,DNS 服务器是你问路的问讯处。两者可以在同一栋楼里(同一个 IP,不同端口),但做的是不同的工作。设置 LancacheIp 相当于径直走向图书馆,所以 DNS 对缓存流量不再有影响。
Important
LANCACHE_IP 只重定向 CDN 分块流量,而这本来就是 lancache 唯一会缓存的内容。Steam(api.steampowered.com)和 Epic(*.epicgames.com)的认证与清单端点仍然使用正常 DNS,不受影响。
示例¶
最可靠——LancacheIp 让 CDN 路由不再依赖 DNS:
Bridge 模式配合非标准 DNS(例如用 AdGuard Home 替代 lancache-dns):
environment:
- Prefill__NetworkMode=bridge
- Prefill__LancacheIp=192.168.1.10 # 缓存服务器
- Prefill__LancacheDnsIp=192.168.1.20 # DNS 服务器
Bridge 模式,标准 lancache-dns,无 IP 覆盖(传统的 DNS 驱动路径):
Tip
预填充容器没有互联网? 试试 Prefill__NetworkMode=bridge。
网络诊断¶
每次预填充会话启动时都会运行一次连通性测试,并把结果写入日志:
═══════════════════════════════════════════════════════════════════════
PREFILL CONTAINER NETWORK DIAGNOSTICS - prefill-daemon-abc123
═══════════════════════════════════════════════════════════════════════
Internet connectivity: OK (reached api.steampowered.com)
lancache.steamcontent.com resolved to 192.168.1.10
DNS looks correct (private IP - likely your lancache server)
═══════════════════════════════════════════════════════════════════════
如果解析出的 IP 是公网地址(Steam 真实 CDN 的 IP 形如 162.254.x.x),说明流量绕过了你的缓存。设置 Prefill__LancacheIp 并重启会话。
路由工作原理(高级)——请求究竟走哪条路径
---
config:
flowchart:
curve: basis
padding: 12
---
flowchart TD
Start([需要从 CDN 主机名<br/>获取一个游戏分块])
HasIp{LANCACHE_IP 可用?<br/>Prefill__LancacheIp 或<br/>自动检测并已验证}
Start --> HasIp
HasIp -->|是| Direct[直接连接该 IP<br/>Host 头 = CDN 主机名]
Direct --> Hit([由你的缓存提供服务])
HasIp -->|否| AskDns[向 DNS 询问<br/>CDN 主机名指向哪里]
AskDns --> Mode{NetworkMode?}
Mode -->|host| HostDns[使用主机自己的 DNS<br/>Prefill__LancacheDnsIp 被忽略]
Mode -->|bridge| Bridge{设置了 Prefill__LancacheDnsIp?}
Bridge -->|是| Forced[查询该 DNS 服务器]
Bridge -->|否| Probe[守护进程探测 CDN 名、<br/>localhost,然后是网关]
HostDns --> Resolved{DNS 返回了<br/>你的缓存 IP?}
Forced --> Resolved
Probe --> Resolved
Resolved -->|是| Hit
Resolved -->|否| Miss([公网 CDN IP<br/>流量绕开你的缓存])
所有组合:
NetworkMode |
LancacheIp |
LancacheDnsIp |
结果 |
|---|---|---|---|
host |
已设置 | (任意) | 可靠。已注入 LANCACHE_IP;DNS 无关紧要。 |
host |
未设置 | (任意) | 通常没问题。自动检测 + 心跳会注入 LANCACHE_IP;否则使用主机 DNS。host 模式下 DnsIp 会被丢弃。 |
bridge |
已设置 | 未设置 | 可靠。已注入 LANCACHE_IP;DNS 无关紧要。 |
bridge |
已设置 | 已设置 | 可靠。LANCACHE_IP 用于 CDN,DnsIp 用于认证/清单。 |
bridge |
未设置 | 已设置 | 如果 DnsIp 能把 CDN 解析到你的缓存则有效。 |
bridge |
未设置 | 未设置 | 通常没问题。自动检测会注入 LANCACHE_IP;否则守护进程探测 localhost/网关。 |
为什么 LancacheIp 总是有效: 设置后,守护进程会请求 GET http://192.168.1.10/depot/...,并带上 Host: lancache.steamcontent.com。你的缓存按 Host: 路由并从缓存提供服务。DNS 不会被问及 CDN 域名。