Страница создания VM была возвращена в общий каркас панели
Этот коммит содержится в:
+143
-123
@@ -7,150 +7,169 @@
|
|||||||
<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">
|
<aside class="v-sidebar">
|
||||||
<div>
|
<div class="v-logo">
|
||||||
<div class="brand">Создать VM</div>
|
<strong>Virtuality</strong>
|
||||||
<div class="muted">Новая виртуальная машина через libvirt / virt-install</div>
|
<span>control panel</span>
|
||||||
</div>
|
</div>
|
||||||
<div class="top-meta">
|
<nav class="v-nav">
|
||||||
<span>user: {{ user }}</span>
|
<a href="/">Обзор</a>
|
||||||
<a class="link-pill" href="/network">Сеть</a>
|
<a class="active" href="/vm/create">Создать VM</a>
|
||||||
<a class="link-pill" href="/operations">Операции</a>
|
<div class="v-nav-group open">
|
||||||
<a class="link-pill" href="/iso">ISO</a>
|
<button class="v-nav-group-title" type="button">Образы</button>
|
||||||
<a class="link-pill" href="/disk-images">Диски</a>
|
<a href="/iso">ISO</a>
|
||||||
<a class="link-pill" href="/">← Дашборд</a>
|
<a href="/disk-images">Диски</a>
|
||||||
<form method="post" action="/logout" class="logout-form"><button class="ghost">Выйти</button></form>
|
|
||||||
</div>
|
|
||||||
</header>
|
|
||||||
|
|
||||||
{% if error %}
|
|
||||||
<div class="alert danger">{{ error }}</div>
|
|
||||||
{% endif %}
|
|
||||||
|
|
||||||
<section class="grid two">
|
|
||||||
<article class="card">
|
|
||||||
<div class="card-head">
|
|
||||||
<h2>Параметры</h2>
|
|
||||||
<span class="pill">VM wizard</span>
|
|
||||||
</div>
|
</div>
|
||||||
|
<a href="/network">Сеть</a>
|
||||||
|
<a href="/operations">Операции</a>
|
||||||
|
<a href="/logs">Журналы</a>
|
||||||
|
<a href="/update">Обновления</a>
|
||||||
|
<a href="/host">Хост</a>
|
||||||
|
</nav>
|
||||||
|
</aside>
|
||||||
|
|
||||||
<form method="post" action="/vm/create" class="form-grid">
|
<main class="v-main">
|
||||||
<label>
|
<header class="v-topbar">
|
||||||
<span>Имя VM</span>
|
<div>
|
||||||
<input type="text" name="name" value="{{ form.name or '' }}" placeholder="ubuntu-test" required>
|
<div class="v-title">Создать VM</div>
|
||||||
</label>
|
<div class="v-subtitle">Новая виртуальная машина через libvirt / virt-install</div>
|
||||||
|
</div>
|
||||||
|
<div class="top-meta">
|
||||||
|
<span>user: {{ user }}</span>
|
||||||
|
<a class="link-pill" href="/">← Дашборд</a>
|
||||||
|
<form method="post" action="/logout" class="logout-form"><button class="ghost">Выйти</button></form>
|
||||||
|
</div>
|
||||||
|
</header>
|
||||||
|
|
||||||
<div class="form-row">
|
{% if error %}
|
||||||
|
<div class="alert danger">{{ error }}</div>
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
<section class="grid two">
|
||||||
|
<article class="card">
|
||||||
|
<div class="card-head">
|
||||||
|
<h2>Параметры</h2>
|
||||||
|
<span class="pill">VM wizard</span>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<form method="post" action="/vm/create" class="form-grid">
|
||||||
<label>
|
<label>
|
||||||
<span>Источник VM</span>
|
<span>Имя VM</span>
|
||||||
<select id="source-type" name="source_type" required>
|
<input type="text" name="name" value="{{ form.name or '' }}" placeholder="ubuntu-test" required>
|
||||||
<option value="iso" {% if form.source_type != 'disk_image' %}selected{% endif %}>ISO-установщик</option>
|
|
||||||
<option value="disk_image" {% if form.source_type == 'disk_image' %}selected{% endif %}>Готовый диск .img / .raw / .qcow2</option>
|
|
||||||
</select>
|
|
||||||
</label>
|
</label>
|
||||||
<label>
|
|
||||||
<span>Архитектура VM</span>
|
<div class="form-row">
|
||||||
<select name="guest_arch" required>
|
<label>
|
||||||
{% for arch in arch_options %}
|
<span>Источник VM</span>
|
||||||
<option value="{{ arch.value }}" {% if form.guest_arch == arch.value %}selected{% endif %}>{{ arch.label }}</option>
|
<select id="source-type" name="source_type" required>
|
||||||
|
<option value="iso" {% if form.source_type != 'disk_image' %}selected{% endif %}>ISO-установщик</option>
|
||||||
|
<option value="disk_image" {% if form.source_type == 'disk_image' %}selected{% endif %}>Готовый диск .img / .raw / .qcow2</option>
|
||||||
|
</select>
|
||||||
|
</label>
|
||||||
|
<label>
|
||||||
|
<span>Архитектура VM</span>
|
||||||
|
<select name="guest_arch" required>
|
||||||
|
{% for arch in arch_options %}
|
||||||
|
<option value="{{ arch.value }}" {% if form.guest_arch == arch.value %}selected{% endif %}>{{ arch.label }}</option>
|
||||||
|
{% endfor %}
|
||||||
|
</select>
|
||||||
|
</label>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="form-row">
|
||||||
|
<label>
|
||||||
|
<span>RAM, MB</span>
|
||||||
|
<input type="number" name="memory" min="512" max="262144" step="512" value="{{ form.memory }}" required>
|
||||||
|
</label>
|
||||||
|
<label>
|
||||||
|
<span>CPU</span>
|
||||||
|
<input type="number" name="vcpus" min="1" max="128" value="{{ form.vcpus }}" required>
|
||||||
|
</label>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<label id="disk-size-row">
|
||||||
|
<span>Диск, GB</span>
|
||||||
|
<input type="number" name="disk_size" min="4" max="4096" value="{{ form.disk_size }}" required>
|
||||||
|
</label>
|
||||||
|
|
||||||
|
<label id="iso-source-row">
|
||||||
|
<span id="source-image-label">ISO образ</span>
|
||||||
|
<select name="iso_path">
|
||||||
|
{% for iso in isos %}
|
||||||
|
<option value="{{ iso.path }}" {% if form.iso_path == iso.path %}selected{% endif %}>{{ iso.name }} — {{ iso.size }}</option>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
</select>
|
</select>
|
||||||
</label>
|
</label>
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="form-row">
|
<div id="disk-image-source-row" class="form-subcard">
|
||||||
|
<label>
|
||||||
|
<span id="disk-image-label">Готовый образ диска</span>
|
||||||
|
<select name="disk_image_path">
|
||||||
|
{% for image in disk_images %}
|
||||||
|
<option value="{{ image.path }}" {% if form.disk_image_path == image.path %}selected{% endif %}>{{ image.name }} — {{ image.size }} — {{ image.format }}</option>
|
||||||
|
{% endfor %}
|
||||||
|
</select>
|
||||||
|
</label>
|
||||||
|
<label class="check-row">
|
||||||
|
<input type="checkbox" name="replace_existing_disk" value="1" {% if form.replace_existing_disk == '1' %}checked{% endif %}>
|
||||||
|
<span>Заменить существующий диск VM, если остался после неудачной установки</span>
|
||||||
|
</label>
|
||||||
|
<div class="muted small-note">Опция нужна, если предыдущая попытка создания VM оборвалась и оставила хвост в /var/lib/virtuality/images.</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
<label>
|
<label>
|
||||||
<span>RAM, MB</span>
|
<span>Режим сети</span>
|
||||||
<input type="number" name="memory" min="512" max="262144" step="512" value="{{ form.memory }}" required>
|
<select name="network_mode" required>
|
||||||
</label>
|
<option value="nat" {% if form.network_mode != 'bridge' %}selected{% endif %}>VPS NAT Router — virtuality-nat</option>
|
||||||
<label>
|
<option value="bridge" {% if form.network_mode == 'bridge' %}selected{% endif %}>Bridge — br0 / локальная сеть</option>
|
||||||
<span>CPU</span>
|
|
||||||
<input type="number" name="vcpus" min="1" max="128" value="{{ form.vcpus }}" required>
|
|
||||||
</label>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<label id="disk-size-row">
|
|
||||||
<span>Диск, GB</span>
|
|
||||||
<input type="number" name="disk_size" min="4" max="4096" value="{{ form.disk_size }}" required>
|
|
||||||
</label>
|
|
||||||
|
|
||||||
<label id="iso-source-row">
|
|
||||||
<span id="source-image-label">ISO образ</span>
|
|
||||||
<select name="iso_path">
|
|
||||||
{% for iso in isos %}
|
|
||||||
<option value="{{ iso.path }}" {% if form.iso_path == iso.path %}selected{% endif %}>{{ iso.name }} — {{ iso.size }}</option>
|
|
||||||
{% endfor %}
|
|
||||||
</select>
|
|
||||||
</label>
|
|
||||||
|
|
||||||
<div id="disk-image-source-row" class="form-subcard">
|
|
||||||
<label>
|
|
||||||
<span id="disk-image-label">Готовый образ диска</span>
|
|
||||||
<select name="disk_image_path">
|
|
||||||
{% for image in disk_images %}
|
|
||||||
<option value="{{ image.path }}" {% if form.disk_image_path == image.path %}selected{% endif %}>{{ image.name }} — {{ image.size }} — {{ image.format }}</option>
|
|
||||||
{% endfor %}
|
|
||||||
</select>
|
</select>
|
||||||
</label>
|
</label>
|
||||||
<label class="check-row">
|
|
||||||
<input type="checkbox" name="replace_existing_disk" value="1" {% if form.replace_existing_disk == '1' %}checked{% endif %}>
|
<label>
|
||||||
<span>Заменить существующий диск VM, если остался после неудачной установки</span>
|
<span>Bridge для режима Bridge</span>
|
||||||
|
<input type="text" name="bridge" value="{{ form.bridge }}" placeholder="br0">
|
||||||
</label>
|
</label>
|
||||||
<div class="muted small-note">Опция нужна, если предыдущая попытка создания VM оборвалась и оставила хвост в /var/lib/virtuality/images.</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<label>
|
<div id="source-mode-notice" class="notice">
|
||||||
<span>Режим сети</span>
|
Для обычных ISO выбирай x86_64 на ПК/VPS. Для Raspberry/Orange Pi образов обычно нужен ARM64/aarch64 и источник “Готовый диск”. Опция замены диска удаляет только /var/lib/virtuality/images/ИМЯ_VM.qcow2, если VM с таким именем ещё не существует.
|
||||||
<select name="network_mode" required>
|
</div>
|
||||||
<option value="nat" {% if form.network_mode != 'bridge' %}selected{% endif %}>VPS NAT Router — virtuality-nat</option>
|
|
||||||
<option value="bridge" {% if form.network_mode == 'bridge' %}selected{% endif %}>Bridge — br0 / локальная сеть</option>
|
|
||||||
</select>
|
|
||||||
</label>
|
|
||||||
|
|
||||||
<label>
|
<button id="create-vm-button" type="submit" class="primary wide">Создать виртуальную машину</button>
|
||||||
<span>Bridge для режима Bridge</span>
|
{% if not isos %}
|
||||||
<input type="text" name="bridge" value="{{ form.bridge }}" placeholder="br0">
|
<div id="iso-missing-warning" class="alert danger">Для режима ISO сначала загрузи ISO-образ в ISO-менеджере.</div>
|
||||||
</label>
|
{% endif %}
|
||||||
|
{% if not disk_images %}
|
||||||
|
<div id="disk-image-missing-warning" class="alert danger">Для режима готового диска сначала загрузи .img, .raw или .qcow2 в разделе «Диски».</div>
|
||||||
|
{% endif %}
|
||||||
|
</form>
|
||||||
|
</article>
|
||||||
|
|
||||||
<div id="source-mode-notice" class="notice">
|
<article class="card">
|
||||||
Для обычных ISO выбирай x86_64 на ПК/VPS. Для Raspberry/Orange Pi образов обычно нужен ARM64/aarch64 и источник “Готовый диск”. Опция замены диска удаляет только /var/lib/virtuality/images/ИМЯ_VM.qcow2, если VM с таким именем ещё не существует.
|
<div class="card-head">
|
||||||
|
<h2>Архитектура и источник</h2>
|
||||||
|
<a class="link-pill" href="/disk-images">Открыть диски</a>
|
||||||
</div>
|
</div>
|
||||||
|
<div class="quick-actions">
|
||||||
<button id="create-vm-button" type="submit" class="primary wide">Создать виртуальную машину</button>
|
<div class="big-action static">
|
||||||
{% if not isos %}
|
<strong>x86_64 / amd64</strong>
|
||||||
<div id="iso-missing-warning" class="alert danger">Для режима ISO сначала загрузи ISO-образ в ISO-менеджере.</div>
|
<span>Обычные ПК, серверы, большинство VPS и стандартные Ubuntu/Debian ISO.</span>
|
||||||
{% endif %}
|
</div>
|
||||||
{% if not disk_images %}
|
<div class="big-action static">
|
||||||
<div id="disk-image-missing-warning" class="alert danger">Для режима готового диска сначала загрузи .img, .raw или .qcow2 в разделе «Диски».</div>
|
<strong>ARM64 / aarch64</strong>
|
||||||
{% endif %}
|
<span>На x86-хосте работает как QEMU-эмуляция из готового диска .img/.qcow2. Это медленно, но честно.</span>
|
||||||
</form>
|
</div>
|
||||||
</article>
|
<div class="big-action static">
|
||||||
|
<strong>Готовый диск</strong>
|
||||||
<article class="card">
|
<span>Virtuality импортирует .img/.raw/.qcow2 в отдельный qcow2-диск VM, не изменяя оригинал.</span>
|
||||||
<div class="card-head">
|
</div>
|
||||||
<h2>Архитектура и источник</h2>
|
|
||||||
<a class="link-pill" href="/disk-images">Открыть диски</a>
|
|
||||||
</div>
|
|
||||||
<div class="quick-actions">
|
|
||||||
<div class="big-action static">
|
|
||||||
<strong>x86_64 / amd64</strong>
|
|
||||||
<span>Обычные ПК, серверы, большинство VPS и стандартные Ubuntu/Debian ISO.</span>
|
|
||||||
</div>
|
</div>
|
||||||
<div class="big-action static">
|
<pre>ISO x86: virt-install --arch x86_64 --cdrom ubuntu.iso
|
||||||
<strong>ARM64 / aarch64</strong>
|
|
||||||
<span>На x86-хосте работает как QEMU-эмуляция из готового диска .img/.qcow2. Это медленно, но честно.</span>
|
|
||||||
</div>
|
|
||||||
<div class="big-action static">
|
|
||||||
<strong>Готовый диск</strong>
|
|
||||||
<span>Virtuality импортирует .img/.raw/.qcow2 в отдельный qcow2-диск VM, не изменяя оригинал.</span>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<pre>ISO x86: virt-install --arch x86_64 --cdrom ubuntu.iso
|
|
||||||
IMG ARM: qemu-img convert -O qcow2 image.img VM.qcow2
|
IMG ARM: qemu-img convert -O qcow2 image.img VM.qcow2
|
||||||
virsh define /tmp/virtuality-VM-arm64.xml && virsh start VM</pre>
|
virsh define /tmp/virtuality-VM-arm64.xml && virsh start VM</pre>
|
||||||
</article>
|
</article>
|
||||||
</section>
|
</section>
|
||||||
|
</main>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
@@ -186,5 +205,6 @@ IMG ARM: qemu-img convert -O qcow2 image.img VM.qcow2
|
|||||||
sourceType.addEventListener('change', refreshSourceUI);
|
sourceType.addEventListener('change', refreshSourceUI);
|
||||||
refreshSourceUI();
|
refreshSourceUI();
|
||||||
</script>
|
</script>
|
||||||
|
<script src="/static/panel.js" defer></script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
Ссылка в новой задаче
Block a user