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:
+11
-1
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
Reference in New Issue
Block a user