Перейти к основному содержанию
 

Seafile — резервное копирование

Seafile

Итак, вы установили и настроили Seafile.

Seafile 7.1.1 — установка на Ubuntu 18.04 LTS

Пришла пора задуматься о резервном копировании. На эту тему имеется официальный мануал:

https://download.seafile.com/published/seafile-manual/maintain/backup_recovery.md

В документе говорится о том, что бэкапить нужно две вещи:

  • Базы данных
  • Файлы данных

Процесс резервного копирования по идее прост:

  1. Останавливаем Seafile.
  2. Бэкапим БД.
  3. Бэкапим файлы.

На время резервного копирования 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

Я удаляю из архивной копии более несуществующие файлы, хотя в документации нет такой рекомендации.