PHPBU отличный бэкапер

Бэкапы наше все — PHPBU 😎

Мне нравится PHP и я не навежу зоопарк технологий, по этому использую PHP для всего, что можно автоматизировать 🙃

PHPBU — отличный бэкапер для ArangoDB, Elastic, MongoDB, MySQL, PostgresSQL, Redis, и файлов.

Возможности PHPBU

  • Создание бэкапов MySQL, ArangoDB, Elastic, MongoDB, MySQL, PostgresSQL, Redis и директорий
  • Легкая настройка в форматах: JSON или XML
  • Выгрузка созданных бэкапов: FTP, DropBox, AWS3
  • Удаление старых архивов
  • Проверка архива после создания
  • Использование переменных окружения, нужно для того, что бы не светить пароль в файле конфигурации
  • Легкое расширение возможностей PHPBU на ❤ PHP

И так. По порядку.

Установка PHPBU

Установить PHPBU можно как зависимостью проекта при помощи Composer, или можно скачать PHAR файл и установить глобально. Я выбрал второй вариант, что бы не тягать лишние зависимости в проекте.

wget https://phar.phpbu.de/phpbu.phar
chmod +x phpbu.phar
php phpbu.phar --version

Настройка PHPBU

Мне нравится формат JSON, буду описывать настройку в формате JSON.

Содержимое phpbu.json

{
  "verbose": true,
  "logging": [
    {
      "type": "json",
      "target": "backup/json.log"
    },
    {
      "type": "mail",
      "options": {
        "transport":       "smtp",
        "recipients":      "my@email.com",
        "sender.mail":     "adapter:environment:SMTP_BACKUP_USER",
        "smtp.host":       "smtp.yandex.ru",
        "smtp.port":       "465",
        "smtp.username":   "adapter:environment:SMTP_BACKUP_USER",
        "smtp.password":   "adapter:environment:SMTP_BACKUP_PASSWORD",
        "smtp.encryption": "ssl"
      }
    }
  ],
  "adapters": [
    {
      "type": "env",
      "name": "environment"
    }
  ],
  "backups": []
}

После создания архивов на почту будут выслан отчет о выполнении.

Настройка бэкапа для MySQL

Необходимо в раздел backups добавить:

{
  "name": "MySQL",
  "source": {
    "type": "mysqldump",
      "options": {
        "databases": "database_name",
        "user":      "adapter:environment:MYSQL_BACKUP_USER",
        "password":  "adapter:environment:MYSQL_BACKUP_PASSWORD"
      }
    },
    "target": {
      "dirname":  "/path/to/backup/storing",
      "filename": "mysql-database_name-%Y%m%d-%H%i.sql",
      "compress": "bzip2"
    }
}

В директиве source описывается от куда брать данные для создания бэкапа. А в директиве target где хранить созданные архивы.

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

Настройка бэкапа файлов

Необходимо в раздел backups добавить:

{
  "name": "My Files",
  "source": {
    "type": "tar",
    "options": {
      "path": "/path/to/my/files/"
    }
  },
  "target": {
    "dirname":  "/path/to/backup/storing",
    "filename": "my-files-%Y%m%d-%H%i",
    "compress": "bzip2"
  }
}

Дополнительная настройки

Для удаления старых бэкапов и выгрузки архивных копий необходимо в настройку добавить две директивы: cleanup и sync

"syncs": [
  {
    "type": "ftp",
    "options": {
      "host": "backup-stroing-server.com",
      "user": "adapter:environment:FTP_BACKUP_USER",
      "password": "adapter:environment:FTP_BACKUP_PASSWORD",
      "path": "/path/to/remote/ftp/storing/"
    }
  }
],
"cleanup": {
  "type": "stepwise",
  "options": {
    "daysToKeepAll":      10,
    "daysToKeepDaily":    10,
    "weeksToKeepWeekly":  1,
    "monthToKeepMonthly": 1,
    "yearsToKeepYearly":  1
  }
}

С #1 по #11 строки это настройка куда выгружаем файлы бэкапа. С #12 по #21 строки это правила чистки архивов. Данная конфигурация будет хранить 1 годовой архив, 1 месячный архив, 1 недельный, и архивы созданные в течении 10 дней.

Полный файл конфигурации PHPBU

{
  "verbose": true,
  "logging": [
    {
      "type": "json",
      "target": "backup/json.log"
    },
    {
      "type": "mail",
      "options": {
        "transport":       "smtp",
        "recipients":      "my@email.com",
        "sender.mail":     "adapter:environment:SMTP_BACKUP_USER",
        "smtp.host":       "smtp.yandex.ru",
        "smtp.port":       "465",
        "smtp.username":   "adapter:environment:SMTP_BACKUP_USER",
        "smtp.password":   "adapter:environment:SMTP_BACKUP_PASSWORD",
        "smtp.encryption": "ssl"
      }
    }
  ],
  "adapters": [
    {
      "type": "env",
      "name": "environment"
    }
  ],
  "backups": [
    {
      "name": "MySQL",
      "source": {
        "type": "mysqldump",
        "options": {
          "databases": "database_name",
          "user":      "adapter:environment:MYSQL_BACKUP_USER",
          "password":  "adapter:environment:MYSQL_BACKUP_PASSWORD"
        }
      },
      "target": {
        "dirname":  "/path/to/backup/storing",
        "filename": "mysql-database_name-%Y%m%d-%H%i.sql",
        "compress": "bzip2"
      },
      "syncs": [
        {
          "type": "ftp",
          "options": {
            "host": "backup-stroing-server.com",
            "user": "adapter:environment:FTP_BACKUP_USER",
            "password": "adapter:environment:FTP_BACKUP_PASSWORD",
            "path": "/path/to/remote/ftp/storing/"
          }
        }
      ],
      "cleanup": {
        "type": "stepwise",
        "options": {
          "daysToKeepAll":      10,
          "daysToKeepDaily":    10,
          "weeksToKeepWeekly":  1,
          "monthToKeepMonthly": 1,
          "yearsToKeepYearly":  1
        }
      }
    },
    {
    "name": "My Files",
    "source": {
      "type": "tar",
      "options": {
        "path": "/path/to/my/files/"
      }
    },
    "target": {
      "dirname":  "/path/to/backup/storing",
      "filename": "my-files-%Y%m%d-%H%i",
      "compress": "bzip2"
    },
    "syncs": [
      {
        "type": "ftp",
        "options": {
          "host": "backup-stroing-server.com",
          "user": "adapter:environment:FTP_BACKUP_USER",
          "password": "adapter:environment:FTP_BACKUP_PASSWORD",
          "path": "/path/to/remote/ftp/storing/"
        }
      }
    ],
    "cleanup": {
      "type": "stepwise",
        "options": {
          "daysToKeepAll":      10,
          "daysToKeepDaily":    10,
          "weeksToKeepWeekly":  1,
          "monthToKeepMonthly": 1,
          "yearsToKeepYearly":  1
        }
      }
    }
  ]
}

Запуск

phpbu --configuration=./phpbu.json

Запись для cron на выполнений каждый день в полночь

0 0 * * * . $HOME/.profile; /usr/local/bin/phpbu --configuration=/home/www/phpbu.json >> /home/www/phpbu.log 2>&1