--- /dev/null
+{% if grains['id'] == 'dom0' %}
+
+llm--configure-qube-firewall:
+ cmd.run:
+ - name: |
+ qvm-firewall q-llm reset
+ qvm-firewall q-llm del accept
+ qvm-firewall q-llm add accept specialtarget=dns
+ qvm-firewall q-llm add accept proto=icmp
+ qvm-firewall q-llm add accept ghcr.io proto=tcp
+ qvm-firewall q-llm add accept pkg-containers.githubusercontent.com proto=tcp
+ qvm-firewall q-llm add accept openrouter.ai proto=tcp
+ qvm-firewall q-llm add drop
+
+{% elif grains['id'] == 'q-llm' %}
+
+{% set username = 'user' %}
+{% set container_name = 'open-webui' %}
+{% set service_file_dir = '/home/' ~ username ~ '/.config/systemd/user/' %}
+{% set service_file = '/home/' ~ username ~ '/.config/systemd/user/container-' ~ container_name ~ '.service' %}
+{% set userid = salt['user.info'](username).uid %}
+{% set quadlet_file_dir = '/home/' ~ username ~ '/.config/containers/systemd/' %}
+{% set quadlet_file_path = quadlet_file_dir ~ container_name ~ '.container' %}
+
+{% set xdg_runtime_dir = '/run/user' + userid | string %}
+
+llm--create-quadlet-dir:
+ file.directory:
+ - name: /home/{{ username }}/.config/containers/systemd/
+ - user: {{ username }}
+ - group: {{ username }}
+ - makedirs: True
+
+llm--deploy-quadlet-file:
+ file.managed:
+ - name: /home/{{ username }}/.config/containers/systemd/open-webui.container
+ - contents: |
+ [Unit]
+ Description=Open WebUI container managed by Podman
+
+ [Container]
+ Image=ghcr.io/open-webui/open-webui:ollama
+ PublishPort=3000:8080
+ Volume=ollama:/root/.ollama
+ Volume=open-webui:/app/backend/data
+
+ [Service]
+ Restart=always
+ TimeoutStartSec=1800
+
+ [Install]
+ WantedBy=default.target
+ - user: {{ username }}
+ - group: {{ username }}
+ - mode: 644
+ - require:
+ - file: llm--create-quadlet-dir
+
+llm--enable-linger:
+ cmd.run:
+ - name: loginctl enable-linger user
+ - unless: loginctl show-user user | grep Linger=yes
+
+llm--reload-user-daemon:
+ cmd.run:
+ - name: |
+ systemctl --user daemon-reload
+ - runas: {{ username }}
+ - env:
+ - XDG_RUNTIME_DIR: /run/user/1000
+ - DBUS_SESSION_BUS_ADDRESS: unix:path=/run/user/1000/bus
+ - require:
+ - cmd: llm--enable-linger
+
+{% endif %}
--- /dev/null
+{% if grains['id'] == 'dom0' %}
+
+llm--create-qube:
+ qvm.vm:
+ - name: q-llm
+ - present:
+ - template: template-llm
+ - label: orange
+ - prefs:
+ - label: orange
+ - audiovm:
+ - guivm: dom0
+ - netvm: sys-vpn-mullvad
+ - memory: 4000
+ - maxmem: 8000
+ - vcpus: 4
+ - features:
+ - set:
+ - menu-items: xterm.desktop org.mozilla.firefox.desktop
+ - service:
+ - enable:
+ - shutdown-idle
+ - require:
+ - qvm: llm--create-template
+
+llm--extend-private-storage:
+ cmd.run:
+ - name: qvm-volume extend q-llm:private 10737418240
+
+{% endif %}
--- /dev/null
+{% import "templates/versions.jinja" as version %}
+
+include:
+ - templates.templates--install-fedora-minimal
+
+{% if grains['id'] == 'dom0' %}
+
+llm--create-template:
+ qvm.clone:
+ - name: template-llm
+ - source: fedora-{{ version.fedora }}-minimal
+ - class: TemplateVM
+ - require:
+ - qvm: templates--install-fedora-{{ version.fedora }}-minimal
+
+llm--create-template-prefs:
+ qvm.prefs:
+ - name: template-llm
+ - label: orange
+ - netvm:
+ - audiovm:
+ - guivm:
+ - require:
+ - qvm: llm--create-template
+
+{% endif %}