A. kb-autosync.sh переписан: pull → regenerate index → commit → push. После каждого push с Mac индекс objects-map.json и _index.md обновляются автоматически на code-server (LXC 132). B. kb-objects-map.py + kb-objects-audit.py добавлены в воскресный weekly cron на LXC 132 — health-check автогенерируется раз в неделю. C. Чистка битых wiki-ссылок (score 84 → 9): - notes/govru-diagnosis → projects/niikn/govru-quickfix-playbook (2) - claude-memory/podkop → 2026-04-17-peredelki-podkop-stability-fix - [[../snippets/clients/]] → snippets/clients/ (текстом, 2) - [[feedback_*]] (user memory) → backtick-cited (2) - [[../znamenskoye/]] → [[../znamenskoye/README]] (4) Скрипт kb-objects-audit.py улучшен: regex теперь требует [[...]] с двойной скобкой (не одной), исключает audit/ и CLAUDE.md (placeholder и autogen). Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
134 lines
9.3 KiB
Markdown
134 lines
9.3 KiB
Markdown
---
|
||
date: 2026-04-29
|
||
type: deployment
|
||
tags: [rustdesk, deployment, installers, nextcloud, automation]
|
||
---
|
||
|
||
# RustDesk client deployment package — Nextcloud `RustDesk install/`
|
||
|
||
## Цель
|
||
|
||
Удобное развёртывание ~30-50 клиентских машин (НИИКН + клиенты) с pre-настроенным RustDesk. Клиент должен после установки сразу подключаться к `remot.dttb.ru`, без ручной настройки api/relay/key.
|
||
|
||
## Что сделано
|
||
|
||
В корне Nextcloud (`Nextcloud-admin@dttb․ru`) создана папка **`RustDesk install/`** с готовыми установщиками + автоматическими скриптами + конфигом.
|
||
|
||
### Структура
|
||
|
||
```
|
||
RustDesk install/ ~766 MB total
|
||
├── README.md инструкция для клиента
|
||
├── RustDesk2.toml шаблон конфига (ID/relay/api/key)
|
||
├── windows/
|
||
│ ├── rustdesk-1.4.6-x86_64.exe 23 MB - основной installer
|
||
│ ├── rustdesk-1.4.6-x86_64.msi 23 MB - MSI для GPO
|
||
│ ├── Install-Windows.ps1 PowerShell автоустановка
|
||
│ └── Install-Windows.bat wrapper, двойной клик → UAC → автоинстал
|
||
├── linux/
|
||
│ ├── rustdesk-1.4.6-x86_64.deb 22 MB
|
||
│ ├── rustdesk-1.4.6-aarch64.deb 20 MB
|
||
│ ├── rustdesk-1.4.6-x86_64.rpm 30 MB
|
||
│ ├── rustdesk-1.4.6-aarch64.rpm 29 MB
|
||
│ ├── rustdesk-1.4.6-x86_64.AppImage 81 MB - для дистрибутивов без apt/dnf
|
||
│ └── install-linux.sh bash, авто-detect arch + pkg manager
|
||
├── macos/
|
||
│ ├── rustdesk-1.4.6-aarch64.dmg 24 MB - Apple Silicon
|
||
│ ├── rustdesk-1.4.6-x86_64.dmg 31 MB - Intel
|
||
│ └── install-macos.sh bash, mount dmg + copy to /Applications
|
||
└── android/
|
||
└── rustdesk-1.4.6-universal.apk 67 MB
|
||
```
|
||
|
||
Версия RustDesk **1.4.6** (latest stable, релиз 2026-03-05). Совпадает с тем что у Олега на Mac и Windows-сервере.
|
||
|
||
## Что делает скрипт
|
||
|
||
1. **Установка** — silent через системный пакетный менеджер
|
||
2. **Остановка сервиса** перед перезаписью конфига (`Stop-Service RustDesk` / `systemctl stop rustdesk`)
|
||
3. **Копирование `RustDesk2.toml`** в правильное место:
|
||
- Windows service mode: `C:\Windows\ServiceProfiles\LocalService\AppData\Roaming\RustDesk\config\`
|
||
- Windows user mode (fallback): `%APPDATA%\RustDesk\config\`
|
||
- Linux service: `/root/.config/rustdesk/`
|
||
- Linux user: `~/.config/rustdesk/`
|
||
- macOS: `~/Library/Preferences/com.carriez.RustDesk/`
|
||
4. **Генерация permanent password** (10 символов, случайный per-machine) через `rustdesk --password <pw>`
|
||
5. **Сохранение creds** в файл (chmod 600):
|
||
- Windows: `C:\Users\Public\rustdesk-credentials.txt` + `C:\Users\Public\Desktop\RustDesk-ID.txt`
|
||
- Linux: `/root/rustdesk-credentials.txt`
|
||
6. **Запуск сервиса** — `Start-Service RustDesk` / `systemctl start rustdesk`
|
||
7. **Вывод** ID + пароля для пользователя
|
||
|
||
macOS — без auto-password (sandboxing) — пользователь устанавливает permanent password сам через UI.
|
||
|
||
## Конфиг сервера (RustDesk2.toml)
|
||
|
||
```toml
|
||
rendezvous_server = "remot.dttb.ru:21116"
|
||
nat_type = 1
|
||
serial = 1
|
||
|
||
[options]
|
||
custom-rendezvous-server = "remot.dttb.ru"
|
||
relay-server = "remot.dttb.ru"
|
||
api-server = "https://remot.dttb.ru"
|
||
key = "R0lA4r77hAGw6YRL1qG3JioVqQ0Q0fJfzkwlAGqR6jU="
|
||
allow-websocket = "Y"
|
||
verification-method = "use-permanent-password"
|
||
approve-mode = "password"
|
||
```
|
||
|
||
## Способы развёртывания
|
||
|
||
### Текущий (offline-friendly)
|
||
1. Олег делает в Nextcloud public share-link (пока не сделано — отдельная ручная задача)
|
||
2. Шлёт ссылку клиенту/технику
|
||
3. Тот скачивает свою папку → запускает скрипт → готово
|
||
|
||
### Будущее — one-liner
|
||
Положить скрипт на rustdesk-api сервер (или public path в NPM):
|
||
- `irm https://remot.dttb.ru/install/win.ps1 | iex` (Win)
|
||
- `curl -sL https://remot.dttb.ru/install/linux.sh | sudo bash` (Linux)
|
||
|
||
Скрипт автоматически качает installer с github.
|
||
|
||
### Будущее — Strategy
|
||
В админке `/_admin/` → Configuration Strategy → создать policy с настройками. Push'ит конфиг существующим клиентам автоматически. Требует чтобы клиент изначально знал api-server URL — то есть всё равно первичная установка нужна.
|
||
|
||
### Будущее — `rustdesk-licensed-XXXXXXXX.exe` trick
|
||
RustDesk при первом запуске парсит своё имя файла, если оно соответствует formату — применяет встроенный config. Требует утилиту шифрования config (rustdesk-utils 2.x от lejianwen-pro). Наш `rustdesk-utils` 1.1.14 этого не умеет — нужно скачать pro-версию отдельно или использовать веб-инструмент https://aps.lejianwen.com.
|
||
|
||
### Будущее — WinRM/SSH push для существующих машин
|
||
Уже есть NetBird-подключение к большинству Windows-клиентов (Volkkent, Glavtorg, ММФБ, Зеленоград). Можно через `Invoke-Command` или `pywinrm` развернуть скрипт удалённо без участия пользователя.
|
||
|
||
## Безопасность
|
||
|
||
- **Public link на скачивание лучше с паролем** — в установщике зашит `key=R0lA...`, кто угодно скачавший может зарегистрировать себя как peer на нашем сервере. MUST_LOGIN отбивает подключения, но heartbeat-флуд возможен.
|
||
- **Permanent password** случайный per-машина, в файле с chmod 600
|
||
- **`MUST_LOGIN=Y` на сервере** — каждый peer должен залогиниться в API после установки. Скрипт этого пока **не делает** — клиент должен залогиниться вручную в RustDesk UI (Settings → Account) или через web `/_admin/`. Автоматизация login через скрипт = отдельная задача (нужен service-token / OIDC).
|
||
|
||
## Известные ограничения
|
||
|
||
- **Windows ARM64** — не поддерживается RustDesk 1.4.6 (нет нативного installer'а). Используется x86_64 в эмуляции.
|
||
- **Android** — apk без auto-config; пользователь вручную вводит ID/relay/api/key. Автоматизация для Android = другая задача (Intent URL scheme или MDM push).
|
||
- **iOS** — RustDesk через App Store, конфиг через QR-код или Universal Link. Не покрыто текущим пакетом.
|
||
- **macOS** — без auto-permanent-password (sandboxing CLI ограничен). Пользователь делает через UI.
|
||
- **`MUST_LOGIN` post-install** — после установки клиент вынуждены вручную залогиниться. Без login peer виден как online в hbbs, но connections к нему отбрасываются.
|
||
|
||
## TODO / следующие шаги
|
||
|
||
- [ ] Олег создаёт public share-link в Nextcloud (с паролем), кладёт ссылку в `snippets/clients/`
|
||
- [ ] Подготовить **one-liner-скрипты** на сервере (NPM static path `/install/` → S3 или rustdesk-api resources/public)
|
||
- [ ] **Configuration Strategy** в админке lejianwen-api — push config existing peers
|
||
- [ ] Скачать `rustdesk-utils` 2.x (lejianwen-pro) для генерации `rustdesk-licensed-*.exe` — single-file deployment без скриптов
|
||
- [ ] **Auto-login через скрипт** — создать service-юзера в API с фиксированным password, скрипт логинится этим юзером во время install. После установки админ через `/_admin/` переносит peer в нужную группу.
|
||
- [ ] **WinRM bulk-deploy** — список существующих NetBird-managed Windows-машин + Ansible/PowerShell job по разворачиванию
|
||
|
||
## Связанные файлы
|
||
|
||
- [[projects/dttb/rustdesk]] — справочник по серверу
|
||
- [[../decisions/2026-04-28-rustdesk-lejianwen-pro-migration]] — миграция с OSS на pro
|
||
- В Nextcloud: `RustDesk install/` (этот пакет)
|
||
- На LXC 116: `/root/RustDesk2.toml` (шаблон)
|
||
- На LXC 116: `/root/rustdesk-backup-20260428-1134/admin-password.txt` (admin pw для api)
|