Пост

Установка и настройка rclone. Бэкапирование в s3 или cloud.mail.ru

Rclone - это свободное программное обеспечение для синхронизации и копирования файлов между различными хранилищами и устройствами. Оно позволяет создавать и управлять remote-репозиториями на различных типах хранилищ, включая Amazon S3, Google Drive, Microsoft OneDrive, Dropbox и многие другие.

В связи с тем, что Яндекс закручивает гайки в своих сервисах, из-за чего наблюдаются перебои с Яндекс Диском, точнее с протоколом webdav, который я использовал для хранения бэкапа сайта, пришлось искать другие варианты. Выбор пал на программу rclone и хранилище от mail.ru.

Установка rclone

Скачиваем rclone и распаковываем его

1
2
3
$ curl -O https://downloads.rclone.org/rclone-current-linux-amd64.zip
$ unzip rclone-current-linux-amd64.zip
$ cd rclone-v1.50.2-linux-amd64/

Меняем расположение исполняемого файла и настраиваем права

1
2
3
$ sudo cp rclone /usr/sbin/
$ sudo chown root:root /usr/sbin/rclone
$ sudo chmod 755 /usr/sbin/rclone

Устанавливаем мануал для rclone

1
2
3
$ sudo mkdir -p /usr/local/share/man/man1
$ sudo cp rclone.1 /usr/local/share/man/man1/
$ sudo mandb

На этом установка окончена

Обновление rclone

Удаляем версию, установленную из архива

1
$ sudo rm /usr/sbin/rclone

Скачиваем новую версию и устанавлваем ее

1
2
$ wget https://downloads.rclone.org/v1.53.2/rclone-v1.53.2-linux-amd64.rpm
$ sudo yum -y localinstall rclone-v1.53.2-linux-amd64.rpm

Конфигурирование rclone под s3 от mail.ru

Для начала необходимо зарегистрироваться на портале mcs.mail.ru. Создать аккаунт в объектном хранилище, где будет сгенерирован Access Key ID и Secret Key. Эти данные необходимо сохранить.
Затем надо создать Бакет - логическая сущность, которая помогает организовать хранение объектов (т.е. грубо говоря каталог, где будут лежать наши файлы).

Запускаем команду для создания конфигурации под хранилище

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
$ rclone config
n/s/q> n

# Укажите имя подключения к удаленному хранилищу
name> mailru-s3
...
4 / Amazon S3 Compliant Storage Provider
...

# Выберите тип хранилища, указываем s3:
Storage> 4
...
10 / Any other S3 compatible provider
...

# Выберите поставщика услуг, указываем Other:
provider> 10

# Выберите тип ввода учетных данных (вручную или из переменных окружения)
# Для ввода данных вручную укажите false:
env_auth> 1

# Вводим Access Key ID
access_key_id> ...

# Вводим Secret Key
secret_access_key> ...

# Вводим регион, я указал 1
region> 1

# Вводим Endpoint Можно узнать на портале: mcs.mail.ru - объектное хранилище
endpoint> hb.bizmrg.com

# Укажите регион создания бакета
# оставьте поле пустым и нажмите Enter:
location_constraint>

# Установите права доступа ACL, private:
acl> 1

# После этого можно отказаться от расширенной конфигурации:
Edit advanced config? (y/n)
y) Yes
n) No
y/n> n

Далее отобразиться конфигурация, которую мы создали, сохраняем ее и выходим

1
2
3
4
5
6
7
8
9
10
11
12
13
y) Yes this is OK
e) Edit this remote
d) Delete this remote
y/e/d> y

e) Edit existing remote
n) New remote
d) Delete remote
r) Rename remote
c) Copy remote
s) Set configuration password
q) Quit config
e/n/d/r/c/s/q> q

Команды для работы с хранилищем

Список команд и поддерживаемых флагов можно найти на официальном сайте приложения rcolne

Просмотр списка бакетов:

1
$ rclone lsd mailru-s3:

Создание нового бакета

1
$ rclone mkdir mailru-s3:itdraft-testbucket

Просмотр списка файлов в бакете

1
$ rclone ls mailru-s3:itdraft-bucket

Копирование файлов с локальной машины в хранилище

1
$ rclone copy /mnt/storage/itdraft.ru/backup mailru-s3:itdraft-bucket

Синхронизация файлов на локальной машине и в хранилище

1
$ rclone sync /mnt/storage/itdraft.ru/backup mailru-s3:itdraft-bucket

Копирование файлов из хранилища на локальную машину

1
$ rclone copy mailru-s3:itdraft-bucket/backup_itdraft_ru.sql.gz /home/test

Не синхронизировать файлы младше 1 дня

1
$ rclone --min-age 1d --delete-excluded sync /mnt/storage/itdraft.ru/backup mailru-s3:itdraft-bucket

Не синхронизировать файлы старше 7 дней

1
$ rclone --max-age 7d --delete-excluded sync /mnt/storage/itdraft.ru/backup mailru-s3:itdraft-bucket

Удалить файлы младше 7 дней

1
$ rclone --max-age 7d delete mailru-s3:itdraft-bucket

Удалить файлы старше 7 дней

1
$ rclone --min-age 7d delete mailru-s3:itdraft-bucket

Конфигурирование rclone для работы с cloud.mail.ru

Запускаем команду для создания конфигурации под хранилище

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
$ rclone config
e/n/d/r/c/s/q> n
name> cloud-mailru
Storage> mailru
user> [email protected]
Password
y) Yes type in my own password
g) Generate random password
y/g> y
Enter the password:
password:
Confirm the password:
password:
speedup_enable> 1
Edit advanced config? (y/n)
y) Yes
n) No
y/n> n

Далее отобразиться конфигурация, которую мы создали, сохраняем ее и выходим

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
y) Yes this is OK
e) Edit this remote
d) Delete this remote
y/e/d> y
Current remotes:

Name                 Type
====                 ====
cloud-mailru         mailru
mailru-s3            s3

e) Edit existing remote
n) New remote
d) Delete remote
r) Rename remote
c) Copy remote
s) Set configuration password
q) Quit config
e/n/d/r/c/s/q> q

Пример скрипта бэкапирования дампа базы MySQL в хранилище

Логика скрипта бэкапирования следующая:

  • локально хранятся бэкапы базы за 8 дней (т.к. они небольшого размера)
  • в облаке хранится бэкапы базы за 1 месяц
  • в лог пишется информация о количестве локальных бэкапов и какие были удалены

Скрипт через crontab выполняется ежедневно

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
#!/bin/sh

# Переменные
SRC=/mnt/storage/itdraft.ru/backup
DEST=cloud-mailru:/itdraft-backup

# Дата-Врем
DATETIME="$(date +%Y%m%d_%H%M%S)"

# Ящики
mail_from=[email protected]
mail_to=[email protected]
mail_copy=[email protected]

# БД
mysqluser=%user%
mysqlpassword=%pass%
mysqlbase=%database%

# Логи
LOG_FILE=$SRC/backup_mysql.log

# Хранение
DAYS=8
DAYSDEST=1M

# Создаем каталог, если его еще нет
mkdir -p $SRC

# Время запуска скрипта в логах
echo "$DATETIME INFO: Start" | tee "$LOG_FILE"

# Создаем дамп базы локально и архивируем
mysqldump -u $mysqluser -p$mysqlpassword $mysqlbase | gzip > $SRC/$DATETIME.backup_itdraft_ru.sql.gz

# Копируем в облако
rclone copy $SRC $DEST --log-file "$LOG_FILE"

# Удаляем в облаке файлы старше 1 месяца
rclone --min-age $DAYSDEST delete $DEST --log-file "$LOG_FILE"

# Информация для лог-файла: Find local MYSQL dump
echo "Local MYSQL dump" | tee -a "$LOG_FILE"
du -csh --time $SRC/*.sql.gz | tee -a "$LOG_FILE"
echo "Deleted" | tee -a "$LOG_FILE"
find $SRC/*.sql.gz -type f -mtime +$DAYS -print | tee -a "$LOG_FILE"

# Удаляем локальные копии, старше 8 дней
find $SRC/*.sql.gz -type f -mtime +$DAYS -exec rm -f {} \;

# Время завершения скрипта в логах
echo "$DATETIME INFO: End" | tee -a "$LOG_FILE"

# Отправляем лог на почту
echo "itdraft.ru: $DATETIME | deleted files" | mail -v -A yandex -s "itdraft.ru: $DATETIME | deleted files" -a "$LOG_FILE" -r $mail_from $mail_to

Для бэкапирования самого сайта у меня запускается похожий скрипт раз в неделю, но из-за другой периодичности запуска:

  • локально хранится 1 полный бэкап файлов сайта (т.к. этот бэкап весит на несколько порядков больше, чем база)
  • в облаке хранятся бэкапы за месяц (т.е. 4 шт.)

UPD 13.12.2019

Если конфигурировали rclone от одного пользователя, а скрипт бэкапирования запускается от пользователя root, надо скопировать конфигурационный файл rclone

1
2
$ sudo mkdir -p /root/.config/rclone/
$ sudo cp /home/%user%/.config/rclone/rclone.conf /root/.config/rclone/rclone.conf

UPD 27.10.2020

Проблема с клонирование в облако mail.ru разработчики исправили.
В версии rclone v1.53.2 клонирование работает корректно.

Авторский пост защищен лицензией CC BY 4.0 .

© IT Draft. Некоторые права защищены.