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