Вот что нам сегодня понадобится:
- Raspberry Pi Zero W (придется купить);
- кабель micro USB (у тебя он уже валяется где‑то);
- порт USB, выдающий минимум 1 А (в любом компе такой есть, да и кирпичик‑зарядка от старого телефона у тебя тоже где‑то валяется);
- карточка microSD (опять же, приберись на полках, там валяется минимум 4 Гбайта памяти).
РЕКОМЕНДУЕМ:
Медиацентр из Raspberry Pi
Идея в том, чтобы один раз потратиться на малинку и получить полностью автономный девайс, который можно врубить куда угодно — и он будет делать что‑нибудь полезное. Например, бэкапы базы данных.
Готовим Raspberry Pi
Сначала скачай программу Etcher и образ Raspberry Pi OS lite без рабочего стола. Рабочие столы?! Там, куда мы направляемся, не нужны рабочие столы!
info
Я все это запускаю на macOS, но действия, описанные в этом руководстве, применимы и на других операционных системах.
Вставь microSD-карточку в компьютер, запусти Etcher и залей скачанный образ Raspberry Pi OS на карточку.
Достань карточку и вставь обратно. Она должна появиться диском под именем boot.
Перед тем как запихивать карточку в малину, нам нужно немного настроить операционку. Давай настроим подключение к беспроводному интернету.
Файлы обязательно редактируй какой‑нибудь тулзой типа nano или vim, чтобы не накосячить с текстовой кодировкой условным встроенным в ОС блокнотом. Создай файл с названием wpa_supplicant.<wbr />conf прямо в корне карточки. Содержание этого файла должно быть следующим.
Конечно, замени мой_вайфай и пароль_от_вайфая на название и пароль от своей сети WiFi. Насколько я понял, эта версия малины работает только с беспроводными сетями 2,4 ГГц.
Далее включи SSH на малине, так как управлять мы ей будем именно по SSH. Создай пустой файл в корне карточки с именем ssh. Можешь использовать команду $ <wbr />touch <wbr />ssh.
Вот и все! Малина настроена. Вставь карточку в малину и подключи ее к питанию! Убедись, что питание ты подключаешь в разъем с пометкой PWR. Первый запуск малины займет примерно 90 секунд, ей нужно провести первоначальную настройку.
Подключаемся к малине
Теперь тебе нужно узнать IP-адрес малины. Можешь воспользоваться бесплатной программой LanScan на macOS или любым аналогом типа nmap на других платформах. Найди адрес с именем девайса типа raspberry pi.
Теперь ты можешь подключиться прямо к малине! И все по воздуху! Подключись к пользователю pi со стандартным паролем raspberry. Можешь воспользоваться командой $ <wbr />ssh <wbr />pi@{<wbr />IP_малины}.
Для безопасности поменяй стандартный пароль командой $ <wbr />sudo <wbr />raspi-config. После перезапусти малину командой $ <wbr />sudo <wbr />shutdown <wbr />-r <wbr />now.
В принципе, можешь не выключать вход на малину по паролю, если малина никогда не будет доступна из интернета. Но если хочешь на 100 % обезопасить свои бэкапы, то включи вход по SSH только по ключам, создав файл ~/.<wbr />ssh/<wbr />authorized_keys на малине с SSH-ключом, а после перезагрузи малину.
Ну и не забудь выставить PasswordAuthentication <wbr />no в файле настройки SSH — /<wbr />etc/<wbr />ssh/<wbr />ssh_config!
Теперь ты официально в малине. Время писать скрипты бэкапа!
Зависимости бэкап-скрипта
Скрипт будет крайне простым. Будем использовать тулзу mongodump, чтобы забрать всю информацию из базы данных в одну папочку, а потом тулзу drive, чтобы залить всю прелесть на Google Drive. Проще пареной репы!
Запусти следующие команды на малине для установки drive.
Заметь, что мы устанавливаем тулзу именно для архитектуры ARMv6. Теперь можешь написать $ <wbr />gdrive <wbr />version на малине, чтобы убедиться, что все сработало.
Теперь тебе нужно настроить drive, чтобы он смог работать с определенной папкой. Создай папку для бэкапов командой $ <wbr />mkdir <wbr />~/<wbr />backups и после запусти команду $ <wbr />gdrive <wbr />init <wbr />~/<wbr />backups, чтобы заставить drive синхронизировать эту папку. Скрипт выдаст тебе ссылку, нужно будет авторизоваться в сервисе через браузер (уже на своем компе, откуда подключался к малине).
Можешь проверить настройку, прописав команду $ <wbr />cat <wbr />~/.<wbr />gd/<wbr />credentials.<wbr />json. Должно выдать твои ключи авторизации.
info
Если ты используешь какую‑то другую базу данных, а не Mongo, то проигнорируй все до секции «Загружаем дамп базы данных в облако». Просто убедись, что у тебя есть команда, которая позволяет тебе загружать все данные любимой базы данных в определенную папку на малине. Эту папку мы и будем загружать в облако.
Да, в этом руководстве я расскажу тебе только о Mongo. Ради краткости изложения и для показательности примера я решил выбрать именно эту базу данных.
Но и тут у нас будут небольшие проблемы из‑за ограниченности выбранного железа. На Raspberry Pi Zero далеко не уехать — процессор в нашей малине 32-битный, а последняя Mongo запускается лишь на 64-битных системах. Что же делать?
Поступим очень хитро: за неимением лучшего решения воспользуемся простым костылем. Мы заставим наш сервер, на котором уже установлена Mongo, собирать дамп базы данных — а потом будем его загружать к себе в Google Drive.
Почему бы нам просто тогда не запускать все на сервере, раз уж на то пошло? Да потому что малина — это киберпанк, который мы заслужили, а бэкапы всегда должны быть внешними.
Создаем на сервере и качаем на малину дамп базы данных
Мы воспользуемся командой mongodump прямо по SSH, чтобы сгенерировать дамп, а потом командой scp, чтобы этот дамп скачать.
info
Игнорируй эту секцию, если используешь не Mongo, а какую‑либо другую базу данных: тебе придется написать свой собственный скрипт получения дампа.
Сгенерируй на малине SSH-ключ командой $ <wbr />ssh-keygen <wbr />-t <wbr />rsa.
Возьми внутренности ~/.<wbr />ssh/<wbr />id_rsa.<wbr />pub с малины и добавь их в файл ~/.<wbr />ssh/<wbr />authorized_keys на сервере, где у тебя запущена Mongo.
Отлично! Теперь малина может подключаться к серверу по SSH! Попробуй зайти на сервер прямо с малины такой командой:
Теперь выйди из сервера командой exit. Ты должен быть все еще подключен к малине, но не к своему серверу.
Попробуй запустить вот эту команду прямо на малине:
Не забудь заменить переменные на нужные для тебя в этой команде!
Чудесно! База дампанулась так, что аж стойки затрещали где‑нибудь в амстердамском датацентре! Теперь попробуй скачать этот дамп следующей командой:
Крутота! Теперь у тебя есть дамп твоей базы данных локально на малине. Технически можешь прямо тут и хранить свои дампы — но я бы посоветовал тебе запульнуть их все‑таки куда‑то в облако. Сегодня ты научишься загружать файлы в Google Drive автоматически!
Загружаем дамп базы данных в облако
Так как мы уже настроили drive выше, все, что нам нужно сделать — это проверить, загружается ли наша папка в Google Drive следующей командой.
info
Вместо Google Drive можно использовать любое хранилище данных в облаке. Можешь вместо drive вообще воспользоваться rclone, чтобы грузить файлы куда угодно: эта тулза поддерживает больше 40 разных облачных хранилищ прямо из коробки.
Пишем скрипт
Создать дамп базы данных мы можем, качать этот дамп вручную тоже умеем, загружать его в облако тоже. Время написать скрипт, который будет все это делать за нас!
Создай файл ~/<wbr />backup.<wbr />sh на малине со следующим содержанием, заменяя все переменные на нужные.
Не забудь запустить команду $ <wbr />sudo <wbr />chmod <wbr />+x <wbr />~/<wbr />backup.<wbr />sh, чтобы дать пользователю права запускать этот скрипт. Расскажу немного о самом файле.
Первая строка этого файла просто говорит разным текстовым редакторам, что перед нами файл на bash.
- Получаем текущее время в миллисекундах. Мы будем использовать этот таймстамп для создания папок типа Backups/<wbr />1602463694, чтобы понимать, когда примерно были созданы бэкапы. Мы получаем текущий таймстамп (например, 1602463694) прямо тут.
- Создаем дамп базы данных на сервере при помощи mongodump.
- Загружаем этот дамп на малину.
- Теперь нам нужно удалить этот дамп с сервера, чтобы лишний раз его не засорять. Мы уже загрузили копию на малину, чего ж нам этот дамп еще и на сервере хранить?
- По какой‑то причине нам нужно сначала создать папку с таймстампом на Google Drive перед тем, как жать на большую кнопку «синхронизировать». Ничего страшного, мы и это умеем!
- Загружаем папку с дампом бэкапа в облако! Найс!
- После загрузки дампа в облако удалим его с малины. Смысла забивать карточку памяти в малине тоже мало.
- Небольшой бонус — это отправка себе сообщения в «Телеграме» о том, что таинство бэкапа свершилось. Технически ты заметишь, если внезапно сообщения о бэкапах перестанут приходить тебе от бота. Не забудь заменить здесь токен бота!
Можешь попробовать запустить этот скрипт вручную командой ~/.<wbr />backup.<wbr />sh. Должно получиться! А Telegram должен начать присылать сообщения примерно как ниже на скриншоте.
Автоматизируем запуск скрипта
В интернете полно руководств по сron. Им мы и воспользуемся! Вкратце, это штука в Linux, которая может с определенной периодичностью запускать скрипты. В нашем случае мы будем запускать скрипт ~/.<wbr />backup.<wbr />sh каждый час.
Синтаксис описания интервалов поначалу может казаться необычным. Советую пользоваться конструкторами типа Crontab Generator, чтобы создавать кронтабы.
Открой список периодических задач при помощи команды crontab <wbr />-e и добавь туда следующую строку.
Заключение
Вот и все, самурай! Ты потратил всего где‑то час‑два времени, а на выходе у тебя хакерская прибамбаса, которую ты можешь смело втыкать у себя дома где‑нибудь около роутера.
При желании ты можешь заменить любой элемент на другую тулзу, которая тебе больше нравится. Не хочешь использовать малину? Можешь то же самое запустить на любой машине с Linux, в том числе удаленной. Не пользуешься Mongo? Используй любую другую базу данных. Не нравится Google Drive? Заливай бэкапы куда угодно, хоть на флешку или хард локально.
РЕКОМЕНДУЕМ:
Файловый сервер с блокировкой рекламы из Raspberry Pi и Pi Hole
И не забудь добавить еще каких‑нибудь полезных скриптов во имя автоматизации всего и вся!