Tangled infrastructure definitions in Nix
1{
2 description = "nix infra for tangled";
3
4 inputs = {
5 nixpkgs.url = "github:nixos/nixpkgs/nixos-25.11";
6 tangled.url = "git+https://tangled.org/tangled.org/core";
7 tangled-mirror.url = "git+https://tangled.org/tangled.org/core?ref=sl/knotmirror";
8 colmena.url = "github:zhaofengli/colmena/release-0.4.x";
9 disko = {
10 url = "github:nix-community/disko";
11 inputs.nixpkgs.follows = "nixpkgs";
12 };
13 nixery-flake = {
14 type = "github";
15 owner = "tazjin";
16 repo = "nixery";
17 flake = false;
18 };
19 };
20
21 outputs = { nixpkgs, disko, colmena, nixery-flake, tangled, tangled-mirror, ... }:
22 let
23 system = "x86_64-linux";
24 commonArgs = import ./common/ssh.nix;
25
26 # Helper function to create nixosConfiguration
27 mkHost = hostname: extraModules:
28 nixpkgs.lib.nixosSystem {
29 inherit system;
30 specialArgs = { inherit commonArgs; };
31 modules = [
32 disko.nixosModules.disko
33 ./hosts/${hostname}/configuration.nix
34 ] ++ extraModules;
35 };
36
37 # Helper function to create colmena host
38 mkColmenaHost = hostname: targetHost: targetPort: extraModules:
39 {
40 deployment = {
41 inherit targetHost;
42 inherit targetPort;
43 targetUser = "tangler";
44 buildOnTarget = true;
45 };
46 nixpkgs.system = system;
47 time.timeZone = "Europe/Helsinki";
48 imports = [
49 disko.nixosModules.disko
50 ./hosts/${hostname}/configuration.nix
51 ] ++ extraModules;
52 };
53
54 # Host configurations
55 hosts = {
56 appview = {
57 modules = [
58 tangled.nixosModules.appview
59 ./hosts/appview/services/appview.nix
60 ./hosts/appview/services/nginx.nix
61 ./hosts/appview/services/litestream.nix
62 ];
63 target = "95.111.205.38";
64 };
65
66 pds = {
67 modules = [
68 ./hosts/pds/services/nginx.nix
69 ./hosts/pds/services/pds.nix
70 ];
71 target = "tngl.sh";
72 };
73
74 nixery = {
75 modules = [
76 tangled.nixosModules.spindle
77 ./hosts/nixery/services/nginx.nix
78 ./hosts/nixery/services/openbao/openbao.nix
79 ./hosts/nixery/services/openbao/proxy.nix
80 ./hosts/nixery/services/nixery.nix
81 ];
82 target = "nixery.tangled.sh";
83 };
84
85 spindle = {
86 modules = [
87 tangled.nixosModules.spindle
88 ./hosts/spindle/services/openbao/openbao.nix
89 ./hosts/spindle/services/openbao/proxy.nix
90 ./hosts/spindle/services/spindle.nix
91 ./hosts/spindle/services/nginx.nix
92 ];
93 target = "spindle.alpha.tangled.sh";
94 };
95
96 knot1 = {
97 modules = [
98 tangled.nixosModules.knot
99 ./hosts/knot1/services/knot.nix
100 ./hosts/knot1/services/nginx.nix
101 ];
102 target = "knot1.alpha.tangled.sh";
103 };
104
105 mirror = {
106 modules = [
107 tangled-mirror.nixosModules.knotmirror
108 { nixpkgs.overlays = [ tangled-mirror.overlays.default ]; }
109 ./hosts/mirror/services/knotmirror.nix
110 ];
111 target = "81.27.110.122";
112 };
113 };
114 in
115 {
116 # nixos-anywhere and nixos-rebuild use these
117 nixosConfigurations = {
118 appview = mkHost "appview" hosts.appview.modules;
119 pds = mkHost "pds" hosts.pds.modules;
120 nixery = mkHost "nixery" hosts.nixery.modules;
121 spindle = mkHost "spindle" hosts.spindle.modules;
122 knot1 = mkHost "knot1" hosts.knot1.modules;
123 mirror = mkHost "mirror" hosts.mirror.modules;
124 };
125
126 # colmena uses this
127 colmenaHive = colmena.lib.makeHive {
128 meta = {
129 nixpkgs = nixpkgs.legacyPackages.${system};
130 specialArgs = {
131 inherit commonArgs;
132 nixery-pkgs = import nixery-flake.outPath {
133 pkgs = import nixpkgs { inherit system; };
134 };
135 tangled-pkgs = tangled.packages.x86_64-linux;
136 };
137 };
138
139 defaults = { pkgs, ... }: {
140 environment.systemPackages = [ pkgs.curl ];
141 };
142
143 appview = mkColmenaHost "appview" hosts.appview.target 2222 hosts.appview.modules;
144 pds = mkColmenaHost "pds" hosts.pds.target 22 hosts.pds.modules;
145 nixery = mkColmenaHost "nixery" hosts.nixery.target 22 hosts.nixery.modules;
146 spindle = mkColmenaHost "spindle" hosts.spindle.target 22 hosts.spindle.modules;
147 knot1 = mkColmenaHost "knot1" hosts.knot1.target 22 hosts.knot1.modules;
148 mirror = mkColmenaHost "mirror" hosts.mirror.target 22 hosts.mirror.modules;
149 };
150 };
151}