From 108c37cb5da82f33af3ce084a6f98b8f933df017 Mon Sep 17 00:00:00 2001 From: vvzvlad Date: Mon, 17 Apr 2023 23:09:51 +0700 Subject: [PATCH] update readme --- README.md | 17 +++++++++++------ miscellaneous/versions.jpeg | Bin 0 -> 20468 bytes 2 files changed, 11 insertions(+), 6 deletions(-) create mode 100644 miscellaneous/versions.jpeg diff --git a/README.md b/README.md index 905dff4..866adab 100644 --- a/README.md +++ b/README.md @@ -3,6 +3,9 @@ VestaSync - это ПО для бекапа и восстановления контроллеров Wirenboard. Оно решает две задачи: 1. Создание бекапа конфигурации автоматически и деплой ее на удаленный git-сервер (поддерживается Gitea, для поддержки других сервисов необходимо дописать соответствующую функцию создания репозитория) по расписанию (раз в день) и по изменению файлов. + +![Пример версионности конфигурации](miscellaneous/versions.jpeg) + 2. Восстановление бекапа одной командой: после подключения нового контроллера достаточно ввести его IP и имя хоста предыдущего контроллера, чтобы Vestasync автоматически восстановила бекап вплоть до MAC-адресов сетевых интерфейсов, чтобы не было нужды менять настройки на DHCP-сервере. После перезагрузки контроллер вернется в сеть с IP старого контроллера. VestaSync — это набор скриптов, которые выполняют следующие функции: @@ -10,7 +13,7 @@ VestaSync — это набор скриптов, которые выполня 1. При первоначальной установке на контроллер: - Создают в /mnt/data/etc/ git-репозитарий - - Сохраняют текущие MAC-адреса в /mnt/data/etc/vestasync/macs/[interface] + - Сохраняют текущие MAC-адреса в /mnt/data/etc/vestasync/macs/eth0(1...) - Сохраняют hostname в /mnt/data/etc/vestasync/hostname 2. При изменении конфигурационных файлов @@ -24,6 +27,8 @@ VestaSync — это набор скриптов, которые выполня - Восстанавливают конфиги, hostname и mac-адрес + + ## Установка VestaSync на локальную машину или запуск докер-контейнера **Эти команды выполняются не на контроллере**, а на локальной машине или на сервере, с которых есть доступ к контроллеру. Система изначально писалась для инсталляций с множеством контроллеров, поэтому она работает по модели ansible — при запуска на локальной машине сама заходит на пустой контроллер и настраивает его. @@ -75,10 +80,11 @@ docker run -it --name vestasync vvzvlad/vestasync:latest \ ```--cmd install``` означает, что надо установить Vestasync на контроллер и подготовить его к созданию бекапа ```--device_ip``` IP-адрес контроллера -```--gitea_address``` адрес Gitea-сервера в виде "http://192.168.1.101:3001/", куда будет загружаться бекапы конфигов +```--gitea_address``` адрес Gitea-сервера в виде "http://192.168.1.101:3001/", куда будет загружаться бекапы конфигов ```--device_new_name``` имя контроллера, из которого вместе с SN будет сформировано название контроллера, которое запишется в хостнейм и будет служить именем репозитария с конфигами ```--gitea_token``` токен для авторизации на Gitea-сервере (получается в интерфейсе Gitea) -```--user_cmd``` файл sh с командами, которые надо выполняить на контроллере для его настройки под ваши задачи (указывать необязательно). В нем можно описать любые команды, которыми вам надо конфигурировать контроллер: например, установка ключа SSH, установка таймзоны и локали, и так далее. Пример файла — ```files/user_cmd.sh```: +```--user_cmd``` файл sh с командами, которые надо выполняить на контроллере для его настройки под ваши задачи (указывать необязательно). В нем можно описать любые команды, которыми вам надо конфигурировать контроллер: например, установка ключа SSH, установка таймзоны и локали, и так далее. +Пример файла — ```files/user_cmd.sh```: ``` #!/usr/bin/env sh @@ -133,7 +139,7 @@ reboot ### Автоматическое версионирование и деплой конфигов (pushgit) -Службы pushgit (и таймер pushgit.timer) и pushgit_inotify обеспечивают автоматическое сохранение конфигов в репозиторий Git на удаленном сервере. +Службы ```pushgit``` (и таймер ```pushgit.timer```) и ```pushgit_inotify``` обеспечивают автоматическое сохранение конфигов в репозиторий Git на удаленном сервере. Это позволяет сохранять изменения в файлах и версионировать их, что упрощает управление конфигурационными файлами и предотвращает потерю данных при их случайном изменении или удалении. Данные сохраняются при каждом сохранении файлов или каждый день, если отключен или не сработал мониторинг сохранения. Чтобы отключить сохранение каждый день, надо остановить службу: ```systemctl stop pushgit.timer```. Запустить обратно — ```systemctl start pushgit.timer```. @@ -184,7 +190,6 @@ for DEVICE_INFO in "${DEVICES[@]}"; do 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 - ``` ### Gitea @@ -237,4 +242,4 @@ services: - /root/gitea/pg-data:/var/lib/postgresql/data ``` -После запуска контейнера, надо перейти в веб-панель Gitea, создать там пользователя "vestasync", после чего получить в его настройках токен доступа, установив все галочки. В дальнейшем этот токен указывается в ```gitea_token``` +После запуска контейнера, надо перейти в веб-панель Gitea, создать там пользователя "vestasync", после чего получить в его настройках токен доступа, установив все галочки. В дальнейшем этот токен указывается в ```gitea_token```. diff --git a/miscellaneous/versions.jpeg b/miscellaneous/versions.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..5c4d5a669ded5ca9ba95c4ce6a0ad8f20da653eb GIT binary patch literal 20468 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 literal 0 HcmV?d00001