btw i use nix
1{
2 inputs = {
3 nixpkgs-compat.url = "github:nixos/nixpkgs/nixos-24.05";
4 nixpkgs.url = "github:nixos/nixpkgs/nixos-24.11";
5 nixpkgs-unstable.url = "github:nixos/nixpkgs/nixos-unstable";
6 nixpkgs-element.url = "github:nixos/nixpkgs/b91f647a35c4e18a73adf617e6ef9eb5f3baa503";
7 nixpkgs-flaresolverr.url = "github:nixos/nixpkgs/ebbc0409688869938bbcf630da1c1c13744d2a7b";
8 nixpkgs-sonarr.url = "github:nixos/nixpkgs/394571358ce82dff7411395829aa6a3aad45b907";
9 nixos-hardware.url = "github:nixos/nixos-hardware";
10 home-manager.url = "github:nix-community/home-manager/release-24.11";
11 agenix.url = "github:ryantm/agenix";
12 deploy-rs.url = "github:serokell/deploy-rs";
13 nix-on-droid.url = "github:nix-community/nix-on-droid/release-24.05";
14 eon.url = "github:RyanGibb/eon";
15 eilean.url = "github:RyanGibb/eilean-nix/main";
16 alec-website.url = "github:alexanderhthompson/website";
17 fn06-website.url = "github:RyanGibb/fn06";
18 i3-workspace-history.url = "github:RyanGibb/i3-workspace-history";
19 hyperbib-eeg.url = "github:RyanGibb/hyperbib?ref=nixify";
20 nix-rpi5.url = "gitlab:vriska/nix-rpi5?ref=main";
21 nur.url = "github:nix-community/NUR/e9e77b7985ef9bdeca12a38523c63d47555cc89b";
22 timewall.url = "github:bcyran/timewall/";
23 tangled.url = "git+https://tangled.sh/@tangled.sh/core";
24 disko.url = "github:nix-community/disko";
25
26 # deduplicate flake inputs
27 eilean.inputs.nixpkgs.follows = "nixpkgs";
28 eilean.inputs.eon.follows = "eon";
29 home-manager.inputs.nixpkgs.follows = "nixpkgs";
30 deploy-rs.inputs.nixpkgs.follows = "nixpkgs";
31 nix-on-droid.inputs.nixpkgs.follows = "nixpkgs";
32 nix-on-droid.inputs.home-manager.follows = "home-manager";
33 alec-website.inputs.nixpkgs.follows = "nixpkgs";
34 fn06-website.inputs.nixpkgs.follows = "nixpkgs";
35 eon.inputs.nixpkgs.follows = "nixpkgs";
36 i3-workspace-history.inputs.nixpkgs.follows = "nixpkgs";
37 hyperbib-eeg.inputs.nixpkgs.follows = "nixpkgs";
38 nix-rpi5.inputs.nixpkgs.follows = "nixpkgs";
39 nur.inputs.nixpkgs.follows = "nixpkgs";
40 timewall.inputs.nixpkgs.follows = "nixpkgs";
41 tangled.inputs.nixpkgs.follows = "nixpkgs";
42 disko.inputs.nixpkgs.follows = "nixpkgs";
43 };
44
45 outputs =
46 inputs:
47 let
48 getSystemOverlays = system: nixpkgsConfig: [
49 (final: prev: {
50 # https://github.com/mautrix/whatsapp/issues/749
51 overlay-compat = import inputs.nixpkgs-compat {
52 inherit system;
53 # follow stable nixpkgs config
54 config = nixpkgsConfig;
55 };
56 overlay-unstable = import inputs.nixpkgs-unstable {
57 inherit system;
58 # follow stable nixpkgs config
59 config = nixpkgsConfig;
60 };
61 # to use an unstable version of a package
62 #package = final.overlay-unstable.package;
63 # to use an custom version of a package
64 #package = prev.callPackage ./pkgs/package.nix { };
65 # to use an unstable custom version of a package
66 #package = final.callPackage ./pkgs/package.nix { };
67 # to override attributes of a package
68 # package = prev.package.overrideAttrs
69 # (_: { patches = [ ./pkgs/package.patch ]; });
70 opam = final.overlay-unstable.opam.overrideAttrs (_: {
71 src = final.fetchurl {
72 url = "http://ryan.freumh.org/software/opam-full-2.3.0-nixos-depexts.tar.gz";
73 sha256 = "sha256-mRxxZtWFgQ8v1szVq5g5+qVqa+OffoG1aHzGUiMMvT0=";
74 };
75 version = "2.3.0";
76 });
77 immich = final.overlay-unstable.immich;
78 mautrix-whatsapp = final.overlay-compat.mautrix-whatsapp;
79 element-desktop =
80 (import inputs.nixpkgs-element {
81 inherit system;
82 config = nixpkgsConfig;
83 }).element-desktop;
84 # https://github.com/NixOS/nixpkgs/issues/332776
85 flaresolverr =
86 (import inputs.nixpkgs-flaresolverr {
87 inherit system;
88 config = nixpkgsConfig;
89 }).flaresolverr;
90 sonarr =
91 (import inputs.nixpkgs-sonarr {
92 inherit system;
93 config = nixpkgsConfig;
94 }).sonarr;
95 timewall = inputs.timewall.packages.${system}.default;
96 })
97 inputs.nur.overlays.default
98 ];
99 in
100 {
101 nixosConfigurations =
102 let
103 mkMode =
104 mode: host:
105 let
106 host-nixpkgs = inputs.nixpkgs;
107 host-home-manager = inputs.home-manager;
108 in
109 host-nixpkgs.lib.nixosSystem {
110 # use system from config.localSystem
111 # see https://github.com/NixOS/nixpkgs/blob/5297d584bcc5f95c8e87c631813b4e2ab7f19ecc/nixos/lib/eval-config.nix#L55
112 system = null;
113 pkgs = null;
114 specialArgs = inputs;
115 modules = [
116 ./hosts/${host}/${mode}.nix
117 ./modules/default.nix
118 (
119 { config, ... }:
120 {
121 networking.hostName = host-nixpkgs.lib.mkDefault "${host}";
122 # pin nix command's nixpkgs flake to the system flake to avoid unnecessary downloads
123 nix.registry.nixpkgs.flake = host-nixpkgs;
124 system.stateVersion = "24.05";
125 # record git revision (can be queried with `nixos-version --json)
126 system.configurationRevision = host-nixpkgs.lib.mkIf (inputs.self ? rev) inputs.self.rev;
127 nixpkgs = {
128 config.allowUnfree = true;
129 config.permittedInsecurePackages = [
130 # https://github.com/nix-community/nixd/issues/357
131 "nix-2.16.2"
132 # https://github.com/mautrix/go/issues/262
133 "olm-3.2.16"
134 "aspnetcore-runtime-6.0.36"
135 "aspnetcore-runtime-wrapped-6.0.36"
136 "dotnet-sdk-6.0.428"
137 "dotnet-sdk-wrapped-6.0.428"
138 ];
139 overlays = getSystemOverlays config.nixpkgs.hostPlatform.system config.nixpkgs.config;
140 # uncomment for cross compilation (https://github.com/NixOS/nix/issues/3843)
141 #buildPlatform.system = "cpu-os";
142 };
143 security.acme-eon.acceptTerms = true;
144 }
145 )
146 host-home-manager.nixosModule
147 inputs.eilean.nixosModules.default
148 inputs.agenix.nixosModules.default
149 ];
150 };
151 readModes =
152 dir:
153 let
154 files = builtins.readDir dir;
155 in
156 let
157 filtered = inputs.nixpkgs.lib.attrsets.filterAttrs (
158 n: v: v == "regular" && (n == "default.nix" || n == "minimal.nix")
159 ) files;
160 in
161 let
162 names = inputs.nixpkgs.lib.attrNames filtered;
163 in
164 builtins.map (f: inputs.nixpkgs.lib.strings.removeSuffix ".nix" f) names;
165 mkModes =
166 host: modes:
167 builtins.map (mode: {
168 name = "${host}${if mode == "default" then "" else "-${mode}"}";
169 value = mkMode mode host;
170 }) modes;
171 mkHosts =
172 hosts:
173 let
174 nestedList = builtins.map (host: mkModes host (readModes ./hosts/${host})) hosts;
175 in
176 let
177 list = inputs.nixpkgs.lib.lists.flatten nestedList;
178 in
179 builtins.listToAttrs list;
180 hosts = builtins.attrNames (builtins.readDir ./hosts);
181 in
182 mkHosts hosts;
183
184 deploy = {
185 user = "root";
186 nodes = builtins.listToAttrs (
187 builtins.map
188 (
189 name:
190 let
191 machine = inputs.self.nixosConfigurations.${name};
192 system = machine.pkgs.system;
193 pkgs = import inputs.nixpkgs { inherit system; };
194 # nixpkgs with deploy-rs overlay but force the nixpkgs package
195 deployPkgs = import inputs.nixpkgs {
196 inherit system;
197 overlays = [
198 inputs.deploy-rs.overlay
199 (self: super: {
200 deploy-rs = {
201 inherit (pkgs) deploy-rs;
202 lib = super.deploy-rs.lib;
203 };
204 })
205 ];
206 };
207 in
208 {
209 inherit name;
210 value = {
211 # if we're on a different system build on the remote
212 #remoteBuild = machine.config.nixpkgs.hostPlatform.system == builtins.currentSystem;
213 remoteBuild = true;
214 sshUser = "root";
215 hostname = if name == "swan" then "eeg.cl.cam.ac.uk" else machine.config.networking.hostName;
216 profiles.system = {
217 user = "root";
218 path = deployPkgs.deploy-rs.lib.activate.nixos machine;
219 };
220 };
221 }
222 )
223 [
224 "capybara"
225 "duck"
226 "elephant"
227 "gecko"
228 "owl"
229 "shrew"
230 "swan"
231 ]
232 );
233 };
234
235 nixOnDroidConfigurations.default = inputs.nix-on-droid.lib.nixOnDroidConfiguration {
236 modules = [ (import ./nix-on-droid/default.nix inputs) ];
237 pkgs = import inputs.nixpkgs {
238 overlays = getSystemOverlays "aarch64-linux" { };
239 config.permittedInsecurePackages = [
240 # https://github.com/nix-community/nixd/issues/357
241 "nix-2.16.2"
242 ];
243 };
244 };
245
246 homeConfigurations = {
247 rtg24 =
248 let
249 system = "x86_64-linux";
250 pkgs = inputs.nixpkgs.legacyPackages.${system};
251 in
252 inputs.home-manager.lib.homeManagerConfiguration {
253 inherit pkgs;
254 modules = [
255 ./home/default.nix
256 {
257 nix.package = pkgs.nix;
258 nixpkgs.overlays = getSystemOverlays system { };
259 home.username = "rtg24";
260 home.homeDirectory = "/home/rtg24";
261 home.packages = with pkgs; [ home-manager ];
262 custom = {
263 machineColour = "red";
264 };
265 }
266 ];
267 };
268 };
269
270 legacyPackages = inputs.nixpkgs.lib.genAttrs inputs.nixpkgs.lib.systems.flakeExposed (system: {
271 nixpkgs = import inputs.nixpkgs {
272 inherit system;
273 overlays = getSystemOverlays system { };
274 };
275 });
276
277 formatter = inputs.nixpkgs.lib.genAttrs inputs.nixpkgs.lib.systems.flakeExposed (
278 system: inputs.nixpkgs.legacyPackages.${system}.nixfmt-rfc-style
279 );
280 };
281}