{ config, pkgs, lib, ... }: let hostName = "r5"; domain = "home.arpa"; wan = "wan0"; bridge = "br0"; in { imports = [ ../roles/home.nix ../roles/server.nix ../roles/router.nix ../roles/local-ca.nix ../roles/dynamic-dns.nix ../roles/exit-node.nix ../roles/syncthing.nix ../roles/home-automation.nix ../roles/tailscale-subnet-router.nix ../roles/uptime-monitor.nix ../settings/services/searchix.nix ../settings/hardware/usb-serial-tty.nix ]; age.secrets = { acme.file = ../../secrets/acme.age; syncthing.file = ../../secrets/syncthing.age; }; system.autoUpgrade.enable = lib.mkForce false; services.getty.autologinUser = "root"; systemd.services."autovt@tty1".enable = false; nanopi.network.r8125 = true; networking = { inherit domain hostName; # see ../roles/router.nix for remaining settings nat = { externalInterface = wan; internalInterfaces = [ bridge ]; }; }; services.dnsmasq.settings.cname = [ "searchix.${domain},${hostName}.${domain}" ]; services.searchix.settings.web = { listenAddress = "::"; baseURL = "https://searchix.${domain}/"; }; services.caddy.virtualHosts = { "searchix.${domain}" = { extraConfig = '' tls { issuer internal { ca home } } encode reverse_proxy localhost:${toString config.services.searchix.settings.web.port} { health_uri /health health_status 2xx health_interval 10s health_timeout 1s health_fails 2 } ''; }; }; systemd.network = { netdevs = { "20-${bridge}" = { netdevConfig = { Kind = "bridge"; Name = "${bridge}"; }; }; }; networks = { "30-lan1" = { matchConfig.Path = "platform-3c0000000.pcie-*"; networkConfig.Bridge = bridge; linkConfig.RequiredForOnline = "enslaved"; }; "30-lan2" = { matchConfig.Path = "platform-3c0400000.pcie-*"; networkConfig.Bridge = bridge; linkConfig.RequiredForOnline = "enslaved"; }; "40-${bridge}" = { matchConfig.Name = bridge; bridgeConfig = { }; linkConfig = { RequiredForOnline = "routable"; }; networkConfig = { BindCarrier = [ "lan1" "lan2" ]; }; }; }; }; environment.systemPackages = with pkgs; [ file tree knot-dns ]; users.users.alin = { isNormalUser = true; extraGroups = [ "wheel" ]; openssh.authorizedKeys.keys = [ "ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBENXbdPPOq0mA+9bPklpUkikvIXjCEKE5IRwNPNMr5/Ta1J/ND737fexCjEb7YPoAJtaf0gD/JThQQi/RxDTvy4= alin@secretive.marvin.local" ]; }; boot.kernelModules = [ "rtc_rk808" # this RTC supposedly has a battery, but doesn't seem to work # "rtc_hym8563" ]; services.timesyncd.enable = false; services.chrony = { enable = true; makestep = { enable = true; }; enableRTCTrimming = true; extraConfig = '' rtcdevice /dev/rtc0 allow ''; }; system.stateVersion = "25.11"; }