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 serviceConfig = {
45 AmbientCapabilities = [ "CAP_NET_ADMIN" ];
46 DynamicUser = true;
47 Environment = [
48 "NB_CONFIG=/var/lib/netbird/config.json"
49 "NB_LOG_FILE=console"
50 ];
51 ExecStart = "${cfg.package}/bin/netbird service run";
52 Restart = "always";
53 RuntimeDirectory = "netbird";
54 StateDirectory = "netbird";
55 WorkingDirectory = "/var/lib/netbird";
56 };
57 unitConfig = {
58 StartLimitInterval = 5;
59 StartLimitBurst = 10;
60 };
61 stopIfChanged = false;
62 };
63 };
64}