Files
ssh-monitor/docs/auto-update.ru.md
T
PTah 7f4d25b91c fix: sync /opt/scripts/update_ssh_monitor.sh from git clone each run
After git pull, copy updater from clone to DEPLOY_INSTALL_PATH and re-exec
once so cron always picks up new logging without manual cp.
2026-05-28 08:15:51 +10:00

7.9 KiB
Raw Blame History

Автообновление ssh-monitor

Скрипт update_ssh_monitor.sh в корне репозитория обновляет установленный /usr/local/bin/ssh-monitor из git-репозитория и перезапускает systemd-сервис. Конфиг /etc/ssh-monitor.conf, watchdog и таймеры не изменяются.

Установка самого монитора и unit-файлов: README.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).
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):

cd /path/to/ssh-monitor   # или curl/clone репозитория
sudo ./first_deploy.sh
# то же самое:
sudo ./update_ssh_monitor.sh --deploy

Скрипт выводит в консоль, куда что скопировано, и список переменных для /etc/ssh-monitor.conf. Существующий конфиг не перезаписывается.

После установки отредактируйте конфиг и проверьте:

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 (для последующих обновлений)

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

Проверка вручную:

sudo /opt/scripts/update_ssh_monitor.sh
sudo tail -20 /var/log/update_script.log
sudo systemctl status ssh-monitor

Запуск по расписанию

Cron (пример: каждый день в 04:00)

sudo crontab -e

Добавьте:

0 4 * * * /opt/scripts/update_ssh_monitor.sh

systemd timer (альтернатива)

Создайте /etc/systemd/system/ssh-monitor-update.service:

[Unit]
Description=Update ssh-monitor from git

[Service]
Type=oneshot
ExecStart=/opt/scripts/update_ssh_monitor.sh

И /etc/systemd/system/ssh-monitor-update.timer:

[Unit]
Description=Daily ssh-monitor update

[Timer]
OnCalendar=*-*-* 04:00:00
Persistent=true

[Install]
WantedBy=timers.target
sudo systemctl daemon-reload
sudo systemctl enable --now ssh-monitor-update.timer

Откат после неудачного обновления

Резервные копии лежат рядом с установленным скриптом:

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, скрипт не найден в клоне).

sudo /opt/scripts/update_ssh_monitor.sh
sudo tail -40 /var/log/update_script.log

Важно: после git pull в клоне скрипт сам обновляет /opt/scripts/update_ssh_monitor.sh из репозитория и один раз перезапускает себя (если вызывали именно этот путь). Если в логе старые строки вроде Checksums match без блока «Итог обновления» — на сервере ещё старая копия updater; один раз:

sudo cp /opt/scripts/update/ssh-monitor/update_ssh_monitor.sh /opt/scripts/update_ssh_monitor.sh
sudo chmod 750 /opt/scripts/update_ssh_monitor.sh
sudo /opt/scripts/update_ssh_monitor.sh

Ограничения

  • Обновляется только файл ssh-monitor, не конфиг и не watchdog.
  • При недоступном git git pull пишет предупреждение и продолжает с локальной копией.
  • На git.kalinamall.ru в update_ssh_monitor.sh уже задан внутренний REPO_URL; на GitHub остаётся placeholder для форка.