# Автообновление ssh-monitor Скрипт **`update_ssh_monitor.sh`** в корне репозитория обновляет установленный **`/usr/local/bin/ssh-monitor`** из git-репозитория и перезапускает systemd-сервис. Конфиг **`/etc/ssh-monitor.conf`**, watchdog и таймеры **не изменяются**. Установка самого монитора и unit-файлов: [README.md](../README.md), зависимости: [install-prerequisites.ru.md](install-prerequisites.ru.md). ## Что делает скрипт 1. Создаёт рабочий каталог **`UPDATE_DIR`** (по умолчанию `/opt/scripts/update`). 2. Проверяет наличие **`ipset`**; при отсутствии пытается установить через пакетный менеджер (apt, yum, dnf, pacman, zypper). Без ipset скрипт завершается с ошибкой — новая версия монитора с **`ENABLE_IP_BAN=1`** требует ipset. 3. В **`UPDATE_DIR`** выполняет **`git clone`** или **`git pull origin main`** репозитория. 4. Ищет файл **`ssh-monitor`** в клоне: - `$UPDATE_DIR/ssh-monitor/src/branch/main/ssh-monitor` (структура GitLab); - `$UPDATE_DIR/ssh-monitor/ssh-monitor` (плоский репозиторий, как в этом проекте). 5. Сравнивает **SHA256** удалённого файла с **`LOCAL_SCRIPT_PATH`** (по умолчанию `/usr/local/bin/ssh-monitor`). 6. **Всегда** (независимо от шага 5) синхронизирует **`sac-client.sh`** в каталог рядом с монитором (по умолчанию **`/usr/local/bin/sac-client.sh`**) — нужен для **`UseSAC`** и **`--check-sac`**. 7. При отличии checksum **`ssh-monitor`** и/или **`sac-client.sh`**: - резервная копия `ssh-monitor.backup.YYYYMMDD_HHMMSS` (только для основного скрипта); - `cp` + `chmod +x` для `ssh-monitor`, `chmod 644` для `sac-client.sh`; - **`systemctl restart ssh-monitor.service`** (если есть systemctl). 8. Пишет лог в **`LOG_FILE`** (по умолчанию `/var/log/update_script.log`). ```mermaid flowchart LR A[cron/timer] --> B[update_ssh_monitor.sh] B --> C[git pull/clone] C --> D[sync sac-client.sh] C --> E{SHA256 ssh-monitor?} D --> F{что-то обновилось?} E -->|да| G[backup + cp ssh-monitor] E -->|нет| F G --> F F -->|да| H[restart ssh-monitor.service] F -->|нет| I[без изменений] ``` ## Настройка перед первым запуском Отредактируйте переменные в начале **`update_ssh_monitor.sh`**: | Переменная | По умолчанию | Назначение | |------------|--------------|------------| | `UPDATE_DIR` | `/opt/scripts/update` | Каталог для git-клона | | `REPO_URL` | `https://git.kalinamall.ru/PapaTramp/ssh-monitor.git` | URL закрытого репозитория (на GitHub в репо — placeholder) | | `LOCAL_SCRIPT_PATH` | `/usr/local/bin/ssh-monitor` | Куда копировать бинарник | | `LOG_FILE` | `/var/log/update_script.log` | Лог обновлений | | `DEBUG` | `0` | `1` — подробный DEBUG в лог | Требования на сервере: - **root** (или sudo) для `cp`, `systemctl`, установки ipset; - **git** и сетевой доступ к репозиторию (SSH-ключ или HTTPS); - ветка в скрипте жёстко **`main`** — при другой ветке измените `git pull` в файле. ## Первичная установка (--deploy) Один сценарий для нового сервера (клон git, `ssh-monitor`, `sac-client.sh`, пример конфига, systemd unit): ```bash cd /path/to/ssh-monitor # или curl/clone репозитория sudo ./first_deploy.sh # то же самое: sudo ./update_ssh_monitor.sh --deploy ``` Скрипт выводит в консоль, **куда что скопировано**, и список переменных для **`/etc/ssh-monitor.conf`**. Существующий конфиг **не перезаписывается**. После установки отредактируйте конфиг и проверьте: ```bash sudo nano /etc/ssh-monitor.conf sudo /usr/local/bin/ssh-monitor --check-config sudo /usr/local/bin/ssh-monitor --check-sac sudo systemctl restart ssh-monitor.service ``` ## Установка updater (для последующих обновлений) ```bash sudo mkdir -p /opt/scripts sudo cp update_ssh_monitor.sh /opt/scripts/update_ssh_monitor.sh sudo chmod 750 /opt/scripts/update_ssh_monitor.sh ``` Проверка вручную: ```bash sudo /opt/scripts/update_ssh_monitor.sh sudo tail -20 /var/log/update_script.log sudo systemctl status ssh-monitor ``` ## Запуск по расписанию ### Cron (пример: каждый день в 04:00) ```bash sudo crontab -e ``` Добавьте: ``` 0 4 * * * /opt/scripts/update_ssh_monitor.sh ``` ### systemd timer (альтернатива) Создайте `/etc/systemd/system/ssh-monitor-update.service`: ```ini [Unit] Description=Update ssh-monitor from git [Service] Type=oneshot ExecStart=/opt/scripts/update_ssh_monitor.sh ``` И `/etc/systemd/system/ssh-monitor-update.timer`: ```ini [Unit] Description=Daily ssh-monitor update [Timer] OnCalendar=*-*-* 04:00:00 Persistent=true [Install] WantedBy=timers.target ``` ```bash sudo systemctl daemon-reload sudo systemctl enable --now ssh-monitor-update.timer ``` ## Откат после неудачного обновления Резервные копии лежат рядом с установленным скриптом: ```bash ls -la /usr/local/bin/ssh-monitor.backup.* sudo cp /usr/local/bin/ssh-monitor.backup.YYYYMMDD_HHMMSS /usr/local/bin/ssh-monitor sudo systemctl restart ssh-monitor.service ``` ## Лог и диагностика «мгновенного» завершения Все шаги пишутся в **`/var/log/update_script.log`**. При обычном запуске те же строки дублируются в stdout (кроме **`--quiet`**). В конце каждого прогона — блок **«Итог обновления»**: статус `ssh-monitor` / `sac-client` / git / перезапуск и **причина**, если файлы не копировались (checksum совпал, git pull failed, скрипт не найден в клоне). ```bash sudo /opt/scripts/update_ssh_monitor.sh sudo tail -40 /var/log/update_script.log ``` ## Ограничения - Обновляется **только** файл **`ssh-monitor`**, не конфиг и не watchdog. - При недоступном git **`git pull`** пишет предупреждение и продолжает с локальной копией. - На **git.kalinamall.ru** в `update_ssh_monitor.sh` уже задан внутренний **`REPO_URL`**; на GitHub остаётся placeholder для форка.