char/flake

nixos flake

git clone https://git.t4t.associates/char/flake

Charlotte Somfor some reason tailscaled reports started too soon soa6e205b

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