From 79001a42fea57d409ab28b32680ffed9d4922ea2 Mon Sep 17 00:00:00 2001 From: dr34-m <1416814478@qq.com> Date: Sat, 24 Aug 2024 19:16:45 +0800 Subject: [PATCH] =?UTF-8?q?add=20=E5=8F=AF=E4=BB=A5=E9=80=9A=E8=BF=87?= =?UTF-8?q?=E6=96=87=E4=BB=B6=E6=9D=A5=E4=BF=AE=E6=94=B9=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 127 ++++++++++++++++++++------------ common/commonService.py | 2 +- common/config.py | 47 ++++++++++-- controller/systemController.py | 2 +- doc/changelog/v0.2.2.md | 3 +- doc/config.ini | 13 ++++ main.py | 2 +- service/system/logJobService.py | 4 +- version.txt | 2 +- 9 files changed, 140 insertions(+), 62 deletions(-) create mode 100644 doc/config.ini diff --git a/README.md b/README.md index 33949b4..87943a9 100644 --- a/README.md +++ b/README.md @@ -23,27 +23,63 @@ [GitHub地址](https://github.com/dr34-m/taosync) [Gitee地址](https://gitee.com/dr34m/taosync) -本工具主要用于同步备份功能,可以定时扫描指定目录下文件差异,让目标目录与源目录相同(全同步模式);或仅新增存在于源目录,却不存在于目标目录的文件(仅新增模式)。 +桃桃是我女儿的乳名,我是桃桃她爸,这也是本程序的logo。本程序开发之初,主要是为了保存桃桃成长的照片,故名`taoSync` -桃桃是我女儿的名字,我女儿的名字叫桃桃。本工具意为:桃桃的自动同步工具 +## 须知 + +使用本工具前你必须了解并且会使用[AList](https://github.com/alist-org/alist);本工具没有集成`AList`,你需要额外启动`AList` **警告!不要在外网暴露本系统,否则后果自负!** > 本系统已经做了一定的安全方面的工作,但仍不能保证绝对安全。如确实需要,请务必使用强密码,并使用`SSL` -## 须知 +## 用途举例 + +#### 1. 同步备份 + +把本地文件备份到多个网盘或FTP之类的存储,或者在多个网盘之间同步文件等; + +可以定时扫描指定目录下文件差异,让目标目录与源目录相同(全同步模式);或仅新增存在于源目录,却不存在于目标目录的文件(仅新增模式) -`v0.2.0`不再兼容之前的版本(因为密码加密方式变更,如果用之前的库文件会提示密码错误,密码为单向加密,无法解密) +#### 2. 定时下载 -本工具不使用`AList`源码而是使用[AList v3 API](https://alist.nn.ci/zh/guide/api/apifox.html)来实现相关功能。使用本工具前你必须了解并且会使用[AList](https://github.com/alist-org/alist) +可以设置一次性任务(`cron`方式设置年月日时分秒,将在指定时间执行一次),可在闲时自动从特定网盘下载文件到本地 -本工具没有集成`AList`,你需要额外启动`AList` +## 特性 + +* 开源免费,几乎支持所有常用平台 + * windows-amd64 + * darwin-amd64 + * darwin-arm64 + * linux-amd64 + * linux-arm64 + * linux-386 + * linux-arm-v6 + * linux-arm-v7 + * linux-s390x + * linux-ppc64le +* [Github Actions](https://docs.github.com/zh/actions)自动打包与发布构建好的可执行程序,并支持Docker,下载即用 +* 干净卸载,不用的时候删掉即可,无任何残留或依赖,不影响系统里其他程序 +* 密码加密不可逆,永远不会泄露您的密码,敏感信息均被加密 +* 完全离线运行(仅连接AList),永不上传用户隐私 +* 完善的错误处理,稳定可靠,逻辑自洽;可能出错,但永不崩溃(我猜的) +* 完善的日志,所有错误都会被记录 +* 引擎管理,可以自由增删改查`AList` +* 作业管理,可以新增/删除/启用/禁用/编辑/手动执行作业 +* 仅新增与全同步模式 +* 定时同步支持间隔或`cron`方式 +* 同步进度实时可视化查看与筛选 +* 存储可控,合理配置任务记录与日志保留天数,可以控制本程序所占用存储在可控范围内 ## 使用方法 -### 启动 +### 先启动 + +* 可执行程序 -#### docker +前往[Release](https://github.com/dr34-m/taosync/releases)下载对应平台的可执行程序,直接执行 + +* docker ```sh docker run -d --restart=always -p 8023:8023 -v /opt/data:/app/data --name=taoSync dr34m/tao-sync:latest @@ -51,13 +87,9 @@ docker run -d --restart=always -p 8023:8023 -v /opt/data:/app/data --name=taoSyn 把其中`/opt/data`替换为你实际的目录 -在绿联NAS中使用可以参考这里[如何在绿联NAS中使用TaoSync同步我的文件到各个网盘](https://blog.ctftools.com/2024/07/newpost-57/) +在绿联NAS中使用可以参考这里[如何在绿联NAS中使用TaoSync同步我的文件到各个网盘](https://blog.ctftools.com/2024/07/newpost-57/),在其他支持Docker的NAS中使用大同小异 -#### 可执行程序 - -前往[Release](https://github.com/dr34-m/taosync/releases)下载对应平台的可执行程序,直接执行 - -### 使用 +### 再使用 访问`http://127.0.0.1:8023` @@ -67,18 +99,39 @@ docker run -d --restart=always -p 8023:8023 -v /opt/data:/app/data --name=taoSyn 进入系统后先到`引擎管理`菜单创建引擎,然后前往`作业管理`创建同步作业 -## 环境变量及其意义 +## 配置项 + +配置优先级:`data/config.ini`>`环境变量`>`默认值`;前一个存在,则后边都将被**忽略**。修改配置需重启程序或Docker。 + +`data/config.ini`文件示例(如该文件存在,则**优先级最高**) + +```ini +[tao] +# 运行端口号 +port=8023 +# 登录有效期,单位天 +expires=2 +# 日志等级:0-DEBUG,1-INFO,2-WARNING,3-ERROR,4-CRITICAL;数值越大,产生的日志越少,推荐1或2 +log_level=1 +# 系统日志保留天数,该天数之前的日志会自动清理,单位天,0表示不自动清理 +log_save=7 +# 任务记录保留天数,该天数之前的记录会自动清理,单位天,0表示不自动清理 +task_save=0 +# 任务执行超时时间,单位小时。一定要设置长一点,以免要备份的东西太多 +task_timeout=72 +``` -修改环境变量需重启docker才能生效 +在非docker下,上边的文件将自动创建 -| 变量名 | 描述 | 默认值 | -| ---------------- | ------------------------------------------------------------ | ------------- | -| TAO_EXPIRES | 登录有效期,单位天 | 2 | -| TAO_LOG_LEVEL | 日志等级:0-DEBUG,1-INFO,2-WARNING,3-ERROR,4-CRITICAL;数值越大,产生的日志越少,推荐1或2 | 1 | -| TAO_LOG_SAVE | 系统日志保留天数,该天数之前的日志会自动清理,单位天,0表示不自动清理 | 7 | -| TAO_TASK_SAVE | 任务记录保留天数,该天数之前的记录会自动清理,单位天,0表示不自动清理 | 0 | -| TAO_TASK_TIMEOUT | 任务执行超时时间,单位小时。一定要设置长一点,以免要备份的东西太多 | 72 | -| TZ | 时区 | Asia/Shanghai | +| config.ini | Docker环境变量 | 描述 | 默认值 | +| ------------ | ---------------- | ------------------------------------------------------------ | ------------- | +| port | TAO_PORT | 运行端口号 | 8023 | +| expires | TAO_EXPIRES | 登录有效期,单位天 | 2 | +| log_level | TAO_LOG_LEVEL | 日志等级:0-DEBUG,1-INFO,2-WARNING,3-ERROR,4-CRITICAL;数值越大,产生的日志越少,推荐1或2 | 1 | +| log_save | TAO_LOG_SAVE | 系统日志保留天数,该天数之前的日志会自动清理,单位天,0表示不自动清理 | 7 | +| task_save | TAO_TASK_SAVE | 任务记录保留天数,该天数之前的记录会自动清理,单位天,0表示不自动清理 | 0 | +| task_timeout | TAO_TASK_TIMEOUT | 任务执行超时时间,单位小时。一定要设置长一点,以免要备份的东西太多 | 72 | +| - | TZ | 时区 | Asia/Shanghai | ## 页面截图 @@ -114,7 +167,7 @@ docker run -d --restart=always -p 8023:8023 -v /opt/data:/app/data --name=taoSyn -# 更新记录 +# 更新记录(0.2.2之后记录在Release页面) 如想体验研发中的版本,可以尝试到[DockerHub](https://hub.docker.com/r/dr34m/tao-sync)找最新的含`dev`或`pre`的tag,例如`v0.1.0-dev-build0` @@ -131,24 +184,8 @@ docker run -d --restart=always -p 8023:8023 -v /opt/data:/app/data --name=taoSyn * [ ] 任务整体进度条展示(目前只能展示每个文件的进度条) * [ ] 多语言支持 -### 0.2.2(即将发布) - -* [x] 支持cron方式定时执行 -* [x] 修复日志文件不自动删除的问题 -* [x] 支持打包构建以下平台可执行程序 - * windows-amd64 - * darwin-amd64 - * darwin-arm64 - * linux-amd64 - * linux-arm64 - * linux-386 - * linux-arm-v6 - * linux-arm-v7 - * linux-s390x - * linux-ppc64le -* [x] 通过[Github Actions](https://docs.github.com/zh/actions)自动发布Release -* [x] 使用矩阵多平台同步构建,加快速度 -* [x] 优化作业列表&任务详情的表格展示,不常用的内容采用展开的形式避免一行内容过多 +
+点击展开更多 ### 0.2.1.1(2024-08-12) @@ -179,10 +216,6 @@ docker run -d --restart=always -p 8023:8023 -v /opt/data:/app/data --name=taoSyn * [x] 执行失败的任务项支持查看原因 * [x] 执行成功的任务项自动删除AList中的任务记录 -
- -点击展开更多 - ### 0.1.4(2024-07-17) * 作业详情-增加【无需同步】、【扫描对比中】、【同步中】三种状态 diff --git a/common/commonService.py b/common/commonService.py index ef9263d..6a5a97e 100644 --- a/common/commonService.py +++ b/common/commonService.py @@ -5,7 +5,7 @@ from common.config import getConfig CONFIG = getConfig() -level_int = CONFIG['server']['logLevel'] +level_int = CONFIG['server']['log_level'] from common.LNG import G diff --git a/common/config.py b/common/config.py index d36a3b3..d78a406 100644 --- a/common/config.py +++ b/common/config.py @@ -1,3 +1,5 @@ +import configparser +import logging import os from common.commonUtils import generatePasswd, readOrSet @@ -20,18 +22,47 @@ def getPasswordStr(): def getConfig(): global sysConfig if sysConfig is None: + passwdStr = getPasswordStr() + dbname = 'data/taoSync.db' + sCfg = { + 'port': 8023, + 'expires': 2, + 'log_level': 1, + 'log_save': 7, + 'task_save': 0, + 'timeout': 72 + } + if os.path.exists('data/config.ini'): + try: + cfg = configparser.ConfigParser() + cfg.read('data/config.ini', encoding='utf8') + tao = cfg['tao'] + for keyItem in sCfg.keys(): + if keyItem in tao: + sCfg[keyItem] = int(tao[keyItem]) + except Exception as e: + logger = logging.getLogger() + logger.error(f"配置文件读取失败,将使用默认配置_/_config.ini read error: {e}") + logger.exception(e) + else: + try: + sCfg['port'] = int(os.getenv('TAO_PORT', 8023)) + sCfg['expires'] = int(os.getenv('TAO_EXPIRES', 2)) + sCfg['log_level'] = int(os.getenv('TAO_LOG_LEVEL', 1)) + sCfg['log_save'] = int(os.getenv('TAO_LOG_SAVE', 7)) + sCfg['task_save'] = int(os.getenv('TAO_TASK_SAVE', 0)) + sCfg['timeout'] = int(os.getenv('TAO_TASK_TIMEOUT', 72)) + except Exception as e: + logger = logging.getLogger() + logger.error(f"环境变量读取失败,将使用默认配置_/_ENV read error: {e}") + logger.exception(e) sysConfig = { 'db': { - 'dbname': 'data/taoSync.db' + 'dbname': dbname }, 'server': { - 'port': int(os.getenv('TAO_PORT', 8023)), - 'passwdStr': getPasswordStr(), - 'cookieExpiresDays': int(os.getenv('TAO_EXPIRES', 2)), - 'logLevel': int(os.getenv('TAO_LOG_LEVEL', 1)), - 'logSave': int(os.getenv('TAO_LOG_SAVE', 7)), - 'taskSave': int(os.getenv('TAO_TASK_SAVE', 0)), - 'timeout': int(os.getenv('TAO_TASK_TIMEOUT', 72)) + 'passwdStr': passwdStr, + **sCfg } } return sysConfig diff --git a/controller/systemController.py b/controller/systemController.py index 1f04a8b..1951657 100644 --- a/controller/systemController.py +++ b/controller/systemController.py @@ -14,7 +14,7 @@ class Login(BaseHandler): def post(self, req): user = userService.checkPwd(None, req['passwd'], req['userName']) self.set_signed_cookie(cookieName, json.dumps(user), - expires_days=int(server['cookieExpiresDays'])) + expires_days=server['expires']) userReturn = user.copy() del userReturn['passwd'] del userReturn['sqlVersion'] diff --git a/doc/changelog/v0.2.2.md b/doc/changelog/v0.2.2.md index 3b21520..e9fbfbc 100644 --- a/doc/changelog/v0.2.2.md +++ b/doc/changelog/v0.2.2.md @@ -13,12 +13,13 @@ * linux-s390x * linux-ppc64le * 支持通过[Github Actions](https://docs.github.com/zh/actions)自动发布Release -* Docker增加时区配置环境变量TZ,默认值为Asia/Shanghai +* 支持通过文件来修改配置 ## 🎨 优化 * 使用矩阵多平台同步构建,加快速度 * 优化作业列表&任务详情的表格展示,不常用的内容采用展开的形式避免一行内容过多 +* Docker增加时区配置环境变量TZ,默认值为Asia/Shanghai ## 🐞 修复 diff --git a/doc/config.ini b/doc/config.ini new file mode 100644 index 0000000..fff83a4 --- /dev/null +++ b/doc/config.ini @@ -0,0 +1,13 @@ +[tao] +# 运行端口号 +port=8023 +# 登录有效期,单位天 +expires=2 +# 日志等级:0-DEBUG,1-INFO,2-WARNING,3-ERROR,4-CRITICAL;数值越大,产生的日志越少,推荐1或2 +log_level=1 +# 系统日志保留天数,该天数之前的日志会自动清理,单位天,0表示不自动清理 +log_save=7 +# 任务记录保留天数,该天数之前的记录会自动清理,单位天,0表示不自动清理 +task_save=0 +# 任务执行超时时间,单位小时。一定要设置长一点,以免要备份的东西太多 +task_timeout=72 \ No newline at end of file diff --git a/main.py b/main.py index c95af55..faf0168 100644 --- a/main.py +++ b/main.py @@ -33,7 +33,7 @@ async def main(): app = make_app() logger = logging.getLogger() app.listen(server['port']) - successMsg = f"启动成功_/_Running at http://0.0.0.0:{server['port']}/" + successMsg = f"启动成功_/_Running at http://127.0.0.1:{server['port']}/" print(successMsg, flush=True) logger.info(successMsg) await asyncio.Event().wait() diff --git a/service/system/logJobService.py b/service/system/logJobService.py index d7ee5d8..3858c67 100644 --- a/service/system/logJobService.py +++ b/service/system/logJobService.py @@ -15,8 +15,8 @@ from mapper.jobMapper import deleteJobTaskByRunTime CONFIG = getConfig() -logSave = CONFIG['server']['logSave'] -taskSave = CONFIG['server']['taskSave'] +logSave = CONFIG['server']['log_save'] +taskSave = CONFIG['server']['task_save'] def logClearJob(): diff --git a/version.txt b/version.txt index 7d88d2f..6b22191 100644 --- a/version.txt +++ b/version.txt @@ -1,4 +1,4 @@ -v0.2.2-pre-build1 +v0.2.2,latest 该文件仅第一行有效,表示打包的版本。 如果要打包多个,以英文,分隔,例如【v1.0.0,latest】;