Бэкапы наше все — 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