Linux

Резервное копирование сайта и базы данных PostgreSQL в Ubuntu

6 мин. чтения
Резервное копирование сайта и базы данных PostgreSQL в Ubuntu

Регулярное резервное копирование — это основа безопасности любого сайта. Сбой сервера, ошибка при обновлении, случайное удаление файлов или взлом могут привести к потере данных, и только свежий бекап позволит быстро восстановить работоспособность проекта. В этой статье я расскажу, как настроить автоматическое создание резервных копий файлов сайта и базы данных PostgreSQL на сервере с Ubuntu. Руководство подойдёт как для начинающих, так и для опытных администраторов — все шаги объяснены максимально понятно, с примерами команд.

Мы будем использовать вымышленный проект example.com, файлы которого лежат в /var/www/example.com, и базу данных exampledb, принадлежащую пользователю dbuser. Вы легко сможете заменить эти значения на свои.

Предварительные требования

  • Доступ к серверу по SSH.
  • Права суперпользователя (sudo) или возможность выполнять команды от владельца файлов сайта.
  • Установленный PostgreSQL и утилита pg_dump (обычно идёт в комплекте с сервером).
  • Знание параметров подключения к базе данных: имя базы, пользователь, пароль, хост (обычно localhost). Если ваш сайт использует фреймворк (например, Strapi, Django, Laravel), эти параметры указаны в конфигурационных файлах проекта.

Шаг 1. Определите расположение файлов и параметры базы данных

Для начала уточните, где физически находятся файлы вашего сайта. Чаще всего это директории внутри /var/www/. В нашем примере это:

plaintext
/var/www/example.com /var/www/blog.example.com  (если есть поддомен)

Параметры базы данных можно найти в файле настроек проекта. Для веб-приложений на базе PostgreSQL это может быть .envconfig/database.phpsettings.py и т.д. Допустим, мы имеем:

  • Имя базы данных: exampledb
  • Пользователь: dbuser
  • Пароль: secretpass
  • Хост: localhost (или 127.0.0.1)

Запишите эти данные — они понадобятся для создания дампа.

Шаг 2. Создайте дамп базы данных PostgreSQL

Дамп — это файл, содержащий SQL-команды для полного восстановления базы (структура + данные). Основная команда для создания дампа — pg_dump.

Простой SQL-дамп

plaintext
pg_dump -U dbuser -h localhost exampledb > /backup/exampledb.sql

Эта команда создаст обычный текстовый SQL-файл. При выполнении система запросит пароль пользователя dbuser. Если вы хотите избежать интерактивного ввода, используйте переменную окружения PGPASSWORD:

plaintext
PGPASSWORD="secretpass" pg_dump -U dbuser -h localhost exampledb > /backup/exampledb.sql

Сжатый дамп в пользовательском формате (рекомендуется)

Утилита pg_dump поддерживает специальный сжатый формат (-Fc), который занимает меньше места и позволяет восстанавливать отдельные таблицы. Кроме того, такой дамп легче передавать по сети.

plaintext
pg_dump -U dbuser -h localhost -Fc exampledb > /backup/exampledb.dump

Автоматизация ввода пароля с .pgpass

Чтобы при автоматическом запуске (например, из cron) не указывать пароль в открытом виде в команде, создайте файл ~/.pgpass в домашней директории пользователя, от которого будет выполняться скрипт. Добавьте в него строку:

plaintext
localhost:5432:exampledb:dbuser:secretpass

где 5432 — стандартный порт PostgreSQL. Затем установите права доступа:

plaintext
chmod 600 ~/.pgpass

Теперь pg_dump сможет подключаться к базе без запроса пароля.

Шаг 3. Заархивируйте файлы сайта

Создадим сжатый архив tar.gz для всех директорий сайта. Перейдите в родительскую папку (например, /var/www), чтобы в архив попали только относительные пути — это упростит восстановление.

plaintext
cd /var/www tar -czf /backup/example_files.tar.gz example.com blog.example.com
  • -c — создать архив

  • -z — сжать gzip

  • -f — указать имя файла

Если нужно сохранить полные пути (например, при восстановлении на другой сервер с другой структурой), можно архивировать абсолютные пути:

plaintext
tar -czf /backup/example_files_full.tar.gz /var/www/example.com /var/www/blog.example.com

Шаг 4. (Опционально) Объедините дамп и файлы в один архив

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

plaintext
mkdir /tmp/backup_temp cp /backup/exampledb.dump /tmp/backup_temp/ tar -czf /backup/full_backup_$(date +%Y%m%d).tar.gz -C /tmp/backup_temp . -C /var/www example.com blog.example.com rm -rf /tmp/backup_temp

Но на практике удобнее хранить файлы и дампы отдельно — так проще восстанавливать только базу или только файлы при необходимости.

Шаг 5. Автоматизация с помощью cron

Ручное создание бекапов — хорошая привычка, но чтобы гарантировать регулярность, лучше настроить автоматический запуск.

Создайте скрипт резервного копирования

Создайте файл, например, /usr/local/bin/backup_example.sh, со следующим содержимым:

plaintext
#!/bin/bash # Директория для хранения бекапов BACKUP_DIR="/backup" # Параметры базы данных DB_NAME="exampledb" DB_USER="dbuser" DB_HOST="localhost" # Директории сайта SITE_DIRS=("/var/www/example.com" "/var/www/blog.example.com") # Текущая дата и время для имени файлов DATE=$(date +%Y%m%d_%H%M%S) # Лог-файл LOG_FILE="$BACKUP_DIR/backup.log" # Создаём папку для бекапов, если её нет mkdir -p "$BACKUP_DIR" # Функция логирования log() { echo "$(date '+%Y-%m-%d %H:%M:%S') - $1" >> "$LOG_FILE" } log "Начало резервного копирования" # Дамп базы данных в сжатом формате pg_dump -U "$DB_USER" -h "$DB_HOST" -Fc "$DB_NAME" > "$BACKUP_DIR/${DB_NAME}_${DATE}.dump" if [ $? -eq 0 ]; then log "Дамп базы данных успешно создан: ${DB_NAME}_${DATE}.dump" else log "ОШИБКА при создании дампа базы данных" exit 1 fi # Архивация файлов сайта tar -czf "$BACKUP_DIR/example_files_${DATE}.tar.gz" "${SITE_DIRS[@]}" if [ $? -eq 0 ]; then log "Архив файлов успешно создан: example_files_${DATE}.tar.gz" else log "ОШИБКА при создании архива файлов" fi # Удаление старых бекапов (оставляем последние 7 дней) find "$BACKUP_DIR" -name "*.dump" -type f -mtime +7 -delete find "$BACKUP_DIR" -name "*.tar.gz" -type f -mtime +7 -delete log "Старые бекапы (старше 7 дней) удалены" log "Резервное копирование завершено"

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

plaintext
chmod +x /usr/local/bin/backup_example.sh

Добавьте задание в cron

Откройте файл заданий текущего пользователя:

plaintext
crontab -e

Добавьте строку для ежедневного запуска, например, в 3 часа ночи:

plaintext
0 3 * * * /usr/local/bin/backup_example.sh

Теперь каждую ночь скрипт будет создавать свежий дамп базы и архив файлов, а также удалять копии старше 7 дней.

Шаг 6. Дополнительные рекомендации

  1. Храните бекапы вне сервера
    Локальные копии на том же сервере не спасут при физической поломке диска или взломе. Регулярно копируйте архивы на другой сервер, в облачное хранилище (например, с помощью rsync, scp или утилиты rclone). Можно настроить синхронизацию папки /backup с удалённым хранилищем.

  2. Проверяйте восстанавливаемость
    Хотя бы раз в месяц пробуйте восстановить базу и файлы из бекапа на тестовом окружении. Это единственный способ убедиться, что ваши копии не повреждены и процесс восстановления работает.

  3. Обеспечьте безопасность

    • Файл .pgpass должен иметь права 600 и быть доступен только тому пользователю, от которого запускается скрипт.

    • Не храните пароли в открытом виде в скриптах — используйте .pgpass или переменные окружения, если это безопасно.

    • Для передачи архивов по сети используйте шифрование (SSH, HTTPS).

  4. Мониторинг
    Добавьте в скрипт отправку уведомлений (например, через mail или Telegram-бота), чтобы знать об успешном выполнении или ошибках.

Заключение

Теперь у вас есть готовое решение для автоматического резервного копирования сайта и базы данных PostgreSQL в Ubuntu. Настроив этот процесс один раз, вы сможете спать спокойно, зная, что ваши данные защищены. Помните: бекапы — это не роскошь, а необходимость. Не откладывайте их на потом, ведь восстановить данные намного сложнее, чем создать резервную копию.

 

Теги статьи

Новые статьи на почту

Без спама, только полезное

Подписываясь, вы соглашаетесь с политикой конфиденциальности

Читайте также