安装与服务
将无界面 Throne 安装为 systemd 服务、systemd 用户单元、Docker 容器、macOS LaunchDaemon 或 Windows 服务。
无界面 Throne 就是以 --headless 启动的普通 Throne 程序。请按照安装中的说明安装 Throne,然后让服务管理器运行它。本页介绍在各个系统上的做法:
| 系统 | 服务管理器 | 运行身份 | 数据目录 |
|---|---|---|---|
| Debian、Ubuntu、Raspberry Pi OS、Fedora、openSUSE | systemd 系统单元 | root(或用户 throne) |
/var/lib/throne |
| 任意 Linux,无需 root | systemd 用户单元 | 你自己 | ~/.config/Throne |
| Docker | Docker 或 Docker Compose | 容器中的 root | 卷 /var/lib/throne |
| macOS | launchd LaunchDaemon | root | /Library/Application Support/Throne |
| Windows | Windows 服务 | LocalSystem | C:\ProgramData\Throne |
安装完成后,请按照使用 thronectl 管理中的说明连接 thronectl。
Debian、Ubuntu、Raspberry Pi OS、Fedora、openSUSE
来自发布页面和软件源的 .deb 与 .rpm 软件包会把 Throne 安装到 /opt/Throne,并安装 systemd 单元 throne.service 和环境文件 /etc/throne/throne.env。请根据系统的 C 库(glibc)选择软件包:
| 软件包 | 需要 | 可运行于,例如 |
|---|---|---|
Throne-<version>-debian-amd64.deb、…-fedora-amd64.rpm |
glibc 2.34 | Debian 12、Ubuntu 22.04、Fedora、openSUSE Tumbleweed |
…-amd64-system-qt.deb、…-amd64-system-qt.rpm |
glibc 2.34 和系统的 Qt 6 | 同上,使用发行版提供的 Qt |
Throne-<version>-debian-arm64-system-qt.deb |
glibc 2.34 和系统的 Qt 6 | arm64 上的 Raspberry Pi OS bookworm、Debian 12、Ubuntu 22.04 |
Throne-<version>-debian-arm64.deb、…-fedora-arm64.rpm |
glibc 2.38 | Ubuntu 24.04、Debian 13、Raspberry Pi OS trixie |
每个软件包都依赖其文件所需的 glibc 版本,因此包管理器会拒绝安装对系统而言过新的软件包,而不是装上一个无法启动的 Throne。在运行 Raspberry Pi OS bookworm(glibc 2.36)的树莓派上,请使用 arm64 的 system-qt 软件包。
不带 system-qt 的软件包自带 Qt,但仍然依赖系统的图形、字体和 X11 库,因为同一个 Throne 程序也包含桌面版。包管理器会安装这些库。不需要任何显示器。
安装软件包并启动服务:
sudo apt install ./Throne-<version>-debian-amd64.deb # 或:sudo dnf install ./Throne-<version>-fedora-amd64.rpm
sudo /opt/Throne/Throne --check # 可选:这台电脑能否运行它?
sudo systemctl enable --now throne
- 软件包从不自行启用或启动该单元。升级时,如果该单元正在运行,会重启它;卸载软件包时会停止并禁用它。
- 卸载软件包后,
/var/lib/throne(配置档、设置和 API 密钥)仍会保留,即使使用apt purge也是如此。要从头开始,请自行删除它。 systemctl start throne会在 Throne 启动完成后返回。参见 systemd:就绪、状态与看门狗。/etc/throne/throne.env为该单元可以使用的每个变量都提供了一个注释掉的示例。取消某一行的注释,然后运行sudo systemctl restart throne。升级会保留你的修改。切勿把 API 密钥放进这个文件;请改用THRONE_API_KEY_FILE指定一个密钥文件。- 日志:
journalctl -u throne -f。
要更改命令行,请用 sudo systemctl edit throne 添加一个 drop-in 文件:
[Service]
ExecStart=
ExecStart=/opt/Throne/Throne --headless --data-dir=%S/throne --debug
该单元以 root 身份运行 Throne。Linux 上的权限将这种方式与其他运行方式做了比较。
其他 Linux 安装方式
安装脚本会把 Throne 放在 /opt/Throne 中,便携版 ZIP 则位于你解压到的位置。两者都不安装单元。请自行安装该单元:
curl -fsSLo throne.service https://raw.githubusercontent.com/throneproj/Throne/dev/dist/linux/throne.service
sudo install -m 644 throne.service /etc/systemd/system/throne.service
sudo systemctl daemon-reload
sudo systemctl enable --now throne
该单元运行 /opt/Throne/Throne。如果 Throne 在其他文件夹中,请像下面 AUR 软件包那样用 drop-in 文件修改这个路径。对这个单元来说,/etc/throne/throne.env 是可选的。如果想要其中的示例,请把 dist/linux/throne.env 保存到那里。
AUR 软件包是单独维护的,它会把 Throne 安装到 /usr/lib/throne。如果它没有附带单元,请安装上面的单元,并用 drop-in 文件(sudo systemctl edit throne)让它指向该路径:
[Service]
ExecStart=
ExecStart=/usr/lib/throne/Throne --headless --data-dir=%S/throne
Linux 上的权限
TUN 和 Kill Switch 需要权限。使用额外核心(Extra Core)的配置档需要一个普通用户来运行该核心,因为 Throne 从不以 root 身份运行额外核心。请选择该单元的运行方式:
| 单元的运行方式 | TUN | Kill Switch | 额外核心配置档 | 适用于 |
|---|---|---|---|---|
| 以 root 身份(单元的原始配置) | 是 | 是 | 否 | 网关和专用设备 |
以 throne 身份并借助能力(caps.conf) |
是 | 否(unsupported) |
是 | 不需要 Kill Switch 的代理设备 |
以 throne 身份,搭配 setuid root 的 ThroneCore |
是 | 是 | 是 | 全部功能,且 Throne 本身无需以 root 身份运行 |
以 throne 身份,不做其他设置 |
否 | 否 | 是 | 仅代理(混合入站) |
能力(capabilities)。 下载 caps.conf,然后运行:
sudo useradd --system --no-create-home --home-dir /var/lib/throne --shell /usr/sbin/nologin throne
sudo install -Dm644 caps.conf /etc/systemd/system/throne.service.d/caps.conf
sudo systemctl daemon-reload && sudo systemctl restart throne
下次启动时,systemd 会把 /var/lib/throne 交给 throne 所有。在这种配置下,ThroneCore 不能带有 setuid 位,也不能带有文件能力,因为运行这样的文件会丢弃该单元授予的能力。
setuid 核心。 使用一个在 [Service] 下只包含 User=throne 和 Group=throne 的 drop-in 文件,并让核心以 root 身份运行:
sudo chown root:root /opt/Throne/ThroneCore && sudo chmod u+s /opt/Throne/ThroneCore
软件包升级会用不带 setuid 位的文件替换 ThroneCore。在 Debian 和 Ubuntu 上,以下命令可以让该位在升级后保留:
sudo dpkg-statoverride --update --add root root 4755 /opt/Throne/ThroneCore
不要在该单元中添加 NoNewPrivileges=,也不要添加隐含它的加固选项:它会使 setuid 核心无法工作。
thronectl status 会在 capabilities.tun 和 capabilities.kill_switch 中显示这个 Throne 能做什么。核心会自行检查能否打开 /dev/net/tun 以及是否拥有 CAP_NET_ADMIN,因此没有 NET_ADMIN 的 root 容器会报告 false,而不是在之后才失败。
systemd 用户单元
没有 root 权限时,Throne 以用户单元的形式在你自己的会话中运行。下载 throne-user.service,然后运行:
install -Dm644 throne-user.service ~/.config/systemd/user/throne.service
systemctl --user daemon-reload && systemctl --user enable --now throne
loginctl enable-linger "$USER" # 开机时启动,无需登录
- 该单元使用桌面版的数据目录
~/.config/Throne,因此拥有相同的配置档和设置。请先退出桌面版。该单元运行期间,桌面版会提示 Throne 正在后台运行,然后退出。打开桌面版之前,请先运行systemctl --user stop throne。 - TUN 和 Kill Switch 需要 setuid root 的核心。桌面版第一次请求权限时会完成这项设置(参见 Linux 权限),
Throne --check也会打印所需的命令。 - 当你以自己的用户身份运行时,
Throne --health、Throne --print-connection和Throne --check无需任何选项就能找到这个 Throne。
Docker
镜像 ghcr.io/throneproj/throne:<version>(也有 latest)为 linux/amd64 和 linux/arm64 构建。它在 /opt/Throne 中包含 Throne,在 /usr/local/bin 中包含 thronectl,并以 tini 作为 init。它把数据保存在卷 /var/lib/throne 中,需要重启时以退出码 75 退出,并使用 Throne --health 作为健康检查。
请从 Throne 代码仓库中的 compose.yaml 开始。它使用 latest 标签;把那里换成某个发布版标签,就可以按你自己的节奏更新。
curl -fsSLO https://raw.githubusercontent.com/throneproj/Throne/dev/docker/compose.yaml
docker compose up -d
docker compose exec throne thronectl --key-file /var/lib/throne/config/api.key status
该文件的重要部分:
services:
throne:
image: ghcr.io/throneproj/throne:latest # 或某个发布版标签
restart: unless-stopped
stop_grace_period: 45s
cap_add: [NET_ADMIN] # TUN 和 Kill Switch
devices: ["/dev/net/tun:/dev/net/tun"] # TUN 和 Kill Switch
volumes: ["throne-data:/var/lib/throne"]
ports: ["2080:2080"] # 混合(HTTP 和 SOCKS)入站
volumes:
throne-data:
注意事项:
- 代理端口。 混合入站默认监听
127.0.0.1,发布的端口无法访问它。请运行thronectl settings set inbound_address=0.0.0.0,然后重新启动配置档。Docker 发布的端口会绕过ufw等主机防火墙:在可以从互联网访问的主机上,请只发布局域网地址,例如"192.168.1.2:2080:2080"。 - TUN 和 Kill Switch 需要
cap_add: [NET_ADMIN]和设备/dev/net/tun。没有它们,容器仍然可以提供混合入站。 - 主机网络。 使用
network_mode: host(且没有ports:)时,TUN 和 Kill Switch 作用于整个主机,并且主机上只能有一个 Throne 运行 TUN。参见与桌面版 Throne 同时运行。 - 停止。 请保留
stop_grace_period: 45s。Docker 默认的 10 秒可能会在 Throne 停止其核心之前就将其杀死。使用restart: unless-stopped时,Docker 会在每次退出后重新启动 Throne,即使是在thronectl shutdown之后;请用docker compose stop停止它。 - 健康状态。 Docker 只会把容器标记为不健康,而不会重启它。
- 限制。 额外核心配置档无法运行,因为容器以 root 身份运行。在 rootless Docker 和其他使用用户命名空间的容器中,Kill Switch 会以
unsupported失败(参见 Throne 如何保持可访问)。 - 选项。 把变量写在
environment:下,或者用command:添加参数,Docker 会把它们追加在--headless之后。只能用THRONE_DATA_DIR更改数据目录,因为健康检查要通过它找到 Throne。 - 不带
--key-file使用 thronectl。 在environment:下添加THRONE_KEY_FILE: /var/lib/throne/config/api.key,这样docker compose exec throne thronectl status就可以直接使用。Throne 本身会忽略这个变量。 - 导入文件。 使用
-T通过管道传入:docker compose exec -T throne thronectl import - < links.txt。 - 从容器外部访问 API。 API 监听的是容器的环回地址。要从网络访问它,请设置
THRONE_API_LISTEN: "*:9095"并提供THRONE_API_ALLOW列表,然后发布端口 9095。此时,导入和设置等管理请求还需要THRONE_API_ADMIN_LAN: "1",因为经过发布端口的每个请求都来自容器外部。在 Docker 的 NAT 之后,所有客户端共用同一个地址,因此一个使用旧密钥的客户端会把其他客户端锁在外面一分钟。 - 日志:
docker compose logs -f throne。
macOS
LaunchDaemon 会在开机时以 root 身份运行 Throne。TUN 和 Kill Switch 可以工作;额外核心配置档不能。请先把 Throne.app 移到 /Applications,下载 moe.Throne.headless.plist,然后运行:
sudo mkdir -p /Library/Logs/Throne
sudo install -m 644 -o root -g wheel moe.Throne.headless.plist /Library/LaunchDaemons/
sudo xattr -dr com.apple.quarantine /Applications/Throne.app # 仅限未签名的版本
sudo launchctl bootstrap system /Library/LaunchDaemons/moe.Throne.headless.plist
- 停止并卸载它:
sudo launchctl bootout system/moe.Throne.headless。 - 它的数据位于
/Library/Application Support/Throne,输出位于/Library/Logs/Throne/throne.log。 - 该 plist 直接运行程序文件,因此 launchd 能跟踪该进程。切勿用
open启动无界面 Throne:那样会把它交给 LaunchServices,并立即返回。 - launchd 会在 Throne 以错误退出 10 秒后再次启动它。它无法排除特定的退出码,因此对于重新启动也无法解决的退出,它同样会每 10 秒重试一次:另一个 Throne 正在使用该数据目录(退出码 3)、错误的选项(退出码 64)以及配置错误(退出码 78)。如果 Throne 不断启动又退出,请阅读日志。
- 查看它的状态:
sudo /Applications/Throne.app/Contents/MacOS/Throne --health。
Windows 服务
Throne.exe --headless --service 以原生 Windows 服务的形式在 LocalSystem 账户下运行,因此 TUN 和 Kill Switch 可以工作。
-
使用安装程序为所有用户安装 Throne,安装到
Program Files中。服务不能运行普通用户可以替换的程序,因此不要使用按用户安装的方式,也不要使用放在你用户文件夹中的 ZIP。 -
在以管理员身份运行的命令提示符中运行:
install-service.bat如果 Throne 位于其他文件夹,请指定路径:
install-service.bat "D:\Apps\Throne\Throne.exe"。
该脚本会创建服务 Throne,让它在开机后启动(延迟启动),并设置其恢复操作:
sc.exe failure Throne reset= 86400 actions= restart/3000/restart/10000/restart/60000
sc.exe failureflag Throne 1
failureflag 1让 Windows 在 Throne 以错误码退出时也执行恢复操作,而不仅仅是在崩溃之后。重启请求(退出码 75)和看门狗退出正是这样让 Throne 恢复运行的。每一次都算作一次失败:在一天之内,第一次重启在 3 秒后进行,第二次在 10 秒后,之后每次在 60 秒后。sc.exe stop Throne和thronectl shutdown会让它彻底停止(退出码 0)。Windows 关机时,最多给 Throne 45 秒时间。- 因错误停止后,
sc.exe query Throne会显示WIN32_EXIT_CODE : 1066,并把 Throne 自己的退出码显示为SERVICE_EXIT_CODE。 - 它的数据位于
C:\ProgramData\Throne,日志位于C:\ProgramData\Throne\config\logs\throne.log。 uninstall-service.bat会停止并删除该服务。C:\ProgramData\Throne中的数据会保留。- 更新 Throne 之前,请先停止该服务。
任务计划程序中的计划任务无法替代该服务:Windows 会强行终止任务,因此 Throne 无法正常停止其核心;而且 Windows 也无法根据任务的退出码重新启动它。
数据文件夹
该服务让 C:\ProgramData\Throne 只供 SYSTEM 和 Administrators 使用。它以这种权限创建该文件夹,并在每次启动时重新设置这些访问权限,对其中的文件也是如此。如果该文件夹已经存在,但属于其他用户、允许其他用户写入(你在 C:\ProgramData 下手动创建的文件夹就是这样),或者本身是链接或联接点(junction),或者其中有这样的文件或文件夹,服务就会以退出码 78 退出,并在日志中指出问题。请删除该文件夹,然后重新启动服务。普通用户可以写入的 --data-dir 只会在日志中产生一条警告。
在命令行窗口中运行命令
请在以管理员身份运行的命令行窗口中运行 Throne.exe --health、--print-connection、--check 和 thronectl,并为这些 Throne.exe 命令加上 --data-dir C:\ProgramData\Throne。管理员并不是 LocalSystem,因此其默认数据目录是另一个目录。只有 Administrators 和 SYSTEM 可以打开该服务的管道并读取其密钥文件。在未以管理员身份运行的命令行窗口中,--health 会记录 [Instance] Not talking to … access denied 并以退出码 2 退出。
Throne.exe 是 Windows 图形界面程序,因此命令提示符不会等待它结束。Throne 会把输出写到启动它的程序的控制台中。要等待它结束并读取其退出码:
start "" /wait "C:\Program Files\Throne\Throne.exe" --health --data-dir C:\ProgramData\Throne
echo %ERRORLEVEL%
$p = Start-Process 'C:\Program Files\Throne\Throne.exe' -ArgumentList '--health', '--data-dir', 'C:\ProgramData\Throne' -Wait -PassThru
$p.ExitCode
--print-connection 打印的是 POSIX 的 export 行。在 PowerShell 中,请自行设置这些值:
$env:THRONE_ADDR = '127.0.0.1:9095'
$env:THRONE_KEY_FILE = 'C:\ProgramData\Throne\config\api.key'
thronectl status
在控制台中运行
要在不使用服务的情况下测试无界面 Throne:
start "" /wait "C:\Program Files\Throne\Throne.exe" --headless
Ctrl+C 会让它正常停止,再按一次 Ctrl+C 会立即杀死核心。关闭控制台窗口、不带 /F 的 taskkill /PID <pid>、注销和关机也会让它正常停止。在服务之外,数据目录为 %LOCALAPPDATA%\Throne(以 LocalSystem 身份运行时为 C:\ProgramData\Throne)。重启会启动一个新的 Throne 进程并以退出码 0 退出,因此 start /wait 会返回,而新进程继续运行。