Skip to content

Cmochance/mochan-linux

Repository files navigation

mochan-linux

自托管、浏览器即可访问的 Linux 工作站。一个 Go 二进制扔到 VPS 上,浏览器打开 https://your.domain 就能拿到带终端、文件管理器、系统监控、进程管理器的水墨风桌面——所有操作落到真实 Linux 上,不是模拟、不是沙箱,是 bash -l + 主机文件系统。

GitHub stars License Go Downloads

Latest Release Notes

---

截图

桌面概览 系统监控
桌面概览 系统监控
进程管理器 文件管理器
进程管理器 文件管理器
终端 设置:主题与壁纸
终端 设置:主题与壁纸
内置浏览器
内置浏览器

亮点

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 最新版

快速开始

1. 下载

最新已发布版本在 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)

2. 安全前提(部署前必读)

本项目按设计把目标主机的真实 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 加固常规来。

如果以上任意一条不熟悉,先在内网部署一遍再往公网放。

3. 服务器上初次部署

# 把 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

4. 反向代理

在 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;
    }
}

5. 登录

浏览器打开 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 报错

确认反向代理已开启 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(水墨风)、lightdark 三套主题,支持上传自定义壁纸。

如何升级

# 下载新版本 release,替换二进制并重启
sudo systemctl stop mochan
cp mochan-linux-amd64 /opt/mochan/mochan-linux-amd64
sudo systemctl start mochan

致谢

相关项目

许可证

MIT © Cmochance

About

Self-hosted browser-accessible Linux workstation. Single Go binary embeds a React desktop UI and bridges browser <-> real Linux (terminal, files, processes, metrics) over REST + WebSocket.

Resources

License

Stars

Watchers

Forks

Packages

 
 
 

Contributors