Резевное копирование с backupninja и duplicity
Существует много способов для организации резервного копирования. Я использую связку backupninja и duplicity.
Установка и настройка резервного копирования руками
Настроим резервное копирование нашего RoR проекта. В первом приближении нам необходимо сохранить базу и статику. Код у нас в гите, поэтому резервную копию делать не будем. Резервную копию конфигурационных файлов добавим чуть позже (приложения и nginx). В качестве системы резервного копирования будем использовать связку backupninja и duplicity. Backupninja - это по сути упрощённый единый интерфейс командной строки к разнообразным утилитам резервного копирования. Написан целиком на bash. Установим и попробуем поиграться руками:
apt-get install backupninja duplicity
Потренируемся на кошках - сделаем сначала копию статики на локальном сервере, шифрование использовать не будем. Начнем со статики. Статика лежит у нас по адресу /home/webmaster/passport/shared/public/uploads
duplicity \
--no-encryption --volsize=1024 \
--include=/home/webmaster/passport/shared/public/uploads \
--exclude=/** / \
file:///home/webmaster/backups/passport
Бекап только каталога /home/webmaster/passport/shared/public/uploads без шифрования – размер тома =1024Mb, который сохраняется в локальной папке /home/webmaster/backups/passport Размер тома определяет какого размера временный файл будет создавать duplicity в файловой системе(по умолчанию создает этот файл в /tmp или /usr/tmp).По умолчанию(если не указана опция full) duplicity создает инкрементный бекап, но при запуске впервые duplicity создаст полный бекап. Просмотреть список файлов можно командой:
duplicity list-current-files file:///home/webmaster/backups/passport/
Проверка резервной копии
Восстановление резервной копии
Ansible
Итого в Ansible нам нужно сделать следующие шаги:
- Установить необходимое ПО (backupninja и duplicity)
- Настроить backupninja - незначительные правки в файле конфигурации, далее
- Настроить копирование общих файлов
- Настроить копирование БД и статики для проекта
Добавим в существующую систему каталогов файл staging/group_vars/backup.yml - для переменных роли
---
backup_items:
- passport
- brigzz
- edison
- erp
- store
Дополним staging.yml
- hosts: web
vars_files:
...
- staging/group_vars/backup.yml
roles:
...
- backup
Добавим роль backup с папками tasks и templates
# backup/tasks/main.yml
- name: Install backup system packages
apt:
name: "{{ item }}"
state: latest
with_items:
- duplicity
- backupninja
- name: Configure backupninja
template:
src="backupninja.conf.j2"
dest="/etc/backupninja.conf"
owner=root
group=root
mode=0000
- name: Make local backup general files
template:
src="1-main.dup.j2"
dest="/etc/backup.d/1-main.dup"
owner=root
group=root
mode=0000
- name: Make local backup all Postgesql files
template:
src="10-all.pgsql.j2"
dest="/etc/backup.d/10-{{ item }}.pgsql"
owner=root
group=root
mode=0000
with_items:
- "{{ backup_items }}"
- name: Make local backup project & db backup files
template:
src="9-project.dup.j2"
dest="/etc/backup.d/9-{{ item }}.dup"
owner=root
group=root
mode=0000
with_items:
- "{{ backup_items }}"
Отличие от дефолтного - только запрет отправления уведомлений по концу бэкапа
# roles/backup/templates/backupninja.config.j2
...
# even if all modules reported success. (default = yes)
reportsuccess = no
...
Все сценарии резервного копирования запускаются из /etc/backup.d по алфавиту (т.е. в очередности 1, ..., 10, 9 и т.д.)
# roles/backup/templates/1-main.dup.j2
options = --no-encryption
tmpdir = /home/backups/tmp
[gpg]
sign = no
signkey =
encryptkey =
password = no
[dest]
increments = 7
keep = 20
desturl = file:///home/{{ user }}/backups/
[source]
include = /etc/nginx/*.conf
include = /etc/nginx/sites-available/*
Следующим запускается сценарий резервного копирования БД
# roles/backup/templates/10-all.pgsql.j2
options = --no-encryption
tmpdir = /home/backups/tmp
[gpg]
sign = no
signkey =
encryptkey =
password = no
[dest]
increments = 7
keep = 20
desturl = file:///home/{{ user }}/backups/{{ item }}
[source]
include = /var/backups/pgsql/{{ item }}_staging.*
include = /home/{{ user }}/{{ item }}/shared/config/
include = /home/{{ user }}/{{ item }}/shared/public/*uploads
После БД копируются все файлы проекта + БД и складываются в соответствующую папку резервной копии проекта
# roles/backup/templates/9-project.dup.j2
options = --no-encryption
tmpdir = /home/backups/tmp
[gpg]
sign = no
signkey =
encryptkey =
password = no
[dest]
increments = 7
keep = 20
desturl = file:///home/{{ user }}/backups/{{ item }}
[source]
include = /var/backups/pgsql/{{ item }}_staging.*
include = /home/{{ user }}/{{ item }}/shared/config/
include = /home/{{ user }}/{{ item }}/shared/public/*uploads
Запуск и проверка руками:
backupninja -n -d
Облака
Прочее (шифрование и тд)
Ссылки
- https://help.ubuntu.com/community/DuplicityBackupHowto
- https://uname.pingveno.net/blog/index.php/post/2015/02/17/Set-up-files-and-database-incremental-backup-with-duplicity,-rsync,-and-backupninja-on-Debian
- https://habrahabr.ru/post/128710/
- https://kamaok.org.ua/?p=1093
- https://remizov.org/rezervnoe-kopirovanie-na-yandex-disk-pri-pomoshchi-backupninja.html
- https://github.com/sol1/backupninja/blob/master/examples/example.rsync
- https://labs.riseup.net/code/projects/backupninja/wiki/Rsync
Сделать
- Разнести по ролям (app, queue, db) в ансибле + перенастроить руками
- в Апп
- конфиги nginx
- остатки статики
- swissberry сайт - /home//swissberry
- ghost - /home/ghost/
- Queue
- minio
- DB
- db
- в Апп
- Добавить минио в бекап + просто копию
- Добавить копирование бекапов на С3
- Discourse ??