diff --git a/README.md b/README.md index e99e983..a9b6727 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ Dokumentation für die Infrastruktur eines privaten Homelabs mit öffentlich erreichbaren Webdiensten, einem WireGuard-Zugang und einem dedizierten KI-Server. Dieses Repository hält Architekturentscheidungen, den belegten Betriebsstand und Verfahren für Einrichtung, Betrieb und Sicherheitsabnahme fest. -> **Projektstand: 19.09.2026.** Die Dokumentationsrevisionen sind zusammengeführt. Mehrere Sicherheitsmaßnahmen und technische Abnahmen stehen noch aus. Der KI-Server ist derzeit ein frisch eingerichtetes Basissystem; sein LLM-Anwendungsstack soll in einem späteren Sprint mit Ansible installiert werden. +> **Projektstand: 20.09.2026.** Die Dokumentationsrevisionen sind zusammengeführt. Mehrere Sicherheitsmaßnahmen und technische Endabnahmen stehen noch aus. Auf dem KI-Server sind die gemeinsame Host-Baseline und Podman eingerichtet; der LLM-Anwendungsstack ist noch nicht installiert. ## Überblick @@ -26,7 +26,7 @@ Die drei vorgesehenen VPN-Netzwerkrollen sind **Familie** (gesamtes Heimnetz), * | Bereich | Belegter Stand | Nächster Nachweis oder Schritt | | --- | --- | --- | -| KI-Server | Debian-Basissystem, lesender Preflight, verifizierter `ansible-deploy`-Account und idempotent angewendete minimale Host-Baseline | Podman-Runtime als nächste getrennte Rolle planen und kontrolliert abnehmen | +| KI-Server | Debian-Basissystem, verifizierter Deployment-Zugang, minimale Host-Baseline und Podman 5.4.2 mit geprüftem Quadlet-Generator | Ausführungsmodell und Service-Accounts für Production und Testing festlegen; danach GPU-Laufzeit prüfen | | VPN | wg-easy v15.4.0 auf CT 105 aktiv; ein externer Laptop-Teiltest liegt vor | Rollenrechte serverseitig umsetzen und mit erlaubten sowie gesperrten Zielen testen | | Reverse Proxy | NPM auf CT 103 dokumentiert; Fail2Ban laut Betreiber fest gepinnt und wieder in Betrieb | Effektive Jails, Sperren und Wiederanlauf prüfen | | Identität | Keycloak/OIDC laut Betreiber produktiv für Vaultwarden | Öffentlich erreichbare Keycloak-Administration sperren und den OIDC-Login erneut prüfen | @@ -47,11 +47,11 @@ Der [Dokumentationsindex](docs/GNAI-000-DOC_Index.md) enthält die datierten Que | [Windows 11](docs/GNAI-006-SEC_VPN_Clients_Windows11.md) und [Linux](docs/GNAI-006-SEC_VPN_Clients_Linux.md) | Einrichtung und Nutzung auf Endgeräten | | [WireGuard-Implementation-Log](docs/GNAI-006-SEC_VPN_Implementation-Log.md) | Historie, Tests und Korrekturen früherer Befunde | | [Ansible-Deployment-Planung](docs/GNAI-007-PLAN_Ansible-Deployment.md) | nicht finaler Arbeitsentwurf zur reproduzierbaren Bereitstellung, Gitea-Integration und geplanten Folgedokumentation | -| [Ansible-Control-Projekt](ansible/README.md) | lokale Einrichtung, lesender Server-Preflight, Deployment-Account und gemeinsame Host-Baseline | +| [Ansible-Control-Projekt](ansible/README.md) | lokale Einrichtung, Preflight, Deployment-Account, Host-Baseline und Podman-Runtime | ## Arbeiten mit dem Repository -Dieses Repository enthält Dokumentation und ein Ansible-Control-Projekt. Es prüft Inventar, SSH-Zugang, Hostidentität, Betriebssystem und die dokumentierten GPUs. Eine erste gemeinsame Rolle verwaltet ausschließlich die Konfigurations- und Datenwurzeln für Production und Testing; der KI-Anwendungsstack ist noch nicht bereitgestellt. Vor einer Infrastrukturänderung den Ist-Stand am betroffenen Host prüfen, die passende Fachanleitung lesen und die dort genannten Abnahmeschritte dokumentieren. +Dieses Repository enthält Dokumentation und ein Ansible-Control-Projekt. Es prüft Inventar, SSH-Zugang, Hostidentität, Betriebssystem und die dokumentierten GPUs. Gemeinsame Rollen verwalten die Konfigurations- und Datenwurzeln sowie Podman und Quadlet. Images, Container und der KI-Anwendungsstack sind noch nicht bereitgestellt. Vor einer Infrastrukturänderung den Ist-Stand am betroffenen Host prüfen, die passende Fachanleitung lesen und die dort genannten Abnahmeschritte dokumentieren. WireGuard-Profile enthalten private Schlüssel. Sie gehören nicht in Git, Ausgaben oder freigegebene Dokumente. Das lokale Verzeichnis `docs/GNAI-006-profiles/` schließt Profil-Dateien über eine eigene `.gitignore` aus; es ist kein Verteiler- oder Backup-Ort für Zugangsdaten. diff --git a/ansible/README.md b/ansible/README.md index 73b13ac..5cf1f0d 100644 --- a/ansible/README.md +++ b/ansible/README.md @@ -138,3 +138,16 @@ inventory and supply the private deployment key outside the repository: Run the final command a second time. The second recap must report `changed=0` and `failed=0`; otherwise the role has not demonstrated convergence. + +## Podman runtime + +The shared host play also installs the Podman runtime from Debian 13. The role +requires systemd and cgroup v2, prepares `/etc/containers/systemd`, verifies the +overlay storage driver and exercises the installed Quadlet generator without +creating a workload. + +The role explicitly keeps the Podman API socket and automatic image-update +timer disabled. It pulls no image and does not yet choose rootful or rootless +execution for the two environments. Apply and check it through the same +`playbooks/host.yml` commands shown above. The first run may install packages; +an immediate second run must report `changed=0`. diff --git a/ansible/playbooks/host.yml b/ansible/playbooks/host.yml index 451e89c..e778e5e 100644 --- a/ansible/playbooks/host.yml +++ b/ansible/playbooks/host.yml @@ -10,3 +10,4 @@ roles: - role: host_baseline + - role: podman_runtime diff --git a/ansible/roles/podman_runtime/README.md b/ansible/roles/podman_runtime/README.md new file mode 100644 index 0000000..bcb3ea2 --- /dev/null +++ b/ansible/roles/podman_runtime/README.md @@ -0,0 +1,20 @@ +# Podman runtime + +The `podman_runtime` role installs and verifies the shared container runtime on +`ghostnet-ki`. + +The initial scope is intentionally limited: + +- install Podman from Debian 13 together with DNS and rootless-network helpers; +- require systemd and cgroup v2; +- create `/etc/containers/systemd` for future system Quadlets; +- keep the Podman API socket and automatic image-update timer disabled; +- verify Podman version, cgroup mode, the overlay storage driver and the + executable Quadlet generator; and +- run the Quadlet generator in dry-run mode without defining a workload. + +The role does not pull images or create Production and Testing containers. It +also does not yet +choose between rootful system Quadlets and separate rootless service accounts. +That decision belongs to the environment design because it affects GPU access, +filesystem ownership and deployment privileges. diff --git a/ansible/roles/podman_runtime/defaults/main.yml b/ansible/roles/podman_runtime/defaults/main.yml new file mode 100644 index 0000000..a457db4 --- /dev/null +++ b/ansible/roles/podman_runtime/defaults/main.yml @@ -0,0 +1,15 @@ +--- +podman_runtime_packages: + - podman + - aardvark-dns + - passt + - slirp4netns + - uidmap + +podman_runtime_minimum_major_version: 5 +podman_runtime_quadlet_directory: /etc/containers/systemd +podman_runtime_generator_path: /usr/lib/systemd/system-generators/podman-system-generator + +podman_runtime_disabled_units: + - podman.socket + - podman-auto-update.timer diff --git a/ansible/roles/podman_runtime/tasks/main.yml b/ansible/roles/podman_runtime/tasks/main.yml new file mode 100644 index 0000000..fb4eb63 --- /dev/null +++ b/ansible/roles/podman_runtime/tasks/main.yml @@ -0,0 +1,126 @@ +--- +- name: Verify the supported operating system and init system + ansible.builtin.assert: + that: + - ansible_facts["distribution"] == "Debian" + - ansible_facts["distribution_major_version"] == "13" + - ansible_facts["service_mgr"] == "systemd" + fail_msg: >- + The Podman runtime role currently supports only Debian 13 with systemd. + +- name: Read the host cgroup filesystem type + ansible.builtin.command: + argv: + - /usr/bin/stat + - -fc + - "%T" + - /sys/fs/cgroup + check_mode: false + changed_when: false + register: podman_runtime_cgroup_filesystem + +- name: Require cgroup v2 before installing Podman + ansible.builtin.assert: + that: + - podman_runtime_cgroup_filesystem.stdout == "cgroup2fs" + fail_msg: >- + Podman Quadlet requires cgroup v2, but /sys/fs/cgroup is not cgroup2fs. + +- name: Install the Podman runtime and rootless networking prerequisites + ansible.builtin.apt: + name: "{{ podman_runtime_packages }}" + state: present + update_cache: true + cache_valid_time: 3600 + install_recommends: false + +- name: Create the system Quadlet directory + ansible.builtin.file: + path: "{{ podman_runtime_quadlet_directory }}" + state: directory + owner: root + group: root + mode: "0755" + +- name: Keep the Podman API and automatic image updates disabled + ansible.builtin.systemd_service: + name: "{{ item }}" + enabled: false + state: stopped + loop: "{{ podman_runtime_disabled_units }}" + when: not ansible_check_mode + +- name: Inspect the installed Quadlet generator + ansible.builtin.stat: + path: "{{ podman_runtime_generator_path }}" + follow: true + register: podman_runtime_generator + when: not ansible_check_mode + +- name: Verify the installed Quadlet generator + ansible.builtin.assert: + that: + - podman_runtime_generator.stat.exists + - podman_runtime_generator.stat.isreg + - podman_runtime_generator.stat.executable + fail_msg: The Podman system generator is missing or not executable. + when: not ansible_check_mode + +- name: Read Podman runtime information + ansible.builtin.command: + argv: + - /usr/bin/podman + - info + - --format=json + changed_when: false + register: podman_runtime_info_command + when: not ansible_check_mode + +- name: Read the installed Podman version + ansible.builtin.command: + argv: + - /usr/bin/podman + - version + - --format=json + changed_when: false + register: podman_runtime_version_command + when: not ansible_check_mode + +- name: Parse Podman runtime information + ansible.builtin.set_fact: + podman_runtime_info: "{{ podman_runtime_info_command.stdout | from_json }}" + podman_runtime_version: "{{ podman_runtime_version_command.stdout | from_json }}" + when: not ansible_check_mode + +- name: Verify the Podman runtime + ansible.builtin.assert: + that: + - >- + podman_runtime_version["Client"]["Version"].split(".")[0] | int >= + podman_runtime_minimum_major_version | int + - podman_runtime_info["host"]["cgroupVersion"] == "v2" + - podman_runtime_info["store"]["graphDriverName"] == "overlay" + fail_msg: >- + Podman is installed, but its version, cgroup mode or storage driver does + not match the declared runtime baseline. + when: not ansible_check_mode + +- name: Exercise the Quadlet generator without defining a workload + ansible.builtin.command: + argv: + - "{{ podman_runtime_generator_path }}" + - --dryrun + environment: + QUADLET_UNIT_DIRS: "{{ podman_runtime_quadlet_directory }}" + changed_when: false + when: not ansible_check_mode + +- name: Report the verified Podman runtime + ansible.builtin.debug: + msg: + version: "{{ podman_runtime_version['Client']['Version'] }}" + cgroup_version: "{{ podman_runtime_info['host']['cgroupVersion'] }}" + storage_driver: "{{ podman_runtime_info['store']['graphDriverName'] }}" + quadlet_generator: "{{ podman_runtime_generator_path }}" + disabled_units: "{{ podman_runtime_disabled_units }}" + when: not ansible_check_mode diff --git a/docs/GNAI-000-DOC_Index.md b/docs/GNAI-000-DOC_Index.md index efdbe4e..5c17194 100644 --- a/docs/GNAI-000-DOC_Index.md +++ b/docs/GNAI-000-DOC_Index.md @@ -1,6 +1,6 @@ # Ghostnet.AI – Dokumentationsindex und Projektstand -**Stand:** 2026-09-19 +**Stand:** 2026-09-20 **Status:** Revisionen zusammengeführt; Sicherheitsumsetzung und technische Endabnahme offen ## 1. Dokumente und Zielgruppen @@ -18,7 +18,7 @@ | [GNAI-006-SEC_VPN_Clients_Linux.md](GNAI-006-SEC_VPN_Clients_Linux.md) | Debian, Arch/CachyOS, Fedora/Kinoite; Junior IT | | [GNAI-006-SEC_VPN_Implementation-Log.md](GNAI-006-SEC_VPN_Implementation-Log.md) | historische v14/v15-Umsetzung und Evidenzkorrekturen; Intermediate IT | | [GNAI-007-PLAN_Ansible-Deployment.md](GNAI-007-PLAN_Ansible-Deployment.md) | nicht finaler Arbeitsentwurf zum Ansible-/Gitea-Deployment und zur geplanten Folgedokumentation; Infrastrukturadministratoren und Mitwirkende | -| [Ansible-Control-Projekt](../ansible/README.md) | Control-Node, Preflight, Deployment-Account und gemeinsame Host-Baseline; Intermediate IT | +| [Ansible-Control-Projekt](../ansible/README.md) | Control-Node, Preflight, Deployment-Account, Host-Baseline und Podman-Runtime; Intermediate IT | ## 2. Verbindliche, bestätigte Entscheidungen @@ -32,9 +32,9 @@ Der KI-Server heißt laut lesendem SSH-Abgleich vom 18.09.2026 `ghostnet-ki`; di Die getrennten Schlüsselzugänge für `ghost` und `ghost-agent` wurden am 19.09.2026 erfolgreich getestet. Der persönliche Login wurde vom Betreiber interaktiv bestätigt; der Agentenlogin wurde technisch gegen Benutzername und Hostname geprüft. -Der KI-Server ist laut Betreiber frisch eingerichtet. Die LLM-Anwendungen sollen erst in einem späteren Sprint mit Ansible installiert werden. Bis dahin beschreiben GNAI-003 und GNAI-004 für diesen Host ein Zielbild; der lesende SSH-Abgleich betraf nur Basisbetrieb und Zugänge. +Der KI-Server wurde als frisches Debian-Basissystem begonnen. Inzwischen sind die dokumentierten Ansible-Zugänge, die minimale Host-Baseline und Podman eingerichtet. Die LLM-Anwendungen sind weiterhin nicht installiert; GNAI-003 und GNAI-004 beschreiben für sie ein Zielbild. -Der [Ansible-Deployment-Entwurf](GNAI-007-PLAN_Ansible-Deployment.md) persistiert den Planungsstand vom 19.09.2026. Er ist ausdrücklich keine verbindliche Spezifikation und kein Nachweis einer eingerichteten Deploymentkette. Die dort genannten Runner-, Account-, Freigabe- und Secret-Verfahren sind bis zu ihrer Prüfung und formalen Übernahme vorläufig. +Der [Ansible-Deployment-Entwurf](GNAI-007-PLAN_Ansible-Deployment.md) persistiert den seit dem 19.09.2026 fortgeschriebenen Planungs- und Implementierungsstand. Er ist ausdrücklich keine verbindliche Spezifikation und kein Nachweis einer vollständig eingerichteten Deploymentkette. Die dort genannten Runner-, Freigabe- und Secret-Verfahren sind bis zu ihrer Prüfung und formalen Übernahme vorläufig. Das erste Ansible-Control-Projekt mit Testing-Inventar und lesendem Preflight wurde am 19.09.2026 angelegt. Der Live-Lauf über `ghost-agent` bestätigte Hostidentität, Debian 13.6, IPv4-Adresse, Python, CPU, RAM und zwei Navi-21-Geräte mit `changed=0`, `unreachable=0` und `failed=0`. Dieser Nachweis umfasst weder privilegierten Zugriff noch eine eingerichtete Production-/Testing-Laufzeitumgebung. @@ -42,6 +42,8 @@ Der separate Ed25519-Schlüssel mit Fingerprint `SHA256:IKEInbIo8VVI1USg5+a3ypGK Die erste schreibende Rolle `host_baseline` wurde am 19.09.2026 nach erfolgreichem Syntax- und Check-Modus-Lauf angewendet. Sie prüft Hostname, Debian-Hauptversion, Standard-IPv4 sowie mindestens 100 GiB freien Speicher und verwaltet ausschließlich `/etc/ghostnet-ai/{production,testing}` und `/var/lib/ghostnet-ai/{production,testing,shared}` mit Root-Eigentum. Der erste reale Lauf meldete `ok=6 changed=1 unreachable=0 failed=0`; der unmittelbar folgende identische Lauf belegte Idempotenz mit `ok=6 changed=0 unreachable=0 failed=0`. Pakete, Dienste und Anwendungen wurden dabei nicht verändert. +Die Rolle `podman_runtime` wurde am 20.09.2026 angewendet. Sie installierte Podman 5.4.2 aus Debian 13 einschließlich expliziter DNS- und rootless Netzwerkvoraussetzungen, prüfte systemd, cgroup v2, Overlay-Storage und den Quadlet-Generator und legte `/etc/containers/systemd` an. `podman.socket` und `podman-auto-update.timer` werden deaktiviert und gestoppt gehalten. Der abschließende Gesamtlauf meldete `ok=20 changed=0 unreachable=0 failed=0`; eine getrennte Prüfung bestätigte leere Image- und Containerlisten sowie beide Units als `disabled` und `inactive`. + ## 3. Sicherheitsbefunde mit Priorität | Befund | dokumentiertes Verfahren / Status | @@ -75,4 +77,6 @@ Beim anschließenden Bootstrap wurden Benutzer, Home-/SSH-Verzeichnisse, `author Für die gemeinsame Host-Baseline bestätigte ein vorgelagerter Check-Modus genau sieben neu anzulegende Verzeichnisse und rund 1.677,7 GiB freien Platz auf `/`. Der anschließende reale Lauf legte die Verzeichniswurzeln an. Eine sofortige Wiederholung ergab `changed=0`; die Rolle konvergiert damit für ihren derzeitigen Umfang. Dieser Nachweis umfasst keine Paket-, Runtime-, GPU- oder Anwendungsinstallation. +Am 20.09.2026 sagte der Podman-Check-Modus 38 neue Debian-Pakete und das Quadlet-Verzeichnis voraus. Der reale Lauf installierte diese Pakete; seine erste Nachprüfung bewertete den Debian-Symlink des Quadlet-Generators irrtümlich nicht als reguläre Datei. Nach Korrektur der Ansible-`stat`-Prüfung auf das aufgelöste Ziel bestanden Podman 5.4.2, cgroup v2, Overlay-Storage und der Generator-Dry-Run. Der finale Gesamtlauf war mit `changed=0` idempotent. Es wurden weder Images geladen noch Container oder Anwendungsdienste angelegt. + Die WireGuard-Evidenz bleibt der Teiltest vom 12.09.2026: CachyOS-Laptop von WAN, Handshake, Ping auf Gateway/Proxmox und direkter IPv4-Internetpfad bestanden; KI-Server war ausgeschaltet. Neue Rollen, weitere Clientvarianten, Gateway-GUI-Zugriff, WAN-/IPv6-Isolation, Neustart und Restore sind noch nicht abgenommen. GNAI-006 ist erst nach Klärung der offenen Werte, Umsetzung und dokumentierter Abnahme technisch abgeschlossen. diff --git a/docs/GNAI-007-PLAN_Ansible-Deployment.md b/docs/GNAI-007-PLAN_Ansible-Deployment.md index f1fa574..0e264e1 100644 --- a/docs/GNAI-007-PLAN_Ansible-Deployment.md +++ b/docs/GNAI-007-PLAN_Ansible-Deployment.md @@ -2,12 +2,13 @@ **Dokumenten-ID:** GNAI-007-PLAN **Titel:** Ansible-Deployment für den KI-Server – Planungsstand -**Stand:** 2026-09-19 +**Stand:** 2026-09-20 **Status:** Nicht finaler Arbeitsentwurf zur Persistierung des aktuellen Planungsstands **Referenzen:** [Projektstand](GNAI-000-DOC_Index.md), [Zielarchitektur](GNAI-003-INFRA_Architecture.md), [Zugriffskonzept](GNAI-004-SEC_Access-Control.md) -> **Abgrenzung:** Dieses Dokument hält die Ergebnisse der Planungssession vom -> 19.09.2026 fest. Es ist weder eine freigegebene technische Spezifikation noch +> **Abgrenzung:** Dieses Dokument hält die Ergebnisse der am 19.09.2026 +> begonnenen und am 20.09.2026 fortgeschriebenen Planungssession fest. Es ist +> weder eine freigegebene technische Spezifikation noch > eine Installationsanleitung oder ein Nachweis über bereits umgesetzte > Komponenten. Entscheidungen, die noch geprüft oder bestätigt werden müssen, > sind ausdrücklich als vorläufig oder offen gekennzeichnet. @@ -25,6 +26,7 @@ | 2026-09-19 | 0.5 | spektr / Codex | technischen Schlüssel sowie Bootstrap- und Prüfplaybook für `ansible-deploy` vorbereitet; Ausführung bleibt interaktiv offen | | 2026-09-19 | 0.6 | spektr / Codex | `ansible-deploy` auf dem KI-Server eingerichtet und SSH-/sudo-Zugriff unabhängig erfolgreich verifiziert | | 2026-09-19 | 0.7 | spektr / Codex | minimale gemeinsame Host-Baseline mit Schutzprüfungen und getrennten Verzeichniswurzeln implementiert, angewendet und auf Idempotenz geprüft | +| 2026-09-20 | 0.8 | spektr / Codex | gemeinsame Podman-/Quadlet-Runtime implementiert, installiert und ohne Images oder Container verifiziert | --- @@ -65,11 +67,11 @@ aktuellen Plan nicht zum privilegierten Deployment-Account erweitert werden. Das Repository enthält inzwischen ein minimales Ansible-Control-Projekt mit Testing-Inventar, einem ausschließlich lesenden Preflight sowie Bootstrap- und Prüfplaybooks für `ansible-deploy`. Der privilegierte Deployment-Account ist -eingerichtet und verifiziert. Eine erste schreibende Rolle verwaltet die -gemeinsamen Konfigurations- und Datenwurzeln des Hosts; Anwendungsrollen und ein -Production-Inventar existieren noch nicht. Der Preflight selbst nahm keine -Änderungen vor; Bootstrap und Host-Baseline blieben auf die nachfolgend -dokumentierten Zugangs- und Verzeichniszustände begrenzt. +eingerichtet und verifiziert. Schreibende Rollen verwalten die gemeinsamen +Konfigurations- und Datenwurzeln sowie Podman und Quadlet. Anwendungsrollen und +ein Production-Inventar existieren noch nicht. Der Preflight selbst nahm keine +Änderungen vor; die bislang angewendeten Rollen bleiben auf die nachfolgend +dokumentierten Zugangs-, Verzeichnis- und Runtime-Zustände begrenzt. --- @@ -112,7 +114,7 @@ Planungsrichtung und noch nicht bestätigten Implementierungsdetails. | Thema | Aktueller Planungsstand | Verbindlichkeit / Nachweis | | --- | --- | --- | -| Konfigurationsmanagement | Ansible beschreibt Basissystem, Laufzeitumgebung, Dienste und Konfiguration | minimales Control-Projekt, lesender Preflight und angewendete erste `host_baseline` vorhanden; Runtime- und Anwendungsrollen fehlen noch | +| Konfigurationsmanagement | Ansible beschreibt Basissystem, Laufzeitumgebung, Dienste und Konfiguration | Control-Projekt, Preflight, `host_baseline` und `podman_runtime` vorhanden und angewendet; GPU- und Anwendungsrollen fehlen noch | | Quell- und Freigabeverfahren | Änderungen über Gitea-Branches und Pull Requests; kein regulärer Direkt-Push auf `main` | vorgesehen; Branch-Schutz noch nicht geprüft oder eingerichtet | | CI | Pull Requests erhalten Lint-, YAML- und Ansible-Syntaxprüfungen ohne produktive Zugangsdaten | vorgesehen; Workflow noch nicht vorhanden | | Produktionsausführung | Gitea Actions startet Ansible über eine dedizierte Production-Berechtigungsstufe | bevorzugte Lösung; Gitea-Version, Runner-Trennung und Actions-Funktion noch zu prüfen | @@ -532,7 +534,8 @@ nicht als Nachweis einer erfolgreichen Einrichtung. ### Phase D – KI-Laufzeit -- Podman und systemd-Integration; +- Podman- und Quadlet-Grundruntime eingerichtet und geprüft; konkretes + rootful/rootless Ausführungsmodell noch festzulegen; - AMD-GPU-/ROCm- oder alternative Laufzeit nach technischer Prüfung; - `llama.cpp` und lokaler Funktionstest; - Wiederanlauf nach geplantem Reboot prüfen. @@ -611,6 +614,8 @@ Herstellerdokumentationen herangezogen: - [Ansible Playbooks](https://docs.ansible.com/projects/ansible/latest/playbook_guide/playbooks_intro.html) - [Ansible Check- und Diff-Modus](https://docs.ansible.com/projects/ansible/latest/playbook_guide/playbooks_checkmode.html) - [Ansible Vault](https://docs.ansible.com/projects/ansible/latest/vault_guide/vault.html) +- [Debian 13 – Paket `podman`](https://packages.debian.org/trixie/podman) +- [Podman – Quadlet und systemd](https://docs.podman.io/en/latest/markdown/podman-systemd.unit.5.html) Vor der Implementierung sind versionsspezifische Aussagen gegen die dann tatsächlich eingesetzten Gitea-, Runner- und Ansible-Versionen zu prüfen. @@ -689,21 +694,42 @@ Lauf endete mit `ok=6 changed=0 unreachable=0 failed=0` und belegt die Idempotenz des aktuellen Rollenumfangs. Es wurden keine Pakete installiert und keine Dienste, Container oder GPU-Komponenten verändert. +Am 20.09.2026 wurde `podman_runtime` in das gemeinsame Host-Playbook +aufgenommen. Die Rolle installiert `podman`, `aardvark-dns`, `passt`, +`slirp4netns` und `uidmap` ohne empfohlene Build- und Checkpoint-Pakete. Sie +verlangt Debian 13, systemd und cgroup v2, verwaltet +`/etc/containers/systemd`, prüft mindestens Podman-Hauptversion 5 sowie den +Overlay-Storage und führt den Quadlet-Generator ohne Workload im Dry-Run aus. +Der API-Socket und der automatische Image-Update-Timer bleiben explizit +deaktiviert und gestoppt. + +Der Check-Modus sagte 38 neue Pakete und das Quadlet-Verzeichnis voraus. Im +ersten realen Lauf wurden die Pakete installiert; die anschließende +Generatorprüfung schlug fehl, weil der Generator in Debian als Symlink +bereitgestellt wird und die `stat`-Prüfung das Ziel zunächst nicht auflöste. +Nach der Korrektur auf `follow: true` bestanden sämtliche Laufzeitprüfungen. +Der finale Gesamtlauf endete mit +`ok=20 changed=0 unreachable=0 failed=0`. Verifiziert wurden Podman 5.4.2, +cgroup v2, der Storage-Treiber `overlay` und der ausführbare Quadlet-Generator. +Eine getrennte Prüfung bestätigte außerdem leere Image- und Containerlisten +sowie `podman.socket` und `podman-auto-update.timer` jeweils als `disabled` und +`inactive`. + --- ## 15. Abschlussgrenze dieses Entwurfs -Mit Version 0.7 sind der aktuelle Planungsstand, der ausdrücklich begrenzte +Mit Version 0.8 sind der aktuelle Planungsstand, der ausdrücklich begrenzte Ansible-Preflight, der verifizierte Deployment-Account und die angewendete -minimale Host-Baseline persistiert. +minimale Host-Baseline sowie die Podman-/Quadlet-Grundruntime persistiert. Insbesondere wurden noch nicht: - ein Gitea Runner angelegt, - Gitea Actions oder Schutzregeln konfiguriert, -- Runtime- oder Anwendungsrollen, ein Production-Inventar oder ein Vault erstellt, +- GPU- oder Anwendungsrollen, ein Production-Inventar oder ein Vault erstellt, - eine Production- oder Testing-Umgebung eingerichtet oder voneinander abgenommen, -- Pakete oder Anwendungen auf dem KI-Server installiert, +- GPU-Komponenten oder Anwendungen auf dem KI-Server installiert, - Backups oder Rollbacks praktisch getestet oder - die geplante Deploymentkette technisch abgenommen.