1{ config, lib, pkgs, ... }:
2
3with lib;
4
5let
6 cfg = config.services.netbird;
7 kernel = config.boot.kernelPackages;
8 interfaceName = "wt0";
9in {
10 meta.maintainers = with maintainers; [ misuzu ];
11
12 options.services.netbird = {
13 enable = mkEnableOption (lib.mdDoc "Netbird daemon");
14 package = mkOption {
15 type = types.package;
16 default = pkgs.netbird;
17 defaultText = literalExpression "pkgs.netbird";
18 description = lib.mdDoc "The package to use for netbird";
19 };
20 };
21
22 config = mkIf cfg.enable {
23 boot.extraModulePackages = optional (versionOlder kernel.kernel.version "5.6") kernel.wireguard;
24
25 environment.systemPackages = [ cfg.package ];
26
27 networking.dhcpcd.denyInterfaces = [ interfaceName ];
28
29 systemd.network.networks."50-netbird" = mkIf config.networking.useNetworkd {
30 matchConfig = {
31 Name = interfaceName;
32 };
33 linkConfig = {
34 Unmanaged = true;
35 ActivationPolicy = "manual";
36 };
37 };
38
39 systemd.services.netbird = {
40 description = "A WireGuard-based mesh network that connects your devices into a single private network";
41 documentation = [ "https://netbird.io/docs/" ];
42 after = [ "network.target" ];
43 wantedBy = [ "multi-user.target" ];
44 path = with pkgs; [
45 openresolv
46 ];
47 serviceConfig = {
48 Environment = [
49 "NB_CONFIG=/var/lib/netbird/config.json"
50 "NB_LOG_FILE=console"
51 ];
52 ExecStart = "${cfg.package}/bin/netbird service run";
53 Restart = "always";
54 RuntimeDirectory = "netbird";
55 StateDirectory = "netbird";
56 WorkingDirectory = "/var/lib/netbird";
57 };
58 unitConfig = {
59 StartLimitInterval = 5;
60 StartLimitBurst = 10;
61 };
62 stopIfChanged = false;
63 };
64 };
65}