Сегодня будем настраивать резервное копирование Seafile 11 в облако Mail.Ru через WebDAV.
У нас имеется:
- Seafile 11 на сервере с операционной системой Ubuntu Server 22.04.
- В качестве БД используем MariaDB 10.6 на том же сервере.
- Seafile запускается под отдельным пользователем как службы.
- Nginx.
Установка Seafile 11 на Ubuntu 22
Ранее уже была статья про резервное копирование:
Seafile — резервное копирование
Далее будет модифицированная версия.
Подготовка облака
Создаём директорию /backup и настраиваем её для монтирования облака Mail.Ru через WebDAV. Процедура не сложная, но требует подготовки. Для удобства все действия вынесены в отдельную статью.
Подключаем Облако Mail.Ru через WebDAV в Linux
В самом облаке подготавливаем структуру директорий для резервного копирования. При монтировании облачной папки у нас должны быть директории:
- /backup/seafile/databases/
- /backup/seafile/databases/archive/
- /backup/seafile/seafile-data/
- /backup/seafile/seahub-data/
- /backup/seafile/conf/
Скрипт для резервного копирования
На эту тему имеется официальный мануал:
https://manual.seafile.com/maintain/backup_recovery/
В документе говорится о том, что бэкапить нужно две вещи:
- Базы данных
- Файлы данных
Процесс резервного копирования прост:
- Останавливаем SeaFile.
- Бэкапим БД.
- Бэкапим файлы.
- Запускаем SeaFile
На время резервного копирования Seafile недоступен пользователям.
Бэкапить файлы будем с помощью rsync:
apt-get install rsync
Взгляд зацепился за то, что для начала резервного копирования необходима остановка SeaFile. Но нам дополнительно требуется останавливать его для удаления мусора. Воспользуемся этим, настроим в том же скрипте сборку мусора:
Seafile — garbage collection (GC)
Создаем скрипт для резервного копирования: seafile.mnt.sh.
cd /opt/seafile/
mkdir cron
./cron
touch seafile.mnt.sh
chmod 744 ./seafile.mnt.sh
seafile.mnt.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/seafile/databases/"
DBARCHDIR="/backup/seafile/databases/archive/"
DBCCNET="seafile-ccnet"
DBSEAFILE="seafile-db"
DBSEAHUB="seafile-seahub"
DATASEAFILEBACKUPDIR="/backup/seafile/seafile-data/"
DATASEAFILEDIR="/opt/seafile/seafile-data/"
DATASEAHUBBACKUPDIR="/backup/seafile/seahub-data/"
DATASEAHUBDIR="/opt/seafile/seahub-data/"
DATACONFBACKUPDIR="/backup/seafile/conf/"
DATACONFDIR="/opt/seafile/conf/"
TEMPDIR="/tmp/sf/"
log(){
message="$(date +"%y-%m-%d %T") $@"
echo $message
}
# stop the services
log "------------------------------------------"
log "Starting maintenance procedure for seafile"
log "Stopping the services"
systemctl stop nginx.service
systemctl stop seafile.service
systemctl stop seahub.service
log "Giving the server some time to shut down properly"
sleep 10
# run the cleanup
log "Seafile cleanup started"
sudo -u sf /opt/seafile/seafile-server-latest/seaf-gc.sh -r
sudo -u sf /opt/seafile/seafile-server-latest/seaf-gc.sh
log "Seafile cleanup done!"
log "Giving the server some time"
sleep 10
# mount cloud folder
log "Mount cloud folder"
mount /backup
# create temp dir
rm -rf ${TEMPDIR}
mkdir ${TEMPDIR}
# backup databases
log "Starting databases backup"
rm ${DBARCHDIR}*.bz2
mv ${DBBACKUPDIR}*.bz2 ${DBARCHDIR}
# backup DB
log "DB $DBCCNET"
DBDATE=`date +"%Y-%m-%d-%H-%M-%S"`
mysqldump -h ${DBHOST} -u${DBUSER} -p${DBPASSWORD} --protocol=${DBPROT} --port=${DBPORT} --opt ${DBCCNET} > ${TEMPDIR}${DBCCNET}.sql.${DBDATE}
bzip2 ${TEMPDIR}${DBCCNET}.sql.${DBDATE}
mv ${TEMPDIR}${DBCCNET}.sql.${DBDATE}.bz2 ${DBBACKUPDIR}
log "DB $DBSEAFILE"
DBDATE=`date +"%Y-%m-%d-%H-%M-%S"`
mysqldump -h ${DBHOST} -u${DBUSER} -p${DBPASSWORD} --protocol=${DBPROT} --port=${DBPORT} --opt ${DBSEAFILE} > ${TEMPDIR}${DBSEAFILE}.sql.${DBDATE}
bzip2 ${TEMPDIR}${DBSEAFILE}.sql.${DBDATE}
mv ${TEMPDIR}${DBSEAFILE}.sql.${DBDATE}.bz2 ${DBBACKUPDIR}
log "DB $DBSEAHUB"
DBDATE=`date +"%Y-%m-%d-%H-%M-%S"`
mysqldump -h ${DBHOST} -u${DBUSER} -p${DBPASSWORD} --protocol=${DBPROT} --port=${DBPORT} --opt ${DBSEAHUB} > ${TEMPDIR}${DBSEAHUB}.sql.${DBDATE}
bzip2 ${TEMPDIR}${DBSEAHUB}.sql.${DBDATE}
mv ${TEMPDIR}${DBSEAHUB}.sql.${DBDATE}.bz2 ${DBBACKUPDIR}
# backup data
log "Starting data backup"
rsync -az --delete ${DATASEAFILEDIR} ${DATASEAFILEBACKUPDIR}
rsync -az --delete ${DATASEAHUBDIR} ${DATASEAHUBBACKUPDIR}
rsync -az --delete ${DATACONFDIR} ${DATACONFBACKUPDIR}
# remove temp dir
rm -rf ${TEMPDIR}
# unmount cloud folder
log "Unmount cloud folder"
umount /backup
# start the services
log "Starting the Seafile-Server"
systemctl start seafile.service
systemctl start seahub.service
systemctl start nginx.service
log "Seafile maintenance procedure complete!"
Здесь:
- DBUSER — пользователь БД.
- DBPASSWORD — пароль пользователя БД.
- DBHOST — сервер БД, у меня localhost
- DBPORT — порт БД.
- DBPROT — протокол БД.
- DBBACKUPDIR — путь куда бэкапить БД
- DBARCHDIR — путь куда сохранять предыдущий бэкап БД (на всякий случай)
- DBCCNET — имя базы cnet.
- DBSEAFILE — имя базы seafile.
- DBSEAHUB — имя базы seahub.
- DATASEAFILEBACKUPDIR — путь куда бэкапить файлы из папки seafile-data.
- DATASEAFILEDIR — путь откуда бэкапить файлы из папки seafile-data.
- DATASEAHUBBACKUPDIR — путь куда бэкапить файлы из папки seafile-data.
- DATASEAHUBDIR — путь откуда бэкапить файлы из папки seafile-data.
- DATASEAFILEBACKUPDIR — путь куда бэкапить файлы из папки seahub-data.
- DATASEAFILEDIR — путь откуда бэкапить файлы из папки seahub-data.
- DATACONFBACKUPDIR — путь куда бэкапить файлы из папки conf.
- DATACONFDIR — путь откуда бэкапить файлы из папки conf.
- TEMPDIR — временная директория для архивов.
Для резервирования БД используем 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
Я удаляю из архивной копии более несуществующие файлы, хотя в документации нет такой рекомендации.
Папку из облака Mail.Ru подключаем и отключаем командами:
mount /backup
umount /backup
Пробуем выполнить скрипт, работать он должен под рутом.
Всё забэкапилось в облако Mail.Ru.
Расписание резервного копирования
Осталось настроить расписание.
Cron — планировщик заданий в Linux
crontab -e
Добавляем настройку:
0 4 * * Mon /opt/seafile/cron/seafile.mnt.sh > /opt/seafile/logs/cron.log
Пусть у нас резервная копия делается по понедельникам в 4 утра.
service cron restart
И файл лога создадим.
touch /opt/seafile/logs/cron.log