Резервное копирование файлов серверов

Для резервного копирования файлов с удаленного сервера на сервер Nextcloud можно использовать программу rclone и простой скрипт резервного копирования.

В скрипте также предусмотрено прикрепление ссылки для быстрой загрузки
Резервное копирование файлов серверов.png
Для настройки надо ссылки на быструю загрузку необходимо указать корректную ссылку на сервер nextcloud.

Настройка rclone для Nextcloud

Программа rclone позволяет удобно взаимодействовать с сервером Nextcloud используя протокол webdav.

Установка:

curl https://rclone.org/install.sh | sudo bash

Запуск настройки:

rclone config 

Параметры настройки:
url должна иметь вид https://nextcloud.domein.ru/remote.php/dav/files/user где user имя пользователя nextcloud в каталоге (обычно имя пользователя с маленькой буквы).
Пароль - это пароль приложения созданный в настройках раздел безопасность.

Мастер настройки:

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> n

Enter name for new remote.
name> nextcloud

Option Storage.
Type of storage to configure.
Choose a number from below, or type in your own value.
Storage> 58

Option url.
URL of http host to connect to.
E.g. https://example.com.
Enter a value.
url> https://nextcloud.domein.ru/remote.php/dav/files/user

Option vendor.
Name of the WebDAV site/service/software you are using.
Choose a number from below, or type in your own value.
Press Enter to leave empty.
vendor> 2

Option user.
User name.
In case NTLM authentication is used, the username should be in the format 'Domain\User'.
Enter a value. Press Enter to leave empty.
user> Username

Option pass.
Password.
Choose an alternative below. Press Enter for the default (n).
y) Yes, type in my own password
g) Generate random password
n) No, leave this optional password blank (default)
y/g/n> y
Enter the password:
password:

Option bearer_token.
Bearer token instead of user/pass (e.g. a Macaroon).
Enter a value. Press Enter to leave empty.
bearer_token> 

Edit advanced config?
y) Yes
n) No (default)
y/n> n

Configuration complete.
Options:
- type: webdav
- url: https://nextcloud.domein.ru/remote.php/dav/files/user
- vendor: nextcloud
- user: Username
- pass: *** ENCRYPTED ***
Keep this "nextcloud" remote?
y) Yes this is OK (default)
e) Edit this remote
d) Delete this remote
y/e/d>y 

Создание скрипта

Установка программы архиватора:

apt install zip

Создадим скрипт:

nano /root/backup_script.sh

chmod +x /root/backup_script.sh

Скрипт для резервного копирования:

#!/bin/bash
set -euo pipefail

# === НАСТРОЙКИ ===
# Переменные для Telegram
TELEGRAM_BOT_TOKEN=""
TELEGRAM_CHAT_ID=""
TELEGRAM_THREAD_ID=""

NEXTCLOUD_URL="https://nextcloud.<domein>.ru/remote.php/dav/files"
NEXTCLOUD_USER=""

# Папка для архивации (можно менять)
SRC_DIR="/home/docker"

# Данные сервера
SERVER_NAME="SRV1"

# Папка для хранения архива и логов
DEST_DIR="/home/backups"
mkdir -p "$DEST_DIR"

# Настройки rclone
RCLONE_NAME="Nextcloud"
RCLONE_TARGET="$RCLONE_NAME:Backups/SRV1"

# Telegram
send_telegram_message() {
    MESSAGE=$1
    curl -s -X POST "https://api.telegram.org/bot${TELEGRAM_BOT_TOKEN}/sendMessage" \
        -d chat_id="${TELEGRAM_CHAT_ID}" -d parse_mode="Markdown" \
        -d message_thread_id="${TELEGRAM_THREAD_ID}" \
        -d disable_notification=true \
        -d text="${MESSAGE}"
}

# === ЛОГИ ===
DATE=$(date +'%Y-%m-%d_%H-%M-%S')
LOG_FILE="$DEST_DIR/backup_$DATE.log"
exec > >(tee -a "$LOG_FILE") 2>&1

echo "=== НАЧАЛО РЕЗЕРВНОГО КОПИРОВАНИЯ $DATE ==="

ARCHIVE_NAME="${SERVER_NAME}_backup_$DATE.zip"
ARCHIVE_PATH="$DEST_DIR/$ARCHIVE_NAME"

# === СОЗДАНИЕ АРХИВА ===
echo "Создание архива $ARCHIVE_PATH"

# Копируем указанную папку напрямую в архив
zip -r "$ARCHIVE_PATH" "$SRC_DIR" || {
    echo "❌ Ошибка при создании архива для папки $SRC_DIR!"
    send_telegram_message "❌ Ошибка резервного копирования папки $SRC_DIR сервера $SERVER_NAME"
    exit 1
}

# Создаём tar.gz для каждого volume и добавляем в архив
for VOL in $(docker volume ls -q); do
    VOL_PATH=$(docker volume inspect "$VOL" -f '{{ .Mountpoint }}')
    VOL_ARCHIVE="${VOL}.tar.gz"
    echo "Архивируем volume $VOL -> $VOL_ARCHIVE"
    tar -czf "$VOL_ARCHIVE" -C "$VOL_PATH" . 

    # Добавляем в общий архив
    zip -r "$ARCHIVE_PATH" "$VOL_ARCHIVE" || {
        echo "❌ Ошибка при добавлении volume $VOL в архив!"
        send_telegram_message "❌ Ошибка при добавлении volume $VOL сервера $SERVER_NAME"
        rm -f "$VOL_ARCHIVE"
        exit 1
    }
    rm -f "$VOL_ARCHIVE"
done

echo "✅ Архив создан: $ARCHIVE_PATH"

# === ЗАГРУЗКА В NEXTCLOUD ===
echo "Загрузка архива в Nextcloud..."
if rclone copy "$ARCHIVE_PATH" "$RCLONE_TARGET"; then
    echo "✅ Архив успешно загружен в Nextcloud."
    send_telegram_message "✅ Создана резервная копия сервера *$SERVER_NAME* в [Nextcloud]($NEXTCLOUD_URL/$NEXTCLOUD_USER/Backups/Selectl_SPB/$ARCHIVE_NAME)"
    rm -f "$ARCHIVE_PATH"
else
    echo "❌ Ошибка при загрузке архива!"
    send_telegram_message "❌ Ошибка при загрузке резервной копии сервера $SERVER_NAME"
fi

# === РОТАЦИЯ СТАРЫХ АРХИВОВ В NEXTCLOUD (старше 7 дней) ===
echo "Удаление архивов старше 7 дней в Nextcloud..."
rclone delete --min-age 7d "$RCLONE_TARGET" || echo "⚠️ Ошибка при очистке старых архивов."

echo "=== ЗАВЕРШЕНО $(date) ==="

Настройка скрипта

TELEGRAM_BOT_TOKEN - токен телеграмм бота для уведомлений
TELEGRAM_CHAT_ID - id чата для отправки сообщений
TELEGRAM_THREAD_ID - тема супер группы

Модификация отправки телеграмм

Если не надо использовать темы для отправки сообщений то необходимо удалить -d message_thread_id="${TELEGRAM_THREAD_ID}"

TARGET_DIR - папка хранения файлов в Nextcloud
RCLONE_NAME - имя задания rclone указанное на первом шаге мастера настройки

NEXTCLOUD_URL - адрес nextcloud
NEXTCLOUD_USER - имя пользователя с маленькой буквы

Модификация ссылки на загрузку

Параметры NEXTCLOUD_URL и NEXTCLOUD_USER являются необязательными и используются для формирования ссылки загрузки в сообщении телеграмм. Если данная ссылка не нужна надо заменить [резервная копия]($NEXTCLOUD_URL/$NEXTCLOUD_USER/$TARGET_DIR/$ARCHIVE_NAME) на резервная копия

SRC_DIRS - папки для резервного копирования, может быть задано как несколько папок. Пример: ("/opt/test" "/var/lib/test")
SERVER_NAME - имя сервера, используется в названии архива и в сообщении
DEST_DIR - временная папка хранения архива, после отправки архив удаляется

Автоматический запуск

Для автоматического запуска необходимо добавить запись в crontab

crontab -e
0 5 * * * /root/backup_script.sh >/dev/null 2>&1