# 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 ```