Итак, вы установили и настроили Seafile.
Seafile 7.1.1 — установка на Ubuntu 18.04 LTS
Пришла пора задуматься о резервном копировании. На эту тему имеется официальный мануал:
https://download.seafile.com/published/seafile-manual/maintain/backup_recovery.md
В документе говорится о том, что бэкапить нужно две вещи:
- Базы данных
- Файлы данных
Процесс резервного копирования по идее прост:
- Останавливаем Seafile.
- Бэкапим БД.
- Бэкапим файлы.
На время резервного копирования Seafile недоступен пользователям.
Есть альтернативные способы резервирования. Если у вас Seafile находится на виртуальной машине, то имеет смысл рассмотреть резервирование виртуалки целиком. Такой способ не потребует остановки виртуальной машины.
Настройка резервного копирования
Создадим директорию для хранения резервных копий, Я по SMB монтирую шару в /backup. Резервные копии баз данных будут храниться в /backup/databases/. Резервная копия файлов данных будет храниться в /backup/data/. БД у меня MySQL 8.
Бэкапить файлы будем с помощью rsync:
apt-get install rsync
Взгляд зацепился за то, что для начала резервного копирования необходима остановка Seafile. Но мы уже и так периодически останавливаем его для удаления мусора. Воспользуемся этим, настроим сборку мусора:
Seafile — garbage collection (GC)
Весь код сборщика мусора сосредоточен в файле cleanupScript.sh. Модифицируем скрипт так, чтобы после очистки от мусора запускалась процедура резервного копирования:
#!/bin/bash
#####
# Uncomment the following line if you rather want to run the script manually.
# Display usage if the script is not run as root user
# if [[ $USER != "root" ]]; then
# echo "This script must be run as root user!"
# exit 1
# fi
#
# echo "Super User detected!!"
# read -p "Press [ENTER] to start the procedure, this will stop the seafile server!!"
#####
DBUSER="seafile"
DBPASSWORD="пароль"
DBHOST="localhost"
DBPORT="3306"
DBPROT="tcp"
DBBACKUPDIR="/backup/databases/"
DBARCHDIR="/backup/databases/archive/"
DBCCNET="seafile-ccnet"
DBSEAFILE="seafile-db"
DBSEAHUB="seafile-seahub"
DATABACKUPDIR="/backup/data/"
DATADIR="/u01/seafile/seafile-data/"
log(){
message="$(date +"%y-%m-%d %T") $@"
echo $message
}
# stop the server
log "------------------------------------------"
log "Starting maintenance procedure for seafile"
log "Stopping the seafile-server"
systemctl stop seafile.service
systemctl stop seahub.service
log "Giving the server some time to shut down properly"
sleep 20
# run the cleanup
log "Seafile cleanup started"
sudo -u sf /u01/seafile/seafile-server-latest/seaf-gc.sh -r
sudo -u sf /u01/seafile/seafile-server-latest/seaf-gc.sh
log "Seafile cleanup done!"
log "Giving the server some time"
sleep 10
# backup databases
log "Starting databases backup"
rm ${DBARCHDIR}*.bz2
mv ${DBBACKUPDIR}*.bz2 ${DBARCHDIR}
DBDATE=`date +"%Y-%m-%d-%H-%M-%S"`
mysqldump -h ${DBHOST} -u${DBUSER} -p${DBPASSWORD} --protocol=${DBPROT} --port=${DBPORT} --opt ${DBCCNET} > ${DBBACKUPDIR}${DBCCNET}.sql.${DBDATE}
bzip2 ${DBBACKUPDIR}${DBCCNET}.sql.${DBDATE}
DBDATE=`date +"%Y-%m-%d-%H-%M-%S"`
mysqldump -h ${DBHOST} -u${DBUSER} -p${DBPASSWORD} --protocol=${DBPROT} --port=${DBPORT} --opt ${DBSEAFILE} > ${DBBACKUPDIR}${DBSEAFILE}.sql.${DBDATE}
bzip2 ${DBBACKUPDIR}${DBSEAFILE}.sql.${DBDATE}
DBDATE=`date +"%Y-%m-%d-%H-%M-%S"`
mysqldump -h ${DBHOST} -u${DBUSER} -p${DBPASSWORD} --protocol=${DBPROT} --port=${DBPORT} --opt ${DBSEAHUB} > ${DBBACKUPDIR}${DBSEAHUB}.sql.${DBDATE}
bzip2 ${DBBACKUPDIR}${DBSEAHUB}.sql.${DBDATE}
# backup data
log "Starting data backup"
rsync -az --delete ${DATADIR} ${DATABACKUPDIR}
# start the server again
log "Starting the Seafile-Server"
systemctl start seafile.service
systemctl start seahub.service
log "Seafile maintenance procedure complete!"
Здесь:
- DBUSER — пользователь БД.
- DBPASSWORD — пароль пользователя БД.
- DBHOST — сервер БД, у меня localhost
- DBPORT — порт БД.
- DBPROT — протокол БД.
- DBBACKUPDIR — путь куда бэкапить БД
- DBARCHDIR — путь куда сохранять предыдущий бэкап БД (на всякий случай)
- DBCCNET — имя базы cnet.
- DBSEAFILE — имя базы seafile.
- DBSEAHUB — имя базы seahub.
- DATABACKUPDIR — путь куда бэкапить файлы.
- DATADIR — путь откуда бэкапить файлы.
Для резервирования БД используем mysqldump:
mysqldump -h ${DBHOST} -u${DBUSER} -p${DBPASSWORD} --protocol=${DBPROT} --port=${DBPORT} --opt ${DBCCNET} > ${DBBACKUPDIR}${DBCCNET}.sql.${DBDATE}
Бэкап сжимаем с помощью bzip:
bzip2 ${DBBACKUPDIR}${DBCCNET}.sql.${DBDATE}
Файлы бэкапим с помощью rsync:
rsync -az --delete ${DATADIR} ${DATABACKUPDIR}
-
-a, --archive — archive mode; equals -rlptgoD (no -H,-A,-X)
-
-z, --compress — compress file data during the transfer
-
--delete — delete extraneous files from dest dirs
Я удаляю из архивной копии более несуществующие файлы, хотя в документации нет такой рекомендации.