2 Коммитов
Автор SHA1 Сообщение Дата
viktor daeec06ec6 Версия была обновлена до 0.12.3
CI / Tests (Python 3.11) (push) Canceled after 0s
CI / Tests (Python 3.12) (push) Canceled after 0s
CI / Tests (Python 3.13) (push) Canceled after 0s
CI / Tests (Python 3.14) (push) Canceled after 0s
CI / Shell scripts (push) Canceled after 0s
Build ISO image / ISO ${{ fromJSON(github.event_name == 'workflow_dispatch' && (inputs.arch == 'both' && '["amd64","arm64"]' || format('["{0}"]', inputs.arch)) || '["amd64","arm64"]') }} (push) Canceled after 0s
2026-09-27 17:32:45 +09:00
viktor 209e83044a Экран машины снова подключается: noVNC 1.6 строил адрес WebSocket от своей страницы и уходил в /novnc/console/ws, путь теперь работает и с 1.6, и с 1.3 2026-09-27 17:32:45 +09:00
6 изменённых файлов: 40 добавлений и 11 удалений
+2 -2
Просмотреть файл
@@ -2,7 +2,7 @@
**Virtuality** — простая замена Proxmox для дома и малого офиса. Один сервер, виртуальные машины и понятная панель в браузере на русском языке. Внутри — проверенные KVM, QEMU и libvirt, снаружи — интерфейс, в котором не нужна командная строка.
Текущая версия: **0.12.2** (файл `VERSION`, журнал изменений — `updates/versions.json`).
Текущая версия: **0.12.3** (файл `VERSION`, журнал изменений — `updates/versions.json`).
Что умеет:
@@ -76,7 +76,7 @@
sudo apt install -y xorriso git curl python3-pip
git clone https://git.stackworks.ru/viktor/virtuality.git
cd virtuality
make iso # dist/virtuality-0.12.2-ubuntu-26.04-amd64.iso
make iso # dist/virtuality-0.12.3-ubuntu-26.04-amd64.iso
```
Дальше: записать образ на флешку (Rufus, balenaEtcher или `dd`), загрузиться с неё, выбрать **Установить Virtuality**, ответить на три экрана установщика и дождаться перезагрузки. Через минуту после неё панель уже открывается в браузере — адрес показан на экране сервера. Все подробности, параметры сборки и полностью автоматическая установка — в [docs/IMAGE.md](docs/IMAGE.md).
+1 -1
Просмотреть файл
@@ -1 +1 @@
0.12.2
0.12.3
+7 -7
Просмотреть файл
@@ -44,8 +44,8 @@ make iso ARCH=arm64 # ARM64-серверы с UEFI
`image/build-iso.sh` сам находит последний Ubuntu 26.04.x live-server ISO, скачивает его (около 3 ГБ), проверяет SHA256 и кладёт результат в `dist/`:
```text
dist/virtuality-0.12.2-ubuntu-26.04-amd64.iso
dist/virtuality-0.12.2-ubuntu-26.04-amd64.iso.sha256
dist/virtuality-0.12.3-ubuntu-26.04-amd64.iso
dist/virtuality-0.12.3-ubuntu-26.04-amd64.iso.sha256
```
Скачанный ISO Ubuntu кешируется в `.cache/iso` (или в `VIRTUALITY_ISO_CACHE`). Уже скачанный образ можно передать явно:
@@ -109,7 +109,7 @@ make iso ISO_ARGS="--unattended --username sysadmin --password-hash '$(openssl p
## Что спрашивает установщик
Меню загрузки: **Установить Virtuality 0.12.2** (выбирается сам через 10 секунд), тот же пункт с новым ядром HWE, загрузка с другого диска, настройки UEFI, проверка памяти.
Меню загрузки: **Установить Virtuality 0.12.3** (выбирается сам через 10 секунд), тот же пункт с новым ядром HWE, загрузка с другого диска, настройки UEFI, проверка памяти.
Сценарий `image/autoinstall.yaml` оставляет интерактивными только три экрана установщика Ubuntu:
@@ -161,14 +161,14 @@ cat /var/log/virtuality/firstboot.log
Сверьте контрольную сумму скачанного или собранного образа:
```bash
sha256sum -c virtuality-0.12.2-ubuntu-26.04-amd64.iso.sha256
sha256sum -c virtuality-0.12.3-ubuntu-26.04-amd64.iso.sha256
```
Убедиться, что образ загрузочный и содержит нужные файлы (то же делает CI):
```bash
xorriso -indev virtuality-0.12.2-ubuntu-26.04-amd64.iso -report_el_torito plain 2>/dev/null | grep UEFI
xorriso -osirrox on -indev virtuality-0.12.2-ubuntu-26.04-amd64.iso -extract /autoinstall.yaml autoinstall.yaml
xorriso -indev virtuality-0.12.3-ubuntu-26.04-amd64.iso -report_el_torito plain 2>/dev/null | grep UEFI
xorriso -osirrox on -indev virtuality-0.12.3-ubuntu-26.04-amd64.iso -extract /autoinstall.yaml autoinstall.yaml
```
---
@@ -182,7 +182,7 @@ xorriso -osirrox on -indev virtuality-0.12.2-ubuntu-26.04-amd64.iso -extract /au
- **Linux**: balenaEtcher или `dd`, где `/dev/sdX` — устройство флешки (проверьте через `lsblk`):
```bash
sudo dd if=dist/virtuality-0.12.2-ubuntu-26.04-amd64.iso of=/dev/sdX bs=4M status=progress conv=fsync
sudo dd if=dist/virtuality-0.12.3-ubuntu-26.04-amd64.iso of=/dev/sdX bs=4M status=progress conv=fsync
```
Загрузитесь с флешки (меню загрузки — обычно F8, F11, F12 или Esc при включении), выберите **Установить Virtuality**.
+17
Просмотреть файл
@@ -254,3 +254,20 @@ def test_failed_create_of_existing_vm_keeps_its_disk(logged_in, data_dirs):
def test_operation_page_reveals_only_buttons_for_its_result():
script = (Path(__file__).resolve().parents[1] / "web" / "static" / "panel.js").read_text()
assert '$$(`[data-op-done="${status}"]`)' in script and "$$('[data-op-done]')" not in script
def test_console_websocket_path_works_with_old_and_new_novnc(tmp_path, monkeypatch):
"""noVNC 1.6 (Ubuntu 26.04) считает path от /novnc/vnc.html: без "../" экран стучался в /novnc/console/ws/… и не подключался."""
import posixpath
from urllib.parse import parse_qs, urljoin, urlsplit
(tmp_path / "vnc.html").write_text("<html></html>")
monkeypatch.setattr(app, "NOVNC_DIR", tmp_path)
monkeypatch.setattr(app, "vm_vnc_display", lambda name: "127.0.0.1:0")
info = app.console_info("web01")
page = "https://panel.test:8443" + info["url"]
path = parse_qs(urlsplit(page).query)["path"][0]
token = path.rsplit("/", 1)[1]
assert app.console_serializer.loads(token) == {"vm": "web01", "port": 5900}
assert urlsplit(urljoin(page, path)).path == f"/console/ws/{token}" # noVNC 1.6: new URL(path, location.href)
assert posixpath.normpath("/" + path) == f"/console/ws/{token}" # noVNC 1.3: "wss://host:port/" + path
+10
Просмотреть файл
@@ -1,5 +1,15 @@
{
"versions": [
{
"version": "0.12.3",
"date": "2026-09-27",
"title": "Экран машины снова подключается",
"summary": "На Ubuntu 26.04 экран машины в браузере не подключался: новая версия noVNC обращалась не по тому адресу. Теперь экран работает и с новой, и со старой версией noVNC.",
"features": [
"Экран машины в браузере подключается на Ubuntu 26.04 и Debian 13 (noVNC 1.6), как и на Ubuntu 24.04 (noVNC 1.3)",
"Версия обновлена до 0.12.3"
]
},
{
"version": "0.12.2",
"date": "2026-09-27",
+3 -1
Просмотреть файл
@@ -939,7 +939,9 @@ def console_info(name: str) -> dict[str, Any]:
url = None
if port and has_novnc:
token = console_serializer.dumps({"vm": name, "port": port})
url = f"/novnc/vnc.html?autoconnect=1&resize=scale&path=console/ws/{token}"
# "../": noVNC 1.6 (Ubuntu 26.04) строит адрес от своей страницы /novnc/vnc.html, а 1.3 (Ubuntu 24.04)
# приклеивает path к корню сайта; в обоих случаях получается /console/ws/<токен>.
url = f"/novnc/vnc.html?autoconnect=1&resize=scale&path=../console/ws/{token}"
return {"vm": name, "display": display, "port": port, "has_novnc": has_novnc, "novnc_dir": str(NOVNC_DIR) if NOVNC_DIR else "not installed", "url": url}