|
3 | 3 |
|
4 | 4 | inputs = {
|
5 | 5 | nixpkgs.url = "nixpkgs/nixpkgs-unstable";
|
6 |
| - flake-utils.url = "github:numtide/flake-utils"; |
| 6 | + parts.url = "github:hercules-ci/flake-parts"; |
| 7 | + systems.url = "github:nix-systems/default"; |
7 | 8 | };
|
8 | 9 |
|
9 |
| - outputs = |
10 |
| - { self |
11 |
| - , nixpkgs |
12 |
| - , flake-utils |
13 |
| - , ... |
14 |
| - }: |
15 |
| - let |
16 |
| - golinkVersion = |
17 |
| - if (self ? shortRev) |
18 |
| - then self.shortRev |
19 |
| - else "dev"; |
20 |
| - in |
21 |
| - { |
22 |
| - overlay = final: prev: |
23 |
| - let |
24 |
| - pkgs = nixpkgs.legacyPackages.${prev.system}; |
25 |
| - in |
26 |
| - rec { |
27 |
| - golink = pkgs.buildGo122Module rec { |
28 |
| - pname = "golink"; |
29 |
| - version = golinkVersion; |
30 |
| - src = pkgs.nix-gitignore.gitignoreSource [ ] ./.; |
31 |
| - |
32 |
| - vendorHash = "sha256-QkmdnOk+65VU0TISqX2nbBvJK7yw74nXaLk3snoira4="; # SHA based on vendoring go.mod |
33 |
| - }; |
| 10 | + outputs = inputs @ { self, parts, ... }: parts.lib.mkFlake { inherit inputs; } { |
| 11 | + systems = import inputs.systems; |
| 12 | + |
| 13 | + perSystem = { pkgs, ... }: { |
| 14 | + formatter = pkgs.nixpkgs-fmt; |
| 15 | + |
| 16 | + devShells.default = pkgs.mkShell { buildInputs = [ pkgs.go_1_23 ]; }; |
| 17 | + |
| 18 | + packages.default = |
| 19 | + pkgs.buildGo123Module { |
| 20 | + pname = "golink"; |
| 21 | + version = |
| 22 | + if (self ? shortRev) |
| 23 | + then self.shortRev |
| 24 | + else "dev"; |
| 25 | + src = pkgs.nix-gitignore.gitignoreSource [ ] ./.; |
| 26 | + ldflags = |
| 27 | + let |
| 28 | + tsVersion = with builtins; head (match |
| 29 | + ".*tailscale.com v([0-9]+\.[0-9]+\.[0-9]+-?[a-zA-Z]?).*" |
| 30 | + (readFile ./go.mod)); |
| 31 | + in |
| 32 | + [ |
| 33 | + "-w" |
| 34 | + "-s" |
| 35 | + "-X tailscale.com/version.longStamp=${tsVersion}" |
| 36 | + "-X tailscale.com/version.shortStamp=${tsVersion}" |
| 37 | + ]; |
| 38 | + vendorHash = "sha256-+XUg5XRswC77U5sZgQENQI2JGH0dwWdtsI4/NMI3KwA="; # SHA based on vendoring go.mod |
34 | 39 | };
|
35 |
| - } |
36 |
| - // flake-utils.lib.eachDefaultSystem |
37 |
| - (system: |
| 40 | + }; |
| 41 | + |
| 42 | + flake.overlays.default = final: prev: { |
| 43 | + golink = self.packages.${prev.system}.default; |
| 44 | + }; |
| 45 | + |
| 46 | + flake.nixosModules.default = { config, lib, pkgs, ... }: |
38 | 47 | let
|
39 |
| - pkgs = import nixpkgs { |
40 |
| - overlays = [ self.overlay ]; |
41 |
| - inherit system; |
42 |
| - }; |
| 48 | + cfg = config.services.golink; |
| 49 | + inherit (lib) |
| 50 | + concatStringsSep |
| 51 | + escapeShellArg |
| 52 | + mkEnableOption |
| 53 | + mkIf |
| 54 | + mkOption |
| 55 | + optionalString |
| 56 | + optionals |
| 57 | + types |
| 58 | + ; |
43 | 59 | in
|
44 |
| - rec { |
45 |
| - # `nix develop` |
46 |
| - devShell = pkgs.mkShell { buildInputs = [ pkgs.go_1_21 ]; }; |
| 60 | + { |
| 61 | + options.services.golink = { |
| 62 | + enable = mkEnableOption "Enable golink"; |
| 63 | + |
| 64 | + package = mkOption { |
| 65 | + type = types.package; |
| 66 | + description = '' |
| 67 | + golink package to use |
| 68 | + ''; |
| 69 | + default = pkgs.golink; |
| 70 | + }; |
47 | 71 |
|
48 |
| - # `nix build` |
49 |
| - packages = with pkgs; { |
50 |
| - inherit golink; |
51 |
| - }; |
| 72 | + dataDir = mkOption { |
| 73 | + type = types.path; |
| 74 | + default = "/var/lib/golink"; |
| 75 | + description = "Path to data dir"; |
| 76 | + }; |
52 | 77 |
|
53 |
| - defaultPackage = pkgs.golink; |
| 78 | + user = mkOption { |
| 79 | + type = types.str; |
| 80 | + default = "golink"; |
| 81 | + description = "User account under which golink runs."; |
| 82 | + }; |
| 83 | + |
| 84 | + group = mkOption { |
| 85 | + type = types.str; |
| 86 | + default = "golink"; |
| 87 | + description = "Group account under which golink runs."; |
| 88 | + }; |
54 | 89 |
|
55 |
| - # `nix run` |
56 |
| - apps.golink = flake-utils.lib.mkApp { |
57 |
| - drv = packages.golink; |
| 90 | + databaseFile = mkOption { |
| 91 | + type = types.path; |
| 92 | + default = "/var/lib/golink/golink.db"; |
| 93 | + description = "Path to SQLite database"; |
| 94 | + }; |
| 95 | + |
| 96 | + tailscaleAuthKeyFile = mkOption { |
| 97 | + type = types.path; |
| 98 | + description = "Path to file containing the Tailscale Auth Key"; |
| 99 | + }; |
| 100 | + |
| 101 | + verbose = mkOption { |
| 102 | + type = types.bool; |
| 103 | + default = false; |
| 104 | + }; |
58 | 105 | };
|
59 |
| - defaultApp = apps.golink; |
60 |
| - |
61 |
| - overlays.default = self.overlay; |
62 |
| - }) |
63 |
| - // { |
64 |
| - nixosModules.default = |
65 |
| - { pkgs |
66 |
| - , lib |
67 |
| - , config |
68 |
| - , ... |
69 |
| - }: |
70 |
| - let |
71 |
| - cfg = config.services.golink; |
72 |
| - in |
73 |
| - { |
74 |
| - options = with lib; { |
75 |
| - services.golink = { |
76 |
| - enable = mkEnableOption "Enable golink"; |
77 |
| - |
78 |
| - package = mkOption { |
79 |
| - type = types.package; |
80 |
| - description = '' |
81 |
| - golink package to use |
82 |
| - ''; |
83 |
| - default = pkgs.golink; |
84 |
| - }; |
85 |
| - |
86 |
| - dataDir = mkOption { |
87 |
| - type = types.path; |
88 |
| - default = "/var/lib/golink"; |
89 |
| - description = "Path to data dir"; |
90 |
| - }; |
91 |
| - |
92 |
| - user = mkOption { |
93 |
| - type = types.str; |
94 |
| - default = "golink"; |
95 |
| - description = "User account under which golink runs."; |
96 |
| - }; |
97 |
| - |
98 |
| - group = mkOption { |
99 |
| - type = types.str; |
100 |
| - default = "golink"; |
101 |
| - description = "Group account under which golink runs."; |
102 |
| - }; |
103 |
| - |
104 |
| - databaseFile = mkOption { |
105 |
| - type = types.path; |
106 |
| - default = "/var/lib/golink/golink.db"; |
107 |
| - description = "Path to SQLite database"; |
108 |
| - }; |
109 |
| - |
110 |
| - tailscaleAuthKeyFile = mkOption { |
111 |
| - type = types.path; |
112 |
| - description = "Path to file containing the Tailscale Auth Key"; |
113 |
| - }; |
114 |
| - |
115 |
| - verbose = mkOption { |
116 |
| - type = types.bool; |
117 |
| - default = false; |
118 |
| - }; |
119 |
| - }; |
| 106 | + |
| 107 | + config = mkIf cfg.enable { |
| 108 | + nixpkgs.overlays = [ self.overlays.default ]; |
| 109 | + |
| 110 | + users.groups."${cfg.group}" = { }; |
| 111 | + users.users."${cfg.user}" = { |
| 112 | + home = cfg.dataDir; |
| 113 | + createHome = true; |
| 114 | + group = "${cfg.group}"; |
| 115 | + isSystemUser = true; |
| 116 | + isNormalUser = false; |
| 117 | + description = "user for golink service"; |
120 | 118 | };
|
121 |
| - config = lib.mkIf cfg.enable { |
122 |
| - users.users."${cfg.user}" = { |
123 |
| - home = cfg.dataDir; |
124 |
| - createHome = true; |
125 |
| - group = "${cfg.group}"; |
126 |
| - isSystemUser = true; |
127 |
| - isNormalUser = false; |
128 |
| - description = "user for golink service"; |
129 |
| - }; |
130 |
| - users.groups."${cfg.group}" = { }; |
131 |
| - |
132 |
| - systemd.services.golink = { |
133 |
| - enable = true; |
134 |
| - script = |
135 |
| - let |
136 |
| - args = |
137 |
| - [ |
138 |
| - "--sqlitedb ${cfg.databaseFile}" |
139 |
| - ] |
140 |
| - ++ lib.optionals cfg.verbose [ "--verbose" ]; |
141 |
| - in |
142 |
| - '' |
143 |
| - ${lib.optionalString (cfg.tailscaleAuthKeyFile != null) '' |
144 |
| - export TS_AUTHKEY="$(head -n1 ${lib.escapeShellArg cfg.tailscaleAuthKeyFile})" |
145 |
| - ''} |
146 |
| -
|
147 |
| - ${cfg.package}/bin/golink ${builtins.concatStringsSep " " args} |
148 |
| - ''; |
149 |
| - wantedBy = [ "multi-user.target" ]; |
150 |
| - serviceConfig = { |
151 |
| - User = cfg.user; |
152 |
| - Group = cfg.group; |
153 |
| - Restart = "always"; |
154 |
| - RestartSec = "15"; |
155 |
| - WorkingDirectory = "${cfg.dataDir}"; |
156 |
| - }; |
| 119 | + |
| 120 | + systemd.services.golink = { |
| 121 | + enable = true; |
| 122 | + script = |
| 123 | + let |
| 124 | + args = [ "--sqlitedb ${cfg.databaseFile}" ] ++ optionals cfg.verbose [ "--verbose" ]; |
| 125 | + in |
| 126 | + '' |
| 127 | + ${optionalString (cfg.tailscaleAuthKeyFile != null) '' |
| 128 | + export TS_AUTHKEY="$(head -n1 ${escapeShellArg cfg.tailscaleAuthKeyFile})" |
| 129 | + ''} |
| 130 | +
|
| 131 | + ${cfg.package}/bin/golink ${concatStringsSep " " args} |
| 132 | + ''; |
| 133 | + wantedBy = [ "multi-user.target" ]; |
| 134 | + serviceConfig = { |
| 135 | + User = cfg.user; |
| 136 | + Group = cfg.group; |
| 137 | + Restart = "always"; |
| 138 | + RestartSec = "15"; |
| 139 | + WorkingDirectory = "${cfg.dataDir}"; |
157 | 140 | };
|
158 | 141 | };
|
159 | 142 | };
|
160 |
| - }; |
| 143 | + }; |
| 144 | + }; |
161 | 145 | }
|
0 commit comments