boring_backup/docs/boring-backup.1.rst

396 lines
24 KiB
ReStructuredText
Raw Normal View History

2022-05-16 22:30:18 +03:00
=============
boring-backup
=============
2022-05-14 00:20:02 +03:00
2022-05-15 11:41:15 +03:00
---------------------------
backup files and databases.
---------------------------
2022-05-14 00:20:02 +03:00
2022-05-15 11:41:15 +03:00
:Author: ge
2022-05-14 00:20:02 +03:00
:Copyright: \(C) 2022, ge <https://nixhacks.net/>, GPLv3+
2022-05-15 11:41:15 +03:00
:Date: 2022 May 15
2022-05-14 00:20:02 +03:00
:Manual section: 1
2022-05-15 11:41:15 +03:00
:Version: baf 0.0.1
2022-05-14 00:20:02 +03:00
Синопсис
--------
2022-05-16 22:30:18 +03:00
``boring-backup`` [-cvlhV] FILES..
2022-05-14 00:20:02 +03:00
Описание
--------
2022-05-16 22:30:18 +03:00
boring-backup - это расширяемая утилита для резервного копирования на основе сценариев Bash. По умолчанию предусмотрено создание резервных копий файлов с помощью ``tar`` и дампов баз данных MySQL/MariaDB и PostgreSQL.
2022-05-14 00:20:02 +03:00
Опции
-----
2022-05-15 11:41:15 +03:00
-c, --config config file.
-v, --verbose verbose output.
-l, --log-file log file.
-h, --help print this help messagea and exit.
-V, --version print version and exit.
2022-05-14 00:20:02 +03:00
2022-05-15 11:41:15 +03:00
Быстрый старт
-------------
2022-05-14 00:20:02 +03:00
2022-05-16 22:30:18 +03:00
boring-backup можно рассматривать как небольшой фреймворк/библиотеку для создания сценариев резервного копирования. boring-backup не реализует собственный язык сценариев, а полагается на Bash. В любом варианте применения утилита требует написания сценария для выполнения бэкапа.
2022-05-14 00:20:02 +03:00
2022-05-15 11:41:15 +03:00
В сценариях можно использовать переменные и функции. Сценарий импортируется в основной скрипт с помощью команды ``source`` (см. ``bash``\(1) п. SHELL BUILTIN COMMANDS).
2022-05-14 00:20:02 +03:00
Простейший сценарий резервного копирования выглядит следующим образом::
sources=('file:/home/user')
targets=('file:/var/backup')
2022-05-16 22:30:18 +03:00
Здесь массивы `sources` и `targets` определяют точки или поинты (`points`) резервного копирования — источники (`sources`) и назначения (`targets`). Это основные сущности, с которыми работает boring-backup. Вот некоторые особенности поинтов:
2022-05-14 00:20:02 +03:00
2022-05-15 11:41:15 +03:00
- Все поинты указываются в формате URI. Описание URI также есть в этой документации ниже.
- Поинты могут указывать как на локальные (размещённые на текущей машине), так и на удалённые (размещённые на удалённой машине) ресурсы.
2022-05-14 00:20:02 +03:00
- Можно указать как несколько источников, так и несколько назначений.
Для выполнения бэкапа директорий или отдельных файлов применяется схема URI `file`. В схеме `file` нельзя указать директорию, размещённую на удалённом хранилище (за исключением случая, когда удалённое хранилище примонтировано как файловая система), для этого используйте другие схемы. В примере выше будет выполнена резервная копия локальной директории /home/user в другую локальную директорию /var/backup. Поскольку в сценарии из примера нет ничего, кроме указания точек `sources` и `targets`, бэкап будет выполнен с параметрами по умолчанию: директория /home/user будет заархивирована с помощью утилиты ``tar``\(1), архив будет сжат с помощью утилиты ``gzip``\(1) и помещён в директорию /var/backup. Имя архива будет сложено из строки::
2022-05-15 12:01:14 +03:00
${prefix}${name}${date_fmt}${name_ext}
2022-05-14 00:20:02 +03:00
2022-05-15 11:41:15 +03:00
Описание переменных см. в разделе ПЕРЕМЕННЫЕ. Пример имени файла::
2022-05-14 00:20:02 +03:00
2022-05-15 11:41:15 +03:00
example.sh_example_20220515-0953.tar.gz
2022-05-14 00:20:02 +03:00
Обзор URI
---------
Источники (`sources`) и назначения (`targets`) должны быть указаны в виде URI. Это позовляет наглядно в одной сроке видеть весь набор данных. Парсер реализует поддержку следующего синтаксиса URI::
2022-05-14 20:06:42 +03:00
scheme:[//[username[:password]@]hostname[:port]]/[path]?[query]#[fragment]
2022-05-14 00:20:02 +03:00
2022-05-15 11:41:15 +03:00
Парсер URI соответствует RFC 3986 не полностью - разбиение на составные части URI происходит верно, но интерпретация в отдельных ситуациях может отличаться. См. примеры URI и реузультаты их интерпретации парсером в файле `tests/parse_uri.bats`. На практике рекомендую придерживаться примеров, которые приведены ниже и в файле `tests/parse_uri.bats`. В случае, если изменение логики парсера необходимо, вы можете прислать правки в pull-реквесте или завести feature-реквест в репозитории проекта. На текущий момент компоненты `query` и `fragment` не используются.
2022-05-14 00:20:02 +03:00
Примеры URI для массива `sources`::
mysql://wordpress:1jobrRRjtLYs@localhost/wordpress
postgres://django:9%3F2%3D%40gHW@localhost:5432:/django
sqlite:///var/www/app/data/database.db
file:///var/www/html/
Примеры URI для `targets`::
file:/var/backup
ftp://jhon:%24t%D0%AFo%7C%5C%7C6@[fe80::5054:ff:fe24:382]:2021/backups/
rsync://backup_user@192.168.3.12:2022/backups
s3://my_bucket
2022-05-15 11:41:15 +03:00
Пароли содержащие специальные символы недопустимые в URI (включая пробелы) необходимо закодировать в percent code. См. примеры кодирования строки на разных языках программирования ниже.
2022-05-14 00:20:02 +03:00
Python 2::
python2 -c "import urllib, sys; print urllib.quote(sys.argv[1], safe='')" 'PA$$WORD'
Python 3::
python3 -c "import urllib.parse, sys; print(urllib.parse.quote(sys.argv[1], safe=''))" 'PA$$WORD'
Perl 5::
echo 'PA$$WORD' | perl -MURI::Escape -wlne 'print uri_escape $_'
Поддерживаемые протоколы и схемы URI
------------------------------------
Схемы, которые могут быть использованы как sources
``````````````````````````````````````````````````
file
Может содержать путь к локальному файлу или директории. Файлы архивируются при помощи ``tar`` и по умолчанию сжимаются с помощью ``gzip``. Примеры::
file:/var/www/html
file:///home/jhon/cool_stuff.txt
2022-05-16 22:30:18 +03:00
2022-05-15 11:41:15 +03:00
Не используйте двойной слэш для этой схемы, используйте один или три слэша. Двойной слэш означает наличие компонента Authority, это приводит к неверной интерпретации адреса.
2022-05-16 22:30:18 +03:00
2022-06-07 22:04:57 +03:00
См. также ``handler::tar``
2022-05-14 00:20:02 +03:00
mysql
URI содержит реквизиты для подключения к БД MySQL/MariaDB. Формат::
mysql://[username[:password]@]hostname[:port]/database
2022-05-15 11:41:15 +03:00
С помощью утилиты ``mysqldump``\(1) формируется дамп в формате SQL, файл по умолчанию сжимается утилитой ``gzip``.
2022-06-07 22:04:57 +03:00
См. также ``handler::mysqldump``
2022-05-14 00:20:02 +03:00
postgres
2022-05-15 11:41:15 +03:00
Аналогично `mysql`, но для PostgreSQL. Для создания дампа используется ``pg_dump``\(1), файлы по умолчанию сохраняются с расширением .psql.gz.
2022-06-07 22:04:57 +03:00
См. также ``handler::pg_dump``
2022-05-14 00:20:02 +03:00
sqlite
Схема для баз данных SQLite. Ничем не отличается от `file`, добавлена для наглядного обозначения, что источником является БД SQLite, а не иной файл.
2022-05-16 22:30:18 +03:00
2022-06-07 22:04:57 +03:00
См. также ``handler::sqlite``
2022-05-14 00:20:02 +03:00
Схемы, которые могут быть использованы как targets
``````````````````````````````````````````````````
file
2022-05-15 11:41:15 +03:00
В контексте `targets` указывает директорию для сохранения бэкапов. В массиве `targets` обязательно должен быть хотя бы один поинт со схемой `file`. Этот поинт будет использован как основной и сохранён в переменные ``__main_target`` (содержит URI) и ``__main_target_path`` (path). Если в массиве присутствует несколько поинтов со схемой `file`, то в качестве основного будет выбран первый по порядку поинт. Все бэкапы первоначально будут сохраняться в директорию ``__main_target_path`` и затем копироваться в другой таргет с помощью соответствующего обработчика. В случае копировани из одной директории в другую используется утилита ``cp``\(1).
Избегайте указания в одном сценарии таргетов, которые ведут одновременно на примонтированный к локальной машине сетевой диск и другое удалённое хранилище. В таком случае архивы будут создаваться на сетевом диске и далее снова копироваться по сети, что будет очень медленно.
2022-06-07 22:04:57 +03:00
См. также ``handler::cp``
2022-05-14 00:20:02 +03:00
ftp
2022-05-15 11:41:15 +03:00
Не реализовано.
2022-05-14 00:20:02 +03:00
sftp
2022-05-15 11:41:15 +03:00
Не реализовано.
2022-05-14 00:20:02 +03:00
rsync
2022-05-15 11:41:15 +03:00
Не реализовано.
2022-05-14 00:20:02 +03:00
s3
2022-05-15 11:41:15 +03:00
Не реализовано.
2022-05-14 00:20:02 +03:00
swift
2022-05-15 11:41:15 +03:00
Не реализовано.
2022-05-14 00:20:02 +03:00
sj
2022-05-15 11:41:15 +03:00
Не реализовано.
2022-05-14 00:20:02 +03:00
dav, davs
2022-05-15 11:41:15 +03:00
Не реализовано.
2022-05-14 00:20:02 +03:00
Создание резервных копий
------------------------
2022-06-07 22:04:57 +03:00
boring-backup предполагает, что для всех резервных копий необходимо создавать архивы. Поэтому вам нужно следить за тем, чтобы в локальном хранилище всегда хватало дискового пространства для создания новых архивов. boring-backup также не удаляет старые архивы и вам также надо позаботиться об удалении устаревших резервных копий. Изменить это поведение можно с помощью пользовательских функций в сценариях. В этом разделе речь пойдёт о поведении, которое установлено по умолчанию. См. функции ``builtin_backup``, ``process_sources``, ``process_targets``.
2022-05-14 00:20:02 +03:00
Базовая концепция строится на том, что существует несколько точек источников и несколько точек назначения. Создаётся резервная копия источника и копируется в точку назначения.
Для всех источников в сценарии выполняется локальная резервная копия. После этого локальная копия переносится в удалённые точки назначения, если они заданы. Копирование локального бэкапа будет осуществлёно столько раз, сколько точек назначения задано. В каждом сценарии обязательно должен быть задан хотя бы один источник и одна точка назначения. При этом в списке точек назначения обязательно должна присутствовать точка со схемой `file`. Именно в неё будут сохранены архивы.
Пример. Имеется следующий сценарий::
sources=(
'mysql://wordpress:1jobrRRjtLYs@localhost/wordpress'
'file:///var/www/wordpress'
)
targets=(
'file:///var/backup'
'ftp://jhon:%24t%D0%AFo%7C%5C%7C6@[fe80::5054:ff:fe24:382]:2021/backups/'
)
2022-05-16 22:30:18 +03:00
Здесь будут созданы архивы файлов и базы данных и сохранены в локальную директорию /var/backup. Затем эти файлы будут переданы по протоколу FTP на сервер fe80::5054:ff:fe24:382 в директорию /backups. Файлы из директории /var/backup не будут удалены или перемещены. Если добавить дополнительную точку назначения, то файлы из /var/backup будут скопированы и туда. Обратите внимание, что boring-backup не выполняет повторного создания архивов для каждой точки назначения — архивы создаются один раз и далее распространяются по всем указанным назначениям. Если в массиве `targets` имеется несколько точек назначения со схемой `file`, то архивы будут сохранены в первую по порядку точку, а затем скопированы оттуда в остальные.
2022-05-14 00:20:02 +03:00
Резервное копирование на удалённое хранилище
--------------------------------------------
FTP
```
SFTP
````
Rsync over SSH
``````````````
Rsync with rsyncd
`````````````````
Amazon S3
`````````
S3 compatible storage
`````````````````````
OpenStack Swift
```````````````
Storj DCS
`````````
WebDAV
``````
2022-05-14 20:06:42 +03:00
Переменные
----------
2022-06-07 22:04:57 +03:00
``boring-backup`` условно разделяет переменные на "внутренние" ("защищённые") и "обычные". К "защищённым" переменным относятся все перемеменные, имена которых начинаются с двух знаков подчёркивания, например: ``__main_target``. Все остальные переменные считаются "обычными".
2022-05-15 11:41:15 +03:00
Обычные переменные могут быть перезаписаны в пользовательском скрипте. Защищённые переменные технически ничем от них не отличаются, однако не нужно переопределять такие переменные в пользовательском скрипте, так как это может привести к неожиданным ошибкам во время выполнения скрипта. Точно также очень внимательно нужно относится к перезаписи обычных переменных — в обоих случаях есть риск что-то поломать.
``backups``
Массив со списком созданных бэкапов. Содержит абсолютные пути к файлам. Заполняется функциями-обработчиками `sources`.
2022-06-07 22:04:57 +03:00
Тип: массив
2022-05-15 11:41:15 +03:00
Умолчание: ()
``errors``
2022-06-07 22:04:57 +03:00
Массив с текстами ошибок. Заполняется функцией ``err`` с опцией ``-a``.
2022-05-14 20:06:42 +03:00
2022-06-07 22:04:57 +03:00
Тип: массив
2022-05-15 11:41:15 +03:00
Умолчание: ()
2022-05-14 20:06:42 +03:00
2022-05-15 11:41:15 +03:00
``log_date_fmt``
Формат даты в логе. См. ``date``\(1).
2022-05-14 20:06:42 +03:00
2022-06-07 22:04:57 +03:00
Тип: строка
2022-05-15 11:41:15 +03:00
Умолчание: %d/%b/%Y:%H:%M:%S %z
2022-05-14 20:06:42 +03:00
2022-05-15 11:41:15 +03:00
``name_prefix``
Префикс имени файла. Может быть задан в скрипте.
2022-06-07 22:04:57 +03:00
Тип: строка
2022-05-15 11:41:15 +03:00
Умолчание: имя_скрипта\_
``name``
Соответствует имени архивируемой директории/файла полученного из `path` с помощью утилиты ``basename``\(1).
2022-06-07 22:04:57 +03:00
Тип: строка
2022-05-15 11:41:15 +03:00
Умолчание: нет
``name_date_fmt``
Дата, интерпретируемая утилитой ``date``\(1).
2022-06-07 22:04:57 +03:00
Тип: строка
2022-05-15 11:41:15 +03:00
Умолчание: _%Y%m%d-%H%M
``name_ext``
Расширение имени файла, соответствующее формату архива.
2022-06-07 22:04:57 +03:00
Тип: строка
2022-05-15 11:41:15 +03:00
Умолчание: .tar.gz
``tar_options``
2022-06-07 22:04:57 +03:00
Опции ``tar``. См. ``tar``\(1).
2022-05-15 11:41:15 +03:00
2022-06-07 22:04:57 +03:00
Тип: строка
2022-05-15 11:41:15 +03:00
Умолчание: -acf
2022-06-07 22:04:57 +03:00
``tar_exclude``
Список имён для опции ``tar`` ``--exclude``.
Тип: массив
Умолчание: нет
``compression``
В контексте ``tar`` работа этой фичи базируется на опции ``tar`` ``--auto-compress``. Переменная может принимать значения, в соответствии с табилцей ниже. Если переменная имеет значение, отличное от перечисленныых, то будет использован ``gzip``.
2022-05-15 11:41:15 +03:00
======================== ================ ========
Значение tar_compression Расширение файла Утилита
======================== ================ ========
gzip, gz .tar.gz gzip
tgz .tgz gzip
taz .taz gzip
compress, Z .tar.Z compress
taZ .taZ compress
bzip2, bz2 .tar.bz2 bzip2
tz2 .tz2 bzip2
tbz2 .tbz2 bzip2
tbz .tbz bzip2
lzip, lz .tar.lz lzip
lzma .tar.lzma lzma
tlz .tlz lzma
lzop, lzo .tar.lzo lzop
xz .tar.xz xz
zstd, zst .tar.zst zstd
tzst .tzst zstd
======================== ================ ========
2022-05-14 20:06:42 +03:00
Функции
-------
2022-05-15 11:41:15 +03:00
``backup``
2022-06-07 22:04:57 +03:00
Пользовательская функция резервного копирования. Если она задана в скрипте, то вызывается вместо ``builtin_backup``.
2022-05-15 11:41:15 +03:00
``builtin_backup``
2022-06-07 22:04:57 +03:00
Встроенная функция, запускает резервное копирвоание. Вызывает функции ``process_source`` и ``process_target``.
2022-05-15 11:41:15 +03:00
``err [-eao] MESSAGE``
Печатает сообщение об ошибке MESSAGE на экран и в лог и выполняет обработку ошибок.
2022-05-16 22:30:18 +03:00
2022-05-15 11:41:15 +03:00
-e Выйти из скрипта с кодом выхода 1.
-a Добавить сообщение MESSAGE в массив ``errors``.
2022-06-07 22:25:15 +03:00
-o Вызвать функцию ``on_error``.
2022-05-15 11:41:15 +03:00
``finalise``
2022-06-07 22:04:57 +03:00
Пользовательская функция. Если задана, то запускается после функции ``backup`` или ``builtin_backup()``.
2022-05-15 11:41:15 +03:00
``gen_backup_name FILE_EXT``
Печатает полученное имя файла в STDOUT. Имя является выводом команды ``date`` и строки ``${prefix}${name}${date_fmt}${name_ext}``. См. переменные ``name_prefix``, ``name``, ``name_date_fmt``, ``name_ext``.
``try COMMAND``
2022-06-07 22:25:15 +03:00
Функция выполняет команду COMMAND и в случае ненулевого кода выхода вызывает ``err()`` с ключами ``-eao``. Ошибка при выполнении COMMAND приведёт к вызову функции ``on_error``. Рекомендуется для использования в качестве обёртки для команд правильное выполнение которых критично.
2022-05-15 11:41:15 +03:00
2022-06-07 22:04:57 +03:00
``handler::tar URI``
Архивация файлов с помощью ``tar``.
2022-05-15 11:41:15 +03:00
2022-06-07 22:04:57 +03:00
``handler::mysqldump URI``
Не реализовано.
2022-05-15 11:41:15 +03:00
2022-06-07 22:04:57 +03:00
``handler::pg_dump URI``
Не реализовано.
2022-05-15 11:41:15 +03:00
2022-06-07 22:04:57 +03:00
``handler::sqlite URI``
Не реализовано.
2022-05-15 11:41:15 +03:00
2022-06-07 22:04:57 +03:00
``handler::cp URI``
2022-05-15 11:41:15 +03:00
Копирует файлы в новое назначение с помощью ``cp``.
2022-06-07 22:04:57 +03:00
``handler::ftp URI``
2022-05-15 11:41:15 +03:00
Не реализовано.
2022-06-07 22:04:57 +03:00
``handler::sftp URI``
2022-05-15 11:41:15 +03:00
Не реализовано.
2022-06-07 22:04:57 +03:00
``handler::rsync URI``
2022-05-15 11:41:15 +03:00
Не реализовано.
2022-06-07 22:04:57 +03:00
``handler::s3 URI``
2022-05-15 11:41:15 +03:00
Не реализовано.
2022-06-07 22:04:57 +03:00
``handler::sj URI``
2022-05-15 11:41:15 +03:00
Не реализовано.
2022-06-07 22:04:57 +03:00
``handler::swift URI``
2022-05-15 11:41:15 +03:00
Не реализовано.
2022-06-07 22:04:57 +03:00
``handler::dav URI``
2022-05-15 11:41:15 +03:00
Не реализовано.
2022-06-07 22:04:57 +03:00
``handler::davs URI``
2022-05-15 11:41:15 +03:00
Не реализовано.
2022-06-07 22:04:57 +03:00
``is_installed COMMAND``
Проверяет установлена ли программа COMMAND.
``is_function_set FUNCTION``
Проверяет задана ли функция FUNCTION.
``log [-p] MESSAGE``
Печатает лог в файл ``__log_file`` (лог задаётся опцией --log-file) и на экран, если указана опция ``-p``. Формат даты в логе можно изменить с помощью переменной ``log_date_fmt``.
``on_error``
Пользовательская функция для обработки ошибок. Если задана, то запускается при обработке ошибки в функции ``err`` с опцией ``-o``.
``parse_uri URI``
Парсер URI. Задаёт переменные ``scheme``, ``username``, ``password``, ``hostname``, ``port``, ``path``, ``query``, ``fragment`` и выполняет декодинг пароля, если он закодирован в percent code.
``prepare``
Пользовательская функция. Если задана, то запускается до функции ``backup`` или ``builtin_backup``.
``process_source URI``
На основе схемы запускает соответсвующую функцию-обработчик.
``process_target URI``
На основе схемы запускает соответсвующую функцию-обработчик.
``source_script FILE``
Выполняет ``source`` пользовательского скрипта и проверяет его корректность. Проверяется синтаксис Bash, наличие непустых массивов `sources` и `targets`, наличие поинта `file` в `targets`. Во вспомогательной функции ``validate_targets`` задаются значения переменных ``__main_target`` и ``__main_target_path``.
2022-05-14 00:20:02 +03:00
Использование функций в сценариях
---------------------------------
2022-05-16 22:30:18 +03:00
Переменные окружения
--------------------
2022-06-07 22:04:57 +03:00
``LIBRARY``
2022-05-16 22:30:18 +03:00
Путь до библиотеки функций boring-backup.
2022-05-15 11:41:15 +03:00
Примеры
-------
См. также
---------
2022-05-14 00:20:02 +03:00
2022-05-15 11:41:15 +03:00
``bash``\(1), ``tar``\(1), ``cp``\(1), ``date``\(1), ``mysqldump``\(1), ``pg_dump``\(1)
2022-05-14 00:20:02 +03:00
RFC 3986 https://datatracker.ietf.org/doc/html/rfc3986