跳转到内容

无头 Linux 后端

本页面面向云主机、家用服务器、实验室机器等无头 Linux 环境。目标是让 Jarvis 后端长期运行,并用浏览器从你的电脑访问它。

如果你只是在当前电脑上从源码试跑 Jarvis,使用 快速开始

  • 一台 Linux 服务器,推荐 Ubuntu 24.04+。
  • 可以 SSH 到服务器。
  • gitcurl 可用。
  • Docker 路径需要 Docker Engine / Compose 可用;裸机路径需要 Python 3.11+、Node.js 20.19+ 和 systemd。
  • 如果要从 Jarvis 启动编码会话,运行 Jarvis 后端的同一环境里必须能执行并已登录对应运行时 CLI,例如 Claude Code、Codex 或 OpenCode。Docker 部署时,宿主机 CLI 不会自动出现在容器里。

在服务器上运行:

终端窗口
git clone https://github.com/12libao/Jarvis.git ~/Jarvis
cd ~/Jarvis
cp .env.example .env
printf '\nJARVIS_FORCE_HTTP=1\n' >> .env

编辑 .env,至少确认这些基础项:

终端窗口
JARVIS_PORT=8888
JARVIS_FORCE_HTTP=1
# 公网或共享服务器建议开启:即使请求来自 loopback,也要求 API key。
# JARVIS_AUTH_ALWAYS_REQUIRED=1

JARVIS_FORCE_HTTP=1 让源码启动脚本和 Docker 默认走 HTTP。裸机 systemd 模板也默认用 HTTP;但如果 .env 里设置了 JARVIS_SSL_CERTFILE / JARVIS_SSL_KEYFILE,systemd 会按证书参数启动 TLS。复用旧 .env 时先确认这些证书变量为空。

JARVIS_AUTH_ALWAYS_REQUIRED=1 会关闭本机回环请求的认证绕过。服务器暴露到公网、共享内网或多人使用时建议开启;只做个人内网测试时可以先保持默认。

Docker 是推荐的后端、聊天和远程访问路径;裸机 systemd 适合你想让 Jarvis 直接使用服务器用户的 Python 环境、模型缓存和本地 CLI 配置。

终端窗口
bash deploy/setup-server.sh

脚本会生成 deploy/.env,构建镜像并启动 jarvis 容器。Docker compose 使用 host network,容器内 Jarvis 默认监听 JARVIS_PORT

如果服务器还没有 Docker,请先按你的发行版方式安装 Docker Engine 和 Compose,再运行 setup 脚本。

Docker 镜像内置后端、Web、ghcloudflared,但不内置 Claude Code、Codex 或 OpenCode。需要编码会话时,要么把运行时 CLI 安装并登录到容器环境里,要么使用裸机 systemd 路径。

如果你只需要在服务器上临时启动一个 headless 后端,而不是安装长期服务,可以使用 CLI 后台模式:

终端窗口
python3 -m venv .venv
.venv/bin/python -m pip install -e 'backend/[dev]'
DATA_DIR="$HOME/.jarvis-headless"
PORT=8888
.venv/bin/jarvis start \
--no-open \
--port "$PORT" \
--data-dir "$DATA_DIR"

这个路径适合 API 或短期验证。它不会安装 systemd service,也不会替你维护 Docker 容器。所有内置启动器当前都会绑定 0.0.0.0;如果你必须只监听 127.0.0.1,需要自定义 uvicorn / systemd 启动命令,并自行承担后续维护。

在服务器上运行:

终端窗口
curl --noproxy '*' http://127.0.0.1:8888/api/v1/health

响应应为 JSON,并包含 statusversion。如果你改了 JARVIS_PORT,把命令里的 8888 换成对应端口。

启动后端后生成一个浏览器用 API 密钥。密钥只显示一次,不要提交到仓库、issue 或截图里。

终端窗口
docker exec jarvis bash -lc 'jarvis genkey --data-dir "$JARVIS_REPO_DIR" -d "admin browser"'

无头服务器没有本地浏览器。首次访问建议从你的电脑做 SSH 本地端口转发:

终端窗口
ssh -L 8888:127.0.0.1:8888 <user>@<server>

然后在你自己的电脑浏览器打开:

http://127.0.0.1:8888

粘贴刚生成的 API 密钥。如果你在服务器上使用了其他端口,把 SSH 命令左右两侧的 8888 一起改掉。

如果你要从手机或外网浏览器访问这台服务器,先通过上面的 SSH 转发打开本地 UI,然后在 Jarvis 里开启远程访问。绑定完成后,使用官方入口:

https://jarvis.xcos.dev/app

不要直接打开裸隧道子域。裸隧道地址绕过托管入口的认证和路由层,常见表现是登录、API 或 WebSocket 一直失败。

cloudflared 通常已经由部署流程准备好:Docker 镜像内置;裸机 setup 会安装到仓库的 data/bin/;应用内远程访问入口也有兜底安装路径。

终端窗口
docker logs -f jarvis
docker restart jarvis
cd ~/Jarvis/deploy
docker compose up -d --build

更新源码后使用仓库自带脚本:

终端窗口
bash deploy/deploy-server.sh

它会自动判断 Docker / systemd 模式,拉取代码、按需重建、重启,并执行健康检查。

现象 先检查
curl 没有返回 JSON 端口是否与 JARVIS_PORT 一致,服务是否仍在启动。
浏览器打不开 先用 SSH 转发访问 http://127.0.0.1:8888,再排查防火墙或安全组。
裸机 systemd 起不来 User= 是否是实际部署用户,.venv / data/ 是否被 root 拥有。
前端过期或空白 Docker 重新 compose up -d --build;裸机确认 Node 版本后重跑前端 npm ci / npm run build,再 sudo systemctl restart jarvis
API 密钥无效 后端数据库是否已经创建,是否在正确部署模式里生成 key。
远程入口转圈 不要打开裸隧道子域;通过 SSH 转发回 localhost 完成一次远程访问绑定。