Files
debian-manager/README.md
T

343 lines
26 KiB
Markdown
Raw Normal View History

# Debian Manager
Десктопное приложение на Python для централизованного управления несколькими Debian-серверами: обновления, мониторинг, пакеты, Docker, файлы, systemd, firewall, cron, плейбуки, групповые операции, деплой из Gitea.
## Возможности
| Модуль | Что умеет |
|--------|-----------|
| **Серверы** | Добавление по паролю или SSH-ключу, теги, проверка подключения, онлайн-статус |
| **Обзор** | CPU/RAM/диск/load/сеть, история метрик, `apt update`, `upgrade`, `dist-upgrade`, `reboot` с ожиданием возврата |
| **Пакеты** | Список с разбивкой на системные/пользовательские/зависимости, поиск, установка, удаление (remove/purge), autoremove, блокировка удаления системных |
| **Docker** | Контейнеры (start/stop/restart/rm, логи, stats), образы (pull/rmi), тома, сети, system df, system prune |
| **Файлы** | SFTP-браузер: навигация, upload/download с прогрессом, удаление, переименование, mkdir, встроенный редактор (sudo-режим для root-файлов) |
| **Сервисы** | Список systemd-юнитов, start/stop/restart/enable/disable, просмотр journalctl, защита критичных юнитов (sshd, docker) |
| **Firewall** | UFW: статус, правила (добавить/удалить), enable/disable с автоматическим разрешением SSH-порта, пресеты («Только SSH», «Веб-сервер», «Docker-хост»), список прослушиваемых портов |
| **Cron** | Редактор crontab: расписание из 5 полей с человекочитаемым описанием («следующий запуск»), включение/выключение строк, бэкапы с откатом |
| **Терминал** | Интерактивная PTY-сессия по SSH + библиотека из ~40 команд обслуживания (пользователи, система, процессы, сеть, логи, пакеты, безопасность) с селектором и подстановкой параметров |
| **Группы серверов** | Фильтрация дашборда по тегам («локальные», «удалённые», «prod») — чипы в верхней панели |
| **Планировщик** | Задачи по cron: update/upgrade/бэкап/плейбук/отчёт/команда, пресеты, запуск по кнопке, Telegram-уведомление о результате |
| **Мастер настройки** | Первичная настройка сервера чекбоксами: hostname, часовой пояс, NTP, пользователь, утилиты, Docker, Portainer, ufw, fail2ban, автообновления, агент |
| **Бэкапы** | tar.gz на сервере → SFTP → локальный архив, история с размерами, запуск из планировщика |
| **Отчёты** | CSV со всеми серверами (онлайн, ОС, метрики) + последние 100 задач, открытие в проводнике |
| **Portainer** | Статус контейнера portainer на каждом сервере, установка/перезапуск, открытие веб-интерфейса в браузере |
| **Агент-режим** | Установка dm-agent на сервер одной кнопкой — метрики каждые 5 сек по HTTP (порт 9102), real-time без SSH-поллинга |
| **Webhook-автодеплой** | Привязка «репозиторий@ветка → сервер», push в Gitea → автоматический pull + compose up (порт 9100) |
| **Proxmox VE** | Список нод с метриками, VM/LXC с CPU/RAM, start/reboot/shutdown/stop, добавление VM как управляемого сервера по SSH |
| **Темы** | Тёмная/светлая — иконка в нижней части навигации и кнопка в Настройках, выбор сохраняется |
| **Групповые операции** | Массовый update/upgrade/reboot/команда/установка пакета по выбранным серверам, параллельно или rolling (по одному), fail-fast, прогресс по каждому серверу |
| **Плейбуки** | YAML-плейбуки с шагами `shell`/`apt`/`ufw`/`systemd`/`docker`/`reboot`, Jinja2-переменные, `when`-условия, запуск на сервере или группе, встроенные шаблоны («Новый сервер», «Docker-хост», «Обновить и перезагрузить») |
| **Сравнение** | Diff установленных пакетов между двумя серверами: только на A / только на B / различаются версии |
| **Gitea Deploy** | Деплой docker-compose проектов из Gitea-репозитория: git clone/pull → `docker compose up -d`, `.env` вне git, история в журнале задач |
| **Telegram** | Уведомления об алертах мониторинга и завершении задач (настраивается в «Настройки») |
| **Журнал задач** | Все длинные операции с полным логом выполнения |
## Требования
- Windows 10/11, Linux или macOS
- Python 3.11+
- Debian-сервер(ы) с SSH-доступом (пароль или ключ)
- Для Docker-модуля: Docker на сервере (устанавливается плейбуком «Docker-хост» одной кнопкой)
## Установка
```bash
git clone <repo> debian-manager
cd debian-manager
# виртуальное окружение + зависимости
uv venv --python 3.12 .venv
uv pip install --python .venv/Scripts/python.exe \
flet asyncssh sqlmodel pydantic httpx pyyaml jinja2 croniter websockets proxmoxer requests
# запуск
.venv/Scripts/python.exe -m app.main
```
Без `uv` — классический вариант:
```bash
.venv\Scripts\pip install flet asyncssh sqlmodel pydantic httpx pyyaml jinja2 croniter websockets proxmoxer requests
.venv\Scripts\python -m app.main
```
## Первый запуск
1. При старте автоматически создаётся тестовый сервер `Test VPS` (132.243.17.164:2292) — удалите или отредактируйте его.
2. Откройте **Серверы** → **Добавить сервер**: укажите хост, порт, пользователя, пароль или путь к SSH-ключу, нажмите **«Проверить подключение»**.
3. Кликните на сервер в списке или на дашборде — откроются вкладки управления.
## Использование по разделам
### Дашборд
Карточки всех серверов с живыми метриками (CPU/RAM/диск), статусом онлайн/оффлайн, ОС и аптаймом. Клик по карточке → страница сервера.
### Обзор (вкладка сервера)
- **apt update** — обновить индекс пакетов
- **Upgrade / Dist-upgrade** — обновить систему, вывод в реальном времени в лог-панели
- **Reboot** — перезагрузка с автоматическим ожиданием возврата сервера (до 5 минут)
- Графики метрик, количество доступных обновлений
### Пакеты
- Чипы фильтрации: **Пользовательские** / **Системные** / **Зависимости** / **Все**
- Поиск по имени
- **Установить пакет** — с поиском по apt-cache
- Кнопка удаления у каждого пакета (системные заблокированы), чекбокс **purge**
- **Autoremove** — очистка неиспользуемых зависимостей
### Docker
- **Контейнеры**: start/stop/restart/rm, логи (последние 100 строк), live-статистика CPU/MEM
- **Образы**: pull с прогрессом, удаление
- **Тома/Сети**: список, удаление
- **Система**: `docker system df`, кнопка **System prune** с отчётом
### Файлы
- Навигация по SFTP, иконки папок/файлов, права доступа
- **Upload/Download** с прогресс-баром (через нативный диалог выбора файла)
- **Редактировать** — текстовые файлы прямо в UI, чекбокс **sudo** для root-owned файлов (`/etc/...`)
- Удаление, переименование, создание папок
### Сервисы
- Таблица юнитов: состояние (цвет), enabled, описание
- start/stop/restart одной кнопкой; для критичных (ssh, docker) — двойное подтверждение
- Поиск, фильтр «только failed»
- Просмотр логов (`journalctl -u <unit>`) справа
### Firewall
- **Включить ufw** — порт текущего SSH-подключения разрешается автоматически (защита от отстрела себя)
- Таблица правил с номерами, удаление по номеру
- **Добавить правило**: порт/диапазон, allow/deny/limit, tcp/udp, from-адрес
- **Пресеты**: «Только SSH», «Веб-сервер» (80,443), «Docker-хост»
- Список прослушиваемых портов (`ss -tlnp`) для сверки с правилами
### Cron
- Карточки задач с человекочитаемым описанием расписания и следующим запуском
- Чекбокс — включить/выключить строку (комментируется)
- **Добавить задачу** — валидация выражения в реальном времени
- **Откатить к бэкапу** — каждое сохранение пишется в БД, можно вернуть любую версию
### Терминал
Интерактивная SSH-сессия прямо в приложении — не нужен отдельный PuTTY/Terminal.
- **Подключиться** — открывает PTY (xterm-256color), работают все интерактивные команды (`top`, `nano`, `htop`)
- Строка ввода внизу — любая команда, Enter — отправить
- **Селектор команд** — библиотека обслуживания по категориям:
- **Пользователи**: список, добавить/удалить, смена пароля, sudo, группы, сессии
- **Система**: аптайм, часовой пояс, NTP, locale, память, диски, SMART
- **Процессы**: топ по CPU, дерево, поиск, kill, lsof
- **Сеть**: IP, маршруты, порты, соединения, DNS, ping, wget
- **Логи**: journalctl, ошибки за час, dmesg, авторизации, неудачные логины
- **Пакеты**: update/upgrade, поиск, установленные вручную, история apt
- **Безопасность**: fail2ban, ufw, открытые сокеты, SUID-файлы
- Команды, требующие параметра (имя пользователя, имя сервиса и т.п.) — появляется поле ввода
- Выбранная команда подсвечивается жёлтым в выводе, затем выполняется
- **Очистить вывод** — сброс буфера (максимум 500 строк)
### Групповые операции
- Выбор серверов чекбоксами
- Операции: update, upgrade, dist-upgrade, reboot, произвольная команда, установка пакета
- **Rolling** — по одному серверу, ждать возврата, только потом следующий (для кластеров)
- **Fail-fast** — остановиться при первой ошибке
- Прогресс и лог по каждому серверу
### Группы серверов
- У каждого сервера поле **Теги** (через запятую): `локальные`, `удалённые`, `prod`, `docker`…
- В верхней панели — чипы «Все» + каждый тег: фильтрация карточек дашборда
- Теги также используются как цель в планировщике и групповых операциях
### Планировщик
Задачи по cron-расписанию, выполняются внутри приложения (даже при свёрнутом окне).
- **Действия**: apt update, upgrade, dist-upgrade, команда, бэкап, плейбук, отчёт, очистка метрик
- **Цель**: `all` или тег серверов
- **Пресеты**: ежедневный apt update, еженедельный upgrade, ежедневный бэкап /etc, очистка метрик, ежедневный отчёт, docker prune, проверка диска
- Кнопка **запустить сейчас**, включение/выключение чекбоксом, последний статус
- Результат отправляется в Telegram (если настроено)
### Мастер первичной настройки
Один экран для подготовки нового сервера — отметьте нужное чекбоксами:
- **Изменить hostname** — поле для имени
- **Часовой пояс** — по умолчанию Asia/Ulaanbaatar
- **NTP** — синхронизация времени
- **Обновить систему** — apt update + dist-upgrade
- **Создать пользователя** — имя + пароль, сразу в группу sudo
- **Базовые утилиты** — curl, wget, htop, git, mc, net-tools
- **Docker** — docker.io + docker-compose + автозапуск
- **Portainer** — веб-интерфейс Docker на порту 9000
- **Firewall (ufw)** — пресет «Только SSH» + включение
- **Fail2ban** — защита SSH от перебора
- **Автообновления безопасности** — unattended-upgrades
- **Агент мониторинга** — dm-agent для real-time метрик
Рекомендуемый набор (update, утилиты, ufw, fail2ban, NTP) выбран по умолчанию — кнопка **«Выбрать рекомендуемое»**.
### Бэкапы
- Укажите сервер и пути (`/etc`, `/home/user`, `/var/www`)
- На сервере создаётся tar.gz → скачивается по SFTP в `~/.debian-manager/backups/<сервер>/`
- Временный файл на сервере удаляется после скачивания
- История: дата, размер, статус, локальный путь
- Автоматические бэкапы — через планировщик (действие «бэкап»)
### Отчёты
- **Сгенерировать отчёт** — CSV: все серверы (онлайн, ОС, uptime, CPU/RAM/диск) + последние 100 задач
- Файлы в `~/.debian-manager/reports/`, открытие в проводнике из списка
- Автоматический отчёт — через планировщик (действие «отчёт»)
### Portainer
- Карточка по каждому серверу: установлен ли Portainer, статус контейнера
- **Открыть в браузере** — http://<сервер>:9000
- **Установить** / **Перезапустить** одной кнопкой
### Агент-режим
Для real-time метрик без SSH-поллинга:
1. **Запустить приёмник** — приложение слушает порт 9102
2. **Установить агента** на сервер — Python-скрипт (только stdlib, psutil опционально) + systemd unit `dm-agent`
3. Агент шлёт метрики каждые 5 сек по HTTP POST с токеном
4. Статус агента и последние метрики — на карточке сервера
5. **Удалить агента** — остановка и полное удаление с сервера
Если сервер за NAT — агент сам инициирует соединение к приложению, проброс портов не нужен (нужен лишь доступ сервера к ПК с приложением).
### Webhook-автодеплой из Gitea
1. Приложение слушает порт **9100** (запускается автоматически)
2. На странице **Gitea Deploy** → **Добавить привязку**: репозиторий, сервер, ветка, compose-файл, `.env`
3. В Gitea: репозиторий → Настройки → Webhooks → создать:
- URL: `http://<IP-этого-ПК>:9100/webhooks/gitea`
- Метод: POST, событие: push
4. Push в указанную ветку → автоматический `git pull` + `docker compose up -d` на сервере
5. История автодеплоев — в **Журнале задач** (тип `webhook`)
### Proxmox VE
Управление виртуальными машинами и LXC-контейнерами на гипервизоре Proxmox.
**Настройка:**
1. В Proxmox: Datacenter → Permissions → API Tokens → создать токен (например `root@pam!dm-manager`)
- **Важно:** у токена должна быть роль **PVEAuditor** (или **PVEAdmin**) на пути `/`. Если включён «Privilege Separation» — добавьте права отдельно: Permissions → Add → API Token Permission
2. В приложении → **Proxmox**:
- **Хост** — только IP или FQDN, без `http://` (например `192.168.1.100`)
- **Пользователь** — `root@pam`
- **Token ID** — `dm-manager`
- **Token Secret** — значение токена
- **Проверять SSL** — выключите для локальной сети без сертификатов
3. **Сохранить и проверить** — покажет версию Proxmox
**Ошибка 403 Forbidden:** у токена нет прав. Добавьте роль PVEAuditor/PVEAdmin на путь `/` в настройках токена.
**Возможности:**
- Карточка каждой ноды: CPU/RAM ноды, uptime, список VM/LXC
- По каждой VM: VMID, имя, тип (VM/LXC), статус, CPU/RAM
- Действия: **start**, **reboot**, **shutdown** (graceful), **stop** (жёсткое) — с подтверждением
- **Добавить как сервер** — определяет IP через QEMU Guest Agent (или из конфига LXC) и создаёт сервер в приложении с тегом `proxmox` → дальше полное управление по SSH
> Для определения IP в VM должен быть установлен `qemu-guest-agent` (apt install qemu-guest-agent).
### Темы
- Иконка ☀️/🌙 в нижней части левой навигации — мгновенное переключение
- Также кнопка в **Настройки → Интерфейс**
- Выбор сохраняется между запусками
### Плейбуки
YAML-файлы в `~/.debian-manager/playbooks/`. Пример:
```yaml
name: "Настройка нового сервера"
vars:
ssh_port: "22"
steps:
- name: Обновить систему
apt: {update: true, upgrade: dist}
- name: Установить утилиты
apt: {install: [curl, htop, git, ufw]}
- name: Firewall
ufw: {preset: "Только SSH"}
- name: Включить ufw
shell: "yes | ufw enable"
- name: Установить Docker
apt: {install: [docker.io, docker-compose]}
- name: Запустить docker
systemd: {unit: docker, action: "enable --now"}
```
Типы шагов: `shell`, `apt` (update/upgrade/install/remove/autoremove), `ufw` (preset/enable), `systemd` (unit/action), `docker` (compose up/down), `reboot` (wait). Поддерживаются Jinja2-переменные `{{var}}` и `when: условие`.
### Сравнение
Выберите два сервера → таблица расхождений: что установлено только на одном, где различаются версии.
### Gitea Deploy
1. Укажите URL и API-токен Gitea (токен: Gitea → Настройки → Приложения → Создать токен)
2. **Загрузить репозитории** → выберите репо, сервер, ветку, путь к compose-файлу
3. Опционально заполните `.env` (запишется на сервер, не попадёт в git)
4. **Деплой** — на сервере выполнится `git clone/pull` в `/opt/stacks/<repo>` + `docker compose up -d`
### Настройки → Telegram
1. Создайте бота через @BotFather, получите токен
2. Узнайте chat_id через @userinfobot
3. Включите нужные триггеры: алерты мониторинга, завершение задач
4. **Тест** — проверочное сообщение
## Запуск
**Windows — двойной клик по `run.bat`** или из терминала:
```bash
.venv\Scripts\python.exe -m app.main
```
## Сборка в .exe (PyInstaller)
```bash
# установить PyInstaller
.venv\Scripts\pip install pyinstaller
# сборка одного exe (окно без консоли)
.venv\Scripts\pyinstaller --noconfirm --onefile --windowed \
--name "DebianManager" \
--add-data "app;app" \
app/main.py
# результат: dist\DebianManager.exe
```
Примечания:
- `--windowed` убирает чёрную консоль; для отладки соберите без него — увидите traceback'и
- SQLite-база (`~/.debian-manager/data.db`) и плейбуки (`~/.debian-manager/playbooks/`) создаются в домашней папке пользователя, не рядом с exe — перенос exe на другую машину не переносит данные
- Flet при первом запуске exe скачивает свой runtime (~100 МБ) — нужен интернет
- Для уменьшения размера добавьте `--exclude-module pytest` и подобные
## Структура проекта
```
app/
├── main.py # точка входа Flet
├── core/ # бизнес-логика (SSH, apt, docker, sftp, ufw, cron, плейбуки...)
├── db/ # SQLModel: Server, TaskRecord, MetricSnapshot, CronBackup, Setting
└── ui/
├── pages/ # дашборд, серверы, групповые операции, плейбуки, diff, gitea, задачи, настройки
├── tabs/ # вкладки сервера: обзор, пакеты, docker, файлы, сервисы, firewall, cron
└── components.py # диалоги, лог-панель, хелперы
tests/ # юнит-тесты парсеров (cron, packages)
scripts/ # утилиты для ручной проверки сервера
```
## Безопасность
- Пароли хранятся в SQLite (`~/.debian-manager/data.db`) — для продакшена перенесите в ОС keyring
- Все деструктивные действия (reboot, purge, prune, удаление) — с диалогом подтверждения и именем сервера
- Удаление системных пакетов (priority required/important) заблокировано
- При включении ufw текущий SSH-порт разрешается автоматически
- Stop/restart критичных systemd-юнитов (sshd, docker) — с двойным подтверждением
- Журнал задач — полный аудит всех операций с логами
## Тестирование
```bash
.venv/Scripts/python.exe -m pytest tests/ -v
# 9 тестов парсеров cron и packages
```
## Известные ограничения
- Графики метрик — текстовые (в Flet 0.86 удалён LineChart; замените на `flet-charts` или plotly при необходимости)
- Нет мультипользовательского режима и ролей
- Webhook-сервер слушает на 0.0.0.0:9100 без TLS — используйте в доверенной сети или за reverse-proxy