← Electerm 博客

electerm-web:用 Docker 把 electerm 装进自家服务器,用浏览器打开

2026-09-24
electerm-web自托管docker浏览器ssh自定义

electerm-web:用 Docker 把 electerm 装进自家服务器,用浏览器打开

坐在自己的电脑前,桌面版 electerm 最好用。在别人的电脑上临时救火,electerm 公有云版打开浏览器就能用。但还有第三种情况:你有自己的服务器,想要自己的数据、自己的登录、自己的规则——中间不想经过任何第三方。

这就是 electerm-web:electerm 的网页应用形态,打包好让你自己跑起来——最省事的是用 Docker——然后在任何浏览器里打开,手机也行。

一句话: electerm-web 是跑在你自己机器上的 electerm,通过 HTTP 提供服务,在浏览器标签页里使用。界面和 SSH/SFTP/RDP/VNC 能力一样,但服务器是你的。

功能演示:Electerm Usage Demo

桌面版 / 公有云 / 自托管网页版:怎么选?

三者同源同貌,但回答的是不同问题:

桌面版 electerm 公有云版(cloud) electerm-web(自托管)
跑在哪里 你的笔记本 / 台式机 维护者的 VPS 你的 VPS、NAS、家庭实验室、树莓派
怎么打开 安装好的应用 cloud.electerm.org,GitHub 登录 http://你的服务器:8082,你自己的密码
数据在哪 在你的电脑上 在云服务器上 在你的磁盘 / Docker 卷里
客户端要安装吗 不要,有浏览器就行 不要,有浏览器就行
适合 主力日常、本地 shell、串口 借电脑、手机上临时修一下 自己可控的个人网关

如果只是想看看,先打开托管演示站:demo.electerm.org。觉得对味、想要完全自己掌控,再往下看。

它到底跑了个什么

不是"阉割版网页终端"。它是做成网页应用的 electerm 客户端:同样的标签栏、会话控制条、底栏、主题和快捷键,协议也几乎全:

SSH、SFTP、FTP、Telnet、RDP、VNC、SPICE——SSH 那套(agent 转发、本地/远程端口转发、动态 SOCKS、X11 转发、隧道、跳板机)、快捷命令、触发器、批量/镜像输入、分屏、SFTP 拖拽传文件、工作区、AI 助手、gist/WebDAV/自建服务器同步、14 种界面语言,全都在。

和桌面版有两个实在区别:

  • 本地终端和串口属于"主机侧"。 在 VPS 上给浏览器用户一个"本地 shell"没有意义,一般会关掉(见下文)。串口也一样,除非 USB 转串口线就插在这台主机上。
  • 浏览器打不开到 22 端口的裸 TCP。 SSH 会话要经过你的服务器中转——所以这台服务器最好是你自己的

哪些事是桌面版做不到的

很多人是事到临头才发现:

  1. 装不了客户端的电脑。 没有管理员权限的办公本、Chromebook、图书馆的公用机、客户现场的跳板机——只要有现代浏览器,就有 electerm。
  2. 没有桌面版的设备。 iPad、安卓平板、吃晚饭时部署挂了手边只有手机。网页 UI 是响应式的,手机布局足够用来重启服务救火。
  3. 从外面连回内网。 在家里/办公室放一台跑 electerm-web 的小主机,只把网页 UI 经 Tailscale / WireGuard / nginx 暴露出去,192.168.x.x 的书签在酒店里突然全能用了。
  4. 一个网关,多端通用。 书签、主题、快捷命令都住在服务器上。笔记本、平板、手机打开同一个 URL,配置完全一样,不用同步。
  5. 共用机 / 机房大屏。 车间电脑、NOC 大屏,只需要 SSH 到固定几台主机:部署一次、配好书签,发个 URL 就行,不用每台机子装一遍配一遍。

如果以上都和你无关,继续用桌面版就好。只要中了一条,自托管就值回票价。

自定义控制才是重点

公有云服务给不了你任何旋钮。自己的实例全是旋钮:

  • 自己的认证。 给整个 UI 加密码(ENABLE_AUTH),背后是你自己的 SERVER_SECRET
  • 自己的攻击面。 挂公网的主机就关掉本地终端(DISABLE_LOCAL_TERMINAL=1)。
  • 自己的数据目录。 DB_PATH 指向 Docker 卷——也可以直接指向桌面版 electerm 的数据目录,书签原地复用。
  • 自己的网络。 HOST/PORT 想绑哪绑哪,前面架 nginx 做 TLS(仓库里有现成例子),限 IP、只走 VPN,按你的策略来。
  • 自己的代码。 config.js 支持自定义 Db 实现和 extensions.appExtend——挂额外的 Express 路由,有的要登录,有的不要。再加从 URL 参数初始化,连接可以预填好。

真正的卖点不是"不用安装的 electerm",而是"跑在你的规则后面的 electerm"。

部署:Docker 一条命令

最快的是预构建镜像(electerm-web-docker,Docker Hub 上叫 zxdong262/electerm-web)。容器内数据在 /home/electerm/data,应用监听 5577

基础版、无登录(只给本机 / VPN 用):

docker run --init \
  -v $(pwd)/electerm-web-data:/home/electerm/data \
  -e "DB_PATH=/home/electerm/data" \
  -e "HOST=0.0.0.0" \
  -p 8082:5577 \
  zxdong262/electerm-web

然后访问 http://127.0.0.1:8082

带登录密码(挂公网必须用这个):

docker run --init \
  -v $(pwd)/electerm-web-data:/home/electerm/data \
  -e "DB_PATH=/home/electerm/data" \
  -e "HOST=0.0.0.0" \
  -e "SERVER_SECRET=some_server_secret" \
  -e "SERVER_PASS=password_to_login" \
  -e "ENABLE_AUTH=1" \
  -p 8082:5577 \
  zxdong262/electerm-web

Linux 下建议加上 --user "$(id -u):$(id -g)",否则数据文件会变成 root 属主。

习惯 Compose?docker-compose.yml

services:
  electerm-web:
    image: zxdong262/electerm-web:latest
    container_name: electerm-web
    volumes:
      - ./electerm-data:/home/electerm/data
    environment:
      - DB_PATH=/home/electerm/data
      - HOST=0.0.0.0
      # - SERVER_SECRET=some_server_secret
      # - SERVER_PASS=password_to_login
      # - ENABLE_AUTH=1
    ports:
      - "8082:5577"
    init: true
    restart: unless-stopped
UID=$(id -u) GID=$(id -g) docker-compose up -d

复用桌面版数据

把卷指向现有的桌面版数据目录而不是空目录,书签直接跟着过来:

# macOS
docker run --init --user "$(id -u):$(id -g)" \
  -v "/Users/<你>/Library/Application Support/electerm":/home/electerm/data \
  -e "DB_PATH=/home/electerm/data" -e "HOST=0.0.0.0" \
  -p 8082:5577 zxdong262/electerm-web

# Linux
docker run --init --user "$(id -u):$(id -g)" \
  -v "/home/<你>/.config/electerm":/home/electerm/data \
  -e "DB_PATH=/home/electerm/data" -e "HOST=0.0.0.0" \
  -p 8082:5577 zxdong262/electerm-web

或者干干净净来:Docker 里从空数据启动,然后桌面端导出、网页端到数据同步导入。视频:Electerm Data Import Export

从源码部署(一行脚本)

Linux/Mac 主机(Node.js 24):

curl -o- https://electerm.org/scripts/one-line-web.sh | bash
# 或:wget -qO- https://electerm.org/scripts/one-line-web.sh | bash

Windows(PowerShell):

Invoke-WebRequest -Uri "https://electerm.org/scripts/one-line-web.bat" -OutFile "one-line-web.bat"
cmd.exe /c ".\one-line-web.bat"

源码生产运行:npm run build,然后 npm run prod(或 ./build/bin/run-prod.sh)——默认监听 5577。开发模式见 electerm-web READMEnpm start + npm run devhttp://127.0.0.1:5580)。

必须做的安全加固

electerm-web 定位是个人使用。把它当 SSH 网关看,暴露到公网就要按网关的标准对待:

  1. 公网必须开认证。 ENABLE_AUTH=1SERVER_SECRET 用长的随机串,SERVER_PASS 用强密码。没认证 = 知道 URL 的人就能用你的终端。
  2. 服务器上关掉本地终端。 DISABLE_LOCAL_TERMINAL=1——浏览器用户不该碰主机的 shell。
  3. 前面加 TLS。 仓库自带 examples/nginx.confexamples/nginx-ssl.conf——绑个域名,nginx 终止 HTTPS,反代到 127.0.0.1:5577
  4. SSH 主机优先用密钥。 生成密钥、公钥装到每台服务器、私钥配进 electerm-web。在任何网页应用里敲的密码,走得都比你想象的远。
  5. 心里把它当单用户。 只有一个登录(SERVER_PASS)、一个数据目录。它是你的个人网关,不是带审计日志的团队堡垒机。管一批机器就配合每台主机的系统用户和密钥来做。

这五条做到,一台几欧元的 VPS 就是个像样的个人跳板机。

再往深了定制

跑起来之后,全部控制就三个文件:

  • .env(从 .sample.env 复制):HOSTPORTSERVERCDNSERVER_SECRETSERVER_USERSERVER_PASSTOKEN_EXPIRED_TIMEDB_PATH,加上上面的开关。
  • config.js(从 config.sample.js 复制):接自己的 Db 类(Mongo 风格的 find/findOne/insert/update/remove),或 extensionsappExtend(app, jwtMiddleWare, jwtErrorHandler) 加路由——公开的和要登录的都能加。
  • examples/nginx*.conf:域名 + TLS 的抄作业起点。

还有从 URL 初始化的 wiki,可以拼出"点开就连到这台主机"的链接——状态页上放个"SSH 进这台机器"按钮正好用上。

短版

  • electerm-web源码docker)是自己托管、用浏览器打开的 electerm。
  • 什么时候用: 装不了客户端(锁死的办公本、Chromebook、平板、手机)、要从外面进内网、想要一个带自己认证/数据/网络规则的统一网关。
  • 怎么装: 一条 docker runDB_PATH 或导出导入复用桌面版书签。
  • 怎么保平安: ENABLE_AUTHDISABLE_LOCAL_TERMINAL、nginx + TLS、SSH 密钥、个人使用的心态。

相关:零部署方案看Electerm Online,桌面版看安装 electerm,连上之后看 SSH in Electerm