Автоматический бэкап проектов и PostgreSQL на Google Drive без расхода диска

Автоматический бэкап проектов и PostgreSQL на Google Drive без расхода диска

Эксплуатация виртуального сервера скромной конфигурации с накопителем емкостью 30 гигабайт требует бережного отношения к каждому сектору памяти. Запуск типового стека из микросервисов, реляционной СУБД и веб-сервера быстро подводит систему к критической отметке заполнения файловой структуры.

Стандартный шаблон создания точек восстановления — выгрузить дамп, упаковать директории во временную папку /tmp и отправить архив во внешнее хранилище — в условиях жесткого дефицита ресурсов опасен. Процедура сжатия массивных директорий или таблиц БД мгновенно спровоцирует сбой No space left on device, остановив продуктовые сервисы.

Решение заключается в отказе от промежуточной посадки данных на локальный накопитель в пользу конвейерной передачи байтов (pipe) сразу в облачную инфраструктуру Google с помощью консольного синхронизатора Rclone.

ВАЖНО!, все действия описанные с docker, под вашу отвественность

Часть 1. Санация окружения контейнеризации

Прежде чем разворачивать контур архивации, необходимо устранить неконтролируемые утечки памяти на самом узле.

Сдерживание журнала событий

Служба системного протоколирования контейнеров способна незаметно утилизировать десятки гигабайт текстовыми логами. Исправьте политику хранения через глобальный манифест демона /etc/docker/daemon.json:

{
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "10m",
    "max-file": "3"
  }
}

Чтобы применить обновленные правила, выполните перезапуск сервиса:

sudo systemctl restart docker

Удаление неактивных ресурсов

Очистите хост от промежуточных сборочных артефактов и «осиротевших» слоев файловой системы:

docker system prune -af --volumes


Часть 2. Подключение внешнего хранилища (Google Drive API)

Для интеграции с хранилищем применяется инструмент Rclone. Чтобы обойти стандартные ограничения пропускной способности публичных ключей, зарегистрируйте собственное приложение в панели управления Google Cloud.

Получение персональных идентификаторов

  1. Откройте консоль разработчика Google Cloud Platform и инициализируйте новый проект.

  2. В каталоге интерфейсов включите компонент Google Drive API.

  3. В параметрах окна авторизации (OAuth consent screen) выберите общедоступный тип доступа (External), укажите контактную почту администратора и внесите свой адрес в список доверенных тестировщиков (Test users).

  4. Опубликуйте статус проекта кнопкой Publish App, предотвращая плановый сброс токена авторизации через двухнедельный цикл.

  5. В разделе учетных данных создайте пару OAuth Client ID с целевым назначением Desktop app и сохраните строковые значения идентификатора и секрета.

Инициализация Rclone

Инсталлируйте бинарный пакет на вашем сервере:

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

Перейдите к конфигурированию:

rclone config
  1. Сформируйте подключение: укажите команду n, назначьте метку (например, gdrive), выберите драйвер с кодом drive.

  2. Вставьте сохраненные параметры client_id и client_secret получанные при создании проекта в Google Cloud Platform.

  3. Запросите максимальный уровень привилегий (цифра 1 — полный доступ к файловому пространству).

  4. Вопрос об автоконфигурации (Use auto config?) отклоните параметром n, поскольку удаленная консоль лишена графического интерфейса.

  5. Установите Rclone на свой компьютер, это потребуется для получения кода авторизации вашего проекта

  6. Для валидации сессии выполните на своем компьюте:

rclone authorize "drive" "ВАШ_CLIENT_ID" "ВАШ_CLIENT_SECRET"
  1. Пройдите процедуру аутентификации в браузере, скопируйте сформированный токен и внесите его в консоль на вашем сервере в ответ на приглашение <config_token>.

Проконтролируйте успешность привязки:

rclone lsd gdrive:


Часть 3. Скрипт резервных копий «на лету»

Ключевая особенность пайплайна — субкоманда rclone rcat. Она непрерывно принимает стандартный входящий поток ввода (stdin) и загружает блоки данных в облачный сервис без записи бинарных файлов на блочное устройство сервера.

Создайте рабочий сценарий /usr/local/bin/zero_disk_backup.sh:

#!/usr/bin/env bash
set -eo pipefail

# Системные переменные окружения
TIMESTAMP="$(date +'%Y-%m-%d_%H-%M')"
TARGET_DRIVE="gdrive:ServerBackups"
EXPIRATION_PERIOD="7d"

# Исходные каталоги
WEB_ROOT="/web/lazarovstudio.ru"

# Сетевые реквизиты Postgres
POSTGRES_INSTANCE="имя_вашего_postgres_контейнера"
PG_DATABASE="ваша база данных"
PG_ROLE="ваша база данных"
export PGPASSWORD="пароль вашей базы данных"
# 1. Потоковое чтение и загрузка БД docker exec -i -e PGPASSWORD="$PGPASSWORD" "$POSTGRES_INSTANCE" \ pg_dump -U "$PG_ROLE" "$PG_DATABASE" \ | gzip \ | rclone rcat "$TARGET_DRIVE/$TIMESTAMP/database_${PG_DATABASE}.sql.gz" # 2. Архивация файлового хранилища без временных копий tar -czf - -C "$WEB_ROOT" . \ | rclone rcat "$TARGET_DRIVE/$TIMESTAMP/filesystem_data.tar.gz" # 3. Ротация устаревших версий в удаленном хранилище rclone delete --min-age "$EXPIRATION_PERIOD" "$TARGET_DRIVE" rclone cleanup "$TARGET_DRIVE"

Сделайте файл исполняемым:

sudo chmod +x /usr/local/bin/zero_disk_backup.sh


Часть 4. Автоматизация фоновых процедур

Для автономной работы настройте планировщик задач:

crontab -e

Зафиксируйте правила выполнения:

# Запуск репликации ежесуточно в 03:00 ночи
0 3 * * * /usr/local/bin/zero_disk_backup.sh >> /var/log/backup_stream.log 2>&1

# Профилактическая нейтрализация мусорных слоев контейнеров по воскресеньям
30 4 * * 0 docker system prune -f --filter "until=72h" > /dev/null 2>&1


Часть 5. Восстановление инфраструктуры из удаленного потока

При наступлении аварийной ситуации извлекать архивы на диск хоста также не требуется. Утилита rclone cat считывает файл из облака и направляет контент в распаковщик.

  • Развертывание таблиц базы данных:

rclone cat "gdrive:ServerBackups/2026-10-03_03-00/database.sql.gz" \
  | gunzip \
  | docker exec -i -e PGPASSWORD="пароль вашей базы данных" <имя_контейнера> psql -U seo_tools -d seo_tools
  • Распаковка файлового контента проекта:

rclone cat "gdrive:ServerBackups/2026-10-03_03-00/filesystem_data.tar.gz" \
  | tar -xzf - -C /web/lazarovstudio.ru

Все статьи

Другие статьи

Смотреть все