[{"content":"Der Desktop läuft mit CachyOS und Hyprland auf einer NVIDIA-Karte, drei Monitore. Windows-Spiele laufen über Lutris, nicht über Steam; Steam ist nur für native Linux-Spiele wie Dota 2 da.\nDer Stack Lutris als Bibliothek, mit umu als Launcher und proton-cachyos als Proton-Build — das CachyOS-Paket, wird also mit dem System aktualisiert. ntsync ist ab Werk aktiv (CachyOS-Kernel), also kein Gebastel mit esync/fsync. VRR nur für Vollbildfenster. Die Bibliothek ist in zwei Lutris-Kategorien aufgeteilt, Flat und VR — die VR-Seite hat eine eigene Seite. Ein Workspace pro Spiel Jedes umu/Proton-Spiel bekommt die Fensterklasse steam_app_default, echte Steam-Spiele steam_app_\u0026lt;id\u0026gt;. Eine Hyprland-Regel für beide macht jedes Spiel zum Vollbild; eine zweite nimmt Launcher und Installer aus, damit die im Fenster bleiben.\nDazu gibt ein kleiner Lua-Handler in meiner Hyprland-Config jedem Spielstart einen eigenen, frischen Workspace auf dem mittleren Monitor. Wird das Spiel beendet, verschwindet der Workspace mit ihm. Zwei Spiele landen nie übereinander, und keine Regel pro Spiel ist nötig.\nDer Haken sind native Linux-Spiele über Steam: Die behalten ihre eigene Fensterklasse (Dota 2 heißt wirklich dota2). Aber Steam setzt SteamAppId in die Umgebung von allem, was es startet, also liest der Handler auch /proc/\u0026lt;pid\u0026gt;/environ und erwischt die ebenfalls.\nInstallieren per Rechtsklick Ein install-game-Skript erledigt alles in einem Rutsch: entpacken, Lutris-Eintrag anlegen, das Spiel auf lutris.net für das Cover suchen, Launcher-Eintrag erstellen, in die Streaming-Liste aufnehmen. Es steckt im Rechtsklickmenü des Dateimanagers auf Spielarchiven. uninstall-game auf einem Spielordner entfernt alles wieder und meldet den freigegebenen Platz.\nWas ich auf die harte Tour gelernt habe: Lutris schreibt seine Datenbank beim Beenden neu. Jedes Skript, das die Datenbank bearbeitet, muss Lutris vorher schließen, sonst stellt Lutris die alten Einträge still wieder her.\nDie Battle.net-Ecke WoW, Hearthstone und Battle.net teilen sich ein Prefix, und Battle.net ist der zickigste Teil des Setups:\nTray-Icon. Wine-Apps nutzen alte XEmbed-Tray-Icons; meine Leiste spricht nur das neuere StatusNotifier-Protokoll. xembedsniproxy überbrückt das. Es darf genau eine Instanz laufen. Es beendet sich nie richtig. Schließt man Battle.net über das Tray, läuft der Update-Agent weiter und hält das Prefix am Leben — und das nächste Spiel, das in diese Session startet, bekommt eine Fake-GPU. Ein Post-Exit-Hook in Lutris fährt das Prefix jetzt sauber herunter. Es ist bei jedem Start einmal abgestürzt. Ein altes --runonstartup-Argument aus dem Lutris-Installskript hat das nächste Argument verschluckt. Es zu löschen hat einen Absturzdialog behoben, den ich wochenlang weggeklickt hatte. WoW-Region. Meine Spieldateien sind der EU-Build. \u0026ldquo;Spiel suchen\u0026rdquo; hat sie abgelehnt; \u0026ldquo;Installieren\u0026rdquo; mit dem vorhandenen Ordner als Ziel hat sie übernommen und nur die Differenz gepatcht. WoW-Beta. Manuell gestartet mit PROTON_VERB=run — das Standard-Verb hängt, solange Battle.net das Prefix belegt. Außerdem hat sie beim Betreten der Welt die GPU aufgehängt, bis ich es mit dem niedrigsten Grafik-Preset versucht und danach hochgedreht habe. Hearthstone verliert manchmal die Rechte an seinem eigenen Spielordner. Ein einzeiliges chmod als Lutris-Pre-Launch-Befehl behebt das vor jedem Start. Fixes pro Spiel, die man kennen sollte Binding of Isaac hat meinen Controller doppelt erkannt und die Sticks vertauscht. Das doppelte DirectInput-Gerät in der Registry des Prefix zu deaktivieren hat es behoben. dinput8 komplett abzuschalten nicht — dann startet das Spiel gar nicht. Dota 2 läuft nativ über Steam, mit Minify für Mods und Kosmetik. Streaming ins Wohnzimmer Auf dem Desktop läuft Sunshine (nur gestartet, wenn ich es brauche), im Wohnzimmer Moonlight.\nBeim Streamstart schaltet ein Skript die beiden äußeren Monitore ab und stellt den mittleren auf 60 Hz. Danach kommt das volle Layout zurück. Der Stream bleibt in nativer Auflösung, Sunshine skaliert ihn für den Fernseher herunter. Mein Hauptmonitor kann gar keine niedrigere Auflösung darstellen, und Spiele in nativer Auflösung sehen gestreamt und lokal gleich aus. Jedes Lutris-Spiel steht mit Cover in Sunshines App-Liste. Ein kleiner Wrapper hält Sunshine am laufenden Spiel fest, damit \u0026ldquo;App beenden\u0026rdquo; in Moonlight es auch wirklich schließt. Die Wohnzimmer-Kiste Ein eigener Mini-PC mit Bazzite im Gaming Mode, komplett per Controller bedient:\nBootet direkt in eine Bibliothek mit genau drei Kacheln. Dafür brauchte es ein Decky-Plugin für die Tab-Reihenfolge und ein kleines Skript, das Steams Oberfläche nach dem Laden über den Debug-Port navigiert. YouTube ist die echte TV-App (youtube.com/tv) in einem Kiosk-Firefox mit Smart-TV-User-Agent und Werbeblocker, per eigenem Steam-Input-Layout auf den Controller gelegt. Der Xbox-Controller weckt sie aus dem Standby. Nachtmodus-Audio: eine PipeWire-Filterkette mit Kompressor, damit Explosionen nicht springen und Dialoge bei niedriger Lautstärke verständlich bleiben. Links und rechts sind vertauscht, weil die Soundbar hinter der Couch steht. ","permalink":"https://mariusladner.dev/de/setup/gaming/","summary":"Wie ich Windows-Spiele unter Linux spiele: Lutris und umu statt Steam, ein Workspace pro Spiel, Battle.net und Streaming ins Wohnzimmer.","title":"Linux-Gaming"},{"content":"Ich habe mir eine Quest 3 geholt und wollte PC-VR unter Linux ohne SteamVR. Es funktioniert — besser als erwartet.\nDer Stack WiVRn — Streaming-Server auf dem PC, Client-App auf der Quest. Läuft über WLAN oder USB-Kabel; ich nutze das Kabel. xrizer — übersetzt für Spiele, die OpenVR sprechen (die SteamVR-API), nach OpenXR. Spiele, die nativ OpenXR sprechen, brauchen es nicht und reden direkt mit WiVRn. Lutris + umu + Proton — wie bei meinen normalen Spielen. Kein Steam, kein SteamVR, kein ALVR. Die Kette ist entweder Spiel → Proton → xrizer → WiVRn → Headset oder, bei OpenXR-Spielen, Spiel → Proton → WiVRn → Headset.\nWas läuft Spiel API Hinweise Half-Life: Alyx OpenVR → xrizer Braucht das Startargument -vr. Texturspeicher eine Stufe unter Maximum, sonst geht der VRAM aus. Vertigo 2 OpenVR → xrizer Das erste Spiel, das ich über das Lutris-Setup zum Laufen bekommen habe. Gunman Contracts OpenVR → xrizer Läuft einfach. Wanderer: The Fragments of Fate OpenXR Beim benutzerdefinierten Grafik-Preset bleiben — das höchste Preset lässt die GPU abstürzen. Skydance\u0026rsquo;s BEHEMOTH OpenXR Braucht das Startargument -steam, sonst versucht es die Oculus-Lizenzprüfung und beendet sich. Ghost Town VR OpenXR Der Ton muss einmal aufs Headset geleitet werden (siehe unten). SpaceEngine OpenVR → xrizer VR ist eine Einstellung in der Config, kein Startargument. Das Arbeitsverzeichnis muss der Spielordner sein. Resident Evil 7 OpenXR (Mod) Normales Spiel + REFramework-VR-Mod. Muss unter DX11 laufen. Normale Spiele in VR: Resident Evil 7 REFramework lädt sich als dinput8.dll, die das Spiel selbst lädt — kein Injector nötig. Unter Linux braucht es dafür nur WINEDLLOVERRIDES=dinput8=n,b. Die openvr_api.dll der Mod löschen, dann nutzt sie OpenXR direkt zu WiVRn.\nDas Spiel auf DX11 umstellen. Und die Option \u0026ldquo;force anti-aliasing\u0026rdquo; der Mod ausschalten: Die RE Engine rendert manche Effekte in halber Auflösung als Dither-Muster und braucht TAA, um das zu glätten — ohne liegt über allem ein feines Schachbrettmuster.\nStandalone auf der Quest The Simpsons: Hit \u0026amp; Run — ein Fan-Port, der direkt auf der Quest läuft. Die eigenen Spieldateien kommen aufs Headset. Sie müssen unverändert sein: Ist ein Mod-Launcher vorinstalliert, muss der vorher raus.\nDesktop im Headset wayvr holt meinen Linux-Desktop als schwebende Fenster ins Headset, und WiVRn startet es automatisch. Praktisch, um kurz etwas nachzusehen, ohne das Headset abzunehmen.\nZuschauen auf der Leinwand Im Wohnzimmer kann jeder mitschauen: Sunshine auf dem PC streamt den Desktop (mit dem Spiegelfenster des Spiels) an Moonlight auf dem Wohnzimmer-PC und den Beamer.\nDer Haken ist der Ton. Sunshine macht beim Streamstart sein eigenes Audiogerät zum Standard, Spiele folgen dem Standard, und im Headset ist es still. Die Lösung: den Ton des Spiels an Headset und Stream gleichzeitig leiten — WirePlumber merkt sich das pro Spiel.\nWas (noch) nicht läuft HITMAN 3 — braucht eine OpenVR-Funktion (GetPosesForFrame), die xrizer, OpenComposite und VapoR alle nicht implementieren. Es gibt einen experimentellen xrizer-Branch; den im Auge behalten. Hogwarts Legacy über UEVR — die Mod lädt, aber es kommt nie ein Bild im Headset an. DX12 ist die Mauer. Die Einstellungen, die zählen Prüfen, welche API ein Spiel nutzt, bevor man es einrichtet: openvr_api.dll im Spielordner heißt OpenVR (→ xrizer); eine openxr_loader.dll und kein OpenVR heißt natives OpenXR (→ kein xrizer). Den Encoder in WiVRn explizit auf nvenc stellen. Auf auto hat er einen Software-Encoder gewählt, und alles war schwarz. gamescope: false für VR-Spiele in Lutris, sonst landet das Spiel in einem verschachtelten Compositor und kommt nie im Headset an. PRESSURE_VESSEL_IMPORT_OPENXR_1_RUNTIMES=1, damit das Spiel WiVRn aus Protons Container heraus sieht. XR_RUNTIME_JSON nicht auf einen Host-Pfad setzen. Die echte exe starten. Unreal-Spiele haben oft einen kleinen Launcher im Hauptordner; Lutris stattdessen auf ...-Win64-Shipping.exe zeigen lassen. Den Firewall-Port öffnen (9757) für WLAN. Das Headset findet den PC per mDNS und wartet dann ewig, wenn der Port blockiert ist. Über USB ist das egal. Kein Ton im Headset? Der Ton des Spiels ist auf dem Standardausgang gelandet. Einmal auf wivrn.sink verschieben (pactl move-sink-input), WirePlumber merkt es sich. Auf den VRAM achten. Ein großes Spiel plus WiVRns Encoder plus der Desktop füllen die Grafikkarte schnell; das zeigt sich als Textur-Glitches und Ruckeln, nicht als Fehlermeldung. Automatisches Hand-Tracking ausschalten auf der Quest, sonst verschwinden die Hände, sobald sie von Controllern auf Hände umschaltet. Auf der Liste Blade \u0026amp; Sorcery, Red Matter 2, Into the Radius 2 und The Room VR sind installiert, aber noch nicht getestet.\n","permalink":"https://mariusladner.dev/de/setup/vr/","summary":"Quest 3 unter Linux ohne SteamVR: WiVRn, xrizer und Proton. Was läuft, was nicht und welche Einstellungen zählen.","title":"PC-VR unter Linux"},{"content":"Das ganze Homelab ist ein kleiner Büro-Mini-PC mit Ubuntu 24.04 und rund 40 Docker-Containern. System und Datenbanken liegen auf der internen SSD, Medien und große Daten auf einer USB-Festplatte.\nDas eigentliche Limit ist der RAM — der ist komplett belegt, und der Swap ist voller kalter Seiten. Also gilt: nichts Schweres. Ich habe mir mal angeschaut, GitLab selbst zu hosten; das allein bräuchte die halbe Maschine. Code bleibt auf GitHub.\nWie es organisiert ist Ein Compose-Stack pro App in /opt/docker/stacks, Daten in /opt/docker/appdata/\u0026lt;app\u0026gt;. Arcane ist die Web-UI für alles — Deployments, Logs, Image-Updates. Eine Falle: Arcane setzt beim Deployen globale Variablen ein, die in seiner eigenen Datenbank liegen, nicht in einer .env. Wer docker compose up von Hand startet, bekommt stillschweigend leere Strings. Traefik vor allem, mit einem Wildcard-Zertifikat von Let\u0026rsquo;s Encrypt über Cloudflare-DNS. Jede App heißt appname.mariusladner.dev — volle Namen, keine Abkürzungen, keine Ausnahmen. AdGuard Home ist DNS- und DHCP-Server im Netz. Es löst *.mariusladner.dev lokal auf den Server auf, und feste Leases kommen über seine API dazu. Fernzugriff läuft über Twingate, dazu ein Cloudflare Tunnel für die wenigen Dinge, die auch ohne funktionieren müssen. Glance ist das Dashboard: ein Bildschirm, kein Scrollen. Dienststatus, Download-Queue, was bald kommt, was neu dazugekommen ist. Beszel für Server-Statistiken, ntfy für Push-Benachrichtigungen, Cronmaster für Cronjobs mit Logs, die man auch lesen kann. Wartung, die von selbst läuft Täglich um 6:05 Updates — unbeaufsichtigtes apt-Upgrade. Ist Docker selbst dabei, startet das Skript jeden Container neu, der den Docker-Socket einbindet — die würden sonst an einem toten Socket hängen und still aufhören, Änderungen zu sehen. Täglich: alle Compose-Dateien und Configs gehen in ein privates GitHub-Repo. Wöchentlich: appdata wird auf die USB-Platte gespiegelt. Image-Updates über Arcane. Gelernt: Wenn eine App \u0026ldquo;Update verfügbar\u0026rdquo; meldet, der Updater aber \u0026ldquo;keine Änderung\u0026rdquo;, ist meistens der Tag tot — Immich hat seinen v2-Tag mit v3 eingefroren, und Jellyseerr ist zu einem neuen Projekt (Seerr) umgezogen, während das alte Image einfach keine Builds mehr bekam. Was darauf läuft Medien Jellyfin für Filme und Serien, mit Hardware-Transcoding und Tone-Mapping auf der iGPU. Seerr für Wünsche, Sonarr und Radarr zum Verwalten, Prowlarr für Indexer, SABnzbd zum Laden, Recyclarr für Qualitätsprofile. UmlautAdaptarr, damit deutsche Titel mit Umlauten auch gefunden werden. Bazarr für Untertitel — Englisch und Deutsch, vollständig und forced. Gesehene Filme werden ein paar Tage nach dem Anschauen automatisch aufgeräumt (Favoriten bleiben). Radarr hört auf, einen Film zu überwachen, sobald die Datei weg ist, damit er nicht erneut geladen wird. Comics Komga zum Lesen, Komf für Metadaten, Kapowarr für neue Ausgaben. Ein Ordner pro Reihe, benannt Series (year), die Dateien direkt darin. Einen Comic hinzuzufügen ist ein Claude-Code-Skill: \u0026ldquo;füg den Comic aus meinen Downloads hinzu\u0026rdquo;, und er landet im richtigen Ordner mit den richtigen Rechten.\nAlles andere Immich — Fotos. Vaultwarden — Passwörter. Paperless-ngx — Dokumente mit OCR, mit Mail-Eingang aus Gmail. Dawarich — mein eigener Standortverlauf statt dem von Google. Movary — Filmtagebuch. BentoPDF — PDF-Werkzeuge, die nichts irgendwohin hochladen. Home Assistant Fünf Dashboards im gleichen Layout: drei Spalten, jede mit Überschrift, Hauptsteuerung, Einstellungen, Automationen und einem Graphen. Das Terrarium meines Geckos: Das Licht folgt Sonnenauf- und -untergang, ein Regensystem sprüht jeden Abend nach dem Lichtausschalten, und ein Watchdog schaltet die Pumpe ab, falls sie je länger als drei Minuten läuft — egal, wer sie eingeschaltet hat. Hundespaziergänge: Ein GPS-Tracker am Hund plus unsere Handys beantworten \u0026ldquo;wie lange war er draußen, und mit wem\u0026rdquo; — wessen Handy dem Tracker am nächsten ist, war mit ihm draußen. Eine nächtliche KI-Zusammenfassung fasst den Tag zusammen. Fitnessdaten von meinem Tracker über die Google-Health-Integration. Steckdosen, Lampen und Sensoren in der Wohnung. Das WLAN-Problem Der Server hängt am WLAN. Das Band Steering des Routers hat ihn ständig zwischen 2,4 und 5 GHz hin und her geschoben — Hunderte Wechsel in ein paar Tagen, Downloads mit einem Viertel der Geschwindigkeit. Jetzt bevorzugt er 5 GHz mit Rückfall auf 2,4, in einer handgeschriebenen wpa_supplicant-Config (netplan kann für ein Netz keine zwei Prioritäten), plus ein Watchdog, der die Verbindung neu startet, wenn sie abbricht. Da der Server auch der DNS im Netz ist, hat bei einem Abbruch die ganze Wohnung kein DNS.\nClaude auf dem Server Auf dem Server läuft außerdem Claude Code im Remote-Control-Modus als Dienst. Vom Handy aus kann ich dort eine Session starten und etwas prüfen oder reparieren lassen, während ich mit dem Hund unterwegs bin. Es gibt ein striktes Regelwerk: keine Netzwerkänderungen, keine Neustarts, niemals den Watchdog des Geckos anfassen.\nWas ich gelernt habe Verhalten prüfen, nicht die Config. Traefik hatte monatelang eine Weiterleitungsregel, die auf nichts gepasst hat, während das Dashboard sie als aktiv anzeigte. Mit curl testen. Leerlauf heißt nicht ungenutzt. FlareSolverr loggt nichts und wirkt tot — aber Kapowarr braucht es, und dessen Compose-Stack startet ohne es gar nicht. Nutzung über DNS messen. Traefik hat hier keine Access-Logs, aber AdGuards Query-Log zeigt, welche Apps wirklich benutzt werden — sobald man die Health-Checks des Dashboards herausfiltert. ","permalink":"https://mariusladner.dev/de/setup/homelab/","summary":"Ein Mini-PC, rund 40 Container: wie es organisiert ist, was darauf läuft und was es am Leben hält.","title":"Homelab"},{"content":"Ich arbeite in der IT als Sysadmin, meistens mit Ansible. Zu Hause betreibe ich ein kleines Homelab auf einem Mini-PC (Docker, Traefik, Home Assistant, Immich, Jellyfin und Co.), einen Hyprland-Desktop auf CachyOS und alles, worauf ich gerade Lust habe.\nAuf dieser Seite schreibe ich Dinge auf — vor allem die Probleme, die Stunden gedauert haben, und die, die sich als unmöglich herausgestellt haben. Wenn ein Beitrag dir einen Abend spart, hat er seinen Zweck erfüllt.\n","permalink":"https://mariusladner.dev/de/about/","summary":"\u003cp\u003eIch arbeite in der IT als Sysadmin, meistens mit Ansible. Zu Hause betreibe ich ein kleines Homelab\nauf einem Mini-PC (Docker, Traefik, Home Assistant, Immich, Jellyfin und Co.), einen Hyprland-Desktop\nauf CachyOS und alles, worauf ich gerade Lust habe.\u003c/p\u003e\n\u003cp\u003eAuf dieser Seite schreibe ich Dinge auf — vor allem die Probleme, die Stunden\ngedauert haben, und die, die sich als unmöglich herausgestellt haben. Wenn ein Beitrag dir einen\nAbend spart, hat er seinen Zweck erfüllt.\u003c/p\u003e","title":"Über mich"}]