97 lines
4.6 KiB
HTML
97 lines
4.6 KiB
HTML
{% extends "base.html" %}
|
||
|
||
{% block title %}Резервное копирование и экспорт - МКД ЛенКом 37{% endblock %}
|
||
{% block nav_export %}active{% endblock %}
|
||
|
||
{% block content %}
|
||
<div class="mb-3">
|
||
<h4 class="mb-1" style="font-size: 16px; font-weight: bold;">Резервное копирование и экспорт базы</h4>
|
||
<div class="small text-muted">Формирование дампов базы данных и синхронизация с локальным Git-сервером (Forgejo)</div>
|
||
</div>
|
||
|
||
<div class="row g-3">
|
||
<div class="col-md-6">
|
||
<div class="card h-100">
|
||
<div class="card-header">
|
||
<i class="bi bi-file-earmark-arrow-up"></i> ЭКСПОРТ ДАННЫХ В JSON И GIT
|
||
</div>
|
||
<div class="card-body">
|
||
<p class="small text-muted mb-3">
|
||
Экспорт всех учетных записей жильцов, истории сообщений и настроек. Файл формируется в формате JSON и автоматически фиксируется коммитом в Git.
|
||
</p>
|
||
<button class="btn-unix btn-unix-primary w-100" onclick="exportJSON()">
|
||
<i class="bi bi-arrow-up-circle"></i> Запустить полный экспорт сейчас
|
||
</button>
|
||
<div id="exportResult" class="mt-3"></div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<div class="col-md-6">
|
||
<div class="card h-100">
|
||
<div class="card-header">
|
||
<i class="bi bi-clock-history"></i> СТАТИСТИКА ВЫГРУЗОК
|
||
</div>
|
||
<div class="card-body">
|
||
<table class="table mb-3">
|
||
<tbody>
|
||
<tr>
|
||
<td style="font-weight: bold; width: 180px;">Всего выгрузок:</td>
|
||
<td><span class="badge-status badge-success">{{ export_stats.total }}</span></td>
|
||
</tr>
|
||
<tr>
|
||
<td style="font-weight: bold;">Последняя выгрузка:</td>
|
||
<td>{{ fmt_local(export_stats.last_date) if export_stats.last_date else 'Никогда' }}</td>
|
||
</tr>
|
||
<tr>
|
||
<td style="font-weight: bold;">Авторасписание:</td>
|
||
<td>Каждое воскресенье в 03:00 (cron)</td>
|
||
</tr>
|
||
</tbody>
|
||
</table>
|
||
<div class="small text-muted">
|
||
Архивы сохраняются локально в каталог <code>exports/</code> и отправляются в репозиторий на Synology NAS.
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<script>
|
||
async function exportJSON() {
|
||
const resultDiv = document.getElementById('exportResult');
|
||
const btn = document.querySelector('button[onclick="exportJSON()"]');
|
||
|
||
resultDiv.innerHTML = '<div class="alert alert-info py-2 small"><div class="spinner-border spinner-border-sm me-2"></div>Сбор данных и отправка в Git...</div>';
|
||
btn.disabled = true;
|
||
|
||
try {
|
||
const response = await fetch('/api/export/json');
|
||
const data = await response.json();
|
||
|
||
if (response.ok && data.success) {
|
||
resultDiv.innerHTML = `
|
||
<div class="alert alert-success py-2 small">
|
||
<b>Успешно!</b><br>
|
||
Файл: <code>${data.filename}</code><br>
|
||
Сообщений: ${data.messages}<br>
|
||
Статус Git: ${data.git ? 'Синхронизировано в Forgejo' : 'Ошибка Git'}<br>
|
||
<div class="mt-2">
|
||
<a href="/exports/${data.filename}" class="btn-unix">
|
||
Скачать файл локально
|
||
</a>
|
||
</div>
|
||
</div>
|
||
`;
|
||
setTimeout(() => location.reload(), 10000);
|
||
} else {
|
||
resultDiv.innerHTML = `<div class="alert alert-danger py-2 small">Ошибка: ${data.error || 'Неизвестная ошибка'}</div>`;
|
||
}
|
||
} catch (error) {
|
||
resultDiv.innerHTML = `<div class="alert alert-danger py-2 small">Сетевая ошибка: ${error.message}</div>`;
|
||
} finally {
|
||
btn.disabled = false;
|
||
}
|
||
}
|
||
</script>
|
||
{% endblock %}
|