# snote **Repository Path**: CodeSeeed/snote ## Basic Information - **Project Name**: snote - **Description**: 跨设备云剪贴板,一处复制,随处粘贴。 - **Primary Language**: Unknown - **License**: AGPL-3.0 - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-08-16 - **Last Updated**: 2026-08-17 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Snote 云剪贴板 > 随时随地分享剪贴板内容 —— 在一台设备复制,另一台设备粘贴。 ## 功能特性 - **文本/代码分享** — 创建剪贴板,生成链接,跨设备查看 - **密码保护** — AES-256-GCM 加密存储,查看需输入密码 - **自定义短链接** — 自定义 slug,`/s/your-slug` 直达 - **自动过期** — 5 分钟 ~ 7 天可选,到期自动清除 - **最大查看次数** — 阅后即焚,限制查看次数 - **删除令牌** — 只有持有令牌者能删除剪贴板 - **历史记录** — 按设备跟踪创建历史,可回看、删除 - **二维码分享** — 手机扫码即可打开 - **Markdown 预览** — 自动识别并渲染 Markdown - **暗黑模式** — 亮色/暗色一键切换 - **PWA 支持** — 可安装到桌面,离线缓存静态资源 - **限流保护** — 全局限流 + 创建/密码验证专项限流 - **健康检查** — `GET /api/health`,便于容器编排与监控 - **结构化日志** — JSON 格式,含请求方法、路径、状态、耗时、IP - **全站访问保护** — 可选 Basic Auth,仅自用部署 - **代码语法高亮** — 自动识别 Go/Python/JS/Java 等 18 种语言 - **i18n** — 简体中文 / English 一键切换 - **编辑与版本历史** — 可修改内容,自动保留历史版本 - **原始内容 API** — `GET /api/clips/:id/raw` 返回纯文本,可 curl 管道使用 - **社交卡片预览** — 分享到微信/Telegram/Twitter 自动生成摘要卡片 ## 技术栈 | 层 | 技术 | |----|------| | 后端 | Go + Gin | | 数据库 | SQLite (`mattn/go-sqlite3`) | | 加密 | AES-256-GCM + bcrypt | | 实时 | WebSocket (`gorilla/websocket`) | | 前端 | Vue 3 + Vite + Vue Router | | 依赖 | `marked` (Markdown) · `qrcode` (二维码) | ## 快速开始 ### 开发模式(前后端分离) ```bash # 终端 1:启动后端(端口 8080) cd backend DEV=1 go run . ``` ```bash # 终端 2:启动前端(端口 5173,自动代理 API 到 8080) cd frontend npm install npm run dev ``` 访问 ### 生产模式(单二进制) ```bash # 构建前端 cd frontend && npm install && npm run build # 将前端产物嵌入后端并编译 mkdir -p backend/frontend/dist && cp -r frontend/dist/* backend/frontend/dist/ cd backend && go build -o ../bin/snote . # 运行 ./bin/snote ``` 访问 或使用一键构建: ```bash make build ``` ## 环境变量配置 | 变量 | 默认值 | 说明 | |------|--------|------| | `SNOTE_PORT` | `8080` | 监听端口 | | `SNOTE_DB_PATH` | `snote.db` | SQLite 数据库路径 | | `SNOTE_ALLOWED_ORIGINS` | `*` | CORS 允许的域名(逗号分隔) | | `SNOTE_GLOBAL_RATE` | `60` | 全局 API 限流(次/分钟/IP) | | `SNOTE_CREATE_RATE` | `10` | 创建剪贴板限流(次/分钟/IP) | | `SNOTE_VERIFY_RATE` | `5` | 密码验证限流(次/分钟/IP) | | `SNOTE_CLEANUP_INTERVAL_MIN` | `10` | 过期剪贴板清理间隔(分钟) | | `SNOTE_ADMIN_PASSWORD` | `` | 全站 Basic Auth 密码(为空时不启用) | | `GIN_MODE` | `release` | Gin 运行模式 | ## API 一览 | 方法 | 路径 | 说明 | |------|------|------| | `POST` | `/api/clips` | 创建剪贴板 | | `GET` | `/api/clips/:id` | 获取内容(密码保护需 `X-Clip-Password` 头) | | `GET` | `/api/s/:slug` | 通过自定义链接访问 | | `GET` | `/api/clips/:id/raw` | 获取原始内容(纯文本,支持 `X-Clip-Password` 头或 `?password=`) | | `POST` | `/api/clips/:id/verify` | 验证密码 | | `PUT` | `/api/clips/:id` | 编辑内容(需 `X-Delete-Token` 头) | | `GET` | `/api/clips/:id/versions` | 版本历史(需 `?token=` 删除令牌) | | `DELETE` | `/api/clips/:id?token=xxx` | 删除剪贴板(需删除令牌) | | `GET` | `/api/history?device_id=xxx&offset=0&limit=20` | 获取历史记录(分页) | | `GET` | `/api/health` | 健康检查 | | `GET` | `/ws/:roomID` | WebSocket 实时同步 | ## 测试 ```bash cd backend go test ./... ``` ## 许可证 本项目采用 [GNU Affero General Public License v3.0](LICENSE)(AGPL-3.0)开源许可。 ## 作者 - **CodeSeed** - xiatianxuan2025@163.com