{"id":51273005,"url":"https://github.com/kurisu994/tiny-sql","last_synced_at":"2026-06-29T19:32:20.821Z","repository":{"id":367673198,"uuid":"1281096728","full_name":"kurisu994/tiny-sql","owner":"kurisu994","description":"MySQL desktop client with first-class multi-hop SSH tunneling. Tauri + Rust.","archived":false,"fork":false,"pushed_at":"2026-06-27T02:42:09.000Z","size":1041,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-06-27T04:15:27.945Z","etag":null,"topics":["database-gui","desktop-app","mysql","nextjs","proxyjump","rust","sql-client","ssh","ssh-tunnel","tauri"],"latest_commit_sha":null,"homepage":null,"language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/kurisu994.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":"docs/ROADMAP.md","authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":"AGENTS.md","dco":null,"cla":null}},"created_at":"2026-06-26T08:11:19.000Z","updated_at":"2026-06-27T02:42:12.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/kurisu994/tiny-sql","commit_stats":null,"previous_names":["kurisu994/tiny-sql"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/kurisu994/tiny-sql","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kurisu994%2Ftiny-sql","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kurisu994%2Ftiny-sql/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kurisu994%2Ftiny-sql/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kurisu994%2Ftiny-sql/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/kurisu994","download_url":"https://codeload.github.com/kurisu994/tiny-sql/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kurisu994%2Ftiny-sql/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34941026,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-29T02:00:05.398Z","response_time":58,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["database-gui","desktop-app","mysql","nextjs","proxyjump","rust","sql-client","ssh","ssh-tunnel","tauri"],"created_at":"2026-06-29T19:32:20.174Z","updated_at":"2026-06-29T19:32:20.811Z","avatar_url":"https://github.com/kurisu994.png","language":"Rust","funding_links":[],"categories":[],"sub_categories":[],"readme":"# tiny-sql\n\n\u003e 多级跳板机友好的 MySQL 桌面客户端 —— 把 SSH 跳板从「雾中一根管子」变成「可观测的路由器」。\n\n[![CI](https://github.com/kurisu994/tiny-sql/actions/workflows/ci.yml/badge.svg)](https://github.com/kurisu994/tiny-sql/actions/workflows/ci.yml)\n\n**状态：v0.1 开发中，已进入 Week 5 dogfooding**。Week 1-4 的静态验证、本地 `.dmg` 打包、SQL 执行/取消、拓扑图和多跳 SSH 主链路已经落地；当前重点是真实 3 跳 SSH + MySQL 试用、MySQL 5.7 兼容验证、README/GIF 与发布准备。完整范围与进度见 [docs/PLAN.md](./docs/PLAN.md) 与 [docs/ROADMAP.md](./docs/ROADMAP.md)。\n\n## 为什么又造一个 SQL 客户端\n\n市面上的 SQL 桌面客户端（DBeaver / TablePlus / Navicat / DataGrip）几乎都把 SSH 隧道当「雾中一根管子」处理——**单跳、黑盒，出错不知道哪一跳挂了**。但生产环境里多级跳板机（堡垒机 → 内网堡垒 → 业务跳板 → MySQL）是常态。\n\ntiny-sql 把每一跳都当成 UI 上的一等公民：\n\n- **原生多跳 SSH**，不用手动 `ssh -L` 拼链路、改 `~/.ssh/config`\n- **可视化跳板拓扑**，连接失败时高亮断点的那一跳\n- **keepalive 感知断开**，隧道任意一跳挂掉 180s 内推送到 UI\n- 纯 Rust 异步 SSH（russh），跨平台无需系统 `ssh` / `sshpass`\n\n自用 + 同事可用 + 开源。不收费、不联网、仅本地。\n\n## v0.1 当前能力\n\n- N 跳 SSH 配置与连接：密码 / 私钥认证、passphrase 会话缓存、TOFU host key 校验、指纹变更硬拒绝。\n- MySQL 数据浏览：列出 database / table / columns，点表浏览前 1000 行。\n- SQL 执行：拒绝空 SQL / 多语句，`SELECT` / `WITH` 后端子查询包装，SQL 编辑器结果上限 10 万行。\n- SQL 取消：执行时记录 MySQL `CONNECTION_ID()`，取消时通过独立 control pool 发 `KILL QUERY`。\n- 拓扑状态：本机 → N 跳 → MySQL 的只读拓扑图，支持 `pending` / `connected` / `failed` / `lost`。\n- macOS 打包：本地已能产出 `target/release/bundle/dmg/tiny-sql_0.1.0_aarch64.dmg`，GitHub Release workflow 监听 `v0.1.*` tag。\n\n## 技术栈\n\n| 层 | 选型 |\n|---|---|\n| 桌面框架 | Tauri 2.x |\n| 前端 | Next.js 16 (Turbopack) + React 19 + TypeScript + Tailwind CSS 4 + shadcn/ui |\n| 后端 | Rust (Edition 2021, MSRV 1.77.2) + Tokio |\n| SSH 隧道 | russh 0.54（N 跳，纯 Rust 异步） |\n| 数据库 | sqlx 0.8（MySQL；v0.2 加 PostgreSQL） |\n\n\u003e v0.2 之后再考虑 PostgreSQL、自动更新、MySQL TLS、SQL 历史、导出与 schema-aware 智能联想。详见 [ROADMAP](./docs/ROADMAP.md)。\n\n## 开发环境准备\n\n### 前置依赖\n\n- [Node.js](https://nodejs.org/) (LTS)\n- [pnpm](https://pnpm.io/) 11+\n- [Rust](https://rustup.rs/) (MSRV 1.77.2)\n- [just](https://github.com/casey/just)（命令运行器）\n- Tauri 2 系统依赖（参考 [Tauri 官方文档](https://v2.tauri.app/start/prerequisites/)）\n\n### 安装与开发\n\n```bash\njust install      # pnpm install + cargo fetch\njust dev          # 启动 Tauri 完整开发环境（前后端热重载）\njust dev-web      # 仅启动 Next.js 前端（localhost:3000）\n```\n\n### 构建\n\n```bash\njust build        # 生产构建（桌面应用，出 .dmg / .app）\njust build-web    # 仅构建前端（静态导出到 out/）\n```\n\n## 常用命令\n\n| 命令 | 说明 |\n|---|---|\n| `just dev` | 启动 Tauri 开发模式（前后端热重载） |\n| `just dev-web` | 仅启动 Next.js 前端 |\n| `just build` | 生产构建桌面应用 |\n| `just build-web` | 仅构建前端资源 |\n| `just build-debug` | 构建 Debug 版本（含调试符号） |\n| `just check` | 提交前一键自检（fmt 检查 + clippy + 测试 + 前端 build，对齐 CI） |\n| `just lint` | 完整代码检查（tsc + Clippy） |\n| `just lint-rust` | 仅 Rust 检查（Clippy） |\n| `just lint-web` | 仅前端类型检查（tsc） |\n| `just fmt` | 格式化 Rust 代码 |\n| `just fmt-check` | 仅检查格式不修改（CI 用） |\n| `just test` | Rust 单元测试（workspace） |\n| `just test-integration` | integration 测试（连本地 MySQL，需 `.env` 设 `TINY_SQL_TEST_MYSQL_URL`，见 `.env.example`） |\n| `just version \u003cver\u003e` | 同步更新各配置版本号（如 `just version 0.2.0`） |\n| `just release \u003ctag\u003e` | 🚀 一键发布：更新版本号 + Commit + 打 Tag + 推送触发云端构建（如 `just release v0.1.0`） |\n| `just clean` | 清理构建产物 |\n\n## 项目结构\n\n```\ncrates/                     # Rust workspace 成员（与 Tauri 解耦，未来可独立 publish）\n├── ssh-multihop/           # N 跳 SSH 隧道（russh，Tauri-free）\n└── db-driver/              # MySQL driver（v0.1 具体 struct，v0.2 extract trait）\n\nsrc-tauri/                  # Tauri 壳\n├── src/\n│   ├── lib.rs              # Tauri 入口 + commands\n│   └── main.rs\n├── capabilities/           # 权限配置\n└── tauri.conf.json\n\nsrc/                        # 前端源码（Next.js App Router）\n└── app/                    # layout / page / globals.css\n\ndocs/                       # 项目文档\n├── REQUIREMENTS.md         # 需求文档\n├── PLAN.md                 # 开发计划（按周）\n├── ARCHITECTURE.md         # 架构设计（数据流 / 状态机 / 错误模型）\n└── ROADMAP.md              # 路线图（v0.1 / v0.2 / v0.3+）\n\nCHANGELOG.md                # 变更日志\njustfile                    # 项目命令入口\n```\n\n## 安装\n\n\u003e v0.1 尚未正式发布。Week 5 dogfooding 使用本地或 GitHub Release 产出的 `.dmg`；正式发布后前往 [Releases](https://github.com/kurisu994/tiny-sql/releases) 下载。\n\nv0.1 仅提供 **macOS（Apple Silicon + Intel）** `.dmg`；Windows / Linux 推到 v0.3。\n\n### macOS 首次打开\n\nv0.1 暂未配置代码签名证书。安装 `.dmg` 后首次打开时，优先在 Finder 中对 `tiny-sql.app` 右键选择「打开」，再在系统弹窗中确认打开。\n\n如果仍提示**\"已损坏，无法打开\"**，在终端执行：\n\n```bash\nxattr -cr /Applications/tiny-sql.app\n```\n\n然后重新打开即可。\n\n## Week 5 dogfooding\n\ndogfooding 目标是确认 v0.1 能不能真实承担日常多跳 MySQL 查询，而不只是通过静态测试。\n\n### 必验场景\n\n- 真实 3 跳 SSH + MySQL 连接：连接成功后能列出 database / table。\n- TOFU：首次未知 host 弹窗；已信任 host 静默；指纹变更硬拒绝。\n- passphrase：私钥首次输入后同一会话内复用，退出应用后重新要求输入。\n- 表浏览：点表后展示前 1000 行，滚动不卡顿。\n- SQL 执行：覆盖 SELECT / JOIN / 聚合 / 大表无 LIMIT 截断提示。\n- SQL 取消：`SELECT SLEEP(60)` 执行中取消，UI 停止等待，`SHOW PROCESSLIST` 中 query 消失。\n- 拓扑状态：故意断中间跳后，180s 内对应 hop 变为 `lost`。\n- MySQL 5.7：至少一位同事在 5.7 环境完成连接与 SELECT 验证。\n\n试用记录不要写入公开仓库。仓库提供 [dogfooding 日志模板](./docs/dogfooding-log.template.md)，实际记录文件 `docs/dogfooding-log.md` 已被 `.gitignore` 忽略。\n\n## 文档\n\n- [需求文档](./docs/REQUIREMENTS.md)\n- [开发计划](./docs/PLAN.md)\n- [架构设计](./docs/ARCHITECTURE.md)\n- [路线图](./docs/ROADMAP.md)\n- [v0.1 发布检查清单](./docs/RELEASE_CHECKLIST.md)\n\n## License\n\nMIT\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkurisu994%2Ftiny-sql","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fkurisu994%2Ftiny-sql","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkurisu994%2Ftiny-sql/lists"}