char/flake
nixos flake
git clone https://git.t4t.associates/char/flake
a6e205b
main
1{ config , lib , pkgs , ...} : 2let 3swayConfig = pkgs . writeText "sway-headless.conf" '' 4output HEADLESS-1 mode --custom 1920x1080@60Hz 5seat seat0 fallback true 6'' ; 7in 8{ 9hardware . graphics . enable = true ; 10 11programs . firefox . enable = true ; 12 13programs . sway = { 14enable = true ; 15wrapperFeatures . base = false ; 16extraPackages = with pkgs ; [ 17chromium 18grim 19wl-clipboard 20wlrctl 21wtype 22]; 23}; 24 25users . users . charlotte = { 26extraGroups = [ 27"video" 28"render" 29]; 30linger = true ; 31}; 32 33environment . sessionVariables = { 34NIXOS_OZONE_WL = "1" ; 35WAYLAND_DISPLAY = "wayland-1" ; 36XDG_RUNTIME_DIR = "/run/user/ ${ toString config . users . users . charlotte . uid } " ; 37}; 38 39systemd . services . tailscale-serve-novnc = { 40description = "Expose noVNC to the tailnet" ; 41wantedBy = [ "multi-user.target" ]; 42requires = [ "tailscaled.service" ]; 43after = [ "tailscaled.service" ]; 44serviceConfig = { 45ExecStartPre = " ${ config . services . tailscale . package } /bin/tailscale wait --timeout=60s" ; 46ExecStart = " ${ config . services . tailscale . package } /bin/tailscale serve --yes --https=8443 http://127.0.0.1:6080" ; 47Restart = "on-failure" ; 48RestartSec = 1 ; 49}; 50}; 51 52systemd . user . services = { 53sway-headless = { 54description = "Headless Sway compositor" ; 55wantedBy = [ "default.target" ]; 56environment = { 57WLR_BACKENDS = "headless" ; 58WLR_HEADLESS_OUTPUTS = "1" ; 59WLR_LIBINPUT_NO_DEVICES = "1" ; 60WLR_RENDERER = lib . mkDefault "gles2" ; 61XDG_CURRENT_DESKTOP = "sway" ; 62}; 63serviceConfig = { 64ExecStart = " ${ config . programs . sway . package } /bin/sway --config ${ swayConfig } " ; 65Restart = "on-failure" ; 66RestartSec = 1 ; 67}; 68}; 69 70wayvnc = { 71description = "VNC server for headless Sway" ; 72wantedBy = [ "default.target" ]; 73requires = [ "sway-headless.service" ]; 74after = [ "sway-headless.service" ]; 75serviceConfig = { 76ExecStart = " ${ pkgs . wayvnc } /bin/wayvnc 127.0.0.1:5900" ; 77Restart = "on-failure" ; 78RestartSec = 1 ; 79}; 80}; 81 82novnc = { 83description = "noVNC web client" ; 84wantedBy = [ "default.target" ]; 85requires = [ "wayvnc.service" ]; 86after = [ "wayvnc.service" ]; 87serviceConfig = { 88ExecStart = " ${ pkgs . python3Packages . websockify } /bin/websockify --web= ${ pkgs . novnc } /share/webapps/novnc 127.0.0.1:6080 127.0.0.1:5900" ; 89Restart = "on-failure" ; 90RestartSec = 1 ; 91}; 92}; 93}; 94}