本文从控制面生成 token 开始,优先通过 Docker Compose 启动 Client;没有 Docker 时,再使用 Native Client。
你需要:
- 一个由 Printf 控制面创建的 Client。
- 该 Client 的 token。
- 控制面的 HTTPS 地址。
- 一台 Windows、Linux 或 macOS 主机。
- 管理员权限。
- 目标 HTTP 服务及其 Compose 入口服务和容器内部端口。
主机已有 Docker 时优先使用 Compose。镜像已包含 Client 运行所需组件,宿主机不需要额外安装网络辅助工具。无 Docker 时使用 Native Client,并按本文安装当前平台依赖。
在仓库根目录创建环境文件:
cp .env.example .env
chmod 0600 .env编辑 .env:
PRINTF_TOKEN=replace-with-client-token
PRINTF_SERVER=https://moon.example.com
PRINTF_BRIDGE_NETWORK=gateway创建共享 external network,启动通用 Client 并检查:
docker network inspect gateway >/dev/null 2>&1 || docker network create gateway
docker compose pull
docker compose up -d
docker compose ps
docker compose logs --tail 100 printf-clientWindows Docker Desktop 使用验证过的 Alpine 变体:
docker compose -f docker-compose.alpine.yml pull
docker compose -f docker-compose.alpine.yml up -d
docker compose -f docker-compose.alpine.yml psLinux 和 macOS Docker 默认使用通用 docker-compose.yml。两个镜像都已包含 Client 所需组件,不要在宿主机重复安装 Native 平台依赖。
参考仓库根目录的 compose.service.yml 修改应用现有 Compose:
- 只把前端 Nginx、认证网关或单体应用等公网 HTTP 入口加入
gateway。 - 为入口声明唯一的小写 DNS alias,例如
my-app。 - 使用容器内部监听端口,不为 Printf 添加宿主机
ports。 - 数据库、Redis 和内部 API 留在应用默认网络。
应用有认证网关时发布认证网关,不直接发布被保护的后端。启动应用后,在控制面把 Target Service 设置为 alias 和容器内部端口,例如:
http://my-app:8080
.env 和 wg_data/ 已被 Git 忽略。不要提交 token、私钥或完整传输配置。同一个 token 不应同时运行 Compose 与 Native Client。
以下步骤只适用于没有 Docker 或需要原生运行的主机。
不要把真实 token 写进本文示例、Git 仓库或 Issue。
Linux/macOS 当前 shell:
export PRINTF_TOKEN='replace-with-client-token'
export PRINTF_SERVER='https://moon.example.com'Windows PowerShell:
$env:PRINTF_TOKEN = "replace-with-client-token"
$env:PRINTF_SERVER = "https://moon.example.com"同一个 token 不应同时运行两个 Client。发现已有在线实例时,Client 会明确报错并停止。
确认系统架构:
Linux:
uname -mmacOS:
uname -m对应关系:
| 输出 | 下载包 |
|---|---|
x86_64 |
*-amd64.* |
aarch64 |
Linux *-arm64.* |
arm64 |
macOS *-arm64.* |
Windows 当前提供 amd64 版本。
从 Releases 下载压缩包及同名 .sha256。
Linux:
sha256sum --check printf-client-linux-amd64.tar.gz.sha256macOS:
shasum -a 256 -c printf-client-macos-arm64.tar.gz.sha256Windows PowerShell:
$expected = (Get-Content .\printf-client-windows-amd64.zip.sha256).Split()[0]
$actual = (Get-FileHash .\printf-client-windows-amd64.zip -Algorithm SHA256).Hash.ToLowerInvariant()
if ($actual -ne $expected) { throw "SHA-256 mismatch" }哈希不一致时不要运行文件,重新从官方 Release 下载。
Linux Debian/Ubuntu:
sudo apt-get update
sudo apt-get install --yes wireguard-toolsmacOS:
brew install wireguard-toolsWindows:从 WireGuard 官方网站安装 WireGuard for Windows。Client 会调用安装目录中的 wireguard.exe 管理 tunnel service。
Linux amd64:
tar -xzf printf-client-linux-amd64.tar.gz
chmod 0755 printf-client
sudo env \
PRINTF_RUNTIME_MODE=native \
PRINTF_TOKEN="$PRINTF_TOKEN" \
PRINTF_SERVER="$PRINTF_SERVER" \
./printf-clientmacOS Apple Silicon:
tar -xzf printf-client-macos-arm64.tar.gz
chmod 0755 printf-client
sudo env \
PRINTF_RUNTIME_MODE=native \
PRINTF_WG_QUICK=/opt/homebrew/bin/wg-quick \
PRINTF_TOKEN="$PRINTF_TOKEN" \
PRINTF_SERVER="$PRINTF_SERVER" \
./printf-clientWindows 管理员 PowerShell:
Expand-Archive .\printf-client-windows-amd64.zip -DestinationPath .\printf-client
Set-Location .\printf-client
$env:PRINTF_RUNTIME_MODE = "native"
.\printf-client.exe启动成功时日志包含:
Client is running
没有可用公网服务路径时,Client 会明确退出,不会伪装在线。
Linux 可以安装仓库提供的 systemd unit:
sudo install -m 0755 printf-client /usr/local/bin/printf-client
sudo install -m 0644 packaging/printf-client.service /etc/systemd/system/printf-client.service创建 /etc/printf-client.env:
PRINTF_TOKEN=replace-with-client-token
PRINTF_SERVER=https://moon.example.com限制权限并启动:
sudo chmod 0600 /etc/printf-client.env
sudo systemctl daemon-reload
sudo systemctl enable --now printf-client
sudo systemctl status printf-client --no-pagermacOS 和 Windows 当前先以前台或管理员自行管理的服务方式运行。Printf Client 进程必须持续运行以维护连接和在线状态。
在控制面把 Target Service 设置为默认本地端口,例如:
http://[默认本地]:8080
目标应用必须监听:
0.0.0.0:8080
或平台允许的 Client 地址。只监听:
127.0.0.1:8080
无法接收 Printf 加密传输通道发来的流量。
Docker Compose:
docker compose ps
docker compose logs --tail 100 printf-clientLinux Native:
sudo wg show
ip address show printf0
sudo journalctl -u printf-client -n 100 --no-pagermacOS:
sudo wg showWindows:在 WireGuard UI 或管理员 PowerShell 中检查 printf0 tunnel service。
最后请求 Mapping 的公网 HTTPS 地址。出现问题时按 故障排查 从 Client、Mapping 到目标服务依次检查。