---自托管、浏览器即可访问的 Linux 工作站。一个 Go 二进制扔到 VPS 上,浏览器打开
https://your.domain就能拿到带终端、文件管理器、系统监控、进程管理器的水墨风桌面——所有操作落到真实 Linux 上,不是模拟、不是沙箱,是bash -l+ 主机文件系统。
| 桌面概览 | 系统监控 |
|---|---|
![]() |
![]() |
| 进程管理器 | 文件管理器 |
|---|---|
![]() |
![]() |
| 终端 | 设置:主题与壁纸 |
|---|---|
![]() |
![]() |
| 内置浏览器 |
|---|
![]() |
| mochan-linux | 传统 Web 终端 (ttyd / wetty) |
浏览器 IDE (code-server) |
|---|---|---|
| 完整桌面体验:多窗口、文件管理、代码编辑、系统监控同框 | 仅一个终端窗口 | 仅一个编辑器窗口 |
| 单 Go 二进制,不依赖 Docker / Node 运行时 | 单二进制 | 需要 Node 运行时 |
| 不绑定单一 IDE——通用桌面壳 | N/A | 绑定 VS Code |
| 水墨风主题系统 + 壁纸自定义 | 无主题 | 主题有限 |
| 内置浏览器代理,服务器侧渲染网页 | 无 | 无 |
- 当前版本:v1.0.2(应用后端完成队列收尾版)
- 已验证宿主:Ubuntu 24.04 LTS x86_64(生产部署在
linux.mochance.xyz) - 客户端兼容:Chrome / Edge / Safari 最近两个大版本;Firefox 最新版
最新已发布版本在 GitHub Release:
https://github.com/Cmochance/mochan-linux/releases/latest
每个版本至少包含:
mochan-linux-amd64.tar.gz:Linux x86_64(绝大多数 VPS / 物理机)mochan-linux-arm64.tar.gz:Linux ARM64(树莓派 4/5、Apple Silicon 上的 Linux VM、ARM 云主机)SHA256SUMS:校验文件,每条对应一个.tar.gz
校验:
sha256sum -c <(grep mochan-linux-amd64.tar.gz SHA256SUMS)本项目按设计把目标主机的真实 shell 暴露给已认证的浏览器用户。配置错一项就是从"私人工作站"变成"全互联网可达的远程代码执行入口"。强制规则:
- 单用户单密码 ≥ 16 字符。爆破防护极弱——
/api/auth/login仅做 500 ms 固定延时,强烈建议在反向代理层加fail2ban或 IP 白名单。 - 必须 HTTPS。后端默认绑
127.0.0.1:38421(或反代在 Docker 里时绑172.17.0.1:38421),永远不要把 38421 直接暴到公网。 - 浏览器应用是服务器侧代理。已登录用户可以让 VPS 请求公网、
127.0.0.1和内网 HTTP 服务;后端会拦截 link-local 和常见云 metadata 地址,但不要把账号开放给不完全可信的人。 MOCHAN_JWT_SECRET≥ 32 字节随机;用mochan gen-secret生成;泄露立即轮换。- 服务用户必须非 root(默认
mochan)。NOPASSWD sudo 只在你确实需要从浏览器装包时给。 unattended-upgrades、SSH key-only、root 禁登都按 Linux 加固常规来。
如果以上任意一条不熟悉,先在内网部署一遍再往公网放。
# 把 release tar.gz 传到服务器并解压
scp mochan-linux-amd64.tar.gz user@your-vps:/tmp/
ssh user@your-vps
cd /tmp && tar xzf mochan-linux-amd64.tar.gz
# 运行安装脚本(创建 mochan 用户、systemd 服务、配置文件)
sudo bash deploy/install.sh安装完成后编辑配置:
sudo vim /etc/mochan/config.env必须设置:
| 变量 | 说明 |
|---|---|
MOCHAN_PASSWORD_HASH |
bcrypt 密码哈希,用 ./bin/mochan-linux-amd64 hash-password 生成 |
MOCHAN_JWT_SECRET |
≥ 32 字节随机串,用 ./bin/mochan-linux-amd64 gen-secret 生成 |
可选设置:
| 变量 | 默认值 | 说明 |
|---|---|---|
MOCHAN_PORT |
38421 |
监听端口 |
MOCHAN_BIND |
127.0.0.1 |
监听地址 |
MOCHAN_USER |
mochan |
服务运行的系统用户 |
MOCHAN_SHELL |
/bin/bash -l |
登录 shell |
MOCHAN_THEME |
ink |
默认主题(ink / light / dark) |
启动:
sudo systemctl daemon-reload
sudo systemctl enable --now mochan在 Nginx Proxy Manager / Caddy / Traefik 任选一种,把 https://linux.your.domain 反代到 http://127.0.0.1:38421,必须开 WebSocket 支持。
Nginx 示例:
server {
listen 443 ssl http2;
server_name linux.your.domain;
ssl_certificate /etc/letsencrypt/live/linux.your.domain/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/linux.your.domain/privkey.pem;
location / {
proxy_pass http://127.0.0.1:38421;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_read_timeout 86400;
}
}浏览器打开 https://linux.your.domain,输入密码即可进入桌面。
完整配置项(/etc/mochan/config.env):
| 变量 | 默认值 | 说明 |
|---|---|---|
MOCHAN_PORT |
38421 |
监听端口 |
MOCHAN_BIND |
127.0.0.1 |
监听地址(反代在 Docker 里时用 172.17.0.1) |
MOCHAN_USER |
mochan |
服务运行的系统用户 |
MOCHAN_SHELL |
/bin/bash -l |
终端登录 shell |
MOCHAN_PASSWORD_HASH |
— | 必须设置,bcrypt 哈希 |
MOCHAN_JWT_SECRET |
— | 必须设置,≥ 32 字节随机 |
MOCHAN_THEME |
ink |
默认主题(ink / light / dark) |
# 前端 dev server (port 3000) 自动代理 /api 和 /ws 到本地 38421
cd web && npm install && npm run dev
# 如果后端临时跑在其他端口,可设置:
# MOCHAN_DEV_TARGET=http://127.0.0.1:38422 npm run dev
# 后端 dev server (port 38421) 用临时凭据
bash scripts/dev.sh
# 默认账号 admin / devpassword,可通过 MOCHAN_DEV_PASSWORD 覆盖生产构建:make release GOOS=linux GOARCH=amd64,产物 ./bin/mochan-linux-amd64。
mochan-linux/
├── web/ React + Vite + shadcn/ui + xterm.js + CodeMirror 6
├── server/ Go 1.24+ 后端(chi + JWT + embed.FS + creack/pty + gopsutil)
│ ├── cmd/mochan/ 入口 + CLI 子命令(run / hash-password / gen-secret / version)
│ └── internal/
│ ├── auth/ bcrypt + JWT 中间件
│ ├── browser/ /api/browser/proxy 服务器侧网页代理
│ ├── pty/ /ws/pty WebSocket ↔ PTY
│ ├── fsapi/ /api/fs/*
│ ├── sysinfo/ /api/sys/*
│ └── static/ go:embed 前端 dist
├── deploy/ systemd unit + install.sh + NPM 配置说明
├── scripts/ dev.sh、deploy 助手
├── Makefile make build / make release
└── .github/workflows/ tag 触发的多架构 release
确认反向代理已开启 WebSocket 支持(Upgrade + Connection 头)。Nginx 需要 proxy_http_version 1.1 + proxy_set_header Upgrade。
在服务器上重新生成哈希并写入 config.env:
./bin/mochan-linux-amd64 hash-password
# 输入新密码,把输出的 bcrypt 哈希贴到 MOCHAN_PASSWORD_HASH
sudo systemctl restart mochan登录后进入 设置 → 主题与壁纸,内置 ink(水墨风)、light、dark 三套主题,支持上传自定义壁纸。
# 下载新版本 release,替换二进制并重启
sudo systemctl stop mochan
cp mochan-linux-amd64 /opt/mochan/mochan-linux-amd64
sudo systemctl start mochantsl0922/ttyd— Web 终端参考butlerx/wetty— 另一个 Web 终端方案coder/code-server— 浏览器里跑 VS Codegolang/crypto— bcrypt 实现creack/pty— Go PTY 操作gopsutil— 系统信息采集
MIT © Cmochance





