Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Closed
GC-ZF opened this issue Aug 8, 2022 · 0 comments
Closed

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

GC-ZF opened this issue Aug 8, 2022 · 0 comments
Labels

Comments

@GC-ZF
Copy link

GC-ZF commented Aug 8, 2022

问题背景

最近我在十年之约大群中,不少群友博客被刷评论,少则几百条多则上千条,应该是用了什么脚本,且都是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前面那张图片一样,在后台审核中可以一键删除未审核的评论

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

2 participants