跳转主页

备份pleroma记录

·2638 字·6 分钟
Pleroma Duplicacy
目录

关于我不止一次炸过站这回事告诫了备份的重要性。

熟悉官方文档

参考文档: 官方文档

根据官方文档的说明,熟悉相关的命令。

  1. 暂停运行实例
su pleroma -s $SHELL -lc "./bin/pleroma stop"
  1. 创建备份文件夹并写入权限
mkdir /pleroma_backup
chmod 777 /pleroma_backup
  1. 将pleroma_db的数据库转储为某种自定义格式并保存到【2】的路径下
sudo -Hu postgres pg_dump -d pleroma_db --format=custom -f /ple_backup/pleroma.pgdump
  1. 将服务器内相关文件下载至异地 1

相关文件(夹)目录

转储后的数据库文件:/ple_backup/pleroma.pgdump

上传文件夹: /var/lib/pleroma/uploads

静态目录(文件夹): /var/lib/pleroma/static

配置文件:/etc/pleroma/config.exs

可登录实例的Admin-FE管理台页面,静态目录路径在Settings-Instance-Static dir;上传目录在Settings-Upload-Pleroma.Uploaders.Local中核对确认。

也可使用find / -name <file name>在服务器中查询

  1. 重新启动pleroma服务
su pleroma -s $SHELL -lc "./bin/pleroma daemon"

备份至电脑(不推荐)

相关命令行

# 从远程服务器下载文件到本地
scp <用户名>@<ssh服务器地址>:<文件> <本地文件路径>

# 远程服务器下载文件夹到本地
scp -r <用户名>@<ssh服务器地址>:<文件夹名> <本地路径>

# 从本地上传文件到服务器上
scp <本地文件名> <用户名>@<ssh服务器地址>:<上传保存路径> 

# 从本地上传文件夹到服务器上
scp  -r <本地文件夹名> <用户名>@<ssh服务器地址>:<上传保存路径> 

本地定时备份

感谢 @梦猫鱼 写的 用duplicacy备份Pleroma 教程,给了我很大的帮助。

新建并进入本地备份文件夹

mkdir /opt/local_backup
cd /opt/local_backup

创建本地备份脚本

sudo vim backup.sh

粘贴

#!/bin/sh

source /etc/profile

echo "————————————backup to local directory——————————" | tee -a /opt/local_backup/backuplog.txt
echo  `date +"%Y-%m-%d %H:%M:%S"` "now starting backup" | tee -a /opt/local_backup/backuplog.txt

echo 'stop pleroma' | tee -a /opt/local_backup/backuplog.txt
sudo systemctl stop pleroma

echo "0.create a backup day directory" | tee -a /opt/local_backup/backuplog.txt

if [ -d /opt/local_backup/`date +%Y%m%d``date +%Y%m%d` ];then
    echo "Floder" `date +%Y%m%d` "already exists." 
else
    mkdir /opt/local_backup/`date +%Y%m%d`
    echo "New floder" `date +%Y%m%d`  | tee -a /opt/local_backup/backuplog.txt
fi
chmod +777 /opt/local_backup/`date +%Y%m%d`
cd /opt/local_backup/`date +%Y%m%d`

echo "1.dump database" | tee -a /opt/local_backup/backuplog.txt
sudo -Hu postgres pg_dump -d pleroma --format=custom -f /opt/local_backup/`date +%Y%m%d`/pleroma.pgdump
echo "2. copy upload & static folder" | tee -a /opt/local_backup/backuplog.txt
cp -r /var/lib/pleroma/static /opt/local_backup/`date +%Y%m%d`
cp -r /var/lib/pleroma/uploads /opt/local_backup/`date +%Y%m%d`
echo "3. copy config file" | tee -a /opt/local_backup/backuplog.txt
cp /etc/pleroma/config.exs /opt/local_backup/`date +%Y%m%d`

echo "restart pleroma" | tee -a /opt/local_backup/backuplog.txt
sudo systemctl start pleroma

echo `date +"%Y-%m-%d %H:%M:%S"` "finished" | tee -a /opt/local_backup/backuplog.txt
echo "Backup for" `date +%Y%m%d` "done!" | tee -a /opt/local_backup/backuplog.txt

备注

  • 大概思路是每次备份时,按日期创建子文件夹,把备份数据放在当日文件夹下
  • | tee -a filename 把输入数据同时打印在屏幕和指定文件上;这里我是在每行echo后加上了,应该有更便捷的命令,我没再查了。不需要可以删去。 后续需要查看备份记录,可直接进入backuplog.txt查看
  • chmod 777 $BACKUP_DATA 不加这个总是报没有权限的错误2,暂时没找到好的解决方法。
  1. 另外新建了clear.sh脚本,用来删除超过15天的备份文件夹
find /opt/local_backup/ -type d -mtime +15 -exec rm -rf {} \;

手动跑的话,在脚本的存放目录运行 sudo bash xxxx.sh 。当然也可以用crontab执行定时任务。

  1. 设置定时任务
sudo crontab -e

粘贴

# 每周五3点运行备份脚本
00 03 * * 5 root /bin/bash /opt/local_backup/backup.sh   

# 每月一号21点运行清除备份脚本
00 21 1 * * root /bin/bash /opt/local_backup/clear.sh

异地备份

异地备份参考的是这篇: Duplicacy CLI 备份工具基本使用笔记

安装expect

sudo apt-get install tcl tk expect

Duplicacy工具

安装Duplicacy CLI

sudo wget -O /opt/duplicacy https://github.com/gilbertchen/duplicacy/releases/download/v3.0.1/duplicacy_linux_x64_3.0.1

给予权限

sudo chmod +x /opt/duplicacy

创建软连接

sudo ln -s /opt/duplicacy /usr/local/bin/duplicacy

验证安装是否成功

duplicacy -h

注册OneDrive Personal,获取 访问令牌文件one-token.json,将文件放置/opt/remote_bakup/.duplicacy目录下

初始化duplicacy仓库(注意使用目录

sudo duplicacy init -e pleroma one://pleroma
Enter the path of the OneDrive token file (downloadable from https://duplicacy.com/one_start):
password for one:
  • 需输入one-token.json的路径.duplicacy/one-token.json
  • -e 代表加密,输入密码: ********

备份同步

duplicacy backup -stats -threads 4
  • 将仓库所在目录下的文件夹备份至OneDrive中
  • 同样需要输入访问令牌文件路径及密码

写成脚本

把备份同步写成脚本,方便一键运行。

sudo nano dup.exp

粘贴

#!/usr/bin/expect -f

set TIME [ clock format [ clock seconds ] -format "%Y-%m-%d %H:%M:%S" ]
send_user "$TIME\n\r"

set TOKEN_FILE_PATH ".duplicacy/one-token.json"
set PASSWORD "********"

cd /opt/remote_backup

set timeout -1
spawn duplicacy backup -stats -threads 4

expect "path"
send "$TOKEN_FILE_PATH\r"

expect "password"
send "$PASSWORD\r"

##### (optional) Keep a revision every 7 days for revisions older than 30 d>
# expect "completed"
# spawn duplicacy prune -keep 7:30

# expect "the OneDrive token file"
# send "$TOKEN_FILE_PATH\r"

# expect "password"
# send "$PASSWORD\r"

expect eof
  • /r指回车

  • #!/usr/bin/expectEOF中的内容全部写入指定文件3:

    #!/usr/bin/expect -f<<-EOF
    log_file backup.log
    
  • 因为想在expect脚本运行时也能把日期写入4

    set TIME [ clock format [ clock seconds ] -format "%Y%m%d%H%M%S" ]
    send_user "$TIME\n\r"
    

给运行权限

chmod +x dup.exp

expect dup.exp 尝试运行,无问题后,在备份脚本中加入运行指令

remote_backup.sh

#!/bin/sh

source /etc/profile

exec >> /opt/remote_backup/backup.log 2>&1

echo "————————————————————————backup to remote———————————————————————"
echo  `date +"%Y-%m-%d %H:%M:%S"` "now starting local_backup"

echo 'stop pleroma'
sudo systemctl stop pleroma

echo "1.dump database"
chmod 777 /opt/remote_backup
sudo -Hu postgres pg_dump -d pleroma --format=custom -f /opt/remote_backup/pleroma.pgdump
echo "2. copy upload & static folder"
cp -r /var/lib/pleroma/static /opt/remote_backup/
cp -r /var/lib/pleroma/uploads /opt/remote_backup/
echo "3. copy config file"
cp /etc/pleroma/config.exs /opt/remote_backup/

echo `date +"%Y-%m-%d %H:%M:%S"` "finished local backups and start to remote backups"

/usr/bin/expect /opt/remote_backup/dup.exp

echo "restart pleroma"
sudo systemctl start pleroma

echo `date +"%Y-%m-%d %H:%M:%S"` "DONE"

其中也优化了一下输出重定向:

exec >> /opt/remote_backup/backup.log 2>&1 将标准错误输出、标准输出重定向到指定文件中

Crontab定时命令

在crontab中加入命令,定时跑remote_backup.sh

# 每周四20点
0 20 * * 4 root /etc/profile;/bin/sh /opt/remote_backup/remote_backup.sh

总结

先把pleroma相关文件备份至本地服务器某文件夹内,再用Duplicacy传至异地存储服务中。

论我为什么一身泥

这里踩了一个(后来发现是很多个)巨坑坑啊!

  1. 怪不得我的定时任务跑不动 · 之一

    怪不得我的定时任务跑不动

解决方法就是把exp脚本放进bash脚本中,再通过crontab跑bash脚本……

  1. 怪不得我的定时任务跑不动 · 之二

脚本手动执行成功,但一用cron就提示找不到duplicacy

couldn't execute "duplicacy": no such file or directory
 while executing

解决方法:which duplicacy,找到路径/usr/local/bin/duplicacy后,要么在执行duplicacy命令的脚本里,写全路径/usr/local/bin/duplicacy backup -stats -threads 4; 要么就去搞环境变量。5

  1. 怪不得我的定时任务跑不动 · 之环境变量

​谢谢,再见!

再 也 不 见 !!!


  1. 参考文档:https://zhuanlan.zhihu.com/p/370213294 ↩︎

  2. 报错: pg_dump: error: could not open output file “目录略”: Permission denied ↩︎

  3. 参考文档: Expect脚本ssh远程实行命令并将回显保存为日志文件 ↩︎

  4. expect 获取日期 ↩︎

  5. crontab执行有关duplicacy备份脚本报错 ↩︎



最后更新于: 2023 年 2 月 12 日