refactor(users/glittershark): Rename to grfn
Rename my //users directory and all places that refer to glittershark to grfn, including nix references and documentation. This may require some extra attention inside of gerrit's database after it lands to allow me to actually push things. Change-Id: I4728b7ec2c60024392c1c1fa6e0d4a59b3e266fa Reviewed-on: https://cl.tvl.fyi/c/depot/+/2933 Tested-by: BuildkiteCI Reviewed-by: tazjin <mail@tazj.in> Reviewed-by: lukegb <lukegb@tvl.fyi> Reviewed-by: glittershark <grfn@gws.fyi>
This commit is contained in:
parent
968effb5dc
commit
6266c5d32f
362 changed files with 52 additions and 56 deletions
23
users/grfn/system/system/machines/bumblebee.nix
Normal file
23
users/grfn/system/system/machines/bumblebee.nix
Normal file
|
|
@ -0,0 +1,23 @@
|
|||
{ config, lib, pkgs, ... }:
|
||||
{
|
||||
imports = [
|
||||
../modules/reusable/battery.nix
|
||||
];
|
||||
|
||||
networking.hostName = "bumblebee";
|
||||
|
||||
powerManagement = {
|
||||
enable = true;
|
||||
cpuFreqGovernor = "powersave";
|
||||
powertop.enable = true;
|
||||
};
|
||||
|
||||
# Hibernate on low battery
|
||||
laptop.onLowBattery = {
|
||||
enable = true;
|
||||
action = "hibernate";
|
||||
thresholdPercentage = 5;
|
||||
};
|
||||
|
||||
services.xserver.xkbOptions = "caps:swapescape";
|
||||
}
|
||||
142
users/grfn/system/system/machines/chupacabra.nix
Normal file
142
users/grfn/system/system/machines/chupacabra.nix
Normal file
|
|
@ -0,0 +1,142 @@
|
|||
{ config, lib, pkgs, ... }:
|
||||
|
||||
{
|
||||
imports = [
|
||||
../modules/common.nix
|
||||
../modules/laptop.nix
|
||||
../modules/tvl.nix
|
||||
../modules/fcitx.nix
|
||||
../modules/rtlsdr.nix
|
||||
../../../../../ops/modules/v4l2loopback.nix
|
||||
../modules/desktop.nix
|
||||
../modules/development.nix
|
||||
];
|
||||
|
||||
hardware.enableRedistributableFirmware = true;
|
||||
|
||||
networking.hostName = "chupacabra";
|
||||
|
||||
powerManagement = {
|
||||
enable = true;
|
||||
powertop.enable = true;
|
||||
cpuFreqGovernor = "powersave";
|
||||
};
|
||||
|
||||
laptop.onLowBattery = {
|
||||
enable = true;
|
||||
action = "hibernate";
|
||||
thresholdPercentage = 5;
|
||||
};
|
||||
|
||||
boot = {
|
||||
blacklistedKernelModules = [ "nouveau" "intel" ];
|
||||
extraModulePackages = [ ];
|
||||
|
||||
initrd = {
|
||||
availableKernelModules = [ "xhci_pci" "ahci" "nvme" "usb_storage" "sd_mod" "rtsx_pci_sdmmc" ];
|
||||
kernelModules = [ ];
|
||||
|
||||
luks.devices = {
|
||||
"cryptroot".device = "/dev/disk/by-uuid/c2fc7ce7-a45e-48a1-8cde-be966ef601db";
|
||||
"cryptswap".device = "/dev/disk/by-uuid/3b6e2fd4-bfe9-4392-a6e0-4f3b3b76e019";
|
||||
};
|
||||
};
|
||||
|
||||
kernelModules = [ "kvm-intel" ];
|
||||
kernelParams = [ "acpi_rev_override" ];
|
||||
|
||||
kernel.sysctl = {
|
||||
"kernel.perf_event_paranoid" = -1;
|
||||
"vm.swappiness" = 1;
|
||||
};
|
||||
};
|
||||
|
||||
services.thermald.enable = true;
|
||||
|
||||
hardware.cpu.intel.updateMicrocode = true;
|
||||
|
||||
# Intel-only graphics
|
||||
hardware.nvidiaOptimus.disable = true;
|
||||
services.xserver.videoDrivers = [ "intel" ];
|
||||
|
||||
# Nvidia Optimus (hybrid) - currently not working
|
||||
# services.xserver.videoDrivers = [ "intel" "nvidia" ];
|
||||
# boot.blacklistedKernelModules = [ "nouveau" "bbswitch" ];
|
||||
# boot.extraModulePackages = [ pkgs.linuxPackages.nvidia_x11 ];
|
||||
# hardware.bumblebee.enable = true;
|
||||
# hardware.bumblebee.pmMethod = "none";
|
||||
|
||||
systemd.services.disable-usb-autosuspend = {
|
||||
description = "Disable USB autosuspend";
|
||||
wantedBy = [ "multi-user.target" ];
|
||||
serviceConfig = { Type = "oneshot"; };
|
||||
unitConfig.RequiresMountsFor = "/sys";
|
||||
script = ''
|
||||
echo -1 > /sys/module/usbcore/parameters/autosuspend
|
||||
'';
|
||||
};
|
||||
|
||||
# From hardware-configuration.nix
|
||||
|
||||
fileSystems."/" =
|
||||
{ device = "/dev/mapper/cryptroot";
|
||||
fsType = "ext4";
|
||||
};
|
||||
|
||||
fileSystems."/boot" =
|
||||
{ device = "/dev/disk/by-uuid/3492-9E3A";
|
||||
fsType = "vfat";
|
||||
};
|
||||
|
||||
swapDevices =
|
||||
[ { device = "/dev/disk/by-uuid/caa7e2ff-475b-4024-b29e-4f88f733fc4c"; }
|
||||
];
|
||||
|
||||
# High-DPI console
|
||||
console.font = lib.mkDefault "${pkgs.terminus_font}/share/consolefonts/ter-u28n.psf.gz";
|
||||
|
||||
# from nixos-hardware TODO sort this around
|
||||
services.tlp.enable = true;
|
||||
services.fstrim.enable = lib.mkDefault true;
|
||||
|
||||
# Intel cpu stuff
|
||||
hardware.opengl.extraPackages = with pkgs; [
|
||||
vaapiIntel
|
||||
vaapiVdpau
|
||||
libvdpau-va-gl
|
||||
intel-media-driver
|
||||
];
|
||||
|
||||
services.udev.extraRules = ''
|
||||
# UDEV rules for Teensy USB devices
|
||||
ATTRS{idVendor}=="16c0", ATTRS{idProduct}=="04[789B]?", ENV{ID_MM_DEVICE_IGNORE}="1"
|
||||
ATTRS{idVendor}=="16c0", ATTRS{idProduct}=="04[789A]?", ENV{MTP_NO_PROBE}="1"
|
||||
SUBSYSTEMS=="usb", ATTRS{idVendor}=="16c0", ATTRS{idProduct}=="04[789ABCD]?", MODE:="0666"
|
||||
KERNEL=="ttyACM*", ATTRS{idVendor}=="16c0", ATTRS{idProduct}=="04[789B]?", MODE:="0666"
|
||||
'';
|
||||
|
||||
# Necessary to get steam working
|
||||
hardware.opengl.driSupport32Bit = true;
|
||||
|
||||
nix = {
|
||||
maxJobs = lib.mkDefault 12;
|
||||
binaryCaches = [ "ssh://grfn@172.16.0.5" ];
|
||||
trustedBinaryCaches = [ "ssh://grfn@172.16.0.5" ];
|
||||
buildMachines = [
|
||||
{
|
||||
hostName = "172.16.0.4";
|
||||
sshUser = "griffin";
|
||||
sshKey = "/home/grfn/.ssh/id_rsa";
|
||||
system = "x86_64-darwin";
|
||||
maxJobs = 8; # 16 cpus
|
||||
}
|
||||
{
|
||||
hostName = "172.16.0.3";
|
||||
sshUser = "griffin";
|
||||
sshKey = "/home/grfn/.ssh/id_rsa";
|
||||
system = "x86_64-darwin";
|
||||
maxJobs = 4;
|
||||
}
|
||||
];
|
||||
};
|
||||
}
|
||||
279
users/grfn/system/system/machines/mugwump.nix
Normal file
279
users/grfn/system/system/machines/mugwump.nix
Normal file
|
|
@ -0,0 +1,279 @@
|
|||
{ config, lib, pkgs, modulesPath, ... }:
|
||||
|
||||
with lib;
|
||||
|
||||
{
|
||||
imports = [
|
||||
../modules/common.nix
|
||||
(modulesPath + "/installer/scan/not-detected.nix")
|
||||
];
|
||||
|
||||
networking.hostName = "mugwump";
|
||||
|
||||
boot = {
|
||||
loader.systemd-boot.enable = true;
|
||||
|
||||
kernelModules = [ "kvm-intel" ];
|
||||
extraModulePackages = [ ];
|
||||
|
||||
initrd = {
|
||||
availableKernelModules = [ "xhci_pci" "ehci_pci" "ahci" "usb_storage" "usbhid" "sd_mod" ];
|
||||
kernelModules = [
|
||||
"uas" "usbcore" "usb_storage" "vfat" "nls_cp437" "nls_iso8859_1"
|
||||
];
|
||||
|
||||
postDeviceCommands = pkgs.lib.mkBefore ''
|
||||
mkdir -m 0755 -p /key
|
||||
sleep 2
|
||||
mount -n -t vfat -o ro `findfs UUID=9048-A9D5` /key
|
||||
'';
|
||||
|
||||
luks.devices."cryptroot" = {
|
||||
device = "/dev/disk/by-uuid/803a9028-339c-4617-a213-4fe138161f6d";
|
||||
keyFile = "/key/keyfile";
|
||||
preLVM = false;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
fileSystems = {
|
||||
"/" = {
|
||||
device = "/dev/mapper/cryptroot";
|
||||
fsType = "btrfs";
|
||||
};
|
||||
"/boot" = {
|
||||
device = "/dev/disk/by-uuid/7D74-0E4B";
|
||||
fsType = "vfat";
|
||||
};
|
||||
};
|
||||
|
||||
networking.interfaces = {
|
||||
enp0s25.useDHCP = false;
|
||||
wlp2s0.useDHCP = false;
|
||||
};
|
||||
|
||||
networking.firewall.enable = true;
|
||||
networking.firewall.allowedTCPPorts = [ 22 80 443 ];
|
||||
|
||||
security.sudo.extraRules = [{
|
||||
groups = ["wheel"];
|
||||
commands = [{ command = "ALL"; options = ["NOPASSWD"]; }];
|
||||
}];
|
||||
|
||||
nix.gc.dates = "monthly";
|
||||
|
||||
services.fail2ban = {
|
||||
enable = true;
|
||||
ignoreIP = [
|
||||
"172.16.0.0/16"
|
||||
];
|
||||
};
|
||||
|
||||
services.openssh = {
|
||||
allowSFTP = false;
|
||||
passwordAuthentication = false;
|
||||
permitRootLogin = "no";
|
||||
};
|
||||
|
||||
services.grafana = {
|
||||
enable = true;
|
||||
port = 3000;
|
||||
domain = "metrics.gws.fyi";
|
||||
rootUrl = "https://metrics.gws.fyi";
|
||||
dataDir = "/var/lib/grafana";
|
||||
analytics.reporting.enable = false;
|
||||
|
||||
provision = {
|
||||
enable = true;
|
||||
datasources = [{
|
||||
name = "Prometheus";
|
||||
type = "prometheus";
|
||||
url = "http://localhost:9090";
|
||||
}];
|
||||
};
|
||||
};
|
||||
|
||||
security.acme.email = "root@gws.fyi";
|
||||
security.acme.acceptTerms = true;
|
||||
|
||||
services.nginx = {
|
||||
enable = true;
|
||||
statusPage = true;
|
||||
recommendedGzipSettings = true;
|
||||
recommendedOptimisation = true;
|
||||
recommendedTlsSettings = true;
|
||||
|
||||
virtualHosts = {
|
||||
"metrics.gws.fyi" = {
|
||||
enableACME = true;
|
||||
forceSSL = true;
|
||||
locations."/" = {
|
||||
proxyPass = "http://localhost:${toString config.services.grafana.port}";
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
services.ddclient = {
|
||||
enable = true;
|
||||
domains = [ "home.gws.fyi" ];
|
||||
interval = "1d";
|
||||
zone = "gws.fyi";
|
||||
protocol = "cloudflare";
|
||||
username = "root@gws.fyi";
|
||||
quiet = true;
|
||||
};
|
||||
|
||||
systemd.services.ddclient.serviceConfig = {
|
||||
EnvironmentFile = "/etc/secrets/cloudflare.env";
|
||||
DynamicUser = lib.mkForce false;
|
||||
ExecStart = lib.mkForce (
|
||||
let runtimeDir =
|
||||
config.systemd.services.ddclient.serviceConfig.RuntimeDirectory;
|
||||
in pkgs.writeShellScript "ddclient" ''
|
||||
set -eo pipefail
|
||||
|
||||
${pkgs.gnused}/bin/sed -i -s s/password=/password=$CLOUDFLARE_API_KEY/ /run/${runtimeDir}/ddclient.conf
|
||||
exec ${pkgs.ddclient}/bin/ddclient \
|
||||
-file /run/${runtimeDir}/ddclient.conf \
|
||||
-login=$CLOUDFLARE_EMAIL \
|
||||
'');
|
||||
};
|
||||
|
||||
security.acme.certs."metrics.gws.fyi" = {
|
||||
dnsProvider = "cloudflare";
|
||||
credentialsFile = "/etc/secrets/cloudflare.env";
|
||||
webroot = mkForce null;
|
||||
};
|
||||
|
||||
services.prometheus = {
|
||||
enable = true;
|
||||
exporters = {
|
||||
node = {
|
||||
enable = true;
|
||||
openFirewall = false;
|
||||
|
||||
enabledCollectors = [
|
||||
"processes"
|
||||
"systemd"
|
||||
"tcpstat"
|
||||
"wifi"
|
||||
"textfile"
|
||||
];
|
||||
|
||||
extraFlags = [
|
||||
"--collector.textfile.directory=/var/lib/prometheus/node-exporter"
|
||||
];
|
||||
};
|
||||
|
||||
nginx = {
|
||||
enable = true;
|
||||
openFirewall = true;
|
||||
sslVerify = false;
|
||||
constLabels = [ "host=mugwump" ];
|
||||
};
|
||||
|
||||
blackbox = {
|
||||
enable = true;
|
||||
openFirewall = true;
|
||||
configFile = pkgs.writeText "blackbox-exporter.yaml" (builtins.toJSON {
|
||||
modules = {
|
||||
https_2xx = {
|
||||
prober = "http";
|
||||
http = {
|
||||
method = "GET";
|
||||
fail_if_ssl = false;
|
||||
fail_if_not_ssl = true;
|
||||
preferred_ip_protocol = "ip4";
|
||||
};
|
||||
};
|
||||
};
|
||||
});
|
||||
};
|
||||
};
|
||||
|
||||
scrapeConfigs = [{
|
||||
job_name = "node";
|
||||
scrape_interval = "5s";
|
||||
static_configs = [{
|
||||
targets = ["localhost:${toString config.services.prometheus.exporters.node.port}"];
|
||||
}];
|
||||
} {
|
||||
job_name = "nginx";
|
||||
scrape_interval = "5s";
|
||||
static_configs = [{
|
||||
targets = ["localhost:${toString config.services.prometheus.exporters.nginx.port}"];
|
||||
}];
|
||||
} {
|
||||
job_name = "blackbox";
|
||||
metrics_path = "/probe";
|
||||
params.module = ["https_2xx"];
|
||||
scrape_interval = "5s";
|
||||
static_configs = [{
|
||||
targets = [
|
||||
"https://gws.fyi"
|
||||
"https://windtunnel.ci"
|
||||
"https://app.windtunnel.ci"
|
||||
"https://metrics.gws.fyi"
|
||||
];
|
||||
}];
|
||||
relabel_configs = [{
|
||||
source_labels = ["__address__"];
|
||||
target_label = "__param_target";
|
||||
} {
|
||||
source_labels = ["__param_target"];
|
||||
target_label = "instance";
|
||||
} {
|
||||
target_label = "__address__";
|
||||
replacement = "localhost:${toString config.services.prometheus.exporters.blackbox.port}";
|
||||
}];
|
||||
}];
|
||||
};
|
||||
|
||||
systemd.services."prometheus-fail2ban-exporter" = {
|
||||
wantedBy = [ "multi-user.target" ];
|
||||
after = [ "network.target" "fail2ban.service" ];
|
||||
serviceConfig = {
|
||||
User = "root";
|
||||
Type = "oneshot";
|
||||
ExecStart = pkgs.writeShellScript "prometheus-fail2ban-exporter" ''
|
||||
set -eo pipefail
|
||||
mkdir -p /var/lib/prometheus/node-exporter
|
||||
exec ${pkgs.python3.withPackages (p: [
|
||||
p.prometheus_client
|
||||
])}/bin/python ${pkgs.fetchurl {
|
||||
url = "https://raw.githubusercontent.com/jangrewe/prometheus-fail2ban-exporter/11066950b47bb2dbef96ea8544f76e46ed829e81/fail2ban-exporter.py";
|
||||
sha256 = "049lsvw1nj65bbvp8ygyz3743ayzdawrbjixaxmpm03qbrcfmwc4";
|
||||
}}
|
||||
'';
|
||||
};
|
||||
|
||||
path = with pkgs; [ fail2ban ];
|
||||
};
|
||||
|
||||
systemd.timers."prometheus-fail2ban-exporter" = {
|
||||
wantedBy = [ "multi-user.target" ];
|
||||
timerConfig.OnCalendar = "minutely";
|
||||
};
|
||||
|
||||
virtualisation.docker.enable = true;
|
||||
|
||||
services.buildkite-agents = listToAttrs (map (n: rec {
|
||||
name = "mugwump-${toString n}";
|
||||
value = {
|
||||
inherit name;
|
||||
enable = true;
|
||||
tokenPath = "/etc/secrets/buildkite-agent-token";
|
||||
privateSshKeyPath = "/etc/secrets/buildkite-ssh-key";
|
||||
runtimePackages = with pkgs; [
|
||||
docker
|
||||
nix
|
||||
gnutar
|
||||
gzip
|
||||
];
|
||||
};
|
||||
}) (range 1 1));
|
||||
|
||||
users.users."buildkite-agent-mugwump-1".extraGroups = [ "docker" ];
|
||||
users.users."buildkite-agent-mugwump-2".extraGroups = [ "docker" ];
|
||||
}
|
||||
17
users/grfn/system/system/machines/roswell.nix
Normal file
17
users/grfn/system/system/machines/roswell.nix
Normal file
|
|
@ -0,0 +1,17 @@
|
|||
{ depot, config, lib, pkgs, modulesPath, ... }:
|
||||
|
||||
{
|
||||
imports = [
|
||||
../modules/common.nix
|
||||
"${modulesPath}/installer/scan/not-detected.nix"
|
||||
"${modulesPath}/virtualisation/amazon-image.nix"
|
||||
];
|
||||
|
||||
ec2.hvm = true;
|
||||
|
||||
networking.hostName = "roswell";
|
||||
|
||||
users.users.grfn.openssh.authorizedKeys.keys = [
|
||||
depot.users.grfn.keys.main
|
||||
];
|
||||
}
|
||||
125
users/grfn/system/system/machines/yeren.nix
Normal file
125
users/grfn/system/system/machines/yeren.nix
Normal file
|
|
@ -0,0 +1,125 @@
|
|||
{ depot, modulesPath, config, lib, pkgs, ... }:
|
||||
|
||||
{
|
||||
imports = [
|
||||
(modulesPath + "/installer/scan/not-detected.nix")
|
||||
../modules/common.nix
|
||||
../modules/laptop.nix
|
||||
../modules/xserver.nix
|
||||
../modules/fonts.nix
|
||||
../modules/sound.nix
|
||||
../modules/tvl.nix
|
||||
../modules/development.nix
|
||||
../modules/work/kolide.nix
|
||||
];
|
||||
|
||||
networking.hostName = "yeren";
|
||||
|
||||
system.stateVersion = "21.03";
|
||||
|
||||
boot = {
|
||||
initrd = {
|
||||
availableKernelModules = [ "xhci_pci" "thunderbolt" "nvme" "usb_storage" "sd_mod" "rtsx_pci_sdmmc" ];
|
||||
kernelModules = [ ];
|
||||
|
||||
luks.devices = {
|
||||
"cryptroot".device = "/dev/disk/by-uuid/dcfbc22d-e0d2-411b-8dd3-96704d3aae2e";
|
||||
"cryptswap".device = "/dev/disk/by-uuid/48b8a8fd-559c-4759-a617-56f221cfaaec";
|
||||
};
|
||||
};
|
||||
|
||||
kernelPackages = pkgs.linuxPackages_latest;
|
||||
|
||||
kernelModules = [ "kvm-intel" ];
|
||||
blacklistedKernelModules = [ "psmouse" ];
|
||||
extraModulePackages = [
|
||||
config.boot.kernelPackages.digimend
|
||||
];
|
||||
kernelParams = [
|
||||
"i915.preliminary_hw_support=1"
|
||||
];
|
||||
|
||||
# https://bbs.archlinux.org/viewtopic.php?pid=1933643#p1933643
|
||||
extraModprobeConfig = ''
|
||||
options snd-intel-dspcfg dsp_driver=1
|
||||
'';
|
||||
};
|
||||
|
||||
fileSystems = {
|
||||
"/" = {
|
||||
device = "/dev/mapper/cryptroot";
|
||||
fsType = "btrfs";
|
||||
};
|
||||
|
||||
"/boot" = {
|
||||
device = "/dev/disk/by-uuid/53A9-248B";
|
||||
fsType = "vfat";
|
||||
};
|
||||
};
|
||||
|
||||
swapDevices = [{ device = "/dev/mapper/cryptswap"; }];
|
||||
|
||||
services.xserver = {
|
||||
exportConfiguration = true;
|
||||
extraConfig = ''
|
||||
Section "Device"
|
||||
Identifier "Intel Graphics"
|
||||
Driver "intel"
|
||||
Option "TripleBuffer" "true"
|
||||
Option "TearFree" "true"
|
||||
Option "DRI" "true"
|
||||
Option "AccelMethod" "sna"
|
||||
EndSection
|
||||
'';
|
||||
};
|
||||
|
||||
hardware.firmware = with pkgs; [
|
||||
alsa-firmware
|
||||
sof-firmware
|
||||
];
|
||||
|
||||
hardware.opengl.extraPackages = with pkgs; [
|
||||
vaapiIntel
|
||||
vaapiVdpau
|
||||
libvdpau-va-gl
|
||||
intel-media-driver
|
||||
];
|
||||
|
||||
services.fprintd = {
|
||||
enable = true;
|
||||
package = pkgs.fprintd-tod;
|
||||
};
|
||||
|
||||
systemd.services.fprintd.environment.FP_TOD_DRIVERS_DIR =
|
||||
"${pkgs.libfprint-2-tod1-goodix}/usr/lib/libfprint-2/tod-1";
|
||||
|
||||
security.pam.loginLimits = [
|
||||
{
|
||||
domain = "grfn";
|
||||
type = "soft";
|
||||
item = "nofile";
|
||||
value = "65535";
|
||||
}
|
||||
];
|
||||
|
||||
security.pam.services = {
|
||||
login.fprintAuth = true;
|
||||
sudo.fprintAuth = true;
|
||||
i3lock.fprintAuth = false;
|
||||
i3lock-color.fprintAuth = false;
|
||||
lightdm.fprintAuth = true;
|
||||
lightdm-greeter.fprintAuth = true;
|
||||
};
|
||||
|
||||
hardware.opengl.driSupport32Bit = true;
|
||||
|
||||
hardware.pulseaudio.extraConfig = ''
|
||||
load-module module-remap-source source_name=KompleteAudio6_1 source_properties=device.description=KompleteAudio6Input1 master=alsa_input.usb-Native_Instruments_Komplete_Audio_6_458E0FFD-00.multichannel-input remix=no channels=1 master_channel_map=front-left channel_map=mono
|
||||
load-module module-remap-source source_name=KompleteAudio6_2 source_properties=device.description=KompleteAudio6Input2 master=alsa_input.usb-Native_Instruments_Komplete_Audio_6_458E0FFD-00.multichannel-input remix=no channels=1 master_channel_map=front-right channel_map=mono
|
||||
load-module module-remap-sink sink_name=KompleteAudio6_12 sink_properties=device.description=KompleteAudio6_12 remix=no master=alsa_output.usb-Native_Instruments_Komplete_Audio_6_458E0FFD-00.analog-surround-21 channels=2 master_channel_map=front-left,front-right channel_map=front-left,front-right
|
||||
'';
|
||||
|
||||
services.fwupd.enable = true;
|
||||
|
||||
services.tailscale.enable = true;
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue