feat: mobile-like window size and always-visible stats

- Changed window size to mobile phone format (400x800)
- Removed width condition for ActiveProxyFooter - now always visible
- Added run-umbrix.sh launch script with icon copying
- Stats cards now display on all screen sizes
This commit is contained in:
Umbrix Developer
2026-01-17 13:09:20 +03:00
parent ec5ebbd54b
commit 76a374950f
245 changed files with 7931 additions and 1315 deletions

View File

@@ -0,0 +1,85 @@
<?php
/**
* Umbrix Update Manager - Restore Version
* Откат на предыдущую версию из бэкапа
*/
header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Methods: POST, OPTIONS');
header('Access-Control-Allow-Headers: Content-Type');
header('Content-Type: application/json; charset=utf-8');
if ($_SERVER['REQUEST_METHOD'] === 'OPTIONS') {
http_response_code(200);
exit();
}
if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
http_response_code(405);
echo json_encode(['success' => false, 'message' => 'Method Not Allowed']);
exit();
}
$input = file_get_contents('php://input');
$data = json_decode($input, true);
if (!isset($data['filename'])) {
http_response_code(400);
echo json_encode(['success' => false, 'message' => 'Не указан файл для восстановления']);
exit();
}
$filename = basename($data['filename']); // Защита от path traversal
$backups_dir = __DIR__ . '/../';
$backup_file = $backups_dir . $filename;
$current_file = $backups_dir . 'latest.json';
// Проверяем существование файла бэкапа
if (!file_exists($backup_file)) {
http_response_code(404);
echo json_encode(['success' => false, 'message' => 'Файл бэкапа не найден']);
exit();
}
// Проверяем, что это действительно файл бэкапа
if (!preg_match('/^latest\.json\.backup\.\d{4}-\d{2}-\d{2}_\d{2}-\d{2}-\d{2}$/', $filename)) {
http_response_code(400);
echo json_encode(['success' => false, 'message' => 'Неверный формат файла']);
exit();
}
// Создаём бэкап текущей версии перед откатом
if (file_exists($current_file)) {
$backup_name = 'latest.json.backup.' . date('Y-m-d_H-i-s');
copy($current_file, $backups_dir . $backup_name);
}
// Восстанавливаем версию из бэкапа
if (copy($backup_file, $current_file)) {
// Логируем откат
$log_dir = $backups_dir . 'logs';
if (!is_dir($log_dir)) {
mkdir($log_dir, 0755, true);
}
$log_entry = sprintf(
"[%s] RESTORE: %s -> latest.json (IP: %s)\n",
date('Y-m-d H:i:s'),
$filename,
$_SERVER['REMOTE_ADDR'] ?? 'unknown'
);
file_put_contents($log_dir . '/restore.log', $log_entry, FILE_APPEND);
// Получаем данные восстановленной версии
$restored_data = json_decode(file_get_contents($current_file), true);
echo json_encode([
'success' => true,
'message' => 'Версия успешно восстановлена',
'version' => $restored_data['version'] ?? 'unknown',
'build_number' => $restored_data['build_number'] ?? 0
]);
} else {
http_response_code(500);
echo json_encode(['success' => false, 'message' => 'Ошибка при восстановлении файла']);
}