diff --git a/README.md b/README.md
index 8d57ff0..8f6b7be 100644
--- a/README.md
+++ b/README.md
@@ -13,7 +13,7 @@
| **security-alert-center** | Сервер SAC (Ubuntu 24.04) |
| [seaca](https://git.kalinamall.ru/PapaTramp/seaca) | Android-клиент |
-**Версия:** `0.20.6` · **Деплой:** `sudo /opt/sac-deploy.sh`
+**Версия:** `0.20.18` · **Деплой:** `sudo /opt/sac-deploy.sh`
## Возможности
@@ -22,7 +22,7 @@
- **Оповещения** — Telegram, email, webhook, FCM (Seaca); severity + cooldown
- **UI** — события, хосты, problems, отчёты, обзор (SSE live), настройки (admin)
- **RDG flap** — бейдж на событиях 302/303, **qwinsta/logoff** по WinRM на клиентский ПК (нужен domain admin в настройках)
-- **Хосты** — статус агента, inventory, обновление ssh-monitor/RDP (SSH/WinRM), тест Git/SSH/WinRM
+- **Хосты** — статус агента, inventory, обновление ssh-monitor/RDP (SSH/WinRM), тест Git/SSH/WinRM; WinRM RDP: SAC тянет пакет с git, клиент скачивает zip с SAC, локальный `Deploy-LoginMonitor.ps1` (git на ПК не нужен)
- **Мобильные** — enrollment, устройства, push; Seaca: ack/resolve, qwinsta/logoff через API SAC
- **Роли** — `admin` / `monitor`; JWT, rate limit входа
diff --git a/README_en.md b/README_en.md
index 2dc5a42..007bbab 100644
--- a/README_en.md
+++ b/README_en.md
@@ -13,7 +13,7 @@ Self-hosted hub for security events from Linux and Windows agents: ingest, corre
| **security-alert-center** | SAC server (Ubuntu 24.04) |
| [seaca](https://git.kalinamall.ru/PapaTramp/seaca) | Android client |
-**Version:** `0.20.6` · **Deploy:** `sudo /opt/sac-deploy.sh`
+**Version:** `0.20.18` · **Deploy:** `sudo /opt/sac-deploy.sh`
## Features
@@ -22,7 +22,7 @@ Self-hosted hub for security events from Linux and Windows agents: ingest, corre
- **Notifications** — Telegram, email, webhook, FCM (Seaca)
- **Web UI** — events, hosts, problems, reports, dashboard (SSE), settings (admin)
- **RDG flap** — badge on 302/303 events, **qwinsta/logoff** via WinRM to client PC (domain admin required)
-- **Hosts** — agent status, inventory, agent updates (SSH/WinRM), connectivity tests
+- **Hosts** — agent status, inventory, agent updates (SSH/WinRM); WinRM RDP: SAC fetches from git, client downloads zip from SAC, runs local `Deploy-LoginMonitor.ps1` (no git on PC)
- **Mobile** — enrollment, devices, push; Seaca: ack/resolve, qwinsta/logoff via SAC API
- **Roles** — `admin` / `monitor`
diff --git a/docs/agent-control-plane.md b/docs/agent-control-plane.md
index f286897..ae0be58 100644
--- a/docs/agent-control-plane.md
+++ b/docs/agent-control-plane.md
@@ -166,12 +166,18 @@ sequenceDiagram
### 4.3. B2 — Fallback (SSH / WinRM)
-Если за **N минут** нет `agent.update.*` или статус `failed`:
+Кнопка на карточке хоста: **«Обновить через WinRM»** / **«Fallback SSH»** (`POST .../actions/agent-update-fallback`). Лог операции — модалка сразу при старте (не ждёт конца).
-| OS | Метод | Credentials |
-|----|--------|-------------|
-| Linux | SSH из SAC | ключ после bootstrap (§5) |
-| Windows | WinRM | encrypted login/password в БД |
+Если за **N минут** нет `agent.update.*` или статус `failed` — тот же fallback может сработать автоматически (если включён в настройках).
+
+| OS | Метод | Credentials | Как работает (SAC 0.20.18+) |
+|----|--------|-------------|------------------------------|
+| Linux | SSH | ключ после bootstrap (§5) | SAC передаёт `REPO_URL` / `GIT_BRANCH` из **Настройки → Обновления агентов** в `update_ssh_monitor.sh` (не дефолт GitHub на хосте) |
+| Windows | WinRM | encrypted login/password в БД | 1) SAC `git fetch` RDP-login-monitor на сервере → zip с UTF-8 BOM для `.ps1`
2) Клиент по WinRM: `Invoke-WebRequest` → `https:///api/v1/agent/rdp-bundle/`
3) Распаковка в `C:\ProgramData\RDP-login-monitor\_sac_staging`
4) `Deploy-LoginMonitor.ps1 -SourceShareRoot` (файлы в `ProgramData\RDP-login-monitor\`) |
+
+**Windows — требования:** domain admin в **Настройки → Управление хостами → Windows**; `rdp_git_repo_url` в **Обновления агентов**; ПК должен открывать `SAC_PUBLIC_URL` (HTTPS). **Git на клиенте не нужен.** GPO/NETLOGON по-прежнему основной путь в режиме GPO.
+
+**nginx:** для `agent-update-fallback` и SSH/WinRM-тестов — `proxy_read_timeout 960s` (см. `deploy/nginx/sac.conf.tls.example`).
---
@@ -285,7 +291,7 @@ Authorization: Bearer sac_xxx
| **4** | WinRM qwinsta с сервера SAC | ✅ |
| **5** | Settings «Обновления агентов», SSH bootstrap | частично ✅ |
| **6** | Self-update B1 | ⏳ |
-| **7** | SSH bootstrap + WinRM fallback | ⏳ |
+| **7** | SSH bootstrap + WinRM fallback | частично ✅ (SSH/WinRM update из UI, git URL из настроек) |
| **8** | Desired config per host | ⏳ |
**Миграция:** `016_agent_commands`. Env: `SAC_RDG_FLAP_*`, `SAC_WIN_ADMIN_USER`, `SAC_WIN_ADMIN_PASSWORD`.
diff --git a/docs/deployment.md b/docs/deployment.md
index e3a744c..2a82022 100644
--- a/docs/deployment.md
+++ b/docs/deployment.md
@@ -113,6 +113,10 @@ curl -sS https://sac.kalinamall.ru/health
sudo /opt/sac-deploy.sh
```
+Краткий **502 Bad Gateway** в UI (~10 с) возможен при перезапуске `sac-api` — список хостов автоматически повторяет запрос; после деплоя обновите страницу.
+
+**Важно в `sac-api.env`:** `SAC_PUBLIC_URL=https://sac.kalinamall.ru` — нужен для WinRM-обновления RDP (клиент скачивает zip с SAC). API: **2 worker** uvicorn (`deploy/systemd/sac-api.service`).
+
Установка скрипта (один раз): `sudo cp /opt/security-alert-center/deploy/sac-deploy.sh /opt/sac-deploy.sh && sudo chmod 755 /opt/sac-deploy.sh`
После **force-push** на upstream remote обычный `git pull` на сервере падает с «diverging branches». Скрипт `sac-deploy.sh` (актуальная версия) делает `fetch` и при необходимости `reset --hard` к upstream. **Один раз вручную**, если на сервере ещё старый скрипт: