Решён
Как настроить хранилище Amazon S3 для бэкапов сервера?

Нужно настроить автоматические бэкапы виртуалки (Ubuntu 22.04) в Amazon S3. Бэкапить надо базу PostgreSQL и папку /var/www раз в сутки.

Зарегистрировался в AWS, создал bucket, получил access key и secret key. Дальше не понимаю как правильно организовать процесс:

  1. Какой софт использовать для заливки в S3? AWS CLI или есть что то проще?
  2. Как автоматизировать через cron?
  3. Нужно ли шифровать бэкапы перед отправкой или S3 сам шифрует?
  4. Как настроить lifecycle policy чтобы старые бэкапы автоматом удалялись?

Буду признателен за пошаговую инструкцию или ссылку на нормальный туториал.

Решение
78
Эксперт • 1 ответ

Пошаговая инструкция:

1. Установка AWS CLI:

sudo apt update
sudo apt install awscli -y
aws configure

Вводишь access key, secret key, регион (например eu-central-1), формат вывода оставляешь json.

2. Скрипт для бэкапа (создай /opt/backup.sh):

#!/bin/bash
DATE=$(date +%Y-%m-%d-%H%M)
BACKUP_DIR="/tmp/backup-$DATE"
mkdir -p $BACKUP_DIR

# Дамп PostgreSQL
sudo -u postgres pg_dumpall | gzip > $BACKUP_DIR/postgres-$DATE.sql.gz

# Архив /var/www
tar -czf $BACKUP_DIR/www-$DATE.tar.gz /var/www

# Заливка в S3
aws s3 sync $BACKUP_DIR s3://your-bucket-name/backups/$DATE/

# Удаление локальной копии
rm -rf $BACKUP_DIR

Не забудь chmod +x /opt/backup.sh и заменить your-bucket-name на имя своего бакета.

3. Автоматизация через cron:

sudo crontab -e

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

0 3 * * * /opt/backup.sh >> /var/log/backup.log 2>&1

4. Lifecycle policy в S3:

Заходишь в консоль AWS - S3 - твой bucket - Management - Create lifecycle rule:

  • Prefix: backups/
  • Transitions: не нужны
  • Expiration: удалять объекты старше 30 дней

5. Про шифрование:

S3 по умолчанию шифрует данные на стороне сервера (SSE-S3). Если нужно шифровать еще до отправки, добавь в скрипт gpg перед заливкой, но для большинства задач хватает встроенного шифрования AWS.

Аватар Виктор Облаков

Супер, спасибо! Единственное - у меня несколько баз, можно ли pg_dumpall заменить на дамп конкретной базы?

Аватар Юлия Неверова

Да, замени на `pg_dump -U postgres -d dbname | gzip > ...` где dbname - имя твоей базы

54
Участник • 1 ответ

Вместо самописного скрипта лучше юзать готовые решения типа restic или duplicity. Они умеют инкрементальные бэкапы (сохраняют только изменения), дедупликацию и встроенное шифрование.

Пример с restic:

# Установка
sudo apt install restic

# Инициализация репозитория
export AWS_ACCESS_KEY_ID=ваш_ключ
export AWS_SECRET_ACCESS_KEY=ваш_секрет
restic -r s3:s3.amazonaws.com/your-bucket-name init

# Бэкап
restic -r s3:s3.amazonaws.com/your-bucket-name backup /var/www

# Удаление старых снапшотов (оставить последние 30 дней)
restic -r s3:s3.amazonaws.com/your-bucket-name forget --keep-daily 30 --prune

Точно так же добавляешь в cron. Restic сам разберется с инкрементами и сэкономит кучу места в S3.

41
Эксперт • 1 ответ

Только учти что в S3 тарифицируется не только хранение но и количество запросов (PUT/GET) и исходящий трафик.

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

Почитай калькулятор цен AWS перед тем как настраивать автоматику: https://calculator.aws

31
Эксперт • 2 ответа

Обязательно настрой версионирование в S3 (Bucket - Properties - Versioning - Enable). Если скрипт случайно затрет файл или залье поврежденный бэкап, ты сможешь откатиться к предыдущей версии.

И включи MFA Delete чтобы никто не мог удалить бэкапы без двухфакторки.

23
Эксперт • 1 ответ

делаю бекапы в s3 через rclone уже лет 5, работает стабильно

ставишь rclone, конфигуришь remote для s3 один раз, потом просто rclone sync /var/www s3:bucket/path в кроне

никаких aws cli не надо, rclone проще и быстрее

49
Эксперт • 2 ответа

Не забудь настроить IAM политику для ключей доступа чтобы они имели права ТОЛЬКО на запись в конкретный bucket и ничего больше.

Если ключи утекут (а на проде они лежат в открытом виде в crontab), злоумышленник не сможет удалить твои бэкапы или залезть в другие сервисы AWS.

Пример минимальной политики:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "s3:PutObject",
        "s3:PutObjectAcl"
      ],
      "Resource": "arn:aws:s3:::your-bucket-name/*"
    }
  ]
}

Написать ответ

Премодерация гостей

Вы отвечаете как гость. Ваш ответ будет скрыт до проверки модератором. Чтобы ответ появился сразу и вы получали репутацию — войдите в аккаунт.

Будьте вежливы и соблюдайте правила платформы.