v1.2.0 + v1.3.0: Localization, About dialog, TOTP/2FA, stability improvements
v1.2.0: - GUI localization (EN/RU/ZH) with language switcher and persistent selection - About dialog (ⓘ) with app info, features, quick start guide - core/i18n.py — internationalization module with t() function - All GUI components translated via t() keys v1.3.0: - TOTP/2FA tab — Google Authenticator compatible codes with live 30s countdown, one-click copy, per-server secret management - core/totp.py — TOTP module (pyotp, RFC 6238) - core/logger.py — rotating file logger (5MB, 3 backups) - Stronger Fernet encryption key with automatic migration from old key - Thread-safe server store with locks, atomic writes, auto-restore on corruption - Parallel status checks via ThreadPoolExecutor (up to 10 concurrent) - SSH client: explicit channel cleanup, Unix key permissions - Server dialog: port validation (1-65535), TOTP secret field - Language change preserves active tab and server selection - pyotp dependency added Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
125
README.md
125
README.md
@@ -23,6 +23,12 @@
|
||||
- **SSH Keys** — generate ed25519, install on server, copy to clipboard
|
||||
- **Status Monitor** — background check every 60 sec (online/offline badges)
|
||||
- **Claude Code Integration** — one-click setup, shared config with `/ssh` 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
|
||||
@@ -47,7 +53,7 @@ pip install pyinstaller
|
||||
python build.py
|
||||
```
|
||||
|
||||
Output goes to `releases/ServerManager-v1.0.0-{platform}.exe`
|
||||
Output goes to `releases/ServerManager-v1.3.0-{platform}.exe`
|
||||
|
||||
### Usage
|
||||
|
||||
@@ -82,31 +88,25 @@ ServerManager GUI ←→ ~/.server-connections/servers.json ←→ ssh.py (C
|
||||
|
||||
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)
|
||||
- SSH key (ed25519) — if not exists
|
||||
- Checks for duplicates — safe to run multiple times
|
||||
|
||||
### Configuration
|
||||
|
||||
Shared config location: `~/.server-connections/servers.json`
|
||||
Shared config location: `~/.server-connections/servers.json` (encrypted with Fernet).
|
||||
|
||||
Add servers via GUI or edit the JSON directly:
|
||||
The config path can be changed via Setup tab → Configuration → "Change Path".
|
||||
|
||||
```json
|
||||
{
|
||||
"servers": [
|
||||
{
|
||||
"alias": "my-server",
|
||||
"ip": "1.2.3.4",
|
||||
"port": 22,
|
||||
"user": "root",
|
||||
"password": "secret",
|
||||
"type": "ssh",
|
||||
"notes": "Production"
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
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
|
||||
|
||||
@@ -126,11 +126,13 @@ App executes: sudo -S -p '' bash -c 'systemctl restart nginx'
|
||||
|
||||
### 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: only alias + command are passed through the AI API, passwords stay in the local JSON file
|
||||
- When used with Claude Code: 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
|
||||
|
||||
@@ -140,10 +142,13 @@ ServerManager/
|
||||
├── version.py # Version info
|
||||
├── build.py # PyInstaller build script
|
||||
├── core/ # Business logic
|
||||
│ ├── server_store.py # CRUD + JSON + observer (shared config)
|
||||
│ ├── 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 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
|
||||
@@ -188,6 +193,12 @@ python main.py
|
||||
- **SSH-ключи** — генерация ed25519, установка на сервер, копирование
|
||||
- **Мониторинг** — фоновая проверка каждые 60 сек (бейджи online/offline)
|
||||
- **Интеграция с Claude Code** — установка в один клик, общий конфиг со скиллом `/ssh`
|
||||
- **TOTP / 2FA** — коды Google Authenticator с обратным отсчётом, копирование в один клик
|
||||
- **Шифрование** — servers.json зашифрован Fernet (пароли не хранятся в открытом виде)
|
||||
- **Бэкапы** — ручные и автоматические с восстановлением в один клик
|
||||
- **Настраиваемый путь конфига** — смена расположения servers.json через GUI
|
||||
- **Локализация** — интерфейс на английском, русском, китайском с переключателем
|
||||
- **О программе** — информация о приложении, возможности, быстрый старт
|
||||
- **Тёмная тема** — современный интерфейс CustomTkinter
|
||||
|
||||
### Установка
|
||||
@@ -212,7 +223,7 @@ pip install pyinstaller
|
||||
python build.py
|
||||
```
|
||||
|
||||
Результат в `releases/ServerManager-v1.0.0-{платформа}.exe`
|
||||
Результат в `releases/ServerManager-v1.3.0-{платформа}.exe`
|
||||
|
||||
### Использование
|
||||
|
||||
@@ -247,31 +258,25 @@ ServerManager GUI ←→ ~/.server-connections/servers.json ←→ ssh.py (C
|
||||
|
||||
Вкладка Setup устанавливает:
|
||||
- `ssh.py` → `~/.server-connections/` (SSH-утилита)
|
||||
- `encryption.py` → `~/.server-connections/` (модуль шифрования для CLI)
|
||||
- скилл `/ssh` → `~/.claude/commands/ssh.md` (скилл Claude Code)
|
||||
- SSH-ключ (ed25519) — если ещё не создан
|
||||
- Проверяет дубли — безопасно запускать повторно
|
||||
|
||||
### Конфигурация
|
||||
|
||||
Общий конфиг: `~/.server-connections/servers.json`
|
||||
Общий конфиг: `~/.server-connections/servers.json` (зашифрован Fernet).
|
||||
|
||||
Добавляйте серверы через GUI или редактируйте JSON:
|
||||
Путь к конфигу можно изменить: вкладка Setup → Configuration → "Change Path".
|
||||
|
||||
```json
|
||||
{
|
||||
"servers": [
|
||||
{
|
||||
"alias": "my-server",
|
||||
"ip": "1.2.3.4",
|
||||
"port": 22,
|
||||
"user": "root",
|
||||
"password": "secret",
|
||||
"type": "ssh",
|
||||
"notes": "Production"
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
Настройки хранятся в `~/.server-connections/settings.json`.
|
||||
|
||||
**Бэкапы:**
|
||||
- Автоматические бэкапы каждые 10 минут (при сохранении)
|
||||
- Ручной бэкап: вкладка Setup → "Backup Now"
|
||||
- Восстановление из любого бэкапа через dropdown + "Restore"
|
||||
- Бэкапы хранятся в `~/.server-connections/backups/`
|
||||
- Пред-шифровальный бэкап создаётся автоматически при первой миграции
|
||||
|
||||
### Авто-sudo
|
||||
|
||||
@@ -291,11 +296,13 @@ ServerManager GUI ←→ ~/.server-connections/servers.json ←→ ssh.py (C
|
||||
|
||||
### Безопасность
|
||||
|
||||
- `servers.json` **зашифрован** (Fernet симметричное шифрование) — пароли не читаемы в открытом виде
|
||||
- `servers.json` в `.gitignore` — никогда не коммитится
|
||||
- Пароли хранятся только локально, **никогда не передаются в AI/API**
|
||||
- SSH-ключи (ed25519) — рекомендуемый метод аутентификации
|
||||
- sudo-пароль передаётся через stdin (не виден в списке процессов)
|
||||
- При использовании с Claude Code: через API нейронки проходят только alias + команда, пароли остаются в локальном JSON-файле
|
||||
- При использовании с Claude Code: через API нейронки проходят только alias + команда, пароли остаются в зашифрованном локальном файле
|
||||
- Автоматический пред-шифровальный бэкап при первой миграции
|
||||
|
||||
### Развёртывание на новой машине
|
||||
|
||||
@@ -326,6 +333,12 @@ python main.py
|
||||
- **SSH密钥** — 生成ed25519、安装到服务器、复制到剪贴板
|
||||
- **状态监控** — 每60秒后台检查(在线/离线徽标)
|
||||
- **Claude Code集成** — 一键设置,与`/ssh`技能共享配置
|
||||
- **TOTP / 2FA** — 兼容Google Authenticator的验证码,实时倒计时,一键复制
|
||||
- **加密** — servers.json使用Fernet加密(密码不再以明文存储)
|
||||
- **备份** — 手动和自动备份,一键恢复
|
||||
- **可配置路径** — 通过GUI更改servers.json位置
|
||||
- **多语言** — 支持英语、俄语、中文界面切换
|
||||
- **关于对话框** — 应用信息、功能特点、快速入门
|
||||
- **深色主题** — 现代CustomTkinter界面
|
||||
|
||||
### 安装
|
||||
@@ -350,7 +363,7 @@ pip install pyinstaller
|
||||
python build.py
|
||||
```
|
||||
|
||||
输出至 `releases/ServerManager-v1.0.0-{平台}.exe`
|
||||
输出至 `releases/ServerManager-v1.3.0-{平台}.exe`
|
||||
|
||||
### 使用方法
|
||||
|
||||
@@ -385,31 +398,25 @@ ServerManager GUI ←→ ~/.server-connections/servers.json ←→ ssh.py (C
|
||||
|
||||
Setup标签安装:
|
||||
- `ssh.py` → `~/.server-connections/`(SSH工具)
|
||||
- `encryption.py` → `~/.server-connections/`(CLI加密模块)
|
||||
- `/ssh` 技能 → `~/.claude/commands/ssh.md`(Claude Code技能)
|
||||
- SSH密钥(ed25519)— 如果不存在
|
||||
- 检查重复 — 可安全重复运行
|
||||
|
||||
### 配置
|
||||
|
||||
共享配置位置:`~/.server-connections/servers.json`
|
||||
共享配置位置:`~/.server-connections/servers.json`(Fernet加密)。
|
||||
|
||||
通过GUI添加服务器或直接编辑JSON:
|
||||
可通过 Setup标签 → Configuration → "Change Path" 更改配置路径。
|
||||
|
||||
```json
|
||||
{
|
||||
"servers": [
|
||||
{
|
||||
"alias": "my-server",
|
||||
"ip": "1.2.3.4",
|
||||
"port": 22,
|
||||
"user": "root",
|
||||
"password": "secret",
|
||||
"type": "ssh",
|
||||
"notes": "Production"
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
设置存储在 `~/.server-connections/settings.json`。
|
||||
|
||||
**备份:**
|
||||
- 每10分钟自动备份(保存时)
|
||||
- 手动备份:Setup标签 → "Backup Now"
|
||||
- 从任何备份恢复:下拉菜单 + "Restore"
|
||||
- 备份存储在 `~/.server-connections/backups/`
|
||||
- 首次迁移时自动创建加密前备份
|
||||
|
||||
### 自动sudo
|
||||
|
||||
@@ -429,11 +436,13 @@ Setup标签安装:
|
||||
|
||||
### 安全性
|
||||
|
||||
- `servers.json` **已加密**(Fernet对称加密)— 密码无法以明文读取
|
||||
- `servers.json` 在 `.gitignore` 中 — 永不提交
|
||||
- 密码仅存储在本地,**绝不发送到任何AI/API**
|
||||
- SSH密钥(ed25519)— 推荐的认证方式
|
||||
- sudo密码通过stdin传递(在进程列表中不可见)
|
||||
- 与Claude Code配合使用时:只有别名和命令通过AI API传递,密码保留在本地JSON文件中
|
||||
- 与Claude Code配合使用时:只有别名和命令通过AI API传递,密码保留在本地加密文件中
|
||||
- 首次迁移时自动创建加密前备份
|
||||
|
||||
### 在新机器上部署
|
||||
|
||||
|
||||
Reference in New Issue
Block a user