vestasync/README.md

246 lines
16 KiB
Markdown
Raw Normal View History

2023-04-17 13:33:13 +03:00
# VestaSync
2023-04-16 09:34:19 +03:00
2023-04-16 21:47:09 +03:00
VestaSync - это ПО для бекапа и восстановления контроллеров Wirenboard. Оно решает две задачи:
2023-04-16 09:34:19 +03:00
2023-04-16 19:15:13 +03:00
1. Создание бекапа конфигурации автоматически и деплой ее на удаленный git-сервер (поддерживается Gitea, для поддержки других сервисов необходимо дописать соответствующую функцию создания репозитория) по расписанию (раз в день) и по изменению файлов.
2023-04-17 19:09:51 +03:00
![Пример версионности конфигурации](miscellaneous/versions.jpeg)
2023-04-16 10:03:21 +03:00
2. Восстановление бекапа одной командой: после подключения нового контроллера достаточно ввести его IP и имя хоста предыдущего контроллера, чтобы Vestasync автоматически восстановила бекап вплоть до MAC-адресов сетевых интерфейсов, чтобы не было нужды менять настройки на DHCP-сервере. После перезагрузки контроллер вернется в сеть с IP старого контроллера.
2023-04-16 09:34:19 +03:00
2023-04-16 21:47:09 +03:00
VestaSync — это набор скриптов, которые выполняют следующие функции:
2023-04-17 13:33:13 +03:00
1. При первоначальной установке на контроллер:
2023-04-16 21:47:09 +03:00
- Создают в /mnt/data/etc/ git-репозитарий
2023-04-17 19:09:51 +03:00
- Сохраняют текущие MAC-адреса в /mnt/data/etc/vestasync/macs/eth0(1...)
2023-04-16 21:47:09 +03:00
- Сохраняют hostname в /mnt/data/etc/vestasync/hostname
2. При изменении конфигурационных файлов
2023-04-17 13:33:13 +03:00
- Создают коммиты на каждое изменение файлов
- Загружают эти коммиты на сервер
2023-04-16 21:47:09 +03:00
3. При восстановлении из бекапа
- Копируют репозитарий
- Восстанавливают конфиги, hostname и mac-адрес
2023-04-17 19:09:51 +03:00
2023-04-17 19:01:29 +03:00
## Установка VestaSync на локальную машину или запуск докер-контейнера
2023-04-16 09:34:19 +03:00
2023-04-17 13:33:13 +03:00
**Эти команды выполняются не на контроллере**, а на локальной машине или на сервере, с которых есть доступ к контроллеру. Система изначально писалась для инсталляций с множеством контроллеров, поэтому она работает по модели ansible — при запуска на локальной машине сама заходит на пустой контроллер и настраивает его.
Плюс этого подхода в том, что для настройки десяти контроллеров надо просто запустить скрипт локально (подробнее см. Разное-Множественный запуск в этом файле) с разными ```device_ip```, а не заходить на каждый контроллер вручную.
2023-04-16 13:14:42 +03:00
2023-04-16 10:03:21 +03:00
```bash
2023-04-17 16:56:06 +03:00
apt update
apt install python3 python3-pip python3-venv git
2023-04-16 10:03:21 +03:00
git clone https://github.com/vvzvlad/vestasync
cd vestasync
2023-04-17 16:57:22 +03:00
python3 -m venv .venv
2023-04-16 10:03:21 +03:00
source .venv/bin/activate
2023-04-17 16:56:06 +03:00
pip3 install -r requirements.txt
2023-04-16 10:03:21 +03:00
```
2023-04-17 19:04:24 +03:00
Можно не устанавливать локально, а запустить докер (см. справку по командам ниже):
2023-04-17 18:55:18 +03:00
2023-04-17 19:04:24 +03:00
```bash
docker run -it --name vestasync vvzvlad/vestasync:latest \
./vestasync.py --cmd install \
--device_ip 192.168.1.58 \
2023-04-18 14:24:57 +03:00
--gitea_address http://192.168.1.38:3001/ \
2023-04-17 19:04:24 +03:00
--device_new_name WB_1 \
--gitea_token de8a2eaee0d2f27746157c2fd563815f932d671c
2023-04-17 18:55:18 +03:00
```
2023-04-16 13:14:42 +03:00
2023-04-16 10:03:21 +03:00
## Команды
2023-04-17 16:56:06 +03:00
У Vestasync есть всего две команды: `install` и `restore`.
2023-04-16 10:03:21 +03:00
2023-04-16 21:47:09 +03:00
### install — установка на контроллер
2023-04-16 10:03:21 +03:00
2023-04-16 10:06:51 +03:00
Команда `install` выполняет подготовительные действия — устанавливает ПО, создает гит-репозитарий, устанавливает службы (подробнее в разделе "Службы").
2023-04-17 13:33:13 +03:00
Эту команду надо выполнять, указывая в ```device_ip``` исходный контроллер (который будет стоять в проде инсталляции) перед началом эксплуатации (если выполнять ее еще до настройки, то бонусом получим сохранение конфигов и wb-rules в гите во время разработки и ПНР). Эта команда выполняется на контроллере один раз.
2023-04-16 10:03:21 +03:00
2023-04-16 13:14:42 +03:00
Пример запуска (запускается на локальной машине, адрес контроллера указывается в ```device_ip```):
2023-04-16 10:03:21 +03:00
```bash
2023-04-17 19:00:29 +03:00
./vestasync.py \
--cmd install \
--device_ip 192.168.1.85 \
--gitea_address http://192.168.1.101:3001/ \
--device_new_name WB2 \
--gitea_token de8a2eaee0d2f27746157c2fd563815f932d671c \
--user_cmd user_cmd.sh
2023-04-16 10:03:21 +03:00
```
2023-04-16 09:34:19 +03:00
2023-04-17 19:00:29 +03:00
2023-04-17 14:15:09 +03:00
```--cmd install``` означает, что надо установить Vestasync на контроллер и подготовить его к созданию бекапа
```--device_ip``` IP-адрес контроллера
2023-04-17 19:09:51 +03:00
```--gitea_address``` адрес Gitea-сервера в виде "http://192.168.1.101:3001/", куда будет загружаться бекапы конфигов
2023-04-17 14:15:09 +03:00
```--device_new_name``` имя контроллера, из которого вместе с SN будет сформировано название контроллера, которое запишется в хостнейм и будет служить именем репозитария с конфигами
```--gitea_token``` токен для авторизации на Gitea-сервере (получается в интерфейсе Gitea)
2023-04-17 19:09:51 +03:00
```--user_cmd``` файл sh с командами, которые надо выполняить на контроллере для его настройки под ваши задачи (указывать необязательно). В нем можно описать любые команды, которыми вам надо конфигурировать контроллер: например, установка ключа SSH, установка таймзоны и локали, и так далее.
Пример файла — ```files/user_cmd.sh```:
```
#!/usr/bin/env sh
timedatectl set-timezone Asia/Krasnoyarsk
localectl set-locale LANG=en_GB.UTF-8
service ntp stop
ntpdate pool.ntp.org
service ntp start
hwclock --systohc --localtime
```
2023-04-16 09:34:19 +03:00
2023-04-16 19:01:07 +03:00
2023-04-16 21:47:09 +03:00
### restore — восстановление из бекапа
2023-04-16 09:34:19 +03:00
2023-04-16 13:14:42 +03:00
Команда `restore` выполняет восстановление существующего бекапа на контроллере.
Эту команду надо выполнять на подменном контроллере из ЗИП-а в случае замены основного контроллера подменным. Эта команда выполянется один раз, после чего контроллер становится копией старого контроллера и продолжает сохранять свои изменения в конфигах в тот же репозитарий.
2023-04-16 09:34:19 +03:00
2023-04-16 13:14:42 +03:00
Пример запуска (запускается на локальной машине, адрес контроллера указывается в ```device_ip```):
2023-04-16 10:03:21 +03:00
```bash
2023-04-17 19:00:29 +03:00
./vestasync.py \
--cmd restore \
--device_ip 192.168.1.85 \
--gitea_address http://192.168.1.101:3001/ \
--gitea_token de8a2eaee0d2f27746157c2fd563815f932d671c \
--source_hostname WB2-A3TBJXLS \
2023-04-17 18:39:22 +03:00
--reinstall_packages yes
2023-04-16 10:03:21 +03:00
```
2023-04-17 18:39:22 +03:00
Используются те же аргументы, что и в ```install```, но дополнительно еще нужен аругмент ```source_hostname```, который определяет имя контроллера, с которого выполняется бекап. ```device_new_name``` не используется, в качестве имени будет взято имя старого контроллера. Опциональный аргумент ```reinstall_packages``` определяет, надо ли устанавливать пакеты, которые были установлены на старом контроллере.
2023-04-16 10:03:21 +03:00
2023-04-16 19:15:13 +03:00
**Обратите внимание, что после восстановления бекапа на новом контроллере старый контроллер не должен включаться в сеть, иначе произойдет конфликт адресов.**
2023-04-16 10:03:21 +03:00
## Службы
2023-04-16 13:14:42 +03:00
2023-04-16 10:03:21 +03:00
Службы, которые будут запущенны на контроллере при установке:
### Восстановление MAC-адресов (apply_macs)
2023-04-16 13:14:42 +03:00
2023-04-16 19:05:11 +03:00
Служба apply_macs отвечает за применение MAC-адресов к сетевым интерфейсам при загрузке системы.
2023-04-16 10:03:21 +03:00
Эта служба считывает MAC-адреса из файлов, расположенных в каталоге /mnt/data/etc/vestasync/macs/, если они есть, и присваивает их соответствующим интерфейсам, таким как eth0, eth1, wlan0 и т. д. Это используется, если на контроллер был восстанновлен созданный бекап, чтобы сохранять MAC-адреса старого контроллера, и соотвественно, адрес, выданный DHCP.
2023-04-16 09:37:06 +03:00
Для изменения MAC-адресов на изначальные надо просто удалить все файлы и перезагрузиться:
2023-04-16 13:14:42 +03:00
2023-04-16 09:34:19 +03:00
```
rm -rf /mnt/data/etc/vestasync/macs/*
reboot
```
2023-04-16 13:14:42 +03:00
2023-04-16 09:37:06 +03:00
Или, если надо сделать это временно, остановить службу: ```systemctl stop apply_macs.service```
Обратно запустить: ```systemctl start apply_macs.service```
Узнать статус: ```systemctl status apply_macs.service```
2023-04-16 09:34:19 +03:00
2023-04-16 10:03:21 +03:00
### Автоматическое версионирование и деплой конфигов (pushgit)
2023-04-16 13:14:42 +03:00
2023-04-17 19:09:51 +03:00
Службы ```pushgit``` (и таймер ```pushgit.timer```) и ```pushgit_inotify``` обеспечивают автоматическое сохранение конфигов в репозиторий Git на удаленном сервере.
2023-04-16 13:14:42 +03:00
Это позволяет сохранять изменения в файлах и версионировать их, что упрощает управление конфигурационными файлами и предотвращает потерю данных при их случайном изменении или удалении.
2023-04-17 14:15:09 +03:00
Данные сохраняются при каждом сохранении файлов или каждый день, если отключен или не сработал мониторинг сохранения.
2023-04-16 19:05:11 +03:00
Чтобы отключить сохранение каждый день, надо остановить службу: ```systemctl stop pushgit.timer```. Запустить обратно — ```systemctl start pushgit.timer```.
Чтобы отключить сохранение по изменению файлов, надо остановить службу: ```systemctl stop pushgit_inotify.service```. Запустить обратно — ```systemctl start pushgit_inotify.service```.
2023-04-16 10:06:51 +03:00
2023-04-17 15:43:57 +03:00
Для принудительной загрузки конфигов надо выполнить в консоли контроллера ```systemctl start pushgit.service```
Все эти действия можно так же сделать из виджета, скрипт для которого устанавливается на контроллер автоматически.
![Внешний вид виджета](miscellaneous/panel.png)
2023-04-17 14:15:09 +03:00
2023-04-16 19:15:13 +03:00
## Разное
### Обновление скриптов
2023-04-17 13:33:13 +03:00
2023-04-17 15:51:23 +03:00
При повторном запуске команда ```install``` перезапишет файлы скриптов и сервисов для обновления скриптов на существующих контроллерах, если вышла новая версия VestaSync.
В этом случае в ```--device_ip``` можно передать несколько IP-адресов, разделенных пробелами:
2023-04-17 19:00:29 +03:00
```bash
./vestasync.py --cmd install \
--device_ip 192.168.98.92 192.168.98.85 \
--gitea_address http://192.168.98.101:3001/ \
--device_new_name WB1 \
--gitea_token de8a2eaee0d2f27746157c2fd563815f932d670c
```
2023-04-17 15:51:23 +03:00
Обратите внимание, что устанавливать Vestasync на несколько контроллеров лучше с помощью скрипта ниже из раздела "Множественный запуск", потому что при указании набора из нескольких адресов ```device_ip``` с командой ```install``` у них будет одинаковые имена хостов (```--device_new_name WB1```), отличающееся только серийным номером: WB1-AFYATAO7, WB1-A3TBJXLS и так далее.
2023-04-16 19:15:13 +03:00
### Множественный запуск
Если вам надо запустить скрипт сразу на множестве контроллеров, это можно сделать так:
```bash
#!/bin/bash
2023-04-17 18:55:18 +03:00
GITEA_ADDRESS="http://192.168.1.101:3001/"
GITEA_TOKEN="de8a2eaee0d2f27746157c2fd563815f932d671c"
2023-04-16 19:15:13 +03:00
DEVICES=(
"192.168.1.1 WB1"
"192.168.1.2 WB2"
"192.168.1.3 WB3"
"192.168.1.4 WB4"
2023-04-17 18:55:18 +03:00
)
2023-04-16 19:15:13 +03:00
for DEVICE_INFO in "${DEVICES[@]}"; do
IP=$(echo "$DEVICE_INFO" | cut -d ' ' -f1)
DEVICE_NAME=$(echo "$DEVICE_INFO" | cut -d ' ' -f2)
echo "Run on $IP/$DEVICE_NAME"
./vestasync.py --cmd install --device_ip "$IP" --gitea_address "$GITEA_ADDRESS" --device_new_name "$DEVICE_NAME" --gitea_token "$GITEA_TOKEN"
done
```
2023-04-16 10:06:51 +03:00
2023-04-16 19:15:13 +03:00
### Gitea
2023-04-16 13:14:42 +03:00
2023-04-16 10:12:57 +03:00
В качестве git-сервера используется gitea. Предполагается, что она работает локально, но можно использовать и публичные инсталляции. Устанавливать ее можно любым удобным способом, например с помощью такого docker-compose:
2023-04-16 13:14:42 +03:00
2023-04-16 10:06:51 +03:00
```
version: "3"
networks:
gitea:
external: false
services:
server:
image: gitea/gitea:1.19.0
container_name: gitea
environment:
- USER_UID=1000
- USER_GID=1000
- GITEA__database__DB_TYPE=postgres
- GITEA__database__HOST=gitea_pg_db:5432
- GITEA__database__NAME=gitea
- GITEA__database__USER=gitea
- GITEA__database__PASSWD=gitea
restart: always
networks:
- gitea
volumes:
- /root/gitea/data:/data
- /etc/timezone:/etc/timezone:ro
- /etc/localtime:/etc/localtime:ro
ports:
- "3001:3000"
- "222:22"
depends_on:
- db
db:
image: postgres:14
restart: always
container_name: gitea_pg_db
environment:
- POSTGRES_USER=gitea
- POSTGRES_PASSWORD=gitea
- POSTGRES_DB=gitea
networks:
- gitea
volumes:
- /root/gitea/pg-data:/var/lib/postgresql/data
```
2023-04-16 13:14:42 +03:00
2023-04-17 19:09:51 +03:00
После запуска контейнера, надо перейти в веб-панель Gitea, создать там пользователя "vestasync", после чего получить в его настройках токен доступа, установив все галочки. В дальнейшем этот токен указывается в ```gitea_token```.