Skip to content

Software Architecture

This page describes the software layer design. For hardware architecture, see Hardware Architecture.

System Design

graph TB
    subgraph Host["Ubuntu Server Host"]
        SSH[SSH Access]
        KVM[KVM/QEMU/libvirt]
        Docker[Docker Engine]
    end

    subgraph Storage["ZFS Pool (tank)"]
        Media[tank/media]
        NC[tank/nextcloud-data]
        DB[tank/db]
        VM[tank/vm]
    end

    subgraph VMs["Virtual Machines"]
        Win11[Windows 11 VM]
        LinuxVM[Linux Desktop VM]
    end

    subgraph Services["Docker Services"]
        Plex[Plex]
        Nextcloud[Nextcloud]
    end

    GPU[AMD GPU] --> Win11
    KVM --> VMs
    Docker --> Services
    Services --> Storage
    VMs --> Storage

High-Level Goals

Host OS is Boring

  • Ubuntu Server LTS
  • No desktop environment
  • SSH-only management

Data Lives Outside Containers

  • ZFS is the source of truth
  • Containers are disposable
  • Bind mounts for all persistent data

Virtual Machines are First-Class

  • KVM/QEMU on the host
  • GPU passthrough for Windows/Linux VMs
  • No containers around virtualization

Services are Containerized

  • Docker + Compose
  • Bind mounts into ZFS datasets
  • Config and data separated

Everything is Recoverable

  • Reinstall host without touching data
  • ZFS snapshots for point-in-time recovery
  • Backups for disaster recovery

Component Separation

Layer Responsibility Technology
Hardware Physical resources MS-S1 MAX
Host OS Networking, virtualization Ubuntu Server
Storage Data persistence ZFS
Compute (VM) Full OS workloads KVM/QEMU
Compute (Container) Services Docker

Display Model

The HDMI output is owned by the VM, not the host:

  • GPU is passed through to Windows VM
  • Monitor connects directly to GPU
  • Host is managed over SSH
  • VNC/RDP/SPICE are admin tools only

Info

Once GPU passthrough is enabled, the GPU may no longer be available to the host console.