feat: release 2.2.1-SAC — phase 2 manifest verify and quiet SAC updates
Pinned GIT_REF/verify, release manifest, no blind reset --hard; suppress lifecycle and watchdog Telegram during updater; healthcheck via json.dumps.
This commit is contained in:
+174
-113
@@ -1,113 +1,174 @@
|
||||
# Автообновление ssh-monitor
|
||||
|
||||
|
||||
|
||||
Скрипт **`update_ssh_monitor.sh`** обновляет **`/usr/local/bin/ssh-monitor`** из git и перезапускает systemd-сервис.
|
||||
|
||||
|
||||
|
||||
## Основной путь: Security Alert Center
|
||||
|
||||
|
||||
|
||||
На продакшен-хостах обновление идёт **через SAC**, без cron:
|
||||
|
||||
|
||||
|
||||
1. Админ нажимает **«Обновить ssh-monitor (SSH)»** в карточке хоста.
|
||||
|
||||
2. SAC по SSH запускает `/opt/scripts/update_ssh_monitor.sh` с `REPO_URL` / `GIT_BRANCH` из **Настройки → Обновления агентов**.
|
||||
|
||||
3. Updater сам выполняет `git pull`, синхронизирует `sac-client.sh` и watchdog, дописывает отсутствующие ключи в **`/etc/ssh-monitor.conf`**, **выставляет `chmod`/`chown`** на конфиг, SAC-spool, счётчики и state-файлы, перезапускает **`ssh-monitor.service`**.
|
||||
|
||||
|
||||
|
||||
Участие админа на сервере **не требуется** (кроме первичной настройки `SAC_URL` / `SAC_API_KEY` в конфиге).
|
||||
|
||||
|
||||
|
||||
При **первой установке** (нет updater на хосте) SAC выполняет bootstrap с **`--deploy`**: clone, ipset при необходимости, systemd unit, полный hardening.
|
||||
|
||||
|
||||
|
||||
**Cron / systemd timer** — опциональная альтернатива с тем же скриптом и обязательным `REPO_URL` в окружении.
|
||||
|
||||
|
||||
|
||||
Watchdog и таймеры watchdog **не изменяются** при обычном update (кроме синхронизации скрипта watchdog из git).
|
||||
|
||||
|
||||
|
||||
**Конфиг `/etc/ssh-monitor.conf`:** при первой установке копируется из `ssh-monitor.conf.example`. При каждом update в **существующий** конфиг **дописываются** отсутствующие SAC-переменные и ключи безопасности; **`UseSAC=fallback`**. Telegram/SMTP и прочие ключи **не перезаписываются**.
|
||||
|
||||
|
||||
|
||||
Установка монитора и unit-файлов: [README.md](../README.md), зависимости: [install-prerequisites.ru.md](install-prerequisites.ru.md).
|
||||
|
||||
|
||||
|
||||
## Что делает скрипт
|
||||
|
||||
|
||||
|
||||
1. Создаёт рабочий каталог **`UPDATE_DIR`** (по умолчанию `/opt/scripts/update`).
|
||||
|
||||
2. При **`--deploy`** / bootstrap SAC проверяет **`ipset`** и при отсутствии пытается установить через пакетный менеджер. Обычное обновление **не** вызывает `apt-get`.
|
||||
|
||||
3. В **`UPDATE_DIR`** выполняет **`git clone`** или **`git pull`** репозитория.
|
||||
|
||||
4. Ищет **`ssh-monitor`** в клоне (GitLab layout или плоский репозиторий).
|
||||
|
||||
5. Сравнивает **SHA256** с **`LOCAL_SCRIPT_PATH`** (`/usr/local/bin/ssh-monitor`).
|
||||
|
||||
6. **Всегда** синхронизирует **`sac-client.sh`**, **`ssh-monitor-perms.sh`**, watchdog.
|
||||
|
||||
7. Дописывает ключи конфига; **`apply_runtime_security_hardening`**: `chmod 600` конфиг, `700` spool, `600` state/SAC-файлы, whitelist.
|
||||
|
||||
8. При изменении **`ssh-monitor`**, **`sac-client.sh`** или конфига — **`systemctl restart ssh-monitor.service`**.
|
||||
|
||||
9. Лог: **`/var/log/update_script.log`** (блок «Итог обновления», строка `security hardening`).
|
||||
|
||||
|
||||
|
||||
```mermaid
|
||||
|
||||
flowchart LR
|
||||
|
||||
A[SAC или cron] --> B[update_ssh_monitor.sh]
|
||||
|
||||
B --> C[git pull/clone]
|
||||
|
||||
C --> D[sync sac-client + perms lib]
|
||||
|
||||
C --> E{SHA256 ssh-monitor?}
|
||||
|
||||
D --> F[harden config/spool/state]
|
||||
|
||||
E -->|да| G[backup + cp ssh-monitor]
|
||||
|
||||
E -->|нет| F
|
||||
|
||||
G --> F
|
||||
|
||||
F --> H{что-то изменилось?}
|
||||
|
||||
H -->|да| I[restart ssh-monitor.service]
|
||||
|
||||
H -->|нет| J[без перезапуска]
|
||||
|
||||
```
|
||||
|
||||
|
||||
|
||||
## Настройка перед первым запуском
|
||||
|
||||
|
||||
|
||||
| Переменная | По умолчанию | Назначение |
|
||||
|
||||
|------------|--------------|------------|
|
||||
|
||||
| `UPDATE_DIR` | `/opt/scripts/update` | Каталог для git-клона |
|
||||
|
||||
| `REPO_URL` | *(обязательно)* | URL git — задаётся SAC, export или `Environment=` в cron |
|
||||
# Автообновление ssh-monitor
|
||||
|
||||
Скрипт **`update_ssh_monitor.sh`** обновляет **`/usr/local/bin/ssh-monitor`** из git и перезапускает systemd-сервис.
|
||||
|
||||
## Основной путь: Security Alert Center
|
||||
|
||||
На продакшен-хостах обновление идёт **через SAC**, без cron:
|
||||
|
||||
1. Админ нажимает **«Обновить ssh-monitor (SSH)»** в карточке хоста.
|
||||
2. SAC по SSH запускает `/opt/scripts/update_ssh_monitor.sh` с `REPO_URL` / `GIT_BRANCH` из **Настройки → Обновления агентов**.
|
||||
3. Updater сам выполняет `git pull`, синхронизирует `sac-client.sh` и watchdog, дописывает отсутствующие ключи в **`/etc/ssh-monitor.conf`**, **выставляет `chmod`/`chown`** на конфиг, SAC-spool, счётчики и state-файлы, перезапускает **`ssh-monitor.service`**.
|
||||
|
||||
Участие админа на сервере **не требуется** (кроме первичной настройки `SAC_URL` / `SAC_API_KEY` в конфиге).
|
||||
|
||||
При **первой установке** (нет updater на хосте) SAC выполняет bootstrap с **`--deploy`**: clone, ipset при необходимости, systemd unit, полный hardening.
|
||||
|
||||
**Cron / systemd timer** — опциональная альтернатива с тем же скриптом и обязательным `REPO_URL` в окружении.
|
||||
|
||||
Watchdog и таймеры watchdog **не изменяются** при обычном update (кроме синхронизации скрипта watchdog из git).
|
||||
|
||||
**Конфиг `/etc/ssh-monitor.conf`:** при первой установке копируется из `ssh-monitor.conf.example`. При каждом update в **существующий** конфиг **дописываются** отсутствующие SAC-переменные и ключи безопасности; **`UseSAC=fallback`**. Telegram/SMTP и прочие ключи **не перезаписываются**.
|
||||
|
||||
Установка монитора и unit-файлов: [README.md](../README.md), зависимости: [install-prerequisites.ru.md](install-prerequisites.ru.md).
|
||||
|
||||
## Что делает скрипт
|
||||
|
||||
1. Создаёт рабочий каталог **`UPDATE_DIR`** (по умолчанию `/opt/scripts/update`).
|
||||
2. При **`--deploy`** / bootstrap SAC проверяет **`ipset`** и при отсутствии пытается установить через пакетный менеджер. Обычное обновление **не** вызывает `apt-get`.
|
||||
3. В **`UPDATE_DIR`** выполняет **`git clone`** или **`git fetch` + checkout / `git pull --ff-only`** (без слепого `reset --hard`).
|
||||
4. Проверяет **`release/manifest-VERSION.json`** (SHA256 файлов + commit) **до** копирования в `/usr/local/bin`.
|
||||
5. Ищет **`ssh-monitor`** в клоне (GitLab layout или плоский репозиторий).
|
||||
6. Сравнивает **SHA256** с **`LOCAL_SCRIPT_PATH`** (`/usr/local/bin/ssh-monitor`).
|
||||
7. **Всегда** синхронизирует **`sac-client.sh`**, **`ssh-monitor-perms.sh`**, watchdog.
|
||||
8. Дописывает ключи конфига; **`apply_runtime_security_hardening`**: `chmod 600` конфиг, `700` spool, `600` state/SAC-файлы, whitelist.
|
||||
9. При изменении **`ssh-monitor`**, **`sac-client.sh`** или конфига — **`systemctl restart ssh-monitor.service`**.
|
||||
10. Лог: **`/var/log/update_script.log`** (блок «Итог обновления», строки `manifest` и `security hardening`).
|
||||
|
||||
```mermaid
|
||||
flowchart LR
|
||||
A[SAC или cron] --> B[update_ssh_monitor.sh]
|
||||
B --> C[git fetch/checkout]
|
||||
C --> M{manifest OK?}
|
||||
M -->|нет| X[exit 1]
|
||||
M -->|да/skip| D[sync sac-client + perms lib]
|
||||
C --> E{SHA256 ssh-monitor?}
|
||||
D --> F[harden config/spool/state]
|
||||
E -->|да| G[backup + cp ssh-monitor]
|
||||
E -->|нет| F
|
||||
G --> F
|
||||
F --> H{что-то изменилось?}
|
||||
H -->|да| I[restart ssh-monitor.service]
|
||||
H -->|нет| J[без перезапуска]
|
||||
```
|
||||
|
||||
## Настройка перед первым запуском
|
||||
|
||||
| Переменная | По умолчанию | Назначение |
|
||||
|------------|--------------|------------|
|
||||
| `UPDATE_DIR` | `/opt/scripts/update` | Каталог для git-клона |
|
||||
| `REPO_URL` | *(обязательно)* | URL git — задаётся SAC, export или `Environment=` в cron |
|
||||
| `GIT_BRANCH` | `main` | Ветка для clone/pull, если **`GIT_REF`** не задан |
|
||||
| `GIT_REF` | *(пусто)* | Тег (`2.2.0-SAC`), ветка или commit SHA для checkout |
|
||||
| `GIT_VERIFY_MODE` | `off` | `off` \| `tag` \| `commit` — см. раздел ниже |
|
||||
| `GIT_ALLOW_RESET` | `0` | `1` = разрешить `git reset --hard` при расхождении истории (риск) |
|
||||
| `RELEASE_MANIFEST_STRICT` | `0` | `1` = exit 1, если manifest для версии не найден |
|
||||
| `LOCAL_SCRIPT_PATH` | `/usr/local/bin/ssh-monitor` | Куда копировать монитор |
|
||||
| `LOG_FILE` | `/var/log/update_script.log` | Лог обновлений |
|
||||
| `UPDATE_VIA_SAC` | *(опционально)* | SAC выставляет `1`; при отсутствии бинарника включается `--deploy` |
|
||||
|
||||
Требования: **root**, **git**, **python3** (manifest verify), доступ к репозиторию.
|
||||
|
||||
## Pinned ref и manifest (2.2.0+)
|
||||
|
||||
Updater читает **`GIT_REF`**, **`GIT_VERIFY_MODE`**, **`GIT_ALLOW_RESET`** из env или `/etc/ssh-monitor.conf`.
|
||||
|
||||
### Режимы `GIT_VERIFY_MODE`
|
||||
|
||||
| Режим | Поведение | Когда |
|
||||
|-------|-----------|-------|
|
||||
| **`off`** | После fetch принять ref как есть | Тест, legacy; дефолт в скрипте |
|
||||
| **`tag`** | `GIT_REF` должен существовать как тег | **Рекомендуется для прода** |
|
||||
| **`commit`** | `GIT_REF` = полный SHA commit | Жёсткий pin без тегов |
|
||||
|
||||
Если **`GIT_REF`** пуст, используется **`GIT_BRANCH`** (`git pull --ff-only`). При невозможности fast-forward updater **не** делает `reset --hard` (только с **`GIT_ALLOW_RESET=1`**).
|
||||
|
||||
### Release manifest
|
||||
|
||||
В репозитории: **`release/manifest-VERSION.json`** — SHA256 ключевых файлов и `git_commit`. Updater сверяет manifest **после** git sync и **до** копирования бинарников.
|
||||
|
||||
- Файл найден и hash не совпал → **exit 1**, ничего не перезаписывается.
|
||||
- Файл не найден → WARN, update продолжается (или exit 1 при **`RELEASE_MANIFEST_STRICT=1`**).
|
||||
- Копирование **`update_ssh_monitor.sh`** в `/opt/scripts/` и re-exec — только если manifest для версии был и прошёл verify.
|
||||
|
||||
Генерация при релизе (после **финального** коммита кода, чтобы `git_commit` в manifest совпал с HEAD):
|
||||
|
||||
```bash
|
||||
git commit -m "release: 2.2.0-SAC"
|
||||
./scripts/build-release-manifest.sh 2.2.0-SAC
|
||||
git add release/manifest-2.2.0-SAC.json && git commit -m "release: manifest 2.2.0-SAC"
|
||||
git tag 2.2.0-SAC
|
||||
```
|
||||
|
||||
### Примеры для прода
|
||||
|
||||
**SAC / env на хосте** (через настройки SAC или unit):
|
||||
|
||||
```bash
|
||||
REPO_URL=https://git.kalinamall.ru/PapaTramp/ssh-monitor.git
|
||||
GIT_REF=2.2.0-SAC
|
||||
GIT_VERIFY_MODE=tag
|
||||
```
|
||||
|
||||
**systemd timer** (`/etc/systemd/system/ssh-monitor-update.service`):
|
||||
|
||||
```ini
|
||||
[Service]
|
||||
Type=oneshot
|
||||
Environment=REPO_URL=https://git.kalinamall.ru/PapaTramp/ssh-monitor.git
|
||||
Environment=GIT_REF=2.2.0-SAC
|
||||
Environment=GIT_VERIFY_MODE=tag
|
||||
ExecStart=/opt/scripts/update_ssh_monitor.sh
|
||||
```
|
||||
|
||||
При доверенном закрытом зеркале **manifest + `GIT_REF=tag`** — достаточный минимум; GPG-подписи тегов — backlog (см. [security-roadmap.ru.md](security-roadmap.ru.md)).
|
||||
|
||||
## Первичная установка (--deploy)
|
||||
|
||||
```bash
|
||||
sudo REPO_URL=https://git.kalinamall.ru/PapaTramp/ssh-monitor.git ./update_ssh_monitor.sh --deploy
|
||||
# или first_deploy.sh с REPO_URL в окружении
|
||||
```
|
||||
|
||||
Через SAC bootstrap выполняется автоматически с **`--deploy`**.
|
||||
|
||||
## Установка updater (если не через SAC bootstrap)
|
||||
|
||||
```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 REPO_URL=https://git.kalinamall.ru/PapaTramp/ssh-monitor.git /opt/scripts/update_ssh_monitor.sh
|
||||
sudo tail -30 /var/log/update_script.log
|
||||
```
|
||||
|
||||
## Запуск по расписанию (опционально)
|
||||
|
||||
### Cron
|
||||
|
||||
```
|
||||
0 4 * * * REPO_URL=https://git.kalinamall.ru/PapaTramp/ssh-monitor.git /opt/scripts/update_ssh_monitor.sh
|
||||
```
|
||||
|
||||
### systemd timer
|
||||
|
||||
См. предыдущие примеры `ssh-monitor-update.service` / `.timer` с `Environment=REPO_URL=...`.
|
||||
|
||||
## Откат
|
||||
|
||||
```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
|
||||
```
|
||||
|
||||
## Ограничения
|
||||
|
||||
- Секреты (`SAC_API_KEY`, Telegram) SAC **не** прописывает — только в `/etc/ssh-monitor.conf` на хосте.
|
||||
- При недоступном git **`git pull`** пишет предупреждение и продолжает с локальной копией.
|
||||
- **`REPO_URL`** без дефолта в скрипте — только доверенное зеркало (kalinamall / своё Gitea).
|
||||
|
||||
+21
-20
@@ -25,12 +25,13 @@
|
||||
| **2.1.7-SAC** | Фаза 1 + выбранное из Фазы 4 | Права, `REPO_URL` обязателен, webhook, docs | ✅ реализовано |
|
||||
| **2.1.8-SAC** | Дополнение к 1.1 | SAC-first update: hardening прав на каждом прогоне updater | ✅ реализовано |
|
||||
| **2.1.9-SAC** | Дополнение к 1.x | Watchdog: `🖥️ Сервер:` в Telegram (как у агента) | ✅ реализовано |
|
||||
| **2.2.0-SAC** | **Фаза 2** | Manifest, pinned ref, без слепого `reset --hard` | **следующий релиз** |
|
||||
| **2.2.1-SAC** | Дополнение к 2.2.0 | Подавление lifecycle/watchdog TG при SAC-update | ✅ реализовано |
|
||||
| **2.2.0-SAC** | **Фаза 2** | Manifest, pinned ref, без слепого `reset --hard` | ✅ реализовано |
|
||||
| **2.3.0-SAC** | Фаза 3 | Парсер конфига без `source` (minor breaking) |
|
||||
|
||||
Bump: `ssh-monitor` (`SSH_MONITOR_VERSION`) + `version.txt` в каждом релизе.
|
||||
|
||||
**Текущий статус (2026-07-08):** фаза 1 закрыта (2.1.7–2.1.9). **Дальше — фаза 2 → релиз 2.2.0-SAC.**
|
||||
**Текущий статус (2026-07-08):** фаза 2 закрыта (2.2.0-SAC). **Дальше — фаза 3 → релиз 2.3.0-SAC.**
|
||||
Backlog по ingest при массовом update (SAC + ops): [ingest-mass-update-backlog.ru.md](https://git.kalinamall.ru/PapaTramp/security-alert-center/src/branch/main/docs/ingest-mass-update-backlog.ru.md) (отдельный ToDo, не блокирует 2.2.0).
|
||||
|
||||
---
|
||||
@@ -107,23 +108,23 @@ Backlog по ingest при массовом update (SAC + ops): [ingest-mass-upd
|
||||
| **`tag`** | `GIT_REF` должен быть **аннотированным тегом**; опционально `git tag -v` (см. 2.4) | **Рекомендуется для прода** |
|
||||
| **`commit`** | `GIT_REF` = полный SHA; сверка с manifest | Жёсткий pin без тегов |
|
||||
|
||||
- [ ] Реализовать чтение `GIT_REF` / `GIT_VERIFY_MODE` в `update_ssh_monitor.sh`
|
||||
- [ ] Дефолты для 2.2.0: `GIT_REF` = тег из `version.txt` или `main` (утвердить завтра); `GIT_VERIFY_MODE=tag` для prod-документации
|
||||
- [ ] **`docs/auto-update.ru.md`**: отдельный раздел с примерами systemd и таблицей режимов (после реализации)
|
||||
- [x] Реализовать чтение `GIT_REF` / `GIT_VERIFY_MODE` в `update_ssh_monitor.sh`
|
||||
- [x] Дефолты для 2.2.0: `GIT_REF` пуст → `GIT_BRANCH`; `GIT_VERIFY_MODE=off` в скрипте, **`tag`** в prod-документации
|
||||
- [x] **`docs/auto-update.ru.md`**: отдельный раздел с примерами systemd и таблицей режимов
|
||||
|
||||
---
|
||||
|
||||
### 2.2 Без слепого `reset --hard` (C2) — **утверждено**
|
||||
|
||||
- [ ] При failed `git pull --ff-only`: **не** делать `reset --hard` автоматически
|
||||
- [ ] Лог + stderr: «история разошлась, требуется ручное вмешательство или новый clone»
|
||||
- [ ] Опционально: `GIT_ALLOW_RESET=1` только для ручного/CI (документировать риск)
|
||||
- [x] При failed `git pull --ff-only`: **не** делать `reset --hard` автоматически
|
||||
- [x] Лог + stderr: «история разошлась, требуется ручное вмешательство или новый clone»
|
||||
- [x] Опционально: `GIT_ALLOW_RESET=1` только для ручного/CI (документировать риск)
|
||||
|
||||
---
|
||||
|
||||
### 2.3 Release manifest (C2, C4) — **утверждено**
|
||||
|
||||
- [ ] Файл в репо, например `release/manifest-2.2.0-SAC.json`:
|
||||
- [x] Файл в репо, например `release/manifest-2.2.0-SAC.json`:
|
||||
|
||||
```json
|
||||
{
|
||||
@@ -138,10 +139,10 @@ Backlog по ingest при массовом update (SAC + ops): [ingest-mass-upd
|
||||
}
|
||||
```
|
||||
|
||||
- [ ] Публиковать manifest при каждом релизе (в git, рядом с тегом)
|
||||
- [ ] Updater: после checkout сверять SHA256 файлов из клона с manifest **до** копирования в `/usr/local/bin`
|
||||
- [ ] Несовпадение → exit 1, ничего не перезаписывать
|
||||
- [ ] Скрипт/цель в `Makefile` или `scripts/build-release-manifest.sh` для генерации
|
||||
- [x] Публиковать manifest при каждом релизе (в git, рядом с тегом)
|
||||
- [x] Updater: после checkout сверять SHA256 файлов из клона с manifest **до** копирования в `/usr/local/bin`
|
||||
- [x] Несовпадение → exit 1, ничего не перезаписывать
|
||||
- [x] Скрипт/цель в `Makefile` или `scripts/build-release-manifest.sh` для генерации
|
||||
|
||||
**Связь с 2.4:** manifest из **того же** `REPO_URL` защищает от подмены файлов в clone и от «не того» коммита; не защищает от полной компрометации git-сервера (для этого GPG).
|
||||
|
||||
@@ -159,16 +160,16 @@ Backlog по ingest при массовом update (SAC + ops): [ingest-mass-upd
|
||||
|
||||
**Решение для roadmap:**
|
||||
|
||||
- [ ] **2.2.0:** не блокировать релиз на GPG; `GIT_VERIFY_MODE=tag` без `-v`
|
||||
- [x] **2.2.0:** не блокировать релиз на GPG; `GIT_VERIFY_MODE=tag` без `-v`
|
||||
- [ ] **Backlog:** `GIT_GPG_VERIFY=1` + ключ в `/etc/ssh-monitor/trusted-release-key.asc`, если позже понадобится
|
||||
- [ ] Документировать: при доверенном закрытом зеркале manifest + `GIT_REF=tag` — **достаточный минимум**
|
||||
- [x] Документировать: при доверенном закрытом зеркале manifest + `GIT_REF=tag` — **достаточный минимум**
|
||||
|
||||
---
|
||||
|
||||
### 2.5 Re-exec updater только после verify (C4) — **утверждено**
|
||||
|
||||
- [ ] `UPDATER_REEXEC` / копирование `update_ssh_monitor.sh` в `/opt/scripts/` — только если manifest SHA256 совпал
|
||||
- [ ] Иначе: лог, старая версия updater остаётся, exit 1
|
||||
- [x] `UPDATER_REEXEC` / копирование `update_ssh_monitor.sh` в `/opt/scripts/` — только если manifest SHA256 совпал
|
||||
- [x] Иначе: лог, старая версия updater остаётся, exit 1
|
||||
|
||||
---
|
||||
|
||||
@@ -216,12 +217,12 @@ Backlog по ingest при массовом update (SAC + ops): [ingest-mass-upd
|
||||
|-------|--------|---------|
|
||||
| **4.4** `ensure_ipset_installed` не на каждый update | 2.1.7 | **Делаем:** только `--deploy` / `first_deploy.sh`; обычный update не вызывает `apt-get` | ✅ |
|
||||
| **4.3** Права whitelist-файла | 2.1.7 | **Делаем:** при загрузке `/etc/ssh_monitor_whitelist.txt` — WARN если не root:root | ✅ |
|
||||
| **4.5** JSON healthcheck через `json.dumps` | 2.2.0 | **Делаем:** мелкий fix L3 |
|
||||
| **4.5** JSON healthcheck через `json.dumps` | 2.2.0 | **Делаем:** мелкий fix L3 | ✅ |
|
||||
| **4.1** Секреты не через environ в Python | — | **Не делаем** (мало выигрыша при root) |
|
||||
| **4.2** Telegram token в URL | — | **Не делаем** (ограничение Bot API) |
|
||||
| **4.6** systemd hardening (non-root) | — | **Не делаем** (ipset/iptables требуют root) |
|
||||
| **M6** Ротация логов | — | Уже есть `contrib/logrotate.d/` — только упоминание в README |
|
||||
| **M7** `set_config_kv` sed | 2.2.0 | **Делаем:** экранирование `/` и `"` в `val` при merge конфига |
|
||||
| **M7** `set_config_kv` sed | 2.2.0 | **Делаем:** экранирование `/` и `"` в `val` при merge конфига | ✅ |
|
||||
|
||||
---
|
||||
|
||||
@@ -237,7 +238,7 @@ Backlog по ingest при массовом update (SAC + ops): [ingest-mass-upd
|
||||
## Чек-лист «перед стартом работы завтра»
|
||||
|
||||
- [x] **Релиз 2.1.7–2.1.9** — фаза 1 + SAC-first + watchdog server label
|
||||
- [ ] **Релиз 2.2.0** — scope: 2.1–2.3, 2.5, 4.5, 4.7(M7); **2.4 GPG отложить**
|
||||
- [x] **Релиз 2.2.0** — scope: 2.1–2.3, 2.5, 4.5, 4.7(M7); **2.4 GPG отложить**
|
||||
- [ ] **Релиз 2.3.0** — scope: 3.1–3.3, удаление webhook (если A)
|
||||
- [ ] **Дефолт `GIT_REF`** в 2.2.0: тег из `version.txt` vs `main`
|
||||
- [x] **Миграция хостов:** SAC-first update, `known_hosts`, `REPO_URL` через SAC
|
||||
|
||||
Reference in New Issue
Block a user