feat: добавлена возможность импорта из wg-easy и 3x-ui панелей

Основные изменения:
- Создан класс PanelImporter для парсинга и импорта клиентов
- Добавлена поддержка wg-easy (db.json)
- Добавлена поддержка 3x-ui (export JSON)
- Создана таблица panel_imports для отслеживания истории
- Добавлен UI для загрузки backup файлов при создании сервера
- Добавлены API endpoints: POST /api/servers/{id}/import и GET /api/servers/{id}/imports
- Автоматический импорт после деплоя сервера
- Переводы на всех 6 языках (EN, RU, ES, DE, FR, ZH)
- Обновлена документация в README

Функционал:
- Импорт клиентов с сохранением ключей и IP (wg-easy)
- Импорт клиентов с автогенерацией ключей (3x-ui)
- Поддержка экспирации и лимитов трафика из исходных панелей
- История импортов с информацией о количестве клиентов
- Обработка ошибок с детальным логированием
This commit is contained in:
infosave2007
2025-11-08 12:40:43 +03:00
parent bbb0fbeeb9
commit fc39346240
12 changed files with 643 additions and 10 deletions
+11 -1
View File
@@ -307,5 +307,15 @@ INSERT INTO translations (language_code, translation_key, translation_value) VAL
('en', 'users.role_user', 'User'),
('en', 'settings.api_key_configured', 'API Key Configured'),
('en', 'settings.no_api_key', 'No API key configured. Auto-translation will not work.'),
('en', 'settings.skip_validation', 'Skip validation (save without testing)')
('en', 'settings.skip_validation', 'Skip validation (save without testing)'),
('en', 'servers.import_from_panel', 'Import from existing panel'),
('en', 'servers.select_panel_type', 'Select panel type'),
('en', 'servers.panel_type_wgeasy', 'wg-easy'),
('en', 'servers.panel_type_3xui', '3x-ui'),
('en', 'servers.upload_backup_file', 'Upload backup file (JSON)'),
('en', 'servers.import_in_progress', 'Import in progress...'),
('en', 'servers.import_success', 'Successfully imported {0} clients'),
('en', 'servers.import_failed', 'Import failed'),
('en', 'servers.import_partial', 'Imported {0} of {1} clients'),
('en', 'servers.import_history', 'Import History')
ON DUPLICATE KEY UPDATE translation_value=VALUES(translation_value);
+11 -1
View File
@@ -134,5 +134,15 @@ INSERT INTO translations (language_code, translation_key, translation_value) VAL
('ru', 'users.delete_confirm', 'Удалить {0}?'),
('ru', 'users.role', 'Роль'),
('ru', 'users.role_admin', 'Администратор'),
('ru', 'users.role_user', 'Пользователь')
('ru', 'users.role_user', 'Пользователь'),
('ru', 'servers.import_from_panel', 'Импорт из другой панели'),
('ru', 'servers.select_panel_type', 'Выберите тип панели'),
('ru', 'servers.panel_type_wgeasy', 'wg-easy'),
('ru', 'servers.panel_type_3xui', '3x-ui'),
('ru', 'servers.upload_backup_file', 'Загрузите файл резервной копии (JSON)'),
('ru', 'servers.import_in_progress', 'Импорт выполняется...'),
('ru', 'servers.import_success', 'Успешно импортировано клиентов: {0}'),
('ru', 'servers.import_failed', 'Ошибка импорта'),
('ru', 'servers.import_partial', 'Импортировано {0} из {1} клиентов'),
('ru', 'servers.import_history', 'История импорта')
ON DUPLICATE KEY UPDATE translation_value=VALUES(translation_value);
+11 -1
View File
@@ -134,5 +134,15 @@ INSERT INTO translations (language_code, translation_key, translation_value) VAL
('es', 'users.delete_confirm', '¿Eliminar {0}?'),
('es', 'users.role', 'Rol'),
('es', 'users.role_admin', 'Administrador'),
('es', 'users.role_user', 'Usuario')
('es', 'users.role_user', 'Usuario'),
('es', 'servers.import_from_panel', 'Importar desde panel existente'),
('es', 'servers.select_panel_type', 'Seleccione tipo de panel'),
('es', 'servers.panel_type_wgeasy', 'wg-easy'),
('es', 'servers.panel_type_3xui', '3x-ui'),
('es', 'servers.upload_backup_file', 'Subir archivo de respaldo (JSON)'),
('es', 'servers.import_in_progress', 'Importación en progreso...'),
('es', 'servers.import_success', 'Se importaron {0} clientes correctamente'),
('es', 'servers.import_failed', 'Error de importación'),
('es', 'servers.import_partial', 'Importados {0} de {1} clientes'),
('es', 'servers.import_history', 'Historial de importación')
ON DUPLICATE KEY UPDATE translation_value=VALUES(translation_value);
+11 -1
View File
@@ -134,5 +134,15 @@ INSERT INTO translations (language_code, translation_key, translation_value) VAL
('de', 'users.delete_confirm', '{0} löschen?'),
('de', 'users.role', 'Rolle'),
('de', 'users.role_admin', 'Admin'),
('de', 'users.role_user', 'Benutzer')
('de', 'users.role_user', 'Benutzer'),
('de', 'servers.import_from_panel', 'Import aus bestehendem Panel'),
('de', 'servers.select_panel_type', 'Panel-Typ auswählen'),
('de', 'servers.panel_type_wgeasy', 'wg-easy'),
('de', 'servers.panel_type_3xui', '3x-ui'),
('de', 'servers.upload_backup_file', 'Backup-Datei hochladen (JSON)'),
('de', 'servers.import_in_progress', 'Import läuft...'),
('de', 'servers.import_success', '{0} Clients erfolgreich importiert'),
('de', 'servers.import_failed', 'Import fehlgeschlagen'),
('de', 'servers.import_partial', '{0} von {1} Clients importiert'),
('de', 'servers.import_history', 'Import-Historie')
ON DUPLICATE KEY UPDATE translation_value=VALUES(translation_value);
+11 -1
View File
@@ -134,5 +134,15 @@ INSERT INTO translations (language_code, translation_key, translation_value) VAL
('fr', 'users.delete_confirm', 'Supprimer {0} ?'),
('fr', 'users.role', 'Rôle'),
('fr', 'users.role_admin', 'Administrateur'),
('fr', 'users.role_user', 'Utilisateur')
('fr', 'users.role_user', 'Utilisateur'),
('fr', 'servers.import_from_panel', 'Importer depuis un panel existant'),
('fr', 'servers.select_panel_type', 'Sélectionnez le type de panel'),
('fr', 'servers.panel_type_wgeasy', 'wg-easy'),
('fr', 'servers.panel_type_3xui', '3x-ui'),
('fr', 'servers.upload_backup_file', 'Télécharger le fichier de sauvegarde (JSON)'),
('fr', 'servers.import_in_progress', 'Importation en cours...'),
('fr', 'servers.import_success', '{0} clients importés avec succès'),
('fr', 'servers.import_failed', 'Échec de l''importation'),
('fr', 'servers.import_partial', '{0} clients importés sur {1}'),
('fr', 'servers.import_history', 'Historique d''importation')
ON DUPLICATE KEY UPDATE translation_value=VALUES(translation_value);
+11 -1
View File
@@ -134,5 +134,15 @@ INSERT INTO translations (language_code, translation_key, translation_value) VAL
('zh', 'users.delete_confirm', '删除 {0}'),
('zh', 'users.role', '角色'),
('zh', 'users.role_admin', '管理员'),
('zh', 'users.role_user', '用户')
('zh', 'users.role_user', '用户'),
('zh', 'servers.import_from_panel', '从现有面板导入'),
('zh', 'servers.select_panel_type', '选择面板类型'),
('zh', 'servers.panel_type_wgeasy', 'wg-easy'),
('zh', 'servers.panel_type_3xui', '3x-ui'),
('zh', 'servers.upload_backup_file', '上传备份文件 (JSON)'),
('zh', 'servers.import_in_progress', '导入进行中...'),
('zh', 'servers.import_success', '成功导入 {0} 个客户端'),
('zh', 'servers.import_failed', '导入失败'),
('zh', 'servers.import_partial', '已导入 {0}/{1} 个客户端'),
('zh', 'servers.import_history', '导入历史')
ON DUPLICATE KEY UPDATE translation_value=VALUES(translation_value);
+20
View File
@@ -0,0 +1,20 @@
-- Add panel imports tracking table
-- This migration adds functionality to track imports from other VPN panels
CREATE TABLE IF NOT EXISTS panel_imports (
id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
server_id INT UNSIGNED NOT NULL,
panel_type ENUM('wg-easy', '3x-ui') NOT NULL,
import_file_name VARCHAR(255) NOT NULL,
clients_imported INT UNSIGNED DEFAULT 0,
import_data JSON NULL COMMENT 'Original import data for reference',
status ENUM('pending', 'processing', 'completed', 'failed') DEFAULT 'pending',
error_message TEXT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
created_by INT UNSIGNED NULL,
INDEX idx_server_id (server_id),
INDEX idx_panel_type (panel_type),
INDEX idx_status (status),
FOREIGN KEY (server_id) REFERENCES vpn_servers(id) ON DELETE CASCADE,
FOREIGN KEY (created_by) REFERENCES users(id) ON DELETE SET NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;