twikoojs/twikoo

建议:定时备份,写给需要的朋友

GC-ZF opened this issue · 0 comments

GC-ZF commented

问题背景

最近我在十年之约大群中,不少群友博客被刷评论,少则几百条多则上千条,应该是用了什么脚本,且都是typecho驱动
image

解决办法

通过作者完善评论系统是肯定无法实现的,文件需要我们自己去备份

我第一次建站,毫无经验,所以从未考虑过备份评论,提供两种备份方案,写给和我一样的小白站长

宝塔可以直接对站点备份,但评论备份无法实现,服务器自带python环境,所以我做了一个python代码,利用crontab -e或宝塔面板中的计划任务定时备份,在目录下backuplog.txt会记录每一次备份日志

Vercel部署备份方案

下载MongoDB工具,放到服务器里解压
image

Vercel部署,将代码存放在MongoDB 数据库工具同级路径下,按需修改30行(清理备份,delete_day)、35行(Vercel部署中的MONGODB_URI去掉问号之后的东西)

import os
from datetime import datetime
import sys


class Logger ( object ):
    def __init__(self, fileN="Default.log"):
        self.terminal = sys.stdout
        self.log = open ( fileN, "a" )

    def write(self, message):
        self.terminal.write ( message )
        self.log.write ( message )

    def flush(self):
        pass


sys.stdout = Logger ( "backuplog.txt" )  # 输出日志
print ( "--------------------------------------------------------------\n" )
now_time = datetime.now ()  # 当前时间
now_time_day = now_time.day  # 日
data = f"{now_time.year}{now_time.month}{now_time.day}日"
delete_day = [ 15, 30 ]  # 每月15、30号清空备份
if now_time_day in delete_day:
    os.system ( 'rm *.json -f' )  # 删除所有json
    print ( data + " 清空备份文件" )
    # os.system ( 'rm backuplog.txt.txt -f' )     # 删除日志
MONGODB_URI = 'mongodb+srv://xxx:xxx@xxxxxxx/myFirstDatabase'
commond = 'mongoexport --uri ' + f'{MONGODB_URI}' + ' --collection comment --forceTableScan --type json --out ' + f"{now_time.year}{now_time.month}{now_time.day}日.json"
code = os.system ( commond )
if code == 0:
    print ( data + " 备份成功" )
else:
    print ( data + " 备份失败,请检查python文件中MONGODB_URI值是否正确" )
print ()
# Vercel部署日志文件示例
--------------------------------------------------------------

2022年8月8日 备份失败,请检查python文件中MONGODB_URI值是否正确

--------------------------------------------------------------

2022年8月8日 备份成功

私有部署备份方案

私有部署,代码存放位置任意,修改30行(清理备份delete_day)、35行(原始路径init_path)、36行(备份路径backup_path),都用绝对路径,但不要与私有部署在相同路径下,因为定时清理会清掉所有json文件

import os
from datetime import datetime
import sys


class Logger ( object ):
    def __init__(self, fileN="Default.log"):
        self.terminal = sys.stdout
        self.log = open ( fileN, "a" )

    def write(self, message):
        self.terminal.write ( message )
        self.log.write ( message )

    def flush(self):
        pass


sys.stdout = Logger ( "backuplog.txt" )  # 输出日志
print ( "--------------------------------------------------------------\n" )
now_time = datetime.now ()  # 当前时间
now_time_day = now_time.day  # 日
data = f"{now_time.year}{now_time.month}{now_time.day}日"
delete_day = [ 15, 30 ]  # 每月15、30号清空备份
if now_time_day in delete_day:
    os.system ( 'rm *.json -f' )  # 删除所有json
    print ( data + " 清空备份文件" )
    # os.system ( 'rm backuplog.txt.txt -f' )     # 删除日志
init_path='/xxxxx/bin/db.json.1'
backup_path='/xxxxx/bin/backup/'
init_path='"'+init_path+'"'
backup_path='"'+backup_path+f"/{now_time.year}{now_time.month}{now_time.day}日.json"+'"'
commond = 'cp '+init_path+" "+backup_path
code = os.system ( commond )
if code == 0:
    print ( data + " 备份成功" )
else:
    print ( data + " 备份失败,请检查python文件中init_path和backup_path是否正确或备份路径是否有读写权限" )
print ()
# 私有部署日志文件示例
--------------------------------------------------------------

2022年8月8日 备份成功

--------------------------------------------------------------

2022年8月8日 备份失败,请检查python文件中init_path和backup_path是否正确或备份路径是否有读写权限

定时运行

立即导出可以在shell窗口中运行python3 文件名,定时运行方法很多,crontab -e、宝塔计划任务、workflow...

宝塔计划任务

此方法适合有服务器的人,以宝塔计划任务为例,定时Shell脚本示例,cd后跟py文件的绝对路径

cd /xxx/twikoo/mongodb/bin
python3 backup.py

workflow

此方法适合无服务器的人,如果你会工作流,可以将Action中的文件作为一个私有仓库(py中有密码所以不要做公有),将修改好的MongoDB.pyPrivate.py放入仓库,修改backup.yml中30行为你的py文件名字,修改38、39、41行(如果你不会用git,可以不改,这项意义不大),之后该仓库会每天自动备份一次评论数据

目录结构示例:

│  MongoDB.py
│  mongoimport.exe
│
└─.github
    └─workflows
            backup.yml

附我的仓库,Action文件夹仓库内自取,仓库里代码可以显示行数,方便一些

额外建议

额外建议,因为我对JavaScript不熟悉,不知道技术上能否实现。通过第三方验证网站添加验证码(其实有点鸡肋,想刷的人还是会手动刷),或者像typecho前面那张图片一样,在后台审核中可以一键删除未审核的评论