Files
K-hermes 9271bf62b2 文档: 重新编写完整的README.md
由Claude Code生成的专业文档,包含:
- 核心特性和技术栈说明
- 快速开始指南(Docker部署)
- 完整的API文档(6个端点)
- 配置说明和安全建议
- 使用示例(Python/Bash/JavaScript)
- 部署指南和故障排查
- FAQ和性能指标

文档基于实际代码分析,内容准确完整。
2026-08-14 10:03:59 +08:00

825 lines
19 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 通用数据同步服务
一个基于 OpenResty/Lua 的轻量级数据同步服务,用于安全存储和管理 Cookie、Token、Credential 等敏感数据,支持自动过期检测和 Web 管理界面。
## 核心特性
- **轻量高效**:基于 OpenResty,单容器运行,内存占用 < 50MB
- **安全可靠**:密码保护 + CORS 支持 + Web 界面身份验证
- **类型丰富**:支持 cookie/token/credential/session/custom 等多种数据类型
- **过期管理**:自动过期检测 + 状态监控 + 通知提醒
- **易于集成**:提供浏览器油猴脚本、Python SDK、REST API
- **Web 管理**:完整的 Web 管理界面,支持查看、复制、删除数据
- **零依赖部署**Docker Compose 一键启动,无需安装 Python/Flask
---
## 技术栈
- **Web 服务器**OpenResty (Nginx + Lua)
- **数据存储**:文件系统 JSON 格式
- **容器化**Docker + Docker Compose
- **前端界面**:纯 HTML/CSS/JavaScript
- **客户端**Python 3.7+、Tampermonkey 油猴脚本
- **API 协议**RESTful HTTP + JSON
---
## 快速开始
### 1. 使用 Docker 部署(推荐)
```bash
# 克隆或进入项目目录
cd /home/hermes/projects/data-sync-service
# 创建数据目录
mkdir -p data
chmod 777 data
# 启动服务
docker-compose up -d
# 验证服务
curl http://localhost:5001/health
# 预期输出: {"status":"ok"}
```
服务将在 `http://localhost:5001` 启动。
### 2. 访问 Web 管理界面
1. 浏览器访问:`http://localhost:5001/login`
2. 输入密码:`admin123123123`(生产环境请修改)
3. 进入管理面板,查看所有同步的数据
### 3. 安装浏览器油猴脚本
1. 安装 [Tampermonkey](https://www.tampermonkey.net/) 扩展
2. 打开 `client/userscript-template.js`
3. 复制内容并创建新脚本
4. 修改配置中的 `serverUrl``password`
5. 保存并启用脚本
### 4. 一键同步数据
在支持的网站(通义听悟、微信公众号等):
1. 登录你的账号
2. 点击页面右侧悬浮的 **🔄 同步数据** 按钮
3. 选择 **立即同步**
4. 看到 ✅ 成功提示
---
## API 文档
### 健康检查
检查服务运行状态。
```bash
GET /health
```
**响应示例**
```json
{
"status": "ok"
}
```
---
### 上传/更新数据
上传或更新指定标签的数据。
```bash
POST /api/data
Content-Type: application/json
```
**请求体**
```json
{
"password": "admin123123123",
"tag": "tingwu:user@example.com",
"type": "cookie",
"data": {
"cookies": [
{
"name": "session_id",
"value": "abc123xyz",
"domain": ".example.com",
"path": "/",
"secure": true,
"httpOnly": false
}
],
"raw_cookie": "session_id=abc123xyz; token=...",
"user_agent": "Mozilla/5.0 ..."
},
"metadata": {
"expires_in": 604800,
"note": "通义听悟账号",
"login_url": "https://tingwu.aliyun.com/"
}
}
```
**字段说明**
- `password`:服务密码(必填)
- `tag`:数据标签,格式:`项目名:账号名`(必填)
- `type`:数据类型,可选值:`cookie`/`token`/`credential`/`session`/`custom`(必填)
- `data`:实际数据内容(必填,格式根据类型自定义)
- `metadata.expires_in`:过期时间(秒),如 `604800` = 7天
- `metadata.note`:备注说明
- `metadata.login_url`:登录页面 URL
**响应示例**
```json
{
"success": true,
"message": "Data saved",
"tag": "tingwu:user@example.com",
"timestamp": "2026-08-14 12:00:00"
}
```
---
### 获取数据
通过标签获取存储的数据。
```bash
GET /api/data/:tag
X-Password: admin123123123
```
**响应示例**
```json
{
"tag": "tingwu:user@example.com",
"type": "cookie",
"data": {
"cookies": [...],
"raw_cookie": "...",
"user_agent": "..."
},
"metadata": {
"created_at": "2026-08-14 10:00:00",
"updated_at": "2026-08-14 12:00:00",
"expires_at": "2026-08-21 12:00:00",
"expires_in": 604800,
"note": "通义听悟账号",
"login_url": "https://tingwu.aliyun.com/"
}
}
```
---
### 列出所有数据
获取所有存储数据的索引列表。
```bash
GET /api/data
```
**响应示例**
```json
{
"tags": {
"tingwu:user@example.com": {
"tag": "tingwu:user@example.com",
"type": "cookie",
"file": "tingwu_user_example_com.json",
"created_at": "2026-08-14 10:00:00",
"updated_at": "2026-08-14 12:00:00",
"expires_at": "2026-08-21 12:00:00",
"status": "valid"
},
"wechat:admin": {
"tag": "wechat:admin",
"type": "cookie",
"file": "wechat_admin.json",
"created_at": "2026-08-13 15:30:00",
"updated_at": "2026-08-14 08:00:00",
"expires_at": "2026-08-15 08:00:00",
"status": "expiring_soon"
}
}
}
```
**状态说明**
- `valid`:正常有效(距离过期 > 2天)
- `expiring_soon`:即将过期(距离过期 < 2天)
- `expired`:已过期
- `no_expiry`:无过期时间
---
### 删除数据
删除指定标签的数据。
```bash
DELETE /api/data/:tag
X-Password: admin123123123
```
**响应示例**
```json
{
"success": true,
"message": "Data deleted",
"tag": "tingwu:user@example.com"
}
```
---
### 获取复制配置
获取用于油猴脚本配置的格式化文本。
```bash
GET /api/data/copy/:tag
```
**响应示例**
```json
{
"copy_text": "{\"serverUrl\":\"http://47.122.126.244:5001\",\"password\":\"admin123123123\",\"tag\":\"tingwu:user@example.com\",\"type\":\"cookie\"}",
"formatted": "```json\n{...}\n```"
}
```
---
## 配置说明
### 修改服务密码
编辑 `nginx/nginx.conf`,全局替换默认密码:
```bash
cd /home/hermes/projects/data-sync-service
sed -i 's/admin123123123/YOUR_SECURE_PASSWORD/g' nginx/nginx.conf
docker-compose restart
```
同时需要更新:
- Python 客户端:修改 `scripts/utils.py` 中的 `PASSWORD`
- 油猴脚本:修改 `CONFIG.password`
- Web 管理界面登录密码
### 修改服务端口
编辑 `docker-compose.yml`
```yaml
services:
nginx:
ports:
- "8080:80" # 修改为你需要的端口
```
重启服务:
```bash
docker-compose up -d
```
### 添加新的项目支持
编辑 `client/userscript-template.js`,在 `PROJECT_PATTERNS` 中添加:
```javascript
const PROJECT_PATTERNS = {
// 现有配置...
'example.com': {
project: 'example',
accountSelector: '.user-email, .account-name',
loginUrl: 'https://example.com/login'
}
};
```
同时在 `@match` 指令中添加匹配规则:
```javascript
// @match https://example.com/*
```
---
## 使用示例
### Python 客户端示例
```python
import sys
sys.path.append('/home/hermes/projects/data-sync-service/scripts')
from utils import upload_data, get_data, list_all_tags, load_cookies_from_sync
# 1. 上传 Cookie 数据
success = upload_data(
tag="myapp:user@example.com",
data_type="cookie",
data={
"cookies": [...],
"raw_cookie": "session=abc123; token=xyz789"
},
expires_in=604800, # 7天
note="我的应用账号",
login_url="https://myapp.com/login"
)
# 2. 获取数据
data = get_data("myapp:user@example.com")
if data:
print(f"类型: {data['type']}")
print(f"创建时间: {data['metadata']['created_at']}")
print(f"过期时间: {data['metadata']['expires_at']}")
# 3. 便捷方式加载 Cookie
cookies = load_cookies_from_sync("tingwu:user@example.com")
if cookies:
# 转换为 requests 可用格式
cookie_dict = {c['name']: c['value'] for c in cookies}
import requests
response = requests.get(
"https://tingwu.aliyun.com/api/endpoint",
cookies=cookie_dict
)
# 4. 列出所有数据
tags = list_all_tags()
for item in tags.values():
print(f"{item['tag']} - {item['status']}")
```
### Bash/cURL 示例
```bash
# 上传数据
curl -X POST http://localhost:5001/api/data \
-H "Content-Type: application/json" \
-d '{
"password": "admin123123123",
"tag": "test:demo",
"type": "token",
"data": {
"access_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
"token_type": "Bearer"
},
"metadata": {
"expires_in": 3600,
"note": "测试 Token"
}
}'
# 获取数据
curl http://localhost:5001/api/data/test:demo \
-H "X-Password: admin123123123"
# 列出所有数据
curl http://localhost:5001/api/data
# 删除数据
curl -X DELETE http://localhost:5001/api/data/test:demo \
-H "X-Password: admin123123123"
```
### JavaScript/Fetch 示例
```javascript
// 上传数据
async function uploadData(tag, type, data) {
const response = await fetch('http://localhost:5001/api/data', {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify({
password: 'admin123123123',
tag: tag,
type: type,
data: data,
metadata: {
expires_in: 604800,
note: '通过 JS 上传'
}
})
});
return await response.json();
}
// 获取数据
async function getData(tag) {
const response = await fetch(`http://localhost:5001/api/data/${tag}`, {
headers: {
'X-Password': 'admin123123123'
}
});
return await response.json();
}
// 使用示例
const result = await uploadData('myapp:user', 'cookie', {
cookies: document.cookie.split(';').map(c => {
const [name, value] = c.trim().split('=');
return { name, value };
})
});
console.log('上传结果:', result);
```
---
## 定时过期检测
### 设置定时任务
过期检测脚本会扫描所有数据,标记即将过期(< 2天)和已过期的数据,并输出通知信息。
**手动运行**
```bash
python3 /home/hermes/projects/data-sync-service/scripts/check_expiry.py
```
**使用 cron 定时运行**
```bash
# 编辑 crontab
crontab -e
# 添加定时任务(每天上午 9 点检查)
0 9 * * * cd /home/hermes/projects/data-sync-service && python3 scripts/check_expiry.py
```
### 检测输出示例
```
❌ 数据已过期
Tag: wechat:admin
类型: cookie
过期时间: 2026-08-13 08:00:00
请重新登录同步:
https://mp.weixin.qq.com/
配置信息(点击复制):
```json
{
"serverUrl": "http://47.122.126.244:5001",
"password": "admin123123123",
"tag": "wechat:admin",
"type": "cookie"
}
```
⚠️ 数据即将过期
Tag: tingwu:user@example.com
类型: cookie
剩余时间: 1.5 天
过期时间: 2026-08-15 18:00:00
建议重新登录同步:
https://tingwu.aliyun.com/
📊 数据状态统计
❌ 已过期: 1 个
⚠️ 即将过期: 1 个
✅ 正常: 3 个
```
---
## 部署指南
### 生产环境部署
1. **修改默认密码**(重要!)
```bash
cd /home/hermes/projects/data-sync-service
sed -i 's/admin123123123/YOUR_STRONG_PASSWORD/g' nginx/nginx.conf
docker-compose restart
```
2. **配置 HTTPS(推荐)**
使用 Nginx 反向代理:
```nginx
# /etc/nginx/sites-available/data-sync
server {
listen 443 ssl http2;
server_name sync.yourdomain.com;
ssl_certificate /etc/ssl/certs/your-cert.pem;
ssl_certificate_key /etc/ssl/private/your-key.pem;
location / {
proxy_pass http://127.0.0.1:5001;
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;
}
}
```
3. **配置防火墙**
```bash
# Ubuntu/Debian
sudo ufw allow 5001/tcp
sudo ufw enable
# 或限制 IP 访问
sudo ufw allow from 192.168.1.0/24 to any port 5001
```
4. **数据备份**
```bash
# 手动备份
tar -czf data-backup-$(date +%Y%m%d).tar.gz data/
# 定时备份(添加到 crontab)
0 2 * * * cd /home/hermes/projects/data-sync-service && tar -czf backups/data-$(date +\%Y\%m\%d).tar.gz data/
```
### 外网访问配置
修改客户端配置中的 `serverUrl`
- Python 客户端:`scripts/utils.py` → `SERVER_URL`
- 油猴脚本:`client/userscript-template.js` → `CONFIG.serverUrl`
```python
# scripts/utils.py
SERVER_URL = "https://sync.yourdomain.com"
```
```javascript
// client/userscript-template.js
const CONFIG = {
serverUrl: 'https://sync.yourdomain.com',
password: 'YOUR_SECURE_PASSWORD'
};
```
---
## 目录结构
```
/home/hermes/projects/data-sync-service/
├── docker-compose.yml # Docker Compose 配置
├── nginx/
│ └── nginx.conf # OpenResty/Nginx 配置(核心 API 实现)
├── web/
│ ├── index.html # Web 管理界面
│ └── login.html # 登录页面
├── data/ # 数据存储目录(挂载到容器)
│ ├── index.json # 数据索引文件
│ ├── tingwu_*.json # 数据文件(tag → 文件名映射)
│ └── *.json # 其他数据文件
├── scripts/ # 工具脚本
│ ├── check_expiry.py # 过期检测脚本
│ ├── clean_expired.py # 清理过期数据
│ ├── migrate.py # 数据迁移工具
│ └── utils.py # Python SDK 工具库
├── client/
│ └── userscript-template.js # Tampermonkey 油猴脚本模板
├── clients/
│ └── client-example.py # Python 客户端使用示例
├── README.md # 本文档
├── DEPLOYMENT.md # 详细部署指南
└── .gitignore # Git 忽略配置
```
---
## 故障排查
### 服务无法启动
```bash
# 查看容器日志
docker-compose logs -f
# 检查端口占用
sudo lsof -i:5001
# 或
netstat -tlnp | grep 5001
# 检查数据目录权限
ls -la data/
chmod 777 data/
```
### API 返回 401 Unauthorized
- 检查请求中的密码是否正确
- POST 请求:检查 JSON body 中的 `password` 字段
- GET/DELETE 请求:检查 HTTP 头 `X-Password` 是否设置
### 数据无法保存
```bash
# 检查磁盘空间
df -h
# 检查数据目录权限
ls -la data/
chmod 777 data/
# 进入容器检查
docker exec -it data-sync-service sh
ls -la /data
```
### 油猴脚本无反应
1. 打开浏览器开发者工具(F12)查看控制台错误
2. 确认当前网站 URL 匹配 `@match` 规则
3. 检查 `CONFIG.serverUrl` 是否可访问
4. 确认服务器防火墙/CORS 配置
### Web 界面无法登录
- 确认密码是否为 `nginx/nginx.conf` 中配置的密码
- 检查浏览器 Cookie 是否被禁用
- 清除浏览器缓存和 Cookie 后重试
---
## 性能指标
- **内存占用**~20-50MBOpenResty 容器)
- **磁盘占用**~10KB/数据项(JSON 格式)
- **响应时间**:< 10ms(本地文件读写)
- **并发能力**1000+ req/sNginx/Lua
- **启动时间**< 2秒
---
## 安全建议
1. **生产环境必须修改默认密码**
2. **使用 HTTPS 加密传输**(通过 Nginx 反向代理)
3. **限制 IP 访问范围**(防火墙 + Nginx allow/deny
4. **定期备份数据目录**
5. **不要在公网暴露 5001 端口**(使用反向代理)
6. **定期清理过期数据**(运行 `clean_expired.py`
7. **审计数据访问日志**(查看 Docker 日志)
---
## 与其他项目集成
### 在自动化脚本中使用
```python
#!/usr/bin/env python3
import sys
sys.path.append('/home/hermes/projects/data-sync-service/scripts')
from utils import load_cookies_from_sync, load_token_from_sync
# 从同步服务加载 Cookie
cookies = load_cookies_from_sync("tingwu:user@example.com")
if cookies:
# 使用 Cookie 进行自动化操作
import requests
session = requests.Session()
for cookie in cookies:
session.cookies.set(cookie['name'], cookie['value'], domain=cookie.get('domain'))
# 发起请求
response = session.get("https://tingwu.aliyun.com/api/v1/tasks")
print(response.json())
else:
print("Cookie 已过期,请重新同步")
sys.exit(1)
```
### 降级方案
当同步服务不可用时,可以降级到本地文件:
```python
def load_cookies_with_fallback(tag):
"""优先从同步服务加载,失败时使用本地文件"""
from utils import load_cookies_from_sync
import json
# 尝试从同步服务加载
cookies = load_cookies_from_sync(tag)
if cookies:
return cookies
# 降级到本地文件
local_path = f"/path/to/local/{tag.replace(':', '_')}.json"
try:
with open(local_path, 'r') as f:
data = json.load(f)
return data.get('cookies', [])
except:
return None
```
---
## 支持的项目
### 已内置支持
1. **通义听悟**tingwu.aliyun.com
- 自动检测账号邮箱
- 同步所有 Cookie
- 7天过期提醒
2. **微信公众号**mp.weixin.qq.com
- 自动检测账号昵称
- 同步登录 Cookie
- 7天过期提醒
### 自定义项目
参考 [添加新的项目支持](#添加新的项目支持) 章节。
---
## 常见问题(FAQ
**Q: 数据存储在哪里?**
A: 数据以 JSON 格式存储在 `data/` 目录下,每个 tag 对应一个文件。
**Q: 支持多少个 tag**
A: 无限制,每个 tag 对应一个独立的 JSON 文件。
**Q: 可以存储哪些类型的数据?**
A: 任何 JSON 可序列化的数据,常见类型包括:cookie、token、credential、session、API key、配置信息等。
**Q: 如何备份数据?**
A: 直接备份 `data/` 目录即可:`tar -czf backup.tar.gz data/`
**Q: 支持集群部署吗?**
A: 当前版本基于文件存储,不支持集群。如需集群部署,建议改为使用 Redis 或数据库存储。
**Q: 如何迁移到新服务器?**
A: 复制整个项目目录,确保 `data/` 目录权限为 777,然后 `docker-compose up -d`
**Q: 密码存储安全吗?**
A: 密码以明文存储在 `nginx.conf` 中,建议使用环境变量或外部密钥管理服务。
**Q: 支持多用户吗?**
A: 当前版本为单用户设计(共享密码),如需多用户支持,需要修改 Nginx 配置添加用户认证系统。
---
## 更新日志
### v1.0.0 (2026-08-14)
- ✨ 重构为 OpenResty/Lua 架构,移除 Flask 依赖
- ✨ 新增 Web 管理界面(带身份验证)
- ✨ 新增数据状态实时检测(valid/expiring_soon/expired
- ✨ 新增一键复制配置功能
- ✨ 优化 Docker 镜像大小(50MB
- ✨ 改进 CORS 配置
- 🐛 修复索引结构(改为对象格式)
- 📝 完善 API 文档和使用示例
---
## 许可证
本项目仅供个人学习和内部使用,请勿用于非法用途。使用本服务存储和传输敏感数据时,请确保符合相关法律法规。
---
## 贡献
欢迎提交 Issue 和 Pull Request
**作者**K-hermes
**项目地址**`/home/hermes/projects/data-sync-service`
---
## 相关文档
- [详细部署指南](DEPLOYMENT.md) - 生产环境部署、监控、备份
- [验收测试](ACCEPTANCE.md) - 功能测试清单
- [技术总结](SUMMARY.md) - 技术选型和设计决策