Страница дисков была переведена на единое меню

Этот коммит содержится в:
Виктор
2026-05-07 10:19:56 +09:00
родитель 6a6fd7bb83
Коммит ab9d51611a
+91 -88
Просмотреть файл
@@ -7,102 +7,104 @@
<link rel="stylesheet" href="/static/app.css"> <link rel="stylesheet" href="/static/app.css">
</head> </head>
<body> <body>
<div class="shell"> <div class="v-layout">
<header class="topbar"> {% include "_sidebar.html" %}
<div>
<div class="brand">Диски</div>
<div class="muted">Готовые образы установленных систем: .img / .raw / .qcow2 / .img.xz, а также архивы .zip / .tar.gz / .tgz</div>
</div>
<div class="top-meta">
<span>user: {{ user }}</span>
<a class="link-pill" href="/">← Дашборд</a>
<a class="link-pill" href="/iso">ISO</a>
<a class="link-pill accent" href="/vm/create">+ Создать VM</a>
<form method="post" action="/logout" class="logout-form"><button class="ghost">Выйти</button></form>
</div>
</header>
{% if error %} <main class="v-main">
<div class="alert danger">{{ error }}</div> <header class="v-topbar">
{% endif %} <div>
<div class="v-title">Диски</div>
<section class="grid two"> <div class="v-subtitle">Готовые образы установленных систем: .img / .raw / .qcow2 / .img.xz, а также архивы .zip / .tar.gz / .tgz</div>
<article class="card">
<div class="card-head">
<h2>Загрузить образ установленной системы</h2>
<span class="pill">.img .raw .qcow2 .img.xz .zip .tar.gz</span>
</div> </div>
<form id="disk-upload-form" method="post" action="/disk-images/upload" enctype="multipart/form-data" class="form-grid"> <div class="top-meta">
<label class="upload-box"> <span>user: {{ user }}</span>
<span>Выбери файл готового диска или архив с диском</span> <a class="link-pill" href="/">← Дашборд</a>
<input id="disk-file-input" type="file" name="image_file" accept=".img,.raw,.qcow2,.img.xz,.zip,.tar.gz,.tgz" required> <form method="post" action="/logout" class="logout-form"><button class="ghost">Выйти</button></form>
</label> </div>
<div id="disk-file-hint" class="muted small-note">Файл ещё не выбран. Разрешены .img, .raw, .qcow2, .img.xz, .zip, .tar.gz и .tgz.</div> </header>
<div id="disk-file-error" class="alert danger" hidden></div>
<div id="upload-progress-wrap" class="upload-progress-wrap" hidden> {% if error %}
<div class="upload-progress-head"> <div class="alert danger">{{ error }}</div>
<strong id="upload-status">Подготовка…</strong> {% endif %}
<span id="upload-percent">0%</span>
<section class="grid two">
<article class="card">
<div class="card-head">
<h2>Загрузить образ установленной системы</h2>
<span class="pill">.img .raw .qcow2 .img.xz .zip .tar.gz</span>
</div>
<form id="disk-upload-form" method="post" action="/disk-images/upload" enctype="multipart/form-data" class="form-grid">
<label class="upload-box">
<span>Выбери файл готового диска или архив с диском</span>
<input id="disk-file-input" type="file" name="image_file" accept=".img,.raw,.qcow2,.img.xz,.zip,.tar.gz,.tgz" required>
</label>
<div id="disk-file-hint" class="muted small-note">Файл ещё не выбран. Разрешены .img, .raw, .qcow2, .img.xz, .zip, .tar.gz и .tgz.</div>
<div id="disk-file-error" class="alert danger" hidden></div>
<div id="upload-progress-wrap" class="upload-progress-wrap" hidden>
<div class="upload-progress-head">
<strong id="upload-status">Подготовка…</strong>
<span id="upload-percent">0%</span>
</div>
<div class="progress big"><span id="upload-progress-bar"></span></div>
<div class="upload-progress-meta">
<span id="upload-loaded">0 MB</span>
<span id="upload-speed">скорость считается…</span>
</div>
</div> </div>
<div class="progress big"><span id="upload-progress-bar"></span></div> <button id="disk-upload-button" type="submit" class="primary wide">Загрузить образ диска</button>
<div class="upload-progress-meta"> </form>
<span id="upload-loaded">0 MB</span> <p class="muted small-note">Архив или .img.xz будет распакован автоматически. Virtuality найдёт внутри .img/.raw/.qcow2 или распакует .img.xz и положит результат в <b>/var/lib/virtuality/disk-images</b>. После загрузки .img/.raw/.img.xz запускается конвертация в qcow2. Установочные .iso загружаются отдельно в разделе <b>ISO</b>.</p>
<span id="upload-speed">скорость считается…</span> </article>
<article class="card">
<div class="card-head">
<h2>Как использовать</h2>
<span class="pill">import disk</span>
</div>
<div class="quick-actions">
<div class="big-action static">
<strong>Raspberry / Orange Pi images</strong>
<span>Загрузи .img, .img.xz или архив с .img, дождись распаковки/конвертации, затем в “Создать VM” выбери режим “Готовый диск”.</span>
</div>
<div class="big-action static">
<strong>Архивы безопасно распаковываются</strong>
<span>Поддерживаются .zip, .tar.gz, .tgz и .img.xz. Из обычных архивов берём только .img/.raw/.qcow2.</span>
</div> </div>
</div> </div>
<button id="disk-upload-button" type="submit" class="primary wide">Загрузить образ диска</button> <pre>qemu-img convert -p -f raw -O qcow2 source.img source.qcow2</pre>
</form> </article>
<p class="muted small-note">Архив или .img.xz будет распакован автоматически. Virtuality найдёт внутри .img/.raw/.qcow2 или распакует .img.xz и положит результат в <b>/var/lib/virtuality/disk-images</b>. После загрузки .img/.raw/.img.xz запускается конвертация в qcow2. Установочные .iso загружаются отдельно в разделе <b>ISO</b>.</p> </section>
</article>
<article class="card"> <section class="card">
<div class="card-head"> <div class="card-head">
<h2>Как использовать</h2> <h2>Локальные образы дисков</h2>
<span class="pill">import disk</span> <span class="pill">{{ images|length }} файлов</span>
</div> </div>
<div class="quick-actions"> <table>
<div class="big-action static"> <thead>
<strong>Raspberry / Orange Pi images</strong> <tr><th>Файл</th><th>Тип</th><th>Размер</th><th>Обновлён</th><th>Действия</th></tr>
<span>Загрузи .img, .img.xz или архив с .img, дождись распаковки/конвертации, затем в “Создать VM” выбери режим “Готовый диск”.</span> </thead>
</div> <tbody>
<div class="big-action static"> {% for image in images %}
<strong>Архивы безопасно распаковываются</strong> <tr>
<span>Поддерживаются .zip, .tar.gz, .tgz и .img.xz. Из обычных архивов берём только .img/.raw/.qcow2.</span> <td class="strong">{{ image.name }}</td>
</div> <td><span class="status ok">{{ image.format }}</span></td>
</div> <td>{{ image.size }}</td>
<pre>qemu-img convert -p -f raw -O qcow2 source.img source.qcow2</pre> <td>{{ image.updated }}</td>
</article> <td class="actions">
</section> <a class="link-pill" href="/vm/create">Создать VM</a>
<form method="post" action="/disk-images/{{ image.name }}/delete" onsubmit="return confirm('Удалить образ {{ image.name }}?');">
<section class="card"> <button class="danger">Удалить</button>
<div class="card-head"> </form>
<h2>Локальные образы дисков</h2> </td>
<span class="pill">{{ images|length }} файлов</span> </tr>
</div> {% else %}
<table> <tr><td colspan="5" class="muted">Образов пока нет. Загрузи .img, .raw, .qcow2, .img.xz или архив .zip/.tar.gz/.tgz.</td></tr>
<thead> {% endfor %}
<tr><th>Файл</th><th>Тип</th><th>Размер</th><th>Обновлён</th><th>Действия</th></tr> </tbody>
</thead> </table>
<tbody> </section>
{% for image in images %} </main>
<tr>
<td class="strong">{{ image.name }}</td>
<td><span class="status ok">{{ image.format }}</span></td>
<td>{{ image.size }}</td>
<td>{{ image.updated }}</td>
<td class="actions">
<a class="link-pill" href="/vm/create">Создать VM</a>
<form method="post" action="/disk-images/{{ image.name }}/delete" onsubmit="return confirm('Удалить образ {{ image.name }}?');">
<button class="danger">Удалить</button>
</form>
</td>
</tr>
{% else %}
<tr><td colspan="5" class="muted">Образов пока нет. Загрузи .img, .raw, .qcow2, .img.xz или архив .zip/.tar.gz/.tgz.</td></tr>
{% endfor %}
</tbody>
</table>
</section>
</div> </div>
<script> <script>
@@ -307,5 +309,6 @@
xhr.send(data); xhr.send(data);
}); });
</script> </script>
<script src="/static/panel.js" defer></script>
</body> </body>
</html> </html>