Регулярное резервное копирование — это основа безопасности любого сайта. Сбой сервера, ошибка при обновлении, случайное удаление файлов или взлом могут привести к потере данных, и только свежий бекап позволит быстро восстановить работоспособность проекта. В этой статье я расскажу, как настроить автоматическое создание резервных копий файлов сайта и базы данных 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 это может быть .env, config/database.php, settings.py и т.д. Допустим, мы имеем:
- Имя базы данных: exampledb
- Пользователь: dbuser
- Пароль: secretpass
- Хост: localhost (или 127.0.0.1)
Запишите эти данные — они понадобятся для создания дампа.
Шаг 2. Создайте дамп базы данных PostgreSQL
Дамп — это файл, содержащий SQL-команды для полного восстановления базы (структура + данные). Основная команда для создания дампа — pg_dump.
Простой SQL-дамп
plaintextpg_dump -U dbuser -h localhost exampledb > /backup/exampledb.sql
Эта команда создаст обычный текстовый SQL-файл. При выполнении система запросит пароль пользователя dbuser. Если вы хотите избежать интерактивного ввода, используйте переменную окружения PGPASSWORD:
plaintextPGPASSWORD="secretpass" pg_dump -U dbuser -h localhost exampledb > /backup/exampledb.sql
Сжатый дамп в пользовательском формате (рекомендуется)
Утилита pg_dump поддерживает специальный сжатый формат (-Fc), который занимает меньше места и позволяет восстанавливать отдельные таблицы. Кроме того, такой дамп легче передавать по сети.
plaintextpg_dump -U dbuser -h localhost -Fc exampledb > /backup/exampledb.dump
Автоматизация ввода пароля с .pgpass
Чтобы при автоматическом запуске (например, из cron) не указывать пароль в открытом виде в команде, создайте файл ~/.pgpass в домашней директории пользователя, от которого будет выполняться скрипт. Добавьте в него строку:
plaintextlocalhost:5432:exampledb:dbuser:secretpass
где 5432 — стандартный порт PostgreSQL. Затем установите права доступа:
plaintextchmod 600 ~/.pgpass
Теперь pg_dump сможет подключаться к базе без запроса пароля.
Шаг 3. Заархивируйте файлы сайта
Создадим сжатый архив tar.gz для всех директорий сайта. Перейдите в родительскую папку (например, /var/www), чтобы в архив попали только относительные пути — это упростит восстановление.
plaintextcd /var/www tar -czf /backup/example_files.tar.gz example.com blog.example.com
-c— создать архив-z— сжать gzip-f— указать имя файла
Если нужно сохранить полные пути (например, при восстановлении на другой сервер с другой структурой), можно архивировать абсолютные пути:
plaintexttar -czf /backup/example_files_full.tar.gz /var/www/example.com /var/www/blog.example.com
Шаг 4. (Опционально) Объедините дамп и файлы в один архив
Для удобства хранения можно положить дамп базы в отдельную временную папку и добавить его в общий архив с файлами. Например:
plaintextmkdir /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 "Резервное копирование завершено"
Сделайте скрипт исполняемым:
plaintextchmod +x /usr/local/bin/backup_example.sh
Добавьте задание в cron
Откройте файл заданий текущего пользователя:
plaintextcrontab -e
Добавьте строку для ежедневного запуска, например, в 3 часа ночи:
plaintext0 3 * * * /usr/local/bin/backup_example.sh
Теперь каждую ночь скрипт будет создавать свежий дамп базы и архив файлов, а также удалять копии старше 7 дней.
Шаг 6. Дополнительные рекомендации
Храните бекапы вне сервера
Локальные копии на том же сервере не спасут при физической поломке диска или взломе. Регулярно копируйте архивы на другой сервер, в облачное хранилище (например, с помощьюrsync,scpили утилитыrclone). Можно настроить синхронизацию папки/backupс удалённым хранилищем.Проверяйте восстанавливаемость
Хотя бы раз в месяц пробуйте восстановить базу и файлы из бекапа на тестовом окружении. Это единственный способ убедиться, что ваши копии не повреждены и процесс восстановления работает.Обеспечьте безопасность
Файл
.pgpassдолжен иметь права600и быть доступен только тому пользователю, от которого запускается скрипт.Не храните пароли в открытом виде в скриптах — используйте
.pgpassили переменные окружения, если это безопасно.Для передачи архивов по сети используйте шифрование (SSH, HTTPS).
Мониторинг
Добавьте в скрипт отправку уведомлений (например, черезmailили Telegram-бота), чтобы знать об успешном выполнении или ошибках.
Заключение
Теперь у вас есть готовое решение для автоматического резервного копирования сайта и базы данных PostgreSQL в Ubuntu. Настроив этот процесс один раз, вы сможете спать спокойно, зная, что ваши данные защищены. Помните: бекапы — это не роскошь, а необходимость. Не откладывайте их на потом, ведь восстановить данные намного сложнее, чем создать резервную копию.



