# ServerManager

<p align="center">
  <strong>Desktop GUI for managing remote servers</strong><br>
  CustomTkinter + Paramiko | Dark Theme
</p>

<p align="center">
  <a href="#english">English</a> |
  <a href="#русский">Русский</a> |
  <a href="#中文">中文</a>
</p>

---

## English

### Features

- **Server CRUD** — add, edit, delete servers (SSH, Telnet, RDP, MariaDB, MSSQL, PostgreSQL)
- **SSH Terminal** — execute commands with auto-sudo (password via stdin, invisible in `ps`)
- **SFTP Transfer** — upload/download files with progress bar
- **SSH Keys** — generate ed25519, install on server, copy to clipboard
- **Status Monitor** — background check every 60 sec (online/offline badges)
- **Dark Theme** — modern CustomTkinter interface

### Installation

#### From source
```bash
git clone https://git.sensey24.ru/aibot777/server-manager.git
cd server-manager
pip install -r requirements.txt
python main.py
```

#### Pre-built binary
Download from [`releases/`](releases/) folder — standalone `.exe` (Windows) or binary (Linux/Mac).
No Python installation required.

### Building

Build for your current platform:
```bash
pip install pyinstaller
python build.py
```

Output goes to `releases/ServerManager-v1.0.0-{platform}.exe`

### Usage

1. **Launch** — `python main.py` or run the executable
2. **Add server** — click "+ Add" in sidebar, fill alias, IP, port, user, password, type
3. **Terminal** — select server → Terminal tab → type command → Run
4. **Files** — select server → Files tab → set paths → Upload/Download
5. **Keys** — Keys tab → Generate Key → Install on Server
6. Status badges update automatically (green = online, red = offline)

### Configuration

On first launch, `config/servers.json` is created from template.
Add servers via GUI or edit the JSON directly.

```json
{
  "servers": [
    {
      "alias": "my-server",
      "ip": "1.2.3.4",
      "port": 22,
      "user": "root",
      "password": "secret",
      "type": "ssh",
      "notes": "Production"
    }
  ]
}
```

### Auto-sudo

The app automatically handles privilege escalation:

- If `user: "root"` — commands execute directly, no sudo needed
- If `user` is non-root — the app automatically wraps the command in `sudo -S` and feeds the password from `servers.json` via stdin
- The password is **never** passed as a command-line argument (invisible in `ps aux`)
- You just type the command (e.g. `systemctl restart nginx`) — the app decides whether sudo is needed and handles it
- In the GUI terminal, the "sudo" checkbox is enabled by default for non-root users; uncheck it for commands that don't need elevation

```
You type:     systemctl restart nginx
App executes: sudo -S -p '' bash -c 'systemctl restart nginx'
              (password fed automatically via stdin from servers.json)
```

### Security

- `config/servers.json` is in `.gitignore` — never committed
- Passwords stored locally only, **never sent to any AI/API**
- SSH keys (ed25519) — recommended auth method
- sudo password sent via stdin (not visible in process list)
- When used with Claude Code: only alias + command are passed through the AI API, passwords stay in the local JSON file

### Project Structure

```
ServerManager/
├── main.py              # Entry point
├── version.py           # Version info
├── build.py             # PyInstaller build script
├── core/                # Business logic
│   ├── server_store.py  # CRUD + JSON + observer
│   ├── ssh_client.py    # Paramiko SSH/SFTP wrapper
│   ├── status_checker.py # Background monitoring
│   └── connection_factory.py
├── gui/                 # CustomTkinter UI
│   ├── app.py           # Main window
│   ├── sidebar.py       # Server list + search
│   ├── server_dialog.py # Add/Edit modal
│   ├── tabs/            # Terminal, Files, Info, Keys
│   └── widgets/         # StatusBadge
├── config/              # Server configs
├── releases/            # Built executables
└── docs/                # Documentation
```

---

## Русский

### Возможности

- **Управление серверами** — добавление, редактирование, удаление (SSH, Telnet, RDP, MariaDB, MSSQL, PostgreSQL)
- **SSH-терминал** — выполнение команд с авто-sudo (пароль через stdin, не виден в `ps`)
- **SFTP** — загрузка и скачивание файлов с прогресс-баром
- **SSH-ключи** — генерация ed25519, установка на сервер, копирование
- **Мониторинг** — фоновая проверка каждые 60 сек (бейджи online/offline)
- **Тёмная тема** — современный интерфейс CustomTkinter

### Установка

#### Из исходников
```bash
git clone https://git.sensey24.ru/aibot777/server-manager.git
cd server-manager
pip install -r requirements.txt
python main.py
```

#### Готовый бинарник
Скачайте из папки [`releases/`](releases/) — автономный `.exe` (Windows) или бинарник (Linux/Mac).
Python не требуется.

### Сборка

Сборка под текущую платформу:
```bash
pip install pyinstaller
python build.py
```

Результат в `releases/ServerManager-v1.0.0-{платформа}.exe`

### Использование

1. **Запуск** — `python main.py` или запустите скомпилированный файл
2. **Добавить сервер** — нажмите "+ Add" в боковой панели, заполните alias, IP, порт, пользователь, пароль, тип
3. **Терминал** — выберите сервер → вкладка Terminal → введите команду → Run
4. **Файлы** — выберите сервер → вкладка Files → укажите пути → Upload/Download
5. **Ключи** — вкладка Keys → Generate Key → Install on Server
6. Бейджи статуса обновляются автоматически (зелёный = online, красный = offline)

### Конфигурация

При первом запуске `config/servers.json` создаётся из шаблона.
Добавляйте серверы через GUI или редактируйте JSON напрямую.

### Авто-sudo

Приложение автоматически повышает привилегии:

- Если `user: "root"` — команды выполняются напрямую, sudo не нужен
- Если пользователь не root — приложение автоматически оборачивает команду в `sudo -S` и само вводит пароль из `servers.json` через stdin
- Пароль **никогда** не передаётся как аргумент командной строки (не виден в `ps aux`)
- Вы просто вводите команду (например `systemctl restart nginx`) — приложение само решает, нужен sudo или нет, и само всё делает
- В GUI-терминале checkbox "sudo" включён по умолчанию для non-root; отключите для команд, не требующих повышения

```
Вы вводите:         systemctl restart nginx
Приложение делает:  sudo -S -p '' bash -c 'systemctl restart nginx'
                    (пароль подставляется автоматически из servers.json через stdin)
```

### Безопасность

- `config/servers.json` в `.gitignore` — никогда не коммитится
- Пароли хранятся только локально, **никогда не передаются в AI/API**
- SSH-ключи (ed25519) — рекомендуемый метод аутентификации
- sudo-пароль передаётся через stdin (не виден в списке процессов)
- При использовании с Claude Code: через API нейронки проходят только alias + команда, пароли остаются в локальном JSON-файле

---

## 中文

### 功能特点

- **服务器管理** — 添加、编辑、删除服务器（SSH、Telnet、RDP、MariaDB、MSSQL、PostgreSQL）
- **SSH终端** — 自动sudo执行命令（密码通过stdin传递，在`ps`中不可见）
- **SFTP传输** — 带进度条的文件上传/下载
- **SSH密钥** — 生成ed25519、安装到服务器、复制到剪贴板
- **状态监控** — 每60秒后台检查（在线/离线徽标）
- **深色主题** — 现代CustomTkinter界面

### 安装

#### 从源码安装
```bash
git clone https://git.sensey24.ru/aibot777/server-manager.git
cd server-manager
pip install -r requirements.txt
python main.py
```

#### 预编译版本
从 [`releases/`](releases/) 文件夹下载 — 独立的 `.exe`（Windows）或二进制文件（Linux/Mac）。
无需安装Python。

### 编译

为当前平台编译：
```bash
pip install pyinstaller
python build.py
```

输出至 `releases/ServerManager-v1.0.0-{平台}.exe`

### 使用方法

1. **启动** — `python main.py` 或运行可执行文件
2. **添加服务器** — 点击侧栏 "+ Add"，填写别名、IP、端口、用户名、密码、类型
3. **终端** — 选择服务器 → Terminal标签 → 输入命令 → Run
4. **文件** — 选择服务器 → Files标签 → 设置路径 → Upload/Download
5. **密钥** — Keys标签 → Generate Key → Install on Server
6. 状态徽标自动更新（绿色 = 在线，红色 = 离线）

### 配置

首次启动时，`config/servers.json` 从模板自动创建。
通过GUI添加服务器或直接编辑JSON文件。

### 自动sudo

应用自动处理权限提升：

- 如果 `user: "root"` — 命令直接执行，无需sudo
- 如果用户不是root — 应用自动将命令包装在 `sudo -S` 中，并从 `servers.json` 通过stdin自动输入密码
- 密码**绝不**作为命令行参数传递（在 `ps aux` 中不可见）
- 您只需输入命令（例如 `systemctl restart nginx`）— 应用自动判断是否需要sudo并处理
- 在GUI终端中，"sudo"复选框默认为非root用户启用；对于不需要提权的命令可以取消勾选

```
您输入:      systemctl restart nginx
应用执行:    sudo -S -p '' bash -c 'systemctl restart nginx'
            (密码从servers.json通过stdin自动输入)
```

### 安全性

- `config/servers.json` 在 `.gitignore` 中 — 永不提交
- 密码仅存储在本地，**绝不发送到任何AI/API**
- SSH密钥（ed25519）— 推荐的认证方式
- sudo密码通过stdin传递（在进程列表中不可见）
- 与Claude Code配合使用时：只有别名和命令通过AI API传递，密码保留在本地JSON文件中

---

## License

MIT

## Author

[aibot777](https://git.sensey24.ru/aibot777)
