Felhom in a VM on OpenMediaVault 8 (KVM plugin): tried on an exact copy of the pilot's box; Hungarian guide; R-1068..R-1073; capability A23
gates / gates (push) Successful in 6m53s

On demo-hp: OMV 8.5.11-1 + openmediavault-kvm 8.3.4 in a VM, every OMV step done in its web pages
(headless browser). Public ISO 1.29.0 on the whole passed NVMe, BIOS firmware, bound and claimed as
throwaway customer Tester4, Vaultwarden + Jellyfin, local backups, two OMV restarts (clean guest
shutdown, AutoStart back in 1 min 52 s). Guest memory 7,863 MiB of 12 GiB.
Traps for the guide: the bridge changes OMV's IP; the plugin boots the disk first (wipe the NVMe);
the host-disk list offers OMV's own disk. Rows: one-disk Jellyfin refusal (R-1068), virtio disk not
formattable (R-1069), tunnel-less OS-update alarm (R-1070), NAS films for Jellyfin (R-1071, operator),
mixed formal/informal backup text (R-1072), no SMART in a VM (R-1073, operator). Register 157 -> 163.
Everything removed; Tester 1 back ONLINE. Customer Tester4 waits for the operator's delete.

Claude-Session: https://claude.ai/code/session_012qRErfCoiTkvDK9N5XHbzb
This commit is contained in:
2026-10-15 19:24:59 +02:00
parent 5d4538cc59
commit 340804f9af
81 changed files with 1334 additions and 4 deletions
+75
View File
@@ -0,0 +1,75 @@
# REPORT — Felhom in a virtual machine on OpenMediaVault 8, and a Hungarian guide for the pilot tester (2026-10-15)
Written in ASD-STE100 Simplified Technical English. Baselines read 16:25: felhom.eu `3263bb26bc`, felhom-controller
`85f65c70d8` (v0.314.0), felhom-agent `d2053e7d47`. Read first: `runbooks/target-selection.md`, `operations/nodes.md`,
`runbooks/day0-install.md`, `runbooks/VOLUNTEER-first-hour.md`, `architecture/15-media-library.md`,
`architecture/07-backup-architecture.md` §7.5, R-548. Evidence: `documentation/audits/omv-vm-2026-10-15/`.
## What waits on you
1. **Send the guide to Ferenc.** Its first section is five lines for an e-mail: `documentation/pilot/GUIDE-omv-kvm-hu.md`.
If you do nothing: he has no steps for the call.
2. **Delete the test customer Tester4 in the hub** (browser only). The VM is gone; the host record stays until then.
3. **Two decisions, no hurry:** R-1071 (should Jellyfin read films from a NAS share?) and R-1073 (Felhom in a VM cannot
see disk health — is that acceptable?).
## 1. Did it work end to end? — Yes, on an exact copy
- I built a copy of his box on demo-hp: OMV 8.5.11-1, kernel 7.2.6, 16 GB, a small system disk, a fake Samsung NVMe,
and the KVM plugin 8.3.4. All the same versions as on his screenshots.
- I did every OMV step in OMV's own web pages, with a headless browser. Screenshots are in the evidence.
- **Firmware:** the plugin's default (BIOS) boots our ISO. I did not need UEFI.
- **The bridge:** it works, but OMV gets a **new address**, and the open page hangs. OMV's own screen shows the
old address. `http://<name>.local` or the router finds it. Copying the card's hardware address did not keep the old
address.
- **Autostart:** I restarted OMV with Felhom running. OMV shut Felhom down cleanly and started it again by itself.
The dashboard was back in 1 min 52 s.
## 2. Memory
- The VM has 12 GB. Felhom's guest got **7.7 GB** (7,863 MB). The rule „total minus 4 GB" held.
- The estimator has no 12 GB size. By its own rule: the household set „fits, but tight"; without Immich „fits well".
## 3. Backups on a one-disk box
- Work: the whole-guest copy on the same disk (645 MB), and each app's first copy.
- Cannot exist: the second copy on another drive.
- The household sees: „Csak egy másolat készül (nincs második meghajtó)…" and „…így hibás fájlok ellen véd, lemezhiba
ellen nem." Clear and true. The two sentences mix formal and informal Hungarian (R-1072).
- Off-site was not switched on for this test customer.
## 4. Jellyfin reading an OMV share — No
- Felhom mounts the OMV share (it needs a user name and a writable share).
- Jellyfin still gets only local drives. This is the design (R-108). Your decision: R-1071.
## 5. Problems Ferenc would meet, and what the guide does
| Problem | Guide |
|---|---|
| OMV's address changes after the bridge; the page hangs | says so before; `<name>.local`, router list, monitor steps |
| The bridge form shows no network card | delete the card's setting first, apply once |
| The VM hangs at „Booting from Hard Disk…" (old films partition) | wipe the NVMe in OMV first |
| The disk list also offers OMV's own disk | „never `/dev/sda` or `/dev/sdb`" |
| The plugin's default network is wrong | Modell = `bridge`, Híd = `br0` |
| The pool starts stopped | Állapot → Indítás |
| The installer refuses the default e-mail and hostname | the table says what to type |
| Jellyfin refused on one disk (R-1068) | „call me, we do it together" |
| A second disk on `virtio` cannot be formatted (R-1069) | use `sata` |
| The plugin pages are English | the guide uses their English words |
## 6. Rows, commits, clean-up
- **Register: 157 → 163.** Opened 6 (R-1068 to R-1073), closed 0.
- **Capability map:** new row A23, PARTIAL. `unproven.py`: unchanged (35 of 55 not walked).
- **Clean-up:**
- Machine: the Felhom VM was switched off from its dashboard, then `omv-sim` and all its disks were destroyed. Yes.
- Host: the browser container and the OMV ISO are removed. The nested setting was on before; I did not touch it. Yes.
- Tester 1: started 17:16, ONLINE on the hub at 17:16:54, its guest runs. Yes.
- Hub: Tester4 remains (yours to delete). No tunnel or DNS name was made. Nothing on ep0.
- **My mistake, recorded:** I first used low-level disk calls for the second disk. The box then sent two
„Meghajtó váratlanul leválasztva" error events for Tester4. The dashboard's own „Csatlakoztatás" worked at once.
- **No product code changed.** No changelog entry: this repo has changelogs only for hub, scripts, website and
marketing, and this run changed none of them.
- Secrets (passwords, the bind link, the codes, the owner phrase) stayed in the session's scratch folder. None is in a
committed file.
+2
View File
@@ -20,6 +20,8 @@
- 65 apps in the catalog. New today: Prowlarr — you enter your download sources once, and Sonarr and Radarr get them, linked by the box with no button (the website lists 63 apps — R-1036). OS updates, the kernel lane too, run at night.
- The hub is closed again after the 2026-10-12 security review; one box cannot read another's data.
- Felhom runs in a virtual machine on OpenMediaVault 8, tried on an exact copy of the first outside tester's box: install, bind, claim, apps, backup, and back by itself after an OMV restart. The Hungarian guide for him is `documentation/pilot/GUIDE-omv-kvm-hu.md`; open: one-disk Jellyfin (R-1068), NAS films for Jellyfin (R-1071, yours), no disk health in a VM (R-1073, yours). Waits on you: send the guide; delete test customer Tester4 in the hub.
## What is broken
- Several root-level weaknesses wait on your four decisions below (R-954, R-971, R-982, R-985).
- DooPlex: a failed disk with its alarms silenced (R-934); CI jobs still get lost (R-887); something sets the shared
@@ -96,6 +96,7 @@
| <a id="a20"></a>[A20](capability-map-detail/A.md#a20) | Customer RESET (middle lifecycle tier: host delete < RESET < customer Delete): one operator action → pre-first-install; all operational state destroyed, identity + basic config survive | hub v0.61.0, felhom-tenantsync v1.1.0 | **PROVEN-LIVE** | two real firings | `tests/VALIDATION-n100-rehearsal-2026-07-18.md` (2026-07-18) |
| <a id="a21"></a>[A21](capability-map-detail/A.md#a21) | Customer DELETE cascade (top lifecycle tier): one guided operator action → `hosts → RESET → residue → purge`; host rows deleted (custody DEMOTED), full external teardown (Hetzner repo destroyed, PBS namespace/token revoked, tunnel + zone removed), then the customer record and ALL escrow ciphertext purged | hub v0.69.0 | **IMPLEMENTED** | written UNIT-PROVEN: live leg pending | hub unit tests `hub/internal/web/customer_delete_test.go` (outside `documentation/`) |
| <a id="a22"></a>[A22](capability-map-detail/A.md#a22) | Uninstall: KEPT-vs-WIPED statement, secret purge, enrolled-drive handling | installer | **PARTIAL** | GL6-F2 open | `pilot/DRILL-GL6-2026-07-08.md` (2026-07-08); R-9 |
| <a id="a23"></a>[A23](capability-map-detail/A.md#a23) | Felhom in a virtual machine on OpenMediaVault 8 (KVM plugin): the whole NVMe passed to the VM, installed from the public ISO, bound, claimed, apps, backup, and back by itself after an OMV restart | ISO 1.29.0, agent 0.156.1, controller 0.314.0, OMV 8.5.11-1 + openmediavault-kvm 8.3.4 | **PARTIAL** | live on an exact OMV copy (VM on demo-hp), not yet on the pilot's real hardware; one-disk Jellyfin not proven (R-1068); NAS films not usable by Jellyfin (R-1071); no SMART inside the VM (R-1073) | `audits/omv-vm-2026-10-15/README.md` (2026-10-15); guide `pilot/GUIDE-omv-kvm-hu.md` |
## B. Apps & catalog
@@ -412,3 +412,29 @@ likewise silent. Evidence: `audits/DRILL-r361-2026-08-22/evidence/06-part3-decis
**Gap / roadmap (as written):** Secret purge (GL6-F1 `.bak` residue) fixed v1.12.0; enrolled-drive `mnt-*.mount` units survive (GL6-F2, open); cluster-aware `felhom_guests` guard + saferemove cost warning missing → R-9
---
<a id="a23"></a>
## A23 — Felhom in a virtual machine on OpenMediaVault 8 (KVM plugin)
*Map row: [A23](../00-capability-map.md#a23) · added 2026-10-15.*
**Scenario:** a household that already runs OMV 8 keeps it and gives Felhom a VM made with the `openmediavault-kvm`
plugin, with one whole NVMe passed to the VM. Done through the OMV web pages on an exact copy of the pilot tester's box.
**Components:** public ISO 1.29.0, agent 0.156.1, controller 0.313.0 → 0.314.0 (auto-floor), OMV 8.5.11-1 with kernel
7.2.6, openmediavault-kvm 8.3.4.
**Status:** **PARTIAL** (2026-10-15).
**Proven live on the copy:** plugin install; ISO download with sha256 inside the plugin; the bridge (with an IP change);
the plugin's default BIOS firmware boots the ISO; whole-NVMe install; self-bind; auto-floor; claim; Vaultwarden;
local whole-guest backup; a clean guest shutdown and AutoStart over an OMV restart (dashboard back in 1 min 52 s);
Jellyfin after a second disk attached on bus `sata`. Guest memory 7,863 MiB of a 12 GiB VM.
**Gaps:** not on real hardware yet; one-disk Jellyfin (R-1068); virtio-bus second disk not formattable (R-1069); the
tunnel-less OS-update alarm (R-1070); NAS films for Jellyfin (R-1071); no SMART in a VM (R-1073); UEFI and the
plugin's noVNC console page not exercised.
**Evidence:** `audits/omv-vm-2026-10-15/README.md`; the guide `pilot/GUIDE-omv-kvm-hu.md`.
---
@@ -0,0 +1,7 @@
2026-10-15T14:48:35Z
before:
Mem: 29994 14358 5781 211 10505 15635
1
stopped-341
status: stopped
Mem: 29994 6554 13463 211 10626 23440
@@ -0,0 +1,20 @@
args: -drive file=/mnt/hdd_1/images/9310/vm-9310-disk-2.raw,if=none,id=fakenvme,format=raw,cache=none -device nvme,drive=fakenvme,serial=S64DNF0R980500
balloon: 0
bios: ovmf
boot: order=scsi0
cores: 4
cpu: host
efidisk0: nvme-scratch:9310/vm-9310-disk-0.raw,efitype=4m,pre-enrolled-keys=0,size=528K
ide2: none,media=cdrom
machine: q35
memory: 16384
meta: creation-qemu=11.0.3,ctime=1792075878
name: omv-sim
net0: virtio=BC:24:11:69:24:25,bridge=vmbr0
ostype: l26
scsi0: nvme-scratch:9310/vm-9310-disk-1.raw,serial=OMVSYS128SSD,size=32G
scsi1: nvme-scratch:9310/vm-9310-disk-3.raw,serial=TOSHIBAMQ01ABF050,size=20G
scsihw: virtio-scsi-single
smbios1: uuid=3a6fa3ec-75bf-4ae8-b493-f4abefc97c78
vga: std
vmgenid: d600eb5c-9218-47d1-ba87-a6682f8e87e1
@@ -0,0 +1,33 @@
Formatting '/mnt/hdd_1/images/9310/vm-9310-disk-0.raw', fmt=raw size=540672 preallocation=off
transferred 0.0 B of 528.0 KiB (0.00%)
transferred 528.0 KiB of 528.0 KiB (100.00%)
transferred 528.0 KiB of 528.0 KiB (100.00%)
efidisk0: successfully created disk 'nvme-scratch:9310/vm-9310-disk-0.raw,efitype=4m,pre-enrolled-keys=0,size=528K'
Formatting '/mnt/hdd_1/images/9310/vm-9310-disk-1.raw', fmt=raw size=34359738368 preallocation=off
scsi0: successfully created disk 'nvme-scratch:9310/vm-9310-disk-1.raw,serial=OMVSYS128SSD,size=32G'
Formatting '/mnt/hdd_1/images/9310/vm-9310-disk-2.raw', fmt=raw size=214748364800 preallocation=off
successfully created 'nvme-scratch:9310/vm-9310-disk-2.raw'
update VM 9310: -args -drive file=/mnt/hdd_1/images/9310/vm-9310-disk-2.raw,if=none,id=fakenvme,format=raw,cache=none -device nvme,drive=fakenvme,serial=S64DNF0R980500
args: -drive file=/mnt/hdd_1/images/9310/vm-9310-disk-2.raw,if=none,id=fakenvme,format=raw,cache=none -device nvme,drive=fakenvme,serial=S64DNF0R980500
balloon: 0
bios: ovmf
boot: order=scsi0;net0
cores: 4
cpu: host
efidisk0: nvme-scratch:9310/vm-9310-disk-0.raw,efitype=4m,pre-enrolled-keys=0,size=528K
machine: q35
memory: 16384
meta: creation-qemu=11.0.3,ctime=1792075878
name: omv-sim
net0: virtio=BC:24:11:69:24:25,bridge=vmbr0
ostype: l26
scsi0: nvme-scratch:9310/vm-9310-disk-1.raw,serial=OMVSYS128SSD,size=32G
scsihw: virtio-scsi-single
smbios1: uuid=3a6fa3ec-75bf-4ae8-b493-f4abefc97c78
vga: std
vmgenid: d600eb5c-9218-47d1-ba87-a6682f8e87e1
540K /mnt/hdd_1/images/9310
total 536
528 -rw-r----- 1 root root 540672 Oct 15 16:51 vm-9310-disk-0.raw
4 -rw-r----- 1 root root 34359738368 Oct 15 16:51 vm-9310-disk-1.raw
4 -rw-r----- 1 root root 214748364800 Oct 15 16:51 vm-9310-disk-2.raw
@@ -0,0 +1,45 @@
# Part A — omv-sim, read 2026-10-15T15:10:22Z
--- os
13.7
7.2.6+deb13-amd64
ii openmediavault 8.5.11-1 all openmediavault - The open network attached storage solution
ii openmediavault-omvextrasorg 8.0.3 all OMV-Extras.org Package Repositories for OpenMediaVault
--- cpu/mem
4
model name : AMD Ryzen Embedded V1756B with Radeon Vega Gfx
4
Mem: 15926 556 14125 10 1533 15369
--- disks
NAME SIZE MODEL SERIAL FSTYPE MOUNTPOINTS
sda 32G QEMU HARDDISK OMVSYS128SSD
├─sda1 976M vfat /boot/efi
├─sda2 29.4G ext4 /
└─sda3 1.7G swap [SWAP]
sdb 20G QEMU HARDDISK TOSHIBAMQ01ABF050
sr0 1024M QEMU DVD-ROM QM00003
nvme0n1 200G QEMU NVMe Ctrl S64DNF0R980500
└─nvme0n1p1 200G ext4 /srv/dev-disk-by-uuid-faf49e6e-b4fa-49cd-9849-69d549949d1f
--- films
total 921608
drwxrwsrwx 2 root users 4096 Oct 15 17:10 .
drwxr-xr-x 4 root root 4096 Oct 15 17:08 ..
-rw-rw-rw- 1 root users 314572800 Oct 15 17:10 Csalad_nyaralas_2019.mkv
-rw-rw-rw- 1 root users 314572800 Oct 15 17:10 Kedvenc_film.mkv
-rw-rw-rw- 1 root users 314572800 Oct 15 17:10 Nagyi_szulinap.mkv
--- network
lo UNKNOWN 127.0.0.1/8 ::1/128
ens18 UP 192.168.0.119/24 metric 100
network:
version: 2
renderer: networkd
network:
ethernets:
ens18:
match:
macaddress: "bc:24:11:69:24:25"
dhcp4: yes
dhcp4-overrides:
use-dns: true
use-domains: true
dhcp6: no
link-local: [ipv4]
@@ -0,0 +1,5 @@
done: SHA256:cbVrVDbsRvCMwwhMxuOa06NKQK/Nmm1LxACPbbCSkY0 root@omv-browser
Creating SSH host key 'ssh_host_ed25519_key' - this may take some time ...
done: SHA256:+yA1hWWI7N4alcnlx93fMu9Th6VwhMU2qA24MJqilZQ root@omv-browser
lo UNKNOWN 127.0.0.1/8
eth0@if23 UP 192.168.0.122/24
@@ -0,0 +1,15 @@
# B1 — the network bridge, done in the OMV web page (Hálózat → Interfészek), 2026-10-15 (UTC)
15:27:42 before: ens18 DHCP 192.168.0.119 (MAC bc:24:11:69:24:25), in OMV's own list -> B1-network-before.txt
15:28 Létrehozás → Híd: the „Interfészek" list was EMPTY while ens18 had its own setting (OMV offers only unused cards)
15:29 ens18 deleted (Törlés, not applied) → the list then offered „ens18 [bc:24:11:69:24:25]"
15:29 br0 saved: member ens18, IPv4 DHCP, MAC cím empty (the default)
15:30:22 Alkalmaz pressed (with the Megerősítés tick)
15:30:49 http://192.168.0.119 stopped answering (27 s later); the browser stayed on „Kérjük várjon a konfigurációs változások érvénybe lépéséig..." for good
15:31-33 br0 got MAC 42:6a:75:de:79:02 (generated) and a NEW address 192.168.0.121 -> B1-network-after-bridge-nomac.txt
the console banner still said „ens18: 192.168.0.119" (stale) -> screens/omv-30-after-bridge.png, omv-31-real-ip.png
15:33:59 fix attempt: br0 edited, „MAC cím" = the card's MAC bc:24:11:69:24:25, Alkalmaz at 15:34:19
15:34:25 .121 stopped answering; br0 then had the card's MAC but a THIRD address 192.168.0.123 (not .119)
reason: systemd-networkd asks DHCP with its own client ID (DUID), not only the MAC, so the router sees a new client
the console banner said „br0: 192.168.0.121" (stale again) -> screens/omv-32-after-mac.png
15:46 http://omv-sim.local resolved to 192.168.0.123 (OMV's avahi answers mDNS) — the working way to find OMV again
RESULT: the bridge works; OMV's address CHANGES; the old browser tab hangs; the screen text is stale; <name>.local or the router's list finds it.
@@ -0,0 +1,2 @@
15:29:08 119 web=up
15:30:49 119 web=DOWN
@@ -0,0 +1,2 @@
15:33:37 119=000 121=200
15:34:25 119=000 121=000
@@ -0,0 +1,31 @@
Warning: Permanently added '192.168.0.121' (ED25519) to the list of known hosts.
--- after bridge (no MAC set) 15:33:48
lo UNKNOWN 127.0.0.1/8 ::1/128
ens18 UP
lxcbr0 DOWN 10.0.3.1/24 fc42:5009:ba4b:5ab0::1/64
br0 UP 192.168.0.121/24 metric 100
lo UNKNOWN 00:00:00:00:00:00 <LOOPBACK,UP,LOWER_UP>
ens18 UP bc:24:11:69:24:25 <BROADCAST,MULTICAST,UP,LOWER_UP>
lxcbr0 DOWN 10:66:6a:00:00:00 <NO-CARRIER,BROADCAST,MULTICAST,UP>
br0 UP 42:6a:75:de:79:02 <BROADCAST,MULTICAST,UP,LOWER_UP>
== /etc/netplan/10-openmediavault-default.yaml
network:
version: 2
renderer: networkd
== /etc/netplan/60-openmediavault-br0.yaml
network:
ethernets:
ens18:
addresses: []
dhcp4: false
dhcp6: false
bridges:
br0:
dhcp4: yes
dhcp4-overrides:
use-dns: true
use-domains: true
dhcp6: no
link-local: []
interfaces:
- ens18
@@ -0,0 +1,33 @@
2026-10-15T15:27:42Z
lo UNKNOWN 127.0.0.1/8 ::1/128
ens18 UP 192.168.0.119/24 metric 100
lxcbr0 DOWN 10.0.3.1/24 fc42:5009:ba4b:5ab0::1/64
lo UNKNOWN 00:00:00:00:00:00 <LOOPBACK,UP,LOWER_UP>
ens18 UP bc:24:11:69:24:25 <BROADCAST,MULTICAST,UP,LOWER_UP>
lxcbr0 DOWN 10:66:6a:00:00:00 <NO-CARRIER,BROADCAST,MULTICAST,UP>
default via 192.168.0.1 dev ens18 proto dhcp src 192.168.0.119 metric 100
10.0.3.0/24 dev lxcbr0 proto kernel scope link src 10.0.3.1 linkdown
192.168.0.0/24 dev ens18 proto kernel scope link src 192.168.0.119 metric 100
192.168.0.1 dev ens18 proto dhcp scope link src 192.168.0.119 metric 100
192.168.0.250 dev ens18 proto dhcp scope link src 192.168.0.119 metric 100
10-openmediavault-default.yaml
20-openmediavault-ens18.yaml
== /etc/netplan/10-openmediavault-default.yaml
network:
version: 2
renderer: networkd
== /etc/netplan/20-openmediavault-ens18.yaml
network:
ethernets:
ens18:
match:
macaddress: "bc:24:11:69:24:25"
dhcp4: yes
dhcp4-overrides:
use-dns: true
use-domains: true
dhcp6: no
link-local: [ipv4]
[{"uuid":"06183855-37d0-422d-ae0a-2b6b0020937f","type":"ethernet","devicename":"ens18","method":"dhcp","address":"","netmask":"","gateway":"","routemetric":0,"method6":"manual","address6":"","netmask6":64,"gateway6":"","routemetric6":1,"dnsnameservers":"","dnssearch":"","mtu":0,"wol":false,"comment":"","altmacaddress":"","slaves":[],"bondprimary":"","bondmode":1,"bondmiimon":0,"bonddowndelay":0,"bondupdelay":0,"bondtransmithashpolicy":"layer2","vlanid":1,"vlanrawdevice":"","band":"auto","wpassid":"","wpapsk":"","keymanagement":"psk","hidden":false,"_used":false,"_readonly":false}]
{"total":1,"data":[{"uuid":"06183855-37d0-422d-ae0a-2b6b0020937f","type":"ethernet","devicename":"ens18","method":"dhcp","address":"","netmask":"","gateway":"","routemetric":0,"method6":"manual","address6":"","netmask6":64,"gateway6":"","routemetric6":1,"dnsnameservers":"","dnssearch":"","mtu":0,"wol":false,"comment":"","altmacaddress":"","slaves":[],"bondprimary":"","bondmode":1,"bondmiimon":0,"bonddowndelay":0,"bondupdelay":0,"bondtransmithashpolicy":"layer2","vlanid":1,"vlanrawdevice":"","band":"auto","wpassid":"","wpapsk":"","keymanagement":"psk","hidden":false,"_used":false,"_readonly":false}]}
@@ -0,0 +1,249 @@
<domain type='kvm' id='2'>
<name>felhom</name>
<uuid>c0da5af7-2366-4cd5-b0d0-7340cf18984e</uuid>
<metadata>
<libosinfo:libosinfo xmlns:libosinfo="http://libosinfo.org/xmlns/libvirt/domain/1.0">
<libosinfo:os id="http://debian.org/debian/13"/>
</libosinfo:libosinfo>
</metadata>
<memory unit='KiB'>12582912</memory>
<currentMemory unit='KiB'>12582912</currentMemory>
<vcpu placement='static'>4</vcpu>
<resource>
<partition>/machine</partition>
</resource>
<os>
<type arch='x86_64' machine='pc-q35-11.0'>hvm</type>
<boot dev='hd'/>
<boot dev='cdrom'/>
</os>
<features>
<acpi/>
<apic/>
<vmport state='off'/>
</features>
<cpu mode='host-passthrough' check='none' migratable='off'/>
<clock offset='utc'>
<timer name='rtc' tickpolicy='catchup'/>
<timer name='pit' tickpolicy='delay'/>
<timer name='hpet' present='no'/>
</clock>
<on_poweroff>destroy</on_poweroff>
<on_reboot>restart</on_reboot>
<on_crash>destroy</on_crash>
<pm>
<suspend-to-mem enabled='no'/>
<suspend-to-disk enabled='no'/>
</pm>
<devices>
<emulator>/usr/bin/qemu-system-x86_64</emulator>
<disk type='block' device='disk'>
<driver name='qemu' type='raw' cache='none' io='native' discard='unmap'/>
<source dev='/dev/disk/by-id/nvme-nvme.1b36-533634444e463052393830353030-51454d55204e564d65204374726c-00000001' index='2'/>
<backingStore/>
<target dev='vdb' bus='virtio'/>
<alias name='virtio-disk1'/>
<address type='pci' domain='0x0000' bus='0x06' slot='0x00' function='0x0'/>
</disk>
<disk type='file' device='cdrom'>
<driver name='qemu' type='raw'/>
<source file='/srv/felhom-iso/felhom-installer-1.29.0-pve9.2-1.iso' index='1'/>
<backingStore/>
<target dev='sda' bus='sata'/>
<readonly/>
<alias name='sata0-0-0'/>
<address type='drive' controller='0' bus='0' target='0' unit='0'/>
</disk>
<controller type='usb' index='0' model='qemu-xhci' ports='15'>
<alias name='usb'/>
<address type='pci' domain='0x0000' bus='0x02' slot='0x00' function='0x0'/>
</controller>
<controller type='pci' index='0' model='pcie-root'>
<alias name='pcie.0'/>
</controller>
<controller type='pci' index='1' model='pcie-root-port'>
<model name='pcie-root-port'/>
<target chassis='1' port='0x10'/>
<alias name='pci.1'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0' multifunction='on'/>
</controller>
<controller type='pci' index='2' model='pcie-root-port'>
<model name='pcie-root-port'/>
<target chassis='2' port='0x11'/>
<alias name='pci.2'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x1'/>
</controller>
<controller type='pci' index='3' model='pcie-root-port'>
<model name='pcie-root-port'/>
<target chassis='3' port='0x12'/>
<alias name='pci.3'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x2'/>
</controller>
<controller type='pci' index='4' model='pcie-root-port'>
<model name='pcie-root-port'/>
<target chassis='4' port='0x13'/>
<alias name='pci.4'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x3'/>
</controller>
<controller type='pci' index='5' model='pcie-root-port'>
<model name='pcie-root-port'/>
<target chassis='5' port='0x14'/>
<alias name='pci.5'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x4'/>
</controller>
<controller type='pci' index='6' model='pcie-root-port'>
<model name='pcie-root-port'/>
<target chassis='6' port='0x15'/>
<alias name='pci.6'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x5'/>
</controller>
<controller type='pci' index='7' model='pcie-root-port'>
<model name='pcie-root-port'/>
<target chassis='7' port='0x16'/>
<alias name='pci.7'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x6'/>
</controller>
<controller type='pci' index='8' model='pcie-root-port'>
<model name='pcie-root-port'/>
<target chassis='8' port='0x17'/>
<alias name='pci.8'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x7'/>
</controller>
<controller type='pci' index='9' model='pcie-root-port'>
<model name='pcie-root-port'/>
<target chassis='9' port='0x18'/>
<alias name='pci.9'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0' multifunction='on'/>
</controller>
<controller type='pci' index='10' model='pcie-root-port'>
<model name='pcie-root-port'/>
<target chassis='10' port='0x19'/>
<alias name='pci.10'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x1'/>
</controller>
<controller type='pci' index='11' model='pcie-root-port'>
<model name='pcie-root-port'/>
<target chassis='11' port='0x1a'/>
<alias name='pci.11'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x2'/>
</controller>
<controller type='pci' index='12' model='pcie-root-port'>
<model name='pcie-root-port'/>
<target chassis='12' port='0x1b'/>
<alias name='pci.12'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x3'/>
</controller>
<controller type='pci' index='13' model='pcie-root-port'>
<model name='pcie-root-port'/>
<target chassis='13' port='0x1c'/>
<alias name='pci.13'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x4'/>
</controller>
<controller type='pci' index='14' model='pcie-root-port'>
<model name='pcie-root-port'/>
<target chassis='14' port='0x1d'/>
<alias name='pci.14'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x5'/>
</controller>
<controller type='sata' index='0'>
<alias name='ide'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x1f' function='0x2'/>
</controller>
<controller type='virtio-serial' index='0'>
<alias name='virtio-serial0'/>
<address type='pci' domain='0x0000' bus='0x03' slot='0x00' function='0x0'/>
</controller>
<interface type='bridge'>
<mac address='52:54:00:3e:aa:ea'/>
<source bridge='br0'/>
<target dev='vnet1'/>
<model type='virtio'/>
<alias name='net0'/>
<address type='pci' domain='0x0000' bus='0x01' slot='0x00' function='0x0'/>
</interface>
<serial type='pty'>
<source path='/dev/pts/0'/>
<target type='isa-serial' port='0'>
<model name='isa-serial'/>
</target>
<alias name='serial0'/>
</serial>
<console type='pty' tty='/dev/pts/0'>
<source path='/dev/pts/0'/>
<target type='serial' port='0'/>
<alias name='serial0'/>
</console>
<channel type='unix'>
<source mode='bind' path='/run/libvirt/qemu/channel/2-felhom/org.qemu.guest_agent.0'/>
<target type='virtio' name='org.qemu.guest_agent.0' state='disconnected'/>
<alias name='channel0'/>
<address type='virtio-serial' controller='0' bus='0' port='1'/>
</channel>
<channel type='spicevmc'>
<target type='virtio' name='com.redhat.spice.0' state='connected'/>
<alias name='channel1'/>
<address type='virtio-serial' controller='0' bus='0' port='2'/>
</channel>
<input type='tablet' bus='usb'>
<alias name='input0'/>
<address type='usb' bus='0' port='1'/>
</input>
<input type='mouse' bus='ps2'>
<alias name='input1'/>
</input>
<input type='keyboard' bus='ps2'>
<alias name='input2'/>
</input>
<graphics type='vnc' port='5900' autoport='yes' listen='0.0.0.0'>
<listen type='address' address='0.0.0.0'/>
</graphics>
<graphics type='spice' port='5901' autoport='yes' listen='0.0.0.0'>
<listen type='address' address='0.0.0.0'/>
<image compression='off'/>
</graphics>
<audio id='1' type='spice'/>
<video>
<model type='virtio' heads='1' primary='yes'/>
<alias name='video0'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x0'/>
</video>
<redirdev bus='usb' type='spicevmc'>
<alias name='redir0'/>
<address type='usb' bus='0' port='2'/>
</redirdev>
<redirdev bus='usb' type='spicevmc'>
<alias name='redir1'/>
<address type='usb' bus='0' port='3'/>
</redirdev>
<watchdog model='itco' action='reset'>
<alias name='watchdog0'/>
</watchdog>
<memballoon model='none'/>
<rng model='virtio'>
<backend model='random'>/dev/urandom</backend>
<alias name='rng0'/>
<address type='pci' domain='0x0000' bus='0x05' slot='0x00' function='0x0'/>
</rng>
</devices>
<seclabel type='dynamic' model='dac' relabel='yes'>
<label>+64055:+64055</label>
<imagelabel>+64055:+64055</imagelabel>
</seclabel>
</domain>
Id: 2
Name: felhom
UUID: c0da5af7-2366-4cd5-b0d0-7340cf18984e
OS Type: hvm
State: running
CPU(s): 4
CPU time: 117.8s
Max memory: 12582912 KiB
Used memory: 12582912 KiB
Persistent: yes
Autostart: enable
Autostart Once: disable
Managed save: no
Security model: none
Security DOI: 0
@@ -0,0 +1 @@
Felhom — Doboz összekötése :root { --navy:#0A2540; --ink:#0A2540; --muted:#5b6b7d; --line:#d8e0e8; --brand:#0083D8; --exc:#c0392b; --bg:#f4f7fa; } * { box-sizing: border-box; } body { margin:0; font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,sans-serif; background:var(--bg); color:var(--ink); line-height:1.5; } .wrap { max-width:460px; margin:3rem auto; padding:0 1rem; } .card { background:#fff; border:1px solid var(--line); border-radius:2px; padding:1.75rem; } h1 { font-size:1.25rem; margin:0 0 .25rem; color:var(--navy); } h1 span { color:var(--brand); } .lead { color:var(--muted); font-size:.92rem; margin:.25rem 0 1.25rem; } label { display:block; font-weight:600; font-size:.9rem; margin:1rem 0 .35rem; } .hint { color:var(--muted); font-size:.8rem; margin:.15rem 0 0; } input[type=text] { width:100%; padding:.6rem .7rem; border:1px solid var(--line); border-radius:2px; font-size:1rem; } input.code { text-transform:uppercase; letter-spacing:.12em; font-family:ui-monospace,SFMono-Regular,Menlo,monospace; } button { margin-top:1.5rem; width:100%; padding:.7rem; background:var(--brand); color:#fff; border:none; border-radius:2px; font-size:1rem; cursor:pointer; } button:hover { background:#006cb0; } .banner { border:1px solid var(--exc); color:var(--exc); background:#fbeae8; border-radius:2px; padding:.6rem .75rem; font-size:.88rem; margin:0 0 1rem; } .note { border-top:1px solid var(--line); margin-top:1.5rem; padding-top:1rem; color:var(--muted); font-size:.82rem; } .foot { text-align:center; color:var(--muted); font-size:.75rem; margin-top:1.25rem; } .ok { color:#1e7e34; } Felhom doboz összekötése Sikeres összekötés. A doboz kb. egy percen belül folytatja a telepítést. Ezt az oldalt bezárhatod — a beállítás a háttérben befejeződik, és a vezérlőpultod hamarosan elérhető lesz. Felhom.eu
@@ -0,0 +1,4 @@
HTTP/2 302
date: Thu, 15 Oct 2026 16:24:25 GMT
location: /
location: /
@@ -0,0 +1,4 @@
install pressed 16:06:52
pairing screen seen 16:11:07
bind posted 16:11:08
claim posted 16:24:25
@@ -0,0 +1,183 @@
===== /backups (16:33:03)
Biztonsági mentés — Felhom.eu
if(!el||el.dataset.fcOpen)return;
el.dataset.fcOpen='1';
wrap.appendChild(q);wrap.appendChild(yes);wrap.appendChild(no);
el.style.display='none';el.parentNode.insertBefore(wrap,el.nextSibling);
no.addEventListener('click',close);
if(!btn)return;
e.preventDefault();
if(!btn)return;
if(!group)return;
g.classList.remove('is-open');
if(t)t.setAttribute('aria-expanded','false');
Indítópult
Vezérlőpult
Alkalmazások
Tárhely
Meghajtók
Hálózati tárhely
Biztonsági mentés
Áttekintés
Távoli mentés
Alkalmazások
Visszaállítás
Megosztás
Hálózati megosztás
Rendszermonitor
Hibakeresés
Beállítások
Rendszer
Értesítések
Biztonság és hozzáférés
0.314.0
Magyar
English
Kijelentkezés ↗
Biztonsági mentés
tester4.test
Csak egy másolat készül (nincs második meghajtó) — a 3-2-1 mentéshez csatlakoztasson egy második meghajtót vagy offsite tárolót.
A rendszermentés jelenleg ugyanazon a lemezen van, mint a rendszer — így hibás fájlok ellen véd, lemezhiba ellen nem. Csatlakoztass egy második meghajtót a teljes védelemhez.
Tárhely áttekintés
Rendszer
1,19 GB / 68,7 GB (2%)
DB mentések
–
Rendszermentés (teljes mentés)
A teljes szerver — alkalmazások, beállítások és adatbázisok együtt — időszakos mentése, amelyből az egész készülék visszaállítható. Ezt a host-ügynök készíti és kezeli.
&#10003;
Utolsó teljes mentés
2026. 10. 15. 18:19 (13 perce)
645,2 MB
Helyi tároló (local)
Naprakész
Következő mentés
az előző 0 órája készült — a mentési időn belül
–
Visszaállítás ellenőrizve
Még nem futott
Helyi tároló (local)
&#10003; Utolsó sikeres mentés: 2026. 10. 15. 18:19 (13 perce) · 645,2 MB
Naprakész
===== /backups/apps (16:33:03)
Biztonsági mentés — Alkalmazások — Felhom.eu
if(!el||el.dataset.fcOpen)return;
el.dataset.fcOpen='1';
wrap.appendChild(q);wrap.appendChild(yes);wrap.appendChild(no);
el.style.display='none';el.parentNode.insertBefore(wrap,el.nextSibling);
no.addEventListener('click',close);
if(!btn)return;
e.preventDefault();
if(!btn)return;
if(!group)return;
g.classList.remove('is-open');
if(t)t.setAttribute('aria-expanded','false');
Indítópult
Vezérlőpult
Alkalmazások
Tárhely
Meghajtók
Hálózati tárhely
Biztonsági mentés
Áttekintés
Távoli mentés
Alkalmazások
Visszaállítás
Megosztás
Hálózati megosztás
Rendszermonitor
Hibakeresés
Beállítások
Rendszer
Értesítések
Biztonság és hozzáférés
0.314.0
Magyar
English
Kijelentkezés ↗
Biztonsági mentés — Alkalmazások
tester4.test
Alkalmazás-mentések (adatbázis + konfiguráció)
Az egyes alkalmazások részletes, granulált mentése — adatbázis-kiírások, beállítások és alkalmazás-fájlok. A fenti teljes mentéstől függetlenül, alkalmazásonként visszaállítható.
Ütemezés
Adatbázis mentés
02:30
Következő: holnap 02:30
Utolsó adatbázis mentés:
2026. 10. 15. 18:31 (1 perce)
<button class="btn btn-sm btn-primary" onclick="triggerBackupFromPage()" id="backup-page-btn"
>
Mentés most
Adatbázisok
A telepített alkalmazások beágyazott adatbázist használnak (pl. SQLite) — adatbázisuk a fájl- és kötetmentés része, külön adatbázis-kiírás nem szükséges.
Alkalmazások mentési állapota
<img class="app-row-icon" src="/static/assets/vaultwarden-logo.svg" alt="" data-fallback="/static/app-placeholder.svg"
Vaultwarden
Konfig + Adatok
▶
1. mentés
Auto
helyi
Utolsó: 1 perce
—
===== /backups/remote (16:33:03)
Biztonsági mentés — Távoli mentés — Felhom.eu
if(!el||el.dataset.fcOpen)return;
el.dataset.fcOpen='1';
wrap.appendChild(q);wrap.appendChild(yes);wrap.appendChild(no);
el.style.display='none';el.parentNode.insertBefore(wrap,el.nextSibling);
no.addEventListener('click',close);
if(!btn)return;
e.preventDefault();
if(!btn)return;
if(!group)return;
g.classList.remove('is-open');
if(t)t.setAttribute('aria-expanded','false');
Indítópult
Vezérlőpult
Alkalmazások
Tárhely
Meghajtók
Hálózati tárhely
Biztonsági mentés
Áttekintés
Távoli mentés
Alkalmazások
Visszaállítás
Megosztás
Hálózati megosztás
Rendszermonitor
Hibakeresés
Beállítások
Rendszer
Értesítések
Biztonság és hozzáférés
0.314.0
Magyar
English
Kijelentkezés ↗
Biztonsági mentés — Távoli mentés
tester4.test
Felhom offsite tárhely — igényelhető szolgáltatás. Titkosított, házon kívüli másolat a mentéseidről. Érdeklődj az üzemeltetőnél.
Távoli mentés (3. mentés) — titkosított, offsite
Az alkalmazás-mentések titkosított másolata egy távoli tárolóra — saját NAS vagy Felhom offsite tárhely — restic + SFTP kapcsolaton. A tároló csak titkosított adatot lát. Ez a 3-2-1 szabály „1 off-site" lába — független a helyi másodpéldánytól és a teljes rendszermentéstől.
Még nincs beállítva távoli mentési cél.
Távoli mentési cél beállítása
Cél címe (IP vagy hosztnév — NAS vagy SFTP-kiszolgáló)
SSH port
Felhasználó
Tároló útvonala a célgépen
Napi automatikus távoli mentés engedélyezve
SSH privát kulcs
A kulcsot 0600-as fájlba írjuk; sosem naplózzuk és nem tároljuk a beállításokban.
A célgép ismert-host sora (known_hosts)
A host-kulcs rögzítése (no blind TOFU). Lekérdezhető: ssh-keyscan -p &lt;port&gt; &lt;host&gt;
Mentés
if(!d) return;
sawRunning = true; quiet = 0;
text.textContent = 'Adatbázisok mentése a pillanatképhez…';
bar.style.width = '100%';
box.className = 'alert alert-info'; box.style.display = '';
return;
text.textContent = 'Karbantartás: régi mentések rendezése a távoli tárolón…';
bar.style.width = '100%';
@@ -0,0 +1,8 @@
--- tiers before 16:31:35
404 page not found
--- run 16:31:36
200
{"ok":true,"message":"Mentés elindítva"}
@@ -0,0 +1,21 @@
jellyfin deploy 16:25:21
400
{"ok":false,"error":"a(z) \"Médiatár útvonal\" (HDD_PATH) mező kitöltése kötelező"}
vaultwarden deploy 16:25:21
202
{"ok":true,"message":"Telepítés elindítva – az állapot a kártyán követhető"}
register-mounted 16:51:11
200
{"data":{"registered":true,"where":"/mnt/felhom-drives/adatlemez"},"ok":true}
jellyfin deploy 2 16:51:12
202
{"ok":true,"message":"Telepítés elindítva – az állapot a kártyán követhető"}
jellyfin deploy 3 17:06:33
202
{"ok":true,"message":"Telepítés elindítva – az állapot a kártyán követhető"}
17:07:03 True running False
@@ -0,0 +1,14 @@
poweroff posted 16:34:57
202
{"data":{"powering_off":true},"ok":true}
VM shut off 16:35:44
poweroff 2 posted 16:40:32
409
{"data":{"code":"too_soon_after_boot"},"error":"A gép most indult el. 10 perc múlva kapcsolhatod ki.","ok":false}
poweroff 3 posted 16:46:43
202
{"data":{"powering_off":true},"ok":true}
VM shut off 16:47:20
@@ -0,0 +1,43 @@
format 16:37:23
500
{"error":"agentapi: format: HTTP 409: format refused: device has no durable id to bind the format to (path-only formats are not permitted)","ok":false}
404 page not found
format (sata) 16:50:07
200
{"data":{"vmid":9201,"device":"/dev/sda","formatted":true,"data_bearing":false,"reason":"blank device formatted ext4","durable_id":"byid:ata-QEMU_HARDDISK_QM00003","fs_uuid":"9a262222-1d94-4e1f-bf90-68f7b9b495d9"},"ok":true}
local local attached system False 62822084608
local-lvm lvmthin attached system False 121269911552
assign 16:50:32
200
{"data":{"uuid":"9a262222-1d94-4e1f-bf90-68f7b9b495d9","where":"/mnt/felhom-drives/adatlemez"},"ok":true}
register-mounted 16:51:11
200
{"data":{"registered":true,"where":"/mnt/felhom-drives/adatlemez"},"ok":true}
jellyfin deploy 2 16:51:12
202
{"ok":true,"message":"Telepítés elindítva – az állapot a kártyán követhető"}
reconnect 17:01:59
200
{"data":{"reenrolled":false,"restarted":null,"where":"/mnt/felhom-drives/adatlemez"},"ok":true}
decommission stale 17:05:48
409
{"error":"ez az egyetlen használható tárhely — a leszerelés megtagadva (előbb adj hozzá vagy állíts be másik alapértelmezett meghajtót)","ok":false}
attach (household page) 17:05:54
500
{"error":"regisztráció sikertelen: storage path \"/mnt/felhom-drives/adatlemez\" already registered","ok":false}
attach as filmlemez 17:06:02
200
{"data":{"registered":true,"where":"/mnt/felhom-drives/filmlemez"},"ok":true}
decommission stale 2 17:06:22
200
{"data":{"decommissioned":true,"stopped_apps":null,"where":"/mnt/felhom-drives/adatlemez"},"ok":true}
@@ -0,0 +1,5 @@
omv reboot pressed 16:48:56
16:48:36 omv=200 felhom=000
16:48:56 omv=000 felhom=000
16:49:17 omv=200 felhom=000
16:49:54 omv=200 felhom=200
@@ -0,0 +1,28 @@
running
enabled
omv reboot 2 pressed 17:03:03 (Felhom VM running)
17:02:44 omv=200 felhom=200
17:03:33 omv=000 felhom=200
17:03:42 omv=000 felhom=000
17:04:11 omv=200 felhom=000
17:04:51 omv=200 felhom=200
Oct 15 19:03:52 omv-sim libvirt-guests.sh[1255]: Waiting for guest felhom to shut down, 280 seconds left
Oct 15 19:03:53 omv-sim libvirt-guests.sh[1473]: error: failed to connect to the hypervisor
Oct 15 19:03:53 omv-sim libvirt-guests.sh[1473]: error: Cannot recv data: Connection reset by peer
Oct 15 19:03:53 omv-sim libvirt-guests.sh[1482]: error: failed to connect to the hypervisor
Oct 15 19:03:53 omv-sim libvirt-guests.sh[1482]: error: Cannot recv data: Connection reset by peer
Oct 15 19:03:53 omv-sim libvirt-guests.sh[1489]: Shutdown of guest felhom complete.
Oct 15 19:03:53 omv-sim systemd[1]: libvirt-guests.service: Deactivated successfully.
Oct 15 19:03:53 omv-sim systemd[1]: Stopped libvirt-guests.service - libvirt guests suspend/resume service.
---
Oct 15 19:04:12 omv-sim systemd[1]: Starting libvirt-guests.service - libvirt guests suspend/resume service...
Oct 15 19:04:12 omv-sim libvirt-guests.sh[690]: libvirt-guests is configured not to start any guests on boot
Oct 15 19:04:12 omv-sim systemd[1]: Finished libvirt-guests.service - libvirt guests suspend/resume service.
total 8
drwxr-xr-x 2 libvirt-qemu libvirt-qemu 4096 Oct 15 17:15 .
drwxr-x--- 9 libvirt-qemu libvirt-qemu 4096 Oct 15 19:04 ..
ON_BOOT="ignore"
ON_SHUTDOWN="shutdown"
if [ "x$ON_BOOT" != xstart ]; then
if [ "x$ON_SHUTDOWN" = xshutdown ]; then
@@ -0,0 +1,42 @@
netstorage add 17:08:17
400
{"error":"SMB-hez felhasználónév és jelszó szükséges","ok":false}
17:10:50 {"data":{"phase":"none"},"ok":true}
netstorage add (user felhom) 17:11:44
200
{"data":{"name":"omv-filmek","started":true},"ok":true}
17:11:49 {"data":{"category":"not_writable","detail":"uid-1000 write probe: create/write refused |","message":"A megosztás csatolható, de az alkalmazások nem tudnak rá írni. NFS esetén kapcsold be a NAS-on a „minden felhasználó leképezése” (map all users / all squash) beállítást a megosztáson — vagy állítsd a fájlok tulajdonosát a(z) 101000 azonosítóra. SMB esetén ellenőrizd, hogy a felhasználónak írási joga van a megosztáson.","name":"omv-filmek","path":"","phase":"failed","started_at":"2026-10-15T17:11:44.425220338Z","updated_at":"2026-10-15T17:11:48.118148128Z","warn":""},"ok":true}
netstorage add (writable) 17:12:25
200
{"data":{"name":"omv-filmek","started":true},"ok":true}
17:12:31 {"data":{"category":"","detail":"","message":"","name":"omv-filmek","path":"/mnt/felhom-drives/omv-filmek","phase":"done","started_at":"2026-10-15T17:12:25.971968221Z","updated_at":"2026-10-15T17:12:28.861974064Z","warn":""},"ok":true}
--- media status 17:12:38
{"data":{"pending":true,"drives":[{"path":"/mnt/felhom-drives/adatlemez","label":"Adatlemez","change":"removed","changed_at":"2026-10-15T16:51:25.776164694Z","restarted":false}],"apps":["jellyfin"],"wiring":[{"app":"folders","state":"done"},{"app":"jellyfin","state":"household","detail":"no Jellyfin API key named „felhom” — one step on the Jellyfin page"}],"wired_at":"2026-10-15T17:07:34Z"},"ok":true}
17:11:44 INFO [web] network storage add started: omv-filmek (smb 192.168.0.123:TesztFilmek)
17:11:44 INFO [web] netstorage add "omv-filmek" started (smb 192.168.0.123:TesztFilmek, mapped_uid=1000)
17:11:48 INFO [web] netstorage add "omv-filmek" rolled back (probe failed)
17:11:48 WARN [web] netstorage add "omv-filmek" failed: category=not_writable detail=uid-1000 write probe: create/write refused | (3692ms)
17:12:25 INFO [web] network storage add started: omv-filmek (smb 192.168.0.123:TesztFilmek)
17:12:25 INFO [web] netstorage add "omv-filmek" started (smb 192.168.0.123:TesztFilmek, mapped_uid=1000)
17:12:28 INFO [settings] Added storage path: /mnt/felhom-drives/omv-filmek
17:12:28 INFO [web] network storage added + verified: omv-filmek (smb 192.168.0.123:TesztFilmek) → /mnt/felhom-drives/omv-filmek (warn="") in 2889ms
--- restart media apps (household button) 17:12:46
400
{"error":"érvénytelen csatlakoztatási pont","ok":false}
--- media restart (household button) 17:13:44
200
{"data":{"failed":null},"ok":true}
17:13:44 INFO [stacks] Restarting stack: jellyfin
17:13:44 INFO [stacks] media_library jellyfin: per-drive binds 1 [/mnt/felhom-drives/filmlemez/userdata/media]; drives not bound: []
17:13:45 INFO [stacks] Stack jellyfin: started again: jellyfin 2026-10-15T17:06:33.946301809Z → 2026-10-15T17:13:45.154456154Z
17:13:45 INFO [stacks] Stack jellyfin restarted successfully (took 1.2s)
17:13:46 INFO [media] media apps restarted (the household's „restart now"); failed: []
17:13:48 INFO [stacks] Stack jellyfin post-start status:
17:13:48 INFO [stacks] jellyfin jellyfin/jellyfin:10.11.11 running Up 3 seconds (health: starting)
@@ -0,0 +1,34 @@
2026-10-15 14:36:04 | selfbind_link_sent | info | hub | Self-bind link e-mailed (customer creation)
2026-10-15 16:11:08 | appliance_bound | info | customer_selfbind | Az ügyfél saját maga kötötte össze az új eszközt (bare-metal telepítés); a hozzáférést a doboz a következő lekérdezéskor megkapja.
2026-10-15 16:11:31 | appliance_credential_delivered | info | hub | Új eszköz (bare-metal telepítés) megkapta a hozzáférést és megkezdi a beállítást.
2026-10-15 16:14:12 | controller_started | info | controller | Controller elindult (0.313.0)
2026-10-15 16:14:21 | controller_updated | info | controller | Controller frissítve: 0.313.0 → 0.314.0
2026-10-15 16:14:26 | controller_started | info | controller | Controller elindult (0.314.0)
2026-10-15 16:19:22 | backup_tier_skipped | warning | controller | Whole-guest backup tier felhom-pbs skipped: its storage does not exist on the host (never provisioned or removed). No app was stopped for it.
2026-10-15 16:23:00 | os_update_applied | info | hub | System security fixes installed on the box (51 package(s)).
2026-10-15 16:25:21 | app_deploy_started | info | controller | Alkalmazás telepítése elindult: Vaultwarden
2026-10-15 16:25:29 | app_deployed | info | controller | Alkalmazás telepítve: Vaultwarden
2026-10-15 16:30:03 | os_update_applied | info | hub | System security fixes installed on the box's base system (106 package(s)).
2026-10-15 16:30:03 | os_update_health_failed | error | hub | OS update (host) on Tester4-68d1d8: NOT healthy after 106 package(s) were installed (the tunnel is unknown). Nothing was undone automatically; put a host packag
2026-10-15 16:35:00 | host_deliberate_off | info | hub | Switched off by the household at 2026-10-15 16:34 UTC — silence alarms held for 14 days
2026-10-15 16:36:45 | host_deliberate_off_ended | info | hub | Reporting again after the household's power-off of 2026-10-15 16:34 UTC
2026-10-15 16:37:02 | controller_started | info | controller | Controller elindult (0.314.0)
2026-10-15 16:41:57 | backup_tier_skipped | warning | controller | Whole-guest backup tier felhom-pbs skipped: its storage does not exist on the host (never provisioned or removed). No app was stopped for it.
2026-10-15 16:46:50 | host_deliberate_off | info | hub | Switched off by the household at 2026-10-15 16:46 UTC — silence alarms held for 14 days
2026-10-15 16:49:42 | host_deliberate_off_ended | info | hub | Reporting again after the household's power-off of 2026-10-15 16:46 UTC
2026-10-15 16:49:58 | controller_started | info | controller | Controller elindult (0.314.0)
2026-10-15 16:51:12 | app_deploy_started | info | controller | Alkalmazás telepítése elindult: Jellyfin
2026-10-15 16:51:25 | storage_disconnected | error | controller | Meghajtó váratlanul leválasztva: Adatlemez
2026-10-15 16:51:45 | app_deploy_failed | warning | controller | Alkalmazás telepítése nem sikerült: Jellyfin — exit code 1
stderr: ...jellyfin_config Creating
Volume jellyfin_jellyfin_config Creating
Volume jellyfin_jell
2026-10-15 16:54:53 | backup_tier_skipped | warning | controller | Whole-guest backup tier felhom-pbs skipped: its storage does not exist on the host (never provisioned or removed). No app was stopped for it.
2026-10-15 17:02:24 | storage_disconnected | error | controller | Meghajtó váratlanul leválasztva: Adatlemez
2026-10-15 17:04:51 | storage_reconnected | info | controller | Meghajtó újra csatlakoztatva: Adatlemez
2026-10-15 17:04:55 | controller_started | info | controller | Controller elindult (0.314.0)
2026-10-15 17:06:33 | app_deploy_started | info | controller | Alkalmazás telepítése elindult: Jellyfin
2026-10-15 17:06:34 | app_deployed | info | controller | Alkalmazás telepítve: Jellyfin
2026-10-15 17:09:50 | backup_tier_skipped | warning | controller | Whole-guest backup tier felhom-pbs skipped: its storage does not exist on the host (never provisioned or removed). No app was stopped for it.
2026-10-15 17:15:03 | host_deliberate_off | info | hub | Switched off by the household at 2026-10-15 17:14 UTC — silence alarms held for 14 days
[('Tester4-68d1d8', '2026-10-15T17:14:57Z')]
@@ -0,0 +1,5 @@
final poweroff posted 17:14:57
202
{"data":{"powering_off":true},"ok":true}
VM shut off 17:15:29
@@ -0,0 +1,22 @@
2026-10-15T17:16:16Z
purging VM 9310 from related configurations..
ls: cannot access '/mnt/hdd_1/images/9310': No such file or directory
purging CT 9311 from related configurations..
ls: cannot access '/mnt/hdd_1/images/9311': No such file or directory
felhom-installer-1.27.1-pve9.2-1.iso
felhom-installer-1.28.0-pve9.2-1.iso
felhom-installer-1.29.0-pve9.2-1.iso
started-341
VMID NAME STATUS MEM(MB) BOOTDISK(GB) PID
341 night1004-tester1 running 8192 200.00 673786
VMID Status Lock Name
9201 running demo-hp
9202 running demo-hp-scratch
9401 stopped upgrade-harness
Mem: 29994 6691 16530 209 7420 23303
/dev/nvme0n1 938G 197G 694G 23% /mnt/hdd_1
/dev/mapper/pve-root 39G 24G 14G 63% /
17:16:54 hub /hosts: tester-1-d70be4 Tester 1 0.156.1 floor: declared MinAgent 9.2.2 7.0.14-22-pve ONLINE 0/2 0%
perl: warning: Falling back to a fallback locale ("en_US.UTF-8").
VMID Status Lock Name
9201 running tester-1
@@ -0,0 +1,139 @@
# Felhom in a virtual machine on OpenMediaVault 8 (KVM plugin) — a copy of the pilot tester's box, 2026-10-15
**Why:** the first outside tester runs OMV 8 on an i3-8100T mini PC and wants Felhom in a VM on his NVMe, without
wiping OMV. Nobody had tried Felhom under OMV's KVM plugin. This run built a copy of his machine on demo-hp (Tier 0),
did every step through the OMV web interface (a headless Chromium in a throwaway LXC on demo-hp drove the pages; the
screenshots are in `screens/`), installed Felhom from the public ISO, bound and claimed it as the throwaway customer
**Tester4** (`tester4.test`, made by the operator in the browser — CC's token cannot make customers since decision 252),
installed two apps, made a backup, restarted OMV twice, and removed everything. The guide that came out of it:
`documentation/pilot/GUIDE-omv-kvm-hu.md`.
Times are UTC. „Seen in the web page" = clicked in OMV's own pages by the headless browser; „not in the web page" =
done with `omv-rpc`, `virsh` or the Felhom dashboard's own API calls (the endpoints the dashboard's buttons call).
## The copy (Part A)
| Item | Ferenc's box | The copy (VM 9310 `omv-sim` on demo-hp) |
|---|---|---|
| OMV | 8.5.11-1 (Synchrony) | ISO 8.3.1 (newest ISO on SourceForge, sha256 matched) → `omv-upgrade` → **8.5.11-1** |
| Kernel | 7.2.6+deb13-amd64 | the same — the 8.5 upgrade installs it (`A4-omv-installed.txt`) |
| CPU | i3-8100T, 4 cores | 4 vCPU `cpu=host` on a Ryzen V1756B; nested KVM was already on (`kvm_amd nested=1`, untouched) |
| Memory | 16 GB (planned) | 16 GiB |
| OMV system disk | Samsung 128 GB SATA SSD | 32 GB virtual disk |
| Felhom's disk | Samsung 980 500 GB NVMe with a films partition | 200 GB thin file shown as a **real NVMe device** (`-device nvme`, serial `S64DNF0R980500`) |
| Old HDD | Toshiba 500 GB 2.5" | 20 GB virtual disk (added later, for the second-disk test) |
| omv-extras / KVM plugin | listed 8.3.4 | omv-extras 8.0.3, **openmediavault-kvm 8.3.4** (same) |
| „Films" | `nvme0n1p1` | ext4 on `nvme0n1p1`, shared folder `Filmek`, SMB share, 3 × 300 MB files |
Tester 1 (VM 341) was stopped at 14:48 to free memory (15.6 → 23.4 GiB available); VM 300 did not exist. `A1-free-memory.txt`.
## What happened (Part B)
| Step | Result | Minutes | Evidence |
|---|---|---|---|
| OMV install from ISO | OK | 6 | screens `omv-17/18/22` |
| Upgrade to 8.5.11-1 + omv-extras | OK | 3 + 0.3 | `A4-omv-installed.txt` |
| KVM plugin (Rendszer → Bővítmények → `kvm` → Telepítés, „Megerősítés" tick) | OK; menu „Szolgáltatások → KVM" appears; **the plugin pages are English** | 1.5 | `w05`, `w06`, `w08`, `w10` |
| Pool (KVM → Pools → Add new pool, Directory, `/srv/felhom-iso`, then Állapot → Indítás) | OK; the pool is created **stopped** and must be started | 1 | `w12`, `w13`, `w15` |
| Felhom ISO by URL with the sha256 (KVM → ISOs → Download ISO) | OK, „Checksum OK" | 1.5 | `w20`, `w22` |
| Network bridge (Hálózat → Interfészek) | Works, but **OMV's address changed and the open page hung** — see below | — | `B1-*` |
| Free the NVMe (SMB share → shared folder → Fájlrendszerek „Leválasztás" → Alkalmaz) | OK | 2 | `w46` |
| VM (KVM → VMs → Add new VM: 4 CPU, 12 GiB, 1 GB throw-away disk, Felhom ISO, Modell `bridge`, Híd `br0`) | OK. Defaults: CPU `host-passthrough`, OS Debian 13, **firmware BIOS** (UEFI box empty), VNC+SPICE | 2 | `w52`–`w55`, `B2-felhom-vm-libvirt.xml.txt` |
| Whole NVMe to the VM (Hard disk → Add host disk → `/dev/disk/by-id/nvme-…`), throw-away disk removed, AutoStart → Engedélyezés | OK. **The host-disk list also offers OMV's own system disk** | 2 | `w57`–`w63` |
| First start | **HUNG at „Booting from Hard Disk…"** — the VM boots the disk first, and the old films partition table has no boot code | — | `f-02-boot.png` |
| Wipe the NVMe (Tárolás → Lemezek → Törlés → Gyors), start again | Felhom installer starts. **BIOS firmware works; UEFI was not needed and not tried** | 1 | `w67`, `w68`, `f-03-boot2.png` |
| Felhom installer 1.29.0 | target `/dev/vda` 200 GB; it **refuses** the prefilled e-mail and the default hostname (known, the volunteer guide covers both); VM got 192.168.0.129 from the router **through the bridge** | Install → pairing screen < 4½ | `f-05`…`f-20`, `B3-timeline-raw.txt` |
| Bind (mailed link + pairing code + owner phrase) | „Sikeres összekötés"; host ONLINE 16:12:45; controller 0.313.0 → **0.314.0 by itself** at 16:14:21 | 1.5 to ONLINE, 3 to the controller | `B3-bind.txt`, `C-hub-events-Tester4.txt` |
| Claim (setup code from the mail) | 302 → `/` | — | `B3-claim.txt` |
| Vaultwarden | installed and running | < 1 | `B4-deploy.txt` |
| Jellyfin, one disk | **refused**: „a(z) "Médiatár útvonal" (HDD_PATH) mező kitöltése kötelező" — no data drive registered (R-1068) | — | `B4-deploy.txt` |
| Second disk via the plugin, bus `virtio` (default) | Felhom **refused to format it**: „device has no durable id" (R-1069). Bus `sata` works | — | `B4c-second-disk-format.txt` |
| Second disk, bus `sata`, attached as „Filmlemez" | OK; Jellyfin then installed and ran | < 1 | `B4c-…`, `B4-deploy.txt` |
**Memory.** The VM has 12 GiB; Proxmox inside it sees 11,960 MiB (`memory_total_bytes` 12,540,755,968); the installer
rule (total − 4 GiB) gave the Felhom guest **7,863 MiB**. The sizing estimator (`/gepigeny`, `SIZING.md` §5) has no
12 GB size; by its own rule (fits well = peak × 1.5 ≤ guest) a 7.7 GB guest gives: the household set (peak 5.9 GB)
**fits, but tight**; the household set without Immich **fits well**; Immich alone **fits well**.
**Disk layout on the passed 200 GB disk** (the box's own report): host root `local` 62.8 GB, thin pool `local-lvm`
121.3 GB, the rest swap and boot. The guest's system data volume is mounted at `/mnt/sys_drive` (offered by the dashboard
as an attachable store — see R-1068).
**Backups on a one-disk box** (`B4-backup-pages.txt`, `B4-backup-run.txt`):
| Tier | Works? | What the household sees |
|---|---|---|
| Whole-guest, local (`local` on the same disk) | yes — first archive 16:19, 645 MB | „A rendszermentés jelenleg ugyanazon a lemezen van, mint a rendszer — így hibás fájlok ellen véd, lemezhiba ellen nem. Csatlakoztass egy második meghajtót a teljes védelemhez." |
| Per-app copy 1 (local) | yes — „Mentés most" ran in 4 s | „1. mentés helyi" |
| Per-app copy 2 (another drive) | cannot exist | „Csak egy másolat készül (nincs második meghajtó) — a 3-2-1 mentéshez csatlakoztasson egy második meghajtót vagy offsite tárolót." and per app „Nincs 2. (off-drive) másolat" |
| Off-site (restic) | not switched on for this test customer | „Felhom offsite tárhely — igényelhető szolgáltatás." |
| PBS-DR | not provisioned for this customer | hub event `backup_tier_skipped` (warning, operator) |
The two sentences mix „csatlakoztasson" (formal) and „Csatlakoztass" (informal) on one page (R-1072).
## The bridge (B1 — the trap for Ferenc)
`B1-bridge-timeline.txt` has the minute-by-minute record. In short:
1. „Létrehozás → Híd" offers **no network card** while the card has its own setting: the card's setting must be deleted
first (not applied), then the bridge made, then one „Alkalmaz".
2. 27 s after „Alkalmaz" the old address stopped answering; the page stayed on „Kérjük várjon…" for good.
3. The bridge took a **new hardware address and a new IP** (192.168.0.119 → .121). Copying the card's hardware address
into the bridge's „MAC cím" did **not** bring the old IP back (→ .123): systemd-networkd asks the router with its own
client ID.
4. OMV's own screen text kept showing the **old** address both times.
5. **What found it:** `http://omv-sim.local` (OMV's avahi answers) — or the router's device list.
## The restarts (B5)
| Restart | Felhom VM before | OMV page back | Felhom dashboard back | How the VM stopped | Evidence |
|---|---|---|---|---|---|
| 1 — OMV power menu → Újraindítás | switched off | 26 s | 63 s (AutoStart) | — | `B5-omv-restart-1.txt` |
| 2 — the same | **running**, Vaultwarden + Jellyfin | 72 s | **1 min 52 s** | clean shutdown, ~20 s: the plugin sets `ON_SHUTDOWN=shutdown`, `ON_BOOT=ignore` (the AutoStart flag starts it) | `B5-omv-restart-2.txt` |
The household's „turn off" from the dashboard refuses for 10 minutes after a start („A gép most indult el. 10 perc
múlva kapcsolhatod ki.") — by design, noted for the guide. Every dashboard power-off was recorded by the hub as
deliberate (`host_deliberate_off`), so no alarm mail.
## An OMV share for Jellyfin (B6) — **No**
Steps tried once: `openmediavault-sharerootfs`, a shared folder `TesztFilmek` with one file, SMB share, an OMV user
`felhom`. Felhom „Hálózati tárhely" (`/api/storage/netstorage/add`, the page's call):
- without a user name → refused „SMB-hez felhasználónév és jelszó szükséges";
- with a user, read-only share → refused „A megosztás csatolható, de az alkalmazások nem tudnak rá írni…";
- writable share → added and verified, mounted at `/mnt/felhom-drives/omv-filmek`.
The household's „Újraindítás most" for media apps then bound **only the local drive** into Jellyfin
(`per-drive binds 1 [/mnt/felhom-drives/filmlemez/userdata/media]`). A network share is browse-only by design (R-108,
`media_library.go` skips `Kind == "network"`). Filed as R-1071 for the operator's decision. `B6-omv-share.txt`.
## Things this run caused, recorded so nobody reads them as product faults
- `storage_disconnected` (error) for „Adatlemez" at 16:51 and 17:02: my own mistake — I first used the low-level disk
calls (`/api/disks/format` + `/api/disks/assign` + `register-mounted`) instead of the dashboard's „Csatlakoztatás"
(`/api/storage/attach`), so the drive was registered but not bound into the guest. Removed with
„Végleges leszerelés"; the household path worked at once.
- Two dashboard power-offs and a third at the end; all deliberate.
## Hub-side finding
`os_update_health_failed` (error) at 16:30: „NOT healthy after 106 package(s) were installed (the tunnel is unknown)" —
on a box that never had a tunnel. Filed as R-1070. `C-hub-events-Tester4.txt`.
## Clean-up (Part D) — three layers
- **Machine:** Felhom VM switched off by the household path (17:15), then `omv-sim` destroyed with all its disks;
`/mnt/hdd_1/images/9310` gone. `D1-poweroff.txt`, `D2-teardown-demo-hp.txt`.
- **Host (demo-hp):** browser LXC 9311 destroyed; the OMV ISO deleted; nested setting untouched (it was on);
Tester 1 started 17:16 and ONLINE on the hub at 17:16:54, its guest 9201 running (read over SSH too).
- **Hub:** customer **Tester4** and its host record `Tester4-68d1d8` remain — **deleting them is the operator's
browser-only act**. No tunnel or DNS name was made (placeholder domain). Nothing ran on ep0.
## Not checked
- UEFI firmware (BIOS worked, so UEFI was not tried).
- A real Samsung 980: its `/dev/disk/by-id` name will read `nvme-Samsung_SSD_980…` or `nvme-eui.…`, not the QEMU name.
- Jellyfin on the one disk through the dashboard's `sys_drive` route (R-1068) — seen in the code and in the dashboard's
candidate list, not pressed.
- The noVNC console of the plugin (the installer was driven with `virsh send-key`; Ferenc will use the console page).
Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 133 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 128 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 132 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 134 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 147 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 148 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 131 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 116 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 113 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 126 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 150 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 48 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 80 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 83 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 96 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 89 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 100 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 86 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 88 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 91 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 92 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 81 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 104 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 83 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 88 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 81 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 81 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 92 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 89 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 94 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 94 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 90 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 98 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 105 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 108 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 93 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 76 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 88 KiB

+10 -4
View File
@@ -124,7 +124,7 @@ stopping line that lies.
| **R-494** | Install & onboarding | P4 | **NARROWED 2026-09-14 by operator ruling → [P3-LOW] the hub COULD create the tunnel at customer creation, for a domain already on Cloudflare. Not blocking: every customer has their own domain and the operator creates the tunnel per day-0 A.1 (`architecture/01-topology-and-trust.md`).** *Original finding, kept:* **[P1-HIGH] A new customer's dashboard has NO reachable address unless the operator hand-makes a Cloudflare tunnel — the link in the setup-code mail is dead.** MEASURED 2026-09-14 on a fresh install from the public ISO (drill intervention **I1**): the claim mail points at `https://felhom.drill0242.felhom.eu`; that name has **no A and no AAAA** record (`dig @1.1.1.1`, control `felhom.enkisfelhom.hu` resolves); the hub has **no tunnel- or DNS-creation code** (`hub/internal/cloudflare/` holds only geo-rule removal; `cf_tunnel_token` is a pasted, optional form field, `configs.go:1478`) — day-0 runbook A.1 makes it a manual Cloudflare-dashboard step that nothing on the customer-create page asks for; the box's own split-horizon resolver on the appliance LAN IP answered `google.com` but not the dashboard name at 13:27:39Z; the agent applied the record at **13:27:44Z** (`lanresolver: applied split-horizon record … ip=192.168.0.158`, 3 m 46 s after the controller started), so the box CAN answer the name — **but only to a device that uses the box as its DNS server, and no document, screen or mail tells a household to do that**; the router and the installer-offered DNS answer nothing. The page was reachable only at the guest's LAN address with the name forced (`curl --resolve …:443:192.168.0.158`). **A volunteer could not have done that.** **What it needs:** an operator ruling — the hub creates the tunnel and DNS at customer creation, or the product gives a household a LAN address that works with no DNS change. | **READY — rank P3-LOW; owner: CC** **Re-ranked 2026-10-03: P3→P4: operator-side automation; the operator creates the tunnel by hand per the day-0 runbook.** | — | — | CC |
| **R-504** | Install & onboarding | P4 | **[P3-LOW] `iso.felhom.eu` cannot show an index page on its own — its root returns 404, and the download page lives on the website instead.** MEASURED 2026-09-14: `https://iso.felhom.eu/` and `/index.html` → 404; only named objects answer. The host is an R2 bucket behind a custom domain; whether R2 would serve an uploaded `index.html` at `/` was **not measured** (uploading anything to the public bucket is a publication). The ISO v1.27.0 task puts the Hungarian download page at `felhom.eu/letoltes` (published with the ISO, after the operator's yes). **Remaining:** a redirect from `iso.felhom.eu/` to that page needs a Cloudflare rule the session has no credential for. | **WAITING-ON-OPERATOR — rank P3-LOW; owner: operator (Cloudflare rule)** **Re-ranked 2026-10-03: P3→P4: households are sent to the website's download page; the bare address is cosmetic.** | — | — | operator |
## Apps & catalog — 15 rows (P2 1, P3 8, P4 6)
## Apps & catalog — 16 rows (P2 1, P3 9, P4 6)
| ID | Category | Sev | What | State | Blocked on | Next action | Owner |
|---|---|---|---|---|---|---|---|
@@ -137,6 +137,7 @@ stopping line that lies.
| **R-1029** | Apps & catalog | P3 | **Plex's folder picker shows the drives as identical „media” folders.** With one bind per drive at the same path (`/mnt/felhom-drives/<drive>/userdata/media`), the leaf of every library folder is `media`; the drive's name sits two levels up, so in Plex's picker the household sees several folders all called „media” (reported by the operator during the 2026-10-14 test on Tester 1). It conflicts with `15` §2 reason 2 (the same path everywhere). | **READY** — filed 2026-10-14 | the layout decision (STATUS D9) | Decide in `15` §2: the players (`:ro`, never linked) may get a readable path per drive (e.g. `/media/<drive label>`) without breaking the hardlink rule, which binds only the download/library apps | CC |
| **R-1036** | Apps & catalog | P3 | **The apps page lags the catalog by two apps.** `app-catalog-felhom.eu/templates/` holds **64** apps; `/alkalmazasok` and `/en/apps` render **63** cards, one of which (`filebrowser`) is built in and not a catalog template — so **62 catalog apps are listed**. Missing: **`plant-it`** and **`wger`**, both in the catalog since 2026-10-06/08. Their website assets are ALREADY present (`plant-it-logo.svg` + 3 screenshots, `wger-logo.png` + 3 screenshots, renamed to the catalog slug by `a3507761`, 2026-10-08) — only the cards were never written, so this is not a new-asset job. Found 2026-10-14 while reconciling the app count for the „felhő tárhely” page, where four places said **60** and the rest said **62**. **Done in that session:** every stated count on the site set to **62** (`index.html`, `szolgaltatasok.html`, `en/services.html` were 60), which is what the apps page actually shows — so no visitor can count the cards and find the number wrong. **62 is still not the catalog's number.** **To close:** write the two cards on both apps pages (gate 15 keeps the two pages' app sets equal, so they move together), then raise every stated count 62 → 64 in the same commit. **The operator chose this split at the 2026-10-14 STOP** over doing it inside the SEO change. **2026-10-15 (R-1048):** Prowlarr's card added on both pages and every stated count 62 → 63 (the media group 19 → 20), so the site still states what it shows; the two owed cards would make it 65. **Note before writing them:** `wger` is `lifecycle: hidden` and `plant-it` `lifecycle: abandoned` — neither is offered for a new install, so a card would advertise an app the wizard refuses. | **OPEN** | — | write the `plant-it` + `wger` cards on both apps pages, then 62 → 64 everywhere, one commit | CC |
| **R-1065** | Apps & catalog | P3 | **After the Plex claim the box does not set Plex's libraries until the next wiring run.** The claim handler (`felhom-controller` `internal/web/media_events.go` `appPlexClaimHandler`) opens the gate when Plex says claimed and returns; the wiring runs only when a `media_library` app comes up, on a drive event, or on „Bekötés most". Plex's own install ran it while Plex was unclaimed (`plex=household(0)`), so a freshly claimed Plex has no libraries until one of those happens — the shape of R-1058. Read from code 2026-10-15; to be measured on the N100 when the operator claims Plex (the sheet asks for „Bekötés most" only if no library appears). | **OPEN** — filed 2026-10-15 | — | Run the wiring (RunMediaWiringSoon) after a successful claim; a test; measure on the N100's claim | CC |
| **R-1071** | Apps & catalog | P3 | **Jellyfin cannot use films that sit on a NAS share (the pilot's OMV), and the pilot's wish is exactly that.** MEASURED 2026-10-15: an OMV SMB share added as „Hálózati tárhely” mounts and verifies (`/mnt/felhom-drives/omv-filmek`) — but only with a user name AND a WRITABLE share (read-only → refused „az alkalmazások nem tudnak rá írni”) — and the household's „Újraindítás most” binds only local drives into Jellyfin (`per-drive binds 1 [/mnt/felhom-drives/filmlemez/userdata/media]`). By design: R-108 (a NAS is browse-only, never an app's namespace); `media_library.go` skips `Kind == "network"`. A design decision, not a defect (R-370). Evidence: `audits/omv-vm-2026-10-15/B6-omv-share.txt`. | WAITING-ON-OPERATOR | Operator: should a media app read a NAS share read-only (a new bind kind), or is the answer „put the films on a drive the box owns”? | Operator rules; if yes, a design note in `15-media-library.md` first. | Operator |
| **R-76** | Apps & catalog | P4 | **FileBrowser-created folders break the setgid chain, and a drop-zone's mode is not stable** **MIGRATED FROM `ROADMAP.md` 2026-08-22 (R-369) — originally filed 2026-07-26, size S, roadmap state `idea (surfaced by the R-75 spike, 2026-07-26)`.** Moved verbatim; nothing added or reinterpreted. The roadmap keeps its copy as history, marked moved. | **OPEN — migrated from ROADMAP 2026-08-22, rank unchanged** **2026-10-06 night: not a catalog fix** — the setgid chain is set by the controller's FileBrowser setup; a controller row. | — | Two related findings from `audits/SPIKE-catalog-data-paths-2026-07-26.md` P3/P5, both **pre-existing** and deliberately left alone by that spike. **(a)** FileBrowser Quantum 1.3.3 creates files `0644` and folders `0755` and does **not** propagate the setgid bit — even though the entrypoint wrapper's `umask 002` really is in effect (`/proc/1/status` `Umask: 0002`). Group inheritance itself works (a file uploaded into a 2775 group-100 dir landed group 100, not the process gid 1000), so the convention's *group* half holds and only its *mode* half is lost. The consequence is proven with a control: inside a UI-created `0755` folder a gid-1000 process's file landed group **1000**, while the identical write into the 2775 parent landed group **100**. So **any folder a customer creates through FileBrowser breaks the shared-group chain one level down.** Latent today — every userdata-touching catalog app that declares an identity declares uid/gid **1000**, the same uid FileBrowser runs as, so owner permissions mask it; it bites the day a content app runs as a different non-root uid with gid 1000. The comment at `infra/infra.go:156` is right that the image ignores `-e UMASK` but does not say t | CC |
| **R-707** | Apps & catalog | P4 | **[P2] 37 apps still start with a login a stranger can take (`09` §3 decision 45).** Audit of all 53 apps: `app-catalog-felhom.eu/FIRST-ADMIN.md` (class, fix route, status, measured or read). Open: **3 hard-coded defaults** — calibre-web (`admin / admin123`, measured working on demo-hp and 9202; its own `cps.py -s` route needs a generated password WITH a special character — our generator is letters+digits, a controller change), mealie (`changeme@example.com / MyPassword`), wger (`admin / adminadmin`); **34 open first-run screens** (the first visitor creates the admin: actualbudget, adventurelog, audiobookshelf, calcom, docmost, emby, ghost, gitea, gramps-web, home-assistant, homebox, immich, jellyfin, komga, n8n, navidrome, opengist, outline, papra, plant-it, radarr, rallly, recipe-importer, romm, seerr, sonarr, sparkyfitness, tandoor, termix, uptime-kuma, vikunja, wanderer, wishlist, zipline). **Stale notes:** romm's `default_creds` `admin / admin` answers 401 on demo-hp (like a wrong password) — the page now warns with a login that does not exist; zipline's looks stale too. **Measured on demo-hp 2026-09-28 (read-only):** bookstack's default still logs in on the INSTALLED app (the fix is for new installs; the page now warns). Each fix: route (a) env or (b) the app's own CLI/API via `after_install:`, proven on 9202 with the default failing and the generated password working; route (c) a page sentence. Several sessions (operator, 2026-09-28). **2026-09-29 (controller v0.280.0, catalog `d0e7e2e`):** every class-3 app fixed — mealie, wger, calibre-web by `after_install` (calibre-web with the new `password:24:special`), proven on 9202 fresh installs (`audits/login-gate-2026-09-29/D/`); the setup gate (decision 46, spike PASSED) built and live on immich, n8n, audiobookshelf (probes measured) and uptime-kuma (button) (`…/C/`); romm's and zipline's stale notes removed. **Left: 30 class-4 apps** — gate each (probe measured on 9202 where one exists — 11 upstream candidates listed in `…/B/B-VERDICT.md` §3; the button otherwise). **2026-09-29 afternoon (controller v0.281.0, catalog `6faf432`):** 28 more class-4 apps gated — 32 of 34 — each proven on 9202 (`audits/gate-rollout-2026-09-29/`B): stranger → gate page / 401, household reached the first-setup screen, the gate opened (9 by a measured probe, the rest by the press), the app answered after. seerr, outline, rallly: gated, their opening needs a media server / e-mail (not proven). **Left:** wanderer (R-714); plant-it is not installable. | **NARROWED** (2026-10-03 triage: the row's verdict was finished, but it names open work no other row carries — seerr, outline and rallly are gated, but the gate OPENING is not proven (needs a media server / e-mail)) — **CLOSED — 2026-09-29 (the rest → R-714)** | — | — | CC |
| **R-905** | Apps & catalog | P4 | **wger's collected style files (283 MB) go into every wger backup, though the app rebuilds them at every start.** Since R-762's fix (`DJANGO_DEBUG=False` + `collectstatic`, catalog `cf1ed43`) the static files sit in a named volume that the backup legs copy like data (measured 283 MB, `audits/design-build-2026-10-06/`); `collectstatic` regenerates them, so they are rebuildable bytes in every Tier-1 unit, Tier-2 copy and off-site snapshot. wger is `lifecycle: hidden` and no box runs it (hub read 2026-10-08). Options to weigh: a non-backed-up volume class for regenerable data, or an anonymous volume. Found by the R-762 helpers 2026-10-08. | **OPEN — needs a design before wger is shown** | — | Design the „regenerable volume" exclusion (catalog + controller backup legs) | CC |
@@ -154,7 +155,7 @@ stopping line that lies.
| **R-683** | App updates | P3 | **[P3-LOW] Watch: after a power cut during an update's health check, the hold named an HOUR-OLD second-drive copy, not the one the update's own backup should have just made.** 2026-09-24 chaos round 3 (nextcloud, `backup_max_age: 1m`): no `backing-up` phase was seen and the hold named Tier 2 at 13:04 for an update pressed at 14:04; the pre-cut controller log was lost with the container (the runner now saves it at arm time — R-320). Round 11, the same action without a power cut, named a fresh 14:34 copy and logged the Tier-2 copy. The sentence was TRUE (it named the copy it offered); the question is why the update did not back up first. Not reproduced; watch the next power-cut drill. `audits/night-2026-09-24/E/round-03*.json`, `E/round-11-controller-pre.log` | **OPEN — P3; owner: CC (watch)** | — | — | CC |
| **R-785** | App updates | P3 | **[P3-LOW] SparkyFitness is pinned 11 releases and a major behind upstream (v0.17.3; upstream v1.7.3, v1.6.0 dated 2026-07-24).** READ 2026-10-01 (`audits/visitors-2026-10-01/C/bench/C1-previous-tag.txt`). **Needs:** an update walk 0.17 → 1.x through the ladder (bench + box), after R-784 is decided. | **OPEN — rank P3-LOW; owner: CC (after R-784)** | — | — | CC |
## Backup & restore — 30 rows (P2 3, P3 17, P4 10)
## Backup & restore — 31 rows (P2 3, P3 17, P4 11)
| ID | Category | Sev | What | State | Blocked on | Next action | Owner |
|---|---|---|---|---|---|---|---|
@@ -188,11 +189,15 @@ stopping line that lies.
| **R-832** | Backup & restore | P4 | **ep0's copy in a place outside both Hetzner and the operator's home (roadmap).** Today DooPlex (the operator's home) holds it (decision 71). A Hetzner Storage Box would share a provider with ep0 and with every household's file backups, and cannot run PBS, so the copy could not be verified or restored from directly. | **DEFERRED — later, if the product grows** | — | — | operator |
| **R-878** | Backup & restore | P4 | **A catch-up (R-871) runs the database-dump leg in the DAY, and that leg stops an app with a volume for its copy — the household may notice the stop, and a large volume makes it longer.** MEASURED 2026-10-05 on demo-felhom: the catch-up at 08:25:02 stopped opengist, copied 182.5 KB, started it again — about 1 s, then a few seconds of `health: starting`; the night does exactly the same, unseen. Nothing measured for a large volume. Fix direction (if it matters): skip the volume copy of a running app in a DAYTIME catch-up and leave it to the next night, or warn. `audits/catchup-2026-10-05/partA/live-demo-felhom.txt` | **READY — owner: CC** **2026-10-05 (burn-down night): NEEDS A LIVE MEASUREMENT** — a timed catch-up on 9202 for an app with a multi-GB volume, then the skip-or-warn choice. | — | measure a large volume first | CC |
| **R-32** | Backup & restore | P4 | **[P2-HIGH] RESET must purge the customer base dir; the orphan card must stay honest; unattributed bytes must be visible.** The rehearsal's S7 said in advance that an orphan card would BE a finding — and one appeared (16:58:14). Cause: RESET's `"hetzner":"ok"` leg destroys the sub-account, but **a Hetzner sub-account is an access-control object, not a data object** — its directory survives, so re-enabling offsite recreated an account over the previous lifecycle's ciphertext, encrypted under a key that same RESET had destroyed. **MIGRATED FROM `ROADMAP.md` 2026-08-22 (R-369) — originally filed 2026-07-21, size M, roadmap state `idea`.** Moved verbatim; nothing added or reinterpreted. The roadmap keeps its copy as history, marked moved. | **OPEN — migrated from ROADMAP 2026-08-22, rank unchanged** **2026-10-06 night: design written** (`audits/night-burndown-2026-10-06/design-R-32.md`) — pick A: purge the repo + set-aside copies through the sub-account's own password login BEFORE deleting it (no main-account credential); the „repo data destroyed" comment at `hub/internal/offsite/offsite.go:276-280` is false for the shared tier; part (3) waits on a read-only measurement (`du` on port 23). Operator: agree to route A. **2026-10-07 07:58: `09` §3 decision 167 — option A yes, and delete the old RESET leftovers once.** **2026-10-07 (Part D step 2, read only):** the hub shows bx11 holding 3.3 GB of data while the four live customers account for ~0.6 GB → **~2.7 GB belongs to no live customer**; no live customer shows a set-aside folder, so the leftovers are in homes whose sub-account is gone, reachable only by the pool box's MAIN account. **The one-time clean-up is STOPPED:** no main-account login for bx11 is held on DooPlex (the API token in the credentials file sees no box). Needs: the main-account login, or the operator lists and deletes in the Hetzner console (`audits/day-2026-10-07/D/D2-listing-readonly.txt`). **2026-10-07: option A DELIVERED (hub 0.142.0):** RESET purges the repo and every `.orphaned-*` through the sub-account's own login before deleting it, and keeps the sub-account if the purge fails (red-proved, `audits/day-2026-10-07/D/`). Not yet seen live (no scratch RESET today). **The one-time clean-up of the ~2.7 GB of leftovers is STOPPED:** it needs the pool box's main-account login (see above). **2026-10-07 14:43 — `09` §3 decision 173: leave the ~2.7 GB of old leftovers for now; re-ranked P2 → P4.** Option A itself is delivered (hub 0.142.0). What stays open is ONLY the leftovers: they were computed (box total minus live customers), never listed, and deleting them needs the pool box's MAIN login, which reaches every customer's data. **Blocker: a safe main-account path.** | — | **Ruling from the run (three parts, deliberately separate):** (1) because RESET destroys custody, the ciphertext it leaves behind is unrecoverable **BY DESIGN** → RESET gains a **main-account purge of the customer base dir** (the existing operator ack already covers it); (2) the **move-aside guard STAYS** for reinstall-*without*-RESET — there custody survives and the card's "history recoverable" promise is true (R-26 depends on exactly that); (3) the operator **Restic tab shows per-customer directory bytes vs attributed snapshot bytes**, so dead data cannot hide. Measured on the pool box that night: **49 M attributed** (2 snapshots, 48.717 MiB) against **1.4 G + 3.0 M unattributed** across TWO `.orphaned-*` dirs. Evidence `restic-and-pool.txt` | CC |
| **R-1072** | Backup & restore | P4 | **The backup page speaks to the household in two registers in one card: „csatlakoztasson” (formal) and „Csatlakoztass” (informal).** MEASURED 2026-10-15 on controller 0.314.0, one-disk box, `/backups`: „Csak egy másolat készül (nincs második meghajtó) — a 3-2-1 mentéshez csatlakoztasson egy második meghajtót vagy offsite tárolót.” next to „… Csatlakoztass egy második meghajtót a teljes védelemhez.” The product's voice is informal (tegezés). Small; not fixed here because this run allowed no product change. Evidence: `audits/omv-vm-2026-10-15/B4-backup-pages.txt`. | READY | — | Change the first string to „csatlakoztass” (and „offsite tárolót” → „távoli tárhelyet”) in the controller's i18n file; the copy gates run. | CC |
## Storage & devices — 6 rows (P3 3, P4 3)
## Storage & devices — 9 rows (P3 6, P4 3)
| ID | Category | Sev | What | State | Blocked on | Next action | Owner |
|---|---|---|---|---|---|---|---|
| **R-1068** | Storage & devices | P3 | **On a box with one disk, a media app's (or any data-folder app's) Install is refused with a raw field error, and the way through is nowhere near the button.** MEASURED 2026-10-15 on the OMV-VM copy of the pilot's box (one passed NVMe, controller 0.314.0): `POST /api/stacks/jellyfin/deploy` with DOMAIN+SUBDOMAIN → **400 „a(z) "Médiatár útvonal" (HDD_PATH) mező kitöltése kötelező”** — the env var name reaches the household. R-1031's default-drive rule finds no drive because none is registered. The box DOES offer one: `/api/disks/candidates` listed `/mnt/sys_drive` (the installer's data volume, `already_mounted`), and `handleStorageRegisterMounted` (R-280) registers it — **seen in the candidate list and the code, NOT pressed** (the box was removed). With a second disk attached through „Csatlakoztatás”, the same Install succeeded in 30 s. Evidence: `audits/omv-vm-2026-10-15/README.md` „What happened”, `B4-deploy.txt`. | OPEN | — | Prove the `sys_drive` route live on a one-disk box (Tester 1 or a scratch VM); then make the Install refusal name it in household words (a link to Meghajtók), or register `sys_drive` by default on a one-disk box. | CC |
| **R-1069** | Storage & devices | P3 | **A disk passed into a Felhom VM on a virtio bus cannot be formatted, and the household reads the agent's raw English refusal.** MEASURED 2026-10-15 (OMV KVM plugin, „Add host disk”, default Bus `virtio`): `POST /api/disks/format` → 500 „agentapi: format: HTTP 409: format refused: device has no durable id to bind the format to (path-only formats are not permitted)”. A virtio-blk disk without a serial has no `/dev/disk/by-id` link inside the guest, so the anti-retarget guard refuses — correct and safe. The same disk on Bus `sata` got `byid:ata-QEMU_HARDDISK_QM00003` and formatted. Affects every hypervisor that passes disks as virtio without a serial (OMV KVM, Proxmox without `serial=`). The pilot guide says `sata`. Evidence: `audits/omv-vm-2026-10-15/B4c-second-disk-format.txt`. | OPEN | — | Translate the refusal for the household („Ezt a lemezt a Felhom nem tudja biztonságosan azonosítani — a virtuális gépben állítsd a lemez buszát SATA-ra”); optionally fall back to a filesystem-UUID binding after a blank-format. | CC |
| **R-1073** | Storage & devices | P3 | **Felhom in a virtual machine sees no disk health: SMART is UNKNOWN for its own system disk and any passed disk.** MEASURED 2026-10-15 on the OMV-VM copy: every storage target reported `smart.health = UNKNOWN`, all counters null (the guest sees QEMU disks). On the pilot's box the NVMe and the „old, not stable” Toshiba would be watched by OMV only, and Felhom's drive-health alarms (R-330/R-332's whole point) cannot fire. Evidence: the host report in `audits/omv-vm-2026-10-15/README.md` (memory/disk section) and `C-hub-events-Tester4.txt`. | WAITING-ON-OPERATOR | Operator: is a VM install a supported shape, and if so, is „OMV watches SMART” acceptable or must Felhom say on the dashboard that it cannot watch the disks? | Operator rules; then CC adds a household line on the Meghajtók page when SMART is unavailable. | Operator |
| **R-1062** | Storage & devices | P4 | **The N100's USB drive cannot be split in two without losing the box's whole-guest backup target.** The operator asked (2026-10-15 16:31) for two halves for multi-drive tests. Read first (`audits/n100-lived-in-2026-10-15/B/`): no family files — 2.7 GB nightly vzdumps of guest 9201 (`dump/`, PVE storage `felhom-backup` = the whole-guest backup target), 3.1 GB app backups + an off-site restore copy, 422 MB leftover app data of removed apps, empty media folders. The agent refuses a decommission of a backup target (`refuseIfBackupTarget`) and the N100 has no other drive to move that role to. Nothing changed. | **WAITING-ON-OPERATOR** — filed 2026-10-15 | operator decision | Keep one drive (CC's pick: the lived-in box keeps its local whole-guest backup), or give a word to drop that backup leg / add a second drive first | operator |
| **R-1063** | Storage & devices | P3 | **„Végleges leszerelés" leaves a half-state when the agent refuses: the dashboard marks the drive decommissioned first and never undoes it.** `handleStorageDecommission` → `finalizeDecommissionWith` calls `settings.SetDecommissioned` (and may move the default) BEFORE `agent.Decommission`; on the agent's 403 (protected role) or 409 (whole-guest backup target) it returns the error and keeps the mark — the dashboard would show a retired drive the agent kept serving. Read from code 2026-10-15 (`felhom-controller` `internal/web/storage_handlers.go`); NOT pressed on the lived-in N100 on purpose. | **OPEN** — filed 2026-10-15 | — | Measure on demo-hp (a backup-target drive), then: ask the agent first (or undo the mark and the default on a refusal); a test with a refusing agent seam, red first | CC |
| **R-1064** | Storage & devices | P4 | **Removing a storage path does not mention the cross-drive backup copies it holds.** demo-hp 2026-10-15: `/mnt/sizing-bench` removed through `/settings/storage/remove` (302, „Adattároló eltávolítva") while calibre-web's and paperless-ngx's `cross_drive.destination_path` pointed at it; the copies stay on disk, the records still name the removed path. The in-use check counts HDD_PATH only (`appsUsingPath`). | **OPEN** — filed 2026-10-15 | — | Read what tonight's tier-2 run (01:30) does with the two records; then: name the copies in the removal's confirmation (or count them as in use) | CC |
@@ -244,10 +249,11 @@ stopping line that lies.
| **R-1061** | Box system & updates | P4 | **A per-customer floor reached Tester 1 only at its next 15-minute report, not in seconds.** Set 2026-10-15 12:55:51 UTC for tester-1, demo-hp and demo-felhom together (hub 0.153.0, CC's token): demo-hp and demo-felhom ran 0.314.0 within 13 s (the hub's wake); Tester 1 moved at 13:09:35, its regular report (`audits/gate-restore-2026-10-15/release/03-boxes-move.txt`). It had restarted at 12:54:29 onto rc.1 and logged „hub wait channel active". Why the wake did not reach it is not read (the wake line is DEBUG). No harm: the floor arrived. | **OPEN** — filed 2026-10-15 | — | Read Tester 1's DEBUG ring at the next floor change; compare with the hub's bump log | CC |
## Monitoring & notifications — 10 rows (P2 1, P3 6, P4 3)
## Monitoring & notifications — 11 rows (P2 1, P3 7, P4 3)
| ID | Category | Sev | What | State | Blocked on | Next action | Owner |
|---|---|---|---|---|---|---|---|
| **R-1070** | Monitoring & notifications | P3 | **A box with no Cloudflare tunnel gets an ERROR after its host OS update: „NOT healthy … (the tunnel is unknown)”.** MEASURED 2026-10-15 16:30 on Tester4-68d1d8 (throwaway customer, placeholder domain `tester4.test`, so no tunnel token): hub event `os_update_health_failed` (error) „OS update (host) on Tester4-68d1d8: NOT healthy after 106 package(s) were installed (the tunnel is unknown). Nothing was undone automatically; put a host package back by hand…”. The box was healthy (dashboard 200, apps installing). A tunnel that never existed is read as a failed health check. Would hit every test customer and any box whose tunnel is not set yet. Evidence: `audits/omv-vm-2026-10-15/C-hub-events-Tester4.txt`. | OPEN | — | Find the health verdict's tunnel input (hub os-update health); treat „no tunnel configured” as not-applicable, not as unhealthy; red-proof with a no-tunnel fixture. | CC |
| **R-1020** | Monitoring & notifications | P4 | **`app_repaired_after_crash` reports a duration of 0 s, and the controller log says „in 0s".** `RunAfterUncleanBoot` sets `res.Duration` in a deferred func after the result is already returned (no named result), so the caller sees 0; the `app.yaml` record is right (10,172 ms on demo-hp 2026-10-14, `audits/immich-repair-2026-10-14/D/`). Small, but the controller release for this session is spent (v0.311.0). | **OPEN** — filed 2026-10-14 | — | CC: a named result (or set the duration before return), with a test on the returned value; ride the next controller release | CC |
| **R-1001** | Monitoring & notifications | P3 | **Every hub restart re-mails the operator about a box that is already known to be down.** MEASURED 2026-10-13 18:33 UTC (hub v0.149.0 rollout, R-998 session): Tester 2, silent 216 h, got a fresh `host_down` and `restore_test_stale` mail. `monitor/host_staleness.go` leaves a down host unseeded on start so the first Check emits (F2), and its comment says „the dispatcher's 1h cooldown dedups the re-emit" — but host liveness events bypass that cooldown (`dispatcher.go` `nodeLivenessEvents`, 5-min dedupe only); `restore_test_stale` keeps its edge state in memory. The comment states an invariant the code does not provide. | **READY** — filed 2026-10-13 | — | Seed a host silently when a `host_down`/`host_stale` event for it is newer than its last report; the same for the restore-test edge; a test that restarts the checker | CC |
| **R-528** | Monitoring & notifications | P2 | **[P2-MEDIUM] Docker does not report an OOM kill inside a Felhom LXC guest: `OOMKilled` stays false and no `oom` event fires, so the v0.243.0 OOM line is not proven live.** MEASURED 2026-09-15 on scratch 9202 (Docker 29.8.0): Paperless capped at 128M restarted 11 times with `OOMKilled=false` and zero `docker events --filter event=oom`; a memory hog inside the running container was killed (rc 137) with the same silence (`E2-oom-signal-measure-9202.txt`). BIGNIGHT VM 333 did read `oomkilled=true`, so the shape differs by case. **Fix shape:** the agent reads the guest container cgroups' `memory.events oom_kill` counters (host-side, reliable), or the controller alarms on a restart-count trend **RE-MEASURED 2026-09-16 on the DRILL box (fresh install, nested VM 334, Docker in an LXC guest, controller 0.243.0), so the finding is not a property of one machine:** the Paperless webserver was capped at 128 M with `docker update --memory`; it restarted 9-10 times, and all three signals stayed silent - `OOMKilled=false` on every inspect, `docker events --filter event=oom` EMPTY for the whole window, the container's cgroup not visible from inside the guest, and `dmesg` unreadable there. Identical to scratch 9202. So the v0.243.0 OOM line cannot fire on ANY Felhom box as shipped, on either host. Evidence: `audits/evidence-drill-0243-2026-09-16/phase2-m1-oom.txt`. | **WATCHING** — **2026-10-12: the built part is released** (agent v0.150.0 carries the Docker-approval memory-kill check; the boxes run 0.154.0; hub 0.140.0+ requires a passing `oom_check` before a Docker set is approved). Per decision 157 nothing else is built; the row watches for a box whose Docker reports a false OOM flag. Dated look: 2026-11-12. **READY — rank P2-MEDIUM; owner: CC** **2026-09-17 (chaos night): an OOM WAS detected on a fresh box, and named precisely.** On `tester-1-022354` (controller 0.245.0, guest 9201, 6 GB RAM) immich’s Postgres was killed by the memory limit during its reverse-geocoding import, and the controller pushed `app_oom` (warning, operator-only): „Alkalmazás memóriája elfogyott: immich (immich-postgres) — egy folyamatát a memóriakorlát leállította” — naming the app AND the exact container. The visible consequence was `write CONNECTION_CLOSED immich-postgres:5432` and twelve restarts of immich-server. So on THIS box the OOM scan works and was the fastest route to the diagnosis; recorded here rather than filed as a new row. Evidence: `audits/evidence-chaos-night-2026-09-17/round-2.txt`. **2026-10-05 (burn-down night): a one-page design proposal (no code) is in `audits/night-burndown-2026-10-05/design-R-528.md`** — for the operator. **2026-10-06: STOPPED BEFORE ANY CODE — the measurement contradicted the design** (decision 155 said A then C). On scratch 9202, Docker 29.8.2, the `OOMKilled` flag was TRUE in all four shapes tried: a child process killed while the container kept running (`oom_kill` 0 → 3, flag true) and three main-process kills (exit 137, flag true); an `oom` event each time. The false flags of 2026-09-15 were on Docker 29.8.0. Cost read for the record: one exec read of 21 containers on demo-hp = 1.6 s. `audits/design-build-2026-10-06/`C/. **2026-10-06 18:24: operator ruling, option A (decision 157):** nothing is built; the row stays open as a WATCH for a box whose Docker reports a false flag. **Added:** a Docker engine set may not be approved until it reports a memory kill correctly on the boxes that ran it (built in this row's next session). **2026-10-06 (night): the Docker-approval memory-kill check is BUILT** — hub v0.140.0 (LIVE: the approval waits for a passing `oom_check` on every ring-0 box; a failed, errored or missing one blocks) and the agent's wrapper (`felhom-agent` `acccb66`, unreleased — ships as v0.150.0 after the 2026-10-07 read-back). Proven by hand on demo-hp's guest: `OOMKilled=true`, exit 137, the `oom` event — seen only with an events window ending after the run (the wrapper waits 2 s). `audits/readback-2026-10-07/`F/. | — | 2026-11-12: read the hub for any failed `oom_check` or an `app_oom` with no restart reason since 2026-10-12; none → close | CC |
+225
View File
@@ -0,0 +1,225 @@
# Felhom virtuális gépben, OpenMediaVault 8 alatt — útmutató
*Készült 2026-10-15-én, egy pontos másolaton kipróbálva (OMV 8.5.11-1, 7.2.6-os kernel, KVM bővítmény 8.3.4,
Felhom telepítő 1.29.0). A próba jegyzőkönyve: `documentation/audits/omv-vm-2026-10-15/README.md`.*
## Röviden (ezt lehet e-mailben elküldeni)
1. Tedd be a 16 GB memóriát, kapcsold be a BIOS-ban a virtualizációt (Intel VT-x), és **mentsd le a filmeket az NVMe-ről** — az NVMe-n minden törlődik.
2. Az OMV-ben telepítsd a `openmediavault-kvm` bővítményt, és csinálj egy hálózati hidat (`br0`). Utána az OMV **új címet kaphat**: `http://<gépnév>.local` vagy a router listája megtalálja.
3. Az OMV-ben szabadítsd fel az NVMe-t (megosztás, mappa, fájlrendszer le), majd töröld a lemezt („Gyors").
4. A KVM bővítményben csinálj egy `felhom` nevű gépet: 4 CPU, 12 GB memória, a teljes NVMe, a `br0` híd, a Felhom telepítő mint CD, automatikus indítás bekapcsolva.
5. Indítsd el, a telepítőben kövesd a szokásos Felhom útmutatót, és a párosító kód után szólj nekem.
---
## Mielőtt elkezded
**A) A memória.** Tedd be a 16 GB-ot. A Felhom gépe 12 GB-ot kap; az OMV-nek a maradék 4 GB bőven elég.
**B) A virtualizáció a BIOS-ban.** E nélkül a virtuális gép el sem indul.
1. Kapcsold be a gépet, és nyomd a BIOS gombját (a legtöbb mini PC-n **F2**, **F10** vagy **Del**; a gép az
indításkor kiírja).
2. Keresd az **Advanced** → **CPU Configuration** (vagy **Processor**, **Security**) menüt.
3. Az **Intel Virtualization Technology** (más néven **VT-x**) legyen **Enabled**.
4. Mentsd el (általában **F10**), és indítsd újra.
**C) Mentsd le a filmeket az NVMe-ről.** Az NVMe (`/dev/nvme0n1`, Samsung 980) **teljes egészében** a Felhomé lesz.
A rajta lévő minden fájl **törlődik**. Másold át a filmeket máshová (például a Toshiba lemezre vagy egy külső
lemezre), és nézd meg, hogy a másolat megnyílik-e. **Csak ezután menj tovább.**
**D) Mire lesz még szükséged:** az e-mail fiókod; a **Tulajdonosi jelmondat** (5 szó, tőlem kapod, telefonon);
egy monitor és billentyűzet a mini PC-hez arra az esetre, ha az OMV oldala eltűnne.
---
## 1. A KVM bővítmény telepítése (~2 perc)
1. Lépj be az OMV webes felületére.
2. **Rendszer → Bővítmények**.
3. A jobb felső keresőbe írd: `kvm`.
4. Kattints az **openmediavault-kvm** sorra (sárga lesz).
5. Kattints a **lefelé mutató nyílra** (Telepítés).
6. A kérdésnél pipáld be a **Megerősítés** négyzetet, majd **Igen**.
7. Várd meg a végét („END OF LINE"), majd **Bezárás**.
8. Frissítsd a böngészőt (**Ctrl + Shift + R**). Megjelenik a **Szolgáltatások → KVM** menü.
> A KVM bővítmény saját oldalai **angolul** vannak (VMs, Pools, ISOs …). Az útmutató ezeket a szavakat írja.
## 2. Egy tároló a telepítőnek (~1 perc)
1. **Szolgáltatások → KVM → Pools**.
2. **+** (Add new pool).
3. **Név:** `felhom` · **Típus:** Directory · **Path:** `/srv/felhom-iso`
4. **Hozzáadás**.
5. Jelöld ki a `felhom` sort, kattints az **Állapot** gombra, majd **Indítás**. (Alapból „Inactive"-ként jön létre.)
6. Ha megjelenik a sárga sáv („**Függő konfigurációs változások**"), kattints a jobb oldali **pipára** (Alkalmaz),
pipáld be a **Megerősítés** négyzetet, majd **Igen**.
## 3. A Felhom telepítő letöltése (~2 perc)
1. **Szolgáltatások → KVM → ISOs**.
2. Kattints a **Download ISO** gombra.
3. **Storage Pool:** `felhom`
4. **URL:** `https://iso.felhom.eu/felhom-installer-1.29.0-pve9.2-1.iso`
5. **Checksum:** `dceacae5da247d76cad065bf6c0d3bbefac8d8a5f8e571db2fd8449a97e94829`
6. **Letöltés**. A végén ezt kell látnod: „**Checksum OK.**" Ha nem ezt látod, szólj.
*(Ha addig újabb telepítő jelenik meg a `felhom.eu/letoltes` oldalon, akkor azt töltsd le, az ott írt ellenőrző
összeggel.)*
## 4. A hálózati híd — ez a kényes lépés (~5 perc)
A Felhom gépe csak egy **hídon** keresztül kerül a lakás hálózatára. A híd elkészítésekor az OMV hálózata újraindul,
és **az OMV-nek szinte biztosan új címe lesz**. Ez várható, nem hiba. Mielőtt elkezded:
- Nézd meg és **írd fel az OMV gépnevét** (a webes felület jobb felső sarkában látszik, például `omv-sim.internal`
— ebből a `omv-sim` rész a gépnév).
- Készítsd elő a monitort és a billentyűzetet.
Lépések:
1. **Hálózat → Interfészek**.
2. Jelöld ki a hálózati kártya sorát (például `enp1s0` vagy `eno1`), és kattints a **Törlés** gombra → **Igen**.
**Még NE kattints a sárga sáv pipájára.** (Amíg a kártyának saját beállítása van, a híd nem tudja használni.)
3. Kattints a **Létrehozás** (+) gombra, és válaszd a **Híd** lehetőséget.
4. **Interfészek:** válaszd ki a hálózati kártyát.
5. **IPv4 → Módszer:** **DHCP**. A többit hagyd üresen.
6. **Mentés**.
7. Most kattints a sárga sáv **pipájára** (Alkalmaz) → **Megerősítés** → **Igen**.
8. Az oldal a „Kérjük várjon…" feliratnál **megáll**. Ez várható: az OMV közben új címet kapott.
9. Várj 2 percet, majd nyisd meg: `http://<gépnév>.local` (például `http://omv-sim.local`).
Ha ez nem nyílik meg, nézd meg a routered eszközlistájában az OMV gépet és az új címét.
10. Lépj be újra. A **Hálózat → Interfészek** oldalon most egy `br0` sor van, rajta a cím.
**Ha az OMV oldala nem jön vissza** — lásd lent: „Ha valami nem megy", 1. pont.
> Ha Windows-on hálózati meghajtóként csatoltad az OMV megosztásait a régi címmel, azokat a gépnévvel csatold újra
> (`\\<gépnév>\...`).
## 5. Az NVMe felszabadítása (~3 perc)
**Ismét: ezután az NVMe-n lévő minden adat elveszik. Csak akkor kezdd el, ha a filmek máshol is megvannak.**
1. **Szolgáltatások → SMB/CIFS → Megosztások**: jelöld ki az NVMe-n lévő megosztás(oka)t → **Törlés** → **Igen**.
2. **Tárolás → Megosztott mappák**: jelöld ki az NVMe-n lévő mappá(ka)t → **Törlés** → **Igen**.
3. **Tárolás → Fájlrendszerek**: jelöld ki a `/dev/nvme0n1p1` sort → **Leválasztás** (a lecsatolás ikon) → **Igen**.
4. Sárga sáv **pipája** (Alkalmaz) → **Megerősítés** → **Igen**.
5. **Tárolás → Lemezek**: jelöld ki a `/dev/nvme0n1` sort (Samsung 980) → **Törlés** → pipáld be a
**Megerősítés** négyzetet → **Igen** → **Gyors**.
6. Várd meg a végét, majd **Bezárás**.
> Miért kell törölni? A virtuális gép először a lemezről próbál indulni. Ha a lemezen még ott a régi partíció, a gép
> megáll a „Booting from Hard Disk…" feliratnál, és a telepítő el sem indul. (A próbán pontosan ez történt.)
## 6. A Felhom virtuális gép (~5 perc)
1. **Szolgáltatások → KVM → VMs** → **Add new VM**.
2. Töltsd ki így (ami nincs a listában, azt hagyd, ahogy van):
| Mező | Érték |
|---|---|
| VM name | `felhom` |
| OS | Debian 13 (alapból ez) |
| UEFI | **üresen hagyni** (a próbán így működött) |
| CPUs | `4` |
| Memória | `12` GiB |
| Volume | Create new disk (alapból ez) |
| Pool | `felhom` |
| Méret | `1` Gigabytes *(ideiglenes lemez, a 4. lépésben töröljük)* |
| Optical disk | `/srv/felhom-iso/felhom-installer-1.29.0-pve9.2-1.iso` |
| Modell | **`bridge`** *(az alapértelmezett „virtio" NEM jó)* |
| Híd | `br0` |
3. **Mentés**.
4. Jelöld ki a `felhom` sort → **Hard disk** → **Add host disk**:
- **Disk:** a `/dev/disk/by-id/nvme-…` kezdetű sor. **Semmiképp ne a `/dev/sda` vagy a `/dev/sdb`** — az az OMV
saját lemeze, illetve a Toshiba.
- **Bus:** `virtio` (alapból ez).
- **Hozzáadás**.
5. Jelöld ki a `felhom` sort → **Hard disk** → **Remove disk** → válaszd a `vda :: /srv/felhom-iso/felhom_d1.qcow2`
sort → **Remove**.
6. Jelöld ki a `felhom` sort → **AutoStart** → **Engedélyezés**. (Így az OMV újraindítása után a Felhom magától elindul.)
## 7. A Felhom telepítése (~15 perc)
1. Jelöld ki a `felhom` sort → **Állapot** → **Indítás**.
2. Jelöld ki → **Console**. Megnyílik a gép képernyője a böngészőben. *(Ezt a gombot a próbán nem nyomtuk meg — a
képernyőt más úton néztük.)*
3. A telepítő képernyői angol nyelvűek. Ugyanúgy kell kitölteni, mint a szokásos Felhom útmutatóban:
| Képernyő | Mit csinálj |
|---|---|
| End User License Agreement | **I agree** |
| Target Harddisk | Hagyd: `/dev/vda` (kb. 465 GB) → **Next** |
| Country / Time zone / Keyboard | Hagyd: Hungary, Europe/Budapest, Hungarian → **Next** |
| Password / Confirm | Egy jelszó (a Felhom később lecseréli) |
| Email | **A saját e-mail címed** (a `mail@example.invalid`-ot nem fogadja el) |
| Hostname (FQDN) | `felhom.<a te domained>` (a tőlem kapott domain; az alapértelmezettet nem fogadja el) → **Next** |
| Summary | **Install** |
4. Kb. 4 perc után a gép magától újraindul. A CD-t nem kell kivenni.
5. A képernyőn megjelenik: „**Felhom — a doboz készen áll, és a párosításra vár. Párosító kód: …**"
Írd fel a kódot, és **szólj nekem**. Innen a szokásos útmutató 4–7. pontja jön (a „Kösd össze a Felhom dobozodat"
e-mail, a jelmondat, majd a „beállító kód" e-mail).
## 8. Amit tudni érdemes utána
- **Az OMV újraindítása:** a Felhom gépét az OMV szépen leállítja, és újraindulás után magától elindítja. A próbán
a Felhom vezérlőpultja kb. 2 perc múlva újra elérhető volt.
- **A Felhom memóriája:** a 12 GB-os gépen a Felhom alkalmazásai kb. 7,7 GB-ot kapnak. Ez elég egy háztartás
szokásos alkalmazásaihoz (fényképek nélkül bőven, a fényképkezelővel együtt szűkösen).
- **Mentések:** egy lemezen a Felhom a saját mentéseit ugyanarra a lemezre teszi. Ez véd a véletlen törlés és a hibás
fájlok ellen, de **nem véd az NVMe meghibásodása ellen**. Ezt a Felhom vezérlőpultja ki is írja. Ehhez kell egy
második meghajtó vagy a távoli mentés — ezt beszéljük meg.
- **Jellyfin (filmek):** egy lemezzel a Jellyfin telepítése most egy plusz lépést kér a vezérlőpulton (egy adattároló
kijelölését). **Ezt a hívás közben együtt csináljuk.** A Felhom Jellyfinje az OMV hálózati megosztását ma **nem**
tudja filmforrásként használni.
- **A Toshiba lemez** az OMV-nél marad. Ha később mégis a Felhomnak adnád, a **Bus** legyen **`sata`** (a `virtio`-t
a Felhom nem tudja biztonságosan azonosítani). A Felhom egy virtuális gépen belül nem látja a lemezek
állapotjelzőit (SMART) — azokat az OMV figyeli.
## Ha valami nem megy
1. **Az OMV oldala eltűnt a híd után, és a `<gépnév>.local` sem nyílik meg.**
- Várj még 2 percet, és nézd meg a router eszközlistáját.
- Monitorral: az OMV képernyőjén **régi cím is állhat** — erre ne hagyatkozz. Lépj be `root`-ként, és írd be:
`ip -br a` — a `br0` sor mutatja a valódi címet.
- Ha a `br0` sorban nincs cím: írd be `omv-firstaid`, és válaszd a hálózati interfész beállítását (a kártyát,
DHCP-vel). *(Ezt a próbán nem kellett használni, így nem ellenőriztük.)* Utána hívj.
2. **„Létrehozás → Híd"-nál üres az „Interfészek" lista.** A kártyának még van saját beállítása: előbb töröld a
kártya sorát (4. rész, 2. lépés), és csak utána csináld a hidat.
3. **A Felhom gép képernyője „Booting from Hard Disk…"-nál megáll.** A lemezen régi adat maradt. Állítsd le
(**Állapot → Force**), töröld a lemezt (5. rész, 5. lépés), majd indítsd újra.
4. **A „Hard disk" gomb szürke.** Lemezt csak kikapcsolt gépnek lehet adni vagy elvenni. Kapcsold ki a gépet.
Ha a Felhom már fut, a vezérlőpult „Kikapcsolás" gombjával — ez **indulás után 10 percig nem engedi**
(„A gép most indult el. 10 perc múlva kapcsolhatod ki."); ez szándékos.
5. **A pool „Inactive".** Jelöld ki → **Állapot** → **Indítás**.
6. **A telepítő nem enged tovább:** „Please enter a valid Email address" vagy „Hostname does not look like a valid
fully qualified domain name" → írd át az e-mail címet, illetve a gépnevet (7. rész táblázata).
7. **A Felhom vezérlőpultján a Jellyfin telepítése ezt írja: „a(z) "Médiatár útvonal" (HDD_PATH) mező kitöltése
kötelező".** Ez egy lemezes gépen várható. Ne próbálkozz tovább — hívj, együtt megcsináljuk.
8. **A virtuális gép el sem indul, és hibát ír a virtualizációról (KVM).** A BIOS-ban nincs bekapcsolva a VT-x
(„Mielőtt elkezded", B).
---
## Note for the operator (English)
**What worked:** the whole path, on an exact OMV 8.5.11-1 copy driven through its own web pages: the KVM plugin
installs in 1.5 min; the Felhom ISO downloads inside the plugin with its sha256; the VM boots our ISO with the
plugin's **default BIOS firmware**; the passed NVMe installs in < 4½ min; bind → ONLINE 1.5 min, and the box moved
itself to the floor (0.314.0); claim, Vaultwarden, a local whole-guest backup (645 MB) and per-app copy all work;
**OMV restart with Felhom running is clean** (the plugin shuts the guest down and AutoStart brings it back, dashboard
in 1 min 52 s). The Felhom guest gets **7.7 GB** of the 12 GB VM. **What did not / risks for Ferenc:** (1) the bridge
step **changes OMV's IP and hangs the page**, and OMV's own console text shows the old address — the guide sends him
to `<hostname>.local` or the router, with monitor steps as the fallback; (2) the plugin boots the disk first, so an
un-wiped NVMe **hangs the VM** — the guide wipes it; (3) the host-disk list **offers OMV's own system disk** next to
the NVMe — one wrong click destroys OMV; (4) **on one disk Jellyfin's install is refused with a raw field error**
(R-1068) — the dashboard's way out (register `/mnt/sys_drive`) is real in the code but was not pressed here, so do that
step with him on the call; (5) **Jellyfin cannot use the OMV films share** (network storage is browse-only by design,
R-108 → R-1071 for your decision); (6) Felhom inside a VM **sees no SMART** for the NVMe (R-1073) and a second disk on
the plugin's default `virtio` bus **cannot be formatted** by Felhom (R-1069; `sata` works); (7) one backup copy only, on
the same NVMe, until a second drive or off-site is added. Not checked: UEFI, the plugin's noVNC console page, the real
Samsung by-id name, `omv-firstaid`.