Skip to content

toolazytoname/lodge

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

3 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Lodge

自托管的个人控制台 —— 一个 HTML 文件 + 一个 JSON 文件,管理服务器、服务订阅、加密 token。

Lodge = 山间小屋(home base) + 寄托存放(lodge something)。集中托管你日常会用到的所有"个人基础设施"。

特性

  • 三合一:服务器清单 / 服务目录 / 加密 Vault
  • 零网络请求:HTML 内联所有 CSS/JS,无任何外部依赖
  • 零知识加密:Vault 内容 AES-GCM 256 加密,主密码永不离开浏览器
  • iCloud 同步:把两个文件丢进 iCloud Drive,自动跨设备同步
  • 响应式:手机 / 平板 / 电脑自适应

文件

dashboard.html   应用本体(~90KB 单文件)
config.json      数据(服务器/服务/加密 Vault)

快速开始

1. 部署

把两个文件放在任意 HTTPS 可达的目录。最简单的方式:

# macOS 本地
mkdir -p ~/Documents/Lodge
cp dashboard.html config.json ~/Documents/Lodge/
cd ~/Documents/Lodge && python3 -m http.server 9001

# Linux 服务器
mkdir -p /opt/lodge
cp dashboard.html config.json /opt/lodge/
cd /opt/lodge && python3 -m http.server 9001

浏览器访问 http://localhost:9001/dashboard.html

2. 公网访问(必须 HTTPS)

由于浏览器安全模型限制,HTTP 公网下无法使用 Vault(Web Crypto API 不可用)。三种最简单方案:

方案 难度 备注
Cloudflare Tunnel ⭐ 最简单 免账号、5 分钟、trycloudflare.com 域名
Tailscale Funnel 简单 需装客户端、自动 HTTPS
Caddy + 域名 中等 自有域名 + DNS,一劳永逸

Cloudflare Tunnel 一行启动(推荐):

# 安装 cloudflared
curl -fsSL https://pkg.cloudflare.com/cloudflare-main.gpg | sudo tee /usr/share/keyrings/cloudflare-main.gpg >/dev/null
echo "deb [signed-by=/usr/share/keyrings/cloudflare-main.gpg] https://pkg.cloudflare.com/cloudflared $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/cloudflared.list
sudo apt update && sudo apt install -y cloudflared

# 启动隧道(先确保 dashboard.html 已在另一终端通过 http.server 9001 提供)
cloudflared tunnel --url http://localhost:9001

会输出 https://xxx.trycloudflare.com,用这个 URL 访问即可。

3. iCloud Drive 跨设备同步

# macOS
cp dashboard.html config.json ~/Library/Mobile\ Documents/iCloud~is~workflow/Documents/Lodge/

iPhone 上:

  1. 打开"文件"App → iCloud Drive → Lodge 文件夹
  2. 长按 dashboard.html → 共享 → Safari 打开
  3. 首次会要求选 config.json,授权后 Safari 会记住

重要:iPhone 上 file:// 协议不支持 Web Crypto。必须通过 Cloudflare Tunnel / Tailscale 等 HTTPS 方式访问。

4. SSH 连接

服务器卡片提供两种方式:

  • SSH 按钮:尝试唤起系统默认 SSH 客户端
    • macOS → Terminal/iTerm
    • iOS → Termius / Prompt 等
    • 失败时自动复制命令到剪贴板
  • 复制按钮:复制 ssh user@host -p port,30 秒后自动清除

安全模型

维度 实现
主密码存储 永不上传、不落盘,仅在内存中派生
密钥派生 PBKDF2-SHA256,600,000 次迭代
数据加密 AES-GCM 256,每条 vault 独立 IV
密码验证 启动时用 verifier 字段确认主密码
内存保护 锁定时清空明文,关闭页面自动清
剪贴板 复制后 30s 自动清(SSH 与 vault)
攻击面 零网络请求、零服务器、零第三方

攻击场景对照

场景 后果
iCloud 账号被黑 拿到密文 + 元数据,没有主密码解不开 vault
配置文件误传公网 服务器 IP 泄露,但 vault 仍是密文
设备丢失 锁定前未关闭可能被读;建议短自动锁定
主密码被破解 全部 token 裸奔——主密码要强

已知边界

  • config.json 中的元数据(服务器别名、IP、服务 URL)以明文存储,这是设计如此——不存明文的话你打开 app 就什么都看不到。
  • 浏览器 localStorage 缓存同样的元数据(不含 vault 密钥)。切换设备/用户前可点 设置 → 清除本地缓存。
  • 浏览器历史会记录访问 URL。强烈建议本地部署或 Tailscale,避免公网留痕。

数据格式 (config.json)

{
  "version": 1,
  "meta": { "created": "ISO", "lastModified": "ISO" },
  "servers": [
    { "id": "nas", "alias": "家庭 NAS", "host": "192.168.1.10",
      "sshPort": 22, "sshUser": "root",
      "tags": ["家庭"], "notes": "..." }
  ],
  "services": [
    { "id": "jf", "name": "Jellyfin", "url": "http://192.168.1.10:8096",
      "type": "media", "icon": "J", "serverId": "nas",
      "description": "..." }
  ],
  "vault": {
    "kdf": "PBKDF2-SHA256",
    "iterations": 600000,
    "salt": "base64...",
    "verifier": "base64...",
    "verifierIv": "base64...",
    "items": [
      { "id": "...", "type": "token", "title": "...",
        "url": "...", "username": "...",
        "ciphertext": "base64...", "iv": "base64...",
        "createdAt": "ISO", "updatedAt": "ISO" }
    ]
  },
  "settings": {
    "autoLockMinutes": 5,
    "theme": "auto",
    "clearClipboardSeconds": 30
  }
}

日常使用

修改数据

  • UI 里增删改服务器 / 服务 / Vault 条目
  • 改动实时保存到 localStorage(防意外丢失)
  • 改完点底部"保存到文件" → 浏览器下载 config-时间戳.json
  • 把下载文件移动到 Lodge 目录覆盖原 config.json
  • iCloud 自动推送到所有设备

更换主密码

设置 → 更改主密码 → 当前密码 + 两次新密码 → 自动用新密码重新加密所有 vault 条目。

忘记主密码

无解。这是零知识设计的代价。

应对

  • 设置时记牢
  • 写一份物理备份(藏起来)
  • 或者干脆不存重要 token 在 vault 里(用其他密码管理器)

部署到 GitHub

公开仓库的隐私规范

如果想把 HTML 部署到 GitHub Pages,config.json 必须脱敏。一个标准的脱敏模板:

{
  "version": 1,
  "meta": { "created": "2024-01-01T00:00:00.000Z", "lastModified": "2024-01-01T00:00:00.000Z" },
  "servers": [
    { "id": "demo-1", "alias": "示例服务器", "host": "192.0.2.1",
      "sshPort": 22, "sshUser": "demo",
      "tags": ["示例"], "notes": "公开示例数据" }
  ],
  "services": [
    { "id": "demo-svc", "name": "示例服务", "url": "https://example.com",
      "type": "web", "icon": "E", "serverId": "demo-1", "description": "" }
  ],
  "vault": {
    "kdf": "PBKDF2-SHA256", "iterations": 600000,
    "salt": "", "verifier": "", "items": []
  },
  "settings": { "autoLockMinutes": 5, "theme": "auto", "clearClipboardSeconds": 30 }
}

永远不要提交

  • 真实的 vault.salt / vault.verifier —— 即便加密,谁拿到主密码都能解
  • 真实的服务器 IP / 域名 —— 你的内网拓扑不该公开
  • 真实的 SSH 用户名 / 端口 / 备注

推荐部署模式

  • HTML → GitHub Pages(HTTPS,免费)
  • config.json → 你自己的服务器(通过 Cloudflare Tunnel 暴露 HTTPS)
  • HTML fetch 你的 config.json(两端都 HTTPS,无 CORS)

浏览器兼容

需要支持 Web Crypto API 的现代浏览器:

  • Safari 11+ / Chrome 60+ / Firefox 60+ / Edge 79+

不在范围内

明确做:

  • Web 终端 SSH(用 ssh:// 深链或本地终端)
  • TOTP 自动填充(用 1Password / Authy)
  • 多人/团队协作
  • 服务端状态探活后端
  • 自动云同步(靠 iCloud / 自己的存储)
  • 附件/图片存储

如果以上是硬需求,建议改用专业工具(Vaultwarden / Bitwarden / 1Password)。

开发与定制

HTML 是单文件,所有 CSS/JS 内联。直接用文本编辑器修改即可。要拆分维护,把 <style><script> 抽出来即可,无构建步骤。

License

MIT

About

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages