153 lines
3.9 KiB
Markdown
153 lines
3.9 KiB
Markdown
# uploader
|
||
|
||
一个常驻扫描器:定期扫描目录中的 `.json` 文件,并以 `multipart/form-data` 方式上传到一个或多个 HTTP 接口;上传成功/跳过/失败会写入本地 SQLite 状态库,避免重复上传。
|
||
|
||
## 运行环境
|
||
|
||
- Python 3.9+(建议 3.10/3.11)
|
||
- 依赖见 `requirements.txt`
|
||
|
||
## 快速开始(本地)
|
||
|
||
```bash
|
||
cd /opt/uploader
|
||
python3 -m venv .venv
|
||
source .venv/bin/activate
|
||
pip install -U pip
|
||
pip install -r requirements.txt
|
||
|
||
# 运行(示例)
|
||
./.venv/bin/python uploader.py --dir /opt/uploader --interval 360
|
||
```
|
||
|
||
## 配置(环境变量 / .env)
|
||
|
||
脚本会在启动时尝试加载当前工作目录下的 `.env`(需要安装了 `python-dotenv`)。
|
||
|
||
建议在 `/opt/uploader/.env` 配置:
|
||
|
||
```ini
|
||
# 鉴权 token(必填)
|
||
UPLOAD_TOKEN=your_token_here
|
||
|
||
# 上传接口列表(推荐用 ; 或 , 分隔;不要用 ':' 分隔)
|
||
# 示例使用本机地址;请按你的实际服务地址修改
|
||
UPLOAD_ENDPOINTS=http://127.0.0.1:8317/v0/management/auth-files;http://127.0.0.1:46344/v0/management/auth-files
|
||
|
||
# JSON 子目录(可选):从这些目录递归扫描 *.json
|
||
# 注意:该变量支持 os.pathsep 分隔(Linux 为 ':',Windows 为 ';'),也支持逗号
|
||
UPLOAD_JSON_SUBDIR=/usr/local/openai_register/tokens
|
||
# 或多个:UPLOAD_JSON_SUBDIRS=/path/a:/path/b
|
||
|
||
# 默认 endpoint(当未设置 UPLOAD_ENDPOINTS 且未传 --endpoint 时使用)
|
||
UPLOAD_ENDPOINT=http://127.0.0.1:8317/v0/management/auth-files
|
||
|
||
# 默认 SQLite DB 文件名(当未传 --db 时使用)
|
||
UPLOAD_DB=upload_state.sqlite3
|
||
```
|
||
|
||
### 环境变量说明
|
||
|
||
- `UPLOAD_TOKEN`:上传鉴权 token(支持 `Bearer xxx` 或直接 token)
|
||
- `UPLOAD_ENDPOINTS`:多个上传接口 URL,用 `;` 或 `,` 分隔(不要用 `:` 分隔,因为 URL 自己包含 `http://` 和端口)
|
||
- `UPLOAD_ENDPOINT`:默认接口 URL(兜底用)
|
||
- `UPLOAD_DB`:默认 SQLite 状态库文件名(兜底用)
|
||
- `UPLOAD_JSON_SUBDIRS` / `UPLOAD_JSON_SUBDIR`:扫描子目录(可选;不设置则扫描 `--dir` 本身)
|
||
|
||
## 命令行参数
|
||
|
||
```bash
|
||
./.venv/bin/python uploader.py \
|
||
--dir /opt/uploader \
|
||
--interval 360 \
|
||
--endpoint http://XXX:8317/v0/management/auth-files \
|
||
--db upload_state.sqlite3 \
|
||
--timeout 60 \
|
||
--once
|
||
```
|
||
|
||
常用参数:
|
||
- `--dir`:工作目录
|
||
- `--interval`:扫描间隔(秒)
|
||
- `--endpoint`:当未配置 `UPLOAD_ENDPOINTS` 时使用的单个 endpoint
|
||
- `--db`:SQLite 文件名/路径
|
||
- `--once`:只跑一轮就退出
|
||
|
||
## Linux 部署(systemd 推荐)
|
||
|
||
### 1) 放置项目
|
||
|
||
```bash
|
||
mkdir -p /opt/uploader
|
||
# 将 uploader.py、requirements.txt、.env 放到 /opt/uploader
|
||
```
|
||
|
||
### 2) 安装依赖
|
||
|
||
```bash
|
||
cd /opt/uploader
|
||
python3 -m venv .venv
|
||
source .venv/bin/activate
|
||
pip install -U pip
|
||
pip install -r requirements.txt
|
||
```
|
||
|
||
### 3) 创建 systemd 服务
|
||
|
||
创建 `/etc/systemd/system/uploader.service`:
|
||
|
||
```ini
|
||
[Unit]
|
||
Description=uploader daemon
|
||
After=network.target
|
||
|
||
[Service]
|
||
Type=simple
|
||
WorkingDirectory=/opt/uploader
|
||
ExecStart=/opt/uploader/.venv/bin/python /opt/uploader/uploader.py --dir /opt/uploader --interval 360
|
||
Restart=always
|
||
RestartSec=3
|
||
Environment=PYTHONUNBUFFERED=1
|
||
|
||
[Install]
|
||
WantedBy=multi-user.target
|
||
```
|
||
|
||
启用并启动:
|
||
|
||
```bash
|
||
systemctl daemon-reload
|
||
systemctl enable --now uploader
|
||
systemctl status uploader
|
||
```
|
||
|
||
## 实时看日志
|
||
|
||
### 方式 A:直接看 systemd 日志(推荐)
|
||
|
||
```bash
|
||
journalctl -u uploader -f -o cat
|
||
```
|
||
|
||
### 方式 B:输出到文件再 tail
|
||
|
||
在 `uploader.service` 的 `[Service]` 增加:
|
||
|
||
```ini
|
||
StandardOutput=append:/var/log/uploader/uploader.log
|
||
StandardError=append:/var/log/uploader/uploader.err.log
|
||
```
|
||
|
||
并创建目录(如果服务用非 root 用户运行,请确保有写权限):
|
||
|
||
```bash
|
||
mkdir -p /var/log/uploader
|
||
# 如果 service 里设置了 User=uploader:
|
||
# chown -R uploader:uploader /var/log/uploader
|
||
|
||
systemctl daemon-reload
|
||
systemctl restart uploader
|
||
|
||
tail -n 200 -f /var/log/uploader/uploader.log
|
||
```
|