From 69b79aa3d9315001ad8bb3b7ed8711d89fa79b9f Mon Sep 17 00:00:00 2001 From: Crony Akatsuki Date: Sat, 10 May 2025 20:35:22 +0200 Subject: [PATCH] feat(servers): add odin, the chief. --- flake.nix | 20 ++++++++++++ hosts/odin/configuration.nix | 41 +++++++++++++++++++++++ hosts/odin/disk-config.nix | 54 +++++++++++++++++++++++++++++++ modules/servers/odin/default.nix | 2 ++ secrets/forgejo-db.age | Bin 964 -> 1074 bytes secrets/navidrome.age | Bin 985 -> 1095 bytes secrets/plausible.age | Bin 827 -> 937 bytes secrets/rclone.age | Bin 894 -> 1004 bytes secrets/secrets.nix | 3 +- secrets/traefik.age | Bin 939 -> 1049 bytes secrets/wg-desktop.age | Bin 1115 -> 1225 bytes secrets/wg-heimdall.age | Bin 1316 -> 1426 bytes 12 files changed, 119 insertions(+), 1 deletion(-) create mode 100644 hosts/odin/configuration.nix create mode 100644 hosts/odin/disk-config.nix create mode 100644 modules/servers/odin/default.nix diff --git a/flake.nix b/flake.nix index 9c0cd67..5afee07 100644 --- a/flake.nix +++ b/flake.nix @@ -132,6 +132,15 @@ path = deploy-rs.lib.aarch64-linux.activate.nixos self.nixosConfigurations.thor; }; }; + + odin = { + hostname = "odin"; + profiles.system = { + sshUser = "root"; + user = "root"; + path = deploy-rs.lib.aarch64-linux.activate.nixos self.nixosConfigurations.odin; + }; + }; }; nixOnDroidConfigurations.default = nix-on-droid.lib.nixOnDroidConfiguration { @@ -201,6 +210,17 @@ ]; }; + odin = nixpkgs.lib.nixosSystem { + system = "aarch64-linux"; + modules = [ + disko.nixosModules.disko + agenix.nixosModules.default + ./hosts/odin/configuration.nix + ./modules/servers/general + ./modules/servers/odin + ]; + }; + nixos = nixpkgs.lib.nixosSystem { specialArgs = {inherit inputs;}; modules = [ diff --git a/hosts/odin/configuration.nix b/hosts/odin/configuration.nix new file mode 100644 index 0000000..f486088 --- /dev/null +++ b/hosts/odin/configuration.nix @@ -0,0 +1,41 @@ +{ + modulesPath, + lib, + pkgs, + ... +}: { + imports = [ + (modulesPath + "/installer/scan/not-detected.nix") + (modulesPath + "/profiles/qemu-guest.nix") + ./disk-config.nix + ]; + + networking.hostName = "odin"; + + boot.loader.grub = { + efiSupport = true; + efiInstallAsRemovable = true; + }; + + environment.systemPackages = map lib.lowPrio [ + pkgs.curl + pkgs.neovim + pkgs.gitMinimal + ]; + + networking.useNetworkd = true; + systemd.network.enable = true; + systemd.network.networks."10-wan" = { + matchConfig.Name = "enp1s0"; # either ens3 or enp1s0 depending on system, check 'ip addr' + networkConfig.DHCP = "ipv4"; + address = [ + # replace this address with the one assigned to your instance + "2a01:4f9:c012:f6df::1/64" + ]; + routes = [ + {Gateway = "fe80::1";} + ]; + }; + + system.stateVersion = "24.05"; +} diff --git a/hosts/odin/disk-config.nix b/hosts/odin/disk-config.nix new file mode 100644 index 0000000..8f36ed4 --- /dev/null +++ b/hosts/odin/disk-config.nix @@ -0,0 +1,54 @@ +{lib, ...}: { + disko.devices = { + disk.disk1 = { + device = lib.mkDefault "/dev/sda"; + type = "disk"; + content = { + type = "gpt"; + partitions = { + boot = { + name = "boot"; + size = "1M"; + type = "EF02"; + }; + esp = { + name = "ESP"; + size = "500M"; + type = "EF00"; + content = { + type = "filesystem"; + format = "vfat"; + mountpoint = "/boot"; + }; + }; + root = { + name = "root"; + size = "100%"; + content = { + type = "lvm_pv"; + vg = "pool"; + }; + }; + }; + }; + }; + lvm_vg = { + pool = { + type = "lvm_vg"; + lvs = { + root = { + size = "100%FREE"; + content = { + type = "filesystem"; + format = "ext4"; + mountpoint = "/"; + mountOptions = [ + "defaults" + ]; + }; + }; + }; + }; + }; + }; +} diff --git a/modules/servers/odin/default.nix b/modules/servers/odin/default.nix new file mode 100644 index 0000000..ea8f50d --- /dev/null +++ b/modules/servers/odin/default.nix @@ -0,0 +1,2 @@ +{...}: { +} diff --git a/secrets/forgejo-db.age b/secrets/forgejo-db.age index 5e5a3bc3ea005ad3865a80ed2baa0248574c2860..0ef4a69f9365a0e615f7ebf8b87901a3bcbc7d41 100644 GIT binary patch delta 987 zcmX@YzKLUkPQ7EQnSWkzL3xHrps9D1Uy+}8aYjXx^SX}P&)abk+TW2KozpjmNt zIhTofjP{WSXI$c4CxsaAAapWrjzKIc0;bGb?$x$9Yp{b5W#cr0#rXhvdF7DZr;~B-n&77-(eX7cw z4BSHlbN%%_i-Su|3L-6vd?O07^&=BAGlINJ3{!GV{j<`!lG4(uqSBKp4ARX!3%qkJ zBcm+Biv6-&ESwC}ef@&WGa@}xEmMtCs&XACpJf!U5B4ue$;m5@3XbwmD^7HYFmo#? zt~4`qvNUq6@YdFLO!IZMC<)362+mCBa<7ak%5}>wO34rRFUl-1i3s#5PA{wSFLNx3 zN-=XyD#~|q3dpL+clC@!kAY-YPd{Hrg`grw)6#5r4|mrLmoz7{l9KwY^2*RKf0x7z z*St($a|`p-ymB97ckimabgqhmuuScuDuZONDz6Z;(qt23w~BP%a>EqUD*q(?Lj9`D zf?!K?!zdraP;~3kQuL#I0u?-+b1f`#)16IAGNXzOlEZyMlfxrTgZ;`AwUetdOv@{i z>r0KR5*^bm$_==(ECLK&Lc_~*Eu50W(jCpb3yh+wBE164(tX^$^YkNKOf!R$GTptC z^dq@+b#)c891HY4ohp5T42+A6w7pBBJc{xy(<%$JOY_sBoPsQJ{GB87Qv$;aj6%5> zHWg2~wtUm-j;zCF2N^d-mCi8U@;$;}cUQgck@;(~-_`zpyy?luqicW6u_`=xdHepevFx&%^}gqv;YZ(nN6(qe-srRAz>9NQ^F&|1n`V1CjIVifUDwhZ zC6mhSLt=s|JcJLNSgZIge^W}6{X~KH^Y6>ZmU3OOS}82<@pN^g`$;Y4V<)3Zm5Scq uv(B9NAtdu)lE%Y-xuUBYQ+8PQ8b=xwogGuSG<5VxnJ|g=?s*tFfm~s=u~hc7%&-XttSUrK7XEQ+TkE z0as#`Nob+3L6$|RK~iCmZ-kp)czQ-!NU64QMVP;~g-@wrwtuO+epo<$B$uw8LUD11 zZfc5=si~o*f|+(kU_qdQONpO_OG$R5w~3*5S*~G(wp&QBsi#SvhmTuidZu=0zK>C1 zO0cVOez9{hmuYTPc3G02t8r>paA=NEVO3PRrMGE$W@d(ANOo{}nSPR6d6l-mS7pBA z#E;_P`kDE`C8@y`rpd1UQ9;2Ou9j&jj+W+@-YFq@d0Ay%X-WQpi3UE!MPbEUF5YFu zk%=bmK0$@a*~Ug0kpY%vsrq37E|HO$zJ>YP#ub(o`mRAaL20g&;~B-n%TxXGbB)VG zoGVk(oXm`JLLv*ZUA4n<10y1ey`z%-Q=K!sLUX;tQ!eN^^S1# zDoGD8sMM~|HuLf*@G|j4kAbul{V1P61)p?hGfz(wZNG|;oS?$U z(jt@ciUR#SixhKbmon{ePp*tazbw_0l zRk7vA=T)Yh3;VZn`jmj1K{AJ*-Pm>eSUh8HNaEHUR_FZWPth)x8CE%|#C9e{81~G%JCT%$J_Keoyx?-QpFz52TMf zFJ-9w>sfs6^1KPNB~G60dy?XznC974dZcOYKUbx$7`{{k!yYZ?o_&uh?bZMQavMbh diff --git a/secrets/navidrome.age b/secrets/navidrome.age index 723c0ae0527091d7d0df851bdadfd2e5ac0870ad..fd909a1b3c9c3bdd59b1a7a4f17f5c9e0b5fd4cc 100644 GIT binary patch delta 1007 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 Cwj#Lz delta 738 zcmZ3JNSRx?cCn{-m3viIMX|X>Mq++RWq5F4M4+>8s&7D6ftgW7 zI#-3ihoO_XQ)X$Yc8a%=MOjFyrDcI@T26L_rJF}!Scqe&iL+~ARjO~6Czr0BLUD11 zZfc5=si~o*f|+(kU_qdQSCW@mR&Jnixtm8=NI{CWkDE_umVcUASh-WEetA%ON?4w= zTdr@Bc|?UTmv=;wp^2HRQ(;a-PHBasYp7F_UrvQzk-1k`s%c1AlDE5uL4cc6dZxSM z#E;_PAt_~fnYlitUfIRLAts4F5&o7&k@?z@UYVZWPKMrYkrk!JMV1z2MPcP!?zsVl z=J`c#zLDBdk>}=ff3o0;~B-n{X7bS^GeM^ zQnHNoD-8+_^usOP^3p0Cy>gsV0t0c?)T_b&ijY`6D^s7A6jDjO4pJf!Uk0^=s*EaA;$w-QfOe*yD%d9Xj z4=_q9b@eQFP4h6f$V}8PEHVu*ugo;z@-r?dGIBQ#FY@v&3w6v6adwGF^-MF0$jb{Y zh%Bvi@(=fNNlyxJbPFs;kAbul{V1P6g3$7C1XXg&vS<6Hg>-Wa*`)RkP`r?%@EGhG6?bxBYDvQb1F|Hu=Me+KiUZ#s@ zCQV;vmDe3KZ{J6WokIH=_#cbj?2NN$PyV%7G}bA9&8+&;|5K70E1$dkmnwX`x%X1b Jm)|v69sod81h)VH diff --git a/secrets/rclone.age b/secrets/rclone.age index 62ae86796a614767b2f862f0aa4b8b5923e96023..ce532ab200ac8c79bd7cbe74c388d11637aea58d 100644 GIT binary patch delta 916 zcmeyz_J)0eZhe%CZ=SZJzNtxNQhA1{uXC_@R8X)*ws&}0Qd)_-UuBeePDqhyVN|98 zS8ADGPIgtHMWtm_dQM1HfN6xQWoDSMXNsq1kbZD>X_mX8L4JyRx|2&Xm#&>cadC!j zYKoDmsiCEUnRZ5CL7;+hm6LmLP@u7qNl1i;xn-7-p{t*_wtk_7Yf`RHad@tFnOS+V zfxEX;Raib(SXicWnXhF^ScPGheo$q;pQW#3puVAdj&E{)a+Hr*kYlQ0zD1Z(Rz~^6 zkK*ClW~up6`euf?$)&-Co+*a@zE#c!8NtS-5qSpgmQDr1hWb%Sjz;Dt1{PeUNr`#B z86KVeV+M&LF5m5%&W&Yt6CCQWH8O6i1(<+Qo9o;Ov zoC2H;a!kx3Jbfc7k}I9U{Ie_k!%E7vjnh4Ry^_mvf;_qMEGkTW0@4HhBJ=YrgWZDz z!-|8-OdMS@t3t|CLM)>!i_(*e1B3JP^nE9vWfZSZH>h;=O!2lzDJZhcO0@J!4|1xE zFevp;);Ejt@X9GLEeP}UFf}SQ%Jk(b2s5lQ$a2gzG4u@&(6>y<2`~-GPRaK6OsYuA z@-}eyHj2m$FpYGvFvf_1WLHl=Uq=P+T+^&X%apPt7ym*JkL;Y3dXG@;sG^|aDF4i= zph^>yjATQT;sEyy4|fYL53?Y%$lMC&@XQqRLYJZ(uhg7iOS7sxm!Kd|uhNw8EQ5-Q z@bF@T3`-OA2v1AVkMaprNXj&`j4}u+$tf()*LTS-$Vn_LGE589FDNd_b9L6vE7Gnv z@k!1MvGg%C;nH>r4+zjMjtHu(^e@ZF^KtXdD>SRnPxVi9E%S;>cTNd4_KtK7Oz|o* z;nLOBRWQf#n?zItOQ*W`q`Y%)z9BI*3&!K5tZ1HLCotx$gn`@Fz&lL;0G_U(>$rKk; zmR-dzf7DG%o@z6`v-l>mVxOFp&-Ev3jUOFLXjv=9;K-L3YQ*&I=jZ?5)$bR(ww?`| zx^LzDe|OR}e)qdiHDglRvj2Q*={x1Jhc=cfx4%66I@!kUdr%39T!lo-Us V(D|NcOR&JgjL957Iv=by0RROlLf-%Y delta 805 zcmaFE{*P^fZhe`%abcFbS9nxGNRnTnL3*j5v2UJcadC!j zYKoDmsiCEUnRZ5CL7+mIYe-^hfPSt~dY*+}Rd#M@qH9r=c2;(3MQT81g=1K@yIH0| zsdiLAprbEWT4aG?lx2BnezJaMYOteQN|sdBQ&uS{}`D32=3DK#iG ziqy{xEintt%C^W1&P+#-fwUC;D4#%u5JMCHLNEPbZAUY+TracI(E9v}JQK50myoOs zC%-6SgdD+j+pCeWq d-Z(MmN2YGVU8{vXv$d8=E;lYrG=IA(7yzceDN_Id diff --git a/secrets/secrets.nix b/secrets/secrets.nix index 51f4a65..55eff04 100644 --- a/secrets/secrets.nix +++ b/secrets/secrets.nix @@ -5,6 +5,7 @@ let baldur = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIOvZ7Z8GS4+1+9D6u/BDit4Eij5Ubbii2dzJ/+ecT8iR"; bragi = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIBKMV2vqlDvIkUefl5oEuVjVtjgFLEXyDKX2LWhVQsWT"; thor = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIHZGQLUhyLwmkTYhSccqO8umQJN0QHk6YaD863x7lcGv"; + odin = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIBGfwv4CzZlPGsBukfoq5wBTlVfWJo7UHH7DP3ILP6/Z"; # USERS root = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIBJLduAXHWJiglmfRfkBGKffzVWkJP6porxIzw6+Zz3W crony@cronyakatsuki.xyz"; @@ -12,7 +13,7 @@ let users = [ root ]; - systems = [heimdall loki baldur bragi thor]; + systems = [heimdall loki baldur bragi thor odin]; in { "traefik.age".publicKeys = systems ++ users; "wg-heimdall.age".publicKeys = systems ++ users; diff --git a/secrets/traefik.age b/secrets/traefik.age index 9b740bb3445e65e20aa39b2953a1a1e8c5f68d7a..630babf7d32badf6edc7ecfbf8f8e8c5445da54c 100644 GIT binary patch delta 962 zcmZ3@K9ggDPQ6ohUYU_$QAJ9mYjHtAUZ}5ENm;SGp`~T2K}l6qK~+grUQkteu%nZ) zBUh4RvR`mwk(py)hGkxPX>PG^L3n6RQdDA*hl@#4no&W4c}04@r=PcpBbTn7LUD11 zZfc5=si~o*f|+(kU_qdQn^#z9xoc8HnNLnco{xKpzFSF=ziE19j%RRiP+(F~npa?2 zXuhYVS46NYm%f=}a#e_zpIb;}sH2xtflsA{Us_1GzF%Z{l&582q?vz3NV$Q2U~Zc0 z#E;_Pc_|?kl^H391{O&bl}Rba&Ka4d#m;_Ci2=dJ0TsrjM*5|Gjvhsc>FLE>iLMoy zCIwaH9_f}z+Li^{5#=UM0j?E}shI}lnMMY|Mv2BA6&7yA!OotO;~B-n)3qJ*{5=x= zLW^>IJo229{4?BrEHhHd5)C5*(=BpyJu(9`lC<5DB3;tCqD-CL%X3|GwM`;QoP3;e zy`3ym3jN(JTs(8M4Kma7jotE1)6Cq{LtP>#pJf!U_suZyFxL+Yb&E)G%keZ0E=+Nb z@=J{jbTFTakAY-YPd{Hrg_6XyVsGcf2yGANP`~hSqwM;8L$h=@efRLZ zQor!LO0$Z5{Rr(!-=xxVPp$%g-`olhM<>US+|*Rl67#U^JU4GA4=*pDkcgnX^6b1& zb5C#2(qK2sKy>TUQuL#I0u?Hq{i+H>!;Fh8f}_GxiXGGZJ(5jRlU=j3jVrSK%*x7x z>wWwSy&?nBT^+eH0?PfI$}HWzlFgkwv;AE2oI}$*iz=MLoc(-Dazb;`EDXc5-A%k) zE%Lc^b#)cYD}oHmP4fcsN^;CCDtui$w0+V;{i1x5s+=MUiUQ1{jQm2A!kxp6wTrnD z1(W*~w`Jlj=<)!>x}>|Cyzhn*B>^LCogFlNLKM-<71;vX1UADxo$B2v42v>@A9xm>iNNv+(yUW6a8;K zJQBtm+>*iCl==9O^ed5!uQK|zPojFXSVaOZ#@^o*9N)Bh-@zX@xQ-=#;#plMaJlRE zWS`Is%NcX-%Nfh?bu4Ui{&{7o=IQ1RJ4Z_o@m#HfOP2p<>{)M2{gfiq$&q&~iQ RB|R~w;$V0Fv;(sH3IGLETBiU2 delta 851 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 D2B#Yx delta 1231 zcmbQly@YFmPJN+vNxD;rk6~b%v5U7~ez;?JM3RAzW0k3Pp^0OrS9oe-Xl{9_WnzX$ zI+vqMMux9%MTKRCPnBbsnVV-oSZR59hLe7Bd2nuqt3{HrN3LUUVL1KPNzLTq0Rg`=B z#E;_PS>BNr#_1-0rpcL^soEAssaawE`B8yICE70e`o>W~L8&I;A+E;xriR5_zFC<@ z$*C@xuH}_Zo)wio*%78*0Uqft-g)K*86J6-CYBkF;l=tnNk*QN;~B-nqr8es%JnNu zi^E+i+)DiO+(L2^eZ8HsEpw6#65X;Y%(D~2-SSf1d|WKJvQ4~m%o2?P%5(EW{DYm{ zqO^-cDlENylhb@tqWn#a41!WpjncghQlqjbpJf!UH#dy%(DscoPBad+h>FT|u?(v8 zDND%?_R8@~4@)*Sa>*(P_jhs&@d`BIib$y}$TCl?G;lPn^hwDs%yLX}D{)GR$}92? z%}mNM&o9iZOmhvd3h)R-kAbul{V1P6g(TNBkK)t_zsl^&aEnL_*P!}j$FN*eKR5sU zq~ub^3LkxgM8BX6{gAR811_gvQ=de)?A(w@i)5F)(t@-g{ZcQ>N}t3GQ`hvwyd+11 zfFO^M@WM#{VlG`>U4`Vzh{8n2Ku2xEjMV%B%h2MG+^W>jRByi`Q^P`^pvuaWato*O zG@}wTPcEIP4^4OS5AUj%IpXZK*kHck-H#EL1ygrCyz_u{;&k5*75d*1x1GmGuB@#-|KE{ z();?P`1^jdGqz8|pVYrzKCwaJce2Y;Ifk=GX1Hn32!5xcn{#wuf2gf%we8!~4&y)i zdfIs@U1m|zx1U(d%v-f)^3gX>Zp>btyy@!c7aD)9natk(n)L7aKi!4*?v+&@T#5zwl&MI!o;Wf5xjzKG-LOeH1q-xcvR)#8cZo-oN@S#$aEUfr-WXbZ@<%_&3XRX$;beih-Gnok$*(Kv>n|p{O!y^y{Ydn=RdSzF-sA> K7ZZPM2M+-J1o>nD