Compare commits
10 Commits
cbb41babd7
...
e9405ec41f
Author | SHA1 | Date | |
---|---|---|---|
e9405ec41f | |||
2517b4c965 | |||
d3b0941ed2 | |||
11f5e9380d | |||
857dceeb43 | |||
17ebb1d483 | |||
caaf315d9d | |||
92a0971c27 | |||
ea7783b1ef | |||
3e2249dbc1 |
22
README.md
22
README.md
@ -1,11 +1,21 @@
|
|||||||
# Памятки по «граблям» и просто полезные заметки, инструкции и самописные скрипты и доки
|
# Памятки по «граблям» и просто полезные заметки, инструкции и самописные скрипты и доки
|
||||||
|
|
||||||
## Docker
|
## Docker
|
||||||
* [Расположение образов Docker](docker-adjasting.md)
|
* [Расположение образов Docker](docker/docker-adjasting.md)
|
||||||
* [Контейнер MariaDB/MySQL](docker-mariadb.md)
|
* [Контейнер MariaDB/MySQL](docker/docker-mariadb.md)
|
||||||
* [Контейнер MySQL под Windows 10](docker-mysql-in-windows10.md)
|
* [Контейнер MySQL под Windows 10](docker/docker-mysql-in-windows10.md)
|
||||||
* [Развертывание VPN-сервера на базе MS SSTP](docker-sstp-vpn.md)
|
* [Развертывание VPN-сервера на базе MS SSTP](docker/docker-sstp-vpn.md)
|
||||||
* [Развертывание прокси базе Shadowsocks (сервер и клиент)](docker-shadowsocks.md)
|
* [Развертывание прокси базе Shadowsocks (сервер и клиент)](docker/docker-shadowsocks.md)
|
||||||
|
|
||||||
## Python
|
## Python
|
||||||
* [Устранение проблем при установке mysqlclient (подключение к MySQL/MariaDB)](python-mysql.md)
|
* [Устранение проблем при установке mysqlclient (подключение к MySQL/MariaDB)](python/python-mysql.md)
|
||||||
|
|
||||||
|
## Raspberry Pi / Orange Pi
|
||||||
|
* [Установка Docker и Docker Compose](raspberry-pi/install-docker-compose.md)
|
||||||
|
* [Резервное копирование и восстановление](raspberry-pi/backup-restore.md)
|
||||||
|
|
||||||
|
## Nginx / Apache
|
||||||
|
* [Ограничение доступа по User-Agent (на примере GPTBot)](nginx/nginx-ban-user-agent.md)
|
||||||
|
|
||||||
|
## Разное
|
||||||
|
* [Сплиттер для разделения логов](misc/splitter-for-logs.md)
|
34
misc/splitter-for-logs.md
Normal file
34
misc/splitter-for-logs.md
Normal file
@ -0,0 +1,34 @@
|
|||||||
|
# Разбивает лог-файл на отдельные логи по ip-адресам
|
||||||
|
|
||||||
|
Все необходимые описания есть в комментариях в скрипте. Предполагается, что скрипт будет запускаться по расписанию
|
||||||
|
(cron), при этом процесс который создает логи tacacs (обычно tac_plus) будет создавать лог заново, т.к. скрипт
|
||||||
|
удаляет исходный лог.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# log_file_name -- имя лог-файла который надо разобрать (лучше указать полный путь).
|
||||||
|
log_file_name="tac_1.acc"
|
||||||
|
|
||||||
|
# out_directory -- каталог, в который надо складывать расщепленные логи
|
||||||
|
# * -- каталог должен существовать
|
||||||
|
# * -- если пустая строка "расщепление" будет происходить в текущем каталоге
|
||||||
|
# * -- несли не пустая строка, то значение переменной должно заканчиваться '/'.
|
||||||
|
out_directory=""
|
||||||
|
|
||||||
|
# ext2split -- расширение для сплит-логов
|
||||||
|
ext2split=".split_log"
|
||||||
|
|
||||||
|
# читаем файл лога построчно
|
||||||
|
cat "$log_file_name" | while IFS= read -r line; do
|
||||||
|
# обрабатываем строку (она в $line)
|
||||||
|
|
||||||
|
# находим ipv4 (первое ipv4 в строке)
|
||||||
|
ipv4=$(echo "$line" | awk '{for (i=1; i<=NF; i++) if ($i ~ /^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$/) {print $i; exit}}')
|
||||||
|
# добавление строку в соответствующий сплит-лог
|
||||||
|
echo "$line" >> "$out_directory$ipv4$ext2split"
|
||||||
|
done
|
||||||
|
|
||||||
|
# удаляем исходный лог. т.к. его уже нарезали на плит-логи.
|
||||||
|
rm -rf "$log_file_name"
|
||||||
|
```
|
47
nginx/nginx-ban-user-agent.md
Normal file
47
nginx/nginx-ban-user-agent.md
Normal file
@ -0,0 +1,47 @@
|
|||||||
|
# Ограничение доступа по User-Agent (на примере GPTBot)
|
||||||
|
|
||||||
|
GPTBot – это поисковой бот компании OpenAI (GPTchat, Dall-E и т.п.), который сканирует веб-страницы
|
||||||
|
с целью обучения моделей машинного обучения и использует инфраструктуру Microsoft.
|
||||||
|
|
||||||
|
Есть миф (а может и правда), что сбор информации GPTBot с сайта может облегчить создание фейков со
|
||||||
|
стороны злоумышленников, и потому сканирование GPTBot-у надо ограничить.
|
||||||
|
|
||||||
|
## Ограничения доступа файл robots.txt:
|
||||||
|
|
||||||
|
Добавить в файл robots.txt следующие строки:
|
||||||
|
```robots.txt
|
||||||
|
User-agent: GPTBot
|
||||||
|
Disallow: /
|
||||||
|
```
|
||||||
|
|
||||||
|
## Ограничение доступа на веб-сервере Apache:
|
||||||
|
|
||||||
|
Пример настройки для веб-сервера Apache через файлы конфигурации .htaccess:
|
||||||
|
```apache configuration
|
||||||
|
<IfModule mod_rewrite.c>
|
||||||
|
RewriteEngine On
|
||||||
|
RewriteCond %{HTTP_USER_AGENT} ^GPTBot [NC]
|
||||||
|
RewriteRule ^ - [F,L]
|
||||||
|
</IfModule>
|
||||||
|
```
|
||||||
|
|
||||||
|
Этот код проверяет, начинается ли User-Agent с "**GPTBot**" (без учета регистра), и если это так,
|
||||||
|
то правило _RewriteRule_ отправляет запросу статус `403 (Forbidden)`, что означает запрет доступа `(F)`
|
||||||
|
и прекращает дальнейшее выполнение правил `(L)`.
|
||||||
|
|
||||||
|
## Ограничение доступа на веб-сервере Nginx:
|
||||||
|
Пример настройки для веб-сервера Nginx через файлы конфигурации:
|
||||||
|
```nginx configuration
|
||||||
|
server {
|
||||||
|
# ... другие настройки сервера ...
|
||||||
|
|
||||||
|
if ($http_user_agent ~* "GPTBot") {
|
||||||
|
return 403;
|
||||||
|
}
|
||||||
|
# ... другие настройки сервера ...
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
Этот конфигурационный файл проверяет, содержится ли идентификатор "**GPTBot**" в заголовке User-Agent
|
||||||
|
(без учета регистра), и если это так, возвращает статус `403 (Forbidden)`, что означает запрет доступа.
|
||||||
|
|
@ -1,6 +1,6 @@
|
|||||||
# Устранение возникшей проблемы с установкой mysqlclient (подключение к MySQL/MariaDB)
|
# Устранение возникшей проблемы с установкой mysqlclient (подключение к MySQL/MariaDB)
|
||||||
|
|
||||||
Обычным порядком установка осущесмтвляется командой:
|
Обычным порядком установка осуществляется командой:
|
||||||
```bash
|
```bash
|
||||||
pip install mysqlclient
|
pip install mysqlclient
|
||||||
```
|
```
|
||||||
@ -10,7 +10,7 @@ pip install mysqlclient
|
|||||||
## Проблемы под Apple Mac OS
|
## Проблемы под Apple Mac OS
|
||||||
|
|
||||||
Если mysqlclient не устанавливается, то возможно нет БД-коннектора в системе.
|
Если mysqlclient не устанавливается, то возможно нет БД-коннектора в системе.
|
||||||
Обычно такое происходит если сама СУБД размещена в контейнере Docker (при установке СУБД
|
**Обычно такое происходит если сама СУБД размещена в контейнере Docker** (при установке СУБД
|
||||||
в саму систему клиент «прилетает» автоматически).
|
в саму систему клиент «прилетает» автоматически).
|
||||||
|
|
||||||
Для MariaDB проблема решается временной установкой `mariadb-connector-c` и созданием
|
Для MariaDB проблема решается временной установкой `mariadb-connector-c` и созданием
|
||||||
@ -47,7 +47,7 @@ rm /usr/local/bin/mysql_config
|
|||||||
brew unlink mysql-client
|
brew unlink mysql-client
|
||||||
```
|
```
|
||||||
|
|
||||||
## Проблемы с MYSQLCLIENT_CFLAGS и MYSQLCLIENT_LDFLAGS
|
### Проблемы с MYSQLCLIENT_CFLAGS и MYSQLCLIENT_LDFLAGS
|
||||||
|
|
||||||
Может возникнуть и под Linux, и под Windows, и под Mac OS (например, в моём случае это случилось при обновлении
|
Может возникнуть и под Linux, и под Windows, и под Mac OS (например, в моём случае это случилось при обновлении
|
||||||
операционной системы). При установке mysqlclient выдается что-то типа такого сообщения:
|
операционной системы). При установке mysqlclient выдается что-то типа такого сообщения:
|
||||||
@ -105,3 +105,41 @@ Successfully built mysqlclient
|
|||||||
Installing collected packages: mysqlclient
|
Installing collected packages: mysqlclient
|
||||||
Successfully installed mysqlclient-2.2.0
|
Successfully installed mysqlclient-2.2.0
|
||||||
```
|
```
|
||||||
|
|
||||||
|
### Проблемы с clang и библиотекой zstd
|
||||||
|
|
||||||
|
После обновления на macOS Sonoma 14.2.1 (23C71) снова возникла проблема с установкой mysqlclient.
|
||||||
|
Выводилось что-то типа:
|
||||||
|
```txt
|
||||||
|
...
|
||||||
|
...
|
||||||
|
clang -bundle -undefined dynamic_lookup -arch arm64 -arch x86_64 -g build/temp.macosx-10.9-universal2-cpython-310/src/MySQLdb/_mysql.o -o build/lib.macosx-10.9-universal2-cpython-310/MySQLdb/_mysql.cpython-310-darwin.so -L/opt/homebrew/opt/mysql-client/lib -lmysqlclient -lz -lzstd -lssl -lcrypto -lresolv
|
||||||
|
ld: library 'zstd' not found
|
||||||
|
clang: error: linker command failed with exit code 1 (use -v to see invocation)
|
||||||
|
error: command '/usr/bin/clang' failed with exit code 1
|
||||||
|
```
|
||||||
|
|
||||||
|
Для решения сначала пришлось установить библиотеку zstd и переустановить sqlclient [по инструкции
|
||||||
|
из официального репозитория](https://github.com/PyMySQL/mysqlclient/blob/main/README.md#macos-homebrew):
|
||||||
|
```bash
|
||||||
|
brew install zstd mysql-client pkg-config
|
||||||
|
export PKG_CONFIG_PATH="$(brew --prefix)/opt/mysql-client/lib/pkgconfig"
|
||||||
|
```
|
||||||
|
|
||||||
|
Затем снова установить значения переменных окружения `MYSQLCLIENT_CFLAGS` и `MYSQLCLIENT_LDFLAGS`. Но сначала
|
||||||
|
узнать через `pkg-config` чему они равны:
|
||||||
|
```bash
|
||||||
|
pkg-config --cflags mysqlclient
|
||||||
|
pkg-config --libs mysqlclient
|
||||||
|
```
|
||||||
|
|
||||||
|
В первом случае я получил `-I/opt/homebrew/Cellar/mysql-client/8.2.0/include/mysql`, а во втором
|
||||||
|
`-L/opt/homebrew/Cellar/mysql-client/8.2.0/lib -lmysqlclient`. У вас может быть другие значения.
|
||||||
|
|
||||||
|
После установки соответсвующий переменных окружения:
|
||||||
|
```bash
|
||||||
|
export MYSQLCLIENT_CFLAGS="-I/opt/homebrew/Cellar/mysql-client/8.2.0/include/mysql"
|
||||||
|
export MYSQLCLIENT_LDFLAGS="-L/opt/homebrew/Cellar/mysql-client/8.2.0/lib -lmysqlclient"
|
||||||
|
```
|
||||||
|
|
||||||
|
И только после этого удалось успешно установить питоновский mysqlclient.
|
272
raspberry-pi/backup-restore.md
Normal file
272
raspberry-pi/backup-restore.md
Normal file
@ -0,0 +1,272 @@
|
|||||||
|
# Резервное копирование и восстановление Raspberry Pi (Orange Pi)
|
||||||
|
|
||||||
|
**Важно:** *На борту моего микрокомпьютера Orange Pi 5 встроен объемный SSD
|
||||||
|
(смонтированный в `/home/`). Он используется для создания и промежуточного образа системного
|
||||||
|
SD-накопителя.*
|
||||||
|
|
||||||
|
## Для облака _cloud.mail.ru_ или _360.yandex.ru/disk_
|
||||||
|
|
||||||
|
### Установка WebDav и подключения "облаков":
|
||||||
|
|
||||||
|
Установим поддержку файловой системы WebDav на наш Orange Pi:
|
||||||
|
```shell
|
||||||
|
sudo apt-get install davfs2
|
||||||
|
```
|
||||||
|
|
||||||
|
Включим пользователя `[user]`, от имени которого производится резервное копирование
|
||||||
|
(обычно **pi** -- для Raspberry Pi, и **orangepi** -- для Orange Pi), в группу `davfs2`:
|
||||||
|
```bash
|
||||||
|
sudo usermod -aG davfs2 [user]
|
||||||
|
```
|
||||||
|
|
||||||
|
**ВАЖНО** *В дальнейших примерах, хранение резервных копий осуществляется в [инфраструктуре
|
||||||
|
облака mail.ru (о-drive)](https://cloud.mail.ru/).*
|
||||||
|
|
||||||
|
Создадим папку для монтирования "облака" mail.ru:
|
||||||
|
```shell
|
||||||
|
sudo mkdir /media/maildisk
|
||||||
|
```
|
||||||
|
|
||||||
|
Дадим права пользователю `[user]` на монтирование "облака":
|
||||||
|
```shell
|
||||||
|
sudo chmod 4755 /sbin/mount.davfs
|
||||||
|
sudo chown -R [user]:[user] /media/maildisk/
|
||||||
|
```
|
||||||
|
|
||||||
|
С 1 января 2022 для подключения "облака" по WebDAV нужно использовать пароль внешнего приложения.
|
||||||
|
Доступ по обычному паролю закрыт, создать пароль приложения для mail.ru [надо по ссылке](https://help.mail.ru/mail/security/protection/external),
|
||||||
|
а для Yandex-Disk [тут](https://yandex.ru/support/id/authorization/app-passwords.html#app-passwords__create).
|
||||||
|
|
||||||
|
Изменим файл с паролями `/etc/davfs2/secrets` и запишем в него логин и пароль от "облака":
|
||||||
|
```shell
|
||||||
|
sudo nano /etc/davfs2/secrets
|
||||||
|
```
|
||||||
|
|
||||||
|
И добавим в конец файла, что-то типа:
|
||||||
|
```txt
|
||||||
|
/media/maildisk [ваш-логин]@mail.ru [пароль-внешнего-приложения]
|
||||||
|
```
|
||||||
|
|
||||||
|
К слову сказать, пароль от внешнего приложения через `/etc/davfs2/secrets` срабатывает
|
||||||
|
не всегда, поэтому я дублирую [пароль-внешнего-приложения] в файл `/media/mailru.pwd`:
|
||||||
|
```shell
|
||||||
|
sudo echo "[пароль-внешнего-приложения]" > /media/mailru.pwd
|
||||||
|
```
|
||||||
|
|
||||||
|
Для возможности не только читать, но и писать в облако, надо отредактировать файл
|
||||||
|
`/etc/davfs2/davfs2.conf` (расположение файла может варьироваться в зависимости от
|
||||||
|
используемого дистрибутива), найти в нём строчку, начинающуюся `# use_locks`, и заменить
|
||||||
|
её на:
|
||||||
|
```txt
|
||||||
|
use_locks 0
|
||||||
|
```
|
||||||
|
|
||||||
|
### Скрипт резервного копирования в "облако"
|
||||||
|
|
||||||
|
Создадим скрипт резервного копирования `backup_orange.sh` (я предпочитаю хранить скрипты
|
||||||
|
в папке `/home/[user]/scripts/`):
|
||||||
|
```shell
|
||||||
|
nano ~/scripts/backup_orange.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
Скрипт резервного копирования (*не забудьте заменить `[user]` и `[login]`*) сохранит
|
||||||
|
zip-архивы образа flash-накопителя и домашний каталог `/home/` в папку
|
||||||
|
`/BackUps/orange-pi-home` "облака". Архивы будут разбиты на части по 1 Гб, т.к. облако
|
||||||
|
не позволяет загружать файлы больше 2 Гб. Старые архивы будут удаляться через 8 дней:
|
||||||
|
```shell
|
||||||
|
#!/usr/bin/bash
|
||||||
|
if [ ! -d /home/[user]/backup ]; then
|
||||||
|
mkdir -p /home/[user]/backup
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ ! -d /media/maildisk/BackUps ]; then
|
||||||
|
mkdir -p /media/maildisk/BackUps
|
||||||
|
mkdir -p /media/maildisk/BackUps/orange-pi-home
|
||||||
|
else
|
||||||
|
if [ ! -d /media/maildisk/BackUps/orange-pi-home ]; then
|
||||||
|
mkdir -p /media/maildisk/BackUps/orange-pi-home
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo -e "$(date +'%F %R:%S') - делаем образ flash-накопителя на локальный SSD-диск:\n$(date +'%F %R:%S') - =========================\n" >> /home/[user]/backup/backup.log
|
||||||
|
echo -e "$(date +'%F %R:%S') - делаем образ flash-накопителя на локальный SSD-диск:\n$(date +'%F %R:%S') - =========================\n"
|
||||||
|
dd if=/dev/mmcblk1 of=/home/[user]/backup/flash-disk.img >> /home/[user]/backup/backup.log
|
||||||
|
|
||||||
|
echo -e "$(date +'%F %R:%S') - ГОТОВО:\n$(date +'%F %R:%S') - =========================\n" >> /home/[user]/backup/backup.log
|
||||||
|
echo -e "$(date +'%F %R:%S') - ГОТОВО:\n$(date +'%F %R:%S') - =========================\n";
|
||||||
|
ls -alh /home/[user]/backup/flash-disk.img >> /home/[user]/backup/backup.log
|
||||||
|
echo -e "$(date +'%F %R:%S') - =========================\n" >> /home/[user]/backup/backup.log
|
||||||
|
echo -e "$(date +'%F %R:%S') - =========================\n";
|
||||||
|
|
||||||
|
echo -e "$(date +'%F %R:%S') - монтируем облако mail.ru в папку '/media/maildisk':\n$(date +'%F %R:%S') - =========================\n" >> /home/[user]/backup/backup.log
|
||||||
|
echo -e "$(date +'%F %R:%S') - монтируем облако mail.ru в папку '/media/maildisk':\n$(date +'%F %R:%S') - =========================\n";
|
||||||
|
mount.davfs -o username=[login]@mail.ru https://webdav.cloud.mail.ru /media/maildisk < /media/mailru.pwd
|
||||||
|
|
||||||
|
echo -e "\n$(date +'%F %R:%S') - упаковываем образ flash-накопителя в облако mail.ru:\n$(date +'%F %R:%S') - =========================\n" >> /home/[user]/backup/backup.log
|
||||||
|
echo -e "\n$(date +'%F %R:%S') - упаковываем образ flash-накопителя в облако mail.ru:\n$(date +'%F %R:%S') - =========================\n";
|
||||||
|
cd /home/[user]/backup/
|
||||||
|
/bin/zip -s 1024m -9 /media/maildisk/BackUps/orange-pi-home/flash-disk--$(date +'%F').zip flash-disk.img >> /home/[user]/backup/backup.log
|
||||||
|
cd /home/[user]/
|
||||||
|
|
||||||
|
echo -e "$(date +'%F %R:%S') - ГОТОВО:\n$(date +'%F %R:%S') - =========================\n" >> /home/[user]/backup/backup.log
|
||||||
|
echo -e "$(date +'%F %R:%S') - ГОТОВО:\n$(date +'%F %R:%S') - =========================\n";
|
||||||
|
ls -al /media/maildisk/BackUps/orange-pi-home/flash-disk--$(date +'%F').* >> /home/[user]/backup/backup.log
|
||||||
|
echo -e "$(date +'%F %R:%S') - =========================\n" >> /home/[user]/backup/backup.log
|
||||||
|
echo -e "$(date +'%F %R:%S') - =========================\n";
|
||||||
|
|
||||||
|
echo -e "$(date +'%F %R:%S') - удаляем образ flash-накопителя с локального SSD-диска:\n$(date +'%F %R:%S') - =========================\n" >> /home/[user]/backup/backup.log
|
||||||
|
echo -e "$(date +'%F %R:%S') - удаляем образ flash-накопителя с локального SSD-диска:\n$(date +'%F %R:%S') - =========================\n";
|
||||||
|
rm -f /home/[user]/backup/flash-disk.img
|
||||||
|
rm -f /home/[user]/backup/flash-disk--*.*
|
||||||
|
|
||||||
|
echo -e "$(date +'%F %R:%S') - упаковываем home-том в облако mail.ru:\n$(date +'%F %R:%S') - =========================\n" >> /home/[user]/backup/backup.log
|
||||||
|
echo -e "$(date +'%F %R:%S') - упаковываем home-том в облако mail.ru:\n$(date +'%F %R:%S') - =========================\n";
|
||||||
|
/bin/zip --symlinks -s 1024m -r9q /media/maildisk/BackUps/orange-pi-home/home-volume--$(date +'%F').zip /home/ -x /home/[user]/backup/*.* >> /home/[user]/backup/backup.log
|
||||||
|
|
||||||
|
echo -e "$(date +'%F %R:%S') - ГОТОВО:\n$(date +'%F %R:%S') - =========================\n" >> /home/[user]/backup/backup.log
|
||||||
|
echo -e "$(date +'%F %R:%S') - ГОТОВО:\n$(date +'%F %R:%S') - =========================\n";
|
||||||
|
ls -al /media/maildisk/BackUps/orange-pi-home/home-volume--$(date +'%F').* >> /home/[user]/backup/backup.log
|
||||||
|
echo -e "$(date +'%F %R:%S') - =========================STOP\n" >> /home/[user]/backup/backup.log
|
||||||
|
echo -e "$(date +'%F %R:%S') - =========================STOP\n";
|
||||||
|
|
||||||
|
echo -e "$(date +'%F %R') - удаляем старые файлы быкапов больше чем за два дня:\n$(date +'%F %R') - =========================\n" >> /home/[user]/backup/backup.log
|
||||||
|
echo -e "$(date +'%F %R') - удаляем старые файлы быкапов больше чем за два дня:\n$(date +'%F %R') - =========================\n";
|
||||||
|
/usr/bin/find /media/maildisk/BackUps/orange-pi-home/ -mtime +8 -delete >> /home/[user]/backup/backup.log
|
||||||
|
|
||||||
|
echo -e "$(date +'%F %R') - ВСЕ РЕЗЕРВНЫЕ КОПИИ В ОБЛАКЕ MAIL.RU:\n $(date +'%F %R') =========================\n" >> /home/[user]/backup/backup.log
|
||||||
|
echo -e "$(date +'%F %R') - ВСЕ РЕЗЕРВНЫЕ КОПИИ В ОБЛАКЕ MAIL.RU:\n $(date +'%F %R') =========================\n";
|
||||||
|
ls -alhc /media/maildisk/BackUps/orange-pi-home/ >> /home/[user]/backup/backup.log
|
||||||
|
echo -e "=========================\n" >> /home/[user]/backup/backup.log
|
||||||
|
echo -e "=========================\n";
|
||||||
|
|
||||||
|
echo -e "$(date +'%F %R') - Копируем log-бекапа в облако MAIL.RU:\n $(date +'%F %R') =========================\n" >> /home/[user]/backup/backup.log
|
||||||
|
echo -e "$(date +'%F %R') - Копируем log-бекапа в облако MAIL.RU:\n $(date +'%F %R') =========================\n";
|
||||||
|
cp /home/[user]/backup/backup.log /media/maildisk/BackUps/orange-pi-home/
|
||||||
|
|
||||||
|
echo -e "$(date +'%F %R') - отсоединяем облако mail.ru\n $(date +'%F %R') =========================\n" >> /home/[user]/backup/backup.log
|
||||||
|
echo -e "$(date +'%F %R') - отсоединяем облако mail.ru\n $(date +'%F %R') =========================\n";
|
||||||
|
umount /media/maildisk >> /home/[user]/backup/backup.log
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
## Для резервного копирования в _SMB-папку_ внутри домашней сети
|
||||||
|
|
||||||
|
### Установка Samba клиента:
|
||||||
|
|
||||||
|
Скорее всего поддержка **samba** уже включена, но на всякий случай установим её на наш
|
||||||
|
Orange Pi (если ещё не установлена):
|
||||||
|
```shell
|
||||||
|
sudo apt-get install samba samba-client smbclient cifs-utils
|
||||||
|
```
|
||||||
|
|
||||||
|
Создадим папку для монтирования samba-папки:
|
||||||
|
```shell
|
||||||
|
sudo mkdir /media/backup
|
||||||
|
```
|
||||||
|
|
||||||
|
Дадим права пользователю `[user]` на запись в samba-папку:
|
||||||
|
```shell
|
||||||
|
sudo chown -R 777 /media/backup/
|
||||||
|
sudo chown -R [user]:[user] /media/backup/
|
||||||
|
```
|
||||||
|
|
||||||
|
### Скрипт резервного копирования в SAMBA-папку внутри домашней сети
|
||||||
|
|
||||||
|
Скрипт резервного копирования (*не забудьте заменить `[ip]`, `[user]` и `[login]` -- ip-адрес NAS
|
||||||
|
в домашней сети, NAS-логин и NAS-пароль*) сохранит zip-архивы образа flash-накопителя и домашний
|
||||||
|
каталог `/home/` в папку `/NetBackup` на NAS. Старые архивы будут удаляться через 24 дня:
|
||||||
|
```shell
|
||||||
|
#!/usr/bin/bash
|
||||||
|
|
||||||
|
echo -e "$(date +'%F %R:%S') - монтируем SAMBA '/media/backup':\n$(date +'%F %R:%S') - =========================\n";
|
||||||
|
mount -t cifs -o username=[samba-login],password=[smaba-pwd] //192.168.1.50/NetBackup /media/backup/
|
||||||
|
echo -e "$(date +'%F %R:%S') - монтируем SAMBA '/media/backup':\n$(date +'%F %R:%S') - =========================\n" >> /media/backup/orange-pi-backup/backup.log
|
||||||
|
|
||||||
|
|
||||||
|
if [ ! -d /media/backup/orange-pi-backup ]; then
|
||||||
|
mkdir -p /media/backup/orange-pi-backup
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ ! -d /home/[user]/backup ]; then
|
||||||
|
mkdir -p /home/[user]/backup
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo -e "$(date +'%F %R:%S') - делаем образ flash-накопителя на локальный SSD-диск:\n$(date +'%F %R:%S') - =========================\n" >> /media/backup/orange-pi-backup/backup.log
|
||||||
|
echo -e "$(date +'%F %R:%S') - делаем образ flash-накопителя на локальный SSD-диск:\n$(date +'%F %R:%S') - =========================\n"
|
||||||
|
dd if=/dev/mmcblk1 of=/home/[user]/backup/flash-disk.img >> /home/[user]/backup/backup.log
|
||||||
|
|
||||||
|
echo -e "$(date +'%F %R:%S') - ГОТОВО:\n$(date +'%F %R:%S') - =========================\n" >> /media/backup/orange-pi-backup/backup.log
|
||||||
|
echo -e "$(date +'%F %R:%S') - ГОТОВО:\n$(date +'%F %R:%S') - =========================\n";
|
||||||
|
ls -alh /home/[user]/backup/flash-disk.img >> /media/backup/orange-pi-backup/backup.log
|
||||||
|
echo -e "$(date +'%F %R:%S') - =========================\n" >> /media/backup/orange-pi-backup/backup.log
|
||||||
|
echo -e "$(date +'%F %R:%S') - =========================\n";
|
||||||
|
|
||||||
|
echo -e "\n$(date +'%F %R:%S') - упаковываем образ flash-накопителя в SAMBA:\n$(date +'%F %R:%S') - =========================\n" >> /media/backup/orange-pi-backup/backup.log
|
||||||
|
echo -e "\n$(date +'%F %R:%S') - упаковываем образ flash-накопителя в SAMBA:\n$(date +'%F %R:%S') - =========================\n";
|
||||||
|
cd /home/[user]/backup/
|
||||||
|
/bin/zip -9 /media/backup/orange-pi-backup/flash-disk--$(date +'%F').zip flash-disk.img >> /media/backup/orange-pi-backup/backup.log
|
||||||
|
cd /home/[user]/
|
||||||
|
|
||||||
|
echo -e "$(date +'%F %R:%S') - ГОТОВО:\n$(date +'%F %R:%S') - =========================\n" >> /media/backup/orange-pi-backup/backup.log
|
||||||
|
echo -e "$(date +'%F %R:%S') - ГОТОВО:\n$(date +'%F %R:%S') - =========================\n";
|
||||||
|
ls -al /media/backup/orange-pi-backup/flash-disk--$(date +'%F').* >> /media/backup/orange-pi-backup/backup.log
|
||||||
|
echo -e "$(date +'%F %R:%S') - =========================\n" >> /media/backup/orange-pi-backup/backup.log
|
||||||
|
echo -e "$(date +'%F %R:%S') - =========================\n";
|
||||||
|
|
||||||
|
echo -e "$(date +'%F %R:%S') - удаляем образ flash-накопителя:\n$(date +'%F %R:%S') - =========================\n" >> /media/backup/orange-pi-backup/backup.log
|
||||||
|
echo -e "$(date +'%F %R:%S') - удаляем образ flash-накопителя:\n$(date +'%F %R:%S') - =========================\n";
|
||||||
|
rm -f /home/[user]/backup/flash-disk.img
|
||||||
|
|
||||||
|
echo -e "$(date +'%F %R:%S') - упаковываем home-том в SAMBA:\n$(date +'%F %R:%S') - =========================\n" >> /media/backup/orange-pi-backup/backup.log
|
||||||
|
echo -e "$(date +'%F %R:%S') - упаковываем home-том в SAMBA:\n$(date +'%F %R:%S') - =========================\n";
|
||||||
|
/bin/zip --symlinks -r9q /media/backup/orange-pi-backup/home-volum--$(date +'%F').zip /home/ -x /home/[user]/backup/*.* >> /media/backup/orange-pi-backup/backup.log
|
||||||
|
|
||||||
|
|
||||||
|
echo -e "$(date +'%F %R:%S') - ГОТОВО:\n$(date +'%F %R:%S') - =========================\n" >> /media/backup/orange-pi-backup/backup.log
|
||||||
|
echo -e "$(date +'%F %R:%S') - ГОТОВО:\n$(date +'%F %R:%S') - =========================\n";
|
||||||
|
ls -al /media/backup/orange-pi-backup/home-volum--$(date +'%F').* >> /media/backup/orange-pi-backup/backup.log
|
||||||
|
echo -e "$(date +'%F %R:%S') - =========================STOP\n" >> /media/backup/orange-pi-backup/backup.log
|
||||||
|
echo -e "$(date +'%F %R:%S') - =========================STOP\n";
|
||||||
|
|
||||||
|
echo -e "$(date +'%F %R:%S') - удаляем старые файлы быкапов больше чем за два дня:\n$(date +'%F %R') - =========================\n" >> /media/backup/orange-pi-backup/backup.log
|
||||||
|
echo -e "$(date +'%F %R:%S') - удаляем старые файлы быкапов больше чем за два дня:\n$(date +'%F %R') - =========================\n";
|
||||||
|
/usr/bin/find /media/backup/orange-pi-backup/ -type f -name "flash-disk--*.*" -mtime +24 -exec rm {} \;
|
||||||
|
/usr/bin/find /media/backup/orange-pi-backup/ -type f -name "home-volum--*.*" -mtime +24 -exec rm {} \
|
||||||
|
echo -e "$(date +'%F %R:%S') - ВСЕ РЕЗЕРВНЫЕ КОПИИ В SAMBA:\n$(date +'%F %R:%S') - =========================\n" >> /media/backup/orange-pi-backup/backup.log
|
||||||
|
echo -e "$(date +'%F %R:%S') - ВСЕ РЕЗЕРВНЫЕ КОПИИ В SAMBA:\n$(date +'%F %R:%S') - =========================\n";
|
||||||
|
ls -alhc /media/backup/orange-pi-backup/ >> /media/backup/orange-pi-backup/backup.log
|
||||||
|
echo -e "$(date +'%F %R:%S') - =========================\n" >> /media/backup/orange-pi-backup/backup.log
|
||||||
|
echo -e "$(date +'%F %R:%S') - =========================\n";
|
||||||
|
|
||||||
|
echo -e "$(date +'%F %R:%S') - отсоединяем SAMBA\n$(date +'%F %R:%S') - =========================\n" >> /media/backup/orange-pi-backup/backup.log
|
||||||
|
echo -e "$(date +'%F %R:%S') - отсоединяем SAMBA\n$(date +'%F %R:%S') - =========================\n";
|
||||||
|
umount /media/backup
|
||||||
|
```
|
||||||
|
|
||||||
|
## Регулярное выполнение резервного копирования
|
||||||
|
|
||||||
|
Дадим права на выполнение скрипта:
|
||||||
|
```shell
|
||||||
|
sudo chmod +x ~/scripts/backup_orange.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
Запускать скрипт будем через `cron` от root-пользователя, поэтому отредактируем `crontab`:
|
||||||
|
```shell
|
||||||
|
sudo crontab -e
|
||||||
|
```
|
||||||
|
|
||||||
|
И добавим в конец файла строку (комментарии добавлять не обязательно):
|
||||||
|
```txt
|
||||||
|
# +-------------------------------- минуты (0 - 59)
|
||||||
|
# | +-------------------------- часы (0 - 23)
|
||||||
|
# | | +------------------ день месяца (1 - 31)
|
||||||
|
# | | | +---------- месяц (1 - 12)
|
||||||
|
# | | | | +-- день недели (0 - 7) (Воскресенье=0 или 7)
|
||||||
|
# | | | | |
|
||||||
|
# m h dom mon * команда для исполнения
|
||||||
|
#--------------------------------------------------------------------------
|
||||||
|
5 0 * * 1,3,5 /usr/bin/bash /home/[user]/scripts/backup_orange.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
Скрипт будет запускаться каждый понедельник в 00:05. Таким образом в каждый момент времени
|
||||||
|
в облаке будет храниться две последних резервных копий (за две предыдущих недели).
|
57
raspberry-pi/install-docker-compose.md
Normal file
57
raspberry-pi/install-docker-compose.md
Normal file
@ -0,0 +1,57 @@
|
|||||||
|
# Установка Docker и Docker Compose на Raspberry Pi / Orange Pi
|
||||||
|
|
||||||
|
Раньше для установки Docker на Raspberry нужно было неплохо так поприседать, но эти времена в прошлом.
|
||||||
|
Скачиваем скрипт установки `get-docker.sh` и запускаем его:
|
||||||
|
```shell
|
||||||
|
curl -fsSL https://get.docker.com -o get-docker.sh
|
||||||
|
sh get-docker.sh
|
||||||
|
rm get-docker.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
В процессе будет запрошен пароли для sudo-доступа.
|
||||||
|
|
||||||
|
Проверяем, что установка прошла успешно:
|
||||||
|
```shell
|
||||||
|
docker version
|
||||||
|
```
|
||||||
|
|
||||||
|
Увидим, что-то типа:
|
||||||
|
```txt
|
||||||
|
Client: Docker Engine - Community
|
||||||
|
Version: 25.0.0-beta.1
|
||||||
|
API version: 1.44
|
||||||
|
Go version: go1.21.3
|
||||||
|
Git commit: 2b521e4
|
||||||
|
Built: Mon Nov 13 16:50:14 2023
|
||||||
|
OS/Arch: linux/arm64
|
||||||
|
Context: default
|
||||||
|
|
||||||
|
Server: Docker Engine - Community
|
||||||
|
Engine:
|
||||||
|
Version: 25.0.0-beta.1
|
||||||
|
API version: 1.44 (minimum version 1.12)
|
||||||
|
Go version: go1.21.3
|
||||||
|
Git commit: 6af7d6e
|
||||||
|
Built: Mon Nov 13 16:50:14 2023
|
||||||
|
OS/Arch: linux/arm64
|
||||||
|
Experimental: false
|
||||||
|
containerd:
|
||||||
|
Version: 1.6.26
|
||||||
|
GitCommit: 3dd1e886e55dd695541fdcd67420c2888645a495
|
||||||
|
runc:
|
||||||
|
Version: 1.1.10
|
||||||
|
GitCommit: v1.1.10-0-g18a0cb0
|
||||||
|
docker-init:
|
||||||
|
Version: 0.19.0
|
||||||
|
GitCommit: de40ad0
|
||||||
|
```
|
||||||
|
|
||||||
|
Проверяем, что установка Docker Compose тоже прошла успешно:
|
||||||
|
```shell
|
||||||
|
docker compose version
|
||||||
|
```
|
||||||
|
|
||||||
|
Увидим, что-то типа:
|
||||||
|
```txt
|
||||||
|
Docker Compose version v2.23.0
|
||||||
|
```
|
Loading…
Reference in New Issue
Block a user