CloudFlare DNS Backup

01 Dec 2015

CloudFlare хорош всем: и удобный интерфейс управления DNS, и кеширование сайтов, и даже защита от DDOS и проверки версии браузера.

Но есть в его бесплатной версии один недостаток - никаких гарантий, что завтра все продолжит работать также, как и сегодня. И если в платной можно выпросить какой-то SLA, неустойки и прочие, то с бесплатными в случае проблем - даже разговаривать не будут (в случае серъезных проблем).

Поэтому, при переносе важных сайтов на CloudFlare возникла мысль: “А что делать, если завтра CF перестанет отвечать?”

К счастью, CF предоставляет удобный API, с помощью которого можно получать, редактировать и удалять любую информацию, используемую в аккаунте.

Поэтому, берем в руки Python и пишем тулзу, которая будет выдергивать все DNS из аккаунта, превращать полученный JSON в файлы зон, понятные BIND и складывать их куда-нибудь себе. Например в гит.

Замечу, что поиск в интернете выдал лишь два готовых варианта такой тулзы, но одна из них в качестве npm пакета, а вторая на руби и без конвертирования - только голый JSON.

Поэтому, параллельно с написанием кода, появилось желание такой тулзой поделиться с общественностью (а равно и хороший шанс узнать, как же всё-таки писать python пакеты и деплоить их на pypi)

В результате, получаем пакет, который легко устанавливается командой

pip install cloudflaredns-backup

После установки пакет предоставляет нам библиотеку cloudflaredns_backup и утилиту cf-backup, ради которой он и ставится.

Простейший пример запуска:

cf-backup [email protected] CF_TOKEN -o output_dir

Потом мне этого показалось мало, и утилитка обзавелась ключом -z, в который можно либо передать имя зоны (можно использвать ключ несколько раз, как cf-backup -z example.com -z example2.com), либо передать список зон в кавычках, разделенные пробелом.

Потом разрешил не указывать директорию для файлов, а выводить просто на stdout, правда так и не придумал, кому могут понадобиться все зоны в одном файле.

cf-backup работает как в окружении Python2, так и Python3, единственная внешняя зависимость - модуль requests.

Исходники, предложения и правки принимаю с удовольствием на GitHub Пакет для скачивания доступен на PyPI