浏览器里的 SSH 终端

在浏览器里,连上你的每一台服务器

OpsUp 是一款基于浏览器的 SSH 终端管理工具:多服务器连接、跳板机代理、密钥复用。单个二进制文件部署,前端内嵌,数据存放在 SQLite。

1个二进制即可部署
AES-256GCM 加密存储私钥
SSH + RDP终端与远程桌面
MIT开源许可

核心功能

在一个浏览器标签页里,管理你的整批服务器。

01

多服务器终端

用标签页同时连接多台服务器。侧边栏支持分组折叠、搜索、右键菜单,以及完整的增删改。

02

跳板机代理

通过一台直连跳板机访问内网机器。每条连接支持一台跳板机,不支持嵌套跳转。

03

密钥复用

新增服务器时可以粘贴私钥、导入文件,或直接复用已有服务器的密钥,不用重复录入。

04

SFTP 上传

通过 SFTP 上传文件,先写入私有临时文件再发布;覆盖已有文件时保留原有权限与属主。

05

RDP 远程桌面

基于 IronRDP WASM 支持 NLA 会话,含键鼠输入、全屏、动态调整分辨率和手动剪贴板传输;密码每次连接时输入,不会保存。

06

会话审计

每次终端会话都会记录使用者、服务器、起止时间和客户端 IP。

安全边界

OpsUp 是共享管理员式的服务器管理工具,而不是多租户授权系统。下面是它实际做到的保护。

注意 · 请使用 HTTPS,且不要把尚未初始化的实例暴露到公网。
凭证加密SSH 私钥与密码以 AES-256-GCM 存储,接口既不返回凭证也不返回密文;管理员密码使用 bcrypt。
主机指纹校验没有登记 SHA256 指纹的连接会被拒绝,指纹变化也会被拒绝;目标机与跳板机分别独立校验。
登录加固管理员密码要求 12 到 72 字节,首个用户创建是原子操作,登录与初始化按来源 IP 限速,JWT 24 小时过期。
同源设计不开放通配 CORS,应用访问日志不记录查询字符串;反向代理的日志也建议脱敏终端令牌。

快速开始

需要 Go 1.25+、用于 SQLite/CGO 的 C 编译器、make,以及 Node.js 22.22.2+(或 24.15+)。也可以直接用 Docker。

build from source
$ make build
$ OPSUP_LISTEN=127.0.0.1:8080 \
  OPSUP_DB_PATH=./data/opsup.db \
  ./opsup
docker
$ docker build -t opsup .
$ docker run -d \
  -p 127.0.0.1:8080:8080 \
  -v opsup-data:/data opsup
1

初始化管理员

先在本机打开服务并创建管理员,再通过 HTTPS 对外提供访问。

2

添加服务器

填写主机、用户和密钥,按需选择跳板机,并录入预期的 SHA256 主机指纹。

3

开始连接

在终端标签页里打开服务器;窗口缩放与断线重连都已处理好。

一起备份 · 请把数据库和它的加密密钥一起备份,且不要在重启时重新生成或删除密钥。

配置项

变量默认值 / 要求
OPSUP_DB_PATHopsup.db,位于可执行文件旁
OPSUP_LISTEN:8080
OPSUP_SECRETS_PATH<数据库路径>.secrets.json,首次生成,权限 0600
OPSUP_JWT_SECRET未设置时使用持久化的随机密钥;自行设置至少 32 字节
OPSUP_ENCRYPTION_KEY未设置时使用持久化的随机密钥;自行设置需 64 个十六进制字符

技术栈

Go 后端内嵌 React 前端,部署始终只有一个文件。

BackendGo 1.25 · Gin · gorilla/websocket · golang.org/x/crypto/ssh
FrontendReact 19 · TypeScript · Ant Design 6 · xterm.js 6 · Vite 8
DatabaseSQLite 3 (WAL)
Deploy单个二进制(Go embed 内嵌前端)· 支持 Docker