Cloud-образы, клонирование VM и шаблоны были добавлены

Каталог официальных cloud-образов Ubuntu/Debian (x86_64 и aarch64) со
скачиванием в фоне, страница /cloud-images, создание VM из cloud-образа
с настройкой пользователя, пароля и SSH-ключа через cloud-init seed,
клонирование VM через virt-clone и флаг шаблона с блокировкой запуска.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01PKUoZwHMCHnytfswFVRUHw
Этот коммит содержится в:
Claude
2026-08-15 19:14:53 +00:00
родитель 0c95e8e516
Коммит 9e54614869
7 изменённых файлов: 676 добавлений и 13 удалений
+36
Просмотреть файл
@@ -75,6 +75,9 @@
{% if iso_error %}<div class="alert danger">{{ iso_error }}</div>{% endif %}
{% if boot_message %}<div class="alert success">{{ boot_message }}</div>{% endif %}
{% if boot_error %}<div class="alert danger">{{ boot_error }}</div>{% endif %}
{% if clone_message %}<div class="alert success">{{ clone_message }}</div>{% endif %}
{% if clone_error %}<div class="alert danger">{{ clone_error }}</div>{% endif %}
{% if is_template %}<div class="alert warn">Эта VM помечена как шаблон: запуск заблокирован. Клонируй её для создания новых машин.</div>{% endif %}
<section class="grid vm-four-grid">
<article class="card">
@@ -244,6 +247,39 @@
</article>
</section>
<section class="grid two">
<article class="card">
<div class="card-head">
<h2>Клонирование</h2>
<span class="pill">virt-clone</span>
</div>
<form method="post" action="/vm/{{ vm.name }}/clone" class="form-grid">
<label>
<span>Имя новой VM</span>
<input type="text" name="new_name" placeholder="{{ vm.name }}-copy" required>
</label>
<button class="primary wide" {% if is_running %}disabled{% endif %}>Клонировать VM</button>
{% if is_running %}
<p class="muted small-note">Клонирование доступно только для выключенной VM — сначала выключи её.</p>
{% else %}
<p class="muted small-note">Диски копируются целиком, MAC-адрес нового клона генерируется автоматически. Прогресс — в «Операциях».</p>
{% endif %}
</form>
</article>
<article class="card">
<div class="card-head">
<h2>Шаблон</h2>
<span class="pill">{{ 'template' if is_template else 'обычная VM' }}</span>
</div>
<form method="post" action="/vm/{{ vm.name }}/template" class="form-grid">
<input type="hidden" name="enabled" value="{{ '0' if is_template else '1' }}">
<button class="{{ 'ghost' if is_template else 'primary' }} wide">{{ 'Снять флаг шаблона' if is_template else 'Пометить как шаблон' }}</button>
</form>
<p class="muted small-note">Шаблон — эталонная VM для клонирования: запуск заблокирован, чтобы случайно не изменить эталонный диск. Подготовь VM, выключи её и пометь как шаблон.</p>
</article>
</section>
<section class="card">
<div class="card-head">
<h2>Консоль</h2>