diff --git a/app.py b/app.py index a70fb21..502bb5e 100644 --- a/app.py +++ b/app.py @@ -2793,27 +2793,30 @@ async def api_protocol_backup_create(request: Request, server_id: int, req: Prot return JSONResponse({'error': 'Forbidden'}, status_code=403) if not is_valid_protocol(req.protocol): return JSONResponse({'error': 'Unknown protocol'}, status_code=400) - ssh = None try: - data = load_data() + data = await load_data_async() if server_id >= len(data['servers']): return JSONResponse({'error': 'Server not found'}, status_code=404) container = protocol_container_name(req.protocol) if not container: return JSONResponse({'error': 'Unknown protocol'}, status_code=400) server = data['servers'][server_id] - ssh = get_ssh(server) - ssh.connect() - result = BackupManager(ssh).create_backup(req.protocol, container) + + def _do_create(): + ssh = get_ssh(server) + ssh.connect() + try: + return BackupManager(ssh).create_backup(req.protocol, container) + finally: + ssh.disconnect() + + result = await asyncio.to_thread(_do_create) if result.get('status') == 'error': return JSONResponse({'error': result.get('message', 'Failed to create backup')}, status_code=500) return result except Exception as e: logger.exception("Error creating protocol backup") return JSONResponse({'error': str(e)}, status_code=500) - finally: - if ssh: - ssh.disconnect() @app.post('/api/servers/{server_id}/backups/download', tags=["Protocols"]) @@ -2898,27 +2901,30 @@ async def api_protocol_backup_restore(request: Request, server_id: int, req: Bac return JSONResponse({'error': 'Forbidden'}, status_code=403) if not is_valid_protocol(req.protocol): return JSONResponse({'error': 'Unknown protocol'}, status_code=400) - ssh = None try: - data = load_data() + data = await load_data_async() if server_id >= len(data['servers']): return JSONResponse({'error': 'Server not found'}, status_code=404) container = protocol_container_name(req.protocol) if not container: return JSONResponse({'error': 'Unknown protocol'}, status_code=400) server = data['servers'][server_id] - ssh = get_ssh(server) - ssh.connect() - result = BackupManager(ssh).restore_backup(req.protocol, container, req.filename) + + def _do_restore(): + ssh = get_ssh(server) + ssh.connect() + try: + return BackupManager(ssh).restore_backup(req.protocol, container, req.filename) + finally: + ssh.disconnect() + + result = await asyncio.to_thread(_do_restore) if result.get('status') == 'error': return JSONResponse({'error': result.get('message', 'Failed to restore backup')}, status_code=500) return result except Exception as e: logger.exception("Error restoring protocol backup") return JSONResponse({'error': str(e)}, status_code=500) - finally: - if ssh: - ssh.disconnect() @app.post('/api/servers/{server_id}/backups/export-clients', tags=["Protocols"]) diff --git a/managers/backup_manager.py b/managers/backup_manager.py index bc56924..65c1cf9 100644 --- a/managers/backup_manager.py +++ b/managers/backup_manager.py @@ -229,15 +229,15 @@ for p in {host_paths}; do restore_host_path "$p"; done for p in {container_paths}; do restore_container_path "$p"; done if [ -n "$container" ] && docker inspect "$container" >/dev/null 2>&1; then docker restart "$container" >/dev/null 2>&1 || true - # Prefer bringing the WireGuard/AWG interface back up after file restore + # Entrypoint usually brings the interface up; give start.sh a short bounded window if docker exec "$container" test -x /opt/amnezia/start.sh >/dev/null 2>&1; then - docker exec "$container" /opt/amnezia/start.sh >/dev/null 2>&1 || true + timeout 25 docker exec "$container" /opt/amnezia/start.sh >/dev/null 2>&1 || true fi fi printf 'restored:%s\\n' "$protocol" """.strip() - out, err, code = self.ssh.run_sudo_command(script, timeout=180) + out, err, code = self.ssh.run_sudo_command(script, timeout=120) if code != 0: return {'status': 'error', 'message': err or out or 'Failed to restore backup'} return {'status': 'success', 'protocol': protocol, 'filename': safe_name} diff --git a/templates/server.html b/templates/server.html index 37ebe28..8b55fe7 100644 --- a/templates/server.html +++ b/templates/server.html @@ -761,6 +761,10 @@
+