文档 · 服务器

在 Docker 里运行 magpie

在没有桌面的服务器或 NAS 上运行 magpie:它的网关为其他电脑上的 Agent 提供模型,供应商的添加和订阅登录都在浏览器页面里完成。

镜像ghcr.io/yetone/magpie,支持 linux/amd64 和 linux/arm64
标签latest(最新正式版)、0.1.1150(某个版本)、0.1、edge(main 上的每次改动)
端口3425 是 Agent 调用的网关;3430 是容器运行 magpie web 时的 Web 界面
数据卷/config:供应商、密钥、登录、插件和用量
用户nonroot(uid 65532)

镜像里是 magpie 的纯终端版本,基于 distroless,并带了 bash 和 busybox,方便在容器里开终端。不指定命令时运行 magpie serve(只有网关)。容器里找不到需要配置的 Agent,所以这里的 magpie 是一个网关:用它的 Agent 运行在别的机器上。

运行

带 Web 界面运行,给页面一个重启后不变的 key,两个端口都只发布在宿主机的回环地址上:

Shell
docker run -d --name magpie --restart unless-stopped \
  -p 127.0.0.1:3425:3425 -p 127.0.0.1:3430:3430 \
  -e MAGPIE_WEB_KEY=$(openssl rand -hex 16) \
  -v magpie-config:/config \
  ghcr.io/yetone/magpie:latest web --addr 0.0.0.0:3430 --no-open

docker logs magpie

日志里给出带 key 的页面地址:

输出
● magpie web on http://127.0.0.1:3430/?k=0f3c9a1e…
  on the network http://172.17.0.2:3430/?k=0f3c9a1e…
  these are the container's own addresses: other machines use the host's, and MAGPIE_PUBLIC_URL=http://<host>:<port> puts it here
! anyone with the link can change magpie and see its keys, and the network carries it unencrypted
  the link carries MAGPIE_WEB_KEY · gateway http://127.0.0.1:3425 · Ctrl-C to stop
容器外的 Agent 需要网关密钥。在容器里任何 key 都行。来自宿主机或其他机器的请求只有带上启用的网关密钥才会应答,不带的返回 401:按网关密钥里的步骤生成一个。-p 里的 127.0.0.1: 让端口只在宿主机上;去掉它,或写成宿主机的局域网或 VPN 地址,其他机器才能访问。

不加 web --addr 0.0.0.0:3430 --no-open 时容器只跑网关,需要在容器终端里配置(docker exec -it magpie magpie provider add …)。也可以把一个目录绑定挂载到 /config 来代替命名卷,前提是 uid 65532 能写它:sudo chown -R 65532:65532 /volume1/docker/magpie/config。

Web 界面

打开日志里的链接。链接里的 key 会换成一个 cookie,并从地址栏里去掉;不带 key 打开会被拒绝(401)。设置了 MAGPIE_WEB_KEY(16 个以上的字母、数字或 - . _ ~;openssl rand -hex 16 可以生成一个)时,重启后 key 不变,浏览器保持登录 400 天。不设置时每次启动都会生成新 key,cookie 只在本次浏览器会话里有效。

这个页面处于网关模式:只有 供应商、网关、路由、用量、插件和 设置,没有 Agent、会话和资源库,因为容器里没有 Agent。设置 → 常规 → 网关模式 可以关掉它。

NAS 或通过 SSH 访问的服务器上,用隧道打开页面,不要发布 3430:ssh -L 3430:127.0.0.1:3430 you@nas,然后在自己电脑上打开日志里的链接。

拿到链接的人都能修改 magpie、看到它的密钥。页面本身没有 HTTPS。让 3430 只在回环地址或 VPN 上,或者放在带 TLS 的反向代理后面。

登录订阅

在 供应商 里添加 API key,和桌面版一样。订阅登录(ChatGPT、Claude……)会在你的浏览器里打开厂商页面,完成后厂商把浏览器跳回 localhost,ChatGPT 是 http://localhost:1455/auth/callback?code=…。那是你自己的电脑,不是容器,所以页面打不开。把地址栏里的完整地址复制下来,粘贴到登录的 回调 URL 一栏。

在终端里也可以:

Shell
docker exec -it magpie magpie accounts add codex

打开它打印的链接并登录,再把浏览器最后停在的地址粘贴回去。Web 界面也能从文件导入登录。

保存了什么

magpie 写的所有东西都在 /config 下,所以重启、或者在同一个数据卷上新建容器,供应商、密钥、登录和插件都还在。

路径内容
/config/magpiemagpie 自己的文件:settings.json、供应商、网关密钥、路由组
/config/home容器的 HOME:登录保存在对应 Agent 保存的位置(~/.codex、~/.claude……)
/config/cache模型目录,以及插件运行用的 Bun(第一次用插件时下载)
/config/data、/config/statemagpie 保存的其他内容

旧镜像创建的数据卷照样能用:magpie 启动时会补上缺的目录。只有用旧镜像做的登录(当时存在数据卷之外)需要重新登录。

环境变量

变量作用
MAGPIE_ADDR网关监听的地址。镜像里设为 0.0.0.0:3425,发布的端口才能访问到它。
MAGPIE_PUBLIC_URL其他机器访问网关用的地址,例如 http://192.168.1.20:3425(宿主机或 NAS 的地址,加发布的端口),或反向代理的 base URL。容器里 magpie 只看得到 Docker 自己的 172.17.x 地址;设置后,它显示和打印的就是该用的地址。
MAGPIE_WEB_KEYWeb 界面的 key,重启后不变(16 个字符以上)
HOME、XDG_CONFIG_HOME、XDG_CACHE_HOME、XDG_DATA_HOME、XDG_STATE_HOME镜像已设为上面 /config 下的目录,不要改

网关密钥与其他机器

  1. 给每个客户端生成一个密钥网关 → 网关密钥,或在终端里 docker exec magpie magpie gateway-key add "Laptop",它会打印新的 sk-magpie-key-…。容器外的每个请求(包括宿主机自己的)都必须带一个启用的网关密钥,不带的返回 401。每个密钥可以有自己的每日、每周或每月上限和可用模型(magpie gateway-key limit、magpie gateway-key models)。
  2. 发布端口用 -p 3425:3425(或绑定到 NAS 的局域网或 VPN 地址,-p 192.168.1.20:3425:3425)并加上 -e MAGPIE_PUBLIC_URL=http://192.168.1.20:3425 重新创建容器。

在其他电脑上,把 Agent 指向这个网关,用其中一个密钥作为 API key:OpenAI 客户端用 http://192.168.1.20:3425/v1,Anthropic 或 Gemini 客户端用 http://192.168.1.20:3425。模型 id 是 provider/model 或路由组的名字,GET /v1/models 会列出它们。如果那台电脑自己也运行 magpie,就把容器添加为远程 magpie,由 magpie 替你配置 Agent。

容器里不需要打开 设置 → 局域网共享:打开它会另外生成一个名为 Magpie 的网关密钥,而不论开关如何,网关都会向容器外的请求要密钥。

从旧镜像升级。容器外发送 magpie 或其他非启用网关密钥的 Agent,现在会收到 401(“the API key sent is not an enabled magpie gateway key”)。按上面的步骤给它生成一个密钥,填进 Agent 的设置。已经发送网关密钥的 Agent,以及用网关密钥添加的远程 magpie,照常工作。

跨互联网访问时,优先用 VPN(如 Tailscale 或 WireGuard),不要直接开放 3425。容器前面的反向代理或隧道也算网络:它的客户端和其他机器一样需要网关密钥。

在 NAS 上用 Docker Compose

compose.yaml
services:
  magpie:
    image: ghcr.io/yetone/magpie:latest
    restart: unless-stopped
    ports:
      # 127.0.0.1:只在宿主机上;容器外的每个调用方都需要网关密钥
      - "127.0.0.1:3425:3425"
      - "127.0.0.1:3430:3430"
    environment:
      MAGPIE_PUBLIC_URL: http://<nas-address>:3425
      MAGPIE_WEB_KEY: <random-key>
    volumes:
      - ./config:/config
    command: [web, --addr, 0.0.0.0:3430, --no-open]

然后:sudo chown -R 65532:65532 ./config,docker compose up -d,通过 SSH 隧道打开 http://127.0.0.1:3430/?k=<random-key>,添加供应商,给每台机器生成一个网关密钥。要让其他机器访问网关,把它那一行改成 "3425:3425"(或 NAS 的局域网、VPN 地址),重新 docker compose up -d。

健康检查、终端与更新

遇到问题,或者有值得分享的配置?来 Discord 聊。细节见参考文档(英文)。