Raspberry Pi для резервного копирования в Google Drive

Медиацентр Raspberry Pi
Прос­нись, самурай, вре­мя делать бэкапы баз дан­ных! Но что­бы не разорить­ся на плат­ных сер­висах, я покажу, как прев­ратить Raspberry Pi Zero W за условные $10 в лич­ную бэкап‑машину, которая будет заливать фай­лы в бес­плат­ный Google Drive.

Вот что нам сегод­ня понадо­бит­ся:

  • 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.

Вот так выглядит этот самый «Linux»
Вот так выг­лядит этот самый «Linux»

Пе­ред тем как запихи­вать кар­точку в малину, нам нуж­но нем­ного нас­тро­ить опе­раци­онку. Давай нас­тро­им под­клю­чение к бес­про­вод­ному интерне­ту.

Фай­лы обя­затель­но редак­тируй какой‑нибудь тул­зой типа nano или vim, что­бы не накося­чить с тек­сто­вой кодиров­кой условным встро­енным в ОС блок­нотом. Соз­дай файл с наз­вани­ем wpa_supplicant.conf пря­мо в кор­не кар­точки. Содер­жание это­го фай­ла дол­жно быть сле­дующим.

country=DE
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
network={
ssid=«мой_вайфай»
scan_ssid=1
psk=«пароль_от_вайфая»
key_mgmt=WPAPSK
}

Ко­неч­но, замени мой_вайфай и пароль_от_вайфая на наз­вание и пароль от сво­ей сети WiFi. Нас­коль­ко я понял, эта вер­сия малины работа­ет толь­ко с бес­про­вод­ными сетями 2,4 ГГц.

Да­лее вклю­чи SSH на малине, так как управлять мы ей будем имен­но по SSH. Соз­дай пус­той файл в кор­не кар­точки с име­нем ssh. Можешь исполь­зовать коман­ду $ touch ssh.

Вот и все! Малина нас­тро­ена. Вставь кар­точку в малину и под­клю­чи ее к питанию! Убе­дись, что питание ты под­клю­чаешь в разъ­ем с помет­кой PWR. Пер­вый запуск малины зай­мет при­мер­но 90 секунд, ей нуж­но про­вес­ти пер­воначаль­ную нас­трой­ку.

Подключаемся к малине

Те­перь тебе нуж­но узнать IP-адрес малины. Можешь вос­поль­зовать­ся бес­плат­ной прог­раммой LanScan на macOS или любым ана­логом типа nmap на дру­гих плат­формах. Най­ди адрес с име­нем девай­са типа raspberry pi.

Те­перь ты можешь под­клю­чить­ся пря­мо к малине! И все по воз­духу! Под­клю­чись к поль­зовате­лю pi со стан­дар­тным паролем raspberry. Можешь вос­поль­зовать­ся коман­дой $ ssh [email protected]{IP_малины}.

Для безопас­ности поменяй стан­дар­тный пароль коман­дой $ sudo raspi-config. Пос­ле переза­пус­ти малину коман­дой $ sudo shutdown -r now.

В прин­ципе, можешь не вык­лючать вход на малину по паролю, если малина никог­да не будет дос­тупна из интерне­та. Но если хочешь на 100 % обе­зопа­сить свои бэкапы, то вклю­чи вход по SSH толь­ко по клю­чам, соз­дав файл ~/.ssh/authorized_keys на малине с SSH-клю­чом, а пос­ле перезаг­рузи малину.

Ну и не забудь выс­тавить PasswordAuthentication no в фай­ле нас­трой­ки SSH — /etc/ssh/ssh_config!

Те­перь ты офи­циаль­но в малине. Вре­мя писать скрип­ты бэкапа!

Зависимости бэкап-скрипта

Скрипт будет край­не прос­тым. Будем исполь­зовать тул­зу mongodump, что­бы заб­рать всю информа­цию из базы дан­ных в одну папоч­ку, а потом тул­зу drive, что­бы залить всю пре­лесть на Google Drive. Про­ще пареной репы!

За­пус­ти сле­дующие коман­ды на малине для уста­нов­ки drive.

$ wget https://github.com/odeke-em/drive/releases/download/v0.3.9/drive_armv6
$ sudo mv drive_armv6 /usr/bin/gdrive
$ sudo chmod +x /usr/bin/gdrive

За­меть, что мы уста­нав­лива­ем тул­зу имен­но для архи­тек­туры ARMv6. Теперь можешь написать $ gdrive version на малине, что­бы убе­дить­ся, что все сра­бота­ло.

Те­перь тебе нуж­но нас­тро­ить drive, что­бы он смог работать с опре­делен­ной пап­кой. Соз­дай пап­ку для бэкапов коман­дой $ mkdir ~/backups и пос­ле запус­ти коман­ду $ gdrive init ~/backups, что­бы зас­тавить drive син­хро­низи­ровать эту пап­ку. Скрипт выдаст тебе ссыл­ку, нуж­но будет авто­ризо­вать­ся в сер­висе через бра­узер (уже на сво­ем ком­пе, отку­да под­клю­чал­ся к малине).

Мо­жешь про­верить нас­трой­ку, про­писав коман­ду $ cat ~/.gd/credentials.json. Дол­жно выдать твои клю­чи авто­риза­ции.

info

Ес­ли ты исполь­зуешь какую‑то дру­гую базу дан­ных, а не Mongo, то про­игно­рируй все до сек­ции «Заг­ружа­ем дамп базы дан­ных в обла­ко». Прос­то убе­дись, что у тебя есть коман­да, которая поз­воля­ет тебе заг­ружать все дан­ные любимой базы дан­ных в опре­делен­ную пап­ку на малине. Эту пап­ку мы и будем заг­ружать в обла­ко.

Да, в этом руководс­тве я рас­ска­жу тебе толь­ко о Mongo. Ради крат­кости изло­жения и для показа­тель­нос­ти при­мера я решил выб­рать имен­но эту базу дан­ных.

Но и тут у нас будут неболь­шие проб­лемы из‑за огра­ничен­ности выб­ранно­го железа. На Raspberry Pi Zero далеко не уехать — про­цес­сор в нашей малине 32-бит­ный, а пос­ледняя Mongo запус­кает­ся лишь на 64-бит­ных сис­темах. Что же делать?

Пос­тупим очень хит­ро: за неиме­нием луч­шего решения вос­поль­зуем­ся прос­тым кос­тылем. Мы зас­тавим наш сер­вер, на котором уже уста­нов­лена Mongo, собирать дамп базы дан­ных — а потом будем его заг­ружать к себе в Google Drive.

По­чему бы нам прос­то тог­да не запус­кать все на сер­вере, раз уж на то пош­ло? Да потому что малина — это кибер­панк, который мы зас­лужили, а бэкапы всег­да дол­жны быть внеш­ними.

Создаем на сервере и качаем на малину дамп базы данных

Мы вос­поль­зуем­ся коман­дой mongodump пря­мо по SSH, что­бы сге­нери­ровать дамп, а потом коман­дой scp, что­бы этот дамп ска­чать.

info

Иг­норируй эту сек­цию, если исполь­зуешь не Mongo, а какую‑либо дру­гую базу дан­ных: тебе при­дет­ся написать свой собс­твен­ный скрипт получе­ния дам­па.

Сге­нери­руй на малине SSH-ключ коман­дой $ ssh-keygen -t rsa.

Возь­ми внут­реннос­ти ~/.ssh/id_rsa.pub с малины и добавь их в файл ~/.ssh/authorized_keys на сер­вере, где у тебя запуще­на Mongo.

От­лично! Теперь малина может под­клю­чать­ся к сер­веру по SSH! Поп­робуй зай­ти на сер­вер пря­мо с малины такой коман­дой:

$ ssh юзер_на_сервере@ip_адрес_сервера

Те­перь вый­ди из сер­вера коман­дой exit. Ты дол­жен быть все еще под­клю­чен к малине, но не к сво­ему сер­веру.

Поп­робуй запус­тить вот эту коман­ду пря­мо на малине:

$ ssh юзер_на_сервере@ip_адрес_сервера ‘mongodump —uri=»mongodb://юзер_монги:пароль_юзера_монги@localhost:27017/название_базы_данных» -o «/home/имя_юзера_на_сервере/backups/«‘

Не забудь заменить перемен­ные на нуж­ные для тебя в этой коман­де!

Чу­дес­но! База дам­панулась так, что аж стой­ки зат­рещали где‑нибудь в амстер­дам­ском датацен­тре! Теперь поп­робуй ска­чать этот дамп сле­дующей коман­дой:

$ scp -r юзер_на_сервере@ip_адрес_сервера:/home/юзер_на_сервере/backups ~/backups/

Кру­тота! Теперь у тебя есть дамп тво­ей базы дан­ных локаль­но на малине. Тех­ничес­ки можешь пря­мо тут и хра­нить свои дам­пы — но я бы посове­товал тебе запуль­нуть их все‑таки куда‑то в обла­ко. Сегод­ня ты научишь­ся заг­ружать фай­лы в Google Drive авто­мати­чес­ки!

Загружаем дамп базы данных в облако

Так как мы уже нас­тро­или drive выше, все, что нам нуж­но сде­лать — это про­верить, заг­ружа­ется ли наша пап­ка в Google Drive сле­дующей коман­дой.

$ gdrive push -destination Backups/ ~/backups/*

info

Вмес­то Google Drive мож­но исполь­зовать любое хра­нили­ще дан­ных в обла­ке. Можешь вмес­то drive вооб­ще вос­поль­зовать­ся rclone, что­бы гру­зить фай­лы куда угод­но: эта тул­за под­держи­вает боль­ше 40 раз­ных облачных хра­нилищ пря­мо из короб­ки.

Пишем скрипт

Соз­дать дамп базы дан­ных мы можем, качать этот дамп вруч­ную тоже уме­ем, заг­ружать его в обла­ко тоже. Вре­мя написать скрипт, который будет все это делать за нас!

Соз­дай файл ~/backup.sh на малине со сле­дующим содер­жани­ем, заменяя все перемен­ные на нуж­ные.

#!/bin/bash
# 1
timestamp=$(date +%s)
# 2
ssh юзер_на_сервере@ip_адрес_сервера ‘mongodump —uri=»mongodb://юзер_монги:пароль_юзера_монги@localhost:27017/название_базы_данных» -o «/home/юзер_на_сервере/backups/«‘ &&
mkdir -p «/home/pi/backups/$timestamp« &&
# 3
scp -r юзер_на_сервере@ip_адрес_сервера:/home/юзер_на_сервере/backups/* «/home/pi/backups/$timestamp« &&
# 4
ssh юзер_на_сервере@ip_адрес_сервера ‘rm -r /home/юзер_на_сервере/backups’ &&
# 5
gdrive new -folder «Backups/$timestamp« &&
# 6
gdrive push -quiet «/home/pi/backups/$timestamp« &&
# 7
rm -r /home/pi/backups/* &&
# 8
curl «https://api.telegram.org/bot123:ABCDE/sendMessage?chat_id=твой_телеграм_айди&text=🥧 backed up»

Не забудь запус­тить коман­ду $ sudo chmod +x ~/backup.sh, что­бы дать поль­зовате­лю пра­ва запус­кать этот скрипт. Рас­ска­жу нем­ного о самом фай­ле.

Пер­вая стро­ка это­го фай­ла прос­то говорит раз­ным тек­сто­вым редак­торам, что перед нами файл на bash.

  1. По­луча­ем текущее вре­мя в мил­лисекун­дах. Мы будем исполь­зовать этот тай­мстамп для соз­дания папок типа Backups/1602463694, что­бы понимать, ког­да при­мер­но были соз­даны бэкапы. Мы получа­ем текущий тай­мстамп (нап­ример, 1602463694) пря­мо тут.
  2. Соз­даем дамп базы дан­ных на сер­вере при помощи mongodump.
  3. Заг­ружа­ем этот дамп на малину.
  4. Те­перь нам нуж­но уда­лить этот дамп с сер­вера, что­бы лиш­ний раз его не засорять. Мы уже заг­рузили копию на малину, чего ж нам этот дамп еще и на сер­вере хра­нить?
  5. По какой‑то при­чине нам нуж­но сна­чала соз­дать пап­ку с тай­мстам­пом на Google Drive перед тем, как жать на боль­шую кноп­ку «син­хро­низи­ровать». Ничего страш­ного, мы и это уме­ем!
  6. Заг­ружа­ем пап­ку с дам­пом бэкапа в обла­ко! Найс!
  7. Пос­ле заг­рузки дам­па в обла­ко уда­лим его с малины. Смыс­ла забивать кар­точку памяти в малине тоже мало.
  8. Не­боль­шой бонус — это отправ­ка себе сооб­щения в «Телег­раме» о том, что таинс­тво бэкапа свер­шилось. Тех­ничес­ки ты заметишь, если вне­зап­но сооб­щения о бэкапах перес­танут при­ходить тебе от бота. Не забудь заменить здесь токен бота!

Мо­жешь поп­робовать запус­тить этот скрипт вруч­ную коман­дой ~/.backup.sh. Дол­жно получить­ся! А Telegram дол­жен начать при­сылать сооб­щения при­мер­но как ниже на скрин­шоте.

Автоматизируем запуск скрипта

В интерне­те пол­но руководств по сron. Им мы и вос­поль­зуем­ся! Вкрат­це, это шту­ка в Linux, которая может с опре­делен­ной пери­одич­ностью запус­кать скрип­ты. В нашем слу­чае мы будем запус­кать скрипт ~/.backup.sh каж­дый час.

Син­таксис опи­сания интерва­лов понача­лу может казать­ся необыч­ным. Советую поль­зовать­ся конс­трук­торами типа Crontab Generator, что­бы соз­давать крон­табы.

От­крой спи­сок пери­оди­чес­ких задач при помощи коман­ды crontab -e и добавь туда сле­дующую стро­ку.

0 * * * * /home/pi/backup.sh

Заключение

Вот и все, самурай! Ты пот­ратил все­го где‑то час‑два вре­мени, а на выходе у тебя хакер­ская при­бам­баса, которую ты можешь сме­ло вты­кать у себя дома где‑нибудь око­ло роуте­ра.

При желании ты можешь заменить любой эле­мент на дру­гую тул­зу, которая тебе боль­ше нра­вит­ся. Не хочешь исполь­зовать малину? Можешь то же самое запус­тить на любой машине с Linux, в том чис­ле уда­лен­ной. Не поль­зуешь­ся Mongo? Исполь­зуй любую дру­гую базу дан­ных. Не нра­вит­ся Google Drive? Заливай бэкапы куда угод­но, хоть на флеш­ку или хард локаль­но.

РЕКОМЕНДУЕМ:
Файловый сервер с блокировкой рекламы из Raspberry Pi и Pi Hole

И не забудь добавить еще каких‑нибудь полез­ных скрип­тов во имя авто­мати­зации все­го и вся!

Звёзд: 1Звёзд: 2Звёзд: 3Звёзд: 4Звёзд: 5 (2 оценок, среднее: 5,00 из 5)
Загрузка...
Понравилась статья? Поделиться с друзьями:
Добавить комментарий