# ServerManager

Desktop GUI for managing remote servers
CustomTkinter + Paramiko | Dark Theme | Claude Code + Codex Integration

English | Русский | 中文

--- ## 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) - **Claude Code + Codex Integration** — one-click setup, shared config with `/ssh` skill and Codex skill - **TOTP / 2FA** — Google Authenticator compatible codes with live countdown, one-click copy - **Encryption** — servers.json encrypted with Fernet (passwords never stored in plaintext) - **Backups** — manual and automatic backups with one-click restore - **Configurable Config Path** — change servers.json location via GUI - **Localization** — GUI in English, Russian, Chinese with language switcher - **About Dialog** — app info, features, quick start guide - **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-vX.Y.Z-{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. **Setup** — Setup tab → "Install Everything" → Claude Code and Codex ready 7. Status badges update automatically (green = online, red = offline) ### Claude Code + Codex Integration ServerManager, Claude Code, and Codex share the same config file: `~/.server-connections/servers.json` For Codex deployment and operational edge cases, see [`CODEX_SKILL_SETUP.md`](CODEX_SKILL_SETUP.md). **How it works:** ``` ServerManager GUI ←→ ~/.server-connections/servers.json ←→ ssh.py backend ↕ ↕ Add/edit/delete Claude /ssh + Codex skill servers in GUI execute commands ``` - Add a server in GUI → Claude Code and Codex see it immediately - Both agents use the same `ssh.py` + `servers.json` - Passwords **never** pass through the AI API **New SSH Commands:** - `ssh.py --info ALIAS` — safe server information (no credentials) - `ssh.py --set-note ALIAS "desc"` — update server notes - `ssh.py --list` now shows Notes column - Fuzzy alias search: search by keyword (e.g., "tor" finds "API TOR contabo..."), word-boundary priority - SFTP path fix: remote path normalization for Windows/Git Bash with double slash // - `--no-sudo` flag for commands that don't need elevation - Upload/download progress: files >=1MB show 25/50/75% milestones with size, time, and speed **Setup on a new machine:** 1. Install ServerManager (clone repo or download binary) 2. Open Setup tab → click "Install Everything" 3. Done. Claude Code now has `/ssh`, and Codex now has the `server-manager` skill with access to your servers The Setup tab installs: - `ssh.py` → `~/.server-connections/` (SSH utility) - `encryption.py` → `~/.server-connections/` (encryption module for CLI) - `/ssh` skill → `~/.claude/commands/ssh.md` (Claude Code skill) - `server-manager` skill → `~/.codex/skills/server-manager/` (Codex skill package) - `codex-ssh` wrapper → `~/.server-connections/` (safe Codex entry point) - SSH key (ed25519) — if not exists - Checks for duplicates — safe to run multiple times ### Configuration Shared config location: `~/.server-connections/servers.json` (encrypted with Fernet). The config path can be changed via Setup tab → Configuration → "Change Path". Settings are stored in `~/.server-connections/settings.json`. **Backups:** - Automatic backups every 10 minutes (on save) - Manual backup via Setup tab → "Backup Now" - Restore from any backup via dropdown + "Restore" - Backups stored in `~/.server-connections/backups/` - Pre-encryption backup created automatically on first migration ### 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 - `servers.json` is **encrypted** (Fernet symmetric encryption) — passwords not readable in plaintext - `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 or Codex: only alias + command are passed through the AI API, passwords stay in the local encrypted file - Automatic pre-encryption backup on first migration ### Project Structure ``` ServerManager/ ├── main.py # Entry point ├── version.py # Version info ├── build.py # PyInstaller build script ├── core/ # Business logic │ ├── server_store.py # CRUD + encrypted JSON + observer + backups │ ├── encryption.py # Fernet encryption module │ ├── ssh_client.py # Paramiko SSH/SFTP wrapper │ ├── claude_setup.py # Claude Code + Codex integration installer │ ├── status_checker.py # Background monitoring │ ├── totp.py # TOTP/2FA module (pyotp) │ ├── logger.py # Rotating file logger │ └── 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, Setup │ └── widgets/ # StatusBadge ├── tools/ # CLI tools (installed to ~/.server-connections/) │ ├── ssh.py # SSH utility for Claude Code / Codex │ └── skill-ssh.md # /ssh skill template ├── config/ # Example configs ├── releases/ # Built executables └── README.md # This file (EN/RU/ZH) ``` ### Deploy on a new machine ```bash # 1. Clone git clone https://git.sensey24.ru/aibot777/server-manager.git cd server-manager # 2. Install deps pip install -r requirements.txt # 3. Launch and setup python main.py # → Setup tab → Install Everything # → Add your servers via + Add # → Done! GUI, Claude Code, and Codex are ready ``` --- ## Русский ### Возможности - **Управление серверами** — добавление, редактирование, удаление (SSH, Telnet, RDP, MariaDB, MSSQL, PostgreSQL) - **SSH-терминал** — выполнение команд с авто-sudo (пароль через stdin, не виден в `ps`) - **SFTP** — загрузка и скачивание файлов с прогресс-баром - **SSH-ключи** — генерация ed25519, установка на сервер, копирование - **Мониторинг** — фоновая проверка каждые 60 сек (бейджи online/offline) - **Интеграция с Claude Code + Codex** — установка в один клик, общий конфиг со скиллом `/ssh` и Codex skill - **TOTP / 2FA** — коды Google Authenticator с обратным отсчётом, копирование в один клик - **Шифрование** — servers.json зашифрован Fernet (пароли не хранятся в открытом виде) - **Бэкапы** — ручные и автоматические с восстановлением в один клик - **Настраиваемый путь конфига** — смена расположения servers.json через GUI - **Локализация** — интерфейс на английском, русском, китайском с переключателем - **О программе** — информация о приложении, возможности, быстрый старт - **Тёмная тема** — современный интерфейс 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-vX.Y.Z-{платформа}.exe` ### Использование 1. **Запуск** — `python main.py` или запустите скомпилированный файл 2. **Добавить сервер** — нажмите "+ Add" в боковой панели, заполните alias, IP, порт, пользователь, пароль, тип 3. **Терминал** — выберите сервер → вкладка Terminal → введите команду → Run 4. **Файлы** — выберите сервер → вкладка Files → укажите пути → Upload/Download 5. **Ключи** — вкладка Keys → Generate Key → Install on Server 6. **Настройка** — вкладка Setup → "Install Everything" → Claude Code и Codex готовы 7. Бейджи статуса обновляются автоматически (зелёный = online, красный = offline) ### Интеграция с Claude Code + Codex ServerManager, Claude Code и Codex используют **один и тот же файл конфигурации**: `~/.server-connections/servers.json` **Как это работает:** ``` ServerManager GUI ←→ ~/.server-connections/servers.json ←→ backend ssh.py ↕ ↕ Добавил/изменил Claude /ssh + Codex skill серверы в GUI выполняют команды ``` - Добавил сервер в GUI → Claude Code и Codex сразу видят его - Оба агента используют один `ssh.py` + `servers.json` - Пароли **никогда** не проходят через API нейронки **Новые SSH команды:** - `ssh.py --info ALIAS` — безопасная информация о сервере (без учетных данных) - `ssh.py --set-note ALIAS "desc"` — обновление заметок сервера - `ssh.py --list` теперь показывает колонку Notes - Нечеткий поиск по алиасу: поиск по ключевому слову (например, "tor" находит "API TOR contabo..."), приоритет границ слова - Исправление пути SFTP: нормализация удаленного пути для Windows/Git Bash с двойным слешем // - Флаг `--no-sudo` для команд, не требующих повышения привилегий - Прогресс upload/download: файлы >=1MB показывают 25/50/75% с размером, временем и скоростью **Настройка на новой машине:** 1. Установить ServerManager (клонировать репо или скачать бинарник) 2. Открыть вкладку Setup → нажать "Install Everything" 3. Готово. Claude Code получает скилл `/ssh`, а Codex получает skill `server-manager` и доступ к серверам Вкладка Setup устанавливает: - `ssh.py` → `~/.server-connections/` (SSH-утилита) - `encryption.py` → `~/.server-connections/` (модуль шифрования для CLI) - скилл `/ssh` → `~/.claude/commands/ssh.md` (скилл Claude Code) - skill `server-manager` → `~/.codex/skills/server-manager/` (скилл Codex) - wrapper `codex-ssh` → `~/.server-connections/` (безопасная точка входа для Codex) - SSH-ключ (ed25519) — если ещё не создан - Проверяет дубли — безопасно запускать повторно ### Конфигурация Общий конфиг: `~/.server-connections/servers.json` (зашифрован Fernet). Путь к конфигу можно изменить: вкладка Setup → Configuration → "Change Path". Настройки хранятся в `~/.server-connections/settings.json`. **Бэкапы:** - Автоматические бэкапы каждые 10 минут (при сохранении) - Ручной бэкап: вкладка Setup → "Backup Now" - Восстановление из любого бэкапа через dropdown + "Restore" - Бэкапы хранятся в `~/.server-connections/backups/` - Пред-шифровальный бэкап создаётся автоматически при первой миграции ### Авто-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) ``` ### Безопасность - `servers.json` **зашифрован** (Fernet симметричное шифрование) — пароли не читаемы в открытом виде - `servers.json` в `.gitignore` — никогда не коммитится - Пароли хранятся только локально, **никогда не передаются в AI/API** - SSH-ключи (ed25519) — рекомендуемый метод аутентификации - sudo-пароль передаётся через stdin (не виден в списке процессов) - При использовании с Claude Code или Codex: через API нейронки проходят только alias + команда, пароли остаются в зашифрованном локальном файле - Автоматический пред-шифровальный бэкап при первой миграции ### Развёртывание на новой машине ```bash # 1. Клонировать git clone https://git.sensey24.ru/aibot777/server-manager.git cd server-manager # 2. Установить зависимости pip install -r requirements.txt # 3. Запустить и настроить python main.py # → Вкладка Setup → Install Everything # → Добавить серверы через + Add # → Готово! GUI, Claude Code и Codex работают с одним конфигом ``` --- ## 中文 ### 功能特点 - **服务器管理** — 添加、编辑、删除服务器(SSH、Telnet、RDP、MariaDB、MSSQL、PostgreSQL) - **SSH终端** — 自动sudo执行命令(密码通过stdin传递,在`ps`中不可见) - **SFTP传输** — 带进度条的文件上传/下载 - **SSH密钥** — 生成ed25519、安装到服务器、复制到剪贴板 - **状态监控** — 每60秒后台检查(在线/离线徽标) - **Claude Code + Codex 集成** — 一键设置,与 `/ssh` 技能和 Codex skill 共享配置 - **TOTP / 2FA** — 兼容Google Authenticator的验证码,实时倒计时,一键复制 - **加密** — servers.json使用Fernet加密(密码不再以明文存储) - **备份** — 手动和自动备份,一键恢复 - **可配置路径** — 通过GUI更改servers.json位置 - **多语言** — 支持英语、俄语、中文界面切换 - **关于对话框** — 应用信息、功能特点、快速入门 - **深色主题** — 现代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-vX.Y.Z-{平台}.exe` ### 使用方法 1. **启动** — `python main.py` 或运行可执行文件 2. **添加服务器** — 点击侧栏 "+ Add",填写别名、IP、端口、用户名、密码、类型 3. **终端** — 选择服务器 → Terminal标签 → 输入命令 → Run 4. **文件** — 选择服务器 → Files标签 → 设置路径 → Upload/Download 5. **密钥** — Keys标签 → Generate Key → Install on Server 6. **设置** — Setup标签 → "Install Everything" → Claude Code 和 Codex 就绪 7. 状态徽标自动更新(绿色 = 在线,红色 = 离线) ### Claude Code + Codex 集成 ServerManager、Claude Code 和 Codex 共享**同一个配置文件**:`~/.server-connections/servers.json` **工作原理:** ``` ServerManager GUI ←→ ~/.server-connections/servers.json ←→ ssh.py 后端 ↕ ↕ 在GUI中添加/编辑 Claude /ssh + Codex skill 服务器 执行命令 ``` - 在GUI中添加服务器 → Claude Code 和 Codex 都会立即看到 - 两个代理都使用同一个 `ssh.py` + `servers.json` - 密码**绝不**通过AI API传递 **在新机器上设置:** 1. 安装ServerManager(克隆仓库或下载二进制文件) 2. 打开Setup标签 → 点击 "Install Everything" 3. 完成。Claude Code 现在拥有 `/ssh` 技能,Codex 现在拥有 `server-manager` 技能并可访问您的服务器 Setup标签安装: - `ssh.py` → `~/.server-connections/`(SSH工具) - `encryption.py` → `~/.server-connections/`(CLI加密模块) - `/ssh` 技能 → `~/.claude/commands/ssh.md`(Claude Code技能) - `server-manager` 技能 → `~/.codex/skills/server-manager/`(Codex技能包) - `codex-ssh` 包装器 → `~/.server-connections/`(Codex安全入口) - SSH密钥(ed25519)— 如果不存在 - 检查重复 — 可安全重复运行 ### 配置 共享配置位置:`~/.server-connections/servers.json`(Fernet加密)。 可通过 Setup标签 → Configuration → "Change Path" 更改配置路径。 设置存储在 `~/.server-connections/settings.json`。 **备份:** - 每10分钟自动备份(保存时) - 手动备份:Setup标签 → "Backup Now" - 从任何备份恢复:下拉菜单 + "Restore" - 备份存储在 `~/.server-connections/backups/` - 首次迁移时自动创建加密前备份 ### 自动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自动输入) ``` ### 安全性 - `servers.json` **已加密**(Fernet对称加密)— 密码无法以明文读取 - `servers.json` 在 `.gitignore` 中 — 永不提交 - 密码仅存储在本地,**绝不发送到任何AI/API** - SSH密钥(ed25519)— 推荐的认证方式 - sudo密码通过stdin传递(在进程列表中不可见) - 与 Claude Code 或 Codex 配合使用时:只有别名和命令通过 AI API 传递,密码保留在本地加密文件中 - 首次迁移时自动创建加密前备份 ### 在新机器上部署 ```bash # 1. 克隆 git clone https://git.sensey24.ru/aibot777/server-manager.git cd server-manager # 2. 安装依赖 pip install -r requirements.txt # 3. 启动并设置 python main.py # → Setup标签 → Install Everything # → 通过 + Add 添加服务器 # → 完成!GUI、Claude Code 和 Codex 使用同一个配置 ``` --- ## License MIT ## Author [aibot777](https://git.sensey24.ru/aibot777)