想在另一台电脑的浏览器里继续写代码,又不想把项目和模型凭据留在随身设备上,可以把 OpenCode Web 放在自己的 VPS 上。搜索“OpenCode VPS 部署”“OpenCode Web 远程访问”的人,真正要解决的是三个问题:服务能否持续运行、浏览器如何安全连上、coding agent 到底能读写哪些文件。本文以 Ubuntu VPS + 单人使用为例,先用 SSH 隧道跑通,再给需要固定域名的读者补上 Caddy HTTPS。
OpenCode 官方文档把它定位为开源 AI coding agent;它的 Web 模式可以在浏览器中使用,但默认本地服务没有访问密码。下面的做法会让服务始终监听 127.0.0.1:4096,由 SSH 隧道或反向代理接入。不要直接把 4096 端口开放到公网。
OpenCode 调用你配置的模型提供商;VPS 主要承担仓库读取、代码搜索、命令执行与项目构建,并不因为装了 OpenCode 就能在本机推理大模型。小型代码库可先以 2 vCPU、4 GB 内存、20 GB 可用磁盘作为试用起点;大型 Node 构建、测试套件或多个并行任务,需要按实际峰值增加内存与磁盘。这是部署规划值,不是 OpenCode 官方最低配置。先运行 free -h、df -h,给依赖安装、构建产物和日志留空间。
建议用独立的普通用户运行 agent,代码只放在它自己的工作目录。不要让它以 root 身份运行,也不要把生产数据库密码、云平台密钥或宿主机 Docker socket 随手放进可读目录。访问密码只控制谁能进入 Web 服务;它并不能限制 agent 对该 Linux 用户已有文件权限的使用。 如果要处理不可信仓库或多人共享,应再用独立 VPS、容器或更严格的权限边界隔离。
准备好 Ubuntu 24.04/26.04、可用的 SSH 登录、一个模型提供商的凭据。下面的命令假设当前 SSH 用户有 sudo 权限。要通过域名访问时,还需一个指向 VPS 的域名;只用 SSH 隧道则不需要域名。
先安装基础工具、创建不在 sudo 组里的专用用户。已有同名用户时跳过 adduser,确认其家目录是 /home/agent 后再继续:
sudo apt update
sudo apt install -y curl git openssl
sudo adduser --disabled-password --gecos '' agent
sudo -iu agent
mkdir -p ~/workspaces
curl -fsSL https://opencode.ai/install | bash
~/.opencode/bin/opencode --version
安装命令来自 OpenCode 官方入门文档;当前官方安装脚本把二进制放在 ~/.opencode/bin/。安装后在 agent 用户会话里配置所选模型提供商:
~/.opencode/bin/opencode auth login
~/.opencode/bin/opencode auth list
auth login 会交互式选择提供商并录入凭据。官方 CLI 文档说明凭据保存在该用户的 ~/.local/share/opencode/auth.json;不要把 API Key 写进仓库、文章中的示例命令或可公开读取的 .env 文件。auth list 只用来确认提供商已连接;实际能否调用模型,还要在 Web 页面里发起一次小请求验证。提供商配置文档列出不同提供商的接入方法和费用条件。
把项目克隆到 ~/workspaces/你的项目,或复制已有项目到这个目录,并确认 agent 对它拥有所需的读写权限。先在测试仓库上让 agent 解释一个文件、提出修改计划,再给它有副作用的任务。确认好后输入 exit,返回原来的 sudo 用户会话。
Web 页面需要单独的访问密码,它不是模型 API Key。先再次进入 agent 用户,生成随机密码并写入仅该用户可读的环境文件:
sudo -iu agent
install -d -m 700 ~/.config
umask 077
printf 'OPENCODE_SERVER_PASSWORD=%s\n' "$(openssl rand -hex 32)" > ~/.config/opencode-web.env
chmod 600 ~/.config/opencode-web.env
cat ~/.config/opencode-web.env
exit
把最后显示的密码保存在密码管理器,别把它发到群聊或提交到 Git。下面的 unit 假设前面使用了 /home/agent 家目录;若你的用户路径不同,应同步修改三个绝对路径。用编辑器创建 /etc/systemd/system/opencode-web.service:
[Unit]
Description=OpenCode Web coding agent
Wants=network-online.target
After=network-online.target
[Service]
Type=simple
User=agent
Group=agent
WorkingDirectory=/home/agent/workspaces
Environment=HOME=/home/agent
EnvironmentFile=/home/agent/.config/opencode-web.env
ExecStart=/home/agent/.opencode/bin/opencode web --hostname 127.0.0.1 --port 4096
Restart=on-failure
RestartSec=5
[Install]
WantedBy=multi-user.target
然后验证配置并启动:
sudo systemd-analyze verify /etc/systemd/system/opencode-web.service
sudo systemctl daemon-reload
sudo systemctl enable --now opencode-web
sudo systemctl status opencode-web --no-pager
sudo ss -lntp | grep ':4096'
curl -I --max-time 5 http://127.0.0.1:4096/
ss 应显示 127.0.0.1:4096;未带密码的 HTTP 请求应收到 401,这比只看到进程运行更能证明认证已启用。如果端口被其他服务占用,先用 ss 找出占用者,再修改 unit 中的端口。不要为了“访问方便”改成 --hostname 0.0.0.0。OpenCode Web 文档明确说明,不设置 OPENCODE_SERVER_PASSWORD 时服务没有访问保护。
在自己的电脑运行下面的命令,把本地 4096 转发到 VPS 的回环地址;把 你的SSH用户 和 VPS_IP 换成真实值:
ssh -N -L 4096:127.0.0.1:4096 你的SSH用户@VPS_IP
隧道保持打开时,在本机浏览器访问 http://127.0.0.1:4096,用户名默认是 opencode,密码是上一步生成的随机值。浏览器连接的 localhost 是自己的电脑,不是 VPS。如果本机 4096 已被占用,可把命令左侧改成 14096:127.0.0.1:4096,再访问 http://127.0.0.1:14096。SSH 断开后网页自然无法继续访问,但 VPS 上的 systemd 服务仍在运行。
这种方式只依赖已有 SSH 端口,适合不想公开一个 coding agent 域名的人。需要多人或长期从手机访问时,再考虑下面的 HTTPS 方案;访问控制仍应限于可信人员。
先把例如 agent.example.com 的 DNS A/AAAA 记录指向 VPS,确保服务商安全组允许 80/443,并确认没有别的 Web 服务占用这两个端口。4096 保持不对公网开放。若尚未安装 Caddy,按 Caddy 官方 Ubuntu 安装说明安装稳定版:
sudo apt install --yes debian-keyring debian-archive-keyring apt-transport-https curl gnupg
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/gpg.key' | sudo gpg --dearmor -o /usr/share/keyrings/caddy-stable-archive-keyring.gpg
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt' | sudo tee /etc/apt/sources.list.d/caddy-stable.list
sudo chmod o+r /usr/share/keyrings/caddy-stable-archive-keyring.gpg
sudo chmod o+r /etc/apt/sources.list.d/caddy-stable.list
sudo apt update
sudo apt install caddy
在现有 /etc/caddy/Caddyfile 中增加站点块;已有其他站点时不要覆盖整份文件:
agent.example.com {
reverse_proxy 127.0.0.1:4096
}
检查并重载:
sudo caddy validate --config /etc/caddy/Caddyfile
sudo systemctl reload caddy
curl -I https://agent.example.com/
域名、DNS 和 80/443 正确时,Caddy 会按官方 HTTPS 机制申请证书。这里的反代只转发到本地 OpenCode 服务,浏览器仍会遇到 OpenCode 的 Basic Auth 登录提示。别把 Caddy 的 HTTPS 误当成登录保护:必须保留 OPENCODE_SERVER_PASSWORD。如果多人共用一个 Web 入口,他们实际上共享同一个 Linux 用户可访问的项目与模型凭据;有不同权限需求就分开部署。
登录后先打开测试仓库,让 OpenCode解释一个文件或列出修改计划;再实际执行一次小修改并用 git diff 检查结果。测试时不要把数据库密钥、生产环境变量或付款凭据交给 agent。系统层面再查一遍:
sudo systemctl is-active opencode-web
sudo journalctl -u opencode-web -n 80 --no-pager
sudo ss -lntp | grep ':4096'
sudo -iu agent /home/agent/.opencode/bin/opencode auth list
浏览器打不开:先查 systemctl status 和 journalctl,再查 4096 是否只监听回环地址;SSH 隧道场景确认隧道终端仍在,域名场景确认 DNS、80/443、防火墙和 Caddy 日志。一直弹密码框:确认输入的是 Web 密码而非模型 Key;修改 opencode-web.env 后必须 sudo systemctl restart opencode-web。能进页面但模型报错:用 auth list 确认是 agent 用户配置的提供商,核对余额、模型可用性与出站网络。找不到仓库或无法写入:检查项目路径和 agent 的文件权限,不要通过给它 sudo 权限解决。
更新时先备份重要项目与 ~/.local/share/opencode/ 下的状态,再在 agent 用户会话运行官方安装命令,检查版本,最后重启服务。若新版本有问题,先停止服务并根据备份和官方版本安装选项恢复测试过的版本。项目代码本身应有 Git 远端和独立备份;VPS 快照与备份的差别可参考快照、备份与镜像的区别。
OpenCode Web 必须买 GPU VPS 吗? 不必。使用云端模型时,VPS 主要运行 agent 与项目工具链;只有决定在本机部署模型时,才需要另外核算推理硬件。
可以直接开放 4096 端口吗? 本文不建议。用 SSH 隧道,或让 OpenCode 只监听回环地址并通过 HTTPS 反代接入。两种方式都保留 Web 密码。
退出浏览器后任务会不会停? 浏览器关闭不会停止 systemd 服务;但具体任务是否继续,要看当时的会话和进程状态,回来后先检查 OpenCode 会话与项目文件,不要假定修改已经完成。
与 Codex CLI、Claude Code 的 VPS 用法有什么区别? 如果你更习惯终端,可看站内的 Codex CLI 远程开发教程和 Claude Code VPS 教程。本文解决的是 OpenCode 自带 Web 界面怎样在 VPS 上保持运行并安全访问。
