自托管一个随处可用的 AI 终端
大多数「自托管 AI」教程止步于模型。这篇覆盖整个栈 —— 智能体、shell、SSH 客户端,和一个手机就能打开的 URL。
搜「self-host AI terminal」,结果大多在讲怎么本地跑模型:Ollama、LocalAI、 LM Studio、llama.cpp。挺好 —— 但模型不是终端。搜索结果的第一页里, 没有一个是真正能从浏览器访问的智能体 shell。这篇要搭的就是它: 一台服务器、一次安装,一个能 SSH、能改文件、能跑进程、能搜网页、 还扛得住手机断网的智能体。任何有 Safari 或 Chrome 的设备都能用。
整个栈
- Tron Web 服务器(终端 + 智能体循环)。
- Ollama,同一台机器(可选 —— 完全离线的智能体工作)。
- Caddy 在前面做 TLS。或者跳过 TLS 直接用 Tailscale。
- Tailscale / Cloudflare Tunnel,不开端口就能从外网访问。
安装 Tron
git clone https://github.com/Shadowhusky/Tron.git
cd Tron
npm install
npm run build:web
npm run start:web # 监听 0.0.0.0:3888(默认 local 模式)
内置三种部署模式:
- local —— 默认。允许本地 PTY + SSH。
- gateway ——
TRON_MODE=gateway。禁用本地 PTY,只允许 SSH 会话。机器是跳板机、不想让任何人直接在上面开 shell 时用。 - demo —— 纯客户端、模拟终端。给官网用的。
同一台机器加上 Ollama
curl -fsSL https://ollama.com/install.sh | sh
ollama pull qwen2.5-coder:7b
ollama pull llama3.1:8b
在 Tron 的 Settings > AI 里把提供商切到 Ollama,base URL 设为
http://localhost:11434。智能体循环从此不出这台机器。
应付「跑个脚本、修个配置」的日常足够;显存够的话,更大的模型
(Qwen 2.5 Coder 14B/32B)在多步任务上明显更稳。
用 Caddy 上 TLS
有域名的话,Caddyfile 里两行:
tron.example.com {
reverse_proxy localhost:3888
}
Caddy 自动签 Let's Encrypt 证书。TLS 到此为止。
不开端口,从外网访问
两个选项,用你已经在用的那个:
- Tailscale。服务器和笔记本/手机各装一个。MagicDNS 名字(
tron.yourtailnet.ts.net)在哪都能用。零端口转发,零 DNS 配置。 - Cloudflare Tunnel。
cloudflared tunnel—— 把服务器绑到你域名下的主机名。TLS 和稳定 URL 都有,路由器不用动。
持久化与可靠性
几个值得知道的默认行为:
- PTY 会话在页面刷新和断网后保留 24 小时。关掉 Safari 再打开,回滚还在,智能体继续。
- 会话状态(标签页、智能体对话、草稿)每 5 秒原子写入
~/.config/tron/。强杀进程不会写坏布局。 - 并发上限 20 个会话;超了就淘汰最旧的。防止失控客户端吃光服务器。
从托管终端再 SSH 出去
SSH 配置存在服务器侧的 ~/.tron/ssh-profiles.json。
加一次,任何设备都能用 —— 不同步到任何第三方服务,私钥永远不离开服务器。
作为服务运行
一个简单的 systemd unit:
# /etc/systemd/system/tron.service
[Unit]
Description=Tron terminal
After=network.target
[Service]
Type=simple
User=tron
WorkingDirectory=/opt/Tron
ExecStart=/usr/bin/npm run start:web
Restart=on-failure
Environment=NODE_ENV=production
[Install]
WantedBy=multi-user.target
systemctl enable --now tron,收工。
什么时候值得自托管(什么时候不值)
代码本来就在服务器上、你愿意自己管运维、或者你需要一切(提示词、shell、密钥) 都留在自己硬件上时,自托管赢。只有一台笔记本的话就未必了 —— 那种场景桌面应用更省事。
跑起来
源码 + 三平台安装包。