Compare commits
2107 commits
renovate/r
...
new
Author | SHA1 | Date | |
---|---|---|---|
b32c281fa5 | |||
1b4f2a21d7 | |||
bc9bae0c88 | |||
69cb4f9de6 | |||
2011e03edc | |||
722397ac43 | |||
773df94aa6 | |||
4d68f77111 | |||
46ec55b24b | |||
bb43ee4e1d | |||
fc075254bb | |||
10e8aea249 | |||
529a7e7767 | |||
0c216cd3a1 | |||
d4f97f528c | |||
715d42169e | |||
002adf25c2 | |||
afa692e17d | |||
8413ab2e0f | |||
c9fb02840b | |||
a24394ecf6 | |||
b964998c17 | |||
b0845c833a | |||
bff04dd948 | |||
52f607e2f4 | |||
d214e81b23 | |||
1e633dd97d | |||
0d2d9f5be5 | |||
cc0c0c6538 | |||
359c8534f9 | |||
6aa17892b1 | |||
45a989280b | |||
fa2c29d88e | |||
cdf9881428 | |||
c253f696a9 | |||
7e48aee857 | |||
084904a8bc | |||
17c199069c | |||
c4b08af314 | |||
98fb1316e7 | |||
d4dcdef371 | |||
ccbbb7f26e | |||
375587cfa4 | |||
a1cec54ec8 | |||
f0380bbe4e | |||
b745ec7b85 | |||
1121272da3 | |||
f42c42b0a7 | |||
c4b8889492 | |||
07020f01c3 | |||
d266a48b98 | |||
fa23dd9e01 | |||
a9207d6844 | |||
06f6f5f4a6 | |||
cfc82b3817 | |||
a3283256b4 | |||
f2767b0596 | |||
f70a18723f | |||
46151ed25b | |||
ef35ed546e | |||
6215afa533 | |||
39c8317c93 | |||
edfe487b8a | |||
d629b5d4ed | |||
05b317d275 | |||
123fd7b129 | |||
586f01ac58 | |||
3783ec19c6 | |||
3a56012932 | |||
5eefa66896 | |||
636e23deb7 | |||
89ce2c97d9 | |||
457537462a | |||
4416a21e47 | |||
8d7f778b65 | |||
4960ed0866 | |||
c2552d39a1 | |||
6d342f9d6e | |||
166a9cd75a | |||
f156c2396f | |||
dfd934873b | |||
dcc9d733ae | |||
a04a4bcf3a | |||
af2b5a14f2 | |||
84f07ef08f | |||
96a07f14dd | |||
26f8150f49 | |||
23aa68d0fa | |||
e913bd96d5 | |||
3d63c94742 | |||
1142c6acac | |||
24dd2cce4f | |||
a7e1717462 | |||
40d88c2169 | |||
6034940039 | |||
2d4b9bb0ed | |||
10d319f426 | |||
d7eb7b48b6 | |||
75af9679d2 | |||
42d258e73b | |||
6f5e15cc38 | |||
4761af4659 | |||
f88e0c6932 | |||
b3ff2a7268 | |||
84b3618a24 | |||
30de216118 | |||
23fd3adfa3 | |||
9bf6d76aa6 | |||
dbdcf45edb | |||
84c6992a2e | |||
6521b948b2 | |||
3a8cb9ebd7 | |||
d4c357ba6a | |||
ce95a03797 | |||
403dab967f | |||
31efb2f0e6 | |||
e82b6cad69 | |||
c48f42fde4 | |||
![]() |
19b9c47523 | ||
82bc9ac40c | |||
ee02043b4c | |||
a90974e7db | |||
95a641d679 | |||
fbd8f6026b | |||
567a6e86bc | |||
fbcb9a66e4 | |||
0fe2bdbcc5 | |||
6255373ab2 | |||
d54752bb2d | |||
ac4b913fdd | |||
4b7af73422 | |||
0d75bf8f84 | |||
b3c15579c9 | |||
c42053fe2b | |||
a52aa3565e | |||
f884d4fad1 | |||
21146f09f4 | |||
95c2e89e27 | |||
3e9351d48f | |||
d54ffcd5e6 | |||
40e4640613 | |||
3ae1ab6d4e | |||
27e141ce40 | |||
1b7017b3e9 | |||
3dd904425b | |||
0b91b3df89 | |||
fad4ef65da | |||
6b58420562 | |||
85d41a6458 | |||
10788f1961 | |||
1bf70090b5 | |||
d640bf96e9 | |||
cc656ff1b2 | |||
e16116720d | |||
33b33196ff | |||
92480d2049 | |||
99c5b9d802 | |||
2713f04a9e | |||
187bc9261e | |||
cd4589d97d | |||
8dcd4e0bde | |||
e4d6672644 | |||
ac267e4a7f | |||
1e3a9c1ef0 | |||
2923fe2e0c | |||
dff7f4e389 | |||
94708a2f20 | |||
318af67a0d | |||
9ddd2abe84 | |||
eae3f0c4e8 | |||
85d4d6526a | |||
78f28f0a4a | |||
761b743661 | |||
![]() |
c2155ec45f | ||
f28ea48496 | |||
4ce2706555 | |||
a7b0d99d0d | |||
5f1d17489c | |||
6c5adb717b | |||
a86a1c7bec | |||
d77b73216b | |||
9bfdfe3924 | |||
b4c9525cbc | |||
29add4ac4d | |||
2d6591affc | |||
![]() |
912bd1a02c | ||
2b3fb3b3fa | |||
0c3e40b040 | |||
4528d77eb3 | |||
e6d4b1a23c | |||
18afb28946 | |||
248276846e | |||
9bbbc9812b | |||
65e23a61a2 | |||
45e6b1621e | |||
0325057302 | |||
41bd3cd711 | |||
2f0845769e | |||
d226ca6a0d | |||
0d0471af26 | |||
ad61af04fb | |||
7e70ce23d4 | |||
10b3e14926 | |||
e0de10658d | |||
b602207b67 | |||
05ac4f2b9a | |||
![]() |
5cb4b29cff | ||
b42e60fee1 | |||
![]() |
c962a5e186 | ||
8c81da8526 | |||
398e0ddbd5 | |||
0933b2b504 | |||
6105d8bc05 | |||
![]() |
46459a6c04 | ||
beeb1971b0 | |||
855522d78f | |||
c18c4dca14 | |||
2d33c99c16 | |||
46460fdd59 | |||
283f56e5a7 | |||
08bdc66b49 | |||
403917b0fa | |||
81f6fe3535 | |||
![]() |
a7d055abec | ||
9d1f907d72 | |||
33cbe912c9 | |||
1871546290 | |||
02328be3fa | |||
d63e2f9eb8 | |||
78eb7a7261 | |||
ec3665195e | |||
5629ae54f8 | |||
9b021db760 | |||
db61d5330f | |||
26aeb4c383 | |||
3ac866ee09 | |||
489e14f422 | |||
0a30cdaa5a | |||
9536d442d1 | |||
312de0a1a6 | |||
1252ff4786 | |||
85edc31020 | |||
71d6bfe676 | |||
336fee5fe5 | |||
2445a8e5cd | |||
58ddacd536 | |||
01933b1ffa | |||
1919e7ee3b | |||
48c92f411a | |||
e207baef54 | |||
fc3872cd5a | |||
b506edc3d3 | |||
bd0e62b574 | |||
9631e3f06e | |||
c934c7faf6 | |||
64df29aad3 | |||
8c7736e7cb | |||
b957513da2 | |||
6f76f3f6fe | |||
d9614e7f74 | |||
298f687973 | |||
a65d26f919 | |||
f9aee676b6 | |||
7e4a34dadb | |||
![]() |
10d0f9805e | ||
bd11b54417 | |||
86dce0f901 | |||
0dddc76cca | |||
febe1aaaf0 | |||
e610f761c2 | |||
62da19316c | |||
b215107f42 | |||
7ff83bd7bf | |||
1684ec83e0 | |||
161da282f7 | |||
25b9fec834 | |||
8fcd78aee0 | |||
![]() |
2fb07fc057 | ||
f522145ed0 | |||
7d9d749f20 | |||
fd399aab2b | |||
9e3c95742c | |||
4315202398 | |||
![]() |
04425e32ed | ||
aeb4bce832 | |||
8657974ac3 | |||
e1737ade77 | |||
1380eb16b5 | |||
![]() |
309af6738e | ||
ce31416ce5 | |||
e5d54afcd2 | |||
08fac2dd82 | |||
0a7d8ae672 | |||
57b9bf96a8 | |||
39af7c5d1b | |||
2b4513fcfd | |||
a15f26c5ef | |||
cd726575f8 | |||
47377f4dc3 | |||
01132e74b0 | |||
7a04088e3c | |||
797a2844f9 | |||
377bfc38fd | |||
bf324c5057 | |||
4a715d239e | |||
4ca1399ece | |||
34388efd45 | |||
19ab29e4a8 | |||
f6d0da28a6 | |||
3f56265859 | |||
932844a424 | |||
0b2ae91e12 | |||
3480322fdd | |||
cca71b77c3 | |||
dcbc668f71 | |||
b64a6f2271 | |||
940b3219e6 | |||
94648356cf | |||
d8f394adbe | |||
f40b5cb418 | |||
e44643da4d | |||
4f0357933c | |||
3044a668f5 | |||
7daf1c88d0 | |||
6ff74f0d6e | |||
699a13ea75 | |||
80bb2e32a3 | |||
fac4ffd2a1 | |||
4eb809d94e | |||
a598e2494d | |||
![]() |
4b775883f3 | ||
0ab178a7de | |||
2fb553e680 | |||
d98724ce74 | |||
c2b0afaf14 | |||
ecf7e4f412 | |||
6a04bb1adb | |||
4a87c868a7 | |||
f48331c66b | |||
c5120dec62 | |||
0804af2655 | |||
f1ec8f5079 | |||
40771d0421 | |||
92d3e8ecfb | |||
ba7528b508 | |||
9015cb7fed | |||
d6bf12f3e1 | |||
e03c7461c3 | |||
![]() |
4ba8fec879 | ||
64459fb5c1 | |||
89d863bd09 | |||
dc04f3baa6 | |||
54189c2093 | |||
c592e0a885 | |||
fa2054f931 | |||
bb5f882266 | |||
fedaf50a6e | |||
426d0c46e3 | |||
4e716761fb | |||
c1ab40ec04 | |||
7e0a7fb1bc | |||
0245770779 | |||
1e394c925b | |||
8cc8db56f1 | |||
20b6258540 | |||
c056d036be | |||
99f426a212 | |||
0f6246ae2b | |||
b2766475f3 | |||
4da1eeda6a | |||
3d3c9f33b0 | |||
d974792eb3 | |||
11414edf6c | |||
22533f196f | |||
a1cb40b1de | |||
![]() |
01796e5683 | ||
fadce65c1d | |||
fea0747f43 | |||
c8ae35f293 | |||
d5ed08d305 | |||
6b1e3fefd8 | |||
ac8abf75f1 | |||
d63b29c861 | |||
dd28445849 | |||
b3f6566b63 | |||
77da21044c | |||
f26480754a | |||
f16430567e | |||
1762660b7b | |||
f387a44282 | |||
ea94f285ef | |||
01692a4eee | |||
cdda2d804a | |||
f42290bb1c | |||
da52e4c695 | |||
1cb7e2dd01 | |||
3d584af379 | |||
5d8f890715 | |||
421dbcd224 | |||
a501dcd978 | |||
a0951cc24f | |||
2c23f04aa9 | |||
3d48b958f3 | |||
4391cd9b7b | |||
260bfff6aa | |||
5b3ac6c316 | |||
53658c2a77 | |||
88f017b9fc | |||
6ca7b82776 | |||
7ccf34f7f1 | |||
2b582d6fff | |||
845ddb64c3 | |||
1a3d602979 | |||
793148fb49 | |||
7e254198f7 | |||
a1c97e7e81 | |||
e284996f8f | |||
9b85b53c10 | |||
6942e761e5 | |||
c25e701659 | |||
943cd67120 | |||
6305bbc907 | |||
39d852ff28 | |||
e467bf22dd | |||
![]() |
785c858df7 | ||
47471cfb3a | |||
8968784751 | |||
7f81ace7a6 | |||
ccbafb1638 | |||
a369bb0ba2 | |||
93fa8d46ab | |||
0b64e90d9b | |||
54b38cb6cc | |||
f9b01b99bf | |||
0d8f48cdd0 | |||
8a8d69d2d9 | |||
92e4ecb9fe | |||
717b271d54 | |||
a82dbf2dac | |||
3a7b88fd49 | |||
00668155d3 | |||
060384d36b | |||
c65f2de803 | |||
584bf711e5 | |||
820fd3fadc | |||
49eae2094a | |||
9be4a5ba50 | |||
a35b0c32a2 | |||
b2bcab0ab2 | |||
663c7e17c2 | |||
bdecc4cd71 | |||
3eb4fa4fb3 | |||
fc0f5c6cfa | |||
c5a8bca3ff | |||
37db8a1c19 | |||
3c768f29f3 | |||
14bf3bf857 | |||
1439ff5e8e | |||
ffb489c7e7 | |||
b5a16c55c5 | |||
054debbadb | |||
7e2eefb741 | |||
eac64f0dc1 | |||
05789285de | |||
ff73e16df3 | |||
3ee3abf184 | |||
89b1fc411a | |||
67a7ac382b | |||
2fd2f93853 | |||
efeeb8d81a | |||
1a1f00260f | |||
90ca46a285 | |||
21a01d3dd4 | |||
04084c3a4b | |||
700b9a4e7d | |||
51f2a2305f | |||
ddb8fcf8cc | |||
80ea60d094 | |||
004e3cfbd2 | |||
0d9681fb05 | |||
f46e8e9649 | |||
eed044295d | |||
a24dbbe1a1 | |||
8311efa2df | |||
651c66facf | |||
690442cdfe | |||
000b8dd48f | |||
14058e6eee | |||
6d7e804613 | |||
b60f8d37cf | |||
5f04361907 | |||
b78fcc735f | |||
404751d126 | |||
e48615ba2c | |||
31ac2708eb | |||
dfaf6b1fde | |||
8cb56d73a6 | |||
4cfce6e9f9 | |||
0fb744c200 | |||
fa3a06af9d | |||
68628f4929 | |||
38997a9920 | |||
c65d1ff807 | |||
3fa8e60133 | |||
b163e23c81 | |||
4192230ab8 | |||
736e342acd | |||
c730f18efc | |||
bf322d4e6d | |||
c7fb0542a2 | |||
13eb226953 | |||
cba8485ba2 | |||
a28992c684 | |||
c39257c2c3 | |||
a6a595ef38 | |||
adfc8ad522 | |||
1d4e75ab68 | |||
094a5c7223 | |||
248b495c17 | |||
dad45dd98f | |||
2c4bec6a26 | |||
4b81bc18b1 | |||
a774b1cd2b | |||
1894b8c5e8 | |||
47dc6d71b7 | |||
f9819aa99c | |||
882b2840d9 | |||
f534687f65 | |||
18527ccbf5 | |||
43bfa07c39 | |||
0c6847c532 | |||
c33eb17715 | |||
9530854c01 | |||
6020657cc6 | |||
36d39dc8de | |||
310918d409 | |||
5eea247b4d | |||
10efcda101 | |||
9d37b647c9 | |||
123575420c | |||
fe357f931d | |||
b41f0da1a0 | |||
e19070e066 | |||
f2531e5767 | |||
b7a600879a | |||
f5cdc276d4 | |||
d3935d79fe | |||
b10a609bcb | |||
a7b1e4ffda | |||
34bd740752 | |||
0d464888ed | |||
cdf8716eeb | |||
d31e699e19 | |||
310cb4e930 | |||
0a1ffd9609 | |||
c419939403 | |||
35ed9b4736 | |||
4582a9a66e | |||
78c39b1c28 | |||
a7d5b82ed8 | |||
b101e12d06 | |||
5ea1cdd639 | |||
d24fc4cbc6 | |||
079e73ed9e | |||
2cf74209d8 | |||
4d657a3fce | |||
039d4e9056 | |||
fb1720d00b | |||
fd1d3bbe58 | |||
3a35602223 | |||
c8d0760e0e | |||
9dc8bba4f0 | |||
2b16f87b36 | |||
8612ea5e53 | |||
2c8ce31648 | |||
ef7111bb83 | |||
833d362a26 | |||
b9f0ed3be1 | |||
b391e46047 | |||
10f71f66eb | |||
055d565781 | |||
5bd1220267 | |||
1b6d500941 | |||
a51f7a6e61 | |||
9a9ed68db6 | |||
7fc2bd34b5 | |||
de7bbc0f46 | |||
4ebbad74f6 | |||
c288235f5a | |||
5517bc954b | |||
9e96ff6f21 | |||
77ba5eb1f2 | |||
d59714cd69 | |||
bf853fb43a | |||
1043736492 | |||
ff17000b02 | |||
76fc25f2e8 | |||
853841b776 | |||
b79c1ffc77 | |||
0d3b9c5cfd | |||
535d06c2e8 | |||
61153b93a6 | |||
c93284e4c2 | |||
805071e25a | |||
5c87a8b813 | |||
aa9dafe2ee | |||
d8f3bd97ed | |||
a731d2e9b9 | |||
095638dc3d | |||
2c0125c193 | |||
c511357dd3 | |||
c260d41d23 | |||
be9e5931c4 | |||
29e990921a | |||
8165dcae57 | |||
daf780d9d1 | |||
1c5de9d801 | |||
3f5a605392 | |||
3c136e678b | |||
04c0ffbedd | |||
f64806beb8 | |||
a5728beb2c | |||
89b518b98f | |||
a57c58fb2d | |||
e543d6644c | |||
4c0e724ac3 | |||
02e7624d32 | |||
9cba4e2361 | |||
e309ead06e | |||
ccecd8752e | |||
f772f200f3 | |||
8bb862db0a | |||
7dddec1c57 | |||
15f22b80f8 | |||
407dd20f15 | |||
b5efbe9644 | |||
c17be705bb | |||
fcdf6baf47 | |||
3335ad19bd | |||
451c1ffa57 | |||
3a17d48716 | |||
9e831a9c05 | |||
32e925f9ed | |||
fbf5f2b401 | |||
6365fc23aa | |||
9e17ffe286 | |||
bba05d126e | |||
2b1480aa7e | |||
1c1c1879ea | |||
cfa3e1e52d | |||
4d2e68e8e8 | |||
8332c11e2d | |||
2bd9759735 | |||
fbd8f19196 | |||
e25e75ba80 | |||
772c2cfb12 | |||
bc7903a444 | |||
11338b67e8 | |||
7ab5bdf11a | |||
b0851118af | |||
0216af4839 | |||
eb630a4fe8 | |||
27fc4e8a19 | |||
8b81e2e8c4 | |||
ce11fd827c | |||
4a39bc9564 | |||
f8ec0d72cb | |||
42500f8a7f | |||
19166e0c92 | |||
d5177ced37 | |||
3f32c6858e | |||
ff335d2244 | |||
18e1382589 | |||
94720bb5ec | |||
477618937c | |||
c180db40c0 | |||
653bd72d45 | |||
64c7767e3a | |||
b080a60a6d | |||
c9c03c41fb | |||
05995720e9 | |||
3dc41a906d | |||
b84d070b33 | |||
dceb728011 | |||
c7cbe1e458 | |||
b53a942131 | |||
abc05b8805 | |||
c2e508eb60 | |||
00eafcb21a | |||
bdb4bfb9ab | |||
eb5b5ca45e | |||
b7dd558bb2 | |||
7c526d9ae4 | |||
45941546ba | |||
463f5219ce | |||
c1651b322b | |||
41723596ae | |||
af0073131e | |||
21a6f90384 | |||
6c5bc92de7 | |||
1ceb04cc76 | |||
159b893f1c | |||
fe24d08ab5 | |||
888c1e4657 | |||
fce49f2d86 | |||
2019a0c29e | |||
2940bbbb66 | |||
d797ab5413 | |||
48c6a2a4af | |||
f6e38b48f6 | |||
ac30d5cb04 | |||
ff11e90f8e | |||
fbc8257b7e | |||
7dc194f9e5 | |||
c4d913dcc3 | |||
6d55f679e0 | |||
72e1086d91 | |||
0914b4b1f0 | |||
c2e62a8009 | |||
4630b7a697 | |||
f9bc7c20fc | |||
01a300b649 | |||
d3cdacee35 | |||
81eac7ee3e | |||
ca5e769c1f | |||
ddac84b4d7 | |||
bba88cd11b | |||
b9eb82ce98 | |||
62d3770d01 | |||
8e0fe1c591 | |||
88bc253ede | |||
33083a7969 | |||
068d4eecd5 | |||
6dd3b24699 | |||
b3acc2e9f6 | |||
25d9edc876 | |||
9230c37eca | |||
11d64c0e2f | |||
15641e9a0e | |||
942f59f923 | |||
3ae4b8262d | |||
f8d8b46882 | |||
c300e744e6 | |||
e2746f1fcd | |||
74b26436b5 | |||
1b5809833e | |||
cf41be4f9a | |||
75ebb66ef3 | |||
3e521fcee9 | |||
dad298b242 | |||
3a2e39a25d | |||
91567ed6bc | |||
b77e6b73c5 | |||
25ea11065d | |||
3d38b2f107 | |||
90c7ecbf00 | |||
296d8f9d40 | |||
e45a6a947a | |||
fb3cfc2147 | |||
9cebbb0020 | |||
f7f0c713c8 | |||
bb0201de59 | |||
b97ca69eba | |||
353e06409e | |||
53ed5fd940 | |||
5094d33980 | |||
22649a19c2 | |||
e72e82cc8a | |||
1c7db86dfd | |||
7e547363ca | |||
40b55a2ca6 | |||
077ab08214 | |||
256704f73d | |||
21a84fb572 | |||
9ce1d528bc | |||
4ea73c2d50 | |||
80d8fa0983 | |||
ddd5596d00 | |||
b9e95079e7 | |||
cb03fdcf4b | |||
efb39089ab | |||
3eef855b05 | |||
05abd18266 | |||
51966e17aa | |||
01024144c4 | |||
78b7816835 | |||
dfed10dbb1 | |||
0854500919 | |||
b3e1511754 | |||
eaeb565b7f | |||
035c65e615 | |||
c8416de7e5 | |||
af0d46e1b0 | |||
cb1f1dd7f5 | |||
566efc5941 | |||
7de27ced6f | |||
86f3391119 | |||
a3d5c8398a | |||
f9c573b8f8 | |||
d82afc6eca | |||
2af42f0e55 | |||
607a217a2a | |||
c50182c261 | |||
ed25557b5d | |||
d81aba26d9 | |||
d1255a00c9 | |||
e9b1bf8ded | |||
506cf40ff3 | |||
82d76b95af | |||
0fcb318272 | |||
fa69c3bb14 | |||
547fb932e5 | |||
b1580002fe | |||
2e769126dc | |||
418f2c1fbd | |||
f8d2876ad0 | |||
4b5abdb14e | |||
782349d787 | |||
2e79083df7 | |||
f22f11f5d4 | |||
b3b2f3445b | |||
e3d442d82c | |||
c999808b96 | |||
f6b2888593 | |||
5ce48665a4 | |||
66e829fd93 | |||
62044e3608 | |||
d9605bb16c | |||
e2cf954ab0 | |||
10073792b4 | |||
aba2e465b3 | |||
cf950d31a4 | |||
14d588ca25 | |||
e420f7a82d | |||
5527d943b1 | |||
addfc1e75a | |||
d053ebaed6 | |||
023aad4ed0 | |||
022adae39b | |||
b8f5aa7d03 | |||
428f4aa474 | |||
ffb2ea9e07 | |||
6271d08b2d | |||
1a78ef1e0d | |||
79ab506cd0 | |||
76940bbf4e | |||
33061a40fd | |||
109708993c | |||
04f052b6ab | |||
d42c20ef51 | |||
9d59f3d896 | |||
431b3411c3 | |||
d7573c8db3 | |||
9b3ee488c1 | |||
e4c04b4a4c | |||
64b1a4e72a | |||
4c2158324e | |||
f5c02d9a48 | |||
8369be6f76 | |||
c56e1f6c1c | |||
53fea98209 | |||
28f52ffda7 | |||
83cbca3119 | |||
597e4ecc49 | |||
8c7a1f5305 | |||
b7ef9910ee | |||
1b156c7175 | |||
6ec1ea181b | |||
005554326b | |||
394366117c | |||
2f05bd851e | |||
093ca1ae4e | |||
cc1cc31114 | |||
8841f1a394 | |||
bbdde8628b | |||
89f2eaea13 | |||
e5516408b7 | |||
d0a9a4f318 | |||
50af841dcb | |||
0b1834e973 | |||
d2fcfbab32 | |||
3a98a476a2 | |||
5c482a68c6 | |||
5b949d15cd | |||
e96b8302cf | |||
d11507d7f2 | |||
2e012105fa | |||
290ce386be | |||
d6ff195211 | |||
f7705013df | |||
5aa5b53668 | |||
d269888a29 | |||
d9624c5ee7 | |||
0055015dd5 | |||
24952a1320 | |||
193f4a6937 | |||
e6a92f95be | |||
edf446b405 | |||
19e2609e9e | |||
0f7cdb79ae | |||
7ca1ec4eac | |||
877649188d | |||
4d3df94249 | |||
04b7153d29 | |||
80607eceb5 | |||
ef51224216 | |||
72dcff52ee | |||
ac5d239df9 | |||
9207eb0d60 | |||
cc5c673f34 | |||
012a09355d | |||
492844113e | |||
e6a16e02c2 | |||
75fa0b838f | |||
f2433e5c2b | |||
cadf289546 | |||
1b4752f953 | |||
aa5f4b9513 | |||
c83ffa94b8 | |||
9d41d091ac | |||
e29cca3c9f | |||
92d183c24d | |||
af9e6dde85 | |||
c6fb9c83b2 | |||
37b3795873 | |||
05958cba1f | |||
e1f2740690 | |||
580ec78e8d | |||
d18345d1d5 | |||
287c181d63 | |||
1b6d9f4dae | |||
ed08aede97 | |||
dd5ff80f4d | |||
cab2979dd4 | |||
684716f640 | |||
3a3bb10b16 | |||
8b92284671 | |||
ad4447fbb3 | |||
9a693a3853 | |||
6347cbc4f6 | |||
b22a13b594 | |||
77263ba719 | |||
6163de4bc1 | |||
cf15cc048d | |||
74e8907782 | |||
af3f16d6ff | |||
6a317c3e74 | |||
0b514bd554 | |||
f556478267 | |||
a7e9363560 | |||
708e143c49 | |||
39525211ce | |||
6c14827832 | |||
e13697fcaf | |||
15605772a2 | |||
a7595b85c6 | |||
5174852eab | |||
aadf628ea4 | |||
3b1d68667e | |||
b577023727 | |||
2413bce54d | |||
752afb9f12 | |||
e4314ba675 | |||
e6d9ce2a0a | |||
873e8e1b6a | |||
e8ac784480 | |||
a2a42e183f | |||
979e607ab1 | |||
18b94169c7 | |||
4c89ac844e | |||
36b1b1657c | |||
da66107abe | |||
92c268ea2d | |||
402339d4a9 | |||
f997419e0d | |||
fea15d49d5 | |||
4b431cd201 | |||
1ca4fb8db9 | |||
e2788992b9 | |||
ec078efd2f | |||
f3f12fe6a9 | |||
e9c3bff37e | |||
e9f60be832 | |||
29bbd50557 | |||
6c7e6a4e1b | |||
72c0b084e1 | |||
9b835ba5e3 | |||
46d2035750 | |||
7478a71981 | |||
f9f29d2bb7 | |||
c0bd84cbf5 | |||
80102c7a6c | |||
29627422f2 | |||
d85f0740a1 | |||
be3c67a876 | |||
6b87485c9a | |||
931b42dea5 | |||
cfb4642639 | |||
d3291eceed | |||
fae633381b | |||
cb39a40f22 | |||
7ba0c309d1 | |||
245da35008 | |||
ebd5389776 | |||
ed1546d34f | |||
bd6588d46c | |||
6b29837f5b | |||
cc5956cb5f | |||
7c3f823ffd | |||
70d57fe959 | |||
1127e5dda7 | |||
d3a2814382 | |||
45479611d7 | |||
aa1b4ea0a3 | |||
7a1aace1b5 | |||
fad63eb0f6 | |||
76589d1a51 | |||
5680a9747a | |||
44573bfe2c | |||
78b8041465 | |||
170bf59c2f | |||
c4574326e0 | |||
6dd5d07a94 | |||
f572796eda | |||
42f6e0123e | |||
df453047a5 | |||
690fa21121 | |||
9ea9a7ac41 | |||
2970442230 | |||
01cb176096 | |||
fcb5839eb2 | |||
35323ecaed | |||
05809fab17 | |||
382854f2b7 | |||
9f4358a617 | |||
9cc63f6edc | |||
58b83d59ad | |||
efb9176b29 | |||
0ac94c0bc5 | |||
004b0461d5 | |||
2e8d3c8d37 | |||
56c1efa722 | |||
a3f08e44ac | |||
a7e9530612 | |||
70a3999b72 | |||
7225f86bf1 | |||
9019e4f6e6 | |||
d6a93d2096 | |||
ada727122d | |||
1d21da4858 | |||
1385f31d0e | |||
ccf1bf818f | |||
7fe1f641e6 | |||
af2d7aadbc | |||
497f2f3070 | |||
f3bc920f8f | |||
0f6107cfb3 | |||
f75fe1d82f | |||
6f6e45dd15 | |||
6cdffd7ee4 | |||
4a9cf6cdf1 | |||
21852ba2cc | |||
27efd55ad6 | |||
d0c40ccd73 | |||
b310089804 | |||
29c6a416c2 | |||
1f3df90658 | |||
9fa13566ff | |||
4377656d7e | |||
58d61e6d87 | |||
4b3d3a4763 | |||
89c04f07a9 | |||
1b4747fbcd | |||
f7ff0e61b4 | |||
30cda51dc6 | |||
2adc0f1bf5 | |||
fbd89c7bfb | |||
bc0d368047 | |||
d1aadf07a6 | |||
95017c49d6 | |||
f370c79efe | |||
ad86556a0a | |||
f4777432f6 | |||
55df3362c8 | |||
3c160c7627 | |||
3ac328e00e | |||
1eca72a116 | |||
db9a9113cc | |||
a4be190a44 | |||
bf84276db9 | |||
d9d68fb470 | |||
f0af0a051a | |||
b1031480c7 | |||
118ab3c8fc | |||
6a9dd6da93 | |||
71935d2ec4 | |||
b90369d933 | |||
374d221fdd | |||
2744df6fa5 | |||
5aa55f92c9 | |||
03587c0e34 | |||
afc7844fe1 | |||
c82bee6558 | |||
5b0ec1f3c2 | |||
261c5a5e89 | |||
3dd9652c7a | |||
3a830c12f9 | |||
6de2cbe46b | |||
4a1ece9407 | |||
a6d1b9ce31 | |||
47f1c66726 | |||
264f3ffe16 | |||
3a13bfc29a | |||
0397d83405 | |||
9aa135d31f | |||
c026b7f587 | |||
1beb0e60db | |||
46c2864371 | |||
63f93b9230 | |||
2551677b10 | |||
269bc19580 | |||
9a3b4cd1ae | |||
25f9c9ea80 | |||
f076953b59 | |||
8f5f9f534a | |||
b605e924ae | |||
18eb808c75 | |||
f37b2d6af9 | |||
a7abe70251 | |||
61b924ce5c | |||
e34edb7738 | |||
b2650b9733 | |||
ce03e09b33 | |||
779898f38c | |||
83010e07c1 | |||
c435302045 | |||
903fa8fdac | |||
2cb43ba3f2 | |||
8df7b0cb3c | |||
fe527a7939 | |||
6528f49f1b | |||
fd123ac5cc | |||
bb71a73685 | |||
67ac3930a8 | |||
4f244b6540 | |||
72c3c8c229 | |||
5ebf671d38 | |||
e3066a2603 | |||
34e9ea108c | |||
a886d6eb19 | |||
5e8d64984f | |||
591f4dd0f9 | |||
6473ef5fe2 | |||
0e34030c06 | |||
60a267dd03 | |||
918951d9c7 | |||
cec08c568d | |||
3195b66bc2 | |||
47abd68a57 | |||
018fabf631 | |||
6a7348cbe0 | |||
a68e8d54e8 | |||
737d405f4e | |||
daeb7414c7 | |||
dfab45f9ac | |||
faf9b837b0 | |||
c2adb2178c | |||
b83ae095f0 | |||
fcd154407b | |||
29e3b2fcfc | |||
ce76c48ec3 | |||
b1eaa14709 | |||
1b32237540 | |||
9c653c839a | |||
e9bf16a954 | |||
64fc33a702 | |||
ded1d78134 | |||
52e8025c54 | |||
94bef57ebb | |||
2a88884d8f | |||
49a62bb02e | |||
5ef250e431 | |||
3d7a5b92e7 | |||
fa27fea18d | |||
628d03ef3e | |||
8cf58f6bc2 | |||
07445d27c5 | |||
7c44a9bab5 | |||
a06a4bfb7b | |||
827e066c39 | |||
3875b5129f | |||
5e05c22de0 | |||
e09d2d5d74 | |||
24ec1fd871 | |||
63fea7dfa5 | |||
61bada1706 | |||
c878579b1e | |||
8f410da7b1 | |||
85e8953284 | |||
c06ba30be6 | |||
6208345bd8 | |||
701f0e97f2 | |||
b694288d9d | |||
1b1f672e16 | |||
0c41104d17 | |||
52ac415131 | |||
029604f708 | |||
9e24f83e65 | |||
c395956e8a | |||
e9b642f516 | |||
d3e81f374c | |||
fcceb62288 | |||
ed547d7a82 | |||
1876442c6a | |||
5725dee076 | |||
5b97224e7e | |||
68dd06d6ea | |||
584c81eea8 | |||
7729af3f11 | |||
34fc7a3348 | |||
8e6597e48f | |||
055717d80d | |||
69e978d3d3 | |||
c2cdc74e32 | |||
d25fa26b22 | |||
5878243fca | |||
56f2fe7f85 | |||
884421f9d5 | |||
5189c8f8fc | |||
a29539a758 | |||
f108778697 | |||
7c39394815 | |||
f58625c0b4 | |||
939abbe333 | |||
14341b9949 | |||
8a9e61e9b6 | |||
4c3e4a1def | |||
359435b654 | |||
f2b2989ff9 | |||
74e16d6858 | |||
b93db125f5 | |||
a91de34114 | |||
e25b7fb26b | |||
117aff448e | |||
e9e8101a3b | |||
bb8ca1979f | |||
f89f6cba27 | |||
4bcb5d7024 | |||
63b4673d26 | |||
ae758df6a4 | |||
62a322e744 | |||
cc0ceef739 | |||
737f6f40cb | |||
0926a90e07 | |||
beaf0fc44e | |||
29cd0a05d5 | |||
dd76df2715 | |||
accff0a3d2 | |||
27c89dd184 | |||
c9078a4f83 | |||
f771c7542e | |||
11b2f01bab | |||
1565fde48b | |||
f214e7ce39 | |||
868bddfbfb | |||
cca5b8f4ab | |||
634913fef7 | |||
8adac8c569 | |||
772d6cb1a6 | |||
1b9c09442a | |||
d619a9421a | |||
0be4e5ecd4 | |||
bb58989775 | |||
5616164a10 | |||
44693678de | |||
ea6c87d7e2 | |||
86ee004318 | |||
337b4bbf8a | |||
4cc7e036ee | |||
0d2aeb8051 | |||
84d2278127 | |||
8405168ec3 | |||
64b7074a7e | |||
865a2c0adf | |||
ddaa39a837 | |||
3bb0ef0d09 | |||
88663047ad | |||
9bb3e53739 | |||
dda1de404a | |||
e1c0aa4365 | |||
593ccbf361 | |||
5943f4852c | |||
0ad7194aec | |||
e182a9a7ed | |||
1e8e2cc4e0 | |||
7d167c531d | |||
1a24bcf03a | |||
eecea3f7d4 | |||
9d1449486c | |||
7dea3500af | |||
5d1a3d277a | |||
b8a51c75e5 | |||
a3f8817f6e | |||
cb4081c28d | |||
cf2e93b038 | |||
ba7f51dfc0 | |||
00743a1f7b | |||
7cd600bbd8 | |||
a633e28cce | |||
b518d677b7 | |||
71fc888645 | |||
00463744a9 | |||
eafa30d836 | |||
d3ddbc7814 | |||
0ce1c79622 | |||
e65519e86b | |||
84c0a285db | |||
db8770b891 | |||
5fdde23f84 | |||
ba7ba0f17b | |||
e3a0953ac8 | |||
5c0aa99738 | |||
629e1c56f0 | |||
8711516620 | |||
8af63138f0 | |||
7aa4331d1d | |||
826be431bb | |||
929f928591 | |||
3ce77ad34c | |||
1d2f0627ca | |||
3f9985e024 | |||
74b7495b75 | |||
12eb4a3687 | |||
3d78a665e1 | |||
e79abef7e4 | |||
6cda8ff784 | |||
f705a90cc7 | |||
02b493094e | |||
211a598c07 | |||
72c41362f4 | |||
a564b11139 | |||
ef8f5a7e92 | |||
8a08c00a9b | |||
9c7fd72c24 | |||
a78e740f2a | |||
1f4f5dbfdf | |||
031ddeedde | |||
9c7dbebc8c | |||
5a6f3d61b0 | |||
20fda87a24 | |||
ecaa2f118e | |||
c8a4ebdaeb | |||
92b5ee6edb | |||
57cc6d09c2 | |||
89668101c4 | |||
34debe65f6 | |||
7d367f969a | |||
3d6c2a772d | |||
4b4fdaa55b | |||
2fe176635a | |||
9eea9964d9 | |||
2547c80274 | |||
059e95bbbc | |||
abee4e8250 | |||
d3e905b3c9 | |||
635b1a4a0a | |||
4b7d5eba31 | |||
7f049caeeb | |||
1c4cc8c9f3 | |||
fe66d861a3 | |||
9cfcecadd9 | |||
b17f4f072f | |||
d9aae950e6 | |||
64571554c7 | |||
c02d51f48f | |||
f95f10c734 | |||
cb607b5bcd | |||
c294b364d4 | |||
95852580de | |||
b462f6478b | |||
d607cb372b | |||
9f6b30ca6b | |||
7c6df55708 | |||
4a7a3988f4 | |||
c0218e8caf | |||
8456eb33f1 | |||
bbbf0d4b6b | |||
faae28d7c1 | |||
832d9cb4b8 | |||
e868ec3744 | |||
5b7ff7d8e0 | |||
d77cc4b2ad | |||
56aaed8133 | |||
1ef4891caf | |||
cf5563373c | |||
2397ec4f62 | |||
3b40cb85d6 | |||
afb908c647 | |||
ed102741e0 | |||
fb36d72c7d | |||
ad94dd6daa | |||
471334b3f8 | |||
97a0104ad8 | |||
0c9f0e3491 | |||
0fd880c88a | |||
fe94d807de | |||
c4f4fbcc3d | |||
29635c1af5 | |||
4a2a2bfddd | |||
7b1282d654 | |||
4c0c5a88cf | |||
f2c215eac4 | |||
74713448fb | |||
fcf9b009dc | |||
0d72c6a9cd | |||
90d308a8c9 | |||
3bff76d476 | |||
c126278377 | |||
c5bc10a306 | |||
1b4b5033c7 | |||
470ff62965 | |||
e4f22d475e | |||
7b25f96843 | |||
fb9c033292 | |||
549121b3f6 | |||
0ac6c2c74e | |||
18f2bcb378 | |||
57bcf442bb | |||
7c391a4b77 | |||
216de211d3 | |||
b81354be54 | |||
dceb5b655c | |||
3a7b4f0191 | |||
a69a52e95b | |||
e6e8853051 | |||
ddc133e532 | |||
5f11a3076d | |||
e7a2533a9d | |||
02eb6d08b3 | |||
d3621b98c9 | |||
e9758c5fe4 | |||
65be5b6539 | |||
43829d5a8a | |||
3dc45b1d87 | |||
8da1acc25f | |||
dac33e1394 | |||
100aaae6ed | |||
3039d5d161 | |||
331be74015 | |||
16008c628c | |||
adf638c607 | |||
6895677df1 | |||
91457e7b4f | |||
1fa6e08eda | |||
dd386f8fe6 | |||
f769627984 | |||
4c60c77d96 | |||
66c568f970 | |||
d35f6b4973 | |||
26ff8f5ea7 | |||
72eb438fee | |||
277797d6a0 | |||
fc62becfd7 | |||
6c5c4b0df8 | |||
eda3f87bc3 | |||
04fe105b92 | |||
0300b61df7 | |||
02883cf88b | |||
207c4d15c6 | |||
dd5eb3f628 | |||
d0bfa894d7 | |||
1d80d46168 | |||
a203e83e99 | |||
283754cf90 | |||
79e7eeff96 | |||
![]() |
6de74d3927 | ||
![]() |
b9a4a43428 | ||
![]() |
02e346545a | ||
![]() |
dfc5e8ba8f | ||
246afa79dc | |||
576b6963e3 | |||
bcc1aaff1f | |||
9b2ba4f6ac | |||
fced3bb787 | |||
31ea9f3e74 | |||
3b73b5c12c | |||
8549fe2789 | |||
18f40825a8 | |||
1d8293517a | |||
ef4eff6d5c | |||
4adf3c19b7 | |||
|
c39dd04985 | ||
a0cb0debef | |||
9bf32cc9b3 | |||
f91842b292 | |||
205e7de702 | |||
da8ed12739 | |||
44408fe79f | |||
b890441128 | |||
5e682c4754 | |||
f476ee4295 | |||
4a5ece9404 | |||
e050461b43 | |||
616f6781fd | |||
dda63179fd | |||
0798d2d5c2 | |||
f429d434b7 | |||
4280da1736 | |||
1ce632aaa6 | |||
549b9ae240 | |||
94d5209eef | |||
0d8967ba98 | |||
9f5d01fcbd | |||
8108eb26da | |||
3e50cfdbb8 | |||
806c44f7b3 | |||
52c58f4995 | |||
b397a78f8c | |||
d552013f1b | |||
8c8e13310d | |||
1dbcb0b1a4 | |||
f95248d8c9 | |||
18e8372112 | |||
de212ac516 | |||
50498c5d77 | |||
6130a10c9f | |||
91d8eaa488 | |||
94eb4237f6 | |||
4e152b1f35 | |||
7ad003ff49 | |||
3611d6e319 | |||
6a6996de09 | |||
1ad2482dd5 | |||
7779571d8a | |||
ce26891110 | |||
a9d98a1315 | |||
15687e2a49 | |||
9c19b1c5c4 | |||
653bf91769 | |||
0e9dd4dc9a | |||
68aa67eb67 | |||
53ac7a2078 | |||
e1c22daa71 | |||
6613db0fb9 | |||
be7ae862f4 | |||
b58b512538 | |||
40321bea75 | |||
63b5fb4810 | |||
5681864316 | |||
08b93931eb | |||
47fce50c76 | |||
b073d7c20c | |||
1771e6921f | |||
a801bea55c | |||
0019ea6bde | |||
90b43e2669 | |||
cb011f8b4a | |||
64b15ce4e0 | |||
a6db23445c | |||
67239148f0 | |||
d68abfa381 | |||
f962dd854d | |||
f93437cf96 | |||
b0d9e2c74a | |||
d2f1e6a1ac | |||
552953dbc9 | |||
45bb79fa0f | |||
f138446191 | |||
82596c13fe | |||
bedffc7c54 | |||
8fe84a1801 | |||
cc528563cf | |||
d9d314e6ec | |||
a4b3e19763 | |||
0a88f6a814 | |||
788175aeda | |||
c5aa11de8c | |||
a26e243bb8 | |||
798941a6ab | |||
4d9de6aff1 | |||
8d546721a9 | |||
41d228d1d2 | |||
e077ad45d9 | |||
105e90a1ad | |||
b5572bfcc4 | |||
f83c9abab7 | |||
ae7c8f2a6d | |||
6e89a09685 | |||
fb2402f49a | |||
cc640028cb | |||
f07fd936d6 | |||
8b335a212e | |||
a15db55165 | |||
0ccf25d272 | |||
c44819e5a2 | |||
d63799ef9a | |||
e9de73df39 | |||
e8380dc8b2 | |||
a940be3048 | |||
31acdf4321 | |||
05029a7732 | |||
5db2e33825 | |||
b7f8aaa87f | |||
f69397c5ab | |||
487416faaf | |||
0ba436a11a | |||
8124292614 | |||
f62e9d248d | |||
704c02c659 | |||
9e9671ca83 | |||
89cee696ce | |||
5076990d45 | |||
72f3a2ce63 | |||
191572bbf8 | |||
32ace86ea9 | |||
aa860d7567 | |||
aa5743701c | |||
384366c862 | |||
99b947e19d | |||
0f08ee99bc | |||
46b35b095f | |||
df3970e121 | |||
ec3120b68f | |||
2291b82c0c | |||
ff4ad68758 | |||
cdaf4de6e5 | |||
05107c025f | |||
df0fa32687 | |||
9d9c9a4d61 | |||
e1920145a2 | |||
ca94555776 | |||
c788303183 | |||
3d2fca3ab1 | |||
898e46654e | |||
47d0265084 | |||
e3bd123d94 | |||
4b92960a41 | |||
6c0bcfe738 | |||
344c120964 | |||
d7dbb30f2a | |||
797312af32 | |||
bb4bc5475d | |||
fa8d9031fb | |||
157511dbfc | |||
5850839a0e | |||
873ebb60b7 | |||
b0b3ac643d | |||
bab72ead7a | |||
f43695ce0c | |||
e2cd541807 | |||
409e77a283 | |||
3d2fe5cc9e | |||
e0b6b2a909 | |||
3cd8e22dca | |||
c3d033f872 | |||
d478e95643 | |||
f8142bf6e7 | |||
66c6983864 | |||
c18ef4a3f8 | |||
8bfe8d1390 | |||
c5e6746573 | |||
5c5bd117e0 | |||
a27b23638e | |||
9c9c8fed35 | |||
dfd02b3a27 | |||
314e3e85bf | |||
907894cbd8 | |||
2cce609635 | |||
106c56bc39 | |||
5a18324d90 | |||
e3b0d3913e | |||
3dd62297d6 | |||
44c2a38eac | |||
d7ef67550e | |||
4a3a30f943 | |||
15b41a1b9e | |||
8a98c0df58 | |||
3c76f9a158 | |||
bf3bd8f4d6 | |||
dda31c3594 | |||
37e6bdaa4c | |||
d6ed861646 | |||
c9a9672017 | |||
969b2d2e28 | |||
22e1d2f425 | |||
6b2e0c0abf | |||
c29a87a53e | |||
27b01771a0 | |||
f867cdb7cc | |||
b38f677544 | |||
afe348d913 | |||
ebcdb08e03 | |||
74abd58a2d | |||
7b4ad1ce4c | |||
d43e8cc458 | |||
2c34be5ae4 | |||
7ae9f6ded3 | |||
70bbbb3c99 | |||
ca1f5ee29b | |||
c8a57522f3 | |||
0fbd1aa906 | |||
3c32f4e12b | |||
6e43289f00 | |||
ad9dd3390b | |||
535819c2c7 | |||
db68fb02e7 | |||
9a1f4918ae | |||
f1650b1e85 | |||
07941251b5 | |||
c7a2895e5a | |||
fb0ba1fc4b | |||
1b21c0234d | |||
95f5b94468 | |||
7d45857a00 | |||
0e0309f7e9 | |||
2327135fd8 | |||
49142f0228 | |||
7efa62f47d | |||
df8b91d5f8 | |||
0b763688e8 | |||
be11185a29 | |||
418de3bd31 | |||
468e4b5295 | |||
9dfda40f2e | |||
614a0710ea | |||
8353b89b55 | |||
b84d2880dd | |||
2cf6ea7af3 | |||
4d26b7e4ae | |||
b93a503c0b | |||
5cb3e0914d | |||
b2eec9065a | |||
8b358f2557 | |||
1e907e6d53 | |||
b585343a3d | |||
40c672d89b | |||
49432e0650 | |||
da4217c681 | |||
4b7d60c090 | |||
fa09f75ac6 | |||
94dbb2a8a2 | |||
6d669d9305 | |||
f238940b0e | |||
e1cb642c8e | |||
e912c354ca | |||
0a5df1e33f | |||
0a496eb82f | |||
416a0f6f77 | |||
f666810ee6 | |||
ccf04404ad | |||
f8d90ddf41 | |||
af1fe253e7 | |||
d8936e882c | |||
8a575477ae | |||
290a49f188 | |||
b80d638f12 | |||
fea8f557e3 | |||
efd25c2f81 | |||
e712995ab7 | |||
bb98233d2a | |||
a93714ed7a | |||
54c70f275e | |||
523bc733b0 | |||
7f1d88aa7e | |||
7f24be17d7 | |||
068907f389 | |||
7f06767624 | |||
8bcb69fcb4 | |||
45e72272cb | |||
6672fb03e9 | |||
9ac2841208 | |||
7d9ec88152 | |||
2e36cdfb1e | |||
51b1c70e74 | |||
ecfc11d038 | |||
7ac3469214 | |||
f54df7f3cd | |||
3b5aebc418 | |||
2b7ce89123 | |||
ada03157a7 | |||
b47e13f5af | |||
8eeea5520e | |||
0f68dca707 | |||
e8d4eeb6cb | |||
6d6c594ac0 | |||
21472d8770 | |||
83eedb611f | |||
aa470b5934 | |||
ac4ed351ef | |||
a0828622c9 | |||
1323c674e4 | |||
de26adf56d | |||
f70dadac6f | |||
16d3031aa4 | |||
873db78232 | |||
9fdf386fe5 | |||
7bc0f272c3 | |||
b723eb2a57 | |||
45b27386b3 | |||
76398f4888 | |||
f261913a24 | |||
caa7337f3f | |||
3b0dc7189e | |||
512e3f8be8 | |||
fdc71bc1c7 | |||
6aa5cdfe01 | |||
c19be9a207 | |||
4e80a90030 | |||
804b551cad | |||
591de82ce8 | |||
10df9abfcd | |||
dc3e81ce5f | |||
a427170985 | |||
7b512c8357 | |||
ea929acb05 | |||
7adc99abf0 | |||
5b3c8e8ba4 | |||
80cd563450 | |||
b3a6c2bd64 | |||
90d847021b | |||
3b8ad67e08 | |||
4cfd1b64df | |||
650223b562 | |||
fcff126e53 | |||
fef3dc6c8c | |||
84de22ac67 | |||
2ab4b78e5e | |||
51e1ba3455 | |||
5315785048 | |||
817a15acfa | |||
3ee54ada96 | |||
037632f7f6 | |||
b7d9a0c371 | |||
65751c7323 | |||
b691e44095 | |||
d9ca930df0 | |||
34670c6cff | |||
decc3a3db2 | |||
7705d774c2 | |||
274759d077 | |||
57539aed23 | |||
9b281153c9 | |||
835aa56311 | |||
f2d598fcfe | |||
28d6d45ad5 | |||
36bc7d2b78 | |||
68289adb01 | |||
4a659b9dbc | |||
1a01ba2114 | |||
ca23815295 | |||
82413c1234 | |||
e1eea5e1b8 | |||
06e38919e8 | |||
7ccf77cc6a | |||
bc981c0a94 | |||
2e38570c2e | |||
d1fa308c6e | |||
f8b70d17a8 | |||
ffb8f26c99 | |||
6bb755b8f5 | |||
aedf1b8f06 | |||
253e9a0e07 | |||
572dbb6037 | |||
2fdfb3ebda | |||
b930bf0d6c | |||
232e8ba9cc | |||
7f6c5947cf | |||
9c92e58481 | |||
8b628fed64 | |||
901e02d8ef | |||
245f44a4dd | |||
d0b4805aa4 | |||
0971d3f3ea | |||
587ef9e946 | |||
501213a2ab | |||
12bf63460c | |||
f809e15767 | |||
39fcee6639 | |||
a179bd0f40 | |||
9c1f1aaa7f | |||
0b65e58e6b | |||
1ea4a6e4df | |||
bfb67783a7 | |||
d6cfe75170 | |||
9f6ace47e0 | |||
3f1e256f66 | |||
e7e861421c | |||
730f9b3f17 | |||
674260fb95 | |||
d3330e7cb7 | |||
fbd69aa49d | |||
4708ad39dc | |||
f8690b01f3 | |||
3bcf335f36 | |||
f94075e074 | |||
54eff5212d | |||
ba86b34a6e | |||
c7af623264 | |||
f720a90e36 | |||
a45faf6a55 | |||
8cb6d044f2 | |||
bf7d0a85e2 | |||
05188d4def | |||
17c23a986e | |||
7fd8d046cb | |||
288480ef3b | |||
92791e3cba | |||
ad03986280 | |||
c6b532d37d | |||
e63a89ef0d | |||
c2a34ce4c4 | |||
7de0bdbcc8 | |||
450fdc691b | |||
c4f8bc1cae | |||
cb2cfb0c05 | |||
8905ddd7a3 | |||
9d06a19824 | |||
fd5777d482 | |||
910ba53ac0 | |||
dd6d996ae4 | |||
3d081db48a | |||
|
36f2adbfb9 | ||
|
2386ed8c99 | ||
|
afa3719e97 | ||
b59098495b | |||
|
920d2cb071 | ||
eff2a7a12b | |||
79826fc412 | |||
7003f8eeff | |||
7cf4499c2a | |||
cdaa985c3a | |||
0808acb3e2 | |||
330ad49ea0 | |||
80580aabc0 | |||
d420f43430 | |||
18f6df2e4e | |||
b7388266ef | |||
f1e077ff36 | |||
231cc31241 | |||
16f80c5edf | |||
26219ecaa7 | |||
a25cf0a2f0 | |||
f45b571ed3 | |||
53d5aea418 | |||
adfb998d8f | |||
d88d991527 | |||
4bd6c94804 | |||
e2c10eb08b | |||
099ca92437 | |||
![]() |
7a71725ef7 | ||
![]() |
3a3ee62891 | ||
7814e0ad28 | |||
fd073f26ad | |||
e801865bf8 | |||
64fce34d5a | |||
4e5e9b6463 | |||
0751cf9498 | |||
e362d614cc | |||
![]() |
4059fec4c6 | ||
![]() |
349b5277b3 | ||
4c1853af12 | |||
c7b8be2af2 | |||
442a1d4acc | |||
dba7e0d1e9 | |||
0344733b69 | |||
0eddf6ffc7 | |||
5eeedf319c | |||
6740fb7264 | |||
becbb6e85e | |||
![]() |
a17aad8051 | ||
d08b49277e | |||
ac5047a904 | |||
d5e2e248e3 | |||
e638c9aa5a | |||
8a246bd25d | |||
f2ccda12b9 | |||
02ba356b62 | |||
b1fcc4a338 | |||
50fb05ae5f | |||
88bdc70773 | |||
be3ac05948 | |||
01351e549c | |||
edb8410349 | |||
738c8c0faa | |||
da803f5e55 | |||
c1ce6e6435 | |||
e7ed1ada31 | |||
31529971ea | |||
4b82f37480 | |||
01438c1259 | |||
adda14d3ca | |||
f63df14e2f | |||
5fc409d235 | |||
beaf2f3789 | |||
45756ffebe | |||
d75b798ed4 | |||
50b14844f8 | |||
8a34e2470c | |||
![]() |
dc46ab1cf4 | ||
cf781f3910 | |||
![]() |
6485bb5c1b | ||
![]() |
f85fcf5d59 | ||
|
3b9e3d5aa7 | ||
|
16780a82d2 | ||
ba144d2351 | |||
c6f27a6d30 | |||
|
23812dcf87 | ||
c73b736b57 | |||
![]() |
a6c32f3b6e | ||
d6e9e0702a | |||
7d567fa1f9 | |||
|
ea56cc469d | ||
16f1be50ed | |||
ee3d660b35 | |||
b8e7753f69 | |||
8473245a88 | |||
04aa3bcfac | |||
70e5d610d2 | |||
7a12e5c5d6 | |||
bed4c12cd6 | |||
46e0904ce3 | |||
44e74078ed | |||
bcc8726bdd | |||
c88786e56a | |||
d7428287d8 | |||
bb3164b10d | |||
d4234c0312 | |||
00becdb305 | |||
f82f74fff5 | |||
8a10e60935 | |||
d5158d29b6 | |||
848d6fb551 | |||
2e788e67cb | |||
d75317e8a4 | |||
325dbae580 | |||
![]() |
612c806a1d | ||
3dbdd87e94 | |||
b71270bc5a | |||
84b29d2ee2 | |||
d7d011ba9b | |||
d203795248 | |||
7002517f32 | |||
2062bf05d5 | |||
7d0155d9d6 | |||
aced9bb5e4 | |||
c110920bb4 | |||
d0d5b9d729 | |||
f47cc16766 | |||
20d82759fb | |||
215306138e | |||
a67e9c3ba3 | |||
5e08082118 | |||
de692dfc93 | |||
bf432801af | |||
68436fa4b1 | |||
aec8f968bb | |||
![]() |
a6710aaf77 | ||
46c5699e20 | |||
d1e483155f | |||
14bedcd408 | |||
fcb4944b5e | |||
e0d72294a3 | |||
46e942ad07 | |||
16d289beae | |||
2bc71f6100 | |||
7f798898f9 | |||
4f90c73231 | |||
070224d99e | |||
bdd31c0823 | |||
054929f308 | |||
2414af50d5 | |||
ce8a5a76f5 | |||
1ed231fc18 | |||
846e8dbafc | |||
f14c7e4582 | |||
412845802b | |||
ccf0c29d09 | |||
1e63115572 | |||
0895413861 | |||
1a9adfb2c3 | |||
8a7fc61a2d | |||
1a53f9ff17 | |||
2a7ed507ed | |||
4287297903 | |||
77b818a433 | |||
19c11e2883 | |||
6031ef10a9 | |||
50a34961ab | |||
b4379f2b41 | |||
a27ad6fcae | |||
3cfbacc73e | |||
b3295d09c6 | |||
46ad92199e | |||
70fb7969b1 | |||
d010280647 | |||
18ffeba78e | |||
029c3d0dd4 | |||
fac1ab7d0c | |||
e2390de8de | |||
bb454ee5c6 | |||
3b87d8e38b | |||
4f727597a1 | |||
ea0a2ec060 | |||
27c9f047b1 | |||
7333861d7a | |||
e11aac3f0b | |||
62c69a28a6 |
163 changed files with 14045 additions and 4141 deletions
12
.editorconfig
Normal file
12
.editorconfig
Normal file
|
@ -0,0 +1,12 @@
|
|||
# EditorConfig is awesome: https://EditorConfig.org
|
||||
|
||||
# top-most EditorConfig file
|
||||
root = true
|
||||
|
||||
[*]
|
||||
indent_style = space
|
||||
indent_size = 2
|
||||
end_of_line = lf
|
||||
charset = utf-8
|
||||
trim_trailing_whitespace = true
|
||||
insert_final_newline = true
|
1
.envrc
Normal file
1
.envrc
Normal file
|
@ -0,0 +1 @@
|
|||
use flake
|
22
.forgejo/workflows/lint.yml
Normal file
22
.forgejo/workflows/lint.yml
Normal file
|
@ -0,0 +1,22 @@
|
|||
name: Lint
|
||||
|
||||
on: [push]
|
||||
|
||||
jobs:
|
||||
lint:
|
||||
runs-on: docker
|
||||
env:
|
||||
container:
|
||||
image: ghcr.io/catthehacker/ubuntu:js-20.04
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
- uses: https://github.com/cachix/install-nix-action@v22
|
||||
env:
|
||||
with:
|
||||
nix_path: nixpkgs=channel:nixos-unstable
|
||||
- run: |
|
||||
sed -i '/^access-tokens/ d' /etc/nix/nix.conf
|
||||
nix profile install 'nixpkgs#deadnix' 'nixpkgs#statix' 'nixpkgs#yamllint'
|
||||
statix check .
|
||||
deadnix -f
|
||||
yamllint .
|
22
.forgejo/workflows/nix.yml
Normal file
22
.forgejo/workflows/nix.yml
Normal file
|
@ -0,0 +1,22 @@
|
|||
name: Nix
|
||||
|
||||
# on: [push]
|
||||
|
||||
jobs:
|
||||
lint:
|
||||
runs-on: docker
|
||||
env:
|
||||
container:
|
||||
image: ghcr.io/catthehacker/ubuntu:js-20.04
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
- name: Check Nix flake inputs
|
||||
uses: https://github.com/DeterminateSystems/flake-checker-action@v5
|
||||
- uses: https://github.com/cachix/install-nix-action@v22
|
||||
env:
|
||||
with:
|
||||
nix_path: nixpkgs=channel:nixos-unstable
|
||||
- name: Run `nix flake check`
|
||||
run: |
|
||||
sed -i '/^access-tokens/ d' /etc/nix/nix.conf
|
||||
nix run '.#' -- -V
|
37
.forgejo/workflows/plex_update.yml
Normal file
37
.forgejo/workflows/plex_update.yml
Normal file
|
@ -0,0 +1,37 @@
|
|||
name: Plex Update
|
||||
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- main
|
||||
- ci
|
||||
schedule:
|
||||
- cron: '0 0 * * *'
|
||||
|
||||
jobs:
|
||||
update:
|
||||
runs-on: docker
|
||||
container:
|
||||
image: ghcr.io/catthehacker/ubuntu:js-20.04
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
- uses: https://github.com/cachix/install-nix-action@v22
|
||||
with:
|
||||
nix_path: nixpkgs=channel:nixos-unstable
|
||||
- env:
|
||||
VAULT_ADDR: ${{ secrets.VAULT_ADDR }}
|
||||
VAULT_TOKEN: ${{ secrets.VAULT_TOKEN }}
|
||||
run: |
|
||||
git config user.name "Forgejo Actions Bot"
|
||||
git config user.email "<>"
|
||||
|
||||
# Run Update script
|
||||
./pkgs/plex-pass/update.sh
|
||||
|
||||
git add ./pkgs/plex-pass/
|
||||
|
||||
# Push if changed
|
||||
if git status ./nixos/pkgs/plex-pass/ | grep -q "to be committed"; then
|
||||
git commit -m "Update Plex"
|
||||
git push origin main
|
||||
fi
|
3
.gitignore
vendored
Normal file
3
.gitignore
vendored
Normal file
|
@ -0,0 +1,3 @@
|
|||
result
|
||||
.direnv
|
||||
.gcroots
|
5
.vscode/settings.json
vendored
Normal file
5
.vscode/settings.json
vendored
Normal file
|
@ -0,0 +1,5 @@
|
|||
{
|
||||
"Lua.diagnostics.globals": [
|
||||
"vim"
|
||||
]
|
||||
}
|
31
.vscode/snippets.code-snippets
vendored
Normal file
31
.vscode/snippets.code-snippets
vendored
Normal file
|
@ -0,0 +1,31 @@
|
|||
{
|
||||
// Place your infrastructure workspace snippets here. Each snippet is defined under a snippet name and has a scope, prefix, body and
|
||||
// description. Add comma separated ids of the languages where the snippet is applicable in the scope field. If scope
|
||||
// is left empty or omitted, the snippet gets applied to all languages. The prefix is what is
|
||||
// used to trigger the snippet and the body will be expanded and inserted. Possible variables are:
|
||||
// $1, $2 for tab stops, $0 for the final cursor position, and ${1:label}, ${2:another} for placeholders.
|
||||
// Placeholders with the same ids are connected.
|
||||
// Example:
|
||||
// "Print to console": {
|
||||
// "scope": "javascript,typescript",
|
||||
// "prefix": "log",
|
||||
// "body": [
|
||||
// "console.log('$1');",
|
||||
// "$2"
|
||||
// ],
|
||||
// "description": "Log output to console"
|
||||
// }
|
||||
"Create Host": {
|
||||
"scope": "nix",
|
||||
"prefix": "new_host",
|
||||
"body": [
|
||||
"{",
|
||||
" hostname = \"$1\";",
|
||||
" ip = \"$2\";",
|
||||
" mac = \"$3\";",
|
||||
" nix = ${4|false,true|};",
|
||||
"}",
|
||||
"$0"
|
||||
]
|
||||
}
|
||||
}
|
27
.yamllint.yaml
Normal file
27
.yamllint.yaml
Normal file
|
@ -0,0 +1,27 @@
|
|||
ignore: |
|
||||
charts/
|
||||
docs/
|
||||
.private/
|
||||
.terraform/
|
||||
.vscode/
|
||||
gotk-components.yaml
|
||||
gotk-sync.yaml
|
||||
extends: default
|
||||
rules:
|
||||
document-start:
|
||||
level: warning
|
||||
present: false
|
||||
empty-lines:
|
||||
max-end: 1
|
||||
truthy:
|
||||
allowed-values: ["true", "false", "on"]
|
||||
comments:
|
||||
min-spaces-from-content: 1
|
||||
line-length: disable
|
||||
braces:
|
||||
min-spaces-inside: 0
|
||||
max-spaces-inside: 1
|
||||
brackets:
|
||||
min-spaces-inside: 0
|
||||
max-spaces-inside: 0
|
||||
indentation: enable
|
18
README.md
Normal file
18
README.md
Normal file
|
@ -0,0 +1,18 @@
|
|||
# 0x76's Infrastructure
|
||||
This repository contains my fleet of VMs, Containers and Bare Metal machines.
|
||||
|
||||
## Directory Structure
|
||||
`flake.nix` is a NixOS flake which is the entrypoint for my NixOS config, it also contains a 'DevShell' containing all the tools needed
|
||||
to deploy the infrastructure, this can be accessed running `nix develop`.
|
||||
* **flux**: Kubernetes manifests as managed by [Flux]
|
||||
* **nixos**: Nix configurations for my NixOS LXCs and VMs, deployed using [colmena].
|
||||
|
||||
|
||||
[Flux]: https://github.com/fluxcd/flux2
|
||||
[colmena]: https://colmena.cli.rs/unstable/
|
||||
|
||||
## Inspired by the following repos
|
||||
* <https://github.com/colemickens/nixcfg>
|
||||
* <https://github.com/serokell/pegasus-infra>
|
||||
* <https://git.asraphiel.dev/j00lz/strato-infra>
|
||||
* <https://github.com/tadfisher/flake>
|
BIN
assets/wallpaper-nix-pink.png
Normal file
BIN
assets/wallpaper-nix-pink.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 59 KiB |
File diff suppressed because it is too large
Load diff
|
@ -1,26 +0,0 @@
|
|||
---
|
||||
apiVersion: source.toolkit.fluxcd.io/v1beta1
|
||||
kind: GitRepository
|
||||
metadata:
|
||||
name: flux-system
|
||||
namespace: flux-system
|
||||
spec:
|
||||
interval: 1m0s
|
||||
ref:
|
||||
branch: main
|
||||
secretRef:
|
||||
name: flux-system
|
||||
url: ssh://git@git.xirion.net:2222/olympus/flux.git
|
||||
---
|
||||
apiVersion: kustomize.toolkit.fluxcd.io/v1beta2
|
||||
kind: Kustomization
|
||||
metadata:
|
||||
name: flux-system
|
||||
namespace: flux-system
|
||||
spec:
|
||||
interval: 10m0s
|
||||
path: ./cluster
|
||||
prune: true
|
||||
sourceRef:
|
||||
kind: GitRepository
|
||||
name: flux-system
|
|
@ -1,5 +0,0 @@
|
|||
apiVersion: kustomize.config.k8s.io/v1beta1
|
||||
kind: Kustomization
|
||||
resources:
|
||||
- gotk-components.yaml
|
||||
- gotk-sync.yaml
|
111
common/default.nix
Normal file
111
common/default.nix
Normal file
|
@ -0,0 +1,111 @@
|
|||
{
|
||||
lib,
|
||||
inputs,
|
||||
pkgs,
|
||||
...
|
||||
}:
|
||||
{
|
||||
imports = [
|
||||
./users
|
||||
./modules
|
||||
];
|
||||
|
||||
home-manager = {
|
||||
useGlobalPkgs = true;
|
||||
useUserPackages = true;
|
||||
extraSpecialArgs = {
|
||||
inherit inputs;
|
||||
};
|
||||
sharedModules = [
|
||||
./hm-modules
|
||||
inputs.nixvim.homeManagerModules.nixvim
|
||||
inputs.autostart.homeManagerModules.xdg-autostart
|
||||
inputs.catppuccin.homeModules.catppuccin
|
||||
inputs.autostart.homeManagerModules.xdg-autostart
|
||||
];
|
||||
};
|
||||
|
||||
virtualisation.oci-containers.backend = lib.mkDefault "podman";
|
||||
|
||||
# Set your time zone.
|
||||
time.timeZone = lib.mkDefault "Europe/Amsterdam";
|
||||
|
||||
# Systemd OOMd
|
||||
# Fedora enables these options by default. See the 10-oomd-* files here:
|
||||
# https://src.fedoraproject.org/rpms/systemd/tree/acb90c49c42276b06375a66c73673ac3510255
|
||||
systemd.oomd = {
|
||||
enableRootSlice = true;
|
||||
enableUserSlices = true;
|
||||
};
|
||||
|
||||
# security.polkit.enable = lib.mkDefault true;
|
||||
boot.tmp.useTmpfs = lib.mkDefault true;
|
||||
|
||||
# Nix Settings
|
||||
nix = {
|
||||
# registry.nixpkgs.flake = inputs.nixpkgs;
|
||||
# nixPath = [ "nixpkgs=${inputs.nixpkgs}" ];
|
||||
package = pkgs.lix;
|
||||
settings = {
|
||||
auto-optimise-store = true;
|
||||
trusted-users = [
|
||||
"root"
|
||||
"vivian"
|
||||
];
|
||||
substituters = [
|
||||
"https://nix-community.cachix.org"
|
||||
"https://nixpkgs-review-bot.cachix.org"
|
||||
"https://cachix.cachix.org"
|
||||
"https://hyprland.cachix.org"
|
||||
];
|
||||
trusted-public-keys = [
|
||||
"cachix.cachix.org-1:eWNHQldwUO7G2VkjpnjDbWwy4KQ/HNxht7H4SSoMckM="
|
||||
"nix-community.cachix.org-1:mB9FSh9qf2dCimDSUo8Zy7bkq5CX+/rkCWyvRCYg3Fs="
|
||||
"nixpkgs-review-bot.cachix.org-1:eppgiDjPk7Hkzzz7XlUesk3rcEHqNDozGOrcLc8IqwE="
|
||||
"hyprland.cachix.org-1:a7pgxzMz7+chwVL3/pzj6jIBMioiJM7ypFP8PwtkuGc="
|
||||
];
|
||||
};
|
||||
optimise = {
|
||||
automatic = true;
|
||||
dates = [ "weekly" ];
|
||||
};
|
||||
gc = {
|
||||
automatic = true;
|
||||
dates = "weekly";
|
||||
randomizedDelaySec = "3h";
|
||||
options = "--delete-older-than 7d";
|
||||
};
|
||||
extraOptions = ''
|
||||
experimental-features = nix-command flakes
|
||||
'';
|
||||
};
|
||||
|
||||
services = {
|
||||
# Limit the systemd journal to 100 MB of disk or the
|
||||
# last 7 days of logs, whichever happens first.
|
||||
journald.extraConfig = ''
|
||||
SystemMaxUse=100M
|
||||
MaxFileSec=7day
|
||||
'';
|
||||
|
||||
dbus.implementation = "broker";
|
||||
|
||||
# Enable SSH
|
||||
openssh = {
|
||||
enable = true;
|
||||
settings = {
|
||||
PasswordAuthentication = lib.mkDefault false;
|
||||
PermitRootLogin = lib.mkDefault "no";
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
# Debloat
|
||||
documentation = {
|
||||
enable = lib.mkForce false;
|
||||
doc.enable = lib.mkForce false;
|
||||
man.enable = lib.mkForce false;
|
||||
info.enable = lib.mkForce false;
|
||||
nixos.enable = lib.mkForce false;
|
||||
};
|
||||
}
|
9
common/desktop/README.md
Normal file
9
common/desktop/README.md
Normal file
|
@ -0,0 +1,9 @@
|
|||
# Common Desktop Config
|
||||
This is where I store the NixOS config that is common between
|
||||
my laptop and desktop
|
||||
|
||||
## Files
|
||||
* `./default.nix`: Contains common systemwide configuration
|
||||
* See also my NixOS [modules](../modules), specifically gnome
|
||||
* `./home.nix`: Contains common user-level configuration
|
||||
* See also my Home-Manager [modules](../hm-modules)
|
131
common/desktop/default.nix
Normal file
131
common/desktop/default.nix
Normal file
|
@ -0,0 +1,131 @@
|
|||
{
|
||||
pkgs,
|
||||
lib,
|
||||
inputs,
|
||||
...
|
||||
}:
|
||||
{
|
||||
# Bootloader.
|
||||
boot = {
|
||||
kernelPackages = lib.mkDefault pkgs.linuxPackages_latest;
|
||||
loader = {
|
||||
systemd-boot.enable = lib.mkDefault true;
|
||||
efi.canTouchEfiVariables = true;
|
||||
efi.efiSysMountPoint = "/boot/efi";
|
||||
};
|
||||
kernel.sysctl = lib.mkDefault { "fs.inotify.max_user_watches" = 524288; };
|
||||
initrd = {
|
||||
systemd.enable = true;
|
||||
verbose = false;
|
||||
};
|
||||
};
|
||||
|
||||
# programs.nix-ld.enable = true;
|
||||
|
||||
hardware.keyboard.qmk.enable = true;
|
||||
home-manager = {
|
||||
useGlobalPkgs = true;
|
||||
useUserPackages = true;
|
||||
users.vivian = import ./home.nix;
|
||||
extraSpecialArgs = {
|
||||
inherit inputs;
|
||||
};
|
||||
};
|
||||
|
||||
services = {
|
||||
pulseaudio.enable = false;
|
||||
|
||||
# Enable my config for the gnome desktop environment
|
||||
v.gnome.enable = lib.mkDefault true;
|
||||
|
||||
flatpak.enable = true;
|
||||
|
||||
# Enable CUPS to print documents.
|
||||
printing.enable = true;
|
||||
pipewire = {
|
||||
enable = true;
|
||||
audio.enable = true;
|
||||
# alsa.enable = true;
|
||||
# alsa.support32Bit = true;
|
||||
pulse.enable = true;
|
||||
# If you want to use JACK applications, uncomment this
|
||||
jack.enable = true;
|
||||
|
||||
# use the example session manager (no others are packaged yet so this is enabled by default,
|
||||
# no need to redefine it in your config for now)
|
||||
#media-session.enable = true;
|
||||
};
|
||||
};
|
||||
|
||||
# Set your time zone.
|
||||
time.timeZone = "Europe/Amsterdam";
|
||||
|
||||
# Select internationalisation properties.
|
||||
i18n.defaultLocale = "en_GB.UTF-8";
|
||||
i18n.extraLocaleSettings = {
|
||||
LC_ADDRESS = "nl_NL.UTF-8";
|
||||
LC_IDENTIFICATION = "nl_NL.UTF-8";
|
||||
LC_MEASUREMENT = "nl_NL.UTF-8";
|
||||
LC_MONETARY = "nl_NL.UTF-8";
|
||||
LC_NAME = "nl_NL.UTF-8";
|
||||
LC_NUMERIC = "nl_NL.UTF-8";
|
||||
LC_PAPER = "nl_NL.UTF-8";
|
||||
LC_TELEPHONE = "nl_NL.UTF-8";
|
||||
LC_TIME = "nl_NL.UTF-8";
|
||||
};
|
||||
|
||||
# Global Packages
|
||||
environment.systemPackages = with pkgs; [
|
||||
wireguard-tools
|
||||
sbctl
|
||||
]; # ++ (if config.virtualisation.podman.enable then [ pkgs.podman-compose ] else []);
|
||||
|
||||
security.rtkit.enable = true;
|
||||
|
||||
virtualisation = {
|
||||
podman.enable = lib.mkDefault true;
|
||||
libvirtd = {
|
||||
enable = true;
|
||||
qemu.package = pkgs.qemu_kvm;
|
||||
};
|
||||
};
|
||||
|
||||
fonts.packages = with pkgs; [
|
||||
material-design-icons
|
||||
|
||||
noto-fonts
|
||||
noto-fonts-cjk-sans
|
||||
noto-fonts-emoji
|
||||
|
||||
dejavu_fonts
|
||||
|
||||
nerd-fonts.dejavu-sans-mono
|
||||
nerd-fonts.ubuntu
|
||||
nerd-fonts.droid-sans-mono
|
||||
nerd-fonts.symbols-only
|
||||
];
|
||||
|
||||
programs = {
|
||||
steam = {
|
||||
enable = true;
|
||||
# Open ports in the firewall for Steam Remote Play
|
||||
remotePlay.openFirewall = true;
|
||||
package = pkgs.steam.override {
|
||||
extraPkgs =
|
||||
pkgs: with pkgs; [
|
||||
gamescope
|
||||
mangohud
|
||||
];
|
||||
};
|
||||
};
|
||||
|
||||
adb.enable = true;
|
||||
};
|
||||
|
||||
networking = {
|
||||
# Networking
|
||||
networkmanager.enable = true;
|
||||
firewall.checkReversePath = false;
|
||||
firewall.enable = false;
|
||||
};
|
||||
}
|
124
common/desktop/home.nix
Normal file
124
common/desktop/home.nix
Normal file
|
@ -0,0 +1,124 @@
|
|||
{
|
||||
pkgs,
|
||||
inputs,
|
||||
config,
|
||||
...
|
||||
}:
|
||||
let
|
||||
tex = pkgs.texlive.combine {
|
||||
inherit (pkgs.texlive) scheme-full;
|
||||
};
|
||||
my-python-packages =
|
||||
ps: with ps; [
|
||||
cryptography
|
||||
flask
|
||||
ipwhois
|
||||
numpy
|
||||
pandas
|
||||
pyasn
|
||||
pyshark
|
||||
requests
|
||||
scapy
|
||||
z3-solver
|
||||
];
|
||||
in
|
||||
{
|
||||
home.packages = with pkgs; [
|
||||
(python3.withPackages my-python-packages)
|
||||
btop
|
||||
calibre
|
||||
celluloid # video player
|
||||
comma
|
||||
cinny-desktop
|
||||
discord
|
||||
element-desktop
|
||||
foliate # epub reader
|
||||
firefox
|
||||
gcc
|
||||
gimp
|
||||
jellyfin-media-player
|
||||
neofetch
|
||||
nixpkgs-review
|
||||
qmk
|
||||
signal-desktop
|
||||
solo2-cli
|
||||
spotify
|
||||
unzip
|
||||
yt-dlp
|
||||
|
||||
obsidian
|
||||
(lib.hiPrio (
|
||||
pkgs.writeShellScriptBin "obsidian" ''
|
||||
unset WAYLAND_DISPLAY
|
||||
${pkgs.obsidian}/bin/obsidian
|
||||
''
|
||||
))
|
||||
];
|
||||
# Enable my own hm modules
|
||||
themes.v.catppuccin.enable = true;
|
||||
programs = {
|
||||
v = {
|
||||
vscode.enable = true;
|
||||
nvim.enable = true;
|
||||
rust.enable = true;
|
||||
};
|
||||
|
||||
zed-editor = {
|
||||
enable = true;
|
||||
};
|
||||
|
||||
# firefox.enable = true;
|
||||
|
||||
chromium = {
|
||||
enable = true;
|
||||
extensions = [
|
||||
{ id = "cjpalhdlnbpafiamejdnhcphjbkeiagm"; } # ublock origin
|
||||
{ id = "nngceckbapebfimnlniiiahkandclblb"; } # bitwarden
|
||||
];
|
||||
};
|
||||
|
||||
direnv = {
|
||||
enable = true;
|
||||
nix-direnv.enable = true;
|
||||
};
|
||||
|
||||
zsh = {
|
||||
enable = true;
|
||||
sessionVariables = {
|
||||
DIRENV_LOG_FORMAT = "";
|
||||
};
|
||||
};
|
||||
|
||||
kitty = {
|
||||
enable = true;
|
||||
shellIntegration.enableZshIntegration = true;
|
||||
};
|
||||
};
|
||||
|
||||
xdg.autoStart = {
|
||||
packages = with pkgs; [
|
||||
element-desktop
|
||||
firefox
|
||||
discord
|
||||
];
|
||||
};
|
||||
|
||||
# Syncthing
|
||||
services.syncthing.enable = true;
|
||||
xdg.userDirs =
|
||||
let
|
||||
home = config.home.homeDirectory;
|
||||
in
|
||||
{
|
||||
enable = true;
|
||||
createDirectories = true;
|
||||
desktop = "${home}/.desktop";
|
||||
documents = "${home}/cloud/Documents";
|
||||
download = "${home}/dl";
|
||||
music = "${home}/cloud/Music";
|
||||
pictures = "${home}/cloud/Pictures";
|
||||
publicShare = "${home}/.publicShare";
|
||||
templates = "${home}/.templates";
|
||||
videos = "${home}/cloud/Videos";
|
||||
};
|
||||
}
|
6
common/generic-vm.nix
Normal file
6
common/generic-vm.nix
Normal file
|
@ -0,0 +1,6 @@
|
|||
{ lib, ... }: {
|
||||
networking.useDHCP = lib.mkDefault true;
|
||||
|
||||
# Enable qemu guest agent
|
||||
services.qemuGuest.enable = true;
|
||||
}
|
62
common/hm-modules/catppuccin/default.nix
Normal file
62
common/hm-modules/catppuccin/default.nix
Normal file
|
@ -0,0 +1,62 @@
|
|||
{
|
||||
config,
|
||||
pkgs,
|
||||
lib,
|
||||
...
|
||||
}:
|
||||
with lib;
|
||||
let
|
||||
cfg = config.themes.v.catppuccin;
|
||||
in
|
||||
{
|
||||
options.themes.v.catppuccin = {
|
||||
enable = mkEnableOption "catppuccin";
|
||||
};
|
||||
config = mkIf cfg.enable {
|
||||
catppuccin = {
|
||||
enable = true;
|
||||
flavor = "frappe";
|
||||
accent = "pink";
|
||||
|
||||
waybar.enable = false;
|
||||
|
||||
mako.enable = false;
|
||||
rofi.enable = true;
|
||||
|
||||
hyprland.enable = true;
|
||||
kitty.enable = true;
|
||||
|
||||
kvantum.enable = true;
|
||||
};
|
||||
|
||||
# home.pointerCursor = {
|
||||
# name = "Bibata_Ghost";
|
||||
# size = 24;
|
||||
# package = pkgs.bibata-cursors-translucent;
|
||||
# };
|
||||
|
||||
programs.kitty = {
|
||||
# themeFile = "Catppuccin-Frappe";
|
||||
font.name = "DejaVuSansMono Nerd Font";
|
||||
};
|
||||
|
||||
gtk = {
|
||||
enable = true;
|
||||
iconTheme = {
|
||||
name = "Papirus-Dark";
|
||||
package = pkgs.papirus-icon-theme.override { color = "violet"; };
|
||||
};
|
||||
# cursorTheme = {
|
||||
# inherit (config.home.pointerCursor) name package size;
|
||||
# };
|
||||
};
|
||||
|
||||
qt = {
|
||||
enable = true;
|
||||
# platformTheme = "qtct";
|
||||
style.name = "kvantum";
|
||||
platformTheme.name = "kvantum";
|
||||
};
|
||||
|
||||
};
|
||||
}
|
10
common/hm-modules/default.nix
Normal file
10
common/hm-modules/default.nix
Normal file
|
@ -0,0 +1,10 @@
|
|||
{ ... }:
|
||||
{
|
||||
imports = [
|
||||
./catppuccin
|
||||
./nvim
|
||||
./vscode.nix
|
||||
./git.nix
|
||||
./rust.nix
|
||||
];
|
||||
}
|
31
common/hm-modules/git.nix
Normal file
31
common/hm-modules/git.nix
Normal file
|
@ -0,0 +1,31 @@
|
|||
{ config, pkgs, lib, ... }:
|
||||
with lib;
|
||||
let cfg = config.programs.v.git;
|
||||
in {
|
||||
options.programs.v.git = { enable = mkEnableOption "git"; };
|
||||
config = mkIf cfg.enable {
|
||||
programs.git = {
|
||||
enable = true;
|
||||
package = pkgs.gitAndTools.gitFull;
|
||||
userName = "Vivian";
|
||||
userEmail = "vivian@0x76.dev";
|
||||
lfs.enable = true;
|
||||
extraConfig = {
|
||||
push.autoSetupRemote = true;
|
||||
init.defaultBranch = "main";
|
||||
# Git merge driver that always grabs upstream changes
|
||||
# Useful for e.g. lock files
|
||||
merge.ours = {
|
||||
name = "Overwrite Upstream Changes";
|
||||
driver = "cp -f '%A' '%B'";
|
||||
};
|
||||
};
|
||||
|
||||
difftastic.enable = true;
|
||||
};
|
||||
|
||||
home.file.".config/git/attributes".text = ''
|
||||
flake.lock merge=ours
|
||||
'';
|
||||
};
|
||||
}
|
220
common/hm-modules/nvim/default.nix
Normal file
220
common/hm-modules/nvim/default.nix
Normal file
|
@ -0,0 +1,220 @@
|
|||
{
|
||||
config,
|
||||
pkgs,
|
||||
lib,
|
||||
...
|
||||
}:
|
||||
let
|
||||
cfg = config.programs.v.nvim;
|
||||
in
|
||||
with lib;
|
||||
{
|
||||
options.programs.v.nvim = {
|
||||
enable = mkEnableOption "nvim";
|
||||
};
|
||||
config = mkIf cfg.enable {
|
||||
home.packages = with pkgs; [ fd ];
|
||||
home.file.".config/nvim/lua".source = ./lua;
|
||||
programs.nixvim =
|
||||
{ helpers, ... }:
|
||||
{
|
||||
enable = true;
|
||||
|
||||
imports = [
|
||||
./keybinds.nix
|
||||
./lsp.nix
|
||||
];
|
||||
|
||||
package = pkgs.neovim-unwrapped;
|
||||
vimAlias = true;
|
||||
luaLoader.enable = true;
|
||||
|
||||
performance = {
|
||||
byteCompileLua.enable = true;
|
||||
combinePlugins.enable = true;
|
||||
};
|
||||
|
||||
globals.mapleader = " ";
|
||||
|
||||
opts = {
|
||||
number = true;
|
||||
conceallevel = 2;
|
||||
expandtab = true;
|
||||
tabstop = 2;
|
||||
|
||||
shiftwidth = 2;
|
||||
smartindent = true;
|
||||
|
||||
title = true;
|
||||
|
||||
spell = true;
|
||||
spelllang = "en_gb";
|
||||
};
|
||||
|
||||
clipboard.providers.wl-copy.enable = true;
|
||||
|
||||
extraPlugins = with pkgs.vimPlugins; [
|
||||
FixCursorHold-nvim
|
||||
];
|
||||
|
||||
extraConfigLua = "";
|
||||
|
||||
colorschemes.catppuccin = {
|
||||
enable = true;
|
||||
settings.flavour = "frappe";
|
||||
};
|
||||
|
||||
plugins = {
|
||||
nvim-surround.enable = true;
|
||||
|
||||
zen-mode = {
|
||||
enable = true;
|
||||
settings = {
|
||||
window.options = {
|
||||
number = false;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
vimwiki = {
|
||||
enable = true;
|
||||
settings = {
|
||||
list = [
|
||||
{
|
||||
ext = ".md";
|
||||
path = "~/cloud/Notes/";
|
||||
syntax = "markdown";
|
||||
}
|
||||
];
|
||||
};
|
||||
};
|
||||
|
||||
image = {
|
||||
enable = false;
|
||||
settings.backend = "kitty";
|
||||
};
|
||||
web-devicons.enable = true;
|
||||
bufferline.enable = true;
|
||||
nix.enable = true;
|
||||
luasnip.enable = true;
|
||||
startup = {
|
||||
enable = true;
|
||||
theme = "my_theme";
|
||||
};
|
||||
obsidian = {
|
||||
enable = false;
|
||||
settings = {
|
||||
new_notes_location = "notes_subdir";
|
||||
notes_subdir = "Unsorted";
|
||||
daily_notes = {
|
||||
folder = "Diary/Daily";
|
||||
};
|
||||
workspaces = [
|
||||
{
|
||||
name = "notes";
|
||||
path = "~/cloud/Notes";
|
||||
}
|
||||
];
|
||||
completion = {
|
||||
min_chars = 2;
|
||||
nvim_cmp = true;
|
||||
};
|
||||
picker.name = "telescope.nvim";
|
||||
};
|
||||
};
|
||||
fidget = {
|
||||
enable = true;
|
||||
settings = {
|
||||
progress = {
|
||||
ignore = [ "ltex" ];
|
||||
display.done_ttl = 5;
|
||||
};
|
||||
notification = {
|
||||
override_vim_notify = true;
|
||||
};
|
||||
};
|
||||
};
|
||||
neotest = {
|
||||
enable = true;
|
||||
adapters = {
|
||||
plenary.enable = true;
|
||||
python.enable = true;
|
||||
rust = {
|
||||
enable = true;
|
||||
settings.args = [ "--no-capture" ];
|
||||
};
|
||||
};
|
||||
};
|
||||
treesitter = {
|
||||
enable = true;
|
||||
nixGrammars = true;
|
||||
settings = {
|
||||
highlight.enable = true;
|
||||
incremental_selection.enable = true;
|
||||
indent.enable = true;
|
||||
};
|
||||
};
|
||||
|
||||
# Git
|
||||
committia.enable = true;
|
||||
gitsigns.enable = true;
|
||||
|
||||
lualine = {
|
||||
enable = true;
|
||||
settings.options.theme = "catppuccin";
|
||||
};
|
||||
|
||||
oil = {
|
||||
enable = true;
|
||||
};
|
||||
|
||||
telescope = {
|
||||
enable = true;
|
||||
settings.defaults.preview.ls_short = true;
|
||||
extensions.file-browser = {
|
||||
enable = true;
|
||||
settings = {
|
||||
hijack_netrw = true;
|
||||
dir_icon = "";
|
||||
};
|
||||
};
|
||||
extensions.fzf-native.enable = true;
|
||||
extensions.fzf-native.settings.fuzzy = true;
|
||||
extensions.frecency.enable = true;
|
||||
extensions.ui-select.enable = true;
|
||||
};
|
||||
comment.enable = true;
|
||||
vimtex.enable = false;
|
||||
typst-preview.enable = true;
|
||||
floaterm.enable = true;
|
||||
cmp = {
|
||||
enable = true;
|
||||
autoEnableSources = true;
|
||||
settings = {
|
||||
cmdline.":".sources = [ { name = "path"; } ];
|
||||
snippet.expand = "function(args) require('luasnip').lsp_expand(args.body) end";
|
||||
mapping = {
|
||||
"<S-Tab>" = "cmp.mapping(cmp.mapping.select_prev_item(), {'i', 's'})";
|
||||
"<Tab>" = "cmp.mapping(cmp.mapping.select_next_item(), {'i', 's'})";
|
||||
"<CR>" = "cmp.mapping.confirm({ select = true })";
|
||||
"<C-Space>" = "cmp.mapping.complete()";
|
||||
"<C-e>" = "cmp.mapping.close()";
|
||||
};
|
||||
sources = [
|
||||
{ name = "nvim_lsp_signature_help"; }
|
||||
{ name = "path"; }
|
||||
{ name = "spell"; }
|
||||
{
|
||||
name = "buffer";
|
||||
# Words from other open buffers can also be suggested.
|
||||
option.get_bufnrs.__raw = "vim.api.nvim_list_bufs";
|
||||
}
|
||||
{ name = "nvim_lsp"; }
|
||||
{ name = "luasnip"; }
|
||||
];
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
}
|
185
common/hm-modules/nvim/keybinds.nix
Normal file
185
common/hm-modules/nvim/keybinds.nix
Normal file
|
@ -0,0 +1,185 @@
|
|||
{ helpers, ... }:
|
||||
{
|
||||
keymaps = with helpers; [
|
||||
# Disable arrow keys
|
||||
{
|
||||
mode = "n";
|
||||
key = "<Up>";
|
||||
action = "<Nop>";
|
||||
}
|
||||
{
|
||||
mode = "n";
|
||||
key = "<Down>";
|
||||
action = "<Nop>";
|
||||
}
|
||||
{
|
||||
mode = "n";
|
||||
key = "<Left>";
|
||||
action = "<Nop>";
|
||||
}
|
||||
{
|
||||
mode = "n";
|
||||
key = "<Right>";
|
||||
action = "<Nop>";
|
||||
}
|
||||
# General
|
||||
{
|
||||
mode = "n";
|
||||
key = "<leader>";
|
||||
action = ":noh<CR>";
|
||||
}
|
||||
# Telescope
|
||||
{
|
||||
mode = "n";
|
||||
key = "<leader>ff";
|
||||
action = ":Telescope find_files<CR>";
|
||||
}
|
||||
{
|
||||
mode = "n";
|
||||
key = "<leader>fs";
|
||||
action = ":Telescope lsp_dynamic_workspace_symbols<CR>";
|
||||
}
|
||||
{
|
||||
mode = "n";
|
||||
key = "<leader>fg";
|
||||
action = mkRaw "require('telescope.builtin').live_grep";
|
||||
}
|
||||
{
|
||||
mode = "n";
|
||||
key = "<leader>fb";
|
||||
action = ":Telescope buffers<CR>";
|
||||
}
|
||||
{
|
||||
mode = "n";
|
||||
key = "<leader>fo";
|
||||
action = ":Telescope oldfiles<CR>";
|
||||
}
|
||||
{
|
||||
mode = "n";
|
||||
key = "<leader>fr";
|
||||
action = ":Telescope frecency<CR>";
|
||||
}
|
||||
# Commenting
|
||||
{
|
||||
mode = "n";
|
||||
key = "<C-/>";
|
||||
action = mkRaw "require('Comment.api').toggle.linewise.current";
|
||||
}
|
||||
{
|
||||
mode = "x";
|
||||
key = "<C-/>";
|
||||
action = mkRaw ''
|
||||
function()
|
||||
local esc = vim.api.nvim_replace_termcodes(
|
||||
'<ESC>', true, false, true
|
||||
)
|
||||
vim.api.nvim_feedkeys(esc, 'nx', false)
|
||||
require('Comment.api').toggle.linewise(vim.fn.visualmode())
|
||||
end
|
||||
'';
|
||||
}
|
||||
# Float Term
|
||||
{
|
||||
mode = "n";
|
||||
key = "t";
|
||||
action = ":FloatermToggle myfloat<CR>";
|
||||
}
|
||||
{
|
||||
mode = "t";
|
||||
key = "<ESC>";
|
||||
action = mkRaw "function() vim.cmd(':FloatermToggle myfloat') end";
|
||||
}
|
||||
# Switch buffers
|
||||
{
|
||||
mode = "n";
|
||||
key = "<leader>q";
|
||||
action = ":bd<CR>"; # Delete buffer
|
||||
}
|
||||
{
|
||||
mode = "n";
|
||||
key = "<leader>s";
|
||||
action = ":bn<CR>"; # Buffer next
|
||||
}
|
||||
{
|
||||
mode = "n";
|
||||
key = "<leader>a";
|
||||
action = ":bp<CR>"; # Buffer previous
|
||||
}
|
||||
# Change Indenting
|
||||
{
|
||||
mode = "i";
|
||||
key = "<S-Tab>";
|
||||
action = "<C-o><<";
|
||||
}
|
||||
{
|
||||
mode = "n";
|
||||
key = "<S-Tab>";
|
||||
action = "<<_";
|
||||
}
|
||||
{
|
||||
mode = "n";
|
||||
key = "<Tab>";
|
||||
action = ">>_";
|
||||
}
|
||||
{
|
||||
mode = "v";
|
||||
key = "<Tab>";
|
||||
action = ">gv";
|
||||
}
|
||||
{
|
||||
mode = "v";
|
||||
key = "<S-Tab>";
|
||||
action = "<gv";
|
||||
}
|
||||
# Neotest
|
||||
{
|
||||
mode = "n";
|
||||
key = "<leader>nr";
|
||||
action = mkRaw "require('neotest').run.run";
|
||||
}
|
||||
{
|
||||
mode = "n";
|
||||
key = "<leader>no";
|
||||
action = mkRaw "require('neotest').output.open";
|
||||
}
|
||||
{
|
||||
mode = "n";
|
||||
key = "<leader>ns";
|
||||
action = mkRaw "require('neotest').run.stop";
|
||||
}
|
||||
{
|
||||
mode = "n";
|
||||
key = "<leader>nf";
|
||||
action = mkRaw "function() require('neotest').run.run(vim.fn.expand('%')) end";
|
||||
}
|
||||
# LSP
|
||||
{
|
||||
mode = "n";
|
||||
key = "<M-CR>";
|
||||
action = mkRaw "vim.lsp.buf.code_action";
|
||||
}
|
||||
{
|
||||
mode = "n";
|
||||
key = "<leader>e";
|
||||
action = mkRaw "vim.diagnostic.open_float";
|
||||
}
|
||||
# oil
|
||||
{
|
||||
mode = "n";
|
||||
key = "_";
|
||||
action = "<CMD>Oil<CR>";
|
||||
}
|
||||
# Tiny mist (Typst)
|
||||
# {
|
||||
# mode = "n";
|
||||
# key = "<leader>tp";
|
||||
# action = mkRaw ''
|
||||
# client:exec_cmd({
|
||||
# title = "pin",
|
||||
# command = "tinymist.pinMain",
|
||||
# arguments = { vim.api.nvim_buf_get_name(0) },
|
||||
# }, { bufnr = bufnr })
|
||||
# '';
|
||||
# }
|
||||
];
|
||||
}
|
127
common/hm-modules/nvim/lsp.nix
Normal file
127
common/hm-modules/nvim/lsp.nix
Normal file
|
@ -0,0 +1,127 @@
|
|||
{ pkgs, ... }:
|
||||
{
|
||||
plugins = {
|
||||
rustaceanvim = {
|
||||
enable = true;
|
||||
|
||||
settings = {
|
||||
auto_attach = true;
|
||||
server = {
|
||||
standalone = false;
|
||||
default_settings = {
|
||||
rust-analyzer = {
|
||||
inlayHints = {
|
||||
lifetimeElisionHints = {
|
||||
enable = "always";
|
||||
};
|
||||
};
|
||||
cargo.features = "all";
|
||||
check = {
|
||||
command = "clippy";
|
||||
};
|
||||
cachePriming.enable = false;
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
lsp = {
|
||||
enable = true;
|
||||
inlayHints = true;
|
||||
keymaps = {
|
||||
lspBuf = {
|
||||
K = "hover";
|
||||
gD = "references";
|
||||
gd = "definition";
|
||||
gi = "implementation";
|
||||
gt = "type_definition";
|
||||
"<leader>rn" = "rename";
|
||||
"g=" = "format";
|
||||
};
|
||||
diagnostic = {
|
||||
"<leader>j" = "goto_next";
|
||||
"<leader>k" = "goto_prev";
|
||||
};
|
||||
};
|
||||
servers = {
|
||||
cssls.enable = true;
|
||||
nil_ls.enable = true; # NixOS
|
||||
dockerls.enable = true;
|
||||
rust_analyzer = {
|
||||
enable = false;
|
||||
installCargo = false;
|
||||
installRustc = false;
|
||||
};
|
||||
pyright.enable = true;
|
||||
pylsp = {
|
||||
enable = true;
|
||||
settings.plugins = {
|
||||
black = {
|
||||
enabled = true;
|
||||
cache_config = true;
|
||||
};
|
||||
pycodestyle = {
|
||||
maxLineLength = 100;
|
||||
};
|
||||
};
|
||||
};
|
||||
elixirls.enable = true;
|
||||
clangd.enable = true;
|
||||
yamlls.enable = true;
|
||||
lua_ls.enable = true;
|
||||
tinymist = {
|
||||
enable = true;
|
||||
rootMarkers = [ "main.typ" ];
|
||||
onAttach.function = ''
|
||||
vim.keymap.set("n", "<leader>tp", function()
|
||||
client:exec_cmd({
|
||||
title = "pin",
|
||||
command = "tinymist.pinMain",
|
||||
arguments = { vim.api.nvim_buf_get_name(0) },
|
||||
}, { bufnr = bufnr })
|
||||
end, { desc = "[T]inymist [P]in", noremap = true })
|
||||
|
||||
vim.keymap.set("n", "<leader>tu", function()
|
||||
client:exec_cmd({
|
||||
title = "unpin",
|
||||
command = "tinymist.pinMain",
|
||||
arguments = { vim.v.null },
|
||||
}, { bufnr = bufnr })
|
||||
end, { desc = "[T]inymist [U]npin", noremap = true })
|
||||
'';
|
||||
settings = {
|
||||
formatterMode = "typstyle"; # or "typstfmt"
|
||||
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
trouble.enable = true;
|
||||
lspkind.enable = true;
|
||||
lspsaga = {
|
||||
enable = true;
|
||||
lightbulb.enable = false;
|
||||
};
|
||||
nvim-lightbulb = {
|
||||
enable = true;
|
||||
settings = {
|
||||
autocmd.enabled = true;
|
||||
number.enabled = true;
|
||||
};
|
||||
};
|
||||
|
||||
none-ls = {
|
||||
enable = true;
|
||||
sources = {
|
||||
formatting = {
|
||||
nixfmt = {
|
||||
enable = true;
|
||||
package = pkgs.nixfmt-rfc-style;
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
}
|
48
common/hm-modules/nvim/lua/obsidian_picker.lua
Normal file
48
common/hm-modules/nvim/lua/obsidian_picker.lua
Normal file
|
@ -0,0 +1,48 @@
|
|||
local pickers = require "telescope.pickers"
|
||||
local finders = require "telescope.finders"
|
||||
local conf = require("telescope.config").values
|
||||
local actions = require("telescope.actions")
|
||||
local action_state = require("telescope.actions.state")
|
||||
|
||||
local obsidian_commands = require("obsidian.commands").commands
|
||||
local results = {}
|
||||
for key, _ in pairs(obsidian_commands) do
|
||||
table.insert(results, string.sub(key, 9))
|
||||
end
|
||||
|
||||
Local = 100
|
||||
local Local = 3
|
||||
print(Local)
|
||||
|
||||
local obsidian_picker = function(opts)
|
||||
opts = opts or require("telescope.themes").get_dropdown{}
|
||||
pickers.new(opts, {
|
||||
prompt_title = "Obsidian",
|
||||
finder = finders.new_table {
|
||||
results = results,
|
||||
-- entry_maker = function(entry)
|
||||
-- return {
|
||||
-- value = entry,
|
||||
-- display = entry[1],
|
||||
-- ordinal = entry[1],
|
||||
-- }
|
||||
-- end
|
||||
},
|
||||
sorter = conf.generic_sorter(opts),
|
||||
attach_mappings = function(prompt_bufnr, map)
|
||||
actions.select_default:replace(function()
|
||||
actions.close(prompt_bufnr)
|
||||
local selection = action_state.get_selected_entry()
|
||||
vim.cmd(':Obsidian' .. selection[1])
|
||||
end)
|
||||
return true
|
||||
end,
|
||||
}):find()
|
||||
end
|
||||
|
||||
-- obsidian_picker()
|
||||
|
||||
return {
|
||||
obsidian_picker = obsidian_picker
|
||||
}
|
||||
|
75
common/hm-modules/nvim/lua/startup/themes/my_theme.lua
Normal file
75
common/hm-modules/nvim/lua/startup/themes/my_theme.lua
Normal file
|
@ -0,0 +1,75 @@
|
|||
local settings = {
|
||||
-- every line should be same width without escaped \
|
||||
header = {
|
||||
type = "text",
|
||||
oldfiles_directory = false,
|
||||
align = "center",
|
||||
fold_section = false,
|
||||
title = "Header",
|
||||
margin = 5,
|
||||
content = {
|
||||
" ███╗ ██╗ ███████╗ ██████╗ ██╗ ██╗ ██╗ ███╗ ███╗",
|
||||
" ████╗ ██║ ██╔════╝██╔═══██╗ ██║ ██║ ██║ ████╗ ████║",
|
||||
" ██╔██╗ ██║ █████╗ ██║ ██║ ██║ ██║ ██║ ██╔████╔██║",
|
||||
" ██║╚██╗██║ ██╔══╝ ██║ ██║ ╚██╗ ██╔╝ ██║ ██║╚██╔╝██║",
|
||||
" ██║ ╚████║ ███████╗╚██████╔╝ ╚████╔╝ ██║ ██║ ╚═╝ ██║",
|
||||
" ╚═╝ ╚═══╝ ╚══════╝ ╚═════╝ ╚═══╝ ╚═╝ ╚═╝ ╚═╝",
|
||||
},
|
||||
highlight = "Statement",
|
||||
default_color = "",
|
||||
oldfiles_amount = 0,
|
||||
},
|
||||
-- name which will be displayed and command
|
||||
body = {
|
||||
type = "mapping",
|
||||
oldfiles_directory = false,
|
||||
align = "center",
|
||||
fold_section = false,
|
||||
title = "Basic Commands",
|
||||
margin = 5,
|
||||
content = {
|
||||
{ " Find File", "Telescope find_files", "<leader>ff"},
|
||||
{ " Find Word ", "Telescope live_grep", "<leader>fg"},
|
||||
{ " Recent Files", "Telescope oldfiles", "<leader>fo"},
|
||||
{ " File Browser", "Telescope file_browser", "<leader>fs"},
|
||||
{ " New File", "lua require'startup'.new_file()", "<leader>nf"},
|
||||
},
|
||||
highlight = "String",
|
||||
default_color = "",
|
||||
oldfiles_amount = 0,
|
||||
},
|
||||
footer = {
|
||||
type = "text",
|
||||
oldfiles_directory = false,
|
||||
align = "center",
|
||||
fold_section = false,
|
||||
title = "Footer",
|
||||
margin = 5,
|
||||
content = { "bottom text" },
|
||||
highlight = "Number",
|
||||
default_color = "",
|
||||
oldfiles_amount = 0,
|
||||
},
|
||||
|
||||
options = {
|
||||
mapping_keys = true,
|
||||
cursor_column = 0.5,
|
||||
empty_lines_between_mappings = true,
|
||||
disable_statuslines = true,
|
||||
paddings = { 1, 3, 3, 0 },
|
||||
},
|
||||
mappings = {
|
||||
execute_command = "<CR>",
|
||||
open_file = "o",
|
||||
open_file_split = "<c-o>",
|
||||
open_section = "<TAB>",
|
||||
open_help = "?",
|
||||
},
|
||||
colors = {
|
||||
background = "#1f2227",
|
||||
folded_section = "#56b6c2",
|
||||
},
|
||||
parts = { "header", "body", "footer" },
|
||||
}
|
||||
return settings
|
||||
|
35
common/hm-modules/nvim/obsidian_picker.lua
Normal file
35
common/hm-modules/nvim/obsidian_picker.lua
Normal file
|
@ -0,0 +1,35 @@
|
|||
local pickers = require "telescope.pickers"
|
||||
local finders = require "telescope.finders"
|
||||
local conf = require("telescope.config").values
|
||||
local actions = require("telescope.actions")
|
||||
local action_state = require("telescope.actions.state")
|
||||
|
||||
local obsidian_commands = require("obsidian.commands").commands
|
||||
local results = {}
|
||||
for key, _ in pairs(obsidian_commands) do
|
||||
table.insert(results, string.sub(key, 9))
|
||||
end
|
||||
|
||||
local obsidian_picker = function(opts)
|
||||
opts = opts or require("telescope.themes").get_dropdown {}
|
||||
pickers.new(opts, {
|
||||
prompt_title = "Obsidian",
|
||||
finder = finders.new_table {
|
||||
results = results,
|
||||
},
|
||||
sorter = conf.generic_sorter(opts),
|
||||
attach_mappings = function(prompt_bufnr, map)
|
||||
actions.select_default:replace(function()
|
||||
actions.close(prompt_bufnr)
|
||||
local selection = action_state.get_selected_entry()
|
||||
vim.cmd(':Obsidian' .. selection[1])
|
||||
end)
|
||||
return true
|
||||
end,
|
||||
}):find()
|
||||
end
|
||||
|
||||
|
||||
return {
|
||||
obsidian_picker = obsidian_picker
|
||||
}
|
41
common/hm-modules/rust.nix
Normal file
41
common/hm-modules/rust.nix
Normal file
|
@ -0,0 +1,41 @@
|
|||
{
|
||||
pkgs,
|
||||
lib,
|
||||
config,
|
||||
...
|
||||
}:
|
||||
with lib;
|
||||
let
|
||||
cfg = config.programs.v.rust;
|
||||
in
|
||||
{
|
||||
options.programs.v.rust.enable = mkEnableOption "rust";
|
||||
|
||||
config = mkIf cfg.enable {
|
||||
home = {
|
||||
packages = with pkgs; [
|
||||
bacon
|
||||
rustup
|
||||
cargo-binutils
|
||||
cargo-nextest
|
||||
cargo-msrv
|
||||
cargo-dist
|
||||
cargo-cross
|
||||
cargo-generate
|
||||
];
|
||||
|
||||
file.".cargo/config.toml".text = ''
|
||||
[registries.crates-io]
|
||||
protocol = "sparse"
|
||||
|
||||
[build]
|
||||
rustc-wrapper = "${pkgs.sccache}/bin/sccache"
|
||||
|
||||
[profile.rust-analyzer]
|
||||
inherits = "dev"
|
||||
'';
|
||||
|
||||
sessionPath = [ "$HOME/.cargo/bin" ];
|
||||
};
|
||||
};
|
||||
}
|
115
common/hm-modules/vscode.nix
Normal file
115
common/hm-modules/vscode.nix
Normal file
|
@ -0,0 +1,115 @@
|
|||
{
|
||||
config,
|
||||
pkgs,
|
||||
lib,
|
||||
...
|
||||
}:
|
||||
with lib;
|
||||
let
|
||||
cfg = config.programs.v.vscode;
|
||||
in
|
||||
{
|
||||
options.programs.v.vscode = {
|
||||
enable = mkEnableOption "vscode";
|
||||
};
|
||||
config = mkIf cfg.enable {
|
||||
programs.vscode = {
|
||||
enable = true;
|
||||
package = pkgs.vscode;
|
||||
profiles.default = {
|
||||
userSettings = {
|
||||
"ltex.language" = "en-GB";
|
||||
"latex-workshop.linting.chktex.enabled" = true;
|
||||
"latex-workshop.latex.clean.subfolder.enabled" = true;
|
||||
"latex-workshop.latex.outDir" = "%TMPDIR%/%RELATIVE_DOC%";
|
||||
"editor.fontFamily" = "'DejaVuSansMono Nerd Font', 'monospace', monospace";
|
||||
"keyboard.dispatch" = "keyCode";
|
||||
"rust-analyzer.server.path" = "${pkgs.rust-analyzer}/bin/rust-analyzer";
|
||||
"rust-analyzer.check.extraArgs" = [
|
||||
"--profile"
|
||||
"rust-analyzer"
|
||||
];
|
||||
"rust-analyzer.check.command" = "clippy";
|
||||
"terminal.integrated.defaultProfile.linux" = "zsh";
|
||||
"nix.enableLanguageServer" = true; # Enable LSP.
|
||||
"nix.serverPath" = "${pkgs.nil}/bin/nil";
|
||||
"[nix]" = {
|
||||
"editor.defaultFormatter" = "brettm12345.nixfmt-vscode";
|
||||
};
|
||||
"[python]" = {
|
||||
"editor.formatOnType" = true;
|
||||
};
|
||||
"debug.allowBreakpointsEverywhere" = true;
|
||||
"C_Cpp.clang_format_fallbackStyle" = "{ BasedOnStyle: Google, IndentWidth: 4, ColumnLimit: 0}";
|
||||
# "crates.compatibleDecorator" = "✓";
|
||||
# "crates.errorDecorator" = "✗";
|
||||
# "crates.incompatibleDecorator" = "🛇";
|
||||
|
||||
# Verilog
|
||||
"verilog.formatting.verilogHDL.formatter" = "verible-verilog-format";
|
||||
"verilog.languageServer.svls.enabled" = true;
|
||||
"verilog.languageServer.svls.path" = "${pkgs.svls}/bin/svls";
|
||||
"verilog.languageServer.veribleVerilogLs.enabled" = true;
|
||||
"verilog.languageServer.veribleVerilogLs.path" = "${pkgs.verible}/bin/verible-verilog-ls";
|
||||
"verilog.formatting.veribleVerilogFormatter.path" = "${pkgs.verible}/bin/verible-verilog-format";
|
||||
"verilog.linting.linter" = "verilator";
|
||||
"verilog.linting.path" = "${pkgs.verilator}/bin/verilator";
|
||||
"[verilog]" = {
|
||||
"editor.defaultFormatter" = "mshr-h.veriloghdl";
|
||||
};
|
||||
|
||||
# Don't index unecessary things
|
||||
"files.exclude" = {
|
||||
"**/.vscode" = true;
|
||||
"**/.git" = true;
|
||||
"**/.svn" = true;
|
||||
"**/.hg" = true;
|
||||
"**/.deps" = true;
|
||||
"**/CVS" = true;
|
||||
"**/.DS_Store" = true;
|
||||
"/bin" = true;
|
||||
"/boot" = true;
|
||||
"/cdrom" = true;
|
||||
"/dev" = true;
|
||||
"/proc" = true;
|
||||
"/etc" = true;
|
||||
"/nix" = true;
|
||||
};
|
||||
};
|
||||
extensions = with pkgs.vscode-extensions; [
|
||||
brettm12345.nixfmt-vscode
|
||||
# catppuccin.catppuccin-vsc
|
||||
codezombiech.gitignore
|
||||
codezombiech.gitignore
|
||||
davidlday.languagetool-linter
|
||||
editorconfig.editorconfig
|
||||
foxundermoon.shell-format
|
||||
github.copilot
|
||||
github.copilot-chat
|
||||
github.vscode-github-actions
|
||||
james-yu.latex-workshop
|
||||
jnoortheen.nix-ide
|
||||
mkhl.direnv
|
||||
ms-vscode-remote.remote-ssh
|
||||
ms-vscode.cpptools
|
||||
ms-vsliveshare.vsliveshare
|
||||
mshr-h.veriloghdl
|
||||
# platformio.platformio-ide
|
||||
redhat.vscode-xml
|
||||
redhat.vscode-yaml
|
||||
rust-lang.rust-analyzer
|
||||
skellock.just
|
||||
sumneko.lua
|
||||
tamasfe.even-better-toml
|
||||
vadimcn.vscode-lldb
|
||||
vadimcn.vscode-lldb
|
||||
valentjn.vscode-ltex
|
||||
vscodevim.vim
|
||||
xaver.clang-format
|
||||
continue.continue
|
||||
];
|
||||
};
|
||||
};
|
||||
|
||||
};
|
||||
}
|
11
common/modules/default.nix
Normal file
11
common/modules/default.nix
Normal file
|
@ -0,0 +1,11 @@
|
|||
{ ... }: {
|
||||
imports = [
|
||||
./meta.nix
|
||||
./nginx.nix
|
||||
./dns.nix
|
||||
./flood.nix
|
||||
./gnome
|
||||
./unpackerr.nix
|
||||
./vault.nix
|
||||
];
|
||||
}
|
114
common/modules/dns.nix
Normal file
114
common/modules/dns.nix
Normal file
|
@ -0,0 +1,114 @@
|
|||
{ config, pkgs, lib, self, ... }:
|
||||
# DNS Module to set up Unbound DNS with all my hosts in the config
|
||||
# Used for DNS Servers and my laptop
|
||||
with lib;
|
||||
let
|
||||
inherit (builtins) filter attrValues;
|
||||
domains = [ "hades" "olympus" "thalassa" ];
|
||||
mapConfig = host: {
|
||||
inherit (host.config.networking) hostName domain;
|
||||
inherit (host.config.meta) ipv4 ipv6;
|
||||
};
|
||||
hosts = (map mapConfig (attrValues self.nixosConfigurations));
|
||||
ipv4Hosts = filter (v: v.ipv4 != null) hosts;
|
||||
ipv6Hosts = filter (v: v.ipv6 != null) hosts;
|
||||
|
||||
localData = { hostName, domain, ipv4, ... }: ''"${hostName}.${domain}. A ${ipv4}"'';
|
||||
local6Data = { hostName, domain, ipv6, ... }: ''"${hostName}.${domain}. AAAA ${ipv6}"'';
|
||||
ptrData = { hostName, domain, ipv4, ... }: ''"${ipv4} ${hostName}.${domain}"'';
|
||||
ptr6Data = { hostName, domain, ipv6, ... }: ''"${ipv6} ${hostName}.${domain}"'';
|
||||
|
||||
cfg = config.services.v.dns;
|
||||
in {
|
||||
options.services.v.dns = {
|
||||
enable = mkEnableOption "v.dns";
|
||||
|
||||
openFirewall = mkOption {
|
||||
type = types.bool;
|
||||
default = false;
|
||||
description = lib.mdDoc ''
|
||||
Whether to open port 53 in the firwall for unbound dns
|
||||
And `services.prometheus.exporters.unbound.port` for metrics (if enabled).
|
||||
'';
|
||||
};
|
||||
|
||||
enableMetrics = mkOption {
|
||||
type = types.bool;
|
||||
default = cfg.mode == "server";
|
||||
description = ''
|
||||
Enable prometheus metrics
|
||||
'';
|
||||
};
|
||||
|
||||
mode = mkOption {
|
||||
type = types.enum [ "server" "laptop" ];
|
||||
default = "laptop";
|
||||
description = ''
|
||||
Whether to configure the DNS in server mode (listen on all interfaces) or laptop mode (just on localhost)
|
||||
'';
|
||||
};
|
||||
};
|
||||
|
||||
config = mkIf cfg.enable {
|
||||
networking.firewall = mkIf cfg.openFirewall {
|
||||
allowedTCPPorts = [ 53 ];
|
||||
allowedUDPPorts = [ 53 ];
|
||||
};
|
||||
services.prometheus.exporters.unbound = mkIf cfg.enableMetrics {
|
||||
enable = true;
|
||||
inherit (cfg) openFirewall;
|
||||
inherit (config.services.unbound) group;
|
||||
controlInterface = config.services.unbound.localControlSocketPath;
|
||||
};
|
||||
services.unbound = {
|
||||
enable = true;
|
||||
package = pkgs.v.unbound;
|
||||
localControlSocketPath =
|
||||
mkIf cfg.enableMetrics "/run/unbound/unbound.socket";
|
||||
settings = {
|
||||
server = mkMerge [
|
||||
{
|
||||
use-syslog = "yes";
|
||||
module-config = ''"validator iterator"'';
|
||||
|
||||
local-zone =
|
||||
map (localdomain: ''"${localdomain}}." transparent'') domains;
|
||||
local-data = (map localData ipv4Hosts) ++ (map local6Data ipv6Hosts);
|
||||
local-data-ptr = (map ptrData ipv4Hosts) ++ (map ptr6Data ipv6Hosts);
|
||||
|
||||
private-address = [
|
||||
"127.0.0.0/8"
|
||||
"10.0.0.0/8"
|
||||
"::ffff:a00:0/104"
|
||||
"172.16.0.0/12"
|
||||
"::ffff:ac10:0/108"
|
||||
"169.254.0.0/16"
|
||||
"::ffff:a9fe:0/112"
|
||||
"192.168.0.0/16"
|
||||
"::ffff:c0a8:0/112"
|
||||
"fd00::/8"
|
||||
"fe80::/10"
|
||||
];
|
||||
}
|
||||
(mkIf (cfg.mode == "server") {
|
||||
interface-automatic = "yes";
|
||||
interface = [ "0.0.0.0" "::0" ];
|
||||
access-control = [
|
||||
"127.0.0.1/32 allow_snoop"
|
||||
"::1 allow_snoop"
|
||||
"10.42.0.0/16 allow"
|
||||
"127.0.0.0/8 allow"
|
||||
"192.168.0.0/23 allow"
|
||||
"192.168.2.0/24 allow"
|
||||
"::1/128 allow"
|
||||
];
|
||||
})
|
||||
(mkIf (cfg.mode == "laptop") {
|
||||
interface = [ "127.0.0.1" "::1" ];
|
||||
access-control = [ "127.0.0.1/32 allow_snoop" "::1 allow_snoop" ];
|
||||
})
|
||||
];
|
||||
};
|
||||
};
|
||||
};
|
||||
}
|
153
common/modules/flood.nix
Normal file
153
common/modules/flood.nix
Normal file
|
@ -0,0 +1,153 @@
|
|||
{ config, pkgs, lib, ... }:
|
||||
with lib;
|
||||
let cfg = config.services.v.flood;
|
||||
in {
|
||||
options.services.v.flood = {
|
||||
enable = mkEnableOption "flood";
|
||||
|
||||
user = mkOption {
|
||||
default = "flood";
|
||||
type = types.str;
|
||||
description = ''
|
||||
User account under which flood runs.
|
||||
'';
|
||||
};
|
||||
|
||||
group = mkOption {
|
||||
type = types.str;
|
||||
default = "rtorrent";
|
||||
description = ''
|
||||
Group under which flood runs.
|
||||
Flood needs to have the correct permissions if accessing rtorrent through the socket.
|
||||
'';
|
||||
};
|
||||
|
||||
package = mkOption {
|
||||
type = types.package;
|
||||
default = pkgs.flood;
|
||||
defaultText = "pkgs.flood";
|
||||
description = ''
|
||||
The flood package to use.
|
||||
'';
|
||||
};
|
||||
|
||||
host = mkOption {
|
||||
type = types.str;
|
||||
default = "127.0.0.1";
|
||||
description = ''
|
||||
Address flood binds to.
|
||||
'';
|
||||
};
|
||||
|
||||
port = mkOption {
|
||||
type = types.port;
|
||||
default = 3000;
|
||||
description = ''
|
||||
The flood web port.
|
||||
'';
|
||||
};
|
||||
|
||||
openFirewall = mkOption {
|
||||
type = types.bool;
|
||||
default = false;
|
||||
description = ''
|
||||
Whether to open the firewall for the port in <option>services.flood.port</option>.
|
||||
'';
|
||||
};
|
||||
|
||||
rpcSocket = mkOption {
|
||||
type = types.str;
|
||||
readOnly = true;
|
||||
default = "/run/rtorrent/rpc.sock";
|
||||
description = ''
|
||||
RPC socket path.
|
||||
(Only used when auth=none).
|
||||
'';
|
||||
};
|
||||
|
||||
dataDir = mkOption {
|
||||
type = types.str;
|
||||
default = "/var/lib/flood";
|
||||
description = ''
|
||||
The directory where flood stores its data files.
|
||||
'';
|
||||
};
|
||||
|
||||
downloadDir = mkOption {
|
||||
type = types.str;
|
||||
default = "/var/lib/rtorrent/download";
|
||||
description = ''
|
||||
Root directory for downloaded files.
|
||||
'';
|
||||
};
|
||||
|
||||
authMode = mkOption {
|
||||
type = types.str;
|
||||
default = "none";
|
||||
description = ''
|
||||
Access control and user management method.
|
||||
Either 'default' or 'none'.
|
||||
'';
|
||||
};
|
||||
|
||||
ssl = mkOption {
|
||||
type = types.bool;
|
||||
default = false;
|
||||
description = ''
|
||||
Enable SSL.
|
||||
key.pem and fullchain.pem needed in runtime directory.
|
||||
'';
|
||||
};
|
||||
|
||||
baseURI = mkOption {
|
||||
type = types.str;
|
||||
default = "/";
|
||||
description = ''
|
||||
This URI will prefix all of Flood's HTTP requests
|
||||
'';
|
||||
};
|
||||
};
|
||||
|
||||
config = mkIf cfg.enable {
|
||||
# Create group if set to default
|
||||
users.groups = mkIf (cfg.group == "rtorrent") { rtorrent = { }; };
|
||||
|
||||
# Create user if set to default
|
||||
users.users = mkIf (cfg.user == "flood") {
|
||||
flood = {
|
||||
inherit (cfg) group;
|
||||
shell = pkgs.bashInteractive;
|
||||
home = cfg.dataDir;
|
||||
description = "flood Daemon user";
|
||||
isSystemUser = true;
|
||||
};
|
||||
};
|
||||
|
||||
# Open firewall if option is set to do so.
|
||||
networking.firewall.allowedTCPPorts = mkIf cfg.openFirewall [ cfg.port ];
|
||||
|
||||
# The actual service
|
||||
systemd.services.flood = {
|
||||
wantedBy = [ "multi-user.target" ];
|
||||
after = [ "network.target" ];
|
||||
description = "flood system service";
|
||||
serviceConfig = {
|
||||
User = cfg.user;
|
||||
Group = cfg.group;
|
||||
Type = "simple";
|
||||
Restart = "on-failure";
|
||||
WorkingDirectory = cfg.dataDir;
|
||||
ExecStart =
|
||||
"${cfg.package}/bin/flood --baseuri ${cfg.baseURI} --rundir ${cfg.dataDir} --host ${cfg.host} --port ${
|
||||
toString cfg.port
|
||||
} ${
|
||||
if cfg.ssl then "--ssl" else ""
|
||||
} --auth ${cfg.authMode} --rtsocket ${cfg.rpcSocket} --allowedpath ${cfg.downloadDir}";
|
||||
};
|
||||
};
|
||||
|
||||
# This is needed to create the dataDir with the correct permissions.
|
||||
systemd.tmpfiles.rules =
|
||||
[ "d '${cfg.dataDir}' 0755 ${cfg.user} ${cfg.group} -" ];
|
||||
};
|
||||
}
|
103
common/modules/gnome/default.nix
Normal file
103
common/modules/gnome/default.nix
Normal file
|
@ -0,0 +1,103 @@
|
|||
{
|
||||
config,
|
||||
pkgs,
|
||||
lib,
|
||||
...
|
||||
}:
|
||||
with lib;
|
||||
let
|
||||
cfg = config.services.v.gnome;
|
||||
in
|
||||
{
|
||||
options.services.v.gnome = {
|
||||
enable = mkEnableOption "v.gnome";
|
||||
hm = mkOption {
|
||||
type = types.bool;
|
||||
default = true;
|
||||
description = ''
|
||||
Whether to enable home manager integration to set default dconf values
|
||||
'';
|
||||
};
|
||||
|
||||
auto-unlock-keyring = mkOption {
|
||||
type = types.bool;
|
||||
default = true;
|
||||
description = ''
|
||||
Whether to automatically unlock the keyring upon login.
|
||||
This is mostly useful if you are logging in using a fingerprint
|
||||
or FIDO device and the keyring does not automatically get unlocked.
|
||||
Make sure you have enrolled you password into the keyring unlocker.
|
||||
'';
|
||||
};
|
||||
};
|
||||
|
||||
config = mkIf cfg.enable {
|
||||
services = {
|
||||
xserver = {
|
||||
enable = true;
|
||||
excludePackages = [ pkgs.xterm ];
|
||||
# Configure keymap in X11
|
||||
xkb = {
|
||||
layout = "us";
|
||||
variant = "altgr-intl";
|
||||
};
|
||||
|
||||
# Enable the GNOME Desktop Environment.
|
||||
displayManager.gdm.enable = lib.mkDefault true;
|
||||
desktopManager.gnome.enable = true;
|
||||
};
|
||||
udev.packages = with pkgs; [ gnome-settings-daemon ];
|
||||
dbus.enable = true;
|
||||
udisks2.enable = true;
|
||||
};
|
||||
|
||||
services.gnome-autounlock-keyring.enable = cfg.auto-unlock-keyring;
|
||||
|
||||
# Add Home-manager dconf stuff
|
||||
home-manager.sharedModules = mkIf cfg.hm [ ./hm.nix ];
|
||||
|
||||
environment.gnome.excludePackages = (
|
||||
with pkgs;
|
||||
[
|
||||
gnome-photos
|
||||
gnome-tour
|
||||
gnome-connections
|
||||
gnome-calendar
|
||||
epiphany # web browser
|
||||
geary # email reader
|
||||
simple-scan # document scanner
|
||||
totem # video player
|
||||
gnome-terminal
|
||||
gnome-contacts
|
||||
atomix # puzzle game
|
||||
gnome-maps
|
||||
gedit # text editor
|
||||
gnome-music
|
||||
gnome-clocks
|
||||
iagno # go game
|
||||
tali # poker game
|
||||
hitori # sudoku game
|
||||
gnome-notes
|
||||
gnome-weather
|
||||
gnome-software
|
||||
]
|
||||
);
|
||||
|
||||
services.gnome.evolution-data-server.enable = lib.mkForce false;
|
||||
services.gnome.gnome-online-accounts.enable = false;
|
||||
services.gnome.gnome-remote-desktop.enable = false;
|
||||
services.gnome.gnome-user-share.enable = false;
|
||||
services.gnome.rygel.enable = false;
|
||||
services.gnome.tinysparql.enable = false;
|
||||
services.gnome.localsearch.enable = false;
|
||||
|
||||
# Services required for gnome
|
||||
programs.dconf.enable = true;
|
||||
|
||||
# Extra gnome packages
|
||||
environment.systemPackages = with pkgs; [
|
||||
gnome-tweaks
|
||||
gnome-boxes
|
||||
];
|
||||
};
|
||||
}
|
166
common/modules/gnome/hm.nix
Normal file
166
common/modules/gnome/hm.nix
Normal file
|
@ -0,0 +1,166 @@
|
|||
{ lib, pkgs, ... }:
|
||||
|
||||
with lib.hm.gvariant;
|
||||
let
|
||||
inherit (builtins) attrNames map;
|
||||
inherit (lib.attrsets) mapAttrs' nameValuePair;
|
||||
generate_custom_keybindings =
|
||||
binds:
|
||||
{
|
||||
"org/gnome/settings-daemon/plugins/media-keys" = {
|
||||
custom-keybindings = map (
|
||||
name: "/org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/${name}/"
|
||||
) (attrNames binds);
|
||||
};
|
||||
}
|
||||
// mapAttrs' (
|
||||
name: nameValuePair "org/gnome/settings-daemon/plugins/media-keys/custom-keybindings/${name}"
|
||||
) binds;
|
||||
in
|
||||
{
|
||||
xdg.mimeApps.enable = true;
|
||||
xdg.mimeApps.defaultApplications = {
|
||||
"text/plain" = "org.gnome.TextEditor.desktop";
|
||||
"application/pdf" = "org.gnome.Evince.desktop";
|
||||
|
||||
# Firefox
|
||||
"text/html" = "firefox.desktop";
|
||||
"x-scheme-handler/http" = "firefox.desktop";
|
||||
"x-scheme-handler/https" = "firefox.desktop";
|
||||
"x-scheme-handler/chrome" = "firefox.desktop";
|
||||
"application/x-extension-htm" = "firefox.desktop";
|
||||
"application/x-extension-shtml" = "firefox.desktop";
|
||||
"application/xhtml+xml" = "firefox.desktop";
|
||||
"application/x-extension-xhtml" = "firefox.desktop";
|
||||
"application/x-extension-xht" = "firefox.desktop";
|
||||
"application/x-extension-html" = "firefox.desktop";
|
||||
|
||||
# Images
|
||||
"image/bmp" = "org.gnome.Loupe.desktop";
|
||||
"image/gif" = "org.gnome.Loupe.desktop";
|
||||
"image/jpg" = "org.gnome.Loupe.desktop";
|
||||
"image/pjpeg" = "org.gnome.Loupe.desktop";
|
||||
"image/png" = "org.gnome.Loupe.desktop";
|
||||
"image/tiff" = "org.gnome.Loupe.desktop";
|
||||
"image/webp" = "org.gnome.Loupe.desktop";
|
||||
"image/x-bmp" = "org.gnome.Loupe.desktop";
|
||||
"image/x-gray" = "org.gnome.Loupe.desktop";
|
||||
"image/x-icb" = "org.gnome.Loupe.desktop";
|
||||
"image/x-ico" = "org.gnome.Loupe.desktop";
|
||||
"image/x-png" = "org.gnome.Loupe.desktop";
|
||||
"image/x-portable-anymap" = "org.gnome.Loupe.desktop";
|
||||
"image/x-portable-bitmap" = "org.gnome.Loupe.desktop";
|
||||
"image/x-portable-graymap" = "org.gnome.Loupe.desktop";
|
||||
"image/x-portable-pixmap" = "org.gnome.Loupe.desktop";
|
||||
"image/x-xbitmap" = "org.gnome.Loupe.desktop";
|
||||
"image/x-xpixmap" = "org.gnome.Loupe.desktop";
|
||||
"image/x-pcx" = "org.gnome.Loupe.desktop";
|
||||
"image/svg+xml" = "org.gnome.Loupe.desktop";
|
||||
"image/svg+xml-compressed" = "org.gnome.Loupe.desktop";
|
||||
"image/vnd.wap.wbmp" = "org.gnome.Loupe.desktop";
|
||||
"image/x-icns" = "org.gnome.Loupe.desktop";
|
||||
};
|
||||
|
||||
dconf.settings =
|
||||
{
|
||||
|
||||
"org/gnome/shell" = {
|
||||
disable-user-extensions = false;
|
||||
enabled-extensions = with pkgs.gnomeExtensions; [
|
||||
auto-move-windows.extensionUuid
|
||||
];
|
||||
};
|
||||
|
||||
# "org/gnome/shell/extensions/auto-move-windows" = {
|
||||
# application-list = [
|
||||
# "element-desktop.desktop:1"
|
||||
# "discord.desktop:1"
|
||||
# "firefox.desktop:2"
|
||||
# "obsidian.desktop:3"
|
||||
# ];
|
||||
# };
|
||||
|
||||
"org/gnome/desktop/input-sources" = {
|
||||
sources = [
|
||||
(mkTuple [
|
||||
"xkb"
|
||||
"us+altgr-intl"
|
||||
])
|
||||
];
|
||||
xkb-options = [ "terminate:ctrl_alt_bksp" ];
|
||||
};
|
||||
|
||||
"org/gnome/desktop/peripherals/touchpad" = {
|
||||
tap-to-click = true;
|
||||
two-finger-scrolling-enabled = true;
|
||||
};
|
||||
|
||||
"org/gnome/mutter" = {
|
||||
attach-modal-dialogs = true;
|
||||
dynamic-workspaces = false;
|
||||
edge-tiling = true;
|
||||
focus-change-on-pointer-rest = true;
|
||||
workspaces-only-on-primary = true;
|
||||
};
|
||||
|
||||
"org/gnome/mutter/keybindings" = {
|
||||
toggle-tiled-left = [ "<Super>bracketleft" ];
|
||||
toggle-tiled-right = [ "<Super>bracketright" ];
|
||||
};
|
||||
|
||||
"org/gnome/shell/keybindings" = {
|
||||
toggle-overview = [ "<Super>d" ];
|
||||
};
|
||||
|
||||
"org/gnome/desktop/interface" = {
|
||||
color-scheme = "prefer-dark";
|
||||
};
|
||||
|
||||
"org/gnome/desktop/wm/preferences" = {
|
||||
auto-raise = false;
|
||||
num-workspaces = 6;
|
||||
focus-mode = "sloppy";
|
||||
};
|
||||
|
||||
"org/gnome/desktop/wm/keybindings" = {
|
||||
raise-or-lower = [ "<Super>s" ];
|
||||
switch-applications = [ "<Super>Tab" ];
|
||||
switch-applications-backward = [ "<Super>Tab" ];
|
||||
move-to-workspace-1 = [ "<Shift><Super>1" ];
|
||||
move-to-workspace-2 = [ "<Shift><Super>2" ];
|
||||
move-to-workspace-3 = [ "<Shift><Super>3" ];
|
||||
move-to-workspace-4 = [ "<Shift><Super>4" ];
|
||||
move-to-workspace-5 = [ "<Shift><Super>5" ];
|
||||
move-to-workspace-6 = [ "<Shift><Super>6" ];
|
||||
switch-to-workspace-1 = [ "<Super>1" ];
|
||||
switch-to-workspace-2 = [ "<Super>2" ];
|
||||
switch-to-workspace-3 = [ "<Super>3" ];
|
||||
switch-to-workspace-4 = [ "<Super>4" ];
|
||||
switch-to-workspace-5 = [ "<Super>5" ];
|
||||
switch-to-workspace-6 = [ "<Super>6" ];
|
||||
toggle-fullscreen = [ "<Super><Shift>M" ];
|
||||
toggle-maximized = [ "<Super>m" ];
|
||||
close = [ "<Super>Q" ];
|
||||
};
|
||||
|
||||
"org/gnome/tweaks" = {
|
||||
show-extensions-notice = false;
|
||||
};
|
||||
|
||||
"org/gnome/boxes" = {
|
||||
first-run = false;
|
||||
};
|
||||
}
|
||||
// generate_custom_keybindings {
|
||||
"terminal" = {
|
||||
binding = "<Super>Return";
|
||||
command = "${pkgs.kitty}/bin/kitty";
|
||||
name = "Open Terminal";
|
||||
};
|
||||
"firefox" = {
|
||||
binding = "<Super>f";
|
||||
command = "firefox";
|
||||
name = "Open Firefox";
|
||||
};
|
||||
};
|
||||
}
|
89
common/modules/meta.nix
Normal file
89
common/modules/meta.nix
Normal file
|
@ -0,0 +1,89 @@
|
|||
{ lib, config, ... }:
|
||||
with lib;
|
||||
let
|
||||
exposesOpts = {
|
||||
options = {
|
||||
domain = mkOption {
|
||||
type = types.str;
|
||||
example = "<name>.example.com";
|
||||
description = lib.mdDoc ''
|
||||
The domain under which this service should be available
|
||||
'';
|
||||
};
|
||||
port = mkOption {
|
||||
type = types.int;
|
||||
default = 80;
|
||||
example = 4242;
|
||||
description = lib.mdDoc ''
|
||||
The port under which the service runs on the host
|
||||
'';
|
||||
};
|
||||
};
|
||||
};
|
||||
in {
|
||||
options.meta = {
|
||||
exposes = mkOption {
|
||||
type = with types; attrsOf (submodule exposesOpts);
|
||||
default = { };
|
||||
description = ''
|
||||
Exposed services
|
||||
'';
|
||||
};
|
||||
|
||||
ipv4 = mkOption {
|
||||
type = types.nullOr types.str;
|
||||
default = null;
|
||||
description = lib.mdDoc ''
|
||||
Host's IPv4 Address
|
||||
'';
|
||||
};
|
||||
|
||||
ipv6 = mkOption {
|
||||
type = types.nullOr types.str;
|
||||
default = null;
|
||||
description = lib.mdDoc ''
|
||||
Host's IPv6 address
|
||||
'';
|
||||
};
|
||||
|
||||
mac = mkOption {
|
||||
type = types.nullOr types.str;
|
||||
default = null;
|
||||
description = lib.mdDoc ''
|
||||
Own MAC Address
|
||||
'';
|
||||
};
|
||||
|
||||
isLaptop = mkOption {
|
||||
type = types.bool;
|
||||
default = false;
|
||||
description = lib.mdDoc ''
|
||||
Is this host a Laptop (i.e. no DNS entries should be made).
|
||||
'';
|
||||
};
|
||||
|
||||
realm = mkOption {
|
||||
readOnly = true;
|
||||
type = types.nullOr (types.enum [ "thalassa" "hades" "olympus" ]);
|
||||
default = config.networking.domain;
|
||||
defaultText = literalExpression "config.network.domain";
|
||||
};
|
||||
};
|
||||
|
||||
config = {
|
||||
# TODO: Open Firewall
|
||||
|
||||
assertions = [
|
||||
# {
|
||||
# assertion = config.meta.mac != null;
|
||||
# message =
|
||||
# "${config.networking.fqdnOrHostName} is missing a mac address";
|
||||
# }
|
||||
# {
|
||||
# assertion = !config.meta.isLaptop -> config.meta.ipv4 != null;
|
||||
# message =
|
||||
# "${config.networking.fqdnOrHostName} needs ipv4 address set as it is not a laptop";
|
||||
# }
|
||||
];
|
||||
};
|
||||
}
|
32
common/modules/nginx.nix
Normal file
32
common/modules/nginx.nix
Normal file
|
@ -0,0 +1,32 @@
|
|||
{ lib, hosts, config, ... }:
|
||||
with lib;
|
||||
let cfg = config.services.v.nginx;
|
||||
in {
|
||||
options.services.v.nginx.autoExpose =
|
||||
mkEnableOption "generate vhosts";
|
||||
|
||||
config =
|
||||
let
|
||||
|
||||
proxy = url: {
|
||||
enableACME = true;
|
||||
forceSSL = true;
|
||||
locations."/" = {
|
||||
proxyPass = url;
|
||||
proxyWebsockets = true;
|
||||
};
|
||||
};
|
||||
|
||||
hosts' =
|
||||
filter (hasAttr "exposes") (attrValues hosts.${config.networking.domain});
|
||||
exposes = { ip, exposes, ... }:
|
||||
map ({ domain, port ? 80 }: { inherit ip domain port; }) (attrValues exposes);
|
||||
mkVhost = { ip, domain, port }: {
|
||||
"${domain}" = proxy "http://${ip}:${toString port}";
|
||||
};
|
||||
vhosts = foldr (el: acc: acc // mkVhost el) { } (concatMap exposes hosts');
|
||||
in
|
||||
mkIf cfg.autoExpose {
|
||||
services.nginx.virtualHosts = vhosts;
|
||||
};
|
||||
}
|
328
common/modules/unpackerr.nix
Normal file
328
common/modules/unpackerr.nix
Normal file
|
@ -0,0 +1,328 @@
|
|||
{ config, pkgs, lib, ... }:
|
||||
with lib;
|
||||
let
|
||||
cfg = config.services.unpackerr;
|
||||
mkStarrOptions = { name, url }: {
|
||||
url = mkOption {
|
||||
type = types.str;
|
||||
default = "";
|
||||
example = "${url}";
|
||||
description = ''
|
||||
The URL to access ${name}
|
||||
'';
|
||||
};
|
||||
apiKey = mkOption {
|
||||
type = types.str;
|
||||
default = "";
|
||||
description = ''
|
||||
The API key for accessing ${name}
|
||||
'';
|
||||
};
|
||||
paths = mkOption {
|
||||
type = types.str;
|
||||
default = "";
|
||||
example = "/downloads,/moreDownloads";
|
||||
description = ''
|
||||
List of paths where content is downloaded for ${name}
|
||||
'';
|
||||
};
|
||||
protocols = mkOption {
|
||||
type = types.str;
|
||||
default = "torrent";
|
||||
example = "torrent,usenet";
|
||||
description = ''
|
||||
Protocols to process
|
||||
'';
|
||||
};
|
||||
timeout = mkOption {
|
||||
type = types.str;
|
||||
default = "10s";
|
||||
description = ''
|
||||
How long to wait for ${name} to respond
|
||||
'';
|
||||
};
|
||||
deleteOrginal = mkOption {
|
||||
type = types.bool;
|
||||
default = false;
|
||||
description = ''
|
||||
Delete archives after import?
|
||||
Recommend not setting this to true
|
||||
'';
|
||||
};
|
||||
deleteDelay = mkOption {
|
||||
type = types.str;
|
||||
default = "5m";
|
||||
description = ''
|
||||
Extracts are deleted this long after import. `-1` to disable.
|
||||
'';
|
||||
};
|
||||
};
|
||||
in
|
||||
{
|
||||
options.services.unpackerr = {
|
||||
enable = mkEnableOption "unpackerr";
|
||||
|
||||
user = mkOption {
|
||||
default = "unpackerr";
|
||||
type = types.str;
|
||||
description = ''
|
||||
User account under which unpackerr runs.
|
||||
'';
|
||||
};
|
||||
|
||||
group = mkOption {
|
||||
type = types.str;
|
||||
default = "unpackerr";
|
||||
description = ''
|
||||
Group under which unpackerr runs.
|
||||
'';
|
||||
};
|
||||
|
||||
package = mkOption {
|
||||
type = types.package;
|
||||
default = pkgs.unpackerr;
|
||||
defaultText = "pkgs.unpackerr";
|
||||
description = ''
|
||||
The unpackerr package to use.
|
||||
'';
|
||||
};
|
||||
|
||||
debug = mkOption {
|
||||
type = types.bool;
|
||||
default = false;
|
||||
description = ''
|
||||
Turns on more logs.
|
||||
'';
|
||||
};
|
||||
|
||||
interval = mkOption {
|
||||
type = types.str;
|
||||
default = "2m";
|
||||
description = ''
|
||||
How often apps are polled, recommended 1m to 5m
|
||||
'';
|
||||
};
|
||||
|
||||
startDelay = mkOption {
|
||||
type = types.str;
|
||||
default = "1m";
|
||||
description = ''
|
||||
Files are queued at least this long before extraction
|
||||
'';
|
||||
};
|
||||
|
||||
retryDelay = mkOption {
|
||||
type = types.str;
|
||||
default = "5m";
|
||||
description = ''
|
||||
Failed extractions are retried after at least this long
|
||||
'';
|
||||
};
|
||||
|
||||
maxRetries = mkOption {
|
||||
type = types.int;
|
||||
default = 3;
|
||||
description = ''
|
||||
Times to retry failed extractions. `0` = unlimited.
|
||||
'';
|
||||
};
|
||||
|
||||
parallel = mkOption {
|
||||
type = types.int;
|
||||
default = 1;
|
||||
description = ''
|
||||
Concurrent extractions, 1 is recommended.
|
||||
'';
|
||||
};
|
||||
|
||||
fileMode = mkOption {
|
||||
type = types.str;
|
||||
default = "0644";
|
||||
description = ''
|
||||
Extracted files are written with this mode
|
||||
'';
|
||||
};
|
||||
|
||||
dirMode = mkOption {
|
||||
type = types.str;
|
||||
default = "0755";
|
||||
description = ''
|
||||
Extracted folders are written with this mode
|
||||
'';
|
||||
};
|
||||
|
||||
sonarr = mkStarrOptions {
|
||||
name = "Sonarr";
|
||||
url = "http://localhost:8989";
|
||||
};
|
||||
|
||||
radarr = mkStarrOptions {
|
||||
name = "Radarr";
|
||||
url = "http://localhost:7878";
|
||||
};
|
||||
|
||||
lidarr = mkStarrOptions {
|
||||
name = "Lidarr";
|
||||
url = "http://localhost:8686";
|
||||
};
|
||||
|
||||
readarr = mkStarrOptions {
|
||||
name = "Readarr";
|
||||
url = "http://localhost:8787";
|
||||
};
|
||||
|
||||
folder = {
|
||||
path = mkOption {
|
||||
type = types.str;
|
||||
default = "";
|
||||
description = ''
|
||||
folder path, not for Starr apps.
|
||||
'';
|
||||
};
|
||||
extractPath = mkOption {
|
||||
type = types.str;
|
||||
default = "";
|
||||
description = ''
|
||||
Where to extract to, Defaults to <option>services.unpackerr.folder.path</option>.
|
||||
'';
|
||||
};
|
||||
deleteAfter = mkOption {
|
||||
type = types.str;
|
||||
default = "";
|
||||
example = "10m";
|
||||
description = ''
|
||||
Delete extracted files and/or archives after this duration, `0` to disable.
|
||||
'';
|
||||
};
|
||||
deleteOrginal = mkOption {
|
||||
type = types.bool;
|
||||
default = false;
|
||||
description = ''
|
||||
Delete archives after extraction
|
||||
'';
|
||||
};
|
||||
deleteFiles = mkOption {
|
||||
type = types.bool;
|
||||
default = false;
|
||||
description = ''
|
||||
Delete extracted files after successful extraction
|
||||
'';
|
||||
};
|
||||
moveBack = mkOption {
|
||||
type = types.bool;
|
||||
default = false;
|
||||
description = ''
|
||||
Move extracted items back into original folder
|
||||
'';
|
||||
};
|
||||
};
|
||||
|
||||
extraConfig = mkOption {
|
||||
type = types.attrs;
|
||||
default = { };
|
||||
description = ''
|
||||
Extra environment variables
|
||||
'';
|
||||
example = { UN_WEBHOOK_0_URL = "http://example.com"; };
|
||||
};
|
||||
|
||||
environmentFile = mkOption {
|
||||
type = types.nullOr types.path;
|
||||
default = null;
|
||||
description = lib.mdDoc ''
|
||||
Environment file (see `systemd.exec(5)`
|
||||
"EnvironmentFile=" section for the syntax) to define variables for unpackerr.
|
||||
This option can be used to safely include secret keys into the unpackerr configuration.
|
||||
'';
|
||||
};
|
||||
};
|
||||
|
||||
config = mkIf cfg.enable {
|
||||
# Create group if set to default
|
||||
users.groups = mkIf (cfg.group == "unpackerr") { unpackerr = { }; };
|
||||
|
||||
# Create user if set to default
|
||||
users.users = mkIf (cfg.user == "unpackerr") {
|
||||
unpackerr = {
|
||||
inherit (cfg) group;
|
||||
shell = pkgs.bashInteractive;
|
||||
createHome = false;
|
||||
description = "unpackerr Daemon user";
|
||||
isSystemUser = true;
|
||||
};
|
||||
};
|
||||
|
||||
# The actual service
|
||||
systemd.services.unpackerr = {
|
||||
wantedBy = [ "multi-user.target" ];
|
||||
after = [ "network.target" ];
|
||||
description = "unpackerr system service";
|
||||
# Filter out all unset variables else unpackerr complains
|
||||
environment = filterAttrs (_n: v: stringLength v > 0)
|
||||
{
|
||||
# General options
|
||||
UN_DEBUG = "${toString cfg.debug}";
|
||||
UN_INTERVAL = "${cfg.interval}";
|
||||
UN_START_DELAY = "${cfg.startDelay}";
|
||||
UN_RETRY_DELAY = "${cfg.retryDelay}";
|
||||
UN_MAX_RETRIES = "${toString cfg.maxRetries}";
|
||||
UN_PARALLEL = "${toString cfg.parallel}";
|
||||
UN_FILE_MODE = "${cfg.fileMode}";
|
||||
UN_DIR_MODE = "${cfg.dirMode}";
|
||||
|
||||
# Sonarr
|
||||
UN_SONARR_0_URL = "${cfg.sonarr.url}";
|
||||
UN_SONARR_0_API_KEY = "${cfg.sonarr.apiKey}";
|
||||
UN_SONARR_0_PATHS_0 = "${cfg.sonarr.paths}";
|
||||
UN_SONARR_0_PROTOCOLS = "${cfg.sonarr.protocols}";
|
||||
UN_SONARR_0_TIMEOUT = "${cfg.sonarr.timeout}";
|
||||
UN_SONARR_0_DELETE_ORIG = "${toString cfg.sonarr.deleteOrginal}";
|
||||
UN_SONARR_0_DELETE_DELAY = "${cfg.sonarr.deleteDelay}";
|
||||
|
||||
# Radarr
|
||||
UN_RADARR_0_URL = "${cfg.radarr.url}";
|
||||
UN_RADARR_0_API_KEY = "${cfg.radarr.apiKey}";
|
||||
UN_RADARR_0_PATHS_0 = "${cfg.radarr.paths}";
|
||||
UN_RADARR_0_PROTOCOLS = "${cfg.radarr.protocols}";
|
||||
UN_RADARR_0_TIMEOUT = "${cfg.radarr.timeout}";
|
||||
UN_RADARR_0_DELETE_ORIG = "${toString cfg.radarr.deleteOrginal}";
|
||||
UN_RADARR_0_DELETE_DELAY = "${cfg.radarr.deleteDelay}";
|
||||
|
||||
# Lidarr
|
||||
UN_LIDARR_0_URL = "${cfg.lidarr.url}";
|
||||
UN_LIDARR_0_API_KEY = "${cfg.lidarr.apiKey}";
|
||||
UN_LIDARR_0_PATHS_0 = "${cfg.lidarr.paths}";
|
||||
UN_LIDARR_0_PROTOCOLS = "${cfg.lidarr.protocols}";
|
||||
UN_LIDARR_0_TIMEOUT = "${cfg.lidarr.timeout}";
|
||||
UN_LIDARR_0_DELETE_ORIG = "${toString cfg.lidarr.deleteOrginal}";
|
||||
UN_LIDARR_0_DELETE_DELAY = "${cfg.lidarr.deleteDelay}";
|
||||
|
||||
# Readarr
|
||||
UN_READARR_0_URL = "${cfg.readarr.url}";
|
||||
UN_READARR_0_API_KEY = "${cfg.readarr.apiKey}";
|
||||
UN_READARR_0_PATHS_0 = "${cfg.readarr.paths}";
|
||||
UN_READARR_0_PROTOCOLS = "${cfg.readarr.protocols}";
|
||||
UN_READARR_0_TIMEOUT = "${cfg.readarr.timeout}";
|
||||
UN_READARR_0_DELETE_ORIG = "${toString cfg.readarr.deleteOrginal}";
|
||||
UN_READARR_0_DELETE_DELAY = "${cfg.readarr.deleteDelay}";
|
||||
|
||||
# Folder
|
||||
UN_FOLDER_0_PATH = "${cfg.folder.path}";
|
||||
UN_FOLDER_0_EXTRACT_PATH = "${cfg.folder.extractPath}";
|
||||
UN_FOLDER_0_DELETE_AFTER = "${cfg.folder.deleteAfter}";
|
||||
UN_FOLDER_0_DELETE_ORIGINAL = "${toString cfg.folder.deleteOrginal}";
|
||||
UN_FOLDER_0_DELETE_FILES = "${toString cfg.folder.deleteFiles}";
|
||||
UN_FOLDER_0_MOVE_BACK = "${toString cfg.folder.moveBack}";
|
||||
} // cfg.extraConfig;
|
||||
serviceConfig = {
|
||||
User = cfg.user;
|
||||
Group = cfg.group;
|
||||
Type = "simple";
|
||||
Restart = "on-failure";
|
||||
ExecStart = "${cfg.package}/bin/unpackerr";
|
||||
} // optionalAttrs (cfg.environmentFile != null) {
|
||||
EnvironmentFile = cfg.environmentFile;
|
||||
};
|
||||
};
|
||||
};
|
||||
}
|
125
common/modules/vault.nix
Normal file
125
common/modules/vault.nix
Normal file
|
@ -0,0 +1,125 @@
|
|||
{ config, pkgs, lib, flat_hosts, inputs, ... }:
|
||||
with lib;
|
||||
let
|
||||
cfg = config.services.v.vault;
|
||||
hostIP = config.meta.ipv4;
|
||||
|
||||
# Find all vault hosts that do not have the same IP as the current host
|
||||
vault_hosts =
|
||||
filter ({ tags ? [ ], ip ? "", ... }: (elem "vault" tags) && (ip != hostIP))
|
||||
flat_hosts;
|
||||
cluster_config = concatStrings (map
|
||||
({ ip, ... }: ''
|
||||
retry_join {
|
||||
leader_api_addr = "http://${ip}:${toString cfg.port}"
|
||||
}
|
||||
'')
|
||||
vault_hosts);
|
||||
in
|
||||
{
|
||||
options.services.v.vault = {
|
||||
enable = mkEnableOption "v's vault";
|
||||
|
||||
node_id = mkOption {
|
||||
type = types.str;
|
||||
description = lib.mdDoc ''
|
||||
The cluster node id of this node
|
||||
'';
|
||||
};
|
||||
|
||||
openFirewall = mkOption {
|
||||
type = types.bool;
|
||||
default = false;
|
||||
description = lib.mdDoc ''
|
||||
Whether to open port `port` and `clusterPort` in the firewall for vault
|
||||
'';
|
||||
};
|
||||
|
||||
port = mkOption {
|
||||
type = types.int;
|
||||
default = 8200;
|
||||
description = lib.mdDoc ''
|
||||
The port vault listens on
|
||||
**note:** this has to be the same for all nodes in a cluster
|
||||
'';
|
||||
};
|
||||
|
||||
clusterPort = mkOption {
|
||||
type = types.int;
|
||||
default = 8201;
|
||||
description = lib.mdDoc ''
|
||||
The cluster port vault listens on
|
||||
**note:** this has to be the same for all nodes in a cluster
|
||||
'';
|
||||
};
|
||||
|
||||
autoUnseal = mkOption {
|
||||
type = types.bool;
|
||||
default = false;
|
||||
description = lib.mdDoc ''
|
||||
Whether to auto-unseal this vault
|
||||
'';
|
||||
};
|
||||
|
||||
autoUnsealKeysFile = mkOption {
|
||||
type = types.str;
|
||||
default = null;
|
||||
example = "/var/lib/vault-unseal/keys.json";
|
||||
description = lib.mdDoc ''
|
||||
auto unseal keys to use, has to be a json file with the following structure
|
||||
```json
|
||||
{
|
||||
keys = [ key_1, ..., key_n ]
|
||||
}
|
||||
```
|
||||
'';
|
||||
};
|
||||
};
|
||||
|
||||
config = mkIf cfg.enable {
|
||||
assertions = [{
|
||||
assertion = cfg.autoUnseal -> (cfg.autoUnsealKeysFile != null);
|
||||
message = "If autoUnseal is enabled, a token path is required!";
|
||||
}];
|
||||
|
||||
networking.firewall.allowedTCPPorts =
|
||||
mkIf cfg.openFirewall [ cfg.port cfg.clusterPort ];
|
||||
|
||||
services.vault = {
|
||||
enable = true;
|
||||
# bin version includes the UI
|
||||
package = pkgs.vault-bin;
|
||||
address = "0.0.0.0:${toString cfg.port}";
|
||||
storageBackend = "raft";
|
||||
storagePath = "/var/lib/vault-raft";
|
||||
storageConfig = ''
|
||||
node_id = "${cfg.node_id}"
|
||||
'' + cluster_config;
|
||||
extraConfig = ''
|
||||
ui = true
|
||||
disable_mlock = true
|
||||
api_addr = "http://${hostIP}:${toString cfg.port}"
|
||||
cluster_addr = "http://${hostIP}:${toString cfg.clusterPort}"
|
||||
'';
|
||||
};
|
||||
|
||||
systemd.services.vault-unseal = mkIf cfg.autoUnseal {
|
||||
description = "Vault unseal service";
|
||||
wantedBy = [ "multi-user.target" ];
|
||||
after = [ "vault.service" ];
|
||||
environment = {
|
||||
VAULT_ADDR = "http://localhost:${toString cfg.port}";
|
||||
VAULT_KEY_FILE = cfg.autoUnsealKeysFile;
|
||||
};
|
||||
serviceConfig = {
|
||||
User = "vault";
|
||||
Group = "vault";
|
||||
Type = "simple";
|
||||
Restart = "on-failure";
|
||||
ExecStart = "${
|
||||
inputs.vault-unseal.packages.${pkgs.system}.default
|
||||
}/bin/vault-unseal";
|
||||
};
|
||||
};
|
||||
};
|
||||
}
|
85
common/users/default.nix
Normal file
85
common/users/default.nix
Normal file
|
@ -0,0 +1,85 @@
|
|||
{
|
||||
config,
|
||||
pkgs,
|
||||
lib,
|
||||
inputs,
|
||||
...
|
||||
}:
|
||||
{
|
||||
imports = [
|
||||
./laura.nix
|
||||
./vivian.nix
|
||||
./jonathan.nix
|
||||
];
|
||||
programs = {
|
||||
|
||||
# Setup ZSH to use grml config
|
||||
zsh = {
|
||||
enable = true;
|
||||
enableCompletion = true;
|
||||
syntaxHighlighting.enable = true;
|
||||
autosuggestions.enable = true;
|
||||
interactiveShellInit = ''
|
||||
source "${pkgs.grml-zsh-config}/etc/zsh/zshrc"
|
||||
export FZF_DEFAULT_COMMAND="${pkgs.ripgrep}/bin/rg --files --follow"
|
||||
export FZF_CTRL_T_COMMAND="$FZF_DEFAULT_COMMAND"
|
||||
export FZF_CTRL_R_COMMAND="$FZF_DEFAULT_COMMAND"
|
||||
eval "$(${pkgs.zoxide}/bin/zoxide init zsh)"
|
||||
eval "$(${pkgs.fzf}/bin/fzf --zsh)"
|
||||
|
||||
export TEMPDIRS="$HOME/tmp"
|
||||
'';
|
||||
# otherwise it'll override the grml prompt
|
||||
promptInit = lib.mkDefault "";
|
||||
};
|
||||
|
||||
# Install Neovim and set it as alias for vi(m)
|
||||
neovim = {
|
||||
enable = true;
|
||||
viAlias = true;
|
||||
vimAlias = true;
|
||||
defaultEditor = true;
|
||||
};
|
||||
};
|
||||
|
||||
environment.pathsToLink = [ "/share/zsh" ];
|
||||
|
||||
# Disable sudo prompt for `wheel` users.
|
||||
security.sudo.wheelNeedsPassword = lib.mkDefault false;
|
||||
|
||||
# Configure the root account
|
||||
users.extraUsers.root = {
|
||||
# Allow my SSH keys for logging in as root.
|
||||
openssh.authorizedKeys.keys = config.users.extraUsers.vivian.openssh.authorizedKeys.keys;
|
||||
# Also use zsh for root
|
||||
shell = pkgs.zsh;
|
||||
};
|
||||
|
||||
# Setup packages available everywhere
|
||||
environment.systemPackages = with pkgs; [
|
||||
file
|
||||
fzf
|
||||
git
|
||||
htop
|
||||
ncdu
|
||||
psmisc
|
||||
helix
|
||||
ripgrep
|
||||
rsync
|
||||
zoxide
|
||||
|
||||
# Terminfo
|
||||
kitty.terminfo
|
||||
];
|
||||
|
||||
programs.tmux = {
|
||||
enable = true;
|
||||
withUtempter = true;
|
||||
terminal = "tmux-256color";
|
||||
secureSocket = false;
|
||||
extraConfig = ''
|
||||
set -g mouse on
|
||||
setw -g mouse on
|
||||
'';
|
||||
};
|
||||
}
|
13
common/users/jonathan.nix
Normal file
13
common/users/jonathan.nix
Normal file
|
@ -0,0 +1,13 @@
|
|||
{ pkgs, ... }: {
|
||||
users.extraUsers.jonathan = {
|
||||
isNormalUser = true;
|
||||
shell = pkgs.zsh;
|
||||
|
||||
openssh.authorizedKeys.keys = [
|
||||
"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIOAXOTU6E06zjK/zkzlSPhTG35PoNRYgTCStEPUYyjeE jonathan@kili"
|
||||
];
|
||||
|
||||
extraGroups = [ ];
|
||||
};
|
||||
}
|
||||
|
16
common/users/laura.nix
Normal file
16
common/users/laura.nix
Normal file
|
@ -0,0 +1,16 @@
|
|||
{ pkgs, ... }:
|
||||
{
|
||||
users.extraUsers.laura = {
|
||||
isNormalUser = true;
|
||||
shell = pkgs.zsh;
|
||||
|
||||
openssh.authorizedKeys.keys = [
|
||||
"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIBIlFUUXbwOkhNUjoA6zueTdRuaylgpgFqSe/xWGK9zb laura@zmeura"
|
||||
"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIBVkk9/80askWhInQk03JMntF6SThAYkFZNm+lIGt4E7 laura@mura"
|
||||
"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIFxoq/J/0ad3AOK/CxPvsIGQjRUzURSuNAtmNOqUmKcr laura@cherry"
|
||||
"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIGMKbP2/vNTybDoEwdFaQvAI1zCVpdTBN25avfeCV0jP laura@bosbes"
|
||||
];
|
||||
|
||||
extraGroups = [ ];
|
||||
};
|
||||
}
|
45
common/users/vivian.nix
Normal file
45
common/users/vivian.nix
Normal file
|
@ -0,0 +1,45 @@
|
|||
{ pkgs, ... }: {
|
||||
# The block that specifies my user account.
|
||||
users.extraUsers.vivian = {
|
||||
# This account is intended for a non-system user.
|
||||
isNormalUser = true;
|
||||
|
||||
# My default shell
|
||||
shell = pkgs.zsh;
|
||||
|
||||
# My SSH keys.
|
||||
openssh.authorizedKeys.keys = [
|
||||
"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAICBhJAp7NWlHgwDYd2z6VNROy5RkeZHRINFLsFvwT4b3 vivian@bastion"
|
||||
"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIMMbdjysLnmwJD5Fs/SjBPstdIQNUxy8zFHP0GlhHMJB vivian@bastion"
|
||||
"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIIfooZjMWXvXZu1ReOEACDZ0TMb2WJRBSOLlWE8y6fUh vivian@aoife"
|
||||
"sk-ssh-ed25519@openssh.com AAAAGnNrLXNzaC1lZDI1NTE5QG9wZW5zc2guY29tAAAAIM3TqXaApX2JZsgfZd7PKVFMecDgqTHKibpSzgdXNpYAAAAABHNzaDo= solov2-le"
|
||||
"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAID+HbsgJTQS6pvnMEI5NPKjIf78z+9A7CTIt3abi+PS6 vivian@eevee"
|
||||
"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIMypFe7cSMgvEI1sdxRtdC+AalXa0ryB/zkO9KmQGOxK vivian@nothing2"
|
||||
];
|
||||
|
||||
# Make me admin
|
||||
extraGroups =
|
||||
[ "systemd-journal" "wheel" "networkmanager" "libvirtd" "dialout" ];
|
||||
};
|
||||
|
||||
home-manager.users.vivian = {
|
||||
programs = {
|
||||
home-manager.enable = true;
|
||||
|
||||
v.git.enable = true;
|
||||
|
||||
tmux = {
|
||||
enable = true;
|
||||
shortcut = "b";
|
||||
clock24 = true;
|
||||
};
|
||||
|
||||
bat.enable = true;
|
||||
};
|
||||
home = {
|
||||
username = "vivian";
|
||||
homeDirectory = "/home/vivian";
|
||||
stateVersion = "23.05";
|
||||
};
|
||||
};
|
||||
}
|
1505
flake.lock
generated
Normal file
1505
flake.lock
generated
Normal file
File diff suppressed because it is too large
Load diff
198
flake.nix
Normal file
198
flake.nix
Normal file
|
@ -0,0 +1,198 @@
|
|||
{
|
||||
description = "0x76's infrastructure";
|
||||
|
||||
# For minecraft use:
|
||||
# * https://github.com/Infinidoge/nix-minecraft
|
||||
|
||||
inputs = {
|
||||
nixpkgs.url = "nixpkgs/nixos-unstable";
|
||||
flake-utils-plus.url = "github:gytis-ivaskevicius/flake-utils-plus";
|
||||
nur.url = "github:nix-community/NUR";
|
||||
colmena.url = "github:zhaofengli/colmena";
|
||||
deploy.url = "github:serokell/deploy-rs";
|
||||
vault-secrets.url = "github:serokell/vault-secrets";
|
||||
|
||||
microvm.url = "github:astro/microvm.nix";
|
||||
|
||||
home-manager.url = "github:nix-community/home-manager";
|
||||
home-manager.inputs.nixpkgs.follows = "nixpkgs";
|
||||
|
||||
mailserver.url = "git+https://gitlab.com/simple-nixos-mailserver/nixos-mailserver.git";
|
||||
mailserver.inputs.nixpkgs.follows = "nixpkgs";
|
||||
|
||||
nixvim.url = "github:pta2002/nixvim";
|
||||
|
||||
nixos-generators.url = "github:nix-community/nixos-generators";
|
||||
nixos-generators.inputs.nixpkgs.follows = "nixpkgs";
|
||||
|
||||
nixos-hardware.url = "github:nixos/nixos-hardware";
|
||||
|
||||
lanzaboote.url = "github:nix-community/lanzaboote";
|
||||
lanzaboote.inputs.nixpkgs.follows = "nixpkgs";
|
||||
|
||||
vault-unseal.url = "git+https://git.0x76.dev/v/vault-unseal.git";
|
||||
vault-unseal.inputs.nixpkgs.follows = "nixpkgs";
|
||||
|
||||
gnome-autounlock-keyring.url = "git+https://git.0x76.dev/v/gnome-autounlock-keyring.git";
|
||||
|
||||
t.url = "github:jdonszelmann/t-rs";
|
||||
t.inputs.nixpkgs.follows = "nixpkgs";
|
||||
|
||||
attic.url = "github:zhaofengli/attic";
|
||||
attic.inputs.nixpkgs.follows = "nixpkgs";
|
||||
|
||||
catppuccin.url = "github:catppuccin/nix";
|
||||
|
||||
essentials.url = "github:jdonszelmann/essentials";
|
||||
essentials.inputs.nixpkgs.follows = "nixpkgs";
|
||||
|
||||
autostart.url = "github:Zocker1999NET/home-manager-xdg-autostart";
|
||||
|
||||
hyprland-qtutils.url = "github:hyprwm/hyprland-qtutils";
|
||||
};
|
||||
|
||||
outputs =
|
||||
{
|
||||
self,
|
||||
nixpkgs,
|
||||
flake-utils-plus,
|
||||
nur,
|
||||
attic,
|
||||
deploy,
|
||||
home-manager,
|
||||
gnome-autounlock-keyring,
|
||||
lanzaboote,
|
||||
t,
|
||||
catppuccin,
|
||||
...
|
||||
}@inputs:
|
||||
let
|
||||
pkgs = self.pkgs.x86_64-linux.nixpkgs;
|
||||
apply-local = pkgs.writeShellScriptBin "apply-local" ''
|
||||
nh os switch --ask
|
||||
'';
|
||||
in
|
||||
flake-utils-plus.lib.mkFlake {
|
||||
# `self` and `inputs` arguments are required
|
||||
inherit self inputs;
|
||||
|
||||
# Supported systems, used for packages, apps, devShell and multiple other definitions. Defaults to `flake-utils.lib.defaultSystems`.
|
||||
supportedSystems = [ "x86_64-linux" ];
|
||||
|
||||
# Channels config
|
||||
channelsConfig = {
|
||||
allowUnfree = true;
|
||||
permittedInsecurePackages = [ "electron" ];
|
||||
};
|
||||
sharedOverlays = [
|
||||
(import ./pkgs)
|
||||
nur.overlays.default
|
||||
];
|
||||
|
||||
# host defaults
|
||||
hostDefaults = {
|
||||
system = "x86_64-linux";
|
||||
modules = [
|
||||
home-manager.nixosModules.home-manager
|
||||
gnome-autounlock-keyring.nixosModules.default
|
||||
catppuccin.nixosModules.catppuccin
|
||||
./common
|
||||
];
|
||||
|
||||
specialArgs = {
|
||||
inherit self inputs home-manager;
|
||||
};
|
||||
};
|
||||
|
||||
# hosts
|
||||
hosts = {
|
||||
"olympus.bastion" = {
|
||||
modules = [
|
||||
./common/generic-vm.nix
|
||||
./hosts/olympus/bastion
|
||||
];
|
||||
};
|
||||
|
||||
aoife = {
|
||||
modules = [
|
||||
lanzaboote.nixosModules.lanzaboote
|
||||
./common/desktop
|
||||
./hosts/thalassa/aoife
|
||||
];
|
||||
};
|
||||
|
||||
eevee = {
|
||||
modules = [
|
||||
./common/desktop
|
||||
./hosts/olympus/eevee
|
||||
];
|
||||
};
|
||||
};
|
||||
|
||||
# deploy-rs
|
||||
deploy = {
|
||||
user = "root";
|
||||
nodes = {
|
||||
"bastion-olympus" = {
|
||||
hostname = "bastion.olympus";
|
||||
fastConnection = true;
|
||||
remoteBuild = true;
|
||||
profiles = {
|
||||
system = {
|
||||
path = deploy.lib.x86_64-linux.activate.nixos self.nixosConfigurations."olympus.bastion";
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
aoife = {
|
||||
remoteBuild = true;
|
||||
fastConnection = true;
|
||||
hostname = "aoife";
|
||||
profiles.system.path = deploy.lib.x86_64-linux.activate.nixos self.nixosConfigurations.aoife;
|
||||
};
|
||||
|
||||
eevee = {
|
||||
fastConnection = true;
|
||||
hostname = "eevee.olympus";
|
||||
profiles.system.path = deploy.lib.x86_64-linux.activate.nixos self.nixosConfigurations.eevee;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
# Outputs
|
||||
outputsBuilder = channels: {
|
||||
devShells.default = channels.nixpkgs.mkShell {
|
||||
name = "devShell";
|
||||
VAULT_ADDR = "http://vault.olympus:8200/";
|
||||
NH_FLAKE = "/home/vivian/src/infrastructure-new";
|
||||
packages = with pkgs; [
|
||||
# attic.packages.${system}.attic
|
||||
apply-local
|
||||
deploy.packages.${system}.deploy-rs
|
||||
deadnix
|
||||
statix
|
||||
# vault
|
||||
yamllint
|
||||
jq
|
||||
fup-repl
|
||||
nh
|
||||
nixfmt-rfc-style
|
||||
];
|
||||
};
|
||||
};
|
||||
|
||||
# Checks
|
||||
checks = builtins.mapAttrs (system: deployLib: deployLib.deployChecks self.deploy) deploy.lib // {
|
||||
x86_64-linux.mac = pkgs.stdenvNoCC.mkDerivation {
|
||||
name = "mac check";
|
||||
src = self;
|
||||
dontBuild = true;
|
||||
doCheck = true;
|
||||
checkPhase = ''
|
||||
echo "Hello World"
|
||||
'';
|
||||
installPhase = "mkdir $out";
|
||||
};
|
||||
};
|
||||
};
|
||||
}
|
12
hosts/olympus/bastion/containers/common.nix
Normal file
12
hosts/olympus/bastion/containers/common.nix
Normal file
|
@ -0,0 +1,12 @@
|
|||
# common container config
|
||||
{ lib, ... }: {
|
||||
imports = [
|
||||
../../../../common
|
||||
];
|
||||
# Workaround for bug https://github.com/NixOS/nixpkgs/issues/162686
|
||||
networking.useHostResolvConf = lib.mkForce false;
|
||||
services.resolved.enable = true;
|
||||
|
||||
system.stateVersion = lib.mkDefault "24.05";
|
||||
}
|
||||
|
82
hosts/olympus/bastion/containers/default.nix
Normal file
82
hosts/olympus/bastion/containers/default.nix
Normal file
|
@ -0,0 +1,82 @@
|
|||
{
|
||||
config,
|
||||
lib,
|
||||
inputs,
|
||||
...
|
||||
}:
|
||||
let
|
||||
hostAddress = "10.42.99.1";
|
||||
hostAddress6 = "fc00::1";
|
||||
in
|
||||
{
|
||||
networking.nat = {
|
||||
enable = true;
|
||||
internalInterfaces = [ "ve-+" ];
|
||||
externalInterface = "ens18";
|
||||
# Lazy IPv6 connectivity for the container
|
||||
enableIPv6 = true;
|
||||
};
|
||||
|
||||
networking.firewall.allowedTCPPorts = [
|
||||
8384
|
||||
22000
|
||||
];
|
||||
networking.firewall.allowedUDPPorts = [
|
||||
22000
|
||||
21027
|
||||
];
|
||||
|
||||
# Containers network is
|
||||
# * 10.42.99.0/24
|
||||
# * fc00:x
|
||||
|
||||
users.groups.backup = {
|
||||
gid = 10000;
|
||||
members = [ "vivian" ];
|
||||
};
|
||||
|
||||
containers = {
|
||||
syncthing = {
|
||||
autoStart = true;
|
||||
inherit hostAddress hostAddress6;
|
||||
localAddress = "10.42.99.2";
|
||||
localAddress6 = "fc00::2";
|
||||
|
||||
forwardPorts = [
|
||||
{
|
||||
containerPort = 8384;
|
||||
hostPort = 8384;
|
||||
protocol = "tcp";
|
||||
}
|
||||
];
|
||||
|
||||
bindMounts = {
|
||||
"/data" = {
|
||||
hostPath = "/mnt/backup";
|
||||
isReadOnly = false;
|
||||
};
|
||||
};
|
||||
|
||||
specialArgs = {
|
||||
inherit inputs;
|
||||
};
|
||||
|
||||
config =
|
||||
{ pkgs, ... }:
|
||||
{
|
||||
users.groups.backup = {
|
||||
gid = 10000;
|
||||
members = [ "syncthing" ];
|
||||
};
|
||||
|
||||
imports = [
|
||||
./common.nix
|
||||
./syncthing.nix
|
||||
inputs.home-manager.nixosModules.home-manager
|
||||
inputs.gnome-autounlock-keyring.nixosModules.default
|
||||
inputs.catppuccin.nixosModules.catppuccin
|
||||
];
|
||||
};
|
||||
};
|
||||
};
|
||||
}
|
7
hosts/olympus/bastion/containers/dns.nix
Normal file
7
hosts/olympus/bastion/containers/dns.nix
Normal file
|
@ -0,0 +1,7 @@
|
|||
{ ... }: {
|
||||
services.v.dns = {
|
||||
enable = true;
|
||||
openFirewall = true;
|
||||
mode = "server";
|
||||
};
|
||||
}
|
8
hosts/olympus/bastion/containers/syncthing.nix
Normal file
8
hosts/olympus/bastion/containers/syncthing.nix
Normal file
|
@ -0,0 +1,8 @@
|
|||
{ ... }:
|
||||
{
|
||||
services.syncthing = {
|
||||
enable = true;
|
||||
openDefaultPorts = true;
|
||||
guiAddress = "0.0.0.0:8384";
|
||||
};
|
||||
}
|
47
hosts/olympus/bastion/default.nix
Normal file
47
hosts/olympus/bastion/default.nix
Normal file
|
@ -0,0 +1,47 @@
|
|||
# Edit this configuration file to define what should be installed on
|
||||
# your system. Help is available in the configuration.nix(5) man page
|
||||
# and in the NixOS manual (accessible by running ‘nixos-help’).
|
||||
|
||||
{ pkgs, ... }: {
|
||||
imports = [
|
||||
# Include the results of the hardware scan.
|
||||
./hardware-configuration.nix
|
||||
./containers
|
||||
./immich.nix
|
||||
# ./vms.nix
|
||||
];
|
||||
|
||||
programs.nix-ld.enable = true;
|
||||
|
||||
meta = {
|
||||
ipv4 = "10.42.42.4";
|
||||
ipv6 = "2001:41f0:9639:1:80f0:7cff:fecb:bd6d";
|
||||
mac = "82:F0:7C:CB:BD:6D";
|
||||
};
|
||||
|
||||
services.scrutiny = {
|
||||
enable = true;
|
||||
openFirewall = true;
|
||||
influxdb.enable = true;
|
||||
collector.enable = false;
|
||||
};
|
||||
|
||||
# Use the GRUB 2 boot loader.
|
||||
boot.loader.grub.enable = true;
|
||||
boot.loader.grub.device = "/dev/sda";
|
||||
|
||||
# This value determines the NixOS release from which the default
|
||||
# settings for stateful data, like file locations and database versions
|
||||
# on your system were taken. It‘s perfectly fine and recommended to leave
|
||||
# this value at the release version of the first install of this system.
|
||||
# Before changing this value read the documentation for this option
|
||||
# (e.g. man configuration.nix or on https://nixos.org/nixos/options.html).
|
||||
system.stateVersion = "22.11"; # Did you read the comment?
|
||||
|
||||
virtualisation.docker.enable = true;
|
||||
|
||||
# Additional packages
|
||||
environment.systemPackages = with pkgs; [ vault ];
|
||||
|
||||
networking.useNetworkd = true;
|
||||
}
|
30
hosts/olympus/bastion/hardware-configuration.nix
Normal file
30
hosts/olympus/bastion/hardware-configuration.nix
Normal file
|
@ -0,0 +1,30 @@
|
|||
# Do not modify this file! It was generated by ‘nixos-generate-config’
|
||||
# and may be overwritten by future invocations. Please make changes
|
||||
# to /etc/nixos/configuration.nix instead.
|
||||
{ modulesPath, ... }:
|
||||
|
||||
{
|
||||
imports = [ (modulesPath + "/profiles/qemu-guest.nix") ];
|
||||
boot = {
|
||||
|
||||
initrd.availableKernelModules =
|
||||
[ "ata_piix" "uhci_hcd" "virtio_pci" "virtio_scsi" "sd_mod" "sr_mod" ];
|
||||
initrd.kernelModules = [ ];
|
||||
kernelModules = [ ];
|
||||
extraModulePackages = [ ];
|
||||
};
|
||||
|
||||
fileSystems."/" = {
|
||||
device = "/dev/disk/by-uuid/e8427097-8545-4924-b033-2659fcf9adca";
|
||||
fsType = "ext4";
|
||||
};
|
||||
|
||||
fileSystems."/mnt/backup" = {
|
||||
device = "/dev/disk/by-uuid/83b1e87f-975f-4150-b673-81087f84f0bb";
|
||||
fsType = "ext4";
|
||||
};
|
||||
|
||||
swapDevices =
|
||||
[{ device = "/dev/disk/by-uuid/63d90b92-cdde-4795-a3ab-9566ae88f43d"; }];
|
||||
|
||||
}
|
78
hosts/olympus/bastion/immich.nix
Normal file
78
hosts/olympus/bastion/immich.nix
Normal file
|
@ -0,0 +1,78 @@
|
|||
{ config, pkgs, ... }:
|
||||
{
|
||||
boot.kernel.sysctl = { "vm.overcommit_memory" = 1; };
|
||||
|
||||
virtualisation.oci-containers.backend = "docker";
|
||||
virtualisation.docker.autoPrune.enable = true;
|
||||
|
||||
|
||||
systemd.services.init-filerun-network-and-files = {
|
||||
description = "Create the network bridge for Immich.";
|
||||
after = [ "network.target" ];
|
||||
wantedBy = [ "multi-user.target" ];
|
||||
|
||||
serviceConfig.Type = "oneshot";
|
||||
script =
|
||||
let
|
||||
dockercli = "${config.virtualisation.docker.package}/bin/docker";
|
||||
in
|
||||
''
|
||||
# immich-net network
|
||||
check=$(${dockercli} network ls | grep "immich-net" || true)
|
||||
if [ -z "$check" ]; then
|
||||
${dockercli} network create immich-net
|
||||
else
|
||||
echo "immich-net already exists in docker"
|
||||
fi
|
||||
'';
|
||||
};
|
||||
|
||||
virtualisation.oci-containers.containers = {
|
||||
immich = {
|
||||
autoStart = true;
|
||||
image = "ghcr.io/imagegenius/immich:latest";
|
||||
volumes = [
|
||||
"/mnt/backup/immich/config:/config"
|
||||
"/mnt/backup/immich/photos:/photos"
|
||||
"/mnt/backup/replicated/photos:/replicated"
|
||||
"/mnt/backup/immich/config/machine-learning:/config/machine-learning"
|
||||
];
|
||||
ports = [ "2283:8080" ];
|
||||
environment = {
|
||||
PUID = "1000";
|
||||
PGID = "1000";
|
||||
TZ = "Europe/Amsterdam"; # Change this to your timezone
|
||||
DB_HOSTNAME = "postgres14";
|
||||
DB_USERNAME = "postgres";
|
||||
DB_PASSWORD = "postgres";
|
||||
DB_DATABASE_NAME = "immich";
|
||||
REDIS_HOSTNAME = "redis";
|
||||
};
|
||||
extraOptions = [
|
||||
"--network=immich-net"
|
||||
"--pull=always"
|
||||
# "--gpus=all"
|
||||
];
|
||||
};
|
||||
|
||||
redis = {
|
||||
autoStart = true;
|
||||
image = "redis";
|
||||
ports = [ "6379:6379" ];
|
||||
extraOptions = [ "--network=immich-net" ];
|
||||
};
|
||||
|
||||
postgres14 = {
|
||||
autoStart = true;
|
||||
image = "tensorchord/pgvecto-rs:pg14-v0.2.0";
|
||||
ports = [ "5432:5432" ];
|
||||
volumes = [ "pgdata:/var/lib/postgresql/data" ];
|
||||
environment = {
|
||||
POSTGRES_USER = "postgres";
|
||||
POSTGRES_PASSWORD = "postgres";
|
||||
POSTGRES_DB = "immich";
|
||||
};
|
||||
extraOptions = [ "--network=immich-net" ];
|
||||
};
|
||||
};
|
||||
}
|
32
hosts/olympus/bastion/vms.nix
Normal file
32
hosts/olympus/bastion/vms.nix
Normal file
|
@ -0,0 +1,32 @@
|
|||
{ config, pkgs, inputs, ... }: {
|
||||
imports = [
|
||||
inputs.microvm.nixosModules.host
|
||||
];
|
||||
|
||||
microvm.vms = {
|
||||
test-vm = {
|
||||
inherit pkgs;
|
||||
|
||||
# (Optional) A set of special arguments to be passed to the MicroVM's NixOS modules.
|
||||
#specialArgs = {};
|
||||
|
||||
# The configuration for the MicroVM.
|
||||
# Multiple definitions will be merged as expected.
|
||||
config = {
|
||||
# It is highly recommended to share the host's nix-store
|
||||
# with the VMs to prevent building huge images.
|
||||
microvm.hypervisor = "crosvm";
|
||||
microvm.shares = [{
|
||||
source = "/nix/store";
|
||||
mountPoint = "/nix/.ro-store";
|
||||
tag = "ro-store";
|
||||
proto = "virtiofs";
|
||||
}];
|
||||
|
||||
# Any other configuration for your MicroVM
|
||||
# [...]
|
||||
};
|
||||
|
||||
};
|
||||
};
|
||||
}
|
53
hosts/olympus/eevee/default.nix
Normal file
53
hosts/olympus/eevee/default.nix
Normal file
|
@ -0,0 +1,53 @@
|
|||
# Edit this configuration file to define what should be installed on
|
||||
# your system. Help is available in the configuration.nix(5) man page
|
||||
# and in the NixOS manual (accessible by running ‘nixos-help’).
|
||||
|
||||
{ pkgs, ... }: {
|
||||
imports = [ ./hardware-configuration.nix ./hardware.nix ];
|
||||
|
||||
# Bootloader.
|
||||
boot = {
|
||||
kernelPackages = pkgs.linuxPackages_latest;
|
||||
initrd = {
|
||||
kernelModules = [ "nvidia" "nvidia_modeset" "nvidia_uvm" "nvidia_drm" ];
|
||||
};
|
||||
loader.systemd-boot.configurationLimit = 5;
|
||||
};
|
||||
|
||||
fileSystems."/".options = [ "compress=zstd" ];
|
||||
|
||||
# Set your time zone.
|
||||
time.timeZone = "Europe/Amsterdam";
|
||||
|
||||
# Select internationalisation properties.
|
||||
i18n.defaultLocale = "en_GB.UTF-8";
|
||||
i18n.extraLocaleSettings = {
|
||||
LC_ADDRESS = "nl_NL.UTF-8";
|
||||
LC_IDENTIFICATION = "nl_NL.UTF-8";
|
||||
LC_MEASUREMENT = "nl_NL.UTF-8";
|
||||
LC_MONETARY = "nl_NL.UTF-8";
|
||||
LC_NAME = "nl_NL.UTF-8";
|
||||
LC_NUMERIC = "nl_NL.UTF-8";
|
||||
LC_PAPER = "nl_NL.UTF-8";
|
||||
LC_TELEPHONE = "nl_NL.UTF-8";
|
||||
LC_TIME = "nl_NL.UTF-8";
|
||||
};
|
||||
|
||||
# Enable CUPS to print documents.
|
||||
services.printing.enable = true;
|
||||
|
||||
environment.systemPackages = with pkgs; [ wireguard-tools ];
|
||||
|
||||
environment.sessionVariables.NIXOS_OZONE_WL = "1";
|
||||
|
||||
home-manager = {
|
||||
users.vivian = import ./home;
|
||||
};
|
||||
# This value determines the NixOS release from which the default
|
||||
# settings for stateful data, like file locations and database versions
|
||||
# on your system were taken. It‘s perfectly fine and recommended to leave
|
||||
# this value at the release version of the first install of this system.
|
||||
# Before changing this value read the documentation for this option
|
||||
# (e.g. man configuration.nix or on https://nixos.org/nixos/options.html).
|
||||
system.stateVersion = "23.05"; # Did you read the comment?
|
||||
}
|
42
hosts/olympus/eevee/hardware-configuration.nix
Normal file
42
hosts/olympus/eevee/hardware-configuration.nix
Normal file
|
@ -0,0 +1,42 @@
|
|||
# Do not modify this file! It was generated by ‘nixos-generate-config’
|
||||
# and may be overwritten by future invocations. Please make changes
|
||||
# to /etc/nixos/configuration.nix instead.
|
||||
{ config, lib, modulesPath, ... }:
|
||||
|
||||
{
|
||||
imports = [ (modulesPath + "/installer/scan/not-detected.nix") ];
|
||||
boot = {
|
||||
|
||||
initrd.availableKernelModules =
|
||||
[ "xhci_pci" "ahci" "nvme" "usbhid" "usb_storage" "sd_mod" ];
|
||||
initrd.kernelModules = [ ];
|
||||
kernelModules = [ "kvm-intel" ];
|
||||
extraModulePackages = [ ];
|
||||
};
|
||||
|
||||
fileSystems."/" = {
|
||||
device = "/dev/disk/by-uuid/947a98af-9a4e-4811-a2ca-9aa00b319e9c";
|
||||
fsType = "btrfs";
|
||||
options = [ "subvol=@" ];
|
||||
};
|
||||
|
||||
fileSystems."/boot/efi" = {
|
||||
device = "/dev/disk/by-uuid/D883-F146";
|
||||
fsType = "vfat";
|
||||
};
|
||||
|
||||
swapDevices =
|
||||
[{ device = "/dev/disk/by-uuid/a99402e1-6f2a-4c4b-b69f-aae2fd13ffc0"; }];
|
||||
|
||||
# Enables DHCP on each ethernet and wireless interface. In case of scripted networking
|
||||
# (the default) this is the recommended approach. When using systemd-networkd it's
|
||||
# still possible to use this option, but it's recommended to use it in conjunction
|
||||
# with explicit per-interface declarations with `networking.interfaces.<interface>.useDHCP`.
|
||||
networking.useDHCP = lib.mkDefault true;
|
||||
# networking.interfaces.enp0s31f6.useDHCP = lib.mkDefault true;
|
||||
|
||||
nixpkgs.hostPlatform = lib.mkDefault "x86_64-linux";
|
||||
powerManagement.cpuFreqGovernor = lib.mkDefault "powersave";
|
||||
hardware.cpu.intel.updateMicrocode =
|
||||
lib.mkDefault config.hardware.enableRedistributableFirmware;
|
||||
}
|
43
hosts/olympus/eevee/hardware.nix
Normal file
43
hosts/olympus/eevee/hardware.nix
Normal file
|
@ -0,0 +1,43 @@
|
|||
{ config, pkgs, ... }:
|
||||
{
|
||||
hardware = {
|
||||
enableAllFirmware = true;
|
||||
nvidia = {
|
||||
package = config.boot.kernelPackages.nvidiaPackages.beta;
|
||||
|
||||
# Open drivers cause gdm to crash
|
||||
open = false;
|
||||
|
||||
# nvidia-drm.modeset=1
|
||||
modesetting.enable = true;
|
||||
powerManagement.enable = false;
|
||||
};
|
||||
|
||||
# Hardware acceleration
|
||||
graphics.enable = true;
|
||||
|
||||
logitech.wireless = {
|
||||
enable = true;
|
||||
enableGraphical = true;
|
||||
};
|
||||
};
|
||||
services = {
|
||||
|
||||
hardware.bolt.enable = true;
|
||||
|
||||
xserver.videoDrivers = [ "nvidia" ];
|
||||
|
||||
# udev
|
||||
udev.packages = with pkgs; [
|
||||
android-udev-rules
|
||||
logitech-udev-rules
|
||||
wooting-udev-rules
|
||||
];
|
||||
|
||||
# SSD Trim
|
||||
fstrim.enable = true;
|
||||
};
|
||||
|
||||
# FS
|
||||
fileSystems."/".options = [ "compress=zstd" ];
|
||||
}
|
1
hosts/olympus/eevee/home/.gitignore
vendored
Normal file
1
hosts/olympus/eevee/home/.gitignore
vendored
Normal file
|
@ -0,0 +1 @@
|
|||
*dconf_dump*
|
8
hosts/olympus/eevee/home/default.nix
Normal file
8
hosts/olympus/eevee/home/default.nix
Normal file
|
@ -0,0 +1,8 @@
|
|||
{ pkgs, ... }: {
|
||||
dconf.settings."org/gnome/desktop/peripherals/mouse" = {
|
||||
accel-profile = "flat";
|
||||
};
|
||||
|
||||
home.packages = with pkgs; [
|
||||
];
|
||||
}
|
146
hosts/thalassa/aoife/69-probe-rs.rules
Normal file
146
hosts/thalassa/aoife/69-probe-rs.rules
Normal file
|
@ -0,0 +1,146 @@
|
|||
# Copy this file to /etc/udev/rules.d/
|
||||
# If rules fail to reload automatically, you can refresh udev rules
|
||||
# with the command "udevadm control --reload"
|
||||
|
||||
# This rules are based on the udev rules from the OpenOCD project, with unsupported probes removed.
|
||||
# See http://openocd.org/ for more details.
|
||||
#
|
||||
# This file is available under the GNU General Public License v2.0
|
||||
|
||||
ACTION!="add|change", GOTO="probe_rs_rules_end"
|
||||
|
||||
SUBSYSTEM=="gpio", MODE="0660", GROUP="plugdev", TAG+="uaccess"
|
||||
|
||||
SUBSYSTEM!="usb|tty|hidraw", GOTO="probe_rs_rules_end"
|
||||
|
||||
# Please keep this list sorted by VID:PID
|
||||
|
||||
# STMicroelectronics ST-LINK V1
|
||||
ATTRS{idVendor}=="0483", ATTRS{idProduct}=="3744", MODE="660", GROUP="plugdev", TAG+="uaccess"
|
||||
|
||||
# STMicroelectronics ST-LINK/V2
|
||||
ATTRS{idVendor}=="0483", ATTRS{idProduct}=="3748", MODE="660", GROUP="plugdev", TAG+="uaccess"
|
||||
|
||||
# STMicroelectronics ST-LINK/V2.1
|
||||
ATTRS{idVendor}=="0483", ATTRS{idProduct}=="374b", MODE="660", GROUP="plugdev", TAG+="uaccess"
|
||||
ATTRS{idVendor}=="0483", ATTRS{idProduct}=="3752", MODE="660", GROUP="plugdev", TAG+="uaccess"
|
||||
|
||||
# STMicroelectronics STLINK-V3
|
||||
ATTRS{idVendor}=="0483", ATTRS{idProduct}=="374d", MODE="660", GROUP="plugdev", TAG+="uaccess"
|
||||
ATTRS{idVendor}=="0483", ATTRS{idProduct}=="374e", MODE="660", GROUP="plugdev", TAG+="uaccess"
|
||||
ATTRS{idVendor}=="0483", ATTRS{idProduct}=="374f", MODE="660", GROUP="plugdev", TAG+="uaccess"
|
||||
ATTRS{idVendor}=="0483", ATTRS{idProduct}=="3753", MODE="660", GROUP="plugdev", TAG+="uaccess"
|
||||
ATTRS{idVendor}=="0483", ATTRS{idProduct}=="3754", MODE="660", GROUP="plugdev", TAG+="uaccess"
|
||||
|
||||
# SEGGER J-Link
|
||||
ATTRS{idVendor}=="1366", ATTRS{idProduct}=="0101", MODE="660", GROUP="plugdev", TAG+="uaccess"
|
||||
ATTRS{idVendor}=="1366", ATTRS{idProduct}=="0102", MODE="660", GROUP="plugdev", TAG+="uaccess"
|
||||
ATTRS{idVendor}=="1366", ATTRS{idProduct}=="0103", MODE="660", GROUP="plugdev", TAG+="uaccess"
|
||||
ATTRS{idVendor}=="1366", ATTRS{idProduct}=="0104", MODE="660", GROUP="plugdev", TAG+="uaccess"
|
||||
ATTRS{idVendor}=="1366", ATTRS{idProduct}=="0105", MODE="660", GROUP="plugdev", TAG+="uaccess"
|
||||
ATTRS{idVendor}=="1366", ATTRS{idProduct}=="0107", MODE="660", GROUP="plugdev", TAG+="uaccess"
|
||||
ATTRS{idVendor}=="1366", ATTRS{idProduct}=="0108", MODE="660", GROUP="plugdev", TAG+="uaccess"
|
||||
ATTRS{idVendor}=="1366", ATTRS{idProduct}=="1001", MODE="660", GROUP="plugdev", TAG+="uaccess"
|
||||
ATTRS{idVendor}=="1366", ATTRS{idProduct}=="1002", MODE="660", GROUP="plugdev", TAG+="uaccess"
|
||||
ATTRS{idVendor}=="1366", ATTRS{idProduct}=="1003", MODE="660", GROUP="plugdev", TAG+="uaccess"
|
||||
ATTRS{idVendor}=="1366", ATTRS{idProduct}=="1004", MODE="660", GROUP="plugdev", TAG+="uaccess"
|
||||
ATTRS{idVendor}=="1366", ATTRS{idProduct}=="1005", MODE="660", GROUP="plugdev", TAG+="uaccess"
|
||||
ATTRS{idVendor}=="1366", ATTRS{idProduct}=="1006", MODE="660", GROUP="plugdev", TAG+="uaccess"
|
||||
ATTRS{idVendor}=="1366", ATTRS{idProduct}=="1007", MODE="660", GROUP="plugdev", TAG+="uaccess"
|
||||
ATTRS{idVendor}=="1366", ATTRS{idProduct}=="1008", MODE="660", GROUP="plugdev", TAG+="uaccess"
|
||||
ATTRS{idVendor}=="1366", ATTRS{idProduct}=="1009", MODE="660", GROUP="plugdev", TAG+="uaccess"
|
||||
ATTRS{idVendor}=="1366", ATTRS{idProduct}=="100a", MODE="660", GROUP="plugdev", TAG+="uaccess"
|
||||
ATTRS{idVendor}=="1366", ATTRS{idProduct}=="100b", MODE="660", GROUP="plugdev", TAG+="uaccess"
|
||||
ATTRS{idVendor}=="1366", ATTRS{idProduct}=="100c", MODE="660", GROUP="plugdev", TAG+="uaccess"
|
||||
ATTRS{idVendor}=="1366", ATTRS{idProduct}=="100d", MODE="660", GROUP="plugdev", TAG+="uaccess"
|
||||
ATTRS{idVendor}=="1366", ATTRS{idProduct}=="100e", MODE="660", GROUP="plugdev", TAG+="uaccess"
|
||||
ATTRS{idVendor}=="1366", ATTRS{idProduct}=="100f", MODE="660", GROUP="plugdev", TAG+="uaccess"
|
||||
ATTRS{idVendor}=="1366", ATTRS{idProduct}=="1010", MODE="660", GROUP="plugdev", TAG+="uaccess"
|
||||
ATTRS{idVendor}=="1366", ATTRS{idProduct}=="1011", MODE="660", GROUP="plugdev", TAG+="uaccess"
|
||||
ATTRS{idVendor}=="1366", ATTRS{idProduct}=="1012", MODE="660", GROUP="plugdev", TAG+="uaccess"
|
||||
ATTRS{idVendor}=="1366", ATTRS{idProduct}=="1013", MODE="660", GROUP="plugdev", TAG+="uaccess"
|
||||
ATTRS{idVendor}=="1366", ATTRS{idProduct}=="1014", MODE="660", GROUP="plugdev", TAG+="uaccess"
|
||||
ATTRS{idVendor}=="1366", ATTRS{idProduct}=="1015", MODE="660", GROUP="plugdev", TAG+="uaccess"
|
||||
ATTRS{idVendor}=="1366", ATTRS{idProduct}=="1016", MODE="660", GROUP="plugdev", TAG+="uaccess"
|
||||
ATTRS{idVendor}=="1366", ATTRS{idProduct}=="1017", MODE="660", GROUP="plugdev", TAG+="uaccess"
|
||||
ATTRS{idVendor}=="1366", ATTRS{idProduct}=="1018", MODE="660", GROUP="plugdev", TAG+="uaccess"
|
||||
ATTRS{idVendor}=="1366", ATTRS{idProduct}=="1019", MODE="660", GROUP="plugdev", TAG+="uaccess"
|
||||
ATTRS{idVendor}=="1366", ATTRS{idProduct}=="101a", MODE="660", GROUP="plugdev", TAG+="uaccess"
|
||||
ATTRS{idVendor}=="1366", ATTRS{idProduct}=="101b", MODE="660", GROUP="plugdev", TAG+="uaccess"
|
||||
ATTRS{idVendor}=="1366", ATTRS{idProduct}=="101c", MODE="660", GROUP="plugdev", TAG+="uaccess"
|
||||
ATTRS{idVendor}=="1366", ATTRS{idProduct}=="101d", MODE="660", GROUP="plugdev", TAG+="uaccess"
|
||||
ATTRS{idVendor}=="1366", ATTRS{idProduct}=="101e", MODE="660", GROUP="plugdev", TAG+="uaccess"
|
||||
ATTRS{idVendor}=="1366", ATTRS{idProduct}=="101f", MODE="660", GROUP="plugdev", TAG+="uaccess"
|
||||
ATTRS{idVendor}=="1366", ATTRS{idProduct}=="1020", MODE="660", GROUP="plugdev", TAG+="uaccess"
|
||||
ATTRS{idVendor}=="1366", ATTRS{idProduct}=="1021", MODE="660", GROUP="plugdev", TAG+="uaccess"
|
||||
ATTRS{idVendor}=="1366", ATTRS{idProduct}=="1022", MODE="660", GROUP="plugdev", TAG+="uaccess"
|
||||
ATTRS{idVendor}=="1366", ATTRS{idProduct}=="1023", MODE="660", GROUP="plugdev", TAG+="uaccess"
|
||||
ATTRS{idVendor}=="1366", ATTRS{idProduct}=="1024", MODE="660", GROUP="plugdev", TAG+="uaccess"
|
||||
ATTRS{idVendor}=="1366", ATTRS{idProduct}=="1025", MODE="660", GROUP="plugdev", TAG+="uaccess"
|
||||
ATTRS{idVendor}=="1366", ATTRS{idProduct}=="1026", MODE="660", GROUP="plugdev", TAG+="uaccess"
|
||||
ATTRS{idVendor}=="1366", ATTRS{idProduct}=="1027", MODE="660", GROUP="plugdev", TAG+="uaccess"
|
||||
ATTRS{idVendor}=="1366", ATTRS{idProduct}=="1028", MODE="660", GROUP="plugdev", TAG+="uaccess"
|
||||
ATTRS{idVendor}=="1366", ATTRS{idProduct}=="1029", MODE="660", GROUP="plugdev", TAG+="uaccess"
|
||||
ATTRS{idVendor}=="1366", ATTRS{idProduct}=="102a", MODE="660", GROUP="plugdev", TAG+="uaccess"
|
||||
ATTRS{idVendor}=="1366", ATTRS{idProduct}=="102b", MODE="660", GROUP="plugdev", TAG+="uaccess"
|
||||
ATTRS{idVendor}=="1366", ATTRS{idProduct}=="102c", MODE="660", GROUP="plugdev", TAG+="uaccess"
|
||||
ATTRS{idVendor}=="1366", ATTRS{idProduct}=="102d", MODE="660", GROUP="plugdev", TAG+="uaccess"
|
||||
ATTRS{idVendor}=="1366", ATTRS{idProduct}=="102e", MODE="660", GROUP="plugdev", TAG+="uaccess"
|
||||
ATTRS{idVendor}=="1366", ATTRS{idProduct}=="102f", MODE="660", GROUP="plugdev", TAG+="uaccess"
|
||||
ATTRS{idVendor}=="1366", ATTRS{idProduct}=="1050", MODE="660", GROUP="plugdev", TAG+="uaccess"
|
||||
ATTRS{idVendor}=="1366", ATTRS{idProduct}=="1051", MODE="660", GROUP="plugdev", TAG+="uaccess"
|
||||
ATTRS{idVendor}=="1366", ATTRS{idProduct}=="1052", MODE="660", GROUP="plugdev", TAG+="uaccess"
|
||||
ATTRS{idVendor}=="1366", ATTRS{idProduct}=="1053", MODE="660", GROUP="plugdev", TAG+="uaccess"
|
||||
ATTRS{idVendor}=="1366", ATTRS{idProduct}=="1054", MODE="660", GROUP="plugdev", TAG+="uaccess"
|
||||
ATTRS{idVendor}=="1366", ATTRS{idProduct}=="1055", MODE="660", GROUP="plugdev", TAG+="uaccess"
|
||||
ATTRS{idVendor}=="1366", ATTRS{idProduct}=="1056", MODE="660", GROUP="plugdev", TAG+="uaccess"
|
||||
ATTRS{idVendor}=="1366", ATTRS{idProduct}=="1057", MODE="660", GROUP="plugdev", TAG+="uaccess"
|
||||
ATTRS{idVendor}=="1366", ATTRS{idProduct}=="1058", MODE="660", GROUP="plugdev", TAG+="uaccess"
|
||||
ATTRS{idVendor}=="1366", ATTRS{idProduct}=="1059", MODE="660", GROUP="plugdev", TAG+="uaccess"
|
||||
ATTRS{idVendor}=="1366", ATTRS{idProduct}=="105a", MODE="660", GROUP="plugdev", TAG+="uaccess"
|
||||
ATTRS{idVendor}=="1366", ATTRS{idProduct}=="105b", MODE="660", GROUP="plugdev", TAG+="uaccess"
|
||||
ATTRS{idVendor}=="1366", ATTRS{idProduct}=="105c", MODE="660", GROUP="plugdev", TAG+="uaccess"
|
||||
ATTRS{idVendor}=="1366", ATTRS{idProduct}=="105d", MODE="660", GROUP="plugdev", TAG+="uaccess"
|
||||
ATTRS{idVendor}=="1366", ATTRS{idProduct}=="105e", MODE="660", GROUP="plugdev", TAG+="uaccess"
|
||||
ATTRS{idVendor}=="1366", ATTRS{idProduct}=="105f", MODE="660", GROUP="plugdev", TAG+="uaccess"
|
||||
ATTRS{idVendor}=="1366", ATTRS{idProduct}=="1060", MODE="660", GROUP="plugdev", TAG+="uaccess"
|
||||
ATTRS{idVendor}=="1366", ATTRS{idProduct}=="1061", MODE="660", GROUP="plugdev", TAG+="uaccess"
|
||||
ATTRS{idVendor}=="1366", ATTRS{idProduct}=="1062", MODE="660", GROUP="plugdev", TAG+="uaccess"
|
||||
ATTRS{idVendor}=="1366", ATTRS{idProduct}=="1063", MODE="660", GROUP="plugdev", TAG+="uaccess"
|
||||
ATTRS{idVendor}=="1366", ATTRS{idProduct}=="1064", MODE="660", GROUP="plugdev", TAG+="uaccess"
|
||||
ATTRS{idVendor}=="1366", ATTRS{idProduct}=="1065", MODE="660", GROUP="plugdev", TAG+="uaccess"
|
||||
ATTRS{idVendor}=="1366", ATTRS{idProduct}=="1066", MODE="660", GROUP="plugdev", TAG+="uaccess"
|
||||
ATTRS{idVendor}=="1366", ATTRS{idProduct}=="1067", MODE="660", GROUP="plugdev", TAG+="uaccess"
|
||||
ATTRS{idVendor}=="1366", ATTRS{idProduct}=="1068", MODE="660", GROUP="plugdev", TAG+="uaccess"
|
||||
ATTRS{idVendor}=="1366", ATTRS{idProduct}=="1069", MODE="660", GROUP="plugdev", TAG+="uaccess"
|
||||
ATTRS{idVendor}=="1366", ATTRS{idProduct}=="106a", MODE="660", GROUP="plugdev", TAG+="uaccess"
|
||||
ATTRS{idVendor}=="1366", ATTRS{idProduct}=="106b", MODE="660", GROUP="plugdev", TAG+="uaccess"
|
||||
ATTRS{idVendor}=="1366", ATTRS{idProduct}=="106c", MODE="660", GROUP="plugdev", TAG+="uaccess"
|
||||
ATTRS{idVendor}=="1366", ATTRS{idProduct}=="106d", MODE="660", GROUP="plugdev", TAG+="uaccess"
|
||||
ATTRS{idVendor}=="1366", ATTRS{idProduct}=="106e", MODE="660", GROUP="plugdev", TAG+="uaccess"
|
||||
ATTRS{idVendor}=="1366", ATTRS{idProduct}=="106f", MODE="660", GROUP="plugdev", TAG+="uaccess"
|
||||
|
||||
# FT232H
|
||||
ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6014", MODE="660", GROUP="plugdev", TAG+="uaccess"
|
||||
# FT2232x
|
||||
ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6010", MODE="660", GROUP="plugdev", TAG+="uaccess"
|
||||
# FT4232H
|
||||
ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6011", MODE="660", GROUP="plugdev", TAG+="uaccess"
|
||||
|
||||
# FTDI-based Olimex devices
|
||||
ATTRS{idVendor}=="0x15ba", ATTRS{idProduct}=="0x0003", MODE="660", GROUP="plugdev", TAG+="uaccess"
|
||||
ATTRS{idVendor}=="0x15ba", ATTRS{idProduct}=="0x0004", MODE="660", GROUP="plugdev", TAG+="uaccess"
|
||||
ATTRS{idVendor}=="0x15ba", ATTRS{idProduct}=="0x002a", MODE="660", GROUP="plugdev", TAG+="uaccess"
|
||||
ATTRS{idVendor}=="0x15ba", ATTRS{idProduct}=="0x002b", MODE="660", GROUP="plugdev", TAG+="uaccess"
|
||||
|
||||
# Espressif USB JTAG/serial debug unit
|
||||
ATTRS{idVendor}=="303a", ATTRS{idProduct}=="1001", MODE="660", GROUP="plugdev", TAG+="uaccess"
|
||||
# Espressif USB Bridge
|
||||
ATTRS{idVendor}=="303a", ATTRS{idProduct}=="1002", MODE="660", GROUP="plugdev", TAG+="uaccess"
|
||||
|
||||
# CMSIS-DAP compatible adapters
|
||||
ATTRS{product}=="*CMSIS-DAP*", MODE="660", GROUP="plugdev", TAG+="uaccess"
|
||||
# WCH Link (CMSIS-DAP compatible adapter)
|
||||
ATTRS{idVendor}=="1a86", ATTRS{idProduct}=="8011", MODE="660", GROUP="plugdev", TAG+="uaccess"
|
||||
|
||||
LABEL="probe_rs_rules_end"
|
22
hosts/thalassa/aoife/README.md
Normal file
22
hosts/thalassa/aoife/README.md
Normal file
|
@ -0,0 +1,22 @@
|
|||
# Aoife
|
||||
This is the NixOS config for my laptop `aoife`.
|
||||
|
||||
## Hardware
|
||||
This is a Thinkpad Z16 Gen 1.
|
||||
|
||||
**CPU**: AMD Ryzen 9 PRO 6950H (16 cores) @ 4.935GHz
|
||||
|
||||
**RAM**: 32GB LPDDR5 6400MHz
|
||||
|
||||
**SCREEN**: 16" 3840 x 2400 OLED
|
||||
|
||||
**GPU**: AMD Radeon™ RX 6500M, 4 GB, GDDR6
|
||||
|
||||
|
||||
## Software
|
||||
**OS**: NixOS
|
||||
|
||||
**DE**: Gnome
|
||||
|
||||
**Shell**: ZSH (grml)
|
||||
|
98
hosts/thalassa/aoife/default.nix
Normal file
98
hosts/thalassa/aoife/default.nix
Normal file
|
@ -0,0 +1,98 @@
|
|||
# Edit this configuration file to define what should be installed on
|
||||
# your system. Help is available in the configuration.nix(5) man page
|
||||
# and in the NixOS manual (accessible by running ‘nixos-help’).
|
||||
|
||||
{
|
||||
inputs,
|
||||
lib,
|
||||
pkgs,
|
||||
...
|
||||
}:
|
||||
{
|
||||
imports = [
|
||||
./hardware-configuration.nix
|
||||
inputs.nixos-hardware.nixosModules.lenovo-thinkpad-z
|
||||
./hardware.nix
|
||||
./uni.nix
|
||||
];
|
||||
|
||||
meta = {
|
||||
mac = "04:7b:cb:b6:2d:88";
|
||||
isLaptop = true;
|
||||
};
|
||||
|
||||
users.users.vivian.extraGroups = [ "adbusers" ];
|
||||
|
||||
# Bootloader.
|
||||
boot = {
|
||||
|
||||
bootspec.enable = true;
|
||||
initrd.kernelModules = [ "amdgpu" ];
|
||||
resumeDevice = "/dev/nvme0n1p2";
|
||||
loader.systemd-boot.enable = lib.mkForce false; # Using lanzaboote instead
|
||||
|
||||
kernel.sysctl = {
|
||||
"perf_event_paranoid" = 1;
|
||||
"kptr_restrict" = 0;
|
||||
};
|
||||
lanzaboote = {
|
||||
enable = true;
|
||||
configurationLimit = 5;
|
||||
pkiBundle = "/etc/secureboot";
|
||||
};
|
||||
};
|
||||
|
||||
home-manager.users.vivian = import ./home;
|
||||
programs = {
|
||||
nix-ld.enable = true;
|
||||
nix-ld.libraries = with pkgs; [
|
||||
# Add any missing dynamic libraries for unpackaged programs
|
||||
|
||||
# here, NOT in environment.systemPackages
|
||||
];
|
||||
|
||||
hyprland = {
|
||||
enable = true;
|
||||
withUWSM = true;
|
||||
};
|
||||
hyprlock.enable = true;
|
||||
evolution.enable = false;
|
||||
};
|
||||
|
||||
services = {
|
||||
hypridle.enable = true;
|
||||
xserver.displayManager.gdm.enable = true;
|
||||
|
||||
flatpak.enable = true;
|
||||
|
||||
gnome.gnome-keyring.enable = true;
|
||||
|
||||
ollama = {
|
||||
enable = false;
|
||||
acceleration = "rocm";
|
||||
rocmOverrideGfx = "10.3.4";
|
||||
};
|
||||
|
||||
interception-tools = {
|
||||
enable = true;
|
||||
plugins = [ pkgs.interception-tools-plugins.caps2esc ];
|
||||
udevmonConfig = ''
|
||||
- JOB: "${pkgs.interception-tools}/bin/intercept -g $DEVNODE | ${pkgs.interception-tools-plugins.caps2esc}/bin/caps2esc | ${pkgs.interception-tools}/bin/uinput -d $DEVNODE"
|
||||
DEVICE:
|
||||
EVENTS:
|
||||
EV_KEY: [KEY_CAPSLOCK, KEY_ESC]
|
||||
'';
|
||||
};
|
||||
};
|
||||
|
||||
# Enable Ozone rendering for Chromium and Electron apps.
|
||||
environment.sessionVariables.NIXOS_OZONE_WL = "1";
|
||||
|
||||
# This value determines the NixOS release from which the default
|
||||
# settings for stateful data, like file locations and database versions
|
||||
# on your system were taken. It‘s perfectly fine and recommended to leave
|
||||
# this value at the release version of the first install of this system.
|
||||
# Before changing this value read the documentation for this option
|
||||
# (e.g. man configuration.nix or on https://nixos.org/nixos/options.html).
|
||||
system.stateVersion = "23.05"; # Did you read the comment?
|
||||
}
|
42
hosts/thalassa/aoife/hardware-configuration.nix
Normal file
42
hosts/thalassa/aoife/hardware-configuration.nix
Normal file
|
@ -0,0 +1,42 @@
|
|||
# Do not modify this file! It was generated by ‘nixos-generate-config’
|
||||
# and may be overwritten by future invocations. Please make changes
|
||||
# to /etc/nixos/configuration.nix instead.
|
||||
{ config, lib, modulesPath, ... }:
|
||||
|
||||
{
|
||||
imports = [ (modulesPath + "/installer/scan/not-detected.nix") ];
|
||||
boot = {
|
||||
|
||||
initrd.availableKernelModules =
|
||||
[ "nvme" "xhci_pci" "thunderbolt" "usb_storage" "sd_mod" "sdhci_pci" ];
|
||||
initrd.kernelModules = [ ];
|
||||
kernelModules = [ "kvm-amd" ];
|
||||
extraModulePackages = [ ];
|
||||
};
|
||||
|
||||
fileSystems."/" = {
|
||||
device = "/dev/disk/by-uuid/c184866a-9a53-4a9f-9a1f-493792af7ea9";
|
||||
fsType = "btrfs";
|
||||
options = [ "subvol=@" ];
|
||||
};
|
||||
|
||||
fileSystems."/boot/efi" = {
|
||||
device = "/dev/disk/by-uuid/5BB8-7503";
|
||||
fsType = "vfat";
|
||||
};
|
||||
|
||||
swapDevices =
|
||||
[{ device = "/dev/disk/by-uuid/bedb5b75-578e-441f-a9eb-2ecff1f4cfca"; }];
|
||||
|
||||
# Enables DHCP on each ethernet and wireless interface. In case of scripted networking
|
||||
# (the default) this is the recommended approach. When using systemd-networkd it's
|
||||
# still possible to use this option, but it's recommended to use it in conjunction
|
||||
# with explicit per-interface declarations with `networking.interfaces.<interface>.useDHCP`.
|
||||
networking.useDHCP = lib.mkDefault true;
|
||||
# networking.interfaces.wlp4s0.useDHCP = lib.mkDefault true;
|
||||
|
||||
nixpkgs.hostPlatform = lib.mkDefault "x86_64-linux";
|
||||
hardware.cpu.amd.updateMicrocode =
|
||||
lib.mkDefault config.hardware.enableRedistributableFirmware;
|
||||
# high-resolution display
|
||||
}
|
83
hosts/thalassa/aoife/hardware.nix
Normal file
83
hosts/thalassa/aoife/hardware.nix
Normal file
|
@ -0,0 +1,83 @@
|
|||
{ pkgs, ... }:
|
||||
{
|
||||
environment.systemPackages = with pkgs; [
|
||||
pciutils
|
||||
usbutils
|
||||
lshw
|
||||
];
|
||||
|
||||
boot = {
|
||||
kernelParams = [
|
||||
"amdgpu.dcdebugmask=0x10" # Disables partial screen refresh, fixes flicker
|
||||
"kvm.enable_virt_at_load=0"
|
||||
];
|
||||
};
|
||||
|
||||
hardware = {
|
||||
enableAllFirmware = true;
|
||||
bluetooth.enable = true;
|
||||
|
||||
# OpenGL + Vulkan
|
||||
graphics = {
|
||||
enable = true;
|
||||
extraPackages = with pkgs; [
|
||||
mesa
|
||||
];
|
||||
};
|
||||
|
||||
amdgpu = {
|
||||
initrd.enable = true;
|
||||
opencl.enable = true;
|
||||
# Temp disabled as it breaks GTK
|
||||
# amdvlk.enable = true;
|
||||
};
|
||||
};
|
||||
services = {
|
||||
fwupd.enable = true;
|
||||
|
||||
hardware.bolt.enable = true;
|
||||
|
||||
fprintd = {
|
||||
enable = true;
|
||||
# fprintd test suite fails
|
||||
package = pkgs.fprintd.overrideAttrs {
|
||||
mesonCheckFlags = [
|
||||
"--no-suite"
|
||||
"fprintd:TestPamFprintd"
|
||||
];
|
||||
};
|
||||
};
|
||||
|
||||
# Video Driver
|
||||
xserver = {
|
||||
# videoDrivers = [ "displaylink" ];
|
||||
dpi = 280;
|
||||
};
|
||||
|
||||
# SSD Trim
|
||||
fstrim.enable = true;
|
||||
|
||||
# Power Management
|
||||
upower.enable = true;
|
||||
thermald.enable = true;
|
||||
};
|
||||
|
||||
# hardware.trackpoint.enable = true;
|
||||
|
||||
# FS
|
||||
fileSystems."/".options = [ "compress=zstd" ];
|
||||
|
||||
powerManagement = {
|
||||
enable = true;
|
||||
powertop.enable = true;
|
||||
};
|
||||
|
||||
security = {
|
||||
tpm2 = {
|
||||
enable = true;
|
||||
pkcs11.enable = true; # expose /run/current-system/sw/lib/libtpm2_pkcs11.so
|
||||
tctiEnvironment.enable = true;
|
||||
};
|
||||
}; # TPM2TOOLS_TCTI and TPM2_PKCS11_TCTI env variables
|
||||
users.users.vivian.extraGroups = [ "tss" ]; # tss group has access to TPM devices
|
||||
}
|
1
hosts/thalassa/aoife/home/.gitignore
vendored
Normal file
1
hosts/thalassa/aoife/home/.gitignore
vendored
Normal file
|
@ -0,0 +1 @@
|
|||
*dconf_dump*
|
46
hosts/thalassa/aoife/home/default.nix
Normal file
46
hosts/thalassa/aoife/home/default.nix
Normal file
|
@ -0,0 +1,46 @@
|
|||
{ pkgs, ... }: {
|
||||
imports = [
|
||||
./starship.nix
|
||||
./hyprland.nix
|
||||
];
|
||||
|
||||
|
||||
# Custom dconf settings
|
||||
dconf.settings."org/gnome/desktop/input-sources" = {
|
||||
# xkb-options = [ "caps:swapescape" ];
|
||||
};
|
||||
|
||||
programs.zsh.envExtra = ''
|
||||
source ~/.zshrc.secrets
|
||||
'';
|
||||
|
||||
home.packages = with pkgs; [
|
||||
eduvpn-client
|
||||
localsend
|
||||
typst
|
||||
];
|
||||
|
||||
|
||||
programs.ssh.enable = true;
|
||||
programs.ssh.matchBlocks = {
|
||||
"student-linux.tudelft.nl" = {
|
||||
user = "vroest";
|
||||
};
|
||||
"login.delftblue.tudelft.nl" = {
|
||||
user = "vroest";
|
||||
};
|
||||
"cese01" = {
|
||||
hostname = "cese01.ewi.tudelft.nl";
|
||||
user = "vroest";
|
||||
proxyJump = "student-linux.tudelft.nl";
|
||||
};
|
||||
"cese" = {
|
||||
user = "root";
|
||||
hostname = "10.0.3.121";
|
||||
proxyJump = "cese01";
|
||||
};
|
||||
"bastion.olympus" = { };
|
||||
"bastion.hades" = { };
|
||||
};
|
||||
|
||||
}
|
138
hosts/thalassa/aoife/home/eww/eww.scss
Normal file
138
hosts/thalassa/aoife/home/eww/eww.scss
Normal file
|
@ -0,0 +1,138 @@
|
|||
$light-gray: #9699b7;
|
||||
|
||||
* {
|
||||
all: unset; //Unsets everything so you can style everything from scratch
|
||||
font-family: "JetBrainsMono"
|
||||
}
|
||||
|
||||
tooltip {
|
||||
background-color: $base;
|
||||
border-radius: 5px
|
||||
}
|
||||
|
||||
button {
|
||||
transition: background-color 200ms, color 200ms;
|
||||
}
|
||||
|
||||
.active {
|
||||
color: $pink;
|
||||
font-size: 1.4rem;
|
||||
}
|
||||
|
||||
.inactive {
|
||||
color: $base;
|
||||
font-size: 1.4rem;
|
||||
}
|
||||
|
||||
.inactive:hover {
|
||||
color: $light-gray;
|
||||
}
|
||||
|
||||
.bar {
|
||||
background-color: $mantle;
|
||||
}
|
||||
|
||||
.clock {
|
||||
font-weight: bold;
|
||||
background-color: $base;
|
||||
color: $text;
|
||||
border-radius: 10px;
|
||||
padding: 0.2rem;
|
||||
margin: 0.5rem;
|
||||
}
|
||||
|
||||
.date {
|
||||
font-size: 1.5rem;
|
||||
color: $text;
|
||||
}
|
||||
|
||||
|
||||
.battery {
|
||||
font-family: monospace;
|
||||
font-size: 1.5rem;
|
||||
color: $teal;
|
||||
}
|
||||
|
||||
.volume,
|
||||
.dnd,
|
||||
.wifi {
|
||||
font-family: monospace;
|
||||
font-size: 1.5rem;
|
||||
color: $mauve;
|
||||
padding: 0 5px;
|
||||
}
|
||||
|
||||
|
||||
// battery menu
|
||||
.batterywindow {
|
||||
background-color: $mantle;
|
||||
border-radius: 5px;
|
||||
font-size: 18px;
|
||||
font-weight: normal;
|
||||
color: $text;
|
||||
|
||||
progressbar {
|
||||
border-radius: 5px;
|
||||
}
|
||||
|
||||
progressbar progress {
|
||||
background-color: $green;
|
||||
}
|
||||
|
||||
progressbar trough {
|
||||
background-color: $base;
|
||||
}
|
||||
|
||||
.batterymenu {
|
||||
padding: 10px;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// Calendar
|
||||
.cal {
|
||||
background-color: $mantle;
|
||||
border-radius: 5px;
|
||||
font-size: 18px;
|
||||
font-weight: normal;
|
||||
|
||||
.cal-in {
|
||||
padding: 0px 10px 0px 10px;
|
||||
color: $text;
|
||||
|
||||
.cal {
|
||||
&.highlight {
|
||||
padding: 20px;
|
||||
}
|
||||
|
||||
padding: 5px 5px 5px 5px;
|
||||
margin-left: 10px;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
calender {
|
||||
color: $text;
|
||||
}
|
||||
|
||||
calendar:selected {
|
||||
color: $mauve;
|
||||
}
|
||||
|
||||
calendar.header {
|
||||
color: $overlay0;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
calendar.button {
|
||||
color: $base;
|
||||
}
|
||||
|
||||
calendar.highlight {
|
||||
color: $overlay0;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
calendar:indeterminate {
|
||||
color: $text;
|
||||
}
|
164
hosts/thalassa/aoife/home/eww/eww.yuck
Normal file
164
hosts/thalassa/aoife/home/eww/eww.yuck
Normal file
|
@ -0,0 +1,164 @@
|
|||
(defwidget bar []
|
||||
(centerbox
|
||||
:orientation "v"
|
||||
(box
|
||||
:valign "start"
|
||||
:hexpand false
|
||||
:vexpand false
|
||||
:orientation "v"
|
||||
:space-evenly false
|
||||
)
|
||||
|
||||
(workspaces
|
||||
:halign "center"
|
||||
:vexpand true
|
||||
:hexpand false
|
||||
:orientation "v"
|
||||
)
|
||||
|
||||
(box :valign "end" :hexpand false :vexpand true :orientation "v" :space-evenly false
|
||||
(wifi)
|
||||
(do-not-disturb)
|
||||
(volume)
|
||||
(battery)
|
||||
(time)
|
||||
)
|
||||
)
|
||||
)
|
||||
|
||||
;; ━━━ BATTERY ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||||
(defwidget battery []
|
||||
(eventbox :onclick "eww open batterywindow --toggle"
|
||||
(label
|
||||
:text `${
|
||||
EWW_BATTERY.BAT0.status == "Charging" ? "" :
|
||||
EWW_BATTERY.BAT0.capacity < 10 ? "" :
|
||||
EWW_BATTERY.BAT0.capacity < 20 ? "" :
|
||||
EWW_BATTERY.BAT0.capacity < 30 ? "" :
|
||||
EWW_BATTERY.BAT0.capacity < 40 ? "" :
|
||||
EWW_BATTERY.BAT0.capacity < 50 ? "" :
|
||||
EWW_BATTERY.BAT0.capacity < 60 ? "" :
|
||||
EWW_BATTERY.BAT0.capacity < 70 ? "" :
|
||||
EWW_BATTERY.BAT0.capacity < 80 ? "" :
|
||||
EWW_BATTERY.BAT0.capacity < 90 ? "" : ""
|
||||
}`
|
||||
:class "battery"
|
||||
))
|
||||
)
|
||||
|
||||
(defwidget batterymenu []
|
||||
(box :orientation "v"
|
||||
:class "batterymenu"
|
||||
(label :text "${EWW_BATTERY.BAT0.status}: ${EWW_BATTERY.BAT0.capacity}%")
|
||||
(progress :value "${EWW_BATTERY.BAT0.capacity}" :orientation "h") ; TODO: change class (and color) on low juice
|
||||
)
|
||||
)
|
||||
|
||||
(defwindow batterywindow
|
||||
:monitor 0
|
||||
:geometry (geometry
|
||||
:x "53px"
|
||||
:y "30px"
|
||||
:anchor "bottom left"
|
||||
)
|
||||
(batterymenu)
|
||||
)
|
||||
|
||||
; ━━━ do-not-disturb ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||||
(defvar dnd "")
|
||||
(defwidget do-not-disturb []
|
||||
(eventbox
|
||||
:orientation "h"
|
||||
:halign "center"
|
||||
:space-evenly false
|
||||
:onclick "nohup ./scripts/do-not-disturb.sh &"
|
||||
(label
|
||||
:text {dnd}
|
||||
:class "dnd"
|
||||
)
|
||||
)
|
||||
)
|
||||
|
||||
;; ━━━ WIFI ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||||
(defpoll wifi :interval "30s" "./scripts/wifi.sh")
|
||||
|
||||
(defwidget wifi []
|
||||
(box
|
||||
:orientation "h"
|
||||
:halign "center"
|
||||
:space-evenly false
|
||||
(label
|
||||
:text {wifi.icon}
|
||||
:tooltip {wifi.status}
|
||||
:class "wifi"
|
||||
)
|
||||
)
|
||||
)
|
||||
|
||||
;; ━━━ VOLUME ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||||
(defpoll volume :interval "1s" "./scripts/volume.sh")
|
||||
(defwidget volume []
|
||||
(eventbox
|
||||
:orientation "h"
|
||||
:halign "center"
|
||||
:space-evenly false
|
||||
:onclick "pamixer -t"
|
||||
(label
|
||||
:text {volume.icon}
|
||||
:tooltip "${volume.percent}%"
|
||||
:class "volume"
|
||||
)
|
||||
)
|
||||
)
|
||||
|
||||
;; ━━━ TIME ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||||
(defpoll hour :interval "10s" "date +%H")
|
||||
(defpoll minute :interval "10s" "date +%M")
|
||||
(defpoll dateVar :interval "600s" "date '+%A %d.%m.%y'")
|
||||
|
||||
(defwidget time []
|
||||
(eventbox
|
||||
:cursor "hand"
|
||||
:hexpand false
|
||||
:vexpand false
|
||||
:tooltip "${dateVar}"
|
||||
:onclick "eww open calendar --toggle &"
|
||||
(box :orientation "v" :hexpand false :vexpand false :space-evenly false :class "clock"
|
||||
(label :class "date" :text "${hour}")
|
||||
|
||||
(label :class "date" :text "${minute}")
|
||||
)
|
||||
)
|
||||
)
|
||||
|
||||
;; Calendar
|
||||
(defpoll calendar_day :interval "20h" "date '+%d'")
|
||||
(defpoll calendar_year :interval "20h" "date '+%Y'")
|
||||
(defwidget cal []
|
||||
(box :class "cal" :orientation "v"
|
||||
(box :class "cal-in"
|
||||
(calendar :class "cal"
|
||||
:day calendar_day
|
||||
:year calendar_year))))
|
||||
|
||||
(defwindow calendar
|
||||
:monitor 0
|
||||
:geometry (geometry :x "53px"
|
||||
:y "5px"
|
||||
:anchor "bottom left"
|
||||
:width "270px"
|
||||
:height "60px")
|
||||
(cal))
|
||||
|
||||
(deflisten workspaces_listen "./scripts/workspaces.sh")
|
||||
(defwidget workspaces []
|
||||
(literal :content workspaces_listen))
|
||||
|
||||
(defwindow bar
|
||||
:monitor 0
|
||||
:exclusive false
|
||||
:geometry (geometry :height "1080px" :x "-4px" :y "0px"
|
||||
:width "52px"
|
||||
:anchor "top left")
|
||||
:stacking "fg"
|
||||
(bar))
|
10
hosts/thalassa/aoife/home/eww/scripts/do-not-disturb.sh
Executable file
10
hosts/thalassa/aoife/home/eww/scripts/do-not-disturb.sh
Executable file
|
@ -0,0 +1,10 @@
|
|||
#!/usr/bin/env nix-shell
|
||||
#! nix-shell -p jq -i bash
|
||||
|
||||
if makoctl mode | rg -q "do-not-disturb"; then
|
||||
eww update dnd=""
|
||||
makoctl mode -r do-not-disturb > /dev/null
|
||||
else
|
||||
eww update dnd=""
|
||||
makoctl mode -a do-not-disturb > /dev/null
|
||||
fi
|
12
hosts/thalassa/aoife/home/eww/scripts/getvol
Executable file
12
hosts/thalassa/aoife/home/eww/scripts/getvol
Executable file
|
@ -0,0 +1,12 @@
|
|||
#!/bin/sh
|
||||
|
||||
if command -v pamixer &>/dev/null; then
|
||||
if [ true == $(pamixer --get-mute) ]; then
|
||||
echo 0
|
||||
exit
|
||||
else
|
||||
pamixer --get-volume
|
||||
fi
|
||||
else
|
||||
amixer -D pulse sget Master | awk -F '[^0-9]+' '/Left:/{print $3}'
|
||||
fi
|
15
hosts/thalassa/aoife/home/eww/scripts/volume.sh
Executable file
15
hosts/thalassa/aoife/home/eww/scripts/volume.sh
Executable file
|
@ -0,0 +1,15 @@
|
|||
#!/bin/sh
|
||||
|
||||
per="???"
|
||||
|
||||
if pamixer --get-mute | rg -q true; then
|
||||
icon="婢"
|
||||
elif [ "$per" -gt 66 ]; then
|
||||
icon="墳" # high
|
||||
elif [ "$per" -gt 33 ]; then
|
||||
icon="奔" # med
|
||||
else
|
||||
icon="奄" #low
|
||||
fi
|
||||
|
||||
printf "{\"icon\": \"${icon}\", \"percent\": \"${per}\"}"
|
11
hosts/thalassa/aoife/home/eww/scripts/wifi.sh
Executable file
11
hosts/thalassa/aoife/home/eww/scripts/wifi.sh
Executable file
|
@ -0,0 +1,11 @@
|
|||
#!/bin/sh
|
||||
|
||||
if wpa_cli status | rg -q "wpa_state=COMPLETED"; then
|
||||
icon="直"
|
||||
status="Connected"
|
||||
else
|
||||
icon="睊"
|
||||
status="offline"
|
||||
fi
|
||||
|
||||
printf "{\"icon\": \"${icon}\", \"status\": \"${status}\"}"
|
21
hosts/thalassa/aoife/home/eww/scripts/workspaces.lua
Executable file
21
hosts/thalassa/aoife/home/eww/scripts/workspaces.lua
Executable file
|
@ -0,0 +1,21 @@
|
|||
#!/usr/bin/env lua
|
||||
|
||||
aw = io.popen("hyprctl monitors | grep active | sed 's/()/(1)/g' | sort | awk 'NR>1{print $1}' RS='(' FS=')'")
|
||||
active_workspace = aw:read("*a")
|
||||
aw:close()
|
||||
|
||||
box = "(box :orientation \"v\" :spacing 1 :space-evenly \"true\" "
|
||||
|
||||
for i = 1,10 do
|
||||
if i == tonumber(active_workspace) then
|
||||
local btn = "(button :class \"active\" :onclick \"hyprctl dispatch workspace "..i.." \" \"\")"
|
||||
box = box .. btn
|
||||
else
|
||||
local btn = "(button :class \"inactive\" :onclick \"hyprctl dispatch workspace "..i.."\" \"\")"
|
||||
box = box .. btn
|
||||
end
|
||||
end
|
||||
|
||||
box = box .. ")"
|
||||
|
||||
print(box)
|
10
hosts/thalassa/aoife/home/eww/scripts/workspaces.sh
Executable file
10
hosts/thalassa/aoife/home/eww/scripts/workspaces.sh
Executable file
|
@ -0,0 +1,10 @@
|
|||
#!/bin/sh
|
||||
workspaces() {
|
||||
./scripts/workspaces.lua
|
||||
}
|
||||
|
||||
workspaces
|
||||
|
||||
tail -f /tmp/hypr/$HYPRLAND_INSTANCE_SIGNATURE/hyprland.log | grep --line-buffered "Changed to workspace" | while read -r; do
|
||||
workspaces
|
||||
done
|
333
hosts/thalassa/aoife/home/hyprland.nix
Normal file
333
hosts/thalassa/aoife/home/hyprland.nix
Normal file
|
@ -0,0 +1,333 @@
|
|||
{
|
||||
pkgs,
|
||||
config,
|
||||
inputs,
|
||||
lib,
|
||||
...
|
||||
}:
|
||||
let
|
||||
terminal = "${config.programs.kitty.package}/bin/kitty -1";
|
||||
in
|
||||
{
|
||||
imports = [
|
||||
./waybar.nix
|
||||
];
|
||||
|
||||
home.packages = with pkgs; [
|
||||
hyprland-workspaces
|
||||
inputs.gnome-autounlock-keyring.packages.${pkgs.system}.default
|
||||
inputs.hyprland-qtutils.packages.${pkgs.system}.default
|
||||
];
|
||||
|
||||
programs = {
|
||||
rofi = {
|
||||
enable = true;
|
||||
package = pkgs.rofi-wayland;
|
||||
theme = {
|
||||
listview.columns = 1;
|
||||
};
|
||||
};
|
||||
|
||||
hyprlock = {
|
||||
enable = true;
|
||||
settings =
|
||||
let
|
||||
color = "rgba(242, 243, 244, 0.75)";
|
||||
in
|
||||
{
|
||||
auth.fingerprint.enabled = true;
|
||||
|
||||
background = {
|
||||
path = "screenshot";
|
||||
blur_passes = 3;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
# eww = {
|
||||
# enable = true;
|
||||
# configDir = ./eww;
|
||||
# };
|
||||
};
|
||||
|
||||
services = {
|
||||
gnome-keyring.enable = true;
|
||||
|
||||
mako = {
|
||||
enable = true;
|
||||
settings.defaultTimeout = 5000;
|
||||
};
|
||||
|
||||
hypridle = {
|
||||
enable = true;
|
||||
|
||||
settings = {
|
||||
general = {
|
||||
lock_cmd = "pidof hyprlock || hyprlock";
|
||||
before_sleep_cmd = "loginctl lock-session";
|
||||
after_sleep_cmd = "hyprctl dispatch dpms on";
|
||||
};
|
||||
|
||||
listener = [
|
||||
{
|
||||
timeout = 300; # 5 mins
|
||||
on-timeout = "${pkgs.brightnessctl}/bin/brightnessctl -s set 10";
|
||||
on-resume = "${pkgs.brightnessctl}/bin/brightnessctl -r";
|
||||
}
|
||||
{
|
||||
timeout = 300; # 5 mins
|
||||
on-timeout = "${pkgs.brightnessctl}/bin/brightnessctl -sd tpacpi:kbd_backlight set 0";
|
||||
on-resume = "${pkgs.brightnessctl}/bin/brightnessctl -rd tpacpi::kbd_backlight";
|
||||
}
|
||||
{
|
||||
timeout = 600; # 10 mins
|
||||
on-timeout = "loginctl lock-session";
|
||||
}
|
||||
{
|
||||
timeout = 1200; # 20 mins, screen off
|
||||
on-timeout = "hyprctl dispatch dpms off";
|
||||
on-resume = "hyprctl dispatch dpms on";
|
||||
}
|
||||
{
|
||||
timeout = 2400; # 40 mins
|
||||
on-timeout = "systemctl suspend";
|
||||
}
|
||||
];
|
||||
};
|
||||
};
|
||||
|
||||
hyprpaper =
|
||||
let
|
||||
wallpaper = ../../../../assets/wallpaper-nix-pink.png;
|
||||
in
|
||||
{
|
||||
enable = true;
|
||||
settings = {
|
||||
preload = [ "${wallpaper}" ];
|
||||
wallpaper = [ "eDP-1,${wallpaper}" ];
|
||||
|
||||
splash = false;
|
||||
ipc = "off";
|
||||
};
|
||||
};
|
||||
|
||||
};
|
||||
|
||||
# Hack to ensure graphical dependent services start _after_ hyprland starts
|
||||
# Needed as these services normally start after graphical-session-pre
|
||||
systemd.user.services.hyprpaper.Unit.After = lib.mkForce "graphical-session.target";
|
||||
systemd.user.services.waybar.Unit.After = lib.mkForce "graphical-session.target";
|
||||
systemd.user.services.hypridle.Unit.After = lib.mkForce "graphical-session.target";
|
||||
|
||||
wayland.windowManager.hyprland =
|
||||
let
|
||||
toggle_mirror = pkgs.writeScriptBin "toggle_mirror.sh" ''
|
||||
#!${pkgs.stdenv.shell}
|
||||
if [ $(hyprctl monitors all -j | ${pkgs.jq}/bin/jq '.[1].activeWorkspace.id') = '-1' ]; then
|
||||
hyprctl keyword monitor ",preferred,auto,1"
|
||||
else
|
||||
hyprctl keyword monitor ",preferred,auto,1,mirror,eDP-1"
|
||||
fi
|
||||
'';
|
||||
# Autostart now handled by xdg.autoStart
|
||||
startup = pkgs.writeScriptBin "startup.sh" ''
|
||||
#!${pkgs.stdenv.shell}
|
||||
# uwsm app -- ${pkgs.wl-clip-persist}/bin/wl-clip-persist -c both &
|
||||
'';
|
||||
in
|
||||
{
|
||||
enable = true;
|
||||
systemd.enable = false; # using UWSM
|
||||
|
||||
plugins = with pkgs.hyprlandPlugins; [
|
||||
hyprexpo
|
||||
];
|
||||
|
||||
settings =
|
||||
let
|
||||
inherit (builtins) genList concatLists toString;
|
||||
wpctl = "${pkgs.wireplumber}/bin/wpctl";
|
||||
brightnessctl = "${pkgs.brightnessctl}/bin/brightnessctl";
|
||||
menu = "${config.programs.rofi.package}/bin/rofi -columns 1 -show combi -modes combi -combi-modes \"window,drun,run\"";
|
||||
fileManager = "${pkgs.nautilus}/bin/nautilus";
|
||||
in
|
||||
{
|
||||
"$mod" = "SUPER";
|
||||
exec-once = [
|
||||
"${startup}/bin/startup.sh"
|
||||
];
|
||||
monitor = [
|
||||
"eDP-1, 3840x2400@60,0x0,2"
|
||||
",highres,auto,1"
|
||||
];
|
||||
input = {
|
||||
touchpad.natural_scroll = true;
|
||||
};
|
||||
general = {
|
||||
gaps_in = 5;
|
||||
gaps_out = 10;
|
||||
border_size = 2;
|
||||
"col.active_border" = "rgba(babbf1ee) rgba(f4b8e4ee) 45deg";
|
||||
"col.inactive_border" = "rgba(303446aa)";
|
||||
layout = "dwindle";
|
||||
# Please see https://wiki.hyprland.org/Configuring/Tearing/ before you turn this on
|
||||
allow_tearing = true;
|
||||
};
|
||||
group = {
|
||||
"col.border_active" = "rgba(babbf1ee) rgba(f4b8e4ee) 45deg";
|
||||
"col.border_inactive" = "rgba(232634aa)";
|
||||
|
||||
groupbar = {
|
||||
font_size = 10;
|
||||
height = 18;
|
||||
"col.active" = "rgba(babbf1aa)";
|
||||
"col.inactive" = "rgba(414559aa)";
|
||||
text_color = "rgba(ffffffee)";
|
||||
};
|
||||
};
|
||||
|
||||
plugin.hyprexpo = {
|
||||
workspace_method = "first 1";
|
||||
enable_gesture = true;
|
||||
gesture_positive = false;
|
||||
gesture_fingers = 3;
|
||||
};
|
||||
|
||||
decoration = {
|
||||
rounding = 10;
|
||||
|
||||
blur = {
|
||||
enabled = true;
|
||||
size = 3;
|
||||
passes = 1;
|
||||
};
|
||||
|
||||
shadow = {
|
||||
enabled = true;
|
||||
color = "rgba(1a1a1aee)";
|
||||
range = 4;
|
||||
render_power = 3;
|
||||
};
|
||||
};
|
||||
animations = {
|
||||
enabled = "yes";
|
||||
|
||||
bezier = "myBezier, 0.05, 0.9, 0.1, 1.05";
|
||||
|
||||
animation = [
|
||||
"windows, 1, 7, myBezier"
|
||||
"windowsOut, 1, 7, default, popin 80%"
|
||||
"border, 1, 10, default"
|
||||
"borderangle, 1, 8, default"
|
||||
"fade, 1, 4, default"
|
||||
"workspaces, 1, 4, default"
|
||||
];
|
||||
};
|
||||
dwindle = {
|
||||
preserve_split = "yes";
|
||||
pseudotile = "yes";
|
||||
};
|
||||
|
||||
gestures.workspace_swipe = true;
|
||||
|
||||
misc = {
|
||||
force_default_wallpaper = 2;
|
||||
disable_splash_rendering = true;
|
||||
disable_hyprland_logo = true;
|
||||
disable_autoreload = true;
|
||||
};
|
||||
|
||||
windowrulev2 = [
|
||||
"suppressevent maximize, class:.*"
|
||||
|
||||
"workspace 1 silent, class:^(Element)$"
|
||||
"workspace 1 silent, class:^(discord)$"
|
||||
"group, class:^(Element|discord)$,workspace:1"
|
||||
|
||||
"workspace 2 silent, class:^(firefox)$"
|
||||
"float,class:^(firefox)$,title:^(Picture-in-Picture)$"
|
||||
|
||||
"workspace special:obsidian silent, class:^(obsidian)$"
|
||||
];
|
||||
|
||||
# l -> works when screen is locked
|
||||
# e -> repeats when held
|
||||
bindel = [
|
||||
",XF86AudioRaiseVolume,exec,${wpctl} set-volume @DEFAULT_AUDIO_SINK@ 5%+"
|
||||
",XF86AudioLowerVolume,exec,${wpctl} set-volume @DEFAULT_AUDIO_SINK@ 5%-"
|
||||
",XF86MonBrightnessUp,exec,${brightnessctl} -q s +5%"
|
||||
",XF86MonBrightnessDown,exec,${brightnessctl} -q s 5%-"
|
||||
];
|
||||
|
||||
bindl = [ ",XF86AudioMute, exec,${wpctl} set-mute @DEFAULT_AUDIO_SINK@ toggle" ];
|
||||
|
||||
bind =
|
||||
[
|
||||
"$mod, RETURN, exec, uwsm app -- ${terminal}"
|
||||
"$mod, Q, killactive,"
|
||||
"$mod SHIFT, Q, exec, uwsm stop,"
|
||||
"$mod, E, exec, uwsm app -- ${fileManager}"
|
||||
"$mod, V, togglefloating,"
|
||||
"$mod, D, exec, uwsm app -- ${menu}"
|
||||
"$mod, P, pseudo, # dwindle"
|
||||
"$mod, J, togglesplit, # dwindle"
|
||||
"$mod,m,fullscreen"
|
||||
|
||||
"$mod, L, exec, loginctl lock-session"
|
||||
|
||||
"$mod, space, hyprexpo:expo, toggle"
|
||||
|
||||
# Move focus with arrow keys
|
||||
"$mod, left, movefocus, l"
|
||||
"$mod, right, movefocus, r"
|
||||
"$mod, up, movefocus, u"
|
||||
"$mod, down, movefocus, d"
|
||||
|
||||
# Scratch workspace
|
||||
"$mod, S, togglespecialworkspace, scratch"
|
||||
"$mod SHIFT, S, movetoworkspace, special:scratch"
|
||||
|
||||
# Obsidian Workspace
|
||||
"$mod, O, togglespecialworkspace, obsidian"
|
||||
"$mod SHIFT, O, movetoworkspace, special:obsidian"
|
||||
|
||||
# Groups aka Tabs
|
||||
"$mod,g,togglegroup"
|
||||
"$mod,tab,changegroupactive"
|
||||
|
||||
# PrintScreen
|
||||
",Print,exec,uwsm app -- ${pkgs.grimblast}/bin/grimblast copysave area /home/vivian/cloud/Pictures/Screenshots/$(date +%s).png"
|
||||
# Toggle Mirror for external displays on/off
|
||||
",XF86Display,exec,${toggle_mirror}/bin/toggle_mirror.sh"
|
||||
]
|
||||
++ (
|
||||
# workspaces
|
||||
# binds $mod + [shift +] {1..10} to [move to] workspace {1..10}
|
||||
concatLists (
|
||||
genList (
|
||||
x:
|
||||
let
|
||||
ws =
|
||||
let
|
||||
c = (x + 1) / 10;
|
||||
in
|
||||
toString (x + 1 - (c * 10));
|
||||
in
|
||||
[
|
||||
"$mod, ${ws}, workspace, ${toString (x + 1)}"
|
||||
"$mod SHIFT, ${ws}, movetoworkspacesilent, ${toString (x + 1)}"
|
||||
]
|
||||
) 10
|
||||
)
|
||||
|
||||
);
|
||||
|
||||
# Bind mouse
|
||||
bindm = [
|
||||
# Move/resize windows with mod + LMB/RMB and dragging
|
||||
"$mod, mouse:272, movewindow"
|
||||
"$mod, mouse:273, resizewindow"
|
||||
];
|
||||
};
|
||||
};
|
||||
}
|
17
hosts/thalassa/aoife/home/starship.nix
Normal file
17
hosts/thalassa/aoife/home/starship.nix
Normal file
|
@ -0,0 +1,17 @@
|
|||
{ pkgs, config, ...}:
|
||||
let
|
||||
starshipNerdFont = pkgs.runCommand "starship-nerd-font.toml" { STARSHIP_CACHE = "/tmp"; } ''
|
||||
${config.programs.starship.package}/bin/starship preset nerd-font-symbols > $out
|
||||
'';
|
||||
in{
|
||||
programs.starship = {
|
||||
enable = false;
|
||||
enableZshIntegration = true;
|
||||
enableFishIntegration = true;
|
||||
enableNushellIntegration = true;
|
||||
|
||||
settings = {
|
||||
nix_shell.heuristic = true;
|
||||
} // builtins.fromTOML (builtins.readFile starshipNerdFont);
|
||||
};
|
||||
}
|
125
hosts/thalassa/aoife/home/waybar.css
Normal file
125
hosts/thalassa/aoife/home/waybar.css
Normal file
|
@ -0,0 +1,125 @@
|
|||
/* Catppucin Frappe */
|
||||
@define-color base #303446;
|
||||
@define-color mantle #292c3c;
|
||||
@define-color crust #232634;
|
||||
|
||||
@define-color text #c6d0f5;
|
||||
@define-color subtext0 #a5adce;
|
||||
@define-color subtext1 #b5bfe2;
|
||||
|
||||
@define-color surface0 #414559;
|
||||
@define-color surface1 #51576d;
|
||||
@define-color surface2 #626880;
|
||||
|
||||
@define-color overlay0 #737994;
|
||||
@define-color overlay1 #838ba7;
|
||||
@define-color overlay2 #949cbb;
|
||||
|
||||
@define-color blue #8caaee;
|
||||
@define-color lavender #babbf1;
|
||||
@define-color sapphire #85c1dc;
|
||||
@define-color sky #99d1db;
|
||||
@define-color teal #81c8be;
|
||||
@define-color green #a6d189;
|
||||
@define-color yellow #e5c890;
|
||||
@define-color peach #ef9f76;
|
||||
@define-color maroon #ea999c;
|
||||
@define-color red #e78284;
|
||||
@define-color mauve #ca9ee6;
|
||||
@define-color pink #f4b8e4;
|
||||
@define-color flamingo #eebebe;
|
||||
@define-color rosewater #f2d5cf;
|
||||
|
||||
|
||||
window {
|
||||
border: none;
|
||||
font-family: DejaVuSansM Nerd Font, sans-serif;
|
||||
font-size: 13px;
|
||||
color: @text;
|
||||
}
|
||||
|
||||
window#waybar {
|
||||
color: @text;
|
||||
background-color: rgba(0, 0, 0, 0);
|
||||
transition-property: background-color;
|
||||
transition-duration: 0.5s;
|
||||
transition-duration: .5s;
|
||||
}
|
||||
|
||||
window#waybar.hidden {
|
||||
opacity: 0.2;
|
||||
}
|
||||
|
||||
#workspaces {
|
||||
/* background: @overlay0; */
|
||||
}
|
||||
|
||||
#workspaces button {
|
||||
color: @text;
|
||||
/* background: @background3; */
|
||||
/* margin: 7px 5px 10px 5px; */
|
||||
}
|
||||
|
||||
#workspaces button:hover {
|
||||
background: @surface0;
|
||||
color: @text;
|
||||
}
|
||||
|
||||
#workspaces button.active {
|
||||
color: @crust;
|
||||
background: @overlay2;
|
||||
border: none;
|
||||
}
|
||||
|
||||
#clock,
|
||||
#battery,
|
||||
#network,
|
||||
#power-profiles-daemon,
|
||||
#wireplumber {
|
||||
padding: 0px 20px;
|
||||
border-radius: 8px;
|
||||
margin-left: 5px;
|
||||
color: @crust;
|
||||
}
|
||||
|
||||
#wireplumber {
|
||||
padding: 0px 20px 0px 17px;
|
||||
background-color: @teal;
|
||||
}
|
||||
|
||||
#network {
|
||||
padding: 0px 15px 0px 20px;
|
||||
background-color: @green;
|
||||
}
|
||||
|
||||
#battery {
|
||||
background-color: @lavender;
|
||||
}
|
||||
|
||||
#clock {
|
||||
background-color: @pink;
|
||||
}
|
||||
|
||||
#power-profiles-daemon {
|
||||
background-color: @mauve;
|
||||
}
|
||||
|
||||
@keyframes blink {
|
||||
to {
|
||||
background-color: rgba(30, 34, 42, 0.5);
|
||||
color: #abb2bf;
|
||||
}
|
||||
}
|
||||
|
||||
#battery.critical:not(.charging) {
|
||||
color: #f53c3c;
|
||||
animation-name: blink;
|
||||
animation-duration: 0.5s;
|
||||
animation-timing-function: linear;
|
||||
animation-iteration-count: infinite;
|
||||
animation-direction: alternate;
|
||||
}
|
||||
|
||||
label:focus {
|
||||
background-color: #000000;
|
||||
}
|
82
hosts/thalassa/aoife/home/waybar.nix
Normal file
82
hosts/thalassa/aoife/home/waybar.nix
Normal file
|
@ -0,0 +1,82 @@
|
|||
{ pkgs, config, ... }:
|
||||
let
|
||||
terminal = "${config.programs.kitty.package}/bin/kitty -1";
|
||||
in
|
||||
{
|
||||
programs.waybar = {
|
||||
enable = true;
|
||||
systemd.enable = true;
|
||||
style = ./waybar.css;
|
||||
|
||||
settings = {
|
||||
mainBar = {
|
||||
layer = "top";
|
||||
position = "top";
|
||||
height = 30;
|
||||
modules-left = [ "hyprland/workspaces" ];
|
||||
modules-center = [ "clock" ];
|
||||
modules-right = [
|
||||
"wireplumber"
|
||||
"power-profiles-daemon"
|
||||
"network"
|
||||
"battery"
|
||||
];
|
||||
|
||||
wireplumber = {
|
||||
format = " {volume}%";
|
||||
format-muted = "";
|
||||
on-click = "${pkgs.wireplumber}/bin/wpctl set-mute @DEFAULT_SINK@ toggle";
|
||||
};
|
||||
|
||||
network =
|
||||
let
|
||||
nmtui = pkgs.writeScriptBin "nmtui.sh" ''
|
||||
#!${pkgs.stdenv.shell}
|
||||
unset COLORTERM
|
||||
TERM=xterm-old ${pkgs.networkmanager}/bin/nmtui
|
||||
'';
|
||||
in
|
||||
{
|
||||
format-wifi = " {essid} ({signalStrength}%)";
|
||||
format-ethernet = " {ifname}: {ipaddr}/{cidr}";
|
||||
format-disconnected = " ";
|
||||
tooltip-format = "{ifname}: {ipaddr}";
|
||||
on-click = "${terminal} --execute ${nmtui}/bin/nmtui.sh";
|
||||
};
|
||||
|
||||
power-profiles-daemon = {
|
||||
format = "{icon}";
|
||||
format-icons = {
|
||||
performance = "";
|
||||
balanced = "";
|
||||
power-saver = "";
|
||||
};
|
||||
};
|
||||
|
||||
battery = {
|
||||
states = {
|
||||
warning = 30;
|
||||
critical = 15;
|
||||
};
|
||||
|
||||
format = " {capacity}%";
|
||||
format-discharging = "{icon} {capacity}%";
|
||||
|
||||
format-icons = [
|
||||
""
|
||||
""
|
||||
""
|
||||
""
|
||||
""
|
||||
""
|
||||
""
|
||||
""
|
||||
""
|
||||
""
|
||||
""
|
||||
];
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
}
|
33
hosts/thalassa/aoife/uni.nix
Normal file
33
hosts/thalassa/aoife/uni.nix
Normal file
|
@ -0,0 +1,33 @@
|
|||
# Config options needed for various university courses
|
||||
{ pkgs, lib, ... }:
|
||||
{
|
||||
environment.systemPackages = with pkgs; [
|
||||
esp-generate
|
||||
espflash
|
||||
];
|
||||
|
||||
users.extraGroups.plugdev = { };
|
||||
users.extraUsers.vivian.extraGroups = [
|
||||
"dialout"
|
||||
"plugdev"
|
||||
];
|
||||
|
||||
hardware.saleae-logic.enable = true;
|
||||
|
||||
programs.nix-ld = {
|
||||
enable = true;
|
||||
package = pkgs.nix-ld-rs;
|
||||
libraries = [
|
||||
|
||||
];
|
||||
};
|
||||
|
||||
services.udev.packages = [
|
||||
pkgs.openocd # This should(?) be the same as the probe-rs rules below, but just to be sure
|
||||
(pkgs.writeTextFile {
|
||||
name = "probe-rs-udev";
|
||||
destination = "/etc/udev/rules.d/69-probe-rs.rules";
|
||||
text = builtins.readFile ./69-probe-rs.rules;
|
||||
})
|
||||
];
|
||||
}
|
2
nixos/hosts/README.md
Normal file
2
nixos/hosts/README.md
Normal file
|
@ -0,0 +1,2 @@
|
|||
# NixOS Hosts
|
||||
Each folder here is a separate geographical location, with `thalassa` being for roaming devices like laptops
|
5
nixos/hosts/default.nix
Normal file
5
nixos/hosts/default.nix
Normal file
|
@ -0,0 +1,5 @@
|
|||
{
|
||||
hades = import ./hades;
|
||||
olympus = import ./olympus;
|
||||
thalassa = import ./thalassa;
|
||||
}
|
22
nixos/hosts/hades/_template/configuration.nix
Normal file
22
nixos/hosts/hades/_template/configuration.nix
Normal file
|
@ -0,0 +1,22 @@
|
|||
# Edit this configuration file to define what should be installed on
|
||||
# your system. Help is available in the configuration.nix(5) man page
|
||||
# and in the NixOS manual (accessible by running ‘nixos-help’).
|
||||
|
||||
{ pkgs, ... }:
|
||||
|
||||
{
|
||||
imports = [ ];
|
||||
|
||||
# This value determines the NixOS release from which the default
|
||||
# settings for stateful data, like file locations and database versions
|
||||
# on your system were taken. It‘s perfectly fine and recommended to leave
|
||||
# this value at the release version of the first install of this system.
|
||||
# Before changing this value read the documentation for this option
|
||||
# (e.g. man configuration.nix or on https://nixos.org/nixos/options.html).
|
||||
system.stateVersion = "23.11"; # Did you read the comment?
|
||||
|
||||
# Additional packages
|
||||
environment.systemPackages = with pkgs; [ ];
|
||||
|
||||
networking.firewall.allowedTCPPorts = [ ];
|
||||
}
|
90
nixos/hosts/hades/attic/configuration.nix
Normal file
90
nixos/hosts/hades/attic/configuration.nix
Normal file
|
@ -0,0 +1,90 @@
|
|||
# Edit this configuration file to define what should be installed on
|
||||
# your system. Help is available in the configuration.nix(5) man page
|
||||
# and in the NixOS manual (accessible by running ‘nixos-help’).
|
||||
|
||||
{ pkgs, config, ... }:
|
||||
let vs = config.vault-secrets.secrets;
|
||||
in {
|
||||
imports = [ ];
|
||||
|
||||
# This value determines the NixOS release from which the default
|
||||
# settings for stateful data, like file locations and database versions
|
||||
# on your system were taken. It‘s perfectly fine and recommended to leave
|
||||
# this value at the release version of the first install of this system.
|
||||
# Before changing this value read the documentation for this option
|
||||
# (e.g. man configuration.nix or on https://nixos.org/nixos/options.html).
|
||||
system.stateVersion = "23.11"; # Did you read the comment?
|
||||
|
||||
# Additional packages
|
||||
environment.systemPackages = with pkgs; [ ];
|
||||
|
||||
vault-secrets.secrets.attic = { services = [ "atticd" ]; };
|
||||
|
||||
services.postgresql = {
|
||||
enable = true;
|
||||
package = pkgs.postgresql_15;
|
||||
ensureDatabases = [ "atticd" ];
|
||||
ensureUsers = [{
|
||||
name = "atticd";
|
||||
ensureDBOwnership = true;
|
||||
}];
|
||||
|
||||
};
|
||||
|
||||
services.atticd = {
|
||||
enable = true;
|
||||
|
||||
credentialsFile = "${vs.attic}/environment";
|
||||
|
||||
settings = {
|
||||
listen = "[::]:8080";
|
||||
allowed-hosts = [ "attic.xirion.net" ];
|
||||
api-endpoint = "https://attic.xirion.net/";
|
||||
require-proof-of-possession = false;
|
||||
|
||||
garbage-collection = {
|
||||
interval = "12 hours";
|
||||
default-retention-period = "1 month";
|
||||
};
|
||||
|
||||
compression = {
|
||||
type = "zstd";
|
||||
level = 8;
|
||||
};
|
||||
|
||||
database.url = "postgresql://atticd?host=/run/postgresql";
|
||||
|
||||
storage = {
|
||||
type = "s3";
|
||||
region = "hades";
|
||||
bucket = "attic";
|
||||
endpoint = "http://garage.hades:3900";
|
||||
};
|
||||
|
||||
# Data chunking
|
||||
#
|
||||
# Warning: If you change any of the values here, it will be
|
||||
# difficult to reuse existing chunks for newly-uploaded NARs
|
||||
# since the cutpoints will be different. As a result, the
|
||||
# deduplication ratio will suffer for a while after the change.
|
||||
chunking = {
|
||||
# The minimum NAR size to trigger chunking
|
||||
#
|
||||
# If 0, chunking is disabled entirely for newly-uploaded NARs.
|
||||
# If 1, all NARs are chunked.
|
||||
nar-size-threshold = 64 * 1024; # 64 KiB
|
||||
|
||||
# The preferred minimum size of a chunk, in bytes
|
||||
min-size = 16 * 1024; # 16 KiB
|
||||
|
||||
# The preferred average size of a chunk, in bytes
|
||||
avg-size = 64 * 1024; # 64 KiB
|
||||
|
||||
# The preferred maximum size of a chunk, in bytes
|
||||
max-size = 256 * 1024; # 256 KiB
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
networking.firewall.allowedTCPPorts = [ 8080 ];
|
||||
}
|
20
nixos/hosts/hades/bastion/configuration.nix
Normal file
20
nixos/hosts/hades/bastion/configuration.nix
Normal file
|
@ -0,0 +1,20 @@
|
|||
{ pkgs, lib, ... }: {
|
||||
networking.interfaces.eth0.useDHCP = true;
|
||||
|
||||
# mosh ssh
|
||||
programs.mosh.enable = true;
|
||||
|
||||
environment.systemPackages = with pkgs; [
|
||||
rustup
|
||||
vault
|
||||
];
|
||||
|
||||
environment.noXlibs = lib.mkForce false;
|
||||
|
||||
system.stateVersion = "22.11";
|
||||
|
||||
programs.gnupg.agent = {
|
||||
enable = true;
|
||||
pinentryFlavor = "curses";
|
||||
};
|
||||
}
|
14
nixos/hosts/hades/bazarr/configuration.nix
Normal file
14
nixos/hosts/hades/bazarr/configuration.nix
Normal file
|
@ -0,0 +1,14 @@
|
|||
_: {
|
||||
system.stateVersion = "22.11";
|
||||
networking.interfaces.eth0.useDHCP = true;
|
||||
|
||||
fileSystems."/mnt/storage" = {
|
||||
device = "storage:/mnt/storage";
|
||||
fsType = "nfs";
|
||||
};
|
||||
|
||||
services.bazarr = {
|
||||
enable = true;
|
||||
openFirewall = true;
|
||||
};
|
||||
}
|
38
nixos/hosts/hades/database/configuration.nix
Normal file
38
nixos/hosts/hades/database/configuration.nix
Normal file
|
@ -0,0 +1,38 @@
|
|||
{ config, pkgs, ... }:
|
||||
let vs = config.vault-secrets.secrets;
|
||||
in {
|
||||
|
||||
system.stateVersion = "21.05";
|
||||
networking.interfaces.eth0.useDHCP = true;
|
||||
|
||||
networking.firewall.allowedTCPPorts = [ config.services.postgresql.port ];
|
||||
|
||||
vault-secrets.secrets.database = {
|
||||
user = "postgres";
|
||||
group = "postgres";
|
||||
services = [ "postgresql" ];
|
||||
};
|
||||
|
||||
services.postgresql = {
|
||||
enable = true;
|
||||
package = pkgs.postgresql_13;
|
||||
enableTCPIP = true;
|
||||
extraPlugins = [ ];
|
||||
initdbArgs = [
|
||||
"--encoding 'UTF-8'"
|
||||
"--lc-collate='en_US.UTF-8'"
|
||||
"--lc-ctype='en_US.UTF-8'"
|
||||
];
|
||||
authentication = ''
|
||||
host all all 192.168.0.1/23 md5
|
||||
host all all 10.10.10.0/24 md5
|
||||
'';
|
||||
initialScript = "${vs.database}/initialScript";
|
||||
settings = {
|
||||
shared_preload_libraries = "pg_stat_statements";
|
||||
"pg_stat_statements.track" = "all";
|
||||
"pg_stat_statements.max" = 10000;
|
||||
track_activity_query_size = 2048;
|
||||
};
|
||||
};
|
||||
}
|
188
nixos/hosts/hades/default.nix
Normal file
188
nixos/hosts/hades/default.nix
Normal file
|
@ -0,0 +1,188 @@
|
|||
{
|
||||
"opnsense" = {
|
||||
ip = "192.168.0.1";
|
||||
mac = "00:0d:b9:56:b1:d8";
|
||||
nix = false;
|
||||
};
|
||||
"nyx-bmc" = {
|
||||
ip = "192.168.0.99";
|
||||
mac = "d0:50:99:f3:fa:42";
|
||||
nix = false;
|
||||
};
|
||||
"nyx" = {
|
||||
ip = "192.168.0.100";
|
||||
mac = "d0:50:99:de:99:4c";
|
||||
nix = false;
|
||||
};
|
||||
"unifi" = {
|
||||
ip = "192.168.0.101";
|
||||
mac = "5a:00:b7:6c:d1:e2";
|
||||
};
|
||||
"jellyfin" = {
|
||||
ip = "192.168.0.102";
|
||||
mac = "C6:7E:2B:DC:09:CC";
|
||||
exposes.jellyfin = {
|
||||
domain = "jf.0x76.dev";
|
||||
port = 8096;
|
||||
};
|
||||
};
|
||||
"vault-0" = {
|
||||
ip = "192.168.0.103";
|
||||
mac = "7A:14:15:ED:D1:E6";
|
||||
tags = [ "vault" ];
|
||||
};
|
||||
"pmm" = {
|
||||
ip = "192.168.0.104";
|
||||
mac = "7A:A3:59:1D:69:07";
|
||||
};
|
||||
"overseerr" = {
|
||||
ip = "192.168.0.105";
|
||||
mac = "8E:21:7F:88:3A:83";
|
||||
exposes.requests = {
|
||||
domain = "requests.xirion.net";
|
||||
port = 5055;
|
||||
};
|
||||
};
|
||||
"tautulli" = {
|
||||
ip = "192.168.0.106";
|
||||
mac = "BE:30:DB:F8:C6:55";
|
||||
exposes.tautulli = {
|
||||
domain = "tautulli.xirion.net";
|
||||
port = 8080;
|
||||
};
|
||||
};
|
||||
"dns-1" = {
|
||||
ip = "192.168.0.107";
|
||||
mac = "12:84:3B:E0:8A:A0";
|
||||
profile = "dns";
|
||||
tags = [ "networking" ];
|
||||
};
|
||||
"dns-2" = {
|
||||
ip = "192.168.0.108";
|
||||
mac = "56:C3:9C:A5:41:81";
|
||||
profile = "dns";
|
||||
tags = [ "networking" ];
|
||||
};
|
||||
# ip = "192.168.0.109";
|
||||
# ip = "192.168.0.110";
|
||||
"rtorrent" = {
|
||||
ip = "192.168.0.111";
|
||||
mac = "7a:5f:9b:62:49:91";
|
||||
};
|
||||
"cshub2" = {
|
||||
ip = "192.168.0.113";
|
||||
mac = "26:8c:f6:f4:21:76";
|
||||
nix = false;
|
||||
};
|
||||
"bastion" = {
|
||||
ip = "192.168.0.114";
|
||||
mac = "66:14:8e:b2:50:c4";
|
||||
};
|
||||
"storage" = {
|
||||
ip = "192.168.0.115";
|
||||
mac = "00:50:56:91:0d:69";
|
||||
type = "vm";
|
||||
};
|
||||
"immich" = {
|
||||
ip = "192.168.0.116";
|
||||
mac = "06:8a:8e:3e:43:45";
|
||||
};
|
||||
"mail" = {
|
||||
ip = "192.168.0.118";
|
||||
mac = "00:50:56:91:3b:03";
|
||||
nix = false;
|
||||
};
|
||||
"bazarr" = {
|
||||
ip = "192.168.0.119";
|
||||
mac = "DE:7C:32:7E:DD:A1";
|
||||
};
|
||||
"plex2" = {
|
||||
ip = "192.168.0.120";
|
||||
mac = "A2:2C:65:32:54:8A";
|
||||
profile = "plex";
|
||||
};
|
||||
"garage" = {
|
||||
ip = "192.168.0.121";
|
||||
mac = "3A:19:32:A2:F8:96";
|
||||
exposes = {
|
||||
garage = {
|
||||
domain = "g.xirion.net";
|
||||
port = 3900;
|
||||
};
|
||||
fedi-media = {
|
||||
domain = "fedi-media.xirion.net";
|
||||
port = 3902;
|
||||
};
|
||||
};
|
||||
};
|
||||
"nginx" = {
|
||||
ip = "192.168.0.122";
|
||||
mac = "52:8E:72:31:AE:AC";
|
||||
};
|
||||
"reverseproxy" = {
|
||||
ip = "192.168.0.123";
|
||||
mac = "00:0c:29:9b:10:82";
|
||||
nix = false;
|
||||
};
|
||||
"pve-storage" = {
|
||||
ip = "192.168.0.124";
|
||||
mac = "d4:3d:7e:35:0a:bf";
|
||||
nix = false;
|
||||
};
|
||||
"lucy" = {
|
||||
ip = "192.168.0.125";
|
||||
mac = "5E:36:04:2D:38:DF";
|
||||
type = "vm";
|
||||
};
|
||||
# ip = "192.168.0.126";
|
||||
# ip = "192.168.0.127";
|
||||
"attic" = {
|
||||
ip = "192.168.0.128";
|
||||
mac = "9E:AF:E9:FE:D4:D9";
|
||||
exposes.attic = {
|
||||
domain = "attic.xirion.net";
|
||||
port = 8080;
|
||||
};
|
||||
};
|
||||
"hassio" = {
|
||||
ip = "192.168.0.129";
|
||||
mac = "e6:80:32:fb:00:75";
|
||||
exposes.ha = {
|
||||
domain = "ha.xirion.net";
|
||||
port = 8123;
|
||||
};
|
||||
nix = false;
|
||||
};
|
||||
# ip = "192.168.0.130";
|
||||
# ip = "192.168.0.131";
|
||||
"tudelft" = {
|
||||
ip = "192.168.0.132";
|
||||
mac = "AE:B3:93:4B:04:76";
|
||||
exposes = {
|
||||
grist = {
|
||||
domain = "grist.tud.0x76.dev";
|
||||
port = 8484;
|
||||
};
|
||||
dex = {
|
||||
domain = "dex.tud.0x76.dev";
|
||||
port = 8000;
|
||||
};
|
||||
};
|
||||
nix = false;
|
||||
};
|
||||
"mastodon" = {
|
||||
ip = "192.168.0.138";
|
||||
mac = "52:60:8a:06:86:9c";
|
||||
};
|
||||
# ip = "192.168.0.140";
|
||||
"archlinux" = {
|
||||
ip = "192.168.0.200";
|
||||
mac = "00:0c:29:e4:0d:17";
|
||||
nix = false;
|
||||
};
|
||||
"HP781AFC" = {
|
||||
ip = "192.168.0.201";
|
||||
mac = "f4:ce:46:78:1a:fc";
|
||||
nix = false;
|
||||
};
|
||||
}
|
56
nixos/hosts/hades/dns/configuration.nix
Normal file
56
nixos/hosts/hades/dns/configuration.nix
Normal file
|
@ -0,0 +1,56 @@
|
|||
{ pkgs, ... }: {
|
||||
imports = [ ];
|
||||
|
||||
# This value determines the NixOS release from which the default
|
||||
# settings for stateful data, like file locations and database versions
|
||||
# on your system were taken. It‘s perfectly fine and recommended to leave
|
||||
# this value at the release version of the first install of this system.
|
||||
# Before changing this value read the documentation for this option
|
||||
# (e.g. man configuration.nix or on https://nixos.org/nixos/options.html).
|
||||
system.stateVersion = "23.05"; # Did you read the comment?
|
||||
|
||||
# Additional packages
|
||||
environment.systemPackages = with pkgs; [ dig dogdns ];
|
||||
|
||||
services.v.dns = {
|
||||
enable = true;
|
||||
openFirewall = true;
|
||||
mode = "server";
|
||||
};
|
||||
|
||||
services.unbound.settings.server = {
|
||||
local-zone = [
|
||||
"xirion.net typetransparent"
|
||||
"attic.xirion.net typetransparent"
|
||||
"o.xirion.net typetransparent"
|
||||
"attic.xirion.net typetransparent"
|
||||
"g.xirion.net typetransparent"
|
||||
"fedi-media.xirion.net typetransparent"
|
||||
"hades.xirion.net typetransparent"
|
||||
"requests.xirion.net typetransparent"
|
||||
"ha.xirion.net typetransparent"
|
||||
"mail.xirion.net typetransparent"
|
||||
"plex.xirion.net typetransparent"
|
||||
"fedi.xirion.net typetransparent"
|
||||
"grist.tud.0x76.dev typetransparent"
|
||||
"dex.tud.0x76.dev typetransparent"
|
||||
];
|
||||
|
||||
local-data = [
|
||||
''"xirion.net A 192.168.0.122"''
|
||||
''"attic.xirion.net A 192.168.0.122"''
|
||||
''"hades.xirion.net A 192.168.0.122"''
|
||||
''"o.xirion.net A 192.168.0.122"''
|
||||
''"attic.xirion.net A 192.168.0.122"''
|
||||
''"g.xirion.net A 192.168.0.122"''
|
||||
''"fedi-media.xirion.net A 192.168.0.122"''
|
||||
''"requests.xirion.net A 192.168.0.122"''
|
||||
''"ha.xirion.net A 192.168.0.122"''
|
||||
''"mail.xirion.net A 192.168.0.122"''
|
||||
''"plex.xirion.net A 192.168.0.122"''
|
||||
''"fedi.xirion.net A 192.168.0.122"''
|
||||
''"grist.tud.0x76.dev A 192.168.0.122"''
|
||||
''"dex.tud.0x76.dev A 192.168.0.122"''
|
||||
];
|
||||
};
|
||||
}
|
53
nixos/hosts/hades/garage/configuration.nix
Normal file
53
nixos/hosts/hades/garage/configuration.nix
Normal file
|
@ -0,0 +1,53 @@
|
|||
# Edit this configuration file to define what should be installed on
|
||||
# your system. Help is available in the configuration.nix(5) man page
|
||||
# and in the NixOS manual (accessible by running ‘nixos-help’).
|
||||
|
||||
{ pkgs, config, ... }:
|
||||
let vs = config.vault-secrets.secrets;
|
||||
in {
|
||||
imports = [ ];
|
||||
|
||||
vault-secrets.secrets.garage = { };
|
||||
|
||||
# This value determines the NixOS release from which the default
|
||||
# settings for stateful data, like file locations and database versions
|
||||
# on your system were taken. It‘s perfectly fine and recommended to leave
|
||||
# this value at the release version of the first install of this system.
|
||||
# Before changing this value read the documentation for this option
|
||||
# (e.g. man configuration.nix or on https://nixos.org/nixos/options.html).
|
||||
system.stateVersion = "23.11"; # Did you read the comment?
|
||||
|
||||
# Additional packages
|
||||
environment.systemPackages = with pkgs; [ ];
|
||||
|
||||
networking.firewall.allowedTCPPorts = [ 3900 3901 3902 ];
|
||||
|
||||
# Defines rpc_secret
|
||||
systemd.services.garage.serviceConfig.EnvironmentFile = [ "${vs.garage}/environment" ];
|
||||
|
||||
services.garage = {
|
||||
enable = true;
|
||||
package = pkgs.garage_0_9;
|
||||
settings = {
|
||||
db_engine = "lmdb"; # Recommended for mastodon
|
||||
replication_mode = "1";
|
||||
compression_level = 0;
|
||||
|
||||
# For inter-node comms
|
||||
rpc_bind_addr = "[::]:3901";
|
||||
rpc_public_addr = "${config.meta.ipv4}:3901";
|
||||
|
||||
# Standard S3 api endpoint
|
||||
s3_api = {
|
||||
s3_region = "hades";
|
||||
api_bind_addr = "[::]:3900";
|
||||
};
|
||||
|
||||
# Static file serve endpoint
|
||||
s3_web = {
|
||||
bind_addr = "[::]:3902";
|
||||
root_domain = "g.xirion.net";
|
||||
};
|
||||
};
|
||||
};
|
||||
}
|
73
nixos/hosts/hades/immich/configuration.nix
Normal file
73
nixos/hosts/hades/immich/configuration.nix
Normal file
|
@ -0,0 +1,73 @@
|
|||
# Edit this configuration file to define what should be installed on
|
||||
# your system. Help is available in the configuration.nix(5) man page
|
||||
# and in the NixOS manual (accessible by running ‘nixos-help’).
|
||||
|
||||
{ pkgs, config, ... }:
|
||||
let
|
||||
# https://github.com/immich-app/immich/releases
|
||||
# version = "1.55.1";
|
||||
dataDir = "/var/lib/immich";
|
||||
in {
|
||||
imports = [ ];
|
||||
|
||||
# This value determines the NixOS release from which the default
|
||||
# settings for stateful data, like file locations and database versions
|
||||
# on your system were taken. It‘s perfectly fine and recommended to leave
|
||||
# this value at the release version of the first install of this system.
|
||||
# Before changing this value read the documentation for this option
|
||||
# (e.g. man configuration.nix or on https://nixos.org/nixos/options.html).
|
||||
system.stateVersion = "23.05"; # Did you read the comment?
|
||||
|
||||
# Additional packages
|
||||
environment.systemPackages = with pkgs; [ ];
|
||||
|
||||
# TODO: https://github.com/suderman/nixos/tree/main/modules/nixos/immich
|
||||
|
||||
fileSystems."/mnt/storage" = {
|
||||
device = "storage:/mnt/storage";
|
||||
fsType = "nfs";
|
||||
};
|
||||
ids = {
|
||||
# Unused uid/gid snagged from this list:
|
||||
# https://github.com/NixOS/nixpkgs/blob/master/nixos/modules/misc/ids.nix
|
||||
uids.immich = 911;
|
||||
gids.immich = 911;
|
||||
};
|
||||
users = {
|
||||
groups = {
|
||||
photos = { };
|
||||
immich = { gid = config.ids.gids.immich; };
|
||||
};
|
||||
|
||||
users.immich = {
|
||||
isSystemUser = true;
|
||||
group = "photos";
|
||||
description = "Immich daemon user";
|
||||
home = dataDir;
|
||||
uid = config.ids.uids.immich;
|
||||
};
|
||||
};
|
||||
|
||||
# Postgres database configuration
|
||||
services.postgresql = {
|
||||
enable = true;
|
||||
|
||||
package = pkgs.postgresql_15;
|
||||
|
||||
ensureUsers = [{
|
||||
name = "immich";
|
||||
ensureDBOwnership = true;
|
||||
}];
|
||||
ensureDatabases = [ "immich" ];
|
||||
|
||||
# Allow connections from any docker IP addresses
|
||||
authentication = ''
|
||||
host immich immich 172.16.0.0/12 md5
|
||||
host all all 127.0.0.1/32 ident
|
||||
'';
|
||||
|
||||
};
|
||||
|
||||
# Allow docker containers to connect
|
||||
networking.firewall.allowedTCPPorts = [ config.services.postgresql.port ];
|
||||
}
|
59
nixos/hosts/hades/jellyfin/configuration.nix
Normal file
59
nixos/hosts/hades/jellyfin/configuration.nix
Normal file
|
@ -0,0 +1,59 @@
|
|||
# Edit this configuration file to define what should be installed on
|
||||
# your system. Help is available in the configuration.nix(5) man page
|
||||
# and in the NixOS manual (accessible by running ‘nixos-help’).
|
||||
|
||||
{ pkgs, ... }:
|
||||
|
||||
{
|
||||
imports = [ ];
|
||||
|
||||
# This value determines the NixOS release from which the default
|
||||
# settings for stateful data, like file locations and database versions
|
||||
# on your system were taken. It‘s perfectly fine and recommended to leave
|
||||
# this value at the release version of the first install of this system.
|
||||
# Before changing this value read the documentation for this option
|
||||
# (e.g. man configuration.nix or on https://nixos.org/nixos/options.html).
|
||||
system.stateVersion = "23.11"; # Did you read the comment?
|
||||
|
||||
boot.tmp.useTmpfs = true;
|
||||
|
||||
# Additional packages
|
||||
environment.systemPackages = with pkgs; [ ];
|
||||
|
||||
fileSystems."/mnt/storage" = {
|
||||
device = "storage:/mnt/storage";
|
||||
fsType = "nfs";
|
||||
};
|
||||
|
||||
services.jellyfin = {
|
||||
enable = true;
|
||||
openFirewall = true;
|
||||
};
|
||||
|
||||
users.groups.watchstate = { };
|
||||
users.users.watchstate = {
|
||||
isSystemUser = true;
|
||||
group = "watchstate";
|
||||
};
|
||||
|
||||
systemd.tmpfiles.rules =
|
||||
[ "d '/var/lib/watchstate' 0755 watchstate watchstate -" ];
|
||||
|
||||
networking.firewall.allowedTCPPorts = [ 8080 ];
|
||||
|
||||
# Managed imperatively through its CLI
|
||||
virtualisation.oci-containers.containers.watchstate = {
|
||||
image = "ghcr.io/arabcoders/watchstate:latest";
|
||||
extraOptions = [ "--pull=newer" ];
|
||||
user = "0:0";
|
||||
environment = {
|
||||
WS_TZ = "Europe/Amsterdam";
|
||||
WS_CRON_IMPORT = "1";
|
||||
WS_CRON_EXPORT = "1";
|
||||
WS_CRON_PROGRESS = "1";
|
||||
};
|
||||
ports = [ "8080:8080" ];
|
||||
volumes = [ "/var/lib/watchstate:/config:rw" ];
|
||||
};
|
||||
|
||||
}
|
76
nixos/hosts/hades/lucy/configuration.nix
Normal file
76
nixos/hosts/hades/lucy/configuration.nix
Normal file
|
@ -0,0 +1,76 @@
|
|||
# Edit this configuration file to define what should be installed on
|
||||
# your system. Help is available in the configuration.nix(5) man page
|
||||
# and in the NixOS manual (accessible by running `nixos-help`).
|
||||
|
||||
{ pkgs, ... }:
|
||||
# let
|
||||
# Redefining the package instead of overriding as overriding GoModules seems broken
|
||||
# see: https://github.com/NixOS/nixpkgs/issues/86349
|
||||
# _nuclei-latest = pkgs.buildGoModule rec {
|
||||
# pname = "nuclei";
|
||||
# version = "2.9.2";
|
||||
#
|
||||
# src = pkgs.fetchFromGitHub {
|
||||
# owner = "projectdiscovery";
|
||||
# repo = pname;
|
||||
# rev = "1f9a065713924b28b203e2108fc76d7a1ec49068";
|
||||
# hash = "sha256-QiegMoBy0gZMyQl2MRAwR14zXeh8wvVonyETdAzHbj0=";
|
||||
# };
|
||||
#
|
||||
# vendorHash = "sha256-0JNwoBqLKH1F/0Tr8o35gCSNT/2plIjIQvZRuzAZ5P8=";
|
||||
#
|
||||
# modRoot = "./v2";
|
||||
# subPackages = [ "cmd/nuclei/" ];
|
||||
#
|
||||
# doCheck = false;
|
||||
# };
|
||||
# in {
|
||||
{
|
||||
imports = [ ./hardware-configuration.nix ];
|
||||
|
||||
# This value determines the NixOS release from which the default
|
||||
# settings for stateful data, like file locations and database versions
|
||||
# on your system were taken. It's perfectly fine and recommended to leave
|
||||
# this value at the release version of the first install of this system.
|
||||
# Before changing this value read the documentation for this option
|
||||
# (e.g. man configuration.nix or on https://nixos.org/nixos/options.html).
|
||||
system.stateVersion = "23.05"; # Did you read the comment?
|
||||
|
||||
# Additional packages
|
||||
environment.systemPackages = with pkgs; [ jq wget jre8 ];
|
||||
boot.loader = {
|
||||
|
||||
systemd-boot.enable = true;
|
||||
efi.canTouchEfiVariables = true;
|
||||
efi.efiSysMountPoint = "/boot";
|
||||
};
|
||||
|
||||
networking.firewall = {
|
||||
enable = true;
|
||||
allowedTCPPorts = [ 25565 ];
|
||||
};
|
||||
users = {
|
||||
extraUsers = {
|
||||
|
||||
laura.extraGroups = [ "wheel" ];
|
||||
vivian.extraGroups = [ "wheel" ];
|
||||
|
||||
julia = {
|
||||
isNormalUser = true;
|
||||
shell = pkgs.zsh;
|
||||
|
||||
openssh.authorizedKeys.keys = [
|
||||
"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIKTvqk+CJG4VwN8wg3H1ZdbUVj1JuX7RYKH1ewRKfCPv julia@juliadijkstraarch"
|
||||
# Below is Evelyn's keys
|
||||
"ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDnZSVdqSybDwVooSZ+SGFM0YNu15sO/jgVqCBGDm33wj0fML5T4oviUrY6yABh+eAgy/NAztgM7+6L8Hlze5DBeMwNAvj9gr9QSzUetW0iqCscZJ8dDbW30O9449gw2JY/XZzcFMZAP5QEQGEgG/6QQ3yRwA3DMCsGhQQ37l/aS+RsKYq3ZSN4f1nFJCrm397QB8r+bhaexufXqwumxe8rlefoUNNVnmu54FA8Pc3jSdsWT4s/3mqF6NiRa53w13SBWyS+zopCy1tTSnRszgAkldpE7Vft/QnmpFavAWHzpfArv/uFXQ3fx5Cj5t70zB6VJEtaBxhdKXeQUFBCn7fmwfjV0Un9b8jLW94uDhDD3059trhMvJvqKebuqyZe74MTZH0IC3IobpSb9fHHvxuRwUQOMkkJmjv1p2y2R6v7s2tA1sZlIEBmRDvZcKo4hPBe6q13OePV3O8KAFzCmPBIfE6kQ/nLc+3k9OjFWFTshdDXUYpSVGjNrv/IanCXbEs="
|
||||
"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIA0KA0uOoLXUN4LhU7LgtSk0atWyPlEz5LA8dIXs9xTl"
|
||||
|
||||
"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIIfooZjMWXvXZu1ReOEACDZ0TMb2WJRBSOLlWE8y6fUh victor@aoife"
|
||||
];
|
||||
|
||||
extraGroups = [ "mc" "wheel" ];
|
||||
};
|
||||
};
|
||||
groups.mc = { };
|
||||
};
|
||||
}
|
44
nixos/hosts/hades/lucy/hardware-configuration.nix
Normal file
44
nixos/hosts/hades/lucy/hardware-configuration.nix
Normal file
|
@ -0,0 +1,44 @@
|
|||
# Do not modify this file! It was generated by ‘nixos-generate-config’
|
||||
# and may be overwritten by future invocations. Please make changes
|
||||
# to /etc/nixos/configuration.nix instead.
|
||||
{ lib, modulesPath, ... }:
|
||||
|
||||
{
|
||||
imports = [ (modulesPath + "/profiles/qemu-guest.nix") ];
|
||||
boot = {
|
||||
|
||||
initrd.availableKernelModules = [
|
||||
"uhci_hcd"
|
||||
"ehci_pci"
|
||||
"ahci"
|
||||
"virtio_pci"
|
||||
"virtio_scsi"
|
||||
"sd_mod"
|
||||
"sr_mod"
|
||||
];
|
||||
initrd.kernelModules = [ ];
|
||||
kernelModules = [ ];
|
||||
extraModulePackages = [ ];
|
||||
};
|
||||
|
||||
fileSystems."/" = {
|
||||
device = "/dev/disk/by-uuid/749c02fd-209d-4974-917e-38b749d10ec2";
|
||||
fsType = "ext4";
|
||||
};
|
||||
|
||||
fileSystems."/boot" = {
|
||||
device = "/dev/disk/by-uuid/D021-72EB";
|
||||
fsType = "vfat";
|
||||
};
|
||||
|
||||
swapDevices = [ ];
|
||||
|
||||
# Enables DHCP on each ethernet and wireless interface. In case of scripted networking
|
||||
# (the default) this is the recommended approach. When using systemd-networkd it's
|
||||
# still possible to use this option, but it's recommended to use it in conjunction
|
||||
# with explicit per-interface declarations with `networking.interfaces.<interface>.useDHCP`.
|
||||
networking.useDHCP = lib.mkDefault true;
|
||||
# networking.interfaces.enp6s18.useDHCP = lib.mkDefault true
|
||||
|
||||
nixpkgs.hostPlatform = lib.mkDefault "x86_64-linux";
|
||||
}
|
111
nixos/hosts/hades/mastodon/configuration.nix
Normal file
111
nixos/hosts/hades/mastodon/configuration.nix
Normal file
|
@ -0,0 +1,111 @@
|
|||
{ config, pkgs, lib, ... }:
|
||||
let
|
||||
vs = config.vault-secrets.secrets;
|
||||
cfg = config.services.mastodon;
|
||||
in {
|
||||
system.stateVersion = "21.05";
|
||||
# Use DHCP with static leases
|
||||
networking.interfaces.eth0.useDHCP = true;
|
||||
|
||||
# Better cache hits
|
||||
environment.noXlibs = lib.mkForce false;
|
||||
services = {
|
||||
elasticsearch = {
|
||||
enable = true;
|
||||
cluster_name = "mastodon-es";
|
||||
package = pkgs.elasticsearch7;
|
||||
};
|
||||
|
||||
postgresql = {
|
||||
enable = true;
|
||||
package = pkgs.postgresql_16;
|
||||
settings = {
|
||||
shared_preload_libraries = "pg_stat_statements";
|
||||
"pg_stat_statements.track" = "all";
|
||||
"pg_stat_statements.max" = 10000;
|
||||
track_activity_query_size = 2048;
|
||||
};
|
||||
# The rest of the database setup is handled by mastodon
|
||||
};
|
||||
|
||||
mastodon = {
|
||||
enable = true;
|
||||
package = pkgs.v.glitch-soc;
|
||||
streamingProcesses = 3;
|
||||
webPort = 55001;
|
||||
enableUnixSocket = false;
|
||||
localDomain = "xirion.net";
|
||||
trustedProxy = "192.168.0.122";
|
||||
mediaAutoRemove = {
|
||||
enable = true;
|
||||
olderThanDays = 30;
|
||||
startAt = "daily";
|
||||
};
|
||||
|
||||
configureNginx = false;
|
||||
|
||||
redis.createLocally = true;
|
||||
|
||||
elasticsearch = {
|
||||
host = "127.0.0.1";
|
||||
inherit (config.services.elasticsearch) port;
|
||||
};
|
||||
|
||||
database.createLocally = true;
|
||||
|
||||
smtp = {
|
||||
createLocally = false;
|
||||
fromAddress = "mastodon@xirion.net";
|
||||
host = "mail.0x76.dev";
|
||||
user = "mastodon@xirion.net";
|
||||
authenticate = true;
|
||||
port = 587;
|
||||
passwordFile = "${vs.mastodon}/smtp-password";
|
||||
};
|
||||
|
||||
extraConfig = {
|
||||
BIND = "0.0.0.0";
|
||||
SINGLE_USER_MODE = "false";
|
||||
EMAIL_DOMAIN_ALLOWLIST = "xirion.net";
|
||||
DEFAULT_LOCALE = "en";
|
||||
|
||||
WEB_DOMAIN = "fedi.xirion.net";
|
||||
ALTERNATE_DOMAINS = "meowy.tech";
|
||||
|
||||
SMTP_AUTH_METHOD = "plain";
|
||||
SMTP_OPENSSL_VERIFY_MODE = "none";
|
||||
|
||||
RAILS_SERVE_STATIC_FILES = "false";
|
||||
|
||||
AUTHORIZED_FETCH = "true";
|
||||
|
||||
# https://github.com/cybrespace/cybrespace-meta/blob/master/s3.md;
|
||||
# https://shivering-isles.com/Mastodon-and-Amazon-S3
|
||||
S3_ENABLED = "true";
|
||||
S3_REGION = "hades";
|
||||
S3_BUCKET = "mastodon";
|
||||
S3_ENDPOINT = "http://garage.hades:3900";
|
||||
S3_ALIAS_HOST = "fedi-media.xirion.net";
|
||||
|
||||
DEEPL_PLAN = "free";
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
vault-secrets.secrets.mastodon = {
|
||||
services = [ "mastodon-init-dirs" "mastodon" "mastodon-media-autoremove" ];
|
||||
inherit (cfg) user group;
|
||||
};
|
||||
|
||||
# Append the init-dirs script to add AWS/Minio secrets
|
||||
systemd.services.mastodon-init-dirs.script = ''
|
||||
cat >> /var/lib/mastodon/.secrets_env <<EOF
|
||||
AWS_ACCESS_KEY_ID="$(cat ${vs.mastodon}/garageKeyId)"
|
||||
AWS_SECRET_ACCESS_KEY="$(cat ${vs.mastodon}/garageSecretKey)"
|
||||
DEEPL_API_KEY="$(cat ${vs.mastodon}/deeplAPIKey)"
|
||||
EOF
|
||||
'';
|
||||
|
||||
networking.firewall = let cfg = config.services.mastodon;
|
||||
in { allowedTCPPorts = [ cfg.webPort ]; };
|
||||
}
|
17
nixos/hosts/hades/minio/configuration.nix
Normal file
17
nixos/hosts/hades/minio/configuration.nix
Normal file
|
@ -0,0 +1,17 @@
|
|||
{ config, pkgs, ... }:
|
||||
let vs = config.vault-secrets.secrets;
|
||||
in {
|
||||
system.stateVersion = "22.11";
|
||||
|
||||
networking.firewall.allowedTCPPorts = [ 9000 9001 ];
|
||||
|
||||
networking.interfaces.eth0.useDHCP = true;
|
||||
|
||||
vault-secrets.secrets.minio = { };
|
||||
|
||||
services.minio = {
|
||||
enable = true;
|
||||
rootCredentialsFile = "${vs.minio}/environment";
|
||||
package = pkgs.minio_legacy_fs;
|
||||
};
|
||||
}
|
156
nixos/hosts/hades/nginx/configuration.nix
Normal file
156
nixos/hosts/hades/nginx/configuration.nix
Normal file
|
@ -0,0 +1,156 @@
|
|||
# Edit this configuration file to define what should be installed on
|
||||
# your system. Help is available in the configuration.nix(5) man page
|
||||
# and in the NixOS manual (accessible by running ‘nixos-help’).
|
||||
|
||||
{ pkgs, ... }:
|
||||
let
|
||||
proxy = url: {
|
||||
enableACME = true;
|
||||
forceSSL = true;
|
||||
locations."/" = {
|
||||
proxyPass = url;
|
||||
proxyWebsockets = true;
|
||||
};
|
||||
};
|
||||
in {
|
||||
imports = [ ];
|
||||
|
||||
# This value determines the NixOS release from which the default
|
||||
# settings for stateful data, like file locations and database versions
|
||||
# on your system were taken. It‘s perfectly fine and recommended to leave
|
||||
# this value at the release version of the first install of this system.
|
||||
# Before changing this value read the documentation for this option
|
||||
# (e.g. man configuration.nix or on https://nixos.org/nixos/options.html).
|
||||
system.stateVersion = "23.05"; # Did you read the comment?
|
||||
networking.firewall.allowedTCPPorts = [ 80 443 ];
|
||||
security.acme = {
|
||||
|
||||
defaults.email = "vivian@0x76.dev";
|
||||
acceptTerms = true;
|
||||
preliminarySelfsigned = true;
|
||||
};
|
||||
|
||||
services.v.nginx.autoExpose = true;
|
||||
|
||||
services.nginx = {
|
||||
enable = true;
|
||||
recommendedProxySettings = true;
|
||||
recommendedTlsSettings = true;
|
||||
recommendedOptimisation = true;
|
||||
recommendedBrotliSettings = true;
|
||||
clientMaxBodySize = "1024m";
|
||||
|
||||
package = pkgs.nginxMainline;
|
||||
virtualHosts = {
|
||||
"xirion.net" = {
|
||||
enableACME = true;
|
||||
forceSSL = true;
|
||||
locations = {
|
||||
"/".extraConfig = ''
|
||||
add_header Content-Type 'text/html; charset=UTF-8';
|
||||
return 200 'Hello, World!';
|
||||
'';
|
||||
|
||||
# Mastodon federation
|
||||
"= /.well-known/host-meta".extraConfig = ''
|
||||
return 301 https://fedi.xirion.net$request_uri;
|
||||
'';
|
||||
"/.well-known/webfinger".extraConfig = ''
|
||||
add_header Access-Control-Allow-Origin '*';
|
||||
return 301 https://fedi.xirion.net$request_uri;
|
||||
'';
|
||||
};
|
||||
};
|
||||
|
||||
"peepeepoopoo.xirion.net" = proxy
|
||||
"http://tautulli.hades:8080"; # Deprecated but Ricardo has it bookmarked already!
|
||||
|
||||
"plex.xirion.net" = {
|
||||
# Since we want a secure connection, we force SSL
|
||||
forceSSL = true;
|
||||
enableACME = true;
|
||||
|
||||
extraConfig = ''
|
||||
#Some players don't reopen a socket and playback stops totally instead of resuming after an extended pause
|
||||
send_timeout 100m;
|
||||
|
||||
# Why this is important: https://blog.cloudflare.com/ocsp-stapling-how-cloudflare-just-made-ssl-30/
|
||||
ssl_stapling on;
|
||||
ssl_stapling_verify on;
|
||||
|
||||
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
|
||||
ssl_prefer_server_ciphers on;
|
||||
#Intentionally not hardened for security for player support and encryption video streams has a lot of overhead with something like AES-256-GCM-SHA384.
|
||||
ssl_ciphers 'ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:ECDHE-RSA-DES-CBC3-SHA:ECDHE-ECDSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA';
|
||||
|
||||
# Forward real ip and host to Plex
|
||||
proxy_set_header X-Real-IP $remote_addr;
|
||||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||
proxy_set_header X-Forwarded-Proto $scheme;
|
||||
proxy_set_header Host $server_addr;
|
||||
proxy_set_header Referer $server_addr;
|
||||
proxy_set_header Origin $server_addr;
|
||||
|
||||
# Nginx default client_max_body_size is 1MB, which breaks Camera Upload feature from the phones.
|
||||
# Increasing the limit fixes the issue. Anyhow, if 4K videos are expected to be uploaded, the size might need to be increased even more
|
||||
client_max_body_size 100M;
|
||||
|
||||
# Plex headers
|
||||
proxy_set_header X-Plex-Client-Identifier $http_x_plex_client_identifier;
|
||||
proxy_set_header X-Plex-Device $http_x_plex_device;
|
||||
proxy_set_header X-Plex-Device-Name $http_x_plex_device_name;
|
||||
proxy_set_header X-Plex-Platform $http_x_plex_platform;
|
||||
proxy_set_header X-Plex-Platform-Version $http_x_plex_platform_version;
|
||||
proxy_set_header X-Plex-Product $http_x_plex_product;
|
||||
proxy_set_header X-Plex-Token $http_x_plex_token;
|
||||
proxy_set_header X-Plex-Version $http_x_plex_version;
|
||||
proxy_set_header X-Plex-Nocache $http_x_plex_nocache;
|
||||
proxy_set_header X-Plex-Provides $http_x_plex_provides;
|
||||
proxy_set_header X-Plex-Device-Vendor $http_x_plex_device_vendor;
|
||||
proxy_set_header X-Plex-Model $http_x_plex_model;
|
||||
|
||||
# Buffering off send to the client as soon as the data is received from Plex.
|
||||
proxy_redirect off;
|
||||
proxy_buffering off;
|
||||
'';
|
||||
locations."/" = {
|
||||
|
||||
proxyWebsockets = true;
|
||||
proxyPass = "http://plex2.hades:32400/";
|
||||
};
|
||||
};
|
||||
|
||||
"fedi.xirion.net" = {
|
||||
enableACME = true;
|
||||
forceSSL = true;
|
||||
|
||||
root = "${pkgs.v.glitch-soc}/public/";
|
||||
locations = {
|
||||
"/".tryFiles = "$uri @proxy";
|
||||
|
||||
# location ~ ^/(emoji|packs|system/accounts/avatars|system/media_attachments/files) {
|
||||
# add_header Cache-Control "public, max-age=31536000, immutable";
|
||||
# add_header Strict-Transport-Security "max-age=31536000";
|
||||
# try_files $uri @proxy;
|
||||
# }
|
||||
|
||||
# location /sw.js {
|
||||
# add_header Cache-Control "public, max-age=0";
|
||||
# add_header Strict-Transport-Security "max-age=31536000";
|
||||
# try_files $uri @proxy;
|
||||
# }
|
||||
|
||||
"@proxy" = {
|
||||
proxyPass = "http://192.168.0.138:55001";
|
||||
proxyWebsockets = true;
|
||||
};
|
||||
|
||||
"/api/v1/streaming" = {
|
||||
proxyPass = "http://192.168.0.138:55000";
|
||||
proxyWebsockets = true;
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
}
|
2
nixos/hosts/hades/overseerr/README.md
Normal file
2
nixos/hosts/hades/overseerr/README.md
Normal file
|
@ -0,0 +1,2 @@
|
|||
# Overseerr & co.
|
||||
This LXC container hosts all my *arr services and overseerr
|
30
nixos/hosts/hades/overseerr/configuration.nix
Normal file
30
nixos/hosts/hades/overseerr/configuration.nix
Normal file
|
@ -0,0 +1,30 @@
|
|||
# Edit this configuration file to define what should be installed on
|
||||
# your system. Help is available in the configuration.nix(5) man page
|
||||
# and in the NixOS manual (accessible by running ‘nixos-help’).
|
||||
|
||||
{ ... }: {
|
||||
imports = [
|
||||
./radarr.nix
|
||||
./sonarr.nix
|
||||
./lidarr.nix
|
||||
./prowlarr.nix
|
||||
./unpackerr.nix
|
||||
./overseerr.nix
|
||||
];
|
||||
|
||||
# This value determines the NixOS release from which the default
|
||||
# settings for stateful data, like file locations and database versions
|
||||
# on your system were taken. It‘s perfectly fine and recommended to leave
|
||||
# this value at the release version of the first install of this system.
|
||||
# Before changing this value read the documentation for this option
|
||||
# (e.g. man configuration.nix or on https://nixos.org/nixos/options.html).
|
||||
system.stateVersion = "22.11"; # Did you read the comment?
|
||||
|
||||
fileSystems."/mnt/storage" = {
|
||||
device = "storage:/mnt/storage";
|
||||
fsType = "nfs";
|
||||
};
|
||||
|
||||
virtualisation.podman.enable = true;
|
||||
virtualisation.oci-containers.backend = "podman";
|
||||
}
|
31
nixos/hosts/hades/overseerr/lidarr.nix
Normal file
31
nixos/hosts/hades/overseerr/lidarr.nix
Normal file
|
@ -0,0 +1,31 @@
|
|||
{ config, ... }:
|
||||
let vs = config.vault-secrets.secrets;
|
||||
in {
|
||||
networking.firewall.allowedTCPPorts = [ 8686 ];
|
||||
|
||||
vault-secrets.secrets.lidarr = {
|
||||
quoteEnvironmentValues = false; # Needed for docker
|
||||
services = [ "podman-lidarr" ];
|
||||
};
|
||||
|
||||
virtualisation.oci-containers.containers.lidarr = {
|
||||
image = "randomninjaatk/lidarr-extended:latest";
|
||||
extraOptions = [ "--pull=newer" ];
|
||||
environment = {
|
||||
TZ = "Europe/Amsterdam";
|
||||
dlClientSource = "deezer";
|
||||
enableVideoScript = "false";
|
||||
};
|
||||
environmentFiles = [
|
||||
# This file defines arlToken
|
||||
"${vs.lidarr}/environment"
|
||||
];
|
||||
ports = [ "8686:8686" ];
|
||||
volumes = [
|
||||
"/var/lib/lidarr/config:/config"
|
||||
"/var/lib/lidarr/downloads:/downloads-lidarr-extended"
|
||||
"/mnt/storage/plex/Music:/music"
|
||||
"/mnt/storage/plex/MusicVideos:/music-videos"
|
||||
];
|
||||
};
|
||||
}
|
10
nixos/hosts/hades/overseerr/overseerr.nix
Normal file
10
nixos/hosts/hades/overseerr/overseerr.nix
Normal file
|
@ -0,0 +1,10 @@
|
|||
_: {
|
||||
networking.firewall.allowedTCPPorts = [ 5055 ];
|
||||
# TODO: Write NixOS package https://github.com/NixOS/nixpkgs/issues/135885
|
||||
virtualisation.oci-containers.containers.overseerr = {
|
||||
image = "ghcr.io/sct/overseerr:1.33.2";
|
||||
environment = { TZ = "Europe/Amsterdam"; };
|
||||
ports = [ "5055:5055" ];
|
||||
volumes = [ "/var/lib/overseerr/config:/app/config" ];
|
||||
};
|
||||
}
|
11
nixos/hosts/hades/overseerr/prowlarr.nix
Normal file
11
nixos/hosts/hades/overseerr/prowlarr.nix
Normal file
|
@ -0,0 +1,11 @@
|
|||
_: {
|
||||
services.prowlarr = {
|
||||
enable = true;
|
||||
openFirewall = true;
|
||||
};
|
||||
|
||||
virtualisation.oci-containers.containers.flaresolverr = {
|
||||
image = "flaresolverr/flaresolverr:v3.3.10";
|
||||
ports = [ "8191:8191" ];
|
||||
};
|
||||
}
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Reference in a new issue