Files
dinlo f624fee5e0 Initial commit: Debian Manager — управление Debian-серверами
- SSH/SFTP управление без агентов
- Пакеты (apt), Docker, файлы, systemd, ufw, cron
- Плейбуки, групповые операции, планировщик
- Бэкапы, отчёты, Portainer, Proxmox VE, Gitea Deploy
- Терминал, Telegram-уведомления, тёмная/светлая тема
2026-09-05 19:46:45 +08:00

343 lines
26 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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