Rclone + Google Drive + Freebsd

Поставил задачу себе делать бэкапы и переносить их на Google Drive. Есть три софта это rclone, gdrive и grive2. Попробовал все три. Начал с gdrive все установилось, но не получилось подсоединиться к аккаунту Google, постоянно выбивала ошибку: 400: invalid_request. Абсолютно та же история была с grive2. Также установилась, немножко дольше устанавливалась, но также при настройке — ошибка 400 и подключиться к аккаунту было невозможно.

Потом я начал пробовать Rclone. Установка дольше, больше зависимостей. Начал настраивать, а там просит установить дополнительно на десктоп, чтобы авторизоваться оттуда и потом перенести настройки на сервер. С горем пополам нашел как настраивать без десктопа.

Самая соль активировать аккаунт гугла — без танцев с бубном просто никак

Поэтому решил сделать инструкцию себе на память, возможно кому-то будет полезно.

# cd /usr/ports/net/rclone
#make install clean

Подключение Аккаунта гугла

  1. Создайте проект в Google Cloud Console:
    • Перейдите на Google Cloud Console.
    • Создайте новый проект или выберите существующий.
  2. Включите API Google Drive:
    • В разделе «APIs & Services» выберите «Library».
    • Найдите «Google Drive API» и включите его.
  3. Создайте OAuth 2.0 учетные данные:
    • Перейдите в раздел «APIs & Services» > «Credentials».
    • Нажмите «Create Credentials» и выберите «OAuth 2.0 Client ID».
    • Вам потребуется настроить экран согласия OAuth. Заполните необходимую информацию.
    • Создайте учетные данные типа «Desktop app».
  4. Скачайте файл учетных данных:
    • После создания учетных данных скачайте JSON-файл с учетными данными клиента.

Затем нужно создать дополнительный файл подключения service_account_file.json, чтобы автоматически авторизироваться в Google

  1. Перейдите в API & Services > Credentials.
  2. Нажмите Create credentials и выберите Service account.
  3. Введите имя для сервисного аккаунта и, при необходимости, описание. Нажмите Create.
  4. Назначьте роли сервисному аккаунту. Для работы с Google Drive выберите роль Project > Editor или Owner. Нажмите Continue.
  5. Пропустите шаг добавления пользователей и нажмите Done.
  6. На странице «Service accounts» найдите созданный аккаунт и нажмите на кнопку «Actions» (три точки) справа, затем выберите Manage keys.
  7. Нажмите Add key > Create new key, выберите JSON и нажмите Create. Файл JSON будет скачан на ваш компьютер.

Для удобства назовем его service_account_file.json

Настройка доступа сервисного аккаунта к Google Drive:

  • Откройте Google Drive, который будет использоваться для хранения бэкапов.
  • Создайте папку для бэкапов, например, Backups.
  • Поделитесь этой папкой с сервисным аккаунтом. Используйте email-адрес из JSON-файла service_account_file.json, обычно вида [email protected].
  • Дайте доступ на редактирование.
  • Откройте ее в браузере и возьмите url из адресной строки (https://drive.google.com/drive/folders/1lK6HF2woUFSkjnksdfna1hBDHtqTFo — 1lK6HF2woUFSkjnksdfna1hBDHtqTFo и есть ID папки) — запишите его он нам понадобиться позже (для поля Root Folder ID — root_folder_id)

Перенесите файл JSON на сервер FreeBSD

Скопируйте скачанный JSON-файл на ваш сервер FreeBSD. Предположим, вы сохранили его в домашней директории пользователя, например, под именем service_account.json.

Настройка rclone с использованием сервисного аккаунта

Запустите rclone config и настройте remote для Google Drive, используя файл сервисного аккаунта.

  • # rclone config
  • Выберите n для создания нового remote.
  • Дайте имя вашему remote, например gdrive.
  • Ищем Google Drive (у меня он был под 17 номером).
  • Когда вас спросят о клиентском ID, введите client_id из первого JSON-файла(учетными данными клиента).
  • Когда вас спросят о клиентском секретe, введите client_secret из JSON-файла(учетными данными клиента).
  • Выберите 1 для полнофункционального доступа.
  • в поле service account указываем путь загруженного файла service_account.json
  • Edit advanced config — y
  • Пропускаем все поля до тех пор пока не увидите Root Folder ID — это та папка которой мы дали доступ сервисному аккаунту. Но пишем не название папки а ее ID. Тот который мы записали ранее из адресной строки 1lK6HF2woUFSkjnksdfna1hBDHtqTFo
  • Сохраняем все настройки и выходим

Если все прошло ок, то на этом этапе мы уже можем подключаться к Google Drive.

Проверим
echo "This is a test file" > testfile.txt

rclone copy testfile.txt gdrive:

rclone ls gdrive:

Вы должны увидеть testfile.txt в выводе.

Скачайте файл обратно

rclone copy gdrive:testfile.txt .

Проверьте также видите ли вы созданный файл в браузере на Google Drive.

Мой файл загрузки бекапов rclone_upload.sh:

#!/bin/sh

# Указываем пути к папкам с бекапами на сервере
backup_month="/usr/home/backups/month"
backup_week="/usr/home/backups/week"
backup_system="/usr/home/backups/system"

# Проверяем наличие файлов в папках бекапов на сервере
if [ -n "$(ls -A $backup_month $backup_week $backup_system 2>/dev/null)" ]; then
# Получаем текущую дату в формате "YYYY-MM-DD"
current_date=$(date "+%Y-%m-%d")
# Указываем путь к удаленной папке на Google Drive с текущей датой
remote_backup_folder="gdrive:$current_date"

# Создаем удаленную папку на Google Drive с текущей датой
rclone mkdir $remote_backup_folder

# Перемещаем файлы из папок бекапов на сервере в удаленную папку на Google Drive
for backup_folder in $backup_month $backup_week $backup_system; do
if [ -n "$(ls -A $backup_folder 2>/dev/null)" ]; then
echo "Найдены файлы в папке $(basename $backup_folder), перемещаем на Google Drive..."
rclone move $backup_folder $remote_backup_folder
else
echo "Папка $(basename $backup_folder) пуста, ничего не перемещаем."
fi
done

echo "Скрипт выполнен."
else
echo "Нет файлов для загрузки на Google Drive, папка remote_backup_folder не создана."
fi

Крон

crontab -e

0 11 * * * /path/to/rclone_upload.sh

Также можно настроить автоматическое удаление бекапов старше 5 месяцев к примеру, чтобы не засорять диск Google Drive

rclone delete gdrive:month --min-age 5M
Запись опубликована в рубрике: Заметки о FreeBSD.

Комментарии