Compare commits
447 Commits
f0e0cf2772
...
immich
Author | SHA1 | Date | |
---|---|---|---|
7c3ce71006
|
|||
517cb6b040
|
|||
0f5d6947d2
|
|||
da501ec2ef
|
|||
9c961593a9
|
|||
117ed99bd2
|
|||
48c3d713f0
|
|||
697e1c8d43
|
|||
928e0c55e4
|
|||
94c58ca9dc
|
|||
4b44ba69d5
|
|||
1444cb7058
|
|||
ecf1bab2b0
|
|||
8ff1b4d05d
|
|||
6cecf2519e
|
|||
cd616653f3
|
|||
f91c0a33e2
|
|||
e5685cb361
|
|||
1f911b0bcb
|
|||
3338ebf695
|
|||
a685860680
|
|||
e35154a5ea
|
|||
367d5f08a1
|
|||
decc27afd7
|
|||
bdd73f1ef8
|
|||
a3d1b16bec
|
|||
b70b4cd14f
|
|||
36a6ccf65c
|
|||
2def8145b4
|
|||
413869266e
|
|||
0cb2740a86
|
|||
3a77365452
|
|||
8ca88da93a
|
|||
cf6898565b
|
|||
cc97ede099
|
|||
6ddb31c36f
|
|||
b74bfc9683
|
|||
19dbe4c226
|
|||
a0bb510d8d
|
|||
fdfacc0f97
|
|||
6eed6303f2
|
|||
1cb6482106
|
|||
3323f930d3
|
|||
37d56b613e
|
|||
6205824c0d
|
|||
b613c266ed
|
|||
c9fa49b24d
|
|||
064f180528
|
|||
3f36be6cb7
|
|||
ab23bb3b76
|
|||
533397fc21
|
|||
7943e063c2
|
|||
91d66003aa
|
|||
ecf34dbc89
|
|||
08c9a6ae19
|
|||
0c564903ab
|
|||
ad9f4e52ef
|
|||
ccc8ae2a4a
|
|||
a96d5a9aeb
|
|||
d57d70bbbf
|
|||
9af880b03c
|
|||
c6222c90f4
|
|||
e74656a175
|
|||
21feab0889
|
|||
be105b8565
|
|||
5903eb650a
|
|||
c5f796f1ba
|
|||
127ef6353c
|
|||
6dcd2b0139
|
|||
f42442dd0e
|
|||
c589766673
|
|||
24f943410a
|
|||
721b6e0ab8
|
|||
eb76d8a6e2
|
|||
a8d7b6f335
|
|||
1b4363af87
|
|||
c7b5684065
|
|||
0eca54ea4a
|
|||
ef3b98bbd6
|
|||
bdf6e21b7d
|
|||
ba769a2df8
|
|||
4e07ca25aa
|
|||
4efc433766
|
|||
10e55f4ee4
|
|||
314129496d
|
|||
41b40d7b6a
|
|||
c25405ccbf
|
|||
296da660c0
|
|||
9d57be94c6
|
|||
abfb24ca21
|
|||
2f8f03faf8
|
|||
ddaa465004
|
|||
7ae65a4f88
|
|||
c17ee693dc
|
|||
151d60f329
|
|||
430ada2e9e
|
|||
232799c308
|
|||
24a8937c67
|
|||
8a62d11409
|
|||
e82d1cac63
|
|||
734359da5b
|
|||
10b6622997
|
|||
48a3ec34db
|
|||
0658b89565
|
|||
6e76c71c1f
|
|||
f508b33f8d
|
|||
c779c51caf
|
|||
7f7f133bbf
|
|||
832c1bbd08
|
|||
31c747812e
|
|||
162e7bc114
|
|||
8504c06610
|
|||
8505cd07a9
|
|||
5f4ca804f4
|
|||
8e9bdc60f1
|
|||
7cb6beeaf1
|
|||
39e424edd1
|
|||
5013b46ef1
|
|||
816c40ac68
|
|||
18e39b7200
|
|||
457e393ad6
|
|||
1f1e820159
|
|||
f6219785f0
|
|||
b0b923c60c
|
|||
c1fbb4d9ae
|
|||
2e3ba70b1a
|
|||
26c427d416
|
|||
cf4901df40
|
|||
a9eef43182
|
|||
ecec40b18b
|
|||
7dd9a5e22e
|
|||
8d5680811d
|
|||
eddbe239cf
|
|||
4edd8beb35
|
|||
5b1e5c7927
|
|||
696418b486
|
|||
4469175877
|
|||
b13963ea9d
|
|||
b626938feb
|
|||
7b4c5e92b2
|
|||
7bc740e6bb
|
|||
cf6af3635a
|
|||
6a5baec0db
|
|||
681d6606d3
|
|||
9086701c4f
|
|||
b8279e44e6
|
|||
2384fc9224
|
|||
82e7157434
|
|||
614c21488e
|
|||
5594dafa99
|
|||
7c92a7619d
|
|||
5c307e04bd
|
|||
e6fd112b07
|
|||
65d04a0d23
|
|||
6ce8f02bd3
|
|||
9e902e9e7e
|
|||
d492009563
|
|||
cc7bdab4bd
|
|||
baac9ac61f
|
|||
6f66c6a30d
|
|||
bb1bad3579
|
|||
7c66c12e79
|
|||
e07c6a0417
|
|||
bbbb54bfe1
|
|||
5ca4f2e600
|
|||
08bf00bc93
|
|||
dfe272a645
|
|||
f872992c85
|
|||
593440f120
|
|||
d2a0e88004
|
|||
cc09f23831
|
|||
6dfe3f008b
|
|||
a39493b994
|
|||
d3aa405720
|
|||
9362410a60
|
|||
d4b912b60d
|
|||
6cf43e55db
|
|||
890de5191f
|
|||
e62b24fbba
|
|||
37c4fca572
|
|||
858e7ee947
|
|||
38a2ef3da1
|
|||
b86d372600
|
|||
61d39f34b6
|
|||
0d3d283568
|
|||
b28dcff550
|
|||
434abb4189
|
|||
4ef5ebbcf7
|
|||
3054e7bb1e
|
|||
8eef59ae28
|
|||
819ff11d71
|
|||
29a7df3bd6
|
|||
8bc751926c
|
|||
d8464519ba
|
|||
b1e7f1d74b
|
|||
93c060d467
|
|||
2f51df03a6
|
|||
8c120b973d
|
|||
f154431f52
|
|||
9654a14f37
|
|||
641855afbf
|
|||
93c04e83d3
|
|||
92c3bd3a13
|
|||
b16a42732a
|
|||
52bfdd55a2
|
|||
22aa640a4c
|
|||
cb416e35c0
|
|||
dbbf1f2f46
|
|||
aa5ac9b55d
|
|||
80e4c58d2f
|
|||
19b1b463f7
|
|||
2dfb394d31
|
|||
cebbd64bc1
|
|||
7f82ee9300
|
|||
d921134b48
|
|||
2722826b76
|
|||
4ca00f7717
|
|||
5726e8ad28
|
|||
d4a48bb679
|
|||
3618c005c6
|
|||
352db47931
|
|||
2b8f9c4ae7
|
|||
37cdd6e81d
|
|||
23b9ddcbdd
|
|||
8a60a0ef51
|
|||
9747e7cd03
|
|||
5d60516fd2
|
|||
a181fc8a5e
|
|||
12366e5e1c
|
|||
7d8e9e6b8d
|
|||
eb9406fe1f
|
|||
c7e0f66295
|
|||
03e4cc7d9e
|
|||
e2b5ef1c1c
|
|||
0aba6fa9f7
|
|||
533a6344a2
|
|||
24a2413acf
|
|||
fa060ace43
|
|||
050415cb49
|
|||
fc1281a397
|
|||
0b1649033c
|
|||
2b188dab9a
|
|||
17487f010d
|
|||
0258036463
|
|||
86a3bae9cd
|
|||
f3db8d920d
|
|||
89f4af47b9
|
|||
66154517f6
|
|||
32356fb1e2
|
|||
c855dc7c07
|
|||
42429704cb
|
|||
479f4d9eda
|
|||
69bbc41c39
|
|||
42b35cb7ae
|
|||
2af4c735c9
|
|||
3f070b6c52
|
|||
542d6150ba
|
|||
061cd15fad
|
|||
5e83195ea2
|
|||
ee09ed556f
|
|||
9618698da5
|
|||
23abd062ec
|
|||
29b32d3d85
|
|||
6df254ed93
|
|||
b9cff42ac4
|
|||
02caab13ce
|
|||
cef43e67d4
|
|||
d2f6e6aa3c
|
|||
94f97a27cd
|
|||
16138921fd
|
|||
2b021cc0a4
|
|||
93ac4b1185
|
|||
544c511341
|
|||
bffc9ba70d
|
|||
8b10d9d2d9
|
|||
1d8e43c06b
|
|||
0be5b217b0
|
|||
dd4455eafe
|
|||
310956acad
|
|||
c4e97e81c5
|
|||
f957ea84e8
|
|||
44369bfa89
|
|||
f193aab3d7
|
|||
e7078d2aac
|
|||
00bfff1dec
|
|||
8adb4f4089
|
|||
8763a70bac
|
|||
87de19d6ae
|
|||
0b021819d3
|
|||
f2cbd869de
|
|||
661c148504
|
|||
2cea68ce91
|
|||
4839356310
|
|||
9a48913133
|
|||
80d5f09640
|
|||
d291a97ccd
|
|||
5d3a4606fe
|
|||
def3fbca47
|
|||
da17da719f
|
|||
0ef2490164
|
|||
ba3f66a250
|
|||
edab9af4ec
|
|||
5bdf191a85
|
|||
305f0755a7
|
|||
b2dfc171ea
|
|||
c6081a8763
|
|||
1e86fecd6e
|
|||
d03d2a7732
|
|||
83d35e7f2d
|
|||
c6ff1bce1f
|
|||
26d87266ab
|
|||
4f1753a38c
|
|||
325196ce2f
|
|||
d0792c892e
|
|||
a0f5f3ed32
|
|||
795cf955a0
|
|||
ae1f8c3585
|
|||
dbcf61847c
|
|||
39f2480666
|
|||
f095b9f71c
|
|||
1e21905238
|
|||
ddd07384c4
|
|||
a7c2f0827b
|
|||
aa2c08db63
|
|||
0618af6673
|
|||
a2ebd755b0
|
|||
6dc844f29e
|
|||
2e60b9be5b
|
|||
eff70fdfc1
|
|||
e5afe3333c
|
|||
712a259edc
|
|||
8db85b91c9
|
|||
7fcf6ff9a9
|
|||
63de3d65a7
|
|||
d60cf0188d
|
|||
5bd2cf34e3
|
|||
614c2e6098
|
|||
3f685aea42
|
|||
d08d53398e
|
|||
ecf68a816b
|
|||
04203a5be3
|
|||
22f5250a86
|
|||
70d39b0c89
|
|||
b76dbdd904
|
|||
f9dd8583c4
|
|||
51f3b5c3a9
|
|||
9f02f55c4f
|
|||
e4f4783b4c
|
|||
2b69b34706
|
|||
2f3624a6b8
|
|||
c8b8f2c513
|
|||
d74e0032bb
|
|||
ea939b2e15
|
|||
f789999224
|
|||
d9fa49b8ed
|
|||
238b7c503c
|
|||
71d953d253
|
|||
a091fb2a69
|
|||
6eb50d3a8f
|
|||
a19656d56d
|
|||
fe15b1c2ed
|
|||
b68ab72fd7
|
|||
c478bb0e90
|
|||
845c04d3f1
|
|||
a5ea611f02
|
|||
5f7ac95a07
|
|||
9db19c054f
|
|||
5be54bec5f
|
|||
cf56c86ac4
|
|||
029af21e01
|
|||
1944c43d4e
|
|||
5339afcf39
|
|||
541304de7d
|
|||
c50116ea22
|
|||
77a133a0d1
|
|||
0a26b8e522
|
|||
13219b4d96
|
|||
5c03c7f95c
|
|||
cf33684ca0
|
|||
e07bca10a1
|
|||
f829371b6a
|
|||
c767171fad
|
|||
5216645bd5
|
|||
5f75a75063
|
|||
3e1835711b
|
|||
5f213336d9
|
|||
41f62a3890
|
|||
8ec41e2960
|
|||
0520f722fd
|
|||
2e1cfec19a
|
|||
ceeaa9e8e5
|
|||
732d92c7e7
|
|||
f96b946cb2
|
|||
2bddd70aed
|
|||
2573c5890f
|
|||
c97534b95e
|
|||
546992ce34
|
|||
e0c9052eca
|
|||
60c31fb74d
|
|||
bab77b94de
|
|||
5c2728cc9f
|
|||
f2fa1395c8
|
|||
0f865c47f3
|
|||
c7ee0c1acb
|
|||
33f55317f7
|
|||
9057ebf7fd
|
|||
6f98fbb5cd
|
|||
f44a098f80
|
|||
4aa27cf9bb
|
|||
2a92ded7db
|
|||
4f13020601
|
|||
30e88a3859
|
|||
61bdd78444
|
|||
b6abcf41b0
|
|||
015d9c6532
|
|||
26795610d2
|
|||
2a2a6c52b9
|
|||
037794ee2d
|
|||
0d2d120ef1
|
|||
526436dd1f
|
|||
42eb58c755
|
|||
0e5c3c5ebc
|
|||
3eefefadd9
|
|||
137bee5f59
|
|||
4698badc2e
|
|||
87684ec397
|
|||
eb15df8c84
|
|||
5b6d05cdbc
|
|||
de7a42a05f
|
|||
fb44d2ea74
|
|||
9132709546
|
|||
b7f5c8200d
|
|||
c554a44523
|
|||
0a99aeff19
|
|||
baf9ae7bd1
|
|||
a33764db8c
|
|||
480e862bee
|
|||
2177abf06c
|
|||
934f405586
|
|||
b2b126d21c
|
|||
f9ec1ccf9d
|
|||
1f14d7be1b
|
|||
53f7d1de0f
|
|||
47f665b742
|
|||
26be10bd0c
|
|||
aa5a4e27a3
|
|||
f9cf5758e3
|
15
.gitea/workflows/check.yml
Normal file
15
.gitea/workflows/check.yml
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
name: Check flake
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches: ['master']
|
||||||
|
jobs:
|
||||||
|
build-amd64-linux:
|
||||||
|
runs-on: nix
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
with:
|
||||||
|
ref: master
|
||||||
|
- name: Check flake
|
||||||
|
run: |
|
||||||
|
echo "Checking flake at ${{ gitea.ref }}"
|
||||||
|
nix flake check
|
49
README.md
49
README.md
@ -9,8 +9,47 @@ System and user configuration for NixOS-based systems.
|
|||||||
| **Theme:** | adwaita |
|
| **Theme:** | adwaita |
|
||||||
| **Terminal:** | Console |
|
| **Terminal:** | Console |
|
||||||
|
|
||||||
## Quick start
|
## Provisioning a new host
|
||||||
1. Copy SSH keypair and `known_hosts` to `~/.ssh`
|
> [nixos-anywhere](https://github.com/nix-community/nixos-anywhere) is the module used
|
||||||
1. Import GPG keys and set ultimate trust with `echo "KEYID:6:" | gpg --import-ownertrust`
|
> for provisioning
|
||||||
1. `git clone git@git.vimium.com:jordan/nix-config.git projects/jordan/nix-config`
|
|
||||||
1. `sudo nixos-rebuild switch --flake .#`
|
Generate a new SSH host key in "$temp/etc/ssh" as per [this guide](https://nix-community.github.io/nixos-anywhere/howtos/secrets.html#example-decrypting-an-openssh-host-key-with-pass).
|
||||||
|
```
|
||||||
|
ssh-keygen -t ed25519 -f /tmp/ssh_host_ed25519_key
|
||||||
|
```
|
||||||
|
|
||||||
|
Update [nix-secrets](/jordan/nix-secrets) with the new host key to enable the system to decrypt
|
||||||
|
any relevant secrets.
|
||||||
|
|
||||||
|
In order to use the borgmatic module for backups, go to [borgbase.com](https://borgbase.com).
|
||||||
|
Add the generated SSH host key and create a new repository for the system.
|
||||||
|
|
||||||
|
Create a new directory under `hosts/` with a system configuration and disk layout.
|
||||||
|
|
||||||
|
Boot the NixOS installer (or any Linux distribution) on the target.
|
||||||
|
|
||||||
|
Then run:
|
||||||
|
```
|
||||||
|
nix run github:nix-community/nixos-anywhere -- \
|
||||||
|
--disk-encryption-keys /tmp/secret.key /tmp/secret.key \
|
||||||
|
--extra-files "$temp" \
|
||||||
|
--flake .#<hostname> \
|
||||||
|
root@<target-ip>
|
||||||
|
```
|
||||||
|
|
||||||
|
### Post install
|
||||||
|
|
||||||
|
If backups are configured, you'll need to run:
|
||||||
|
```
|
||||||
|
borgmatic init --encryption repokey-blake2
|
||||||
|
```
|
||||||
|
then restart `borgmatic`.
|
||||||
|
|
||||||
|
To join the Tailscale network, run:
|
||||||
|
```
|
||||||
|
tailscale up --login-server https://headscale.vimium.net
|
||||||
|
```
|
||||||
|
then visit the URL, SSH onto `vps1` and run `headscale --user mesh nodes register --key <key>`.
|
||||||
|
|
||||||
|
The new node can optionally be given a friendly name with `headscale node rename -i <index> <hostname>`.
|
||||||
|
|
||||||
|
609
flake.lock
generated
609
flake.lock
generated
@ -4,14 +4,15 @@
|
|||||||
"inputs": {
|
"inputs": {
|
||||||
"darwin": "darwin",
|
"darwin": "darwin",
|
||||||
"home-manager": "home-manager",
|
"home-manager": "home-manager",
|
||||||
"nixpkgs": "nixpkgs"
|
"nixpkgs": "nixpkgs",
|
||||||
|
"systems": "systems"
|
||||||
},
|
},
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1701216516,
|
"lastModified": 1723293904,
|
||||||
"narHash": "sha256-jKSeJn+7hZ1dZdiH1L+NWUGT2i/BGomKAJ54B9kT06Q=",
|
"narHash": "sha256-b+uqzj+Wa6xgMS9aNbX4I+sXeb5biPDi39VgvSFqFvU=",
|
||||||
"owner": "ryantm",
|
"owner": "ryantm",
|
||||||
"repo": "agenix",
|
"repo": "agenix",
|
||||||
"rev": "13ac9ac6d68b9a0896e3d43a082947233189e247",
|
"rev": "f6291c5935fdc4e0bef208cfc0dcab7e3f7a1c41",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
@ -20,6 +21,22 @@
|
|||||||
"type": "github"
|
"type": "github"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"blobs": {
|
||||||
|
"flake": false,
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1604995301,
|
||||||
|
"narHash": "sha256-wcLzgLec6SGJA8fx1OEN1yV/Py5b+U5iyYpksUY/yLw=",
|
||||||
|
"owner": "simple-nixos-mailserver",
|
||||||
|
"repo": "blobs",
|
||||||
|
"rev": "2cccdf1ca48316f2cfd1c9a0017e8de5a7156265",
|
||||||
|
"type": "gitlab"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "simple-nixos-mailserver",
|
||||||
|
"repo": "blobs",
|
||||||
|
"type": "gitlab"
|
||||||
|
}
|
||||||
|
},
|
||||||
"darwin": {
|
"darwin": {
|
||||||
"inputs": {
|
"inputs": {
|
||||||
"nixpkgs": [
|
"nixpkgs": [
|
||||||
@ -28,11 +45,11 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1673295039,
|
"lastModified": 1700795494,
|
||||||
"narHash": "sha256-AsdYgE8/GPwcelGgrntlijMg4t3hLFJFCRF3tL5WVjA=",
|
"narHash": "sha256-gzGLZSiOhf155FW7262kdHo2YDeugp3VuIFb4/GGng0=",
|
||||||
"owner": "lnl7",
|
"owner": "lnl7",
|
||||||
"repo": "nix-darwin",
|
"repo": "nix-darwin",
|
||||||
"rev": "87b9d090ad39b25b2400029c64825fc2a8868943",
|
"rev": "4b9b83d5a92e8c1fbfd8eb27eda375908c11ec4d",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
@ -42,14 +59,75 @@
|
|||||||
"type": "github"
|
"type": "github"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"deploy-rs": {
|
||||||
|
"inputs": {
|
||||||
|
"flake-compat": "flake-compat",
|
||||||
|
"nixpkgs": "nixpkgs_2",
|
||||||
|
"utils": "utils"
|
||||||
|
},
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1727447169,
|
||||||
|
"narHash": "sha256-3KyjMPUKHkiWhwR91J1YchF6zb6gvckCAY1jOE+ne0U=",
|
||||||
|
"owner": "serokell",
|
||||||
|
"repo": "deploy-rs",
|
||||||
|
"rev": "aa07eb05537d4cd025e2310397a6adcedfe72c76",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "serokell",
|
||||||
|
"repo": "deploy-rs",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"devshell": {
|
||||||
|
"inputs": {
|
||||||
|
"nixpkgs": [
|
||||||
|
"nixvim",
|
||||||
|
"nixpkgs"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1722113426,
|
||||||
|
"narHash": "sha256-Yo/3loq572A8Su6aY5GP56knpuKYRvM2a1meP9oJZCw=",
|
||||||
|
"owner": "numtide",
|
||||||
|
"repo": "devshell",
|
||||||
|
"rev": "67cce7359e4cd3c45296fb4aaf6a19e2a9c757ae",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "numtide",
|
||||||
|
"repo": "devshell",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"disko": {
|
||||||
|
"inputs": {
|
||||||
|
"nixpkgs": [
|
||||||
|
"nixpkgs"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1727359191,
|
||||||
|
"narHash": "sha256-5PltTychnExFwzpEnY3WhOywaMV/M6NxYI/y3oXuUtw=",
|
||||||
|
"owner": "nix-community",
|
||||||
|
"repo": "disko",
|
||||||
|
"rev": "67dc29be3036cc888f0b9d4f0a788ee0f6768700",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "nix-community",
|
||||||
|
"repo": "disko",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
"firefox-gnome-theme": {
|
"firefox-gnome-theme": {
|
||||||
"flake": false,
|
"flake": false,
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1702138393,
|
"lastModified": 1723137499,
|
||||||
"narHash": "sha256-2jRm1yzX+gKpSCtdpYt1olIgWVEkJnS7FeK00o9X1ko=",
|
"narHash": "sha256-MOE9NeU2i6Ws1GhGmppMnjOHkNLl2MQMJmGhaMzdoJM=",
|
||||||
"owner": "rafaelmardojai",
|
"owner": "rafaelmardojai",
|
||||||
"repo": "firefox-gnome-theme",
|
"repo": "firefox-gnome-theme",
|
||||||
"rev": "d2e6cfdd63651ae8168e5905d94138f406580dd6",
|
"rev": "fb5b578a4f49ae8705e5fea0419242ed1b8dba70",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
@ -58,6 +136,155 @@
|
|||||||
"type": "github"
|
"type": "github"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"flake-compat": {
|
||||||
|
"flake": false,
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1696426674,
|
||||||
|
"narHash": "sha256-kvjfFW7WAETZlt09AgDn1MrtKzP7t90Vf7vypd3OL1U=",
|
||||||
|
"owner": "edolstra",
|
||||||
|
"repo": "flake-compat",
|
||||||
|
"rev": "0f9255e01c2351cc7d116c072cb317785dd33b33",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "edolstra",
|
||||||
|
"repo": "flake-compat",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"flake-compat_2": {
|
||||||
|
"flake": false,
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1696426674,
|
||||||
|
"narHash": "sha256-kvjfFW7WAETZlt09AgDn1MrtKzP7t90Vf7vypd3OL1U=",
|
||||||
|
"owner": "edolstra",
|
||||||
|
"repo": "flake-compat",
|
||||||
|
"rev": "0f9255e01c2351cc7d116c072cb317785dd33b33",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "edolstra",
|
||||||
|
"repo": "flake-compat",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"flake-compat_3": {
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1696426674,
|
||||||
|
"narHash": "sha256-kvjfFW7WAETZlt09AgDn1MrtKzP7t90Vf7vypd3OL1U=",
|
||||||
|
"rev": "0f9255e01c2351cc7d116c072cb317785dd33b33",
|
||||||
|
"revCount": 57,
|
||||||
|
"type": "tarball",
|
||||||
|
"url": "https://api.flakehub.com/f/pinned/edolstra/flake-compat/1.0.1/018afb31-abd1-7bff-a5e4-cff7e18efb7a/source.tar.gz"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"type": "tarball",
|
||||||
|
"url": "https://flakehub.com/f/edolstra/flake-compat/1.tar.gz"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"flake-compat_4": {
|
||||||
|
"flake": false,
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1696426674,
|
||||||
|
"narHash": "sha256-kvjfFW7WAETZlt09AgDn1MrtKzP7t90Vf7vypd3OL1U=",
|
||||||
|
"owner": "edolstra",
|
||||||
|
"repo": "flake-compat",
|
||||||
|
"rev": "0f9255e01c2351cc7d116c072cb317785dd33b33",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "edolstra",
|
||||||
|
"repo": "flake-compat",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"flake-parts": {
|
||||||
|
"inputs": {
|
||||||
|
"nixpkgs-lib": [
|
||||||
|
"nixvim",
|
||||||
|
"nixpkgs"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1725234343,
|
||||||
|
"narHash": "sha256-+ebgonl3NbiKD2UD0x4BszCZQ6sTfL4xioaM49o5B3Y=",
|
||||||
|
"owner": "hercules-ci",
|
||||||
|
"repo": "flake-parts",
|
||||||
|
"rev": "567b938d64d4b4112ee253b9274472dc3a346eb6",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "hercules-ci",
|
||||||
|
"repo": "flake-parts",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"git-hooks": {
|
||||||
|
"inputs": {
|
||||||
|
"flake-compat": "flake-compat_4",
|
||||||
|
"gitignore": "gitignore",
|
||||||
|
"nixpkgs": [
|
||||||
|
"nixvim",
|
||||||
|
"nixpkgs"
|
||||||
|
],
|
||||||
|
"nixpkgs-stable": [
|
||||||
|
"nixvim",
|
||||||
|
"nixpkgs"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1724857454,
|
||||||
|
"narHash": "sha256-Qyl9Q4QMTLZnnBb/8OuQ9LSkzWjBU1T5l5zIzTxkkhk=",
|
||||||
|
"owner": "cachix",
|
||||||
|
"repo": "git-hooks.nix",
|
||||||
|
"rev": "4509ca64f1084e73bc7a721b20c669a8d4c5ebe6",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "cachix",
|
||||||
|
"repo": "git-hooks.nix",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"gitea-github-theme": {
|
||||||
|
"flake": false,
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1717248105,
|
||||||
|
"narHash": "sha256-BwSsIkl7DpN/c8HNXOh2aKjOuPmFsGybv4RegOC7Xq0=",
|
||||||
|
"ref": "main",
|
||||||
|
"rev": "4f829f88e6f443ff048c4d337bd010315aa4b50a",
|
||||||
|
"revCount": 101,
|
||||||
|
"type": "git",
|
||||||
|
"url": "ssh://git@git.vimium.com/jordan/gitea-github-theme.git"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"ref": "main",
|
||||||
|
"type": "git",
|
||||||
|
"url": "ssh://git@git.vimium.com/jordan/gitea-github-theme.git"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"gitignore": {
|
||||||
|
"inputs": {
|
||||||
|
"nixpkgs": [
|
||||||
|
"nixvim",
|
||||||
|
"git-hooks",
|
||||||
|
"nixpkgs"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1709087332,
|
||||||
|
"narHash": "sha256-HG2cCnktfHsKV0s4XW83gU3F57gaTljL9KNSuG6bnQs=",
|
||||||
|
"owner": "hercules-ci",
|
||||||
|
"repo": "gitignore.nix",
|
||||||
|
"rev": "637db329424fd7e46cf4185293b9cc8c88c95394",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "hercules-ci",
|
||||||
|
"repo": "gitignore.nix",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
"home-manager": {
|
"home-manager": {
|
||||||
"inputs": {
|
"inputs": {
|
||||||
"nixpkgs": [
|
"nixpkgs": [
|
||||||
@ -66,11 +293,11 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1682203081,
|
"lastModified": 1703113217,
|
||||||
"narHash": "sha256-kRL4ejWDhi0zph/FpebFYhzqlOBrk0Pl3dzGEKSAlEw=",
|
"narHash": "sha256-7ulcXOk63TIT2lVDSExj7XzFx09LpdSAPtvgtM7yQPE=",
|
||||||
"owner": "nix-community",
|
"owner": "nix-community",
|
||||||
"repo": "home-manager",
|
"repo": "home-manager",
|
||||||
"rev": "32d3e39c491e2f91152c84f8ad8b003420eab0a1",
|
"rev": "3bfaacf46133c037bb356193bd2f1765d9dc82c1",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
@ -86,27 +313,126 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1702195709,
|
"lastModified": 1726989464,
|
||||||
"narHash": "sha256-+zRjWkm5rKqQ57PuLZ3JF3xi3vPMiOJzItb1m/43Cq4=",
|
"narHash": "sha256-Vl+WVTJwutXkimwGprnEtXc/s/s8sMuXzqXaspIGlwM=",
|
||||||
"owner": "nix-community",
|
"owner": "nix-community",
|
||||||
"repo": "home-manager",
|
"repo": "home-manager",
|
||||||
"rev": "6761b8188b860f374b457eddfdb05c82eef9752f",
|
"rev": "2f23fa308a7c067e52dfcc30a0758f47043ec176",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
"owner": "nix-community",
|
"owner": "nix-community",
|
||||||
"ref": "release-23.11",
|
"ref": "release-24.05",
|
||||||
"repo": "home-manager",
|
"repo": "home-manager",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"home-manager_3": {
|
||||||
|
"inputs": {
|
||||||
|
"nixpkgs": [
|
||||||
|
"nixvim",
|
||||||
|
"nixpkgs"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1720042825,
|
||||||
|
"narHash": "sha256-A0vrUB6x82/jvf17qPCpxaM+ulJnD8YZwH9Ci0BsAzE=",
|
||||||
|
"owner": "nix-community",
|
||||||
|
"repo": "home-manager",
|
||||||
|
"rev": "e1391fb22e18a36f57e6999c7a9f966dc80ac073",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "nix-community",
|
||||||
|
"ref": "release-24.05",
|
||||||
|
"repo": "home-manager",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"kvlibadwaita": {
|
||||||
|
"flake": false,
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1710621848,
|
||||||
|
"narHash": "sha256-xBl6zmpqTAH5MIT5iNAdW6kdOcB5MY0Dtrb95hdYpwA=",
|
||||||
|
"owner": "GabePoel",
|
||||||
|
"repo": "KvLibadwaita",
|
||||||
|
"rev": "87c1ef9f44ec48855fd09ddab041007277e30e37",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "GabePoel",
|
||||||
|
"repo": "KvLibadwaita",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"nix-darwin": {
|
||||||
|
"inputs": {
|
||||||
|
"nixpkgs": [
|
||||||
|
"nixvim",
|
||||||
|
"nixpkgs"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1725189302,
|
||||||
|
"narHash": "sha256-IhXok/kwQqtusPsoguQLCHA+h6gKvgdCrkhIaN+kByA=",
|
||||||
|
"owner": "lnl7",
|
||||||
|
"repo": "nix-darwin",
|
||||||
|
"rev": "7c4b53a7d9f3a3df902b3fddf2ae245ef20ebcda",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "lnl7",
|
||||||
|
"repo": "nix-darwin",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"nixos-hardware": {
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1727437159,
|
||||||
|
"narHash": "sha256-v4qLwEw5OmprgQZTT7KZMNU7JjXJzRypw8+Cw6++fWk=",
|
||||||
|
"owner": "NixOS",
|
||||||
|
"repo": "nixos-hardware",
|
||||||
|
"rev": "d830ad47cc992b4a46b342bbc79694cbd0e980b2",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "NixOS",
|
||||||
|
"repo": "nixos-hardware",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"nixos-mailserver": {
|
||||||
|
"inputs": {
|
||||||
|
"blobs": "blobs",
|
||||||
|
"flake-compat": "flake-compat_2",
|
||||||
|
"nixpkgs": [
|
||||||
|
"nixpkgs"
|
||||||
|
],
|
||||||
|
"nixpkgs-24_05": "nixpkgs-24_05",
|
||||||
|
"utils": "utils_2"
|
||||||
|
},
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1718084203,
|
||||||
|
"narHash": "sha256-Cx1xoVfSMv1XDLgKg08CUd1EoTYWB45VmB9XIQzhmzI=",
|
||||||
|
"owner": "simple-nixos-mailserver",
|
||||||
|
"repo": "nixos-mailserver",
|
||||||
|
"rev": "29916981e7b3b5782dc5085ad18490113f8ff63b",
|
||||||
|
"type": "gitlab"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "simple-nixos-mailserver",
|
||||||
|
"ref": "nixos-24.05",
|
||||||
|
"repo": "nixos-mailserver",
|
||||||
|
"type": "gitlab"
|
||||||
|
}
|
||||||
|
},
|
||||||
"nixpkgs": {
|
"nixpkgs": {
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1677676435,
|
"lastModified": 1703013332,
|
||||||
"narHash": "sha256-6FxdcmQr5JeZqsQvfinIMr0XcTyTuR7EXX0H3ANShpQ=",
|
"narHash": "sha256-+tFNwMvlXLbJZXiMHqYq77z/RfmpfpiI3yjL6o/Zo9M=",
|
||||||
"owner": "NixOS",
|
"owner": "NixOS",
|
||||||
"repo": "nixpkgs",
|
"repo": "nixpkgs",
|
||||||
"rev": "a08d6979dd7c82c4cef0dcc6ac45ab16051c1169",
|
"rev": "54aac082a4d9bb5bbc5c4e899603abfb76a3f6d6",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
@ -116,38 +442,206 @@
|
|||||||
"type": "github"
|
"type": "github"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"nixpkgs_2": {
|
"nixpkgs-24_05": {
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1702233072,
|
"lastModified": 1717144377,
|
||||||
"narHash": "sha256-H5G2wgbim2Ku6G6w+NSaQaauv6B6DlPhY9fMvArKqRo=",
|
"narHash": "sha256-F/TKWETwB5RaR8owkPPi+SPJh83AQsm6KrQAlJ8v/uA=",
|
||||||
"owner": "NixOS",
|
"owner": "NixOS",
|
||||||
"repo": "nixpkgs",
|
"repo": "nixpkgs",
|
||||||
"rev": "781e2a9797ecf0f146e81425c822dca69fe4a348",
|
"rev": "805a384895c696f802a9bf5bf4720f37385df547",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
"id": "nixpkgs",
|
"id": "nixpkgs",
|
||||||
"ref": "nixos-23.11",
|
"ref": "nixos-24.05",
|
||||||
"type": "indirect"
|
"type": "indirect"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"nixpkgs-unstable": {
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1727122398,
|
||||||
|
"narHash": "sha256-o8VBeCWHBxGd4kVMceIayf5GApqTavJbTa44Xcg5Rrk=",
|
||||||
|
"owner": "NixOS",
|
||||||
|
"repo": "nixpkgs",
|
||||||
|
"rev": "30439d93eb8b19861ccbe3e581abf97bdc91b093",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"id": "nixpkgs",
|
||||||
|
"ref": "nixos-unstable",
|
||||||
|
"type": "indirect"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"nixpkgs_2": {
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1702272962,
|
||||||
|
"narHash": "sha256-D+zHwkwPc6oYQ4G3A1HuadopqRwUY/JkMwHz1YF7j4Q=",
|
||||||
|
"owner": "NixOS",
|
||||||
|
"repo": "nixpkgs",
|
||||||
|
"rev": "e97b3e4186bcadf0ef1b6be22b8558eab1cdeb5d",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "NixOS",
|
||||||
|
"ref": "nixpkgs-unstable",
|
||||||
|
"repo": "nixpkgs",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"nixpkgs_3": {
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1727264057,
|
||||||
|
"narHash": "sha256-KQPI8CTTnB9CrJ7LrmLC4VWbKZfljEPBXOFGZFRpxao=",
|
||||||
|
"owner": "NixOS",
|
||||||
|
"repo": "nixpkgs",
|
||||||
|
"rev": "759537f06e6999e141588ff1c9be7f3a5c060106",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"id": "nixpkgs",
|
||||||
|
"ref": "nixos-24.05",
|
||||||
|
"type": "indirect"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"nixvim": {
|
||||||
|
"inputs": {
|
||||||
|
"devshell": "devshell",
|
||||||
|
"flake-compat": "flake-compat_3",
|
||||||
|
"flake-parts": "flake-parts",
|
||||||
|
"git-hooks": "git-hooks",
|
||||||
|
"home-manager": "home-manager_3",
|
||||||
|
"nix-darwin": "nix-darwin",
|
||||||
|
"nixpkgs": [
|
||||||
|
"nixpkgs"
|
||||||
|
],
|
||||||
|
"treefmt-nix": "treefmt-nix"
|
||||||
|
},
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1725350106,
|
||||||
|
"narHash": "sha256-TaMMlI2KPJ3wCyxJk6AShOLhNuTeabHCnvYRkLBlEFs=",
|
||||||
|
"owner": "nix-community",
|
||||||
|
"repo": "nixvim",
|
||||||
|
"rev": "0f2c31e6a57a83ed4e6fa3adc76749620231055d",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "nix-community",
|
||||||
|
"ref": "nixos-24.05",
|
||||||
|
"repo": "nixvim",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"plasma-manager": {
|
||||||
|
"inputs": {
|
||||||
|
"home-manager": [
|
||||||
|
"home-manager"
|
||||||
|
],
|
||||||
|
"nixpkgs": [
|
||||||
|
"nixpkgs"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1727210241,
|
||||||
|
"narHash": "sha256-lufS6uzSbSrggNCSgubymMQWnQMh7PvQ+lRZ8qH9Uoc=",
|
||||||
|
"owner": "nix-community",
|
||||||
|
"repo": "plasma-manager",
|
||||||
|
"rev": "a02fef2ece8084aff0b41700bb57d24d73574cd1",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "nix-community",
|
||||||
|
"repo": "plasma-manager",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
"root": {
|
"root": {
|
||||||
"inputs": {
|
"inputs": {
|
||||||
"agenix": "agenix",
|
"agenix": "agenix",
|
||||||
|
"deploy-rs": "deploy-rs",
|
||||||
|
"disko": "disko",
|
||||||
"firefox-gnome-theme": "firefox-gnome-theme",
|
"firefox-gnome-theme": "firefox-gnome-theme",
|
||||||
|
"gitea-github-theme": "gitea-github-theme",
|
||||||
"home-manager": "home-manager_2",
|
"home-manager": "home-manager_2",
|
||||||
"nixpkgs": "nixpkgs_2",
|
"kvlibadwaita": "kvlibadwaita",
|
||||||
|
"nixos-hardware": "nixos-hardware",
|
||||||
|
"nixos-mailserver": "nixos-mailserver",
|
||||||
|
"nixpkgs": "nixpkgs_3",
|
||||||
|
"nixpkgs-unstable": "nixpkgs-unstable",
|
||||||
|
"nixvim": "nixvim",
|
||||||
|
"plasma-manager": "plasma-manager",
|
||||||
|
"secrets": "secrets",
|
||||||
"thunderbird-gnome-theme": "thunderbird-gnome-theme"
|
"thunderbird-gnome-theme": "thunderbird-gnome-theme"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"secrets": {
|
||||||
|
"flake": false,
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1724093899,
|
||||||
|
"narHash": "sha256-VohYwTIBq7NEssFibuu+HMXXwuCoLmMOmEwQf7sESSI=",
|
||||||
|
"ref": "refs/heads/master",
|
||||||
|
"rev": "7f5901bb5d6eeaa94d7e1f18f66093be9df014e4",
|
||||||
|
"revCount": 27,
|
||||||
|
"type": "git",
|
||||||
|
"url": "ssh://git@git.vimium.com/jordan/nix-secrets.git"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "ssh://git@git.vimium.com/jordan/nix-secrets.git"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"systems": {
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1681028828,
|
||||||
|
"narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
|
||||||
|
"owner": "nix-systems",
|
||||||
|
"repo": "default",
|
||||||
|
"rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "nix-systems",
|
||||||
|
"repo": "default",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"systems_2": {
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1681028828,
|
||||||
|
"narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
|
||||||
|
"owner": "nix-systems",
|
||||||
|
"repo": "default",
|
||||||
|
"rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "nix-systems",
|
||||||
|
"repo": "default",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"systems_3": {
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1681028828,
|
||||||
|
"narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
|
||||||
|
"owner": "nix-systems",
|
||||||
|
"repo": "default",
|
||||||
|
"rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "nix-systems",
|
||||||
|
"repo": "default",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
"thunderbird-gnome-theme": {
|
"thunderbird-gnome-theme": {
|
||||||
"flake": false,
|
"flake": false,
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1701889124,
|
"lastModified": 1721874544,
|
||||||
"narHash": "sha256-K+6oh7+J6RDBFkxphY/pzf0B+q5+IY54ZMKZrFSKXlc=",
|
"narHash": "sha256-BHW9jlx92CsHY84FT0ce5Vxl0KFheLhNn2vndcIf7no=",
|
||||||
"owner": "rafaelmardojai",
|
"owner": "rafaelmardojai",
|
||||||
"repo": "thunderbird-gnome-theme",
|
"repo": "thunderbird-gnome-theme",
|
||||||
"rev": "966e9dd54bd2ce9d36d51cd6af8c3bac7a764a68",
|
"rev": "628fcccb7788e3e0ad34f67114f563c87ac8c1dc",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
@ -155,6 +649,63 @@
|
|||||||
"repo": "thunderbird-gnome-theme",
|
"repo": "thunderbird-gnome-theme",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
"treefmt-nix": {
|
||||||
|
"inputs": {
|
||||||
|
"nixpkgs": [
|
||||||
|
"nixvim",
|
||||||
|
"nixpkgs"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1724833132,
|
||||||
|
"narHash": "sha256-F4djBvyNRAXGusJiNYInqR6zIMI3rvlp6WiKwsRISos=",
|
||||||
|
"owner": "numtide",
|
||||||
|
"repo": "treefmt-nix",
|
||||||
|
"rev": "3ffd842a5f50f435d3e603312eefa4790db46af5",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "numtide",
|
||||||
|
"repo": "treefmt-nix",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"utils": {
|
||||||
|
"inputs": {
|
||||||
|
"systems": "systems_2"
|
||||||
|
},
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1701680307,
|
||||||
|
"narHash": "sha256-kAuep2h5ajznlPMD9rnQyffWG8EM/C73lejGofXvdM8=",
|
||||||
|
"owner": "numtide",
|
||||||
|
"repo": "flake-utils",
|
||||||
|
"rev": "4022d587cbbfd70fe950c1e2083a02621806a725",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "numtide",
|
||||||
|
"repo": "flake-utils",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"utils_2": {
|
||||||
|
"inputs": {
|
||||||
|
"systems": "systems_3"
|
||||||
|
},
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1709126324,
|
||||||
|
"narHash": "sha256-q6EQdSeUZOG26WelxqkmR7kArjgWCdw5sfJVHPH/7j8=",
|
||||||
|
"owner": "numtide",
|
||||||
|
"repo": "flake-utils",
|
||||||
|
"rev": "d465f4819400de7c8d874d50b982301f28a84605",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "numtide",
|
||||||
|
"repo": "flake-utils",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"root": "root",
|
"root": "root",
|
||||||
|
132
flake.nix
132
flake.nix
@ -2,65 +2,125 @@
|
|||||||
description = "NixOS system configuration";
|
description = "NixOS system configuration";
|
||||||
|
|
||||||
inputs = {
|
inputs = {
|
||||||
nixpkgs.url = "nixpkgs/nixos-23.11";
|
nixpkgs.url = "nixpkgs/nixos-24.05";
|
||||||
|
nixpkgs-unstable.url = "nixpkgs/nixos-unstable";
|
||||||
|
# nixpkgs-master.url = "nixpkgs";
|
||||||
agenix.url = "github:ryantm/agenix";
|
agenix.url = "github:ryantm/agenix";
|
||||||
|
deploy-rs.url = "github:serokell/deploy-rs";
|
||||||
|
disko = {
|
||||||
|
url = "github:nix-community/disko";
|
||||||
|
inputs.nixpkgs.follows = "nixpkgs";
|
||||||
|
};
|
||||||
home-manager = {
|
home-manager = {
|
||||||
url = "github:nix-community/home-manager/release-23.11";
|
url = "github:nix-community/home-manager/release-24.05";
|
||||||
inputs.nixpkgs.follows = "nixpkgs";
|
inputs.nixpkgs.follows = "nixpkgs";
|
||||||
};
|
};
|
||||||
firefox-gnome-theme = {
|
firefox-gnome-theme = {
|
||||||
url = "github:rafaelmardojai/firefox-gnome-theme";
|
url = "github:rafaelmardojai/firefox-gnome-theme";
|
||||||
flake = false;
|
flake = false;
|
||||||
};
|
};
|
||||||
|
gitea-github-theme = {
|
||||||
|
url = "git+ssh://git@git.vimium.com/jordan/gitea-github-theme.git?ref=main";
|
||||||
|
flake = false;
|
||||||
|
};
|
||||||
|
kvlibadwaita = {
|
||||||
|
url = "github:GabePoel/KvLibadwaita";
|
||||||
|
flake = false;
|
||||||
|
};
|
||||||
|
nixos-hardware.url = "github:NixOS/nixos-hardware";
|
||||||
|
nixos-mailserver = {
|
||||||
|
url = "gitlab:simple-nixos-mailserver/nixos-mailserver/nixos-24.05";
|
||||||
|
inputs.nixpkgs.follows = "nixpkgs";
|
||||||
|
};
|
||||||
|
nixvim = {
|
||||||
|
url = "github:nix-community/nixvim/nixos-24.05";
|
||||||
|
inputs.nixpkgs.follows = "nixpkgs";
|
||||||
|
};
|
||||||
|
plasma-manager = {
|
||||||
|
url = "github:nix-community/plasma-manager";
|
||||||
|
inputs.nixpkgs.follows = "nixpkgs";
|
||||||
|
inputs.home-manager.follows = "home-manager";
|
||||||
|
};
|
||||||
|
secrets = {
|
||||||
|
url = "git+ssh://git@git.vimium.com/jordan/nix-secrets.git";
|
||||||
|
flake = false;
|
||||||
|
};
|
||||||
thunderbird-gnome-theme = {
|
thunderbird-gnome-theme = {
|
||||||
url = "github:rafaelmardojai/thunderbird-gnome-theme";
|
url = "github:rafaelmardojai/thunderbird-gnome-theme";
|
||||||
flake = false;
|
flake = false;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
outputs = inputs @ { self, nixpkgs, agenix, home-manager, ... }:
|
outputs = inputs @ { self, nixpkgs, ... }:
|
||||||
let
|
let
|
||||||
nixpkgsForSystem = system: inputs.nixpkgs;
|
inherit (nixpkgs) lib;
|
||||||
overlays = [
|
|
||||||
agenix.overlays.default
|
domain = "mesh.vimium.net";
|
||||||
(import ./overlays/gnome.nix)
|
forEverySystem = lib.getAttrs lib.systems.flakeExposed;
|
||||||
|
forEachSystem = lib.genAttrs [
|
||||||
|
"x86_64-linux"
|
||||||
|
"aarch64-linux"
|
||||||
];
|
];
|
||||||
commonModules = [
|
mkDeployNode = hostName: {
|
||||||
agenix.nixosModules.age
|
hostname = "${hostName}.${domain}";
|
||||||
home-manager.nixosModule
|
|
||||||
./modules
|
profiles.system = {
|
||||||
];
|
user = "root";
|
||||||
nixosSystem = system: name:
|
path = inputs.deploy-rs.lib.${self.nixosConfigurations.${hostName}.config.system.build.toplevel.system}.activate.nixos self.nixosConfigurations.${hostName};
|
||||||
let
|
};
|
||||||
nixpkgs = nixpkgsForSystem system;
|
};
|
||||||
lib = (import nixpkgs { inherit overlays system; }).lib;
|
|
||||||
in
|
in
|
||||||
inputs.nixpkgs.lib.nixosSystem {
|
|
||||||
inherit lib system;
|
|
||||||
specialArgs = { modulesPath = toString (nixpkgs + "/nixos/modules"); inherit inputs; };
|
|
||||||
baseModules = import (nixpkgs + "/nixos/modules/module-list.nix");
|
|
||||||
modules = commonModules ++ [
|
|
||||||
({ config, ... }:
|
|
||||||
{
|
{
|
||||||
nixpkgs.pkgs = import nixpkgs {
|
overlays = lib.packagesFromDirectoryRecursive {
|
||||||
inherit overlays system;
|
callPackage = path: overrides: import path;
|
||||||
config.allowUnfree = true;
|
directory = ./overlays;
|
||||||
};
|
};
|
||||||
networking.hostName = name;
|
|
||||||
nix = {
|
legacyPackages = forEachSystem (system:
|
||||||
extraOptions = "experimental-features = nix-command flakes";
|
lib.packagesFromDirectoryRecursive {
|
||||||
|
callPackage = nixpkgs.legacyPackages.${system}.callPackage;
|
||||||
|
directory = ./pkgs;
|
||||||
|
});
|
||||||
|
|
||||||
|
nixosConfigurations = lib.pipe ./hosts [
|
||||||
|
builtins.readDir
|
||||||
|
(lib.filterAttrs (name: value: value == "directory"))
|
||||||
|
(lib.mapAttrs (name: value:
|
||||||
|
lib.nixosSystem {
|
||||||
|
specialArgs = { inherit self; };
|
||||||
|
|
||||||
|
modules = [
|
||||||
|
{
|
||||||
|
networking = {
|
||||||
|
inherit domain;
|
||||||
|
hostName = name;
|
||||||
};
|
};
|
||||||
})
|
}
|
||||||
./hosts/${name}
|
./hosts/${name}
|
||||||
];
|
];
|
||||||
|
}))
|
||||||
|
];
|
||||||
|
|
||||||
|
devShells.x86_64-linux.default = nixpkgs.legacyPackages.x86_64-linux.mkShell {
|
||||||
|
buildInputs = [
|
||||||
|
inputs.agenix.packages.x86_64-linux.agenix
|
||||||
|
inputs.deploy-rs.packages.x86_64-linux.deploy-rs
|
||||||
|
];
|
||||||
};
|
};
|
||||||
nixosConfigurations = {
|
|
||||||
atlas = nixosSystem "x86_64-linux" "atlas";
|
deploy = {
|
||||||
eos = nixosSystem "x86_64-linux" "eos";
|
magicRollback = true;
|
||||||
helios = nixosSystem "x86_64-linux" "helios";
|
autoRollback = true;
|
||||||
odyssey = nixosSystem "x86_64-linux" "odyssey";
|
sshUser = "root";
|
||||||
|
nodes = lib.genAttrs [
|
||||||
|
"mail"
|
||||||
|
# "pi"
|
||||||
|
# "skycam"
|
||||||
|
"vps1"
|
||||||
|
] mkDeployNode;
|
||||||
|
};
|
||||||
|
|
||||||
|
checks = builtins.mapAttrs (system: deployLib: deployLib.deployChecks self.deploy) inputs.deploy-rs.lib;
|
||||||
};
|
};
|
||||||
in
|
|
||||||
{ inherit nixosConfigurations; };
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
{ config, lib, pkgs, ... }:
|
{ config, ... }:
|
||||||
|
|
||||||
{
|
{
|
||||||
imports = [
|
imports = [
|
||||||
@ -6,21 +6,20 @@
|
|||||||
../desktop.nix
|
../desktop.nix
|
||||||
];
|
];
|
||||||
|
|
||||||
boot.loader.systemd-boot.enable = true;
|
nixpkgs.hostPlatform = "x86_64-linux";
|
||||||
boot.loader.efi.canTouchEfiVariables = true;
|
|
||||||
|
|
||||||
networking.hostName = "atlas";
|
boot.loader = {
|
||||||
networking.hostId = "8425e349";
|
systemd-boot.enable = true;
|
||||||
networking.networkmanager.enable = true;
|
efi.canTouchEfiVariables = true;
|
||||||
|
};
|
||||||
|
|
||||||
nix.package = pkgs.nixFlakes;
|
networking = {
|
||||||
nix.extraOptions = ''
|
hostId = "8425e349";
|
||||||
experimental-features = nix-command flakes
|
networkmanager.enable = true;
|
||||||
'';
|
};
|
||||||
|
|
||||||
users.defaultUserShell = pkgs.zsh;
|
virtualisation.virtualbox.host.enable = true;
|
||||||
|
users.extraGroups.vboxusers.members = [ "jordan" ];
|
||||||
system.stateVersion = "22.11";
|
|
||||||
|
|
||||||
modules = {
|
modules = {
|
||||||
desktop = {
|
desktop = {
|
||||||
@ -42,15 +41,25 @@
|
|||||||
};
|
};
|
||||||
editors = {
|
editors = {
|
||||||
neovim.enable = true;
|
neovim.enable = true;
|
||||||
vscode.enable = true;
|
|
||||||
};
|
};
|
||||||
security = {
|
security = {
|
||||||
gpg.enable = true;
|
gpg.enable = true;
|
||||||
pass.enable = true;
|
pass.enable = true;
|
||||||
};
|
};
|
||||||
|
services = {
|
||||||
|
borgmatic = {
|
||||||
|
enable = true;
|
||||||
|
directories = [
|
||||||
|
"/home/jordan/Documents"
|
||||||
|
];
|
||||||
|
repoPath = "ssh://uzu2y5b1@uzu2y5b1.repo.borgbase.com/./repo";
|
||||||
|
};
|
||||||
|
};
|
||||||
shell = {
|
shell = {
|
||||||
git.enable = true;
|
git.enable = true;
|
||||||
zsh.enable = true;
|
zsh.enable = true;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
system.stateVersion = "22.11";
|
||||||
}
|
}
|
||||||
|
99
hosts/common.nix
Normal file
99
hosts/common.nix
Normal file
@ -0,0 +1,99 @@
|
|||||||
|
{ config, pkgs, self, ... }:
|
||||||
|
|
||||||
|
{
|
||||||
|
imports = [
|
||||||
|
self.inputs.agenix.nixosModules.age
|
||||||
|
self.inputs.home-manager.nixosModule
|
||||||
|
../modules
|
||||||
|
];
|
||||||
|
|
||||||
|
nixpkgs.overlays = [
|
||||||
|
self.inputs.agenix.overlays.default
|
||||||
|
(import ../overlays/default.nix)
|
||||||
|
(
|
||||||
|
final: prev: {
|
||||||
|
unstable = import self.inputs.nixpkgs-unstable { system = final.system; };
|
||||||
|
}
|
||||||
|
)
|
||||||
|
];
|
||||||
|
|
||||||
|
time.timeZone = "Europe/London";
|
||||||
|
|
||||||
|
i18n.defaultLocale = "en_GB.UTF-8";
|
||||||
|
i18n.extraLocaleSettings = {
|
||||||
|
LC_ADDRESS = "en_GB.UTF-8";
|
||||||
|
LC_IDENTIFICATION = "en_GB.UTF-8";
|
||||||
|
LC_MEASUREMENT = "en_GB.UTF-8";
|
||||||
|
LC_MONETARY = "en_GB.UTF-8";
|
||||||
|
LC_NAME = "en_GB.UTF-8";
|
||||||
|
LC_NUMERIC = "en_GB.UTF-8";
|
||||||
|
LC_PAPER = "en_GB.UTF-8";
|
||||||
|
LC_TELEPHONE = "en_GB.UTF-8";
|
||||||
|
LC_TIME = "en_GB.UTF-8";
|
||||||
|
};
|
||||||
|
|
||||||
|
console.keyMap = "uk";
|
||||||
|
|
||||||
|
security.sudo.execWheelOnly = true;
|
||||||
|
|
||||||
|
services.openssh = {
|
||||||
|
enable = true;
|
||||||
|
settings = {
|
||||||
|
KbdInteractiveAuthentication = false;
|
||||||
|
PasswordAuthentication = false;
|
||||||
|
PermitRootLogin = "no";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
services.journald.extraConfig = ''
|
||||||
|
SystemMaxUse=4G
|
||||||
|
MaxRetentionSec=90day
|
||||||
|
'';
|
||||||
|
|
||||||
|
users.defaultUserShell = pkgs.zsh;
|
||||||
|
programs.zsh.enable = true;
|
||||||
|
|
||||||
|
nix = {
|
||||||
|
package = pkgs.nixFlakes;
|
||||||
|
extraOptions = ''
|
||||||
|
experimental-features = nix-command flakes
|
||||||
|
'';
|
||||||
|
buildMachines = [
|
||||||
|
{
|
||||||
|
hostName = "10.0.1.79";
|
||||||
|
sshUser = "root";
|
||||||
|
system = "aarch64-linux";
|
||||||
|
maxJobs = 6;
|
||||||
|
speedFactor = 1;
|
||||||
|
supportedFeatures = [ "big-parallel" "benchmark" ];
|
||||||
|
}
|
||||||
|
];
|
||||||
|
distributedBuilds = true;
|
||||||
|
settings = {
|
||||||
|
connect-timeout = 5;
|
||||||
|
log-lines = 25;
|
||||||
|
min-free = 128000000;
|
||||||
|
max-free = 1000000000;
|
||||||
|
fallback = true;
|
||||||
|
trusted-users = [ "@wheel" ];
|
||||||
|
auto-optimise-store = true;
|
||||||
|
substituters = [
|
||||||
|
"http://odyssey.mesh.vimium.net"
|
||||||
|
"https://cache.nixos.org"
|
||||||
|
];
|
||||||
|
trusted-public-keys = [
|
||||||
|
"odyssey.mesh.vimium.net:ZhQhjscPWjoN4rlZwoMELznEiBnZ9O26iyGA27ibilQ="
|
||||||
|
];
|
||||||
|
};
|
||||||
|
gc = {
|
||||||
|
automatic = true;
|
||||||
|
dates = "weekly";
|
||||||
|
options = "-d --delete-older-than 7d";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
environment.systemPackages = with pkgs; [
|
||||||
|
git
|
||||||
|
neovim
|
||||||
|
];
|
||||||
|
}
|
@ -1,33 +1,16 @@
|
|||||||
{ config, lib, pkgs, ... }:
|
{ config, pkgs, ... }:
|
||||||
|
|
||||||
{
|
{
|
||||||
time.timeZone = "Europe/London";
|
imports = [
|
||||||
|
./common.nix
|
||||||
|
];
|
||||||
|
|
||||||
i18n.defaultLocale = "en_GB.UTF-8";
|
nixpkgs.overlays = [
|
||||||
i18n.extraLocaleSettings = {
|
(import ../overlays/gnome.nix)
|
||||||
LC_ADDRESS = "en_GB.UTF-8";
|
];
|
||||||
LC_IDENTIFICATION = "en_GB.UTF-8";
|
|
||||||
LC_MEASUREMENT = "en_GB.UTF-8";
|
|
||||||
LC_MONETARY = "en_GB.UTF-8";
|
|
||||||
LC_NAME = "en_GB.UTF-8";
|
|
||||||
LC_NUMERIC = "en_GB.UTF-8";
|
|
||||||
LC_PAPER = "en_GB.UTF-8";
|
|
||||||
LC_TELEPHONE = "en_GB.UTF-8";
|
|
||||||
LC_TIME = "en_GB.UTF-8";
|
|
||||||
};
|
|
||||||
|
|
||||||
console.keyMap = "uk";
|
|
||||||
|
|
||||||
services.printing.enable = true;
|
services.printing.enable = true;
|
||||||
services.openssh = {
|
services.openssh.startWhenNeeded = true;
|
||||||
enable = true;
|
|
||||||
settings = {
|
|
||||||
KbdInteractiveAuthentication = false;
|
|
||||||
PasswordAuthentication = false;
|
|
||||||
PermitRootLogin = "no";
|
|
||||||
};
|
|
||||||
startWhenNeeded = true;
|
|
||||||
};
|
|
||||||
|
|
||||||
sound.enable = true;
|
sound.enable = true;
|
||||||
hardware.pulseaudio.enable = false;
|
hardware.pulseaudio.enable = false;
|
||||||
@ -39,34 +22,58 @@
|
|||||||
pulse.enable = true;
|
pulse.enable = true;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
fileSystems."/mnt/library" = {
|
||||||
|
device = "library.mesh.vimium.net:/mnt/library";
|
||||||
|
fsType = "nfs";
|
||||||
|
options = [
|
||||||
|
"nfsvers=4.2"
|
||||||
|
"bg"
|
||||||
|
"soft"
|
||||||
|
"timeo=20"
|
||||||
|
"retry=5"
|
||||||
|
"nocto"
|
||||||
|
"ro"
|
||||||
|
"x-systemd.automount"
|
||||||
|
"x-systemd.requires=tailscaled.service"
|
||||||
|
"noauto"
|
||||||
|
];
|
||||||
|
};
|
||||||
|
|
||||||
|
system.autoUpgrade = {
|
||||||
|
enable = true;
|
||||||
|
flake = "git+ssh://git@git.vimium.com/jordan/nix-config.git";
|
||||||
|
randomizedDelaySec = "10min";
|
||||||
|
};
|
||||||
|
|
||||||
|
systemd.services.NetworkManager-wait-online.enable = false;
|
||||||
|
|
||||||
|
fonts.packages = with pkgs; [
|
||||||
|
noto-fonts
|
||||||
|
(nerdfonts.override { fonts = [ "BigBlueTerminal" "ComicShannsMono" "Terminus" "UbuntuMono" ]; })
|
||||||
|
];
|
||||||
|
|
||||||
|
modules = {
|
||||||
|
desktop.gnome.enable = true;
|
||||||
|
networking.tailscale.enable = true;
|
||||||
|
};
|
||||||
|
|
||||||
environment.systemPackages = with pkgs; [
|
environment.systemPackages = with pkgs; [
|
||||||
git
|
bind
|
||||||
neovim
|
bmon
|
||||||
|
fd
|
||||||
|
ffmpeg
|
||||||
|
iotop
|
||||||
|
# unstable.nix-du
|
||||||
|
# unstable.nix-melt
|
||||||
|
unstable.nix-tree
|
||||||
|
unstable.nix-visualize
|
||||||
|
ripgrep
|
||||||
|
rsync
|
||||||
|
tcpdump
|
||||||
|
tokei
|
||||||
|
tree
|
||||||
|
wl-clipboard
|
||||||
];
|
];
|
||||||
|
|
||||||
nix = {
|
environment.sessionVariables.NIXOS_OZONE_WL = "1";
|
||||||
settings = {
|
|
||||||
connect-timeout = 5;
|
|
||||||
log-lines = 25;
|
|
||||||
min-free = 128000000;
|
|
||||||
max-free = 1000000000;
|
|
||||||
fallback = true;
|
|
||||||
auto-optimise-store = true;
|
|
||||||
substituters = [
|
|
||||||
"http://odyssey.mesh.vimium.net"
|
|
||||||
"https://cache.nixos.org"
|
|
||||||
];
|
|
||||||
trusted-public-keys = [
|
|
||||||
"odyssey.mesh.vimium.net:ZhQhjscPWjoN4rlZwoMELznEiBnZ9O26iyGA27ibilQ="
|
|
||||||
];
|
|
||||||
};
|
|
||||||
gc = {
|
|
||||||
automatic = true;
|
|
||||||
dates = "weekly";
|
|
||||||
options = "-d --delete-older-than 7d";
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
modules.desktop.gnome.enable = true;
|
|
||||||
modules.networking.tailscale.enable = true;
|
|
||||||
}
|
}
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
{ config, lib, pkgs, ... }:
|
{ config, ... }:
|
||||||
|
|
||||||
{
|
{
|
||||||
imports = [
|
imports = [
|
||||||
@ -6,22 +6,17 @@
|
|||||||
../desktop.nix
|
../desktop.nix
|
||||||
];
|
];
|
||||||
|
|
||||||
boot.loader.systemd-boot.enable = true;
|
nixpkgs.hostPlatform = "x86_64-linux";
|
||||||
boot.loader.efi.canTouchEfiVariables = true;
|
|
||||||
|
|
||||||
networking.hostName = "eos";
|
boot.loader = {
|
||||||
networking.hostId = "cc858347";
|
systemd-boot.enable = true;
|
||||||
networking.networkmanager.enable = true;
|
efi.canTouchEfiVariables = true;
|
||||||
|
};
|
||||||
|
|
||||||
nix.package = pkgs.nixFlakes;
|
networking = {
|
||||||
nix.extraOptions = ''
|
hostId = "cc858347";
|
||||||
experimental-features = nix-command flakes
|
networkmanager.enable = true;
|
||||||
'';
|
};
|
||||||
nix.settings.auto-optimise-store = true;
|
|
||||||
|
|
||||||
users.defaultUserShell = pkgs.zsh;
|
|
||||||
|
|
||||||
system.stateVersion = "22.11";
|
|
||||||
|
|
||||||
dconf.settings = {
|
dconf.settings = {
|
||||||
"org/gnome/desktop/interface" = {
|
"org/gnome/desktop/interface" = {
|
||||||
@ -51,4 +46,6 @@
|
|||||||
zsh.enable = true;
|
zsh.enable = true;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
system.stateVersion = "22.11";
|
||||||
}
|
}
|
||||||
|
@ -7,11 +7,12 @@
|
|||||||
|
|
||||||
boot = {
|
boot = {
|
||||||
initrd.availableKernelModules = [ "ehci_pci" "ahci" "usb_storage" "sd_mod" "sdhci_pci" ];
|
initrd.availableKernelModules = [ "ehci_pci" "ahci" "usb_storage" "sd_mod" "sdhci_pci" ];
|
||||||
initrd.kernelModules = [ ];
|
|
||||||
initrd.supportedFilesystems = [ "zfs" ];
|
initrd.supportedFilesystems = [ "zfs" ];
|
||||||
kernelModules = [ ];
|
kernel.sysctl = {
|
||||||
|
"kernel.nmi_watchdog" = 0;
|
||||||
|
"vm.laptop_mode" = 5;
|
||||||
|
};
|
||||||
kernelParams = [ "elevator=none" ];
|
kernelParams = [ "elevator=none" ];
|
||||||
extraModulePackages = [ ];
|
|
||||||
supportedFilesystems = [ "zfs" ];
|
supportedFilesystems = [ "zfs" ];
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
{ config, lib, pkgs, ... }:
|
{ config, ... }:
|
||||||
|
|
||||||
{
|
{
|
||||||
imports = [
|
imports = [
|
||||||
@ -6,22 +6,20 @@
|
|||||||
../desktop.nix
|
../desktop.nix
|
||||||
];
|
];
|
||||||
|
|
||||||
boot.loader.grub.enable = true;
|
nixpkgs.hostPlatform = "x86_64-linux";
|
||||||
boot.loader.grub.device = "/dev/sda";
|
|
||||||
boot.loader.grub.zfsSupport = true;
|
|
||||||
|
|
||||||
networking.hostName = "helios";
|
boot = {
|
||||||
networking.hostId = "47d23505";
|
loader.grub = {
|
||||||
networking.networkmanager.enable = true;
|
enable = true;
|
||||||
|
device = "/dev/sda";
|
||||||
|
zfsSupport = true;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
nix.package = pkgs.nixFlakes;
|
networking = {
|
||||||
nix.extraOptions = ''
|
hostId = "47d23505";
|
||||||
experimental-features = nix-command flakes
|
networkmanager.enable = true;
|
||||||
'';
|
};
|
||||||
|
|
||||||
users.defaultUserShell = pkgs.zsh;
|
|
||||||
|
|
||||||
system.stateVersion = "22.11";
|
|
||||||
|
|
||||||
modules = {
|
modules = {
|
||||||
desktop = {
|
desktop = {
|
||||||
@ -40,9 +38,20 @@
|
|||||||
gpg.enable = true;
|
gpg.enable = true;
|
||||||
pass.enable = true;
|
pass.enable = true;
|
||||||
};
|
};
|
||||||
|
services = {
|
||||||
|
borgmatic = {
|
||||||
|
enable = true;
|
||||||
|
directories = [
|
||||||
|
"/home/jordan/Documents"
|
||||||
|
];
|
||||||
|
repoPath = "ssh://b9cjl9hq@b9cjl9hq.repo.borgbase.com/./repo";
|
||||||
|
};
|
||||||
|
};
|
||||||
shell = {
|
shell = {
|
||||||
git.enable = true;
|
git.enable = true;
|
||||||
zsh.enable = true;
|
zsh.enable = true;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
system.stateVersion = "22.11";
|
||||||
}
|
}
|
||||||
|
102
hosts/hypnos/0001-Add-apple_set_os-EFI-boot-service.patch
Normal file
102
hosts/hypnos/0001-Add-apple_set_os-EFI-boot-service.patch
Normal file
@ -0,0 +1,102 @@
|
|||||||
|
From d310ddee0fb8e7a5a8b89668c6cb8f9dc863ce94 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Jordan Holt <jordan@vimium.com>
|
||||||
|
Date: Sun, 28 Apr 2024 15:59:52 +0100
|
||||||
|
Subject: [PATCH] Add apple_set_os EFI boot service
|
||||||
|
|
||||||
|
---
|
||||||
|
drivers/firmware/efi/libstub/x86-stub.c | 59 +++++++++++++++++++++++++
|
||||||
|
include/linux/efi.h | 1 +
|
||||||
|
2 files changed, 60 insertions(+)
|
||||||
|
|
||||||
|
diff --git a/drivers/firmware/efi/libstub/x86-stub.c b/drivers/firmware/efi/libstub/x86-stub.c
|
||||||
|
index d5a8182cf..be722c43a 100644
|
||||||
|
--- a/drivers/firmware/efi/libstub/x86-stub.c
|
||||||
|
+++ b/drivers/firmware/efi/libstub/x86-stub.c
|
||||||
|
@@ -449,6 +449,63 @@ static void setup_graphics(struct boot_params *boot_params)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
+typedef struct {
|
||||||
|
+ u64 version;
|
||||||
|
+ void (*set_os_version) (const char *os_version);
|
||||||
|
+ void (*set_os_vendor) (const char *os_vendor);
|
||||||
|
+} apple_set_os_interface_t;
|
||||||
|
+
|
||||||
|
+static efi_status_t apple_set_os()
|
||||||
|
+{
|
||||||
|
+ apple_set_os_interface_t *set_os;
|
||||||
|
+ efi_guid_t set_os_guid = APPLE_SET_OS_PROTOCOL_GUID;
|
||||||
|
+ efi_status_t status;
|
||||||
|
+ void **handles;
|
||||||
|
+ unsigned long i, nr_handles, size = 0;
|
||||||
|
+
|
||||||
|
+ status = efi_bs_call(locate_handle, EFI_LOCATE_BY_PROTOCOL,
|
||||||
|
+ &set_os_guid, NULL, &size, handles);
|
||||||
|
+
|
||||||
|
+ if (status == EFI_BUFFER_TOO_SMALL) {
|
||||||
|
+ status = efi_bs_call(allocate_pool, EFI_LOADER_DATA,
|
||||||
|
+ size, &handles);
|
||||||
|
+
|
||||||
|
+ if (status != EFI_SUCCESS)
|
||||||
|
+ return status;
|
||||||
|
+
|
||||||
|
+ status = efi_bs_call(locate_handle, EFI_LOCATE_BY_PROTOCOL,
|
||||||
|
+ &set_os_guid, NULL, &size, handles);
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ if (status != EFI_SUCCESS)
|
||||||
|
+ goto free_handle;
|
||||||
|
+
|
||||||
|
+ nr_handles = size / sizeof(void *);
|
||||||
|
+ for (i = 0; i < nr_handles; i++) {
|
||||||
|
+ void *h = handles[i];
|
||||||
|
+
|
||||||
|
+ status = efi_bs_call(handle_protocol, h,
|
||||||
|
+ &set_os_guid, &set_os);
|
||||||
|
+
|
||||||
|
+ if (status != EFI_SUCCESS || !set_os)
|
||||||
|
+ continue;
|
||||||
|
+
|
||||||
|
+ if (set_os->version > 0) {
|
||||||
|
+ efi_bs_call((unsigned long)set_os->set_os_version,
|
||||||
|
+ "Mac OS X 10.9");
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ if (set_os->version >= 2) {
|
||||||
|
+ efi_bs_call((unsigned long)set_os->set_os_vendor,
|
||||||
|
+ "Apple Inc.");
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+free_handle:
|
||||||
|
+ efi_bs_call(free_pool, uga_handle);
|
||||||
|
+
|
||||||
|
+ return status;
|
||||||
|
+}
|
||||||
|
|
||||||
|
static void __noreturn efi_exit(efi_handle_t handle, efi_status_t status)
|
||||||
|
{
|
||||||
|
@@ -951,6 +1008,8 @@ void __noreturn efi_stub_entry(efi_handle_t handle,
|
||||||
|
|
||||||
|
setup_unaccepted_memory();
|
||||||
|
|
||||||
|
+ apple_set_os();
|
||||||
|
+
|
||||||
|
status = exit_boot(boot_params, handle);
|
||||||
|
if (status != EFI_SUCCESS) {
|
||||||
|
efi_err("exit_boot() failed!\n");
|
||||||
|
diff --git a/include/linux/efi.h b/include/linux/efi.h
|
||||||
|
index d59b0947f..81158014f 100644
|
||||||
|
--- a/include/linux/efi.h
|
||||||
|
+++ b/include/linux/efi.h
|
||||||
|
@@ -385,6 +385,7 @@ void efi_native_runtime_setup(void);
|
||||||
|
#define EFI_MEMORY_ATTRIBUTES_TABLE_GUID EFI_GUID(0xdcfa911d, 0x26eb, 0x469f, 0xa2, 0x20, 0x38, 0xb7, 0xdc, 0x46, 0x12, 0x20)
|
||||||
|
#define EFI_CONSOLE_OUT_DEVICE_GUID EFI_GUID(0xd3b36f2c, 0xd551, 0x11d4, 0x9a, 0x46, 0x00, 0x90, 0x27, 0x3f, 0xc1, 0x4d)
|
||||||
|
#define APPLE_PROPERTIES_PROTOCOL_GUID EFI_GUID(0x91bd12fe, 0xf6c3, 0x44fb, 0xa5, 0xb7, 0x51, 0x22, 0xab, 0x30, 0x3a, 0xe0)
|
||||||
|
+#define APPLE_SET_OS_PROTOCOL_GUID EFI_GUID(0xc5c5da95, 0x7d5c, 0x45e6, 0xb2, 0xf1, 0x3f, 0xd5, 0x2b, 0xb1, 0x00, 0x77)
|
||||||
|
#define EFI_TCG2_PROTOCOL_GUID EFI_GUID(0x607f766c, 0x7455, 0x42be, 0x93, 0x0b, 0xe4, 0xd7, 0x6d, 0xb2, 0x72, 0x0f)
|
||||||
|
#define EFI_TCG2_FINAL_EVENTS_TABLE_GUID EFI_GUID(0x1e2ed096, 0x30e2, 0x4254, 0xbd, 0x89, 0x86, 0x3b, 0xbe, 0xf8, 0x23, 0x25)
|
||||||
|
#define EFI_LOAD_FILE_PROTOCOL_GUID EFI_GUID(0x56ec3091, 0x954c, 0x11d2, 0x8e, 0x3f, 0x00, 0xa0, 0xc9, 0x69, 0x72, 0x3b)
|
||||||
|
--
|
||||||
|
2.42.0
|
||||||
|
|
35
hosts/hypnos/README.md
Normal file
35
hosts/hypnos/README.md
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
# Hypnos
|
||||||
|
|
||||||
|
## Overview
|
||||||
|
15-inch MacBook Pro 11,3 (Mid 2014).
|
||||||
|
|
||||||
|
## Specs
|
||||||
|
* CPU - Intel Core i7-4870HQ @ 2.50GHz
|
||||||
|
* Memory - 16 GB DDR3
|
||||||
|
* GPU - Intel Iris Pro 5200
|
||||||
|
* GPU - NVIDIA GeForce GT 750M
|
||||||
|
* NIC - Broadcom BCM43xx 802.11ac
|
||||||
|
|
||||||
|
### Disks
|
||||||
|
Device | Partitions _(filesystem, size, usage)_
|
||||||
|
--- | ---
|
||||||
|
Apple SSD SM0512F | `/dev/sda1` (EFI, 256 MiB, NixOS Boot) <br> `/dev/sda2` (ZFS, 500 GiB, NixOS Root)
|
||||||
|
|
||||||
|
#### ZFS pool layout
|
||||||
|
```
|
||||||
|
rpool/
|
||||||
|
├── local
|
||||||
|
│ ├── nix
|
||||||
|
│ └── tmp
|
||||||
|
├── system
|
||||||
|
│ ├── root
|
||||||
|
│ └── var
|
||||||
|
└── user
|
||||||
|
└── home
|
||||||
|
```
|
||||||
|
|
||||||
|
See [Graham Christensen's article](https://grahamc.com/blog/nixos-on-zfs/#datasets) for the motivation behind these datasets.
|
||||||
|
|
||||||
|
### Networks
|
||||||
|
- DHCP on `10.0.1.0/24` subnet.
|
||||||
|
- Tailscale on `100.64.0.0/10` subnet. FQDN: `hypnos.mesh.vimium.net`.
|
67
hosts/hypnos/default.nix
Normal file
67
hosts/hypnos/default.nix
Normal file
@ -0,0 +1,67 @@
|
|||||||
|
{ config, lib, self, ... }:
|
||||||
|
|
||||||
|
{
|
||||||
|
imports = [
|
||||||
|
self.inputs.disko.nixosModules.disko
|
||||||
|
./hardware-configuration.nix
|
||||||
|
./disko-config.nix
|
||||||
|
../desktop.nix
|
||||||
|
];
|
||||||
|
|
||||||
|
nixpkgs = {
|
||||||
|
hostPlatform = "x86_64-linux";
|
||||||
|
config = {
|
||||||
|
allowUnfree = true;
|
||||||
|
nvidia.acceptLicense = true;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
boot.loader = {
|
||||||
|
systemd-boot.enable = true;
|
||||||
|
efi.canTouchEfiVariables = true;
|
||||||
|
};
|
||||||
|
|
||||||
|
networking.hostId = "cf791898";
|
||||||
|
|
||||||
|
# nvidia 470 driver doesn't work with Wayland
|
||||||
|
services = {
|
||||||
|
xserver = {
|
||||||
|
displayManager.gdm.wayland = lib.mkForce false;
|
||||||
|
videoDrivers = [ "nvidia" ];
|
||||||
|
};
|
||||||
|
displayManager = {
|
||||||
|
defaultSession = if config.modules.desktop.kde.enable then "plasmax11" else "gnome-xorg";
|
||||||
|
sddm.wayland.enable = lib.mkForce false;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
# Workaround for label rendering bug in GTK4 with nvidia 470 driver
|
||||||
|
environment.sessionVariables.GSK_RENDERER = "gl";
|
||||||
|
|
||||||
|
modules = {
|
||||||
|
desktop = {
|
||||||
|
browsers = {
|
||||||
|
firefox.enable = true;
|
||||||
|
};
|
||||||
|
media.recording = {
|
||||||
|
audio.enable = true;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
dev = {
|
||||||
|
node.enable = true;
|
||||||
|
};
|
||||||
|
editors = {
|
||||||
|
neovim.enable = true;
|
||||||
|
};
|
||||||
|
security = {
|
||||||
|
gpg.enable = true;
|
||||||
|
pass.enable = true;
|
||||||
|
};
|
||||||
|
shell = {
|
||||||
|
git.enable = true;
|
||||||
|
zsh.enable = true;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
system.stateVersion = "22.11";
|
||||||
|
}
|
126
hosts/hypnos/disko-config.nix
Normal file
126
hosts/hypnos/disko-config.nix
Normal file
@ -0,0 +1,126 @@
|
|||||||
|
{ lib, ... }:
|
||||||
|
{
|
||||||
|
disko.devices = {
|
||||||
|
disk = {
|
||||||
|
main = {
|
||||||
|
type = "disk";
|
||||||
|
device = "/dev/disk/by-id/ata-APPLE_SSD_SM0512F_S1K5NYBF736152";
|
||||||
|
content = {
|
||||||
|
type = "gpt";
|
||||||
|
partitions = {
|
||||||
|
ESP = {
|
||||||
|
size = "256M";
|
||||||
|
type = "EF00";
|
||||||
|
content = {
|
||||||
|
type = "filesystem";
|
||||||
|
format = "vfat";
|
||||||
|
mountpoint = "/boot";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
zfs = {
|
||||||
|
size = "100%";
|
||||||
|
content = {
|
||||||
|
type = "zfs";
|
||||||
|
pool = "rpool";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
zpool = {
|
||||||
|
rpool = {
|
||||||
|
type = "zpool";
|
||||||
|
options = {
|
||||||
|
ashift = "12";
|
||||||
|
};
|
||||||
|
rootFsOptions = {
|
||||||
|
canmount = "off";
|
||||||
|
mountpoint = "none";
|
||||||
|
dnodesize = "auto";
|
||||||
|
xattr = "sa";
|
||||||
|
};
|
||||||
|
postCreateHook = "zfs snapshot rpool@blank";
|
||||||
|
datasets = {
|
||||||
|
local = {
|
||||||
|
type = "zfs_fs";
|
||||||
|
options = {
|
||||||
|
mountpoint = "none";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
"local/nix" = {
|
||||||
|
type = "zfs_fs";
|
||||||
|
mountpoint = "/nix";
|
||||||
|
options = {
|
||||||
|
atime = "off";
|
||||||
|
mountpoint = "legacy";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
"local/tmp" = {
|
||||||
|
type = "zfs_fs";
|
||||||
|
mountpoint = "/tmp";
|
||||||
|
options = {
|
||||||
|
setuid = "off";
|
||||||
|
devices = "off";
|
||||||
|
mountpoint = "legacy";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
system = {
|
||||||
|
type = "zfs_fs";
|
||||||
|
mountpoint = "/";
|
||||||
|
options = {
|
||||||
|
mountpoint = "legacy";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
"system/var" = {
|
||||||
|
type = "zfs_fs";
|
||||||
|
mountpoint = "/var";
|
||||||
|
options = {
|
||||||
|
mountpoint = "legacy";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
"system/var/tmp" = {
|
||||||
|
type = "zfs_fs";
|
||||||
|
mountpoint = "/var/tmp";
|
||||||
|
options = {
|
||||||
|
devices = "off";
|
||||||
|
mountpoint = "legacy";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
"system/var/log" = {
|
||||||
|
type = "zfs_fs";
|
||||||
|
mountpoint = "/var/log";
|
||||||
|
options = {
|
||||||
|
compression = "on";
|
||||||
|
acltype = "posix";
|
||||||
|
mountpoint = "legacy";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
user = {
|
||||||
|
type = "zfs_fs";
|
||||||
|
options = {
|
||||||
|
mountpoint = "none";
|
||||||
|
encryption = "aes-256-gcm";
|
||||||
|
keyformat = "passphrase";
|
||||||
|
keylocation = "file:///tmp/secret.key";
|
||||||
|
};
|
||||||
|
# use this to read the key during boot
|
||||||
|
postCreateHook = ''
|
||||||
|
zfs set keylocation="prompt" "rpool/$name";
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
"user/home" = {
|
||||||
|
type = "zfs_fs";
|
||||||
|
mountpoint = "/home";
|
||||||
|
options = {
|
||||||
|
setuid = "off";
|
||||||
|
devices = "off";
|
||||||
|
mountpoint = "legacy";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
42
hosts/hypnos/hardware-configuration.nix
Normal file
42
hosts/hypnos/hardware-configuration.nix
Normal file
@ -0,0 +1,42 @@
|
|||||||
|
{ config, lib, pkgs, modulesPath, ... }:
|
||||||
|
|
||||||
|
{
|
||||||
|
imports = [
|
||||||
|
(modulesPath + "/installer/scan/not-detected.nix")
|
||||||
|
];
|
||||||
|
|
||||||
|
boot = {
|
||||||
|
initrd.availableKernelModules = [ "xhci_pci" "ahci" "usbhid" "usb_storage" "sd_mod" ];
|
||||||
|
kernel.sysctl = {
|
||||||
|
"kernel.nmi_watchdog" = 0;
|
||||||
|
"vm.laptop_mode" = 5;
|
||||||
|
};
|
||||||
|
kernelModules = [ "applesmc" "kvm-intel" "wl" ];
|
||||||
|
extraModulePackages = [
|
||||||
|
config.boot.kernelPackages.broadcom_sta
|
||||||
|
config.boot.kernelPackages.nvidiaPackages.legacy_470
|
||||||
|
];
|
||||||
|
};
|
||||||
|
|
||||||
|
networking.useDHCP = lib.mkDefault true;
|
||||||
|
|
||||||
|
nixpkgs.hostPlatform = lib.mkDefault "x86_64-linux";
|
||||||
|
|
||||||
|
hardware = {
|
||||||
|
cpu.intel.updateMicrocode = lib.mkDefault config.hardware.enableRedistributableFirmware;
|
||||||
|
nvidia = {
|
||||||
|
package = config.boot.kernelPackages.nvidiaPackages.legacy_470;
|
||||||
|
modesetting.enable = true;
|
||||||
|
powerManagement.enable = true;
|
||||||
|
};
|
||||||
|
opengl = {
|
||||||
|
enable = true;
|
||||||
|
extraPackages = with pkgs; [
|
||||||
|
libvdpau-va-gl
|
||||||
|
];
|
||||||
|
driSupport = true;
|
||||||
|
driSupport32Bit = true;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
46
hosts/library/README.md
Normal file
46
hosts/library/README.md
Normal file
@ -0,0 +1,46 @@
|
|||||||
|
# Library
|
||||||
|
|
||||||
|
## Overview
|
||||||
|
Media and public file server.
|
||||||
|
|
||||||
|
## Specs
|
||||||
|
* CPU - AMD Ryzen 5 5600G @ 3.90GHz
|
||||||
|
* Chipset - AMD B550
|
||||||
|
* Memory - 64 GB DDR4
|
||||||
|
* Motherboard - ASRock B550M Pro4
|
||||||
|
* Case - Fractal Design Node 804
|
||||||
|
|
||||||
|
### Disks
|
||||||
|
Device | Partitions _(filesystem, size, usage)_
|
||||||
|
--- | ---
|
||||||
|
Samsung 980 Evo | `/dev/nvme0n1p1` (EFI, 512 MiB, NixOS Boot) <br> `/dev/nvme0n1p2` (ZFS `rpool`, 200 GiB, NixOS Root)
|
||||||
|
|
||||||
|
#### ZFS datasets
|
||||||
|
```
|
||||||
|
rpool/
|
||||||
|
├── local
|
||||||
|
│ ├── nix
|
||||||
|
│ └── tmp
|
||||||
|
├── system
|
||||||
|
│ ├── root
|
||||||
|
│ └── var
|
||||||
|
└── user
|
||||||
|
└── home
|
||||||
|
|
||||||
|
library/
|
||||||
|
├── books
|
||||||
|
├── fonts
|
||||||
|
├── movies
|
||||||
|
├── music
|
||||||
|
├── software
|
||||||
|
├── tv
|
||||||
|
├── videos
|
||||||
|
└── web
|
||||||
|
```
|
||||||
|
|
||||||
|
See [Graham Christensen's article](https://grahamc.com/blog/nixos-on-zfs/#datasets) for the motivation behind the `rpool` datasets.
|
||||||
|
|
||||||
|
### Networks
|
||||||
|
- DHCP on `10.0.1.0/24` subnet.
|
||||||
|
- Tailscale on `100.64.0.0/10` subnet. FQDN: `library.mesh.vimium.net`.
|
||||||
|
|
195
hosts/library/default.nix
Normal file
195
hosts/library/default.nix
Normal file
@ -0,0 +1,195 @@
|
|||||||
|
{ config, pkgs, ... }:
|
||||||
|
|
||||||
|
{
|
||||||
|
imports = [
|
||||||
|
./hardware-configuration.nix
|
||||||
|
../server.nix
|
||||||
|
];
|
||||||
|
|
||||||
|
nixpkgs.hostPlatform = "x86_64-linux";
|
||||||
|
|
||||||
|
boot = {
|
||||||
|
loader.systemd-boot.enable = true;
|
||||||
|
loader.efi.canTouchEfiVariables = true;
|
||||||
|
zfs.extraPools = [ "library" ];
|
||||||
|
};
|
||||||
|
|
||||||
|
networking = {
|
||||||
|
hostId = "d24ae953";
|
||||||
|
firewall = {
|
||||||
|
enable = true;
|
||||||
|
allowedTCPPorts = [
|
||||||
|
22 # SSH
|
||||||
|
];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
services.zfs = {
|
||||||
|
autoScrub = {
|
||||||
|
enable = true;
|
||||||
|
pools = [ "library" ];
|
||||||
|
};
|
||||||
|
autoSnapshot = {
|
||||||
|
enable = true;
|
||||||
|
flags = "-k -p --utc";
|
||||||
|
frequent = 0;
|
||||||
|
hourly = 0;
|
||||||
|
daily = 7;
|
||||||
|
monthly = 1;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
services.nfs.server = {
|
||||||
|
enable = true;
|
||||||
|
};
|
||||||
|
|
||||||
|
services.grafana = {
|
||||||
|
enable = true;
|
||||||
|
settings = {
|
||||||
|
server = {
|
||||||
|
domain = "library.mesh.vimium.net";
|
||||||
|
http_addr = "0.0.0.0";
|
||||||
|
http_port = 3000;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
services.prometheus = {
|
||||||
|
enable = true;
|
||||||
|
port = 9001;
|
||||||
|
exporters = {
|
||||||
|
node = {
|
||||||
|
enable = true;
|
||||||
|
enabledCollectors = [ "systemd" ];
|
||||||
|
port = 9002;
|
||||||
|
};
|
||||||
|
zfs = {
|
||||||
|
enable = true;
|
||||||
|
port = 9003;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
scrapeConfigs = [
|
||||||
|
{
|
||||||
|
job_name = "node";
|
||||||
|
static_configs = [{
|
||||||
|
targets = [
|
||||||
|
"127.0.0.1:${toString config.services.prometheus.exporters.node.port}"
|
||||||
|
"127.0.0.1:${toString config.services.prometheus.exporters.zfs.port}"
|
||||||
|
];
|
||||||
|
}];
|
||||||
|
}
|
||||||
|
];
|
||||||
|
};
|
||||||
|
|
||||||
|
systemd.services.vps1-tunnel = {
|
||||||
|
enable = true;
|
||||||
|
description = "vps1.mesh.vimium.net SSH tunnel";
|
||||||
|
after = [
|
||||||
|
"network-online.target"
|
||||||
|
"jellyfin.service"
|
||||||
|
];
|
||||||
|
wants = [ "network-online.target" ];
|
||||||
|
serviceConfig = {
|
||||||
|
Type="simple";
|
||||||
|
ExecStart=pkgs.lib.mkForce ''
|
||||||
|
${pkgs.openssh}/bin/ssh \
|
||||||
|
-NT \
|
||||||
|
-o ExitOnForwardFailure=yes \
|
||||||
|
-o ServerAliveInterval=60 \
|
||||||
|
-o TCPKeepAlive=no \
|
||||||
|
-i %h/.ssh/id_jellyfin \
|
||||||
|
-R localhost:8000:localhost:8000 \
|
||||||
|
jellyfin@vps1.mesh.vimium.net
|
||||||
|
'';
|
||||||
|
Restart="always";
|
||||||
|
RestartSec=20;
|
||||||
|
};
|
||||||
|
wantedBy = [ "default.target" ];
|
||||||
|
};
|
||||||
|
|
||||||
|
services.nginx = let
|
||||||
|
proxyConfig = ''
|
||||||
|
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||||
|
proxy_set_header X-Forwarded-Proto $scheme;
|
||||||
|
proxy_set_header X-Real-IP $remote_addr;
|
||||||
|
proxy_set_header Host $host;
|
||||||
|
|
||||||
|
proxy_set_header Range $http_range;
|
||||||
|
proxy_set_header If-Range $http_if_range;
|
||||||
|
|
||||||
|
proxy_http_version 1.1;
|
||||||
|
proxy_set_header Upgrade $http_upgrade;
|
||||||
|
proxy_set_header Connection "upgrade";
|
||||||
|
'';
|
||||||
|
in {
|
||||||
|
enable = true;
|
||||||
|
package = pkgs.openresty;
|
||||||
|
recommendedGzipSettings = true;
|
||||||
|
recommendedOptimisation = true;
|
||||||
|
recommendedTlsSettings = true;
|
||||||
|
clientMaxBodySize = "2G";
|
||||||
|
virtualHosts = {
|
||||||
|
"library.mesh.vimium.net" = {
|
||||||
|
locations."/" = {
|
||||||
|
root = "/mnt/library";
|
||||||
|
extraConfig = ''
|
||||||
|
autoindex on;
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
};
|
||||||
|
"jellyfin.vimium.com" = {
|
||||||
|
default = true;
|
||||||
|
listen = [
|
||||||
|
{
|
||||||
|
addr = "127.0.0.1";
|
||||||
|
port = 8000;
|
||||||
|
}
|
||||||
|
];
|
||||||
|
locations."/" = {
|
||||||
|
proxyPass = "http://localhost:8096";
|
||||||
|
extraConfig = proxyConfig;
|
||||||
|
};
|
||||||
|
locations."/metrics" = {
|
||||||
|
return = "404";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
hardware.opengl = {
|
||||||
|
enable = true;
|
||||||
|
extraPackages = with pkgs; [
|
||||||
|
vaapiVdpau
|
||||||
|
];
|
||||||
|
driSupport = true;
|
||||||
|
};
|
||||||
|
users.users.jellyfin.extraGroups = [ "video" "render" ];
|
||||||
|
services.jellyfin = {
|
||||||
|
enable = true;
|
||||||
|
cacheDir = "/var/cache/jellyfin";
|
||||||
|
dataDir = "/var/lib/jellyfin";
|
||||||
|
};
|
||||||
|
|
||||||
|
modules = {
|
||||||
|
podman.enable = true;
|
||||||
|
security = {
|
||||||
|
gpg.enable = true;
|
||||||
|
};
|
||||||
|
shell = {
|
||||||
|
zsh.enable = true;
|
||||||
|
};
|
||||||
|
services = {
|
||||||
|
borgmatic = {
|
||||||
|
enable = true;
|
||||||
|
directories = [
|
||||||
|
config.services.jellyfin.dataDir
|
||||||
|
"/home/jordan"
|
||||||
|
];
|
||||||
|
repoPath = "ssh://b61758r4@b61758r4.repo.borgbase.com/./repo";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
system.stateVersion = "22.11";
|
||||||
|
}
|
||||||
|
|
68
hosts/library/hardware-configuration.nix
Normal file
68
hosts/library/hardware-configuration.nix
Normal file
@ -0,0 +1,68 @@
|
|||||||
|
{ config, lib, pkgs, modulesPath, ... }:
|
||||||
|
|
||||||
|
{
|
||||||
|
imports = [
|
||||||
|
(modulesPath + "/installer/scan/not-detected.nix")
|
||||||
|
];
|
||||||
|
|
||||||
|
boot = {
|
||||||
|
initrd.availableKernelModules = [ "xhci_pci" "ahci" "nvme" "usb_storage" "sd_mod" ];
|
||||||
|
initrd.kernelModules = [ ];
|
||||||
|
kernelModules = [ "kvm-amd" ];
|
||||||
|
extraModulePackages = [ ];
|
||||||
|
};
|
||||||
|
|
||||||
|
fileSystems."/" = {
|
||||||
|
device = "rpool/system/root";
|
||||||
|
fsType = "zfs";
|
||||||
|
};
|
||||||
|
|
||||||
|
fileSystems."/var" = {
|
||||||
|
device = "rpool/system/var";
|
||||||
|
fsType = "zfs";
|
||||||
|
};
|
||||||
|
|
||||||
|
fileSystems."/var/log" = {
|
||||||
|
device = "rpool/system/var/log";
|
||||||
|
fsType = "zfs";
|
||||||
|
};
|
||||||
|
|
||||||
|
fileSystems."/var/tmp" = {
|
||||||
|
device = "rpool/system/var/tmp";
|
||||||
|
fsType = "zfs";
|
||||||
|
};
|
||||||
|
|
||||||
|
fileSystems."/var/lib/containers/storage" = {
|
||||||
|
device = "rpool/system/var/lib-containers-storage";
|
||||||
|
fsType = "zfs";
|
||||||
|
};
|
||||||
|
|
||||||
|
fileSystems."/nix" = {
|
||||||
|
device = "rpool/local/nix";
|
||||||
|
fsType = "zfs";
|
||||||
|
};
|
||||||
|
|
||||||
|
fileSystems."/tmp" = {
|
||||||
|
device = "rpool/local/tmp";
|
||||||
|
fsType = "zfs";
|
||||||
|
};
|
||||||
|
|
||||||
|
fileSystems."/home" = {
|
||||||
|
device = "rpool/user/home";
|
||||||
|
fsType = "zfs";
|
||||||
|
};
|
||||||
|
|
||||||
|
fileSystems."/boot" = {
|
||||||
|
device = "/dev/disk/by-uuid/F697-F1C0";
|
||||||
|
fsType = "vfat";
|
||||||
|
};
|
||||||
|
|
||||||
|
swapDevices = [ ];
|
||||||
|
|
||||||
|
networking.useDHCP = lib.mkDefault true;
|
||||||
|
|
||||||
|
nixpkgs.hostPlatform = lib.mkDefault "x86_64-linux";
|
||||||
|
|
||||||
|
hardware.cpu.amd.updateMicrocode = lib.mkDefault config.hardware.enableRedistributableFirmware;
|
||||||
|
}
|
||||||
|
|
18
hosts/mail/README.md
Normal file
18
hosts/mail/README.md
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
# Mail server
|
||||||
|
|
||||||
|
## Overview
|
||||||
|
Mail server hosted in OVH.
|
||||||
|
|
||||||
|
## Specs
|
||||||
|
* CPU - ??
|
||||||
|
* Memory - ??
|
||||||
|
|
||||||
|
### Disks
|
||||||
|
Device | Partitions _(filesystem, usage)_
|
||||||
|
--- | ---
|
||||||
|
NVMe | `/dev/sda1` (ext4, NixOS Root)
|
||||||
|
|
||||||
|
### Networks
|
||||||
|
- DHCP on `10.0.1.0/24` subnet.
|
||||||
|
- Tailscale on `100.64.0.0/10` subnet. FQDN: `mail.mesh.vimium.net`.
|
||||||
|
|
51
hosts/mail/default.nix
Normal file
51
hosts/mail/default.nix
Normal file
@ -0,0 +1,51 @@
|
|||||||
|
{ config, lib, self, ... }:
|
||||||
|
|
||||||
|
{
|
||||||
|
imports = [
|
||||||
|
self.inputs.disko.nixosModules.disko
|
||||||
|
./hardware-configuration.nix
|
||||||
|
./disko-config.nix
|
||||||
|
../server.nix
|
||||||
|
];
|
||||||
|
|
||||||
|
nixpkgs.hostPlatform = "x86_64-linux";
|
||||||
|
|
||||||
|
networking = {
|
||||||
|
hostId = "08ac2f14";
|
||||||
|
firewall = {
|
||||||
|
enable = true;
|
||||||
|
allowedTCPPorts = [
|
||||||
|
22 # SSH
|
||||||
|
];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
users = {
|
||||||
|
users = {
|
||||||
|
root = {
|
||||||
|
openssh.authorizedKeys.keys = [
|
||||||
|
"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAILVHTjsyMIV4THNw6yz0OxAxGnC+41gX72UrPqTzR+OS jordan@vimium.com"
|
||||||
|
];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
services.openssh.settings.PermitRootLogin = lib.mkForce "prohibit-password";
|
||||||
|
|
||||||
|
modules = {
|
||||||
|
services = {
|
||||||
|
borgmatic = {
|
||||||
|
enable = true;
|
||||||
|
directories = [
|
||||||
|
"/var/dkim"
|
||||||
|
"/var/lib"
|
||||||
|
"/var/vmail"
|
||||||
|
];
|
||||||
|
repoPath = "ssh://kg2mpt28@kg2mpt28.repo.borgbase.com/./repo";
|
||||||
|
};
|
||||||
|
mail.enable = true;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
system.stateVersion = "22.11";
|
||||||
|
}
|
55
hosts/mail/disko-config.nix
Normal file
55
hosts/mail/disko-config.nix
Normal file
@ -0,0 +1,55 @@
|
|||||||
|
{ lib, ... }:
|
||||||
|
{
|
||||||
|
disko.devices = {
|
||||||
|
disk.disk1 = {
|
||||||
|
device = lib.mkDefault "/dev/sda";
|
||||||
|
type = "disk";
|
||||||
|
content = {
|
||||||
|
type = "gpt";
|
||||||
|
partitions = {
|
||||||
|
boot = {
|
||||||
|
name = "boot";
|
||||||
|
size = "2M";
|
||||||
|
type = "EF02";
|
||||||
|
};
|
||||||
|
esp = {
|
||||||
|
name = "ESP";
|
||||||
|
size = "300M";
|
||||||
|
type = "EF00";
|
||||||
|
content = {
|
||||||
|
type = "filesystem";
|
||||||
|
format = "vfat";
|
||||||
|
mountpoint = "/boot";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
root = {
|
||||||
|
name = "root";
|
||||||
|
size = "100%";
|
||||||
|
content = {
|
||||||
|
type = "lvm_pv";
|
||||||
|
vg = "pool";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
lvm_vg = {
|
||||||
|
pool = {
|
||||||
|
type = "lvm_vg";
|
||||||
|
lvs = {
|
||||||
|
root = {
|
||||||
|
size = "100%FREE";
|
||||||
|
content = {
|
||||||
|
type = "filesystem";
|
||||||
|
format = "ext4";
|
||||||
|
mountpoint = "/";
|
||||||
|
mountOptions = [
|
||||||
|
"defaults"
|
||||||
|
];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
22
hosts/mail/hardware-configuration.nix
Normal file
22
hosts/mail/hardware-configuration.nix
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
{ config, lib, pkgs, modulesPath, ... }:
|
||||||
|
|
||||||
|
{
|
||||||
|
imports = [
|
||||||
|
(modulesPath + "/profiles/qemu-guest.nix")
|
||||||
|
];
|
||||||
|
|
||||||
|
boot = {
|
||||||
|
initrd = {
|
||||||
|
availableKernelModules = [ "ata_piix" "uhci_hcd" "xen_blkfront" "vmw_pvscsi" ];
|
||||||
|
kernelModules = [ "nvme" ];
|
||||||
|
};
|
||||||
|
loader.grub = {
|
||||||
|
efiSupport = true;
|
||||||
|
efiInstallAsRemovable = true;
|
||||||
|
};
|
||||||
|
tmp.cleanOnBoot = true;
|
||||||
|
};
|
||||||
|
|
||||||
|
zramSwap.enable = true;
|
||||||
|
}
|
||||||
|
|
@ -1,45 +0,0 @@
|
|||||||
{ config, pkgs, ... }:
|
|
||||||
let
|
|
||||||
snd-usb-audio-module = pkgs.callPackage ./snd-usb-audio.nix {
|
|
||||||
kernel = config.boot.kernelPackages.kernel;
|
|
||||||
};
|
|
||||||
upmixConfig = ''
|
|
||||||
stream.properties = {
|
|
||||||
channelmix.upmix = true
|
|
||||||
channelmix.upmix-method = psd
|
|
||||||
}
|
|
||||||
'';
|
|
||||||
in {
|
|
||||||
boot.extraModulePackages = [
|
|
||||||
(snd-usb-audio-module.overrideAttrs (_: {
|
|
||||||
patches = [ ./0001-Update-device-ID-for-PreSonus-1824c.patch ];
|
|
||||||
}))
|
|
||||||
];
|
|
||||||
|
|
||||||
environment.etc = {
|
|
||||||
"pipewire/pipewire.conf.d/surround.conf".text = ''
|
|
||||||
context.modules = [
|
|
||||||
{
|
|
||||||
name = libpipewire-module-loopback
|
|
||||||
args = {
|
|
||||||
node.description = "Genelec 4.1 Surround"
|
|
||||||
capture.props = {
|
|
||||||
node.name = "Genelec_Speakers"
|
|
||||||
media.class = "Audio/Sink"
|
|
||||||
audio.position = [ FL FR SL SR LFE ]
|
|
||||||
}
|
|
||||||
playback.props = {
|
|
||||||
node.name = "playback.Genelec_Speakers"
|
|
||||||
audio.position = [ AUX0 AUX1 AUX3 AUX4 AUX5 ]
|
|
||||||
target.object = "alsa_output.usb-PreSonus_Studio_1824c_SC4E21110775-00.multichannel-output"
|
|
||||||
stream.dont-remix = true
|
|
||||||
node.passive = true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
]
|
|
||||||
'';
|
|
||||||
"pipewire/pipewire-pulse.conf.d/40-upmix.conf".text = upmixConfig;
|
|
||||||
"pipewire/client-rt.conf.d/40-upmix.conf".text = upmixConfig;
|
|
||||||
};
|
|
||||||
}
|
|
@ -1,39 +1,38 @@
|
|||||||
{ config, lib, pkgs, ... }:
|
{ config, ... }:
|
||||||
|
|
||||||
{
|
{
|
||||||
imports = [
|
imports = [
|
||||||
./hardware-configuration.nix
|
./hardware-configuration.nix
|
||||||
./audio.nix
|
|
||||||
../desktop.nix
|
../desktop.nix
|
||||||
];
|
];
|
||||||
|
|
||||||
boot.loader.systemd-boot = {
|
nixpkgs = {
|
||||||
|
hostPlatform = "x86_64-linux";
|
||||||
|
config = {
|
||||||
|
allowUnfree = true;
|
||||||
|
nvidia.acceptLicense = true;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
boot.loader = {
|
||||||
|
systemd-boot = {
|
||||||
enable = true;
|
enable = true;
|
||||||
graceful = true;
|
graceful = true;
|
||||||
netbootxyz.enable = true;
|
netbootxyz.enable = true;
|
||||||
};
|
};
|
||||||
boot.loader.efi.canTouchEfiVariables = true;
|
efi.canTouchEfiVariables = true;
|
||||||
|
};
|
||||||
|
|
||||||
networking.hostName = "odyssey";
|
networking = {
|
||||||
networking.hostId = "c5e68d78";
|
hostId = "c5e68d78";
|
||||||
networking.networkmanager.enable = true;
|
networkmanager.enable = true;
|
||||||
|
firewall.trustedInterfaces = [ "lxdbr0" "virbr0" ]; # Work around https://github.com/NixOS/nixpkgs/issues/263359
|
||||||
|
};
|
||||||
|
|
||||||
nix.package = pkgs.nixFlakes;
|
virtualisation = {
|
||||||
nix.extraOptions = ''
|
libvirtd.enable = true;
|
||||||
experimental-features = nix-command flakes
|
lxd.enable = true;
|
||||||
'';
|
};
|
||||||
|
|
||||||
virtualisation.libvirtd.enable = true;
|
|
||||||
virtualisation.lxd.enable = true;
|
|
||||||
|
|
||||||
users.defaultUserShell = pkgs.zsh;
|
|
||||||
|
|
||||||
system.stateVersion = "22.11";
|
|
||||||
|
|
||||||
services.journald.extraConfig = ''
|
|
||||||
SystemMaxUse=4G
|
|
||||||
MaxRetentionSec=90day
|
|
||||||
'';
|
|
||||||
|
|
||||||
services.nix-serve = {
|
services.nix-serve = {
|
||||||
enable = true;
|
enable = true;
|
||||||
@ -50,40 +49,23 @@
|
|||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
age.secrets."odyssey_borg_passphrase" = {
|
|
||||||
file = ../../secrets/odyssey_borg_passphrase.age;
|
|
||||||
};
|
|
||||||
|
|
||||||
services.borgmatic = {
|
|
||||||
enable = true;
|
|
||||||
settings = {
|
|
||||||
source_directories = [
|
|
||||||
"/home/jordan/Documents"
|
|
||||||
];
|
|
||||||
repositories = [
|
|
||||||
{ label = "borgbase"; path = "ssh://iqwu22oq@iqwu22oq.repo.borgbase.com/./repo"; }
|
|
||||||
];
|
|
||||||
storage = {
|
|
||||||
encryption_passcommand = "cat ${config.age.secrets.odyssey_borg_passphrase.path}";
|
|
||||||
ssh_command = "ssh -i /etc/ssh/ssh_host_ed25519_key";
|
|
||||||
};
|
|
||||||
retention = {
|
|
||||||
keep_daily = 7;
|
|
||||||
keep_weekly = 4;
|
|
||||||
keep_monthly = 6;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
# Without this override, `cat` is unavailable for `encryption_passcommand`
|
|
||||||
systemd.services.borgmatic.confinement.fullUnit = true;
|
|
||||||
|
|
||||||
modules = {
|
modules = {
|
||||||
desktop = {
|
desktop = {
|
||||||
apps.qbittorrent.enable = true;
|
apps.qbittorrent.enable = true;
|
||||||
browsers = {
|
browsers = {
|
||||||
firefox.enable = true;
|
firefox.enable = true;
|
||||||
};
|
};
|
||||||
|
gaming = {
|
||||||
|
emulators = {
|
||||||
|
gamecube.enable = true;
|
||||||
|
ps2.enable = true;
|
||||||
|
ps3.enable = true;
|
||||||
|
psp.enable = true;
|
||||||
|
wii.enable = true;
|
||||||
|
xbox.enable = true;
|
||||||
|
};
|
||||||
|
lutris.enable = true;
|
||||||
|
};
|
||||||
media.graphics = {
|
media.graphics = {
|
||||||
modeling.enable = true;
|
modeling.enable = true;
|
||||||
raster.enable = true;
|
raster.enable = true;
|
||||||
@ -93,21 +75,40 @@
|
|||||||
audio.enable = true;
|
audio.enable = true;
|
||||||
video.enable = true;
|
video.enable = true;
|
||||||
};
|
};
|
||||||
|
office.libreoffice.enable = true;
|
||||||
};
|
};
|
||||||
dev = {
|
dev = {
|
||||||
node.enable = true;
|
node.enable = true;
|
||||||
};
|
};
|
||||||
editors = {
|
editors = {
|
||||||
neovim.enable = true;
|
neovim.enable = true;
|
||||||
vscode.enable = true;
|
|
||||||
};
|
};
|
||||||
|
hardware.presonus-studio.enable = true;
|
||||||
security = {
|
security = {
|
||||||
gpg.enable = true;
|
gpg.enable = true;
|
||||||
pass.enable = true;
|
pass.enable = true;
|
||||||
};
|
};
|
||||||
|
services = {
|
||||||
|
borgmatic = {
|
||||||
|
enable = true;
|
||||||
|
directories = [
|
||||||
|
"/home/jordan/Documents"
|
||||||
|
"/home/jordan/Downloads"
|
||||||
|
"/home/jordan/Music"
|
||||||
|
"/home/jordan/Pictures"
|
||||||
|
"/home/jordan/projects"
|
||||||
|
"/home/jordan/Videos"
|
||||||
|
"/home/jordan/.mozilla"
|
||||||
|
];
|
||||||
|
repoPath = "ssh://iqwu22oq@iqwu22oq.repo.borgbase.com/./repo";
|
||||||
|
};
|
||||||
|
gitea-runner.enable = true;
|
||||||
|
};
|
||||||
shell = {
|
shell = {
|
||||||
git.enable = true;
|
git.enable = true;
|
||||||
zsh.enable = true;
|
zsh.enable = true;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
system.stateVersion = "22.11";
|
||||||
}
|
}
|
||||||
|
@ -19,6 +19,7 @@
|
|||||||
cpu.intel.updateMicrocode = lib.mkDefault config.hardware.enableRedistributableFirmware;
|
cpu.intel.updateMicrocode = lib.mkDefault config.hardware.enableRedistributableFirmware;
|
||||||
nvidia = {
|
nvidia = {
|
||||||
modesetting.enable = true;
|
modesetting.enable = true;
|
||||||
|
package = config.boot.kernelPackages.nvidiaPackages.beta;
|
||||||
powerManagement.enable = true;
|
powerManagement.enable = true;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
@ -64,5 +65,9 @@
|
|||||||
|
|
||||||
networking.useDHCP = lib.mkDefault true;
|
networking.useDHCP = lib.mkDefault true;
|
||||||
|
|
||||||
|
environment.systemPackages = [
|
||||||
|
pkgs.apfs-fuse
|
||||||
|
];
|
||||||
|
|
||||||
nixpkgs.hostPlatform = lib.mkDefault "x86_64-linux";
|
nixpkgs.hostPlatform = lib.mkDefault "x86_64-linux";
|
||||||
}
|
}
|
||||||
|
25
hosts/pi/README.md
Normal file
25
hosts/pi/README.md
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
# Pi
|
||||||
|
|
||||||
|
## Overview
|
||||||
|
Raspberry Pi 4
|
||||||
|
|
||||||
|
## Specs
|
||||||
|
* SoC - Broadcom BCM2711
|
||||||
|
* CPU - ARM Cortex-A72 @ 1.8 GHz
|
||||||
|
* Memory - 8 GB LPDDR4
|
||||||
|
|
||||||
|
### Disks
|
||||||
|
Device | Partitions _(filesystem, usage)_
|
||||||
|
--- | ---
|
||||||
|
SD card | `/dev/mmcblk0` (ext4, NixOS Root)
|
||||||
|
|
||||||
|
### Networks
|
||||||
|
- DHCP on `10.0.1.0/24` subnet.
|
||||||
|
- Tailscale on `100.64.0.0/10` subnet. FQDN: `pi.mesh.vimium.net`.
|
||||||
|
|
||||||
|
## Devices and connections
|
||||||
|
|
||||||
|
- SONOFF Zigbee 3.0 USB Dongle Plus (connected to USB 2.0 port to avoid [interference](https://www.unit3compliance.co.uk/2-4ghz-intra-system-or-self-platform-interference-demonstration/))
|
||||||
|
- HDMI to ONKYO HT-R990
|
||||||
|
- S/PDIF to ONKYO HT-R990
|
||||||
|
- Ethernet to ONKYO HT-R990
|
253
hosts/pi/default.nix
Normal file
253
hosts/pi/default.nix
Normal file
@ -0,0 +1,253 @@
|
|||||||
|
{ config, lib, pkgs, self, ... }:
|
||||||
|
|
||||||
|
{
|
||||||
|
imports = [
|
||||||
|
self.inputs.nixos-hardware.nixosModules.raspberry-pi-4
|
||||||
|
./hardware-configuration.nix
|
||||||
|
../server.nix
|
||||||
|
];
|
||||||
|
|
||||||
|
nixpkgs.hostPlatform = "aarch64-linux";
|
||||||
|
|
||||||
|
hardware = {
|
||||||
|
raspberry-pi."4" = {
|
||||||
|
apply-overlays-dtmerge.enable = true;
|
||||||
|
audio.enable = false;
|
||||||
|
fkms-3d.enable = false;
|
||||||
|
xhci.enable = false;
|
||||||
|
};
|
||||||
|
deviceTree = {
|
||||||
|
enable = true;
|
||||||
|
filter = "*rpi-4-*.dtb";
|
||||||
|
overlays = [
|
||||||
|
{
|
||||||
|
name = "audio-off-overlay";
|
||||||
|
dtsText = ''
|
||||||
|
/dts-v1/;
|
||||||
|
/plugin/;
|
||||||
|
|
||||||
|
/ {
|
||||||
|
compatible = "brcm,bcm2711";
|
||||||
|
|
||||||
|
fragment@0 {
|
||||||
|
target = <&vchiq>;
|
||||||
|
|
||||||
|
__overlay__ {
|
||||||
|
status = "disabled";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
'';
|
||||||
|
}
|
||||||
|
{
|
||||||
|
# Adapted from: https://github.com/raspberrypi/linux/blob/rpi-6.1.y/arch/arm/boot/dts/overlays/hifiberry-digi-pro-overlay.dts
|
||||||
|
# changes:
|
||||||
|
# - modified top-level "compatible" field from bcm2835 to bcm2711
|
||||||
|
# - s/i2s_clk_consumer/i2s/ (name on bcm2711 platform)
|
||||||
|
name = "hifiberry-digi-pro";
|
||||||
|
dtsText = ''
|
||||||
|
/dts-v1/;
|
||||||
|
/plugin/;
|
||||||
|
|
||||||
|
/ {
|
||||||
|
compatible = "brcm,bcm2711";
|
||||||
|
|
||||||
|
fragment@0 {
|
||||||
|
target = <&i2s>;
|
||||||
|
__overlay__ {
|
||||||
|
status = "okay";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
fragment@1 {
|
||||||
|
target = <&i2c1>;
|
||||||
|
__overlay__ {
|
||||||
|
#address-cells = <1>;
|
||||||
|
#size-cells = <0>;
|
||||||
|
status = "okay";
|
||||||
|
|
||||||
|
wm8804@3b {
|
||||||
|
#sound-dai-cells = <0>;
|
||||||
|
compatible = "wlf,wm8804";
|
||||||
|
reg = <0x3b>;
|
||||||
|
PVDD-supply = <&vdd_3v3_reg>;
|
||||||
|
DVDD-supply = <&vdd_3v3_reg>;
|
||||||
|
status = "okay";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
fragment@2 {
|
||||||
|
target = <&sound>;
|
||||||
|
__overlay__ {
|
||||||
|
compatible = "hifiberry,hifiberry-digi";
|
||||||
|
i2s-controller = <&i2s>;
|
||||||
|
status = "okay";
|
||||||
|
clock44-gpio = <&gpio 5 0>;
|
||||||
|
clock48-gpio = <&gpio 6 0>;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
'';
|
||||||
|
}
|
||||||
|
];
|
||||||
|
};
|
||||||
|
firmware = with pkgs; [
|
||||||
|
firmwareLinuxNonfree
|
||||||
|
wireless-regdb
|
||||||
|
];
|
||||||
|
};
|
||||||
|
|
||||||
|
networking.hostId = "731d1660";
|
||||||
|
|
||||||
|
sound.enable = true;
|
||||||
|
|
||||||
|
security.rtkit.enable = true;
|
||||||
|
services.pipewire = {
|
||||||
|
enable = true;
|
||||||
|
alsa.enable = true;
|
||||||
|
alsa.support32Bit = true;
|
||||||
|
pulse.enable = true;
|
||||||
|
};
|
||||||
|
|
||||||
|
age.secrets."files/services/home-assistant/secrets.yaml" = {
|
||||||
|
file = "${self.inputs.secrets}/files/services/home-assistant/secrets.yaml.age";
|
||||||
|
path = "${config.services.home-assistant.configDir}/secrets.yaml";
|
||||||
|
owner = "hass";
|
||||||
|
group = "hass";
|
||||||
|
};
|
||||||
|
|
||||||
|
services.home-assistant = {
|
||||||
|
enable = true;
|
||||||
|
extraComponents = [
|
||||||
|
"api"
|
||||||
|
"alert"
|
||||||
|
"auth"
|
||||||
|
"backup"
|
||||||
|
"command_line"
|
||||||
|
"default_config"
|
||||||
|
"homekit_controller"
|
||||||
|
"homekit"
|
||||||
|
"http"
|
||||||
|
"icloud"
|
||||||
|
"jellyfin"
|
||||||
|
"metoffice"
|
||||||
|
"mqtt"
|
||||||
|
"onkyo"
|
||||||
|
"ping"
|
||||||
|
"proximity"
|
||||||
|
"radio_browser"
|
||||||
|
"scrape"
|
||||||
|
"sensor"
|
||||||
|
"system_health"
|
||||||
|
];
|
||||||
|
config = {
|
||||||
|
default_config = {};
|
||||||
|
backup = {};
|
||||||
|
homeassistant = {
|
||||||
|
name = "Home";
|
||||||
|
latitude = "!secret latitude";
|
||||||
|
longitude = "!secret longitude";
|
||||||
|
country = "GB";
|
||||||
|
temperature_unit = "C";
|
||||||
|
time_zone = config.time.timeZone;
|
||||||
|
unit_system = "metric";
|
||||||
|
};
|
||||||
|
mqtt = { };
|
||||||
|
scene = "!include scenes.yaml";
|
||||||
|
automation = "!include automations.yaml";
|
||||||
|
system_health = { };
|
||||||
|
recorder = {
|
||||||
|
purge_keep_days = 365;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
services.mosquitto = {
|
||||||
|
enable = true;
|
||||||
|
listeners = [{
|
||||||
|
acl = [ "pattern readwrite #" ];
|
||||||
|
omitPasswordAuth = true;
|
||||||
|
port = 1883;
|
||||||
|
settings = {
|
||||||
|
allow_anonymous = true;
|
||||||
|
};
|
||||||
|
}];
|
||||||
|
};
|
||||||
|
|
||||||
|
age.secrets."files/services/zigbee2mqtt/secret.yaml" = {
|
||||||
|
file = "${self.inputs.secrets}/files/services/zigbee2mqtt/secret.yaml.age";
|
||||||
|
path = "${config.services.zigbee2mqtt.dataDir}/secret.yaml";
|
||||||
|
owner = "zigbee2mqtt";
|
||||||
|
group = "zigbee2mqtt";
|
||||||
|
};
|
||||||
|
|
||||||
|
services.zigbee2mqtt = {
|
||||||
|
package = pkgs.unstable.zigbee2mqtt;
|
||||||
|
enable = true;
|
||||||
|
dataDir = "/var/lib/zigbee2mqtt";
|
||||||
|
settings = {
|
||||||
|
homeassistant = lib.optionalAttrs config.services.home-assistant.enable {
|
||||||
|
discovery_topic = "homeassistant";
|
||||||
|
status_topic = "hass/status";
|
||||||
|
legacy_entity_attributes = true;
|
||||||
|
legacy_triggers = true;
|
||||||
|
};
|
||||||
|
availability = true;
|
||||||
|
frontend = true;
|
||||||
|
device_options = {
|
||||||
|
retain = true;
|
||||||
|
};
|
||||||
|
serial = {
|
||||||
|
port = "/dev/serial/by-id/usb-Silicon_Labs_Sonoff_Zigbee_3.0_USB_Dongle_Plus_0001-if00-port0";
|
||||||
|
};
|
||||||
|
advanced = {
|
||||||
|
channel = 20;
|
||||||
|
network_key = "!secret.yaml network_key";
|
||||||
|
pan_id = 13001;
|
||||||
|
ext_pan_id = [ 79 1 73 47 250 136 124 222 ];
|
||||||
|
transmit_power = 20;
|
||||||
|
};
|
||||||
|
mqtt = {
|
||||||
|
version = 5;
|
||||||
|
server = "mqtt://localhost:1883";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
modules = {
|
||||||
|
networking = {
|
||||||
|
wireless = {
|
||||||
|
enable = true;
|
||||||
|
interfaces = [ "wlan0" ];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
services = {
|
||||||
|
borgmatic = {
|
||||||
|
enable = true;
|
||||||
|
directories = [
|
||||||
|
"/var/lib/mosquitto"
|
||||||
|
"/var/lib/zigbee2mqtt"
|
||||||
|
];
|
||||||
|
repoPath = "ssh://qcw86s11@qcw86s11.repo.borgbase.com/./repo";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
# Connection to ONKYO HT-R990
|
||||||
|
networking.interfaces.end0 = {
|
||||||
|
ipv4.addresses = [{
|
||||||
|
address = "172.16.0.1";
|
||||||
|
prefixLength = 30;
|
||||||
|
}];
|
||||||
|
};
|
||||||
|
|
||||||
|
environment.systemPackages = with pkgs; [
|
||||||
|
python311Packages.onkyo-eiscp
|
||||||
|
libraspberrypi
|
||||||
|
raspberrypi-eeprom
|
||||||
|
];
|
||||||
|
|
||||||
|
system.stateVersion = "22.11";
|
||||||
|
}
|
||||||
|
|
31
hosts/pi/hardware-configuration.nix
Normal file
31
hosts/pi/hardware-configuration.nix
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
{ config, lib, pkgs, modulesPath, ... }:
|
||||||
|
|
||||||
|
{
|
||||||
|
imports = [
|
||||||
|
(modulesPath + "/installer/sd-card/sd-image-aarch64.nix")
|
||||||
|
];
|
||||||
|
|
||||||
|
boot = {
|
||||||
|
# Stop ZFS kernel being built
|
||||||
|
supportedFilesystems = lib.mkForce [ "btrfs" "cifs" "f2fs" "jfs" "ntfs" "reiserfs" "vfat" "xfs" ];
|
||||||
|
tmp.cleanOnBoot = true;
|
||||||
|
};
|
||||||
|
|
||||||
|
# Fix missing modules
|
||||||
|
# https://github.com/NixOS/nixpkgs/issues/154163
|
||||||
|
nixpkgs.overlays = [
|
||||||
|
(final: super: {
|
||||||
|
makeModulesClosure = x:
|
||||||
|
super.makeModulesClosure (x // { allowMissing = true; });
|
||||||
|
})
|
||||||
|
];
|
||||||
|
|
||||||
|
fileSystems = {
|
||||||
|
"/" = {
|
||||||
|
device = "/dev/disk/by-label/NIXOS_SD";
|
||||||
|
fsType = "ext4";
|
||||||
|
options = [ "noatime" ];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
@ -1,46 +1,57 @@
|
|||||||
{ config, lib, pkgs, ... }:
|
{ config, lib, pkgs, ... }:
|
||||||
|
|
||||||
{
|
{
|
||||||
time.timeZone = "Europe/London";
|
imports = [
|
||||||
|
./common.nix
|
||||||
i18n.defaultLocale = "en_GB.UTF-8";
|
|
||||||
i18n.extraLocaleSettings = {
|
|
||||||
LC_ADDRESS = "en_GB.UTF-8";
|
|
||||||
LC_IDENTIFICATION = "en_GB.UTF-8";
|
|
||||||
LC_MEASUREMENT = "en_GB.UTF-8";
|
|
||||||
LC_MONETARY = "en_GB.UTF-8";
|
|
||||||
LC_NAME = "en_GB.UTF-8";
|
|
||||||
LC_NUMERIC = "en_GB.UTF-8";
|
|
||||||
LC_PAPER = "en_GB.UTF-8";
|
|
||||||
LC_TELEPHONE = "en_GB.UTF-8";
|
|
||||||
LC_TIME = "en_GB.UTF-8";
|
|
||||||
};
|
|
||||||
|
|
||||||
console.keyMap = "uk";
|
|
||||||
|
|
||||||
services.openssh = {
|
|
||||||
enable = true;
|
|
||||||
settings = {
|
|
||||||
KbdInteractiveAuthentication = false;
|
|
||||||
PasswordAuthentication = false;
|
|
||||||
PermitRootLogin = "no";
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
environment.systemPackages = with pkgs; [
|
|
||||||
git
|
|
||||||
neovim
|
|
||||||
];
|
];
|
||||||
|
|
||||||
nix = {
|
documentation.enable = false;
|
||||||
settings = {
|
|
||||||
auto-optimise-store = true;
|
fonts.fontconfig.enable = false;
|
||||||
|
|
||||||
|
security = {
|
||||||
|
acme = {
|
||||||
|
acceptTerms = true;
|
||||||
|
defaults = {
|
||||||
|
email = "hostmaster@vimium.com";
|
||||||
|
group = "nginx";
|
||||||
|
webroot = "/var/lib/acme/acme-challenge";
|
||||||
};
|
};
|
||||||
gc = {
|
|
||||||
automatic = true;
|
|
||||||
dates = "weekly";
|
|
||||||
options = "-d --delete-older-than 7d";
|
|
||||||
};
|
};
|
||||||
|
# auditd.enable = true;
|
||||||
|
# audit = {
|
||||||
|
# enable = true;
|
||||||
|
# rules = [
|
||||||
|
# "-a exit,always -F arch=b64 -S execve"
|
||||||
|
# ];
|
||||||
|
# };
|
||||||
|
};
|
||||||
|
|
||||||
|
systemd = {
|
||||||
|
enableEmergencyMode = false;
|
||||||
|
|
||||||
|
sleep.extraConfig = ''
|
||||||
|
AllowSuspend=no
|
||||||
|
AllowHibernation=no
|
||||||
|
'';
|
||||||
|
|
||||||
|
watchdog = {
|
||||||
|
runtimeTime = "20s";
|
||||||
|
rebootTime = "30s";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
services.fail2ban = {
|
||||||
|
enable = true;
|
||||||
|
bantime = "1h";
|
||||||
|
bantime-increment = {
|
||||||
|
enable = true;
|
||||||
|
maxtime = "24h";
|
||||||
|
rndtime = "7m";
|
||||||
|
};
|
||||||
|
ignoreIP = [
|
||||||
|
"100.64.0.0/10"
|
||||||
|
];
|
||||||
};
|
};
|
||||||
|
|
||||||
modules.networking.tailscale = {
|
modules.networking.tailscale = {
|
||||||
|
29
hosts/skycam/README.md
Normal file
29
hosts/skycam/README.md
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
# Skycam
|
||||||
|
|
||||||
|
## Overview
|
||||||
|
Raspberry Pi 4-based webcam
|
||||||
|
|
||||||
|
## Specs
|
||||||
|
* SoC - Broadcom BCM2711
|
||||||
|
* CPU - ARM Cortex-A72 @ 1.8 GHz
|
||||||
|
* Memory - 8 GB LPDDR4
|
||||||
|
|
||||||
|
### Disks
|
||||||
|
Device | Partitions _(filesystem, usage)_
|
||||||
|
--- | ---
|
||||||
|
SD card | `/dev/mmcblk0` (ext4, NixOS Root)
|
||||||
|
|
||||||
|
### Networks
|
||||||
|
- DHCP on `10.0.1.0/24` subnet.
|
||||||
|
- Tailscale on `100.64.0.0/10` subnet. FQDN: `skycam.mesh.vimium.net`.
|
||||||
|
|
||||||
|
## Devices and connections
|
||||||
|
- Camera Module 3 with wide-angle lens
|
||||||
|
|
||||||
|
## Building
|
||||||
|
To generate a compressed SD card image for Skycam, run:
|
||||||
|
`nix build '.#nixosConfigurations.skycam.config.system.build.sdImage'`
|
||||||
|
|
||||||
|
Once a card is imaged, the existing SSH host keys should be copied to
|
||||||
|
`/etc/ssh` manually to enable secret decryption.
|
||||||
|
|
111
hosts/skycam/default.nix
Normal file
111
hosts/skycam/default.nix
Normal file
@ -0,0 +1,111 @@
|
|||||||
|
{ config, lib, pkgs, self, ... }:
|
||||||
|
|
||||||
|
{
|
||||||
|
imports = [
|
||||||
|
self.inputs.nixos-hardware.nixosModules.raspberry-pi-4
|
||||||
|
./hardware-configuration.nix
|
||||||
|
../server.nix
|
||||||
|
];
|
||||||
|
|
||||||
|
nixpkgs.hostPlatform = "aarch64-linux";
|
||||||
|
|
||||||
|
hardware = {
|
||||||
|
raspberry-pi."4" = {
|
||||||
|
apply-overlays-dtmerge.enable = true;
|
||||||
|
audio.enable = false;
|
||||||
|
xhci.enable = false;
|
||||||
|
};
|
||||||
|
deviceTree = {
|
||||||
|
enable = true;
|
||||||
|
filter = "*rpi-4-*.dtb";
|
||||||
|
# From https://github.com/Electrostasy/dots/blob/3b81723feece67610a252ce754912f6769f0cd34/hosts/phobos/klipper.nix#L43-L65
|
||||||
|
overlays =
|
||||||
|
let
|
||||||
|
mkCompatibleDtsFile = dtbo:
|
||||||
|
let
|
||||||
|
drv = pkgs.runCommand "fix-dts" { nativeBuildInputs = with pkgs; [ dtc gnused ]; } ''
|
||||||
|
mkdir "$out"
|
||||||
|
dtc -I dtb -O dts ${dtbo} | sed -e 's/bcm2835/bcm2711/' > $out/overlay.dts
|
||||||
|
'';
|
||||||
|
in
|
||||||
|
"${drv}/overlay.dts";
|
||||||
|
|
||||||
|
inherit (config.boot.kernelPackages) kernel;
|
||||||
|
in
|
||||||
|
[
|
||||||
|
{
|
||||||
|
name = "imx708.dtbo";
|
||||||
|
dtsFile = mkCompatibleDtsFile "${kernel}/dtbs/overlays/imx708.dtbo";
|
||||||
|
}
|
||||||
|
{
|
||||||
|
name = "vc4-kms-v3d-pi4.dtbo";
|
||||||
|
dtsFile = mkCompatibleDtsFile "${kernel}/dtbs/overlays/vc4-kms-v3d-pi4.dtbo";
|
||||||
|
}
|
||||||
|
];
|
||||||
|
};
|
||||||
|
firmware = with pkgs; [
|
||||||
|
firmwareLinuxNonfree
|
||||||
|
];
|
||||||
|
};
|
||||||
|
|
||||||
|
services.udev.extraRules = ''
|
||||||
|
SUBSYSTEM=="rpivid-*", GROUP="video", MODE="0660"
|
||||||
|
KERNEL=="vcsm-cma", GROUP="video", MODE="0660"
|
||||||
|
SUBSYSTEM=="dma_heap", GROUP="video", MODE="0660"
|
||||||
|
'';
|
||||||
|
|
||||||
|
nixpkgs.overlays = [
|
||||||
|
(import ./../../overlays/libcamera.nix)
|
||||||
|
];
|
||||||
|
|
||||||
|
networking = {
|
||||||
|
hostId = "731d1660";
|
||||||
|
firewall = {
|
||||||
|
enable = true;
|
||||||
|
allowedTCPPorts = [ 8080 ];
|
||||||
|
allowedUDPPorts = [ 8080 ];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
users.users.root = {
|
||||||
|
openssh.authorizedKeys.keys = [
|
||||||
|
"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAILVHTjsyMIV4THNw6yz0OxAxGnC+41gX72UrPqTzR+OS jordan@vimium.com"
|
||||||
|
];
|
||||||
|
};
|
||||||
|
|
||||||
|
services.openssh.settings.PermitRootLogin = lib.mkForce "prohibit-password";
|
||||||
|
|
||||||
|
systemd.services.ustreamer = {
|
||||||
|
enable = true;
|
||||||
|
description = "uStreamer service";
|
||||||
|
unitConfig = {
|
||||||
|
Type = "simple";
|
||||||
|
ConditionPathExists = "/sys/bus/i2c/drivers/imx708/10-001a/video4linux";
|
||||||
|
};
|
||||||
|
serviceConfig = {
|
||||||
|
ExecStart = ''${pkgs.libcamera}/bin/libcamerify ${pkgs.unstable.ustreamer}/bin/ustreamer \
|
||||||
|
--host=0.0.0.0 \
|
||||||
|
--resolution=4608x2592
|
||||||
|
'';
|
||||||
|
DynamicUser = "yes";
|
||||||
|
SupplementaryGroups = [ "video" ];
|
||||||
|
Restart = "always";
|
||||||
|
RestartSec = 10;
|
||||||
|
};
|
||||||
|
wantedBy = [ "network-online.target" ];
|
||||||
|
confinement.mode = "chroot-only";
|
||||||
|
};
|
||||||
|
|
||||||
|
environment.systemPackages = with pkgs; [
|
||||||
|
camera-streamer
|
||||||
|
git
|
||||||
|
neovim
|
||||||
|
libcamera
|
||||||
|
libraspberrypi
|
||||||
|
raspberrypi-eeprom
|
||||||
|
v4l-utils
|
||||||
|
unstable.ustreamer
|
||||||
|
];
|
||||||
|
|
||||||
|
system.stateVersion = "24.05";
|
||||||
|
}
|
33
hosts/skycam/hardware-configuration.nix
Normal file
33
hosts/skycam/hardware-configuration.nix
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
{ config, lib, modulesPath, ... }:
|
||||||
|
|
||||||
|
{
|
||||||
|
imports = [
|
||||||
|
(modulesPath + "/installer/sd-card/sd-image-aarch64.nix")
|
||||||
|
];
|
||||||
|
|
||||||
|
boot = {
|
||||||
|
kernelModules = [ "bcm2835-v4l2" ];
|
||||||
|
kernelParams = [
|
||||||
|
"cma=512M"
|
||||||
|
"panic=0"
|
||||||
|
];
|
||||||
|
supportedFilesystems = lib.mkForce [ "f2fs" "vfat" "xfs" ];
|
||||||
|
tmp.cleanOnBoot = false;
|
||||||
|
};
|
||||||
|
|
||||||
|
nixpkgs.overlays = [
|
||||||
|
(final: super: {
|
||||||
|
makeModulesClosure = x:
|
||||||
|
super.makeModulesClosure (x // { allowMissing = true; });
|
||||||
|
})
|
||||||
|
];
|
||||||
|
|
||||||
|
fileSystems = {
|
||||||
|
"/" = {
|
||||||
|
device = "/dev/disk/by-label/NIXOS_SD";
|
||||||
|
fsType = "ext4";
|
||||||
|
options = [ "noatime" ];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
18
hosts/vps1/README.md
Normal file
18
hosts/vps1/README.md
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
# vps1
|
||||||
|
|
||||||
|
## Overview
|
||||||
|
VPS hosted in OVH.
|
||||||
|
|
||||||
|
## Specs
|
||||||
|
* CPU - ??
|
||||||
|
* Memory - ??
|
||||||
|
|
||||||
|
### Disks
|
||||||
|
Device | Partitions _(filesystem, usage)_
|
||||||
|
--- | ---
|
||||||
|
NVMe | `/dev/sda1` (ext4, NixOS Root)
|
||||||
|
|
||||||
|
### Networks
|
||||||
|
- DHCP on `10.0.1.0/24` subnet.
|
||||||
|
- Tailscale on `100.64.0.0/10` subnet. FQDN: `vps1.mesh.vimium.net`.
|
||||||
|
|
114
hosts/vps1/default.nix
Normal file
114
hosts/vps1/default.nix
Normal file
@ -0,0 +1,114 @@
|
|||||||
|
{ config, pkgs, lib, ... }:
|
||||||
|
|
||||||
|
{
|
||||||
|
imports = [
|
||||||
|
./hardware-configuration.nix
|
||||||
|
../server.nix
|
||||||
|
];
|
||||||
|
|
||||||
|
nixpkgs.hostPlatform = "x86_64-linux";
|
||||||
|
|
||||||
|
networking = {
|
||||||
|
hostId = "08bf6db3";
|
||||||
|
firewall = {
|
||||||
|
enable = true;
|
||||||
|
allowedTCPPorts = [
|
||||||
|
22 # SSH
|
||||||
|
];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
users = {
|
||||||
|
users = {
|
||||||
|
jellyfin = {
|
||||||
|
isSystemUser = true;
|
||||||
|
group = "jellyfin";
|
||||||
|
shell = "/bin/sh";
|
||||||
|
openssh.authorizedKeys.keys = [
|
||||||
|
"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIOaaS+KMAEAymZhIJGC4LK8aMhUzhpmloUgvP2cxeBH4 jellyfin"
|
||||||
|
];
|
||||||
|
};
|
||||||
|
root = {
|
||||||
|
openssh.authorizedKeys.keys = [
|
||||||
|
"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAILVHTjsyMIV4THNw6yz0OxAxGnC+41gX72UrPqTzR+OS jordan@vimium.com"
|
||||||
|
];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
groups = {
|
||||||
|
jellyfin = { };
|
||||||
|
};
|
||||||
|
extraGroups.acme.members = [ "kanidm" "nginx" ];
|
||||||
|
};
|
||||||
|
|
||||||
|
services.openssh.settings.PermitRootLogin = lib.mkForce "prohibit-password";
|
||||||
|
|
||||||
|
security.acme.certs."auth.vimium.com" = {
|
||||||
|
postRun = "systemctl restart kanidm.service";
|
||||||
|
group = "acme";
|
||||||
|
};
|
||||||
|
|
||||||
|
services.kanidm = let
|
||||||
|
baseDomain = "vimium.com";
|
||||||
|
domain = "auth.${baseDomain}";
|
||||||
|
uri = "https://${domain}";
|
||||||
|
in {
|
||||||
|
package = pkgs.unstable.kanidm;
|
||||||
|
enableClient = true;
|
||||||
|
enableServer = true;
|
||||||
|
clientSettings = {
|
||||||
|
inherit uri;
|
||||||
|
};
|
||||||
|
serverSettings = {
|
||||||
|
bindaddress = "[::1]:3013";
|
||||||
|
ldapbindaddress = "[::1]:636";
|
||||||
|
domain = baseDomain;
|
||||||
|
origin = uri;
|
||||||
|
tls_chain = "${config.security.acme.certs.${domain}.directory}/full.pem";
|
||||||
|
tls_key = "${config.security.acme.certs.${domain}.directory}/key.pem";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
services.nginx.virtualHosts = {
|
||||||
|
"auth.vimium.com" = {
|
||||||
|
useACMEHost = "auth.vimium.com";
|
||||||
|
forceSSL = true;
|
||||||
|
locations."/" = {
|
||||||
|
proxyPass = "https://[::1]:3013";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
modules = rec {
|
||||||
|
databases.postgresql.enable = true;
|
||||||
|
services = {
|
||||||
|
borgmatic = {
|
||||||
|
enable = true;
|
||||||
|
directories = [
|
||||||
|
"/home"
|
||||||
|
"/var/lib"
|
||||||
|
"/var/www"
|
||||||
|
];
|
||||||
|
repoPath = "ssh://p91y8oh7@p91y8oh7.repo.borgbase.com/./repo";
|
||||||
|
};
|
||||||
|
coturn = {
|
||||||
|
enable = true;
|
||||||
|
realm = "turn.vimium.com";
|
||||||
|
matrixIntegration = true;
|
||||||
|
};
|
||||||
|
gitea.enable = true;
|
||||||
|
headscale.enable = true;
|
||||||
|
matrix = {
|
||||||
|
enable = true;
|
||||||
|
bridges = {
|
||||||
|
signal = true;
|
||||||
|
whatsapp = true;
|
||||||
|
};
|
||||||
|
usePostgresql = databases.postgresql.enable;
|
||||||
|
};
|
||||||
|
nginx.enable = true;
|
||||||
|
photoprism.enable = true;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
system.stateVersion = "22.11";
|
||||||
|
}
|
26
hosts/vps1/hardware-configuration.nix
Normal file
26
hosts/vps1/hardware-configuration.nix
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
{ config, lib, pkgs, modulesPath, ... }:
|
||||||
|
|
||||||
|
{
|
||||||
|
imports = [
|
||||||
|
(modulesPath + "/profiles/qemu-guest.nix")
|
||||||
|
];
|
||||||
|
|
||||||
|
boot = {
|
||||||
|
initrd = {
|
||||||
|
availableKernelModules = [ "ata_piix" "uhci_hcd" "xen_blkfront" "vmw_pvscsi" ];
|
||||||
|
kernelModules = [ "nvme" ];
|
||||||
|
};
|
||||||
|
loader.grub.device = "/dev/sda";
|
||||||
|
tmp.cleanOnBoot = true;
|
||||||
|
};
|
||||||
|
|
||||||
|
zramSwap.enable = true;
|
||||||
|
|
||||||
|
fileSystems = {
|
||||||
|
"/" = {
|
||||||
|
device = "/dev/sda1";
|
||||||
|
fsType = "ext4";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
40
modules/databases/postgresql.nix
Normal file
40
modules/databases/postgresql.nix
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
{
|
||||||
|
config,
|
||||||
|
lib,
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
|
||||||
|
let
|
||||||
|
cfg = config.modules.databases.postgresql;
|
||||||
|
in {
|
||||||
|
options.modules.databases.postgresql = {
|
||||||
|
enable = lib.mkOption {
|
||||||
|
default = false;
|
||||||
|
example = true;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
config = lib.mkIf cfg.enable {
|
||||||
|
services.postgresql = {
|
||||||
|
enable = true;
|
||||||
|
initdbArgs = [
|
||||||
|
"--allow-group-access"
|
||||||
|
"--encoding=UTF8"
|
||||||
|
"--locale=C"
|
||||||
|
];
|
||||||
|
settings = {
|
||||||
|
log_connections = true;
|
||||||
|
log_disconnections = true;
|
||||||
|
log_destination = lib.mkForce "syslog";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
services.borgmatic.settings = {
|
||||||
|
postgresql_databases = [
|
||||||
|
{
|
||||||
|
name = "all";
|
||||||
|
}
|
||||||
|
];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
@ -1,12 +1,18 @@
|
|||||||
{
|
{
|
||||||
imports = [
|
imports = [
|
||||||
./options.nix
|
./options.nix
|
||||||
|
./podman.nix
|
||||||
|
./databases/postgresql.nix
|
||||||
./desktop/gnome.nix
|
./desktop/gnome.nix
|
||||||
|
./desktop/forensics.nix
|
||||||
|
./desktop/hyprland.nix
|
||||||
|
./desktop/kde.nix
|
||||||
./desktop/mimeapps.nix
|
./desktop/mimeapps.nix
|
||||||
./desktop/apps/qbittorrent.nix
|
./desktop/apps/qbittorrent.nix
|
||||||
./desktop/apps/slack.nix
|
./desktop/apps/slack.nix
|
||||||
./desktop/apps/thunderbird.nix
|
./desktop/apps/thunderbird.nix
|
||||||
./desktop/apps/zoom.nix
|
./desktop/apps/zoom.nix
|
||||||
|
./desktop/browsers/brave.nix
|
||||||
./desktop/browsers/firefox.nix
|
./desktop/browsers/firefox.nix
|
||||||
./desktop/gaming/emulators.nix
|
./desktop/gaming/emulators.nix
|
||||||
./desktop/gaming/lutris.nix
|
./desktop/gaming/lutris.nix
|
||||||
@ -25,9 +31,23 @@
|
|||||||
./dev/zig.nix
|
./dev/zig.nix
|
||||||
./editors/neovim
|
./editors/neovim
|
||||||
./editors/vscode.nix
|
./editors/vscode.nix
|
||||||
|
./hardware/presonus-studio.nix
|
||||||
|
./networking/netbird.nix
|
||||||
./networking/tailscale.nix
|
./networking/tailscale.nix
|
||||||
|
./networking/wireless.nix
|
||||||
./security/gpg.nix
|
./security/gpg.nix
|
||||||
./security/pass.nix
|
./security/pass.nix
|
||||||
|
./services/borgmatic
|
||||||
|
./services/chrony
|
||||||
|
./services/coturn
|
||||||
|
./services/gitea
|
||||||
|
./services/gitea-runner
|
||||||
|
./services/headscale
|
||||||
|
./services/immich
|
||||||
|
./services/mail
|
||||||
|
./services/matrix
|
||||||
|
./services/nginx
|
||||||
|
./services/photoprism
|
||||||
./shell/git
|
./shell/git
|
||||||
./shell/zsh
|
./shell/zsh
|
||||||
];
|
];
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
{ config, lib, pkgs, inputs, ... }:
|
{ config, lib, self, ... }:
|
||||||
|
|
||||||
let cfg = config.modules.desktop.apps.thunderbird;
|
let cfg = config.modules.desktop.apps.thunderbird;
|
||||||
in {
|
in {
|
||||||
@ -10,7 +10,7 @@ in {
|
|||||||
};
|
};
|
||||||
|
|
||||||
config = lib.mkIf cfg.enable {
|
config = lib.mkIf cfg.enable {
|
||||||
home.file.".thunderbird/Default/chrome/thunderbird-gnome-theme".source = inputs.thunderbird-gnome-theme;
|
home.file.".thunderbird/Default/chrome/thunderbird-gnome-theme".source = self.inputs.thunderbird-gnome-theme;
|
||||||
|
|
||||||
home.programs.thunderbird = {
|
home.programs.thunderbird = {
|
||||||
enable = true;
|
enable = true;
|
||||||
|
17
modules/desktop/browsers/brave.nix
Normal file
17
modules/desktop/browsers/brave.nix
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
{ config, lib, pkgs, ... }:
|
||||||
|
|
||||||
|
let cfg = config.modules.desktop.browsers.brave;
|
||||||
|
in {
|
||||||
|
options.modules.desktop.browsers.brave = {
|
||||||
|
enable = lib.mkOption {
|
||||||
|
default = false;
|
||||||
|
example = true;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
config = lib.mkIf cfg.enable {
|
||||||
|
user.packages = with pkgs; [
|
||||||
|
brave
|
||||||
|
];
|
||||||
|
};
|
||||||
|
}
|
@ -1,4 +1,4 @@
|
|||||||
{ config, lib, pkgs, inputs, ... }:
|
{ config, lib, self, ... }:
|
||||||
|
|
||||||
let cfg = config.modules.desktop.browsers.firefox;
|
let cfg = config.modules.desktop.browsers.firefox;
|
||||||
in {
|
in {
|
||||||
@ -10,7 +10,7 @@ in {
|
|||||||
};
|
};
|
||||||
|
|
||||||
config = lib.mkIf cfg.enable {
|
config = lib.mkIf cfg.enable {
|
||||||
home.file.".mozilla/firefox/Default/chrome/firefox-gnome-theme".source = inputs.firefox-gnome-theme;
|
home.file.".mozilla/firefox/Default/chrome/firefox-gnome-theme".source = self.inputs.firefox-gnome-theme;
|
||||||
|
|
||||||
home.programs.firefox = {
|
home.programs.firefox = {
|
||||||
enable = true;
|
enable = true;
|
||||||
@ -35,23 +35,79 @@ in {
|
|||||||
|
|
||||||
## Preferences
|
## Preferences
|
||||||
"browser.ctrlTab.sortByRecentlyUsed" = true;
|
"browser.ctrlTab.sortByRecentlyUsed" = true;
|
||||||
|
"browser.discovery.enabled" = false;
|
||||||
|
"browser.download.open_pdf_attachments_inline" = true;
|
||||||
|
"browser.menu.showViewImageInfo" = true;
|
||||||
"browser.newtabpage.enabled" = false;
|
"browser.newtabpage.enabled" = false;
|
||||||
|
"browser.newtabpage.activity-stream.showSponsored" = false;
|
||||||
|
"browser.newtabpage.activity-stream.showSponsoredTopSites" = false;
|
||||||
|
"browser.newtabpage.activity-stream.default.sites" = "";
|
||||||
|
"browser.privatebrowsing.forceMediaMemoryCache" = true;
|
||||||
"browser.search.widget.inNavBar" = true;
|
"browser.search.widget.inNavBar" = true;
|
||||||
"browser.startup.page" = 3;
|
"browser.startup.page" = 3;
|
||||||
"browser.startup.homepage" = "https://www.vimium.com";
|
"browser.startup.homepage" = "https://www.vimium.com";
|
||||||
"browser.toolbars.bookmarks.visibility" = "never";
|
"browser.toolbars.bookmarks.visibility" = "never";
|
||||||
|
"browser.uitour.enabled" = false;
|
||||||
|
"browser.urlbar.suggest.engines" = false;
|
||||||
|
"browser.urlbar.suggest.calculator" = true;
|
||||||
|
"browser.urlbar.trending.featureGate" = false;
|
||||||
|
"browser.urlbar.unitConversion.enabled" = true;
|
||||||
|
"cookiebanners.service.mode" = 1;
|
||||||
|
"cookiebanners.service.mode.privateBrowsing" = 1;
|
||||||
|
"network.IDN_show_punycode" = true;
|
||||||
|
|
||||||
|
## Performance
|
||||||
|
"browser.cache.jsbc_compression_level" = 3;
|
||||||
|
"content.notify.interval" = 100000;
|
||||||
|
"dom.enable_web_task_scheduling" = true;
|
||||||
|
"dom.security.sanitizer.enabled" = true;
|
||||||
|
"gfx.canvas.accelerated.cache-items" = 4096;
|
||||||
|
"gfx.canvas.accelerated.cache-size" = 512;
|
||||||
|
"gfx.content.skia-font-cache-size" = 20;
|
||||||
|
"gfx.webrender.all" = true;
|
||||||
|
"gfx.webrender.compositor" = true;
|
||||||
|
"gfx.webrender.enable" = true;
|
||||||
|
"image.mem.decode_bytes_at_a_time" = 32768;
|
||||||
|
"layers.acceleration.force-enabled" = true;
|
||||||
|
"layout.css.grid-template-masonry-value.enabled" = true;
|
||||||
|
"media.ffmpeg.vaapi.enabled" = true;
|
||||||
|
"media.memory_cache_max_size" = 65536;
|
||||||
|
"media.cache_readahead_limit" = 7200;
|
||||||
|
"media.cache_resume_threshold" = 3600;
|
||||||
|
"network.dns.disablePrefetch" = true;
|
||||||
|
"network.dns.disablePrefetchFromHTTPS" = true;
|
||||||
|
"network.dnsCacheExpiration" = 3600;
|
||||||
|
"network.http.max-connections" = 1800;
|
||||||
|
"network.http.max-persistent-connections-per-server" = 10;
|
||||||
|
"network.http.max-urgent-start-excessive-connections-per-host" = 5;
|
||||||
|
"network.http.pacing.requests.enabled" = false;
|
||||||
|
"network.predictor.enabled" = false;
|
||||||
|
"network.prefetch-next" = false;
|
||||||
|
"network.ssl_tokens_cache_capacity" = 10240;
|
||||||
|
"pdfjs.enableScripting" = false;
|
||||||
|
"security.mixed_content.block_display_content" = true;
|
||||||
|
|
||||||
## Experiments
|
## Experiments
|
||||||
"app.normandy.enabled" = false;
|
"app.normandy.enabled" = false;
|
||||||
"app.normandy.api_url" = "";
|
"app.normandy.api_url" = "";
|
||||||
"app.normandy.user_id" = "";
|
"app.normandy.user_id" = "";
|
||||||
|
"app.shield.optoutstudies.enabled" = false;
|
||||||
|
"browser.shopping.experience2023.active" = false;
|
||||||
|
"browser.shopping.experience2023.enabled" = false;
|
||||||
"extensions.screenshots.disabled" = true;
|
"extensions.screenshots.disabled" = true;
|
||||||
"extensions.screenshots.upload-disabled" = true;
|
"extensions.screenshots.upload-disabled" = true;
|
||||||
"experiments.supported" = false;
|
"experiments.supported" = false;
|
||||||
"experiments.enabled" = false;
|
"experiments.enabled" = false;
|
||||||
"experiments.manifest.uri" = "";
|
"experiments.manifest.uri" = "";
|
||||||
"network.allow-experiments" = false;
|
"network.allow-experiments" = false;
|
||||||
"privacy.trackingprotection.enabled" = false;
|
|
||||||
|
## Privacy
|
||||||
|
"dom.private-attribution.submission.enabled" = false;
|
||||||
|
# "privacy.resistFingerprinting" = true;
|
||||||
|
"privacy.resistFingerprinting.autoDeclineNoUserInputCanvasPrompts" = false;
|
||||||
|
"privacy.trackingprotection.enabled" = true;
|
||||||
|
"privacy.trackingprotection.pbmode.enabled" = true;
|
||||||
|
"privacy.userContext.enabled" = true;
|
||||||
|
|
||||||
## Geo
|
## Geo
|
||||||
"geo.enabled" = false;
|
"geo.enabled" = false;
|
||||||
@ -98,12 +154,34 @@ in {
|
|||||||
"dom.battery.enabled" = false;
|
"dom.battery.enabled" = false;
|
||||||
"dom.vr.enabled" = false;
|
"dom.vr.enabled" = false;
|
||||||
"media.navigator.enabled" = false;
|
"media.navigator.enabled" = false;
|
||||||
"dom.webaudio.enabled" = false;
|
# "dom.webaudio.enabled" = false;
|
||||||
|
|
||||||
## Isolation
|
## Isolation
|
||||||
"privacy.firstparty.isolate" = true;
|
"privacy.firstparty.isolate" = true;
|
||||||
"privacy.firstparty.isolate.restrict_opener_access" = true;
|
"privacy.firstparty.isolate.restrict_opener_access" = true;
|
||||||
|
|
||||||
|
## Telemetry
|
||||||
|
"beacon.enabled" = false;
|
||||||
|
"browser.newtabpage.activity-stream.feeds.telemetry" = false;
|
||||||
|
"browser.newtabpage.activity-stream.telemetry" = false;
|
||||||
|
"browser.send_pings" = false;
|
||||||
|
"datareporting.policy.dataSubmissionEnabled" = false;
|
||||||
|
"datareporting.healthReport.uploadEnabled" = false;
|
||||||
|
"toolkit.coverage.opt-out" = true;
|
||||||
|
"toolkit.coverage.endpoint.base" = "";
|
||||||
|
"toolkit.telemetry.archive.enabled" = false;
|
||||||
|
"toolkit.telemetry.bhrPing.enabled" = false;
|
||||||
|
"toolkit.telemetry.coverage.opt-out" = true;
|
||||||
|
"toolkit.telemetry.enabled" = false;
|
||||||
|
"toolkit.telemetry.firstShutdownPing.enabled" = false;
|
||||||
|
"toolkit.telemetry.hybridContent.enabled" = false;
|
||||||
|
"toolkit.telemetry.newProfilePing.enabled" = false;
|
||||||
|
"toolkit.telemetry.reportingPolicy.firstRun" = false;
|
||||||
|
"toolkit.telemetry.server" = "data:,";
|
||||||
|
"toolkit.telemetry.shutdownPingSender.enabled" = false;
|
||||||
|
"toolkit.telemetry.unified" = false;
|
||||||
|
"toolkit.telemetry.updatePing.enabled" = false;
|
||||||
|
|
||||||
## Pocket/Hello
|
## Pocket/Hello
|
||||||
"loop.enabled" = false;
|
"loop.enabled" = false;
|
||||||
"loop.feedback.baseUrl" = "";
|
"loop.feedback.baseUrl" = "";
|
||||||
@ -125,6 +203,10 @@ in {
|
|||||||
"browser.pocket.useLocaleList" = false;
|
"browser.pocket.useLocaleList" = false;
|
||||||
"brwoser.pocket.enabledLocales" = "";
|
"brwoser.pocket.enabledLocales" = "";
|
||||||
|
|
||||||
|
## Plugins
|
||||||
|
"plugin.state.flash" = 0;
|
||||||
|
"plugin.state.java" = 0;
|
||||||
|
|
||||||
## Misc
|
## Misc
|
||||||
"browser.selfsupport.url" = "";
|
"browser.selfsupport.url" = "";
|
||||||
};
|
};
|
||||||
|
26
modules/desktop/forensics.nix
Normal file
26
modules/desktop/forensics.nix
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
{ config, lib, pkgs, ... }:
|
||||||
|
|
||||||
|
let cfg = config.modules.desktop.forensics;
|
||||||
|
in {
|
||||||
|
options.modules.desktop.forensics = {
|
||||||
|
enable = lib.mkOption {
|
||||||
|
default = false;
|
||||||
|
example = true;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
config = lib.mkIf cfg.enable {
|
||||||
|
user.packages = with pkgs; [
|
||||||
|
acquire
|
||||||
|
afflib
|
||||||
|
autopsy
|
||||||
|
fatcat
|
||||||
|
foremost
|
||||||
|
hstsparser
|
||||||
|
networkminer
|
||||||
|
sleuthkit
|
||||||
|
testdisk-qt
|
||||||
|
tracee
|
||||||
|
];
|
||||||
|
};
|
||||||
|
}
|
@ -19,6 +19,10 @@ in {
|
|||||||
default = false;
|
default = false;
|
||||||
example = true;
|
example = true;
|
||||||
};
|
};
|
||||||
|
ps1.enable = lib.mkOption {
|
||||||
|
default = false;
|
||||||
|
example = true;
|
||||||
|
};
|
||||||
ps2.enable = lib.mkOption {
|
ps2.enable = lib.mkOption {
|
||||||
default = false;
|
default = false;
|
||||||
example = true;
|
example = true;
|
||||||
@ -35,25 +39,36 @@ in {
|
|||||||
default = false;
|
default = false;
|
||||||
example = true;
|
example = true;
|
||||||
};
|
};
|
||||||
|
switch.enable = lib.mkOption {
|
||||||
|
default = false;
|
||||||
|
example = true;
|
||||||
|
};
|
||||||
wii.enable = lib.mkOption {
|
wii.enable = lib.mkOption {
|
||||||
default = false;
|
default = false;
|
||||||
example = true;
|
example = true;
|
||||||
};
|
};
|
||||||
|
xbox.enable = lib.mkOption {
|
||||||
|
default = false;
|
||||||
|
example = true;
|
||||||
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
config = {
|
config = {
|
||||||
user.packages = with pkgs; [
|
user.packages = with pkgs; [
|
||||||
(lib.mkIf cfg.ps2.enable pcsx2)
|
(lib.mkIf cfg.ps1.enable duckstation)
|
||||||
|
(lib.mkIf cfg.ps2.enable unstable.pcsx2)
|
||||||
(lib.mkIf cfg.ps3.enable rpcs3)
|
(lib.mkIf cfg.ps3.enable rpcs3)
|
||||||
(lib.mkIf cfg.psp.enable ppsspp)
|
(lib.mkIf cfg.psp.enable unstable.ppsspp)
|
||||||
(lib.mkIf cfg.ds.enable desmume)
|
(lib.mkIf cfg.ds.enable desmume)
|
||||||
(lib.mkIf (cfg.gba.enable ||
|
(lib.mkIf (cfg.gba.enable ||
|
||||||
cfg.gb.enable ||
|
cfg.gb.enable ||
|
||||||
cfg.snes.enable)
|
cfg.snes.enable)
|
||||||
higan)
|
higan)
|
||||||
|
(lib.mkIf cfg.switch.enable yuzuPackages.mainline)
|
||||||
(lib.mkIf (cfg.wii.enable ||
|
(lib.mkIf (cfg.wii.enable ||
|
||||||
cfg.gamecube.enable)
|
cfg.gamecube.enable)
|
||||||
dolphin-emu)
|
dolphin-emu)
|
||||||
|
(lib.mkIf cfg.xbox.enable unstable.xemu)
|
||||||
];
|
];
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
@ -10,8 +10,13 @@ in {
|
|||||||
};
|
};
|
||||||
|
|
||||||
config = lib.mkIf cfg.enable {
|
config = lib.mkIf cfg.enable {
|
||||||
user.packages = with pkgs; [
|
environment.systemPackages = with pkgs; [
|
||||||
lutris
|
(lutris.override {
|
||||||
|
extraPkgs = pkgs: [
|
||||||
|
winePackages.staging
|
||||||
|
wine64Packages.staging
|
||||||
|
];
|
||||||
|
})
|
||||||
vulkan-loader
|
vulkan-loader
|
||||||
vulkan-tools
|
vulkan-tools
|
||||||
];
|
];
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
{ config, lib, pkgs, ... }:
|
{ config, lib, pkgs, self, ... }:
|
||||||
|
|
||||||
let cfg = config.modules.desktop.gnome;
|
let cfg = config.modules.desktop.gnome;
|
||||||
in {
|
in {
|
||||||
@ -17,31 +17,94 @@ in {
|
|||||||
};
|
};
|
||||||
|
|
||||||
services.flatpak.enable = true;
|
services.flatpak.enable = true;
|
||||||
|
services.fwupd.enable = true;
|
||||||
|
|
||||||
programs.dconf.enable = true;
|
programs.dconf.enable = true;
|
||||||
dconf.settings = {
|
dconf.settings = {
|
||||||
|
"io/github/celluloid-player/celluloid" = {
|
||||||
|
draggable-video-area-enable = true;
|
||||||
|
};
|
||||||
|
"org/gnome/desktop/interface" = {
|
||||||
|
color-scheme = "prefer-dark";
|
||||||
|
cursor-theme = "Adwaita";
|
||||||
|
enable-hot-corners = false;
|
||||||
|
font-name = "Cantarell 11";
|
||||||
|
gtk-theme = "adw-gtk3-dark";
|
||||||
|
icon-theme = "MoreWaita";
|
||||||
|
monospace-font-name = "UbuntuMono Nerd Font 11";
|
||||||
|
toolbar-style = "both-horiz";
|
||||||
|
};
|
||||||
|
"org/gnome/desktop/peripherals/touchpad" = {
|
||||||
|
tap-to-click = true;
|
||||||
|
};
|
||||||
|
"org/gnome/desktop/sound" = {
|
||||||
|
theme-name = "freedesktop";
|
||||||
|
};
|
||||||
|
"org/gnome/desktop/search-providers" = {
|
||||||
|
disabled = [ "org.gnome.Epiphany.desktop" ];
|
||||||
|
};
|
||||||
|
"org/gnome/desktop/wm/keybindings" = {
|
||||||
|
switch-group = [ "<Super>grave" ];
|
||||||
|
switch-group-backward = [ "<Shift><Super>grave" ];
|
||||||
|
};
|
||||||
|
"org/gnome/desktop/wm/preferences" = {
|
||||||
|
button-layout = "appmenu:close";
|
||||||
|
};
|
||||||
|
"org/gnome/gnome-session" = {
|
||||||
|
auto-save-session = true;
|
||||||
|
};
|
||||||
|
"org/gnome/gnome-system-monitor" = {
|
||||||
|
show-dependencies = true;
|
||||||
|
};
|
||||||
|
"org/gnome/mutter" = {
|
||||||
|
center-new-windows = true;
|
||||||
|
edge-tiling = true;
|
||||||
|
experimental-features = [ "scale-monitor-framebuffer" ];
|
||||||
|
};
|
||||||
|
"org/gnome/settings-daemon/plugins/media-keys" = {
|
||||||
|
volume-up = [
|
||||||
|
"<Shift>F12"
|
||||||
|
"XF86AudioRaiseVolume"
|
||||||
|
];
|
||||||
|
volume-down = [
|
||||||
|
"<Shift>F11"
|
||||||
|
"XF86AudioLowerVolume"
|
||||||
|
];
|
||||||
|
};
|
||||||
"org/gnome/shell" = {
|
"org/gnome/shell" = {
|
||||||
disable-user-extensions = false;
|
disable-user-extensions = false;
|
||||||
enabled-extensions = [
|
enabled-extensions = [
|
||||||
# "another-window-session-manager@gmail.com"
|
"appindicatorsupport@rgcjonas.gmail.com"
|
||||||
|
# "arcmenu@arcmenu.com"
|
||||||
"blur-my-shell@aunetx"
|
"blur-my-shell@aunetx"
|
||||||
|
# "browser-tabs@com.github.harshadgavali"
|
||||||
"burn-my-windows@schneegans.github.com"
|
"burn-my-windows@schneegans.github.com"
|
||||||
|
"clipboard-indicator@tudmotu.com"
|
||||||
|
"CoverflowAltTab@palatis.blogspot.com"
|
||||||
|
# "dash-to-panel@jderose9.github.com"
|
||||||
# "desktop-cube@schneegans.github.com"
|
# "desktop-cube@schneegans.github.com"
|
||||||
# "desktop-zoom@colin.kinlo.ch"
|
# "EasyScreenCast@iacopodeenosee.gmail.com"
|
||||||
"espresso@coadmunkee.github.com"
|
"espresso@coadmunkee.github.com"
|
||||||
# "flypie@schneegans.github.com"
|
"flypie@schneegans.github.com"
|
||||||
# "forge@jmmaranan.com"
|
# "forge@jmmaranan.com"
|
||||||
"hue-lights@chlumskyvaclav@gmail.com"
|
"gsconnect@andyholmes.github.io"
|
||||||
|
# "gSnap@micahosborne"
|
||||||
|
# "hidetopbar@mathieu.bidon.ca"
|
||||||
"just-perfection-desktop@just-perfection"
|
"just-perfection-desktop@just-perfection"
|
||||||
|
# "mediacontrols@cliffniff.github.com"
|
||||||
|
# "mousefollowsfocus@matthes.biz"
|
||||||
# "pano@elhan.io"
|
# "pano@elhan.io"
|
||||||
# "paperwm@hedning:matrix.org"
|
# "paperwm@hedning:matrix.org"
|
||||||
|
"pip-on-top@rafostar.github.com"
|
||||||
|
# "rounded-window-corners@yilozt"
|
||||||
# "search-light@icedman.github.com"
|
# "search-light@icedman.github.com"
|
||||||
"space-bar@luchrioh"
|
|
||||||
# "smart-auto-move@khimaros.com"
|
# "smart-auto-move@khimaros.com"
|
||||||
# "systemd-manager@hardpixel.eu"
|
"space-bar@luchrioh"
|
||||||
# "tailscale-status@maxgallup.github.com"
|
|
||||||
# "tiling-assistant@leleat-on-github"
|
# "tiling-assistant@leleat-on-github"
|
||||||
|
"tilingshell@ferrarodomenico.com"
|
||||||
"Vitals@CoreCoding.com"
|
"Vitals@CoreCoding.com"
|
||||||
|
"windowIsReady_Remover@nunofarruca@gmail.com"
|
||||||
|
# "worksets@blipk.xyz"
|
||||||
# "wsmatrix@martin.zurowietz.de"
|
# "wsmatrix@martin.zurowietz.de"
|
||||||
];
|
];
|
||||||
favorite-apps = [
|
favorite-apps = [
|
||||||
@ -49,9 +112,6 @@ in {
|
|||||||
"org.gnome.Nautilus.desktop"
|
"org.gnome.Nautilus.desktop"
|
||||||
];
|
];
|
||||||
};
|
};
|
||||||
"org/gnome/shell/extensions/another-window-session-manager" = {
|
|
||||||
enable-autorestore-sessions = true;
|
|
||||||
};
|
|
||||||
"org/gnome/shell/extensions/blur-my-shell/panel" = {
|
"org/gnome/shell/extensions/blur-my-shell/panel" = {
|
||||||
static-blur = true;
|
static-blur = true;
|
||||||
};
|
};
|
||||||
@ -63,8 +123,14 @@ in {
|
|||||||
glide-open-effect = true;
|
glide-open-effect = true;
|
||||||
glide-close-effect = true;
|
glide-close-effect = true;
|
||||||
};
|
};
|
||||||
"org/gnome/shell/extensions/desktop-zoom" = {
|
"org/gnome/shell/extensions/dash-to-panel" = {
|
||||||
mag-factor-delta = 0.07;
|
intellihide = true;
|
||||||
|
panel-positions = ''
|
||||||
|
{"0":"TOP"}
|
||||||
|
'';
|
||||||
|
trans-panel-opacity = 0.3;
|
||||||
|
trans-use-custom-opacity = true;
|
||||||
|
trans-use-dynamic-opacity = true;
|
||||||
};
|
};
|
||||||
"org/gnome/shell/extensions/espresso" = {
|
"org/gnome/shell/extensions/espresso" = {
|
||||||
enable-fullscreen = true;
|
enable-fullscreen = true;
|
||||||
@ -74,18 +140,32 @@ in {
|
|||||||
"com.obsproject.Studio.desktop"
|
"com.obsproject.Studio.desktop"
|
||||||
];
|
];
|
||||||
};
|
};
|
||||||
"org/gnome/shell/extensions/paperwm" = {
|
"org/gnome/shell/extensions/flypie" = {
|
||||||
use-default-background = true;
|
preview-on-right-side = true;
|
||||||
};
|
};
|
||||||
"org/gnome/shell/extensions/forge" = {
|
"org/gnome/shell/extensions/forge" = {
|
||||||
window-gap-size = 8;
|
window-gap-size = 8;
|
||||||
window-gap-hidden-on-single = false;
|
window-gap-hidden-on-single = false;
|
||||||
};
|
};
|
||||||
|
"org/gnome/shell/extensions/hidetopbar" = {
|
||||||
|
mouse-sensitive = true;
|
||||||
|
mouse-sensitive-fullscreen-window = true;
|
||||||
|
enable-active-window = false;
|
||||||
|
};
|
||||||
"org/gnome/shell/extensions/just-perfection" = {
|
"org/gnome/shell/extensions/just-perfection" = {
|
||||||
activities-button = false;
|
activities-button = false;
|
||||||
window-demands-attention-focus = true;
|
window-demands-attention-focus = true;
|
||||||
workspace-wrap-around = true;
|
workspace-wrap-around = true;
|
||||||
};
|
};
|
||||||
|
"org/gnome/shell/extensions/paperwm" = {
|
||||||
|
use-default-background = true;
|
||||||
|
};
|
||||||
|
"org/gnome/shell/extensions/pip-on-top" = {
|
||||||
|
stick = true;
|
||||||
|
};
|
||||||
|
"org/gnome/shell/extensions/search-light" = {
|
||||||
|
popup-at-cursor-monitor = true;
|
||||||
|
};
|
||||||
"org/gnome/shell/extensions/space-bar/behavior" = {
|
"org/gnome/shell/extensions/space-bar/behavior" = {
|
||||||
enable-activate-workspace-shortcuts = true;
|
enable-activate-workspace-shortcuts = true;
|
||||||
show-empty-workspaces = true;
|
show-empty-workspaces = true;
|
||||||
@ -98,9 +178,15 @@ in {
|
|||||||
screen-left-gap = 8;
|
screen-left-gap = 8;
|
||||||
window-gap = 8;
|
window-gap = 8;
|
||||||
};
|
};
|
||||||
"org/gnome/desktop/background" = {
|
"org/gnome/shell/extensions/tilingshell" = {
|
||||||
picture-uri = "file://${pkgs.gnome.gnome-backgrounds}/share/backgrounds/gnome/adwaita-l.jpg";
|
inner-gaps = 16;
|
||||||
picture-uri-dark = "file://${pkgs.gnome.gnome-backgrounds}/share/backgrounds/gnome/adwaita-d.jpg";
|
outer-gaps = 8;
|
||||||
|
enable-blur-snap-assistant = true;
|
||||||
|
};
|
||||||
|
"org/gnome/Console" = {
|
||||||
|
font-scale = 1.4;
|
||||||
|
use-system-font = false;
|
||||||
|
custom-font = "ComicShannsMono Nerd Font 10";
|
||||||
};
|
};
|
||||||
"org/gtk/settings/file-chooser" = {
|
"org/gtk/settings/file-chooser" = {
|
||||||
show-hidden = true;
|
show-hidden = true;
|
||||||
@ -110,98 +196,92 @@ in {
|
|||||||
show-hidden = true;
|
show-hidden = true;
|
||||||
sort-directories-first = true;
|
sort-directories-first = true;
|
||||||
};
|
};
|
||||||
"org/gnome/settings-daemon/plugins/media-keys" = {
|
|
||||||
volume-up = [
|
|
||||||
"<Shift>F12"
|
|
||||||
"XF86AudioRaiseVolume"
|
|
||||||
];
|
|
||||||
volume-down = [
|
|
||||||
"<Shift>F11"
|
|
||||||
"XF86AudioLowerVolume"
|
|
||||||
];
|
|
||||||
};
|
|
||||||
"org/gnome/gnome-session" = {
|
|
||||||
auto-save-session = true;
|
|
||||||
};
|
|
||||||
"org/gnome/gnome-system-monitor" = {
|
|
||||||
show-dependencies = true;
|
|
||||||
};
|
|
||||||
"org/gnome/Console" = {
|
|
||||||
font-scale = 1.4;
|
|
||||||
};
|
|
||||||
"org/gnome/mutter" = {
|
|
||||||
center-new-windows = true;
|
|
||||||
experimental-features = [ "scale-monitor-framebuffer" ];
|
|
||||||
};
|
|
||||||
"org/gnome/desktop/interface" = {
|
|
||||||
color-scheme = "prefer-dark";
|
|
||||||
enable-hot-corners = false;
|
|
||||||
monospace-font-name = "Ubuntu Mono 11";
|
|
||||||
};
|
|
||||||
"org/gnome/desktop/wm/keybindings" = {
|
|
||||||
switch-group = [ "<Super>grave" ];
|
|
||||||
switch-group-backward = [ "<Shift><Super>grave" ];
|
|
||||||
};
|
|
||||||
"io/github/celluloid-player/celluloid" = {
|
|
||||||
draggable-video-area-enable = true;
|
|
||||||
};
|
|
||||||
};
|
};
|
||||||
|
|
||||||
fonts.packages = with pkgs; [
|
environment.sessionVariables = {
|
||||||
noto-fonts
|
QT_STYLE_OVERRIDE = lib.mkForce "kvantum";
|
||||||
ubuntu_font_family
|
QT_WAYLAND_DECORATION = lib.mkForce "adwaita";
|
||||||
];
|
};
|
||||||
|
|
||||||
|
home.configFile = {
|
||||||
|
"Kvantum/kvantum.kvconfig".text = lib.generators.toINI {} {
|
||||||
|
General.theme = "KvLibadwaitaDark";
|
||||||
|
};
|
||||||
|
"Kvantum/KvLibadwaita".source = "${self.inputs.kvlibadwaita}/src/KvLibadwaita";
|
||||||
|
};
|
||||||
|
|
||||||
user.packages = with pkgs; [
|
user.packages = with pkgs; [
|
||||||
|
authenticator
|
||||||
|
# bottles
|
||||||
|
# bustle
|
||||||
celluloid
|
celluloid
|
||||||
fragments
|
# d-spy
|
||||||
|
# drawing
|
||||||
|
# fragments
|
||||||
|
gnome.dconf-editor
|
||||||
|
gnome.ghex
|
||||||
|
# gnome-builder
|
||||||
|
gnome-decoder
|
||||||
|
gnome-firmware
|
||||||
|
gnome-frog
|
||||||
|
# gnome-obfuscate
|
||||||
|
gnome-podcasts
|
||||||
|
identity
|
||||||
mission-center
|
mission-center
|
||||||
];
|
mousam
|
||||||
|
newsflash
|
||||||
|
# schemes
|
||||||
|
shortwave
|
||||||
|
sysprof
|
||||||
|
] ++ (if config.virtualisation.podman.enable then [
|
||||||
|
pods
|
||||||
|
] else []);
|
||||||
|
|
||||||
environment.systemPackages = with pkgs; [
|
environment.systemPackages = with pkgs.unstable; [
|
||||||
bind
|
adw-gtk3
|
||||||
bmon
|
kdePackages.qtstyleplugin-kvantum
|
||||||
fd
|
libsForQt5.qtstyleplugin-kvantum
|
||||||
ffmpeg
|
morewaita-icon-theme
|
||||||
gnome.gnome-boxes
|
nautilus-python
|
||||||
gnomeExtensions.another-window-session-manager
|
qadwaitadecorations
|
||||||
# gnomeExtensions.bifocals
|
qadwaitadecorations-qt6
|
||||||
|
|
||||||
|
## Shell extensions
|
||||||
|
gnomeExtensions.appindicator
|
||||||
|
gnomeExtensions.arcmenu
|
||||||
gnomeExtensions.blur-my-shell
|
gnomeExtensions.blur-my-shell
|
||||||
gnomeExtensions.browser-tabs
|
gnomeExtensions.browser-tabs
|
||||||
gnomeExtensions.burn-my-windows
|
gnomeExtensions.burn-my-windows
|
||||||
|
gnomeExtensions.clipboard-indicator
|
||||||
|
gnomeExtensions.coverflow-alt-tab
|
||||||
|
gnomeExtensions.dash-to-panel
|
||||||
gnomeExtensions.desktop-cube
|
gnomeExtensions.desktop-cube
|
||||||
gnomeExtensions.desktop-zoom
|
gnomeExtensions.easyScreenCast
|
||||||
gnomeExtensions.espresso
|
gnomeExtensions.espresso
|
||||||
gnome44Extensions."flypie@schneegans.github.com"
|
gnomeExtensions.fly-pie
|
||||||
# gnomeExtensions.forge
|
gnomeExtensions.forge
|
||||||
# gnomeExtensions.gsnap
|
gnomeExtensions.gsconnect
|
||||||
gnomeExtensions.hue-lights
|
gnomeExtensions.gsnap
|
||||||
|
gnomeExtensions.hide-top-bar
|
||||||
gnomeExtensions.just-perfection
|
gnomeExtensions.just-perfection
|
||||||
# gnomeExtensions.mutter-primary-gpu
|
gnomeExtensions.media-controls
|
||||||
|
gnomeExtensions.mouse-follows-focus
|
||||||
gnomeExtensions.pano
|
gnomeExtensions.pano
|
||||||
gnomeExtensions.paperwm
|
gnomeExtensions.paperwm
|
||||||
# gnomeExtensions.pip-on-top
|
gnomeExtensions.pip-on-top
|
||||||
gnomeExtensions.rounded-window-corners
|
gnomeExtensions.rounded-window-corners
|
||||||
gnomeExtensions.search-light
|
gnomeExtensions.search-light
|
||||||
gnomeExtensions.smart-auto-move
|
gnomeExtensions.smart-auto-move
|
||||||
gnomeExtensions.space-bar
|
gnomeExtensions.space-bar
|
||||||
gnomeExtensions.systemd-manager
|
|
||||||
gnomeExtensions.tailscale-status
|
|
||||||
gnomeExtensions.tiling-assistant
|
gnomeExtensions.tiling-assistant
|
||||||
# gnomeExtensions.todotxt
|
gnomeExtensions.tiling-shell
|
||||||
|
gnomeExtensions.todotxt
|
||||||
gnomeExtensions.vitals
|
gnomeExtensions.vitals
|
||||||
# gnomeExtensions.window-is-ready-remover
|
gnomeExtensions.window-is-ready-remover
|
||||||
# gnomeExtensions.worksets
|
gnomeExtensions.worksets
|
||||||
# gnomeExtensions.workspace-matrix
|
gnomeExtensions.workspace-matrix
|
||||||
iotop
|
|
||||||
ripgrep
|
|
||||||
rsync
|
|
||||||
tcpdump
|
|
||||||
tokei
|
|
||||||
tree
|
|
||||||
wl-clipboard
|
|
||||||
];
|
];
|
||||||
|
|
||||||
home.services.gpg-agent.pinentryFlavor = "gnome3";
|
home.services.gpg-agent.pinentryPackage = pkgs.pinentry-gnome3;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
27
modules/desktop/hyprland.nix
Normal file
27
modules/desktop/hyprland.nix
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
{ config, lib, pkgs, ... }:
|
||||||
|
|
||||||
|
let cfg = config.modules.desktop.hyprland;
|
||||||
|
in {
|
||||||
|
options.modules.desktop.hyprland = {
|
||||||
|
enable = lib.mkOption {
|
||||||
|
default = false;
|
||||||
|
example = true;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
config = lib.mkIf cfg.enable {
|
||||||
|
programs.hyprland.enable = true;
|
||||||
|
|
||||||
|
networking.networkmanager.enable = true;
|
||||||
|
|
||||||
|
user.packages = with pkgs; [
|
||||||
|
mpv
|
||||||
|
];
|
||||||
|
|
||||||
|
environment.systemPackages = with pkgs; [
|
||||||
|
adw-gtk3
|
||||||
|
];
|
||||||
|
|
||||||
|
home.services.gpg-agent.pinentryPackage = pkgs.pinentry-gnome3;
|
||||||
|
};
|
||||||
|
}
|
37
modules/desktop/kde.nix
Normal file
37
modules/desktop/kde.nix
Normal file
@ -0,0 +1,37 @@
|
|||||||
|
{ config, lib, pkgs, ... }:
|
||||||
|
|
||||||
|
let cfg = config.modules.desktop.kde;
|
||||||
|
in {
|
||||||
|
options.modules.desktop.kde = {
|
||||||
|
enable = lib.mkOption {
|
||||||
|
default = false;
|
||||||
|
example = true;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
config = lib.mkIf cfg.enable {
|
||||||
|
services = {
|
||||||
|
xserver = {
|
||||||
|
enable = true;
|
||||||
|
};
|
||||||
|
desktopManager.plasma6.enable = true;
|
||||||
|
displayManager.sddm = {
|
||||||
|
enable = true;
|
||||||
|
wayland.enable = true;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
networking.networkmanager.enable = true;
|
||||||
|
|
||||||
|
user.packages = with pkgs; [
|
||||||
|
kmail
|
||||||
|
mpv
|
||||||
|
];
|
||||||
|
|
||||||
|
environment.systemPackages = with pkgs; [
|
||||||
|
adw-gtk3
|
||||||
|
];
|
||||||
|
|
||||||
|
home.services.gpg-agent.pinentryPackage = pkgs.pinentry-qt;
|
||||||
|
};
|
||||||
|
}
|
@ -1,6 +1,24 @@
|
|||||||
{ config, lib, pkgs, ... }:
|
{ config, lib, pkgs, ... }:
|
||||||
|
|
||||||
let cfg = config.modules.desktop.office.libreoffice;
|
let
|
||||||
|
cfg = config.modules.desktop.office.libreoffice;
|
||||||
|
# libreoffice-gtk4 = pkgs.libreoffice.override {
|
||||||
|
# extraMakeWrapperArgs = [
|
||||||
|
# "--set SAL_USE_VCLPLUGIN gtk4"
|
||||||
|
# ];
|
||||||
|
# unwrapped = pkgs.libreoffice-unwrapped.overrideAttrs (oldAttrs: {
|
||||||
|
# buildInputs = oldAttrs.buildInputs ++ [
|
||||||
|
# pkgs.gtk4
|
||||||
|
# ];
|
||||||
|
# configureFlags = oldAttrs.configureFlags ++ [
|
||||||
|
# "--disable-werror"
|
||||||
|
# "--enable-gtk4"
|
||||||
|
# ];
|
||||||
|
# passthru = oldAttrs.passthru // {
|
||||||
|
# inherit (pkgs) gtk4;
|
||||||
|
# };
|
||||||
|
# });
|
||||||
|
# };
|
||||||
in {
|
in {
|
||||||
options.modules.desktop.office.libreoffice = {
|
options.modules.desktop.office.libreoffice = {
|
||||||
enable = lib.mkOption {
|
enable = lib.mkOption {
|
||||||
@ -11,7 +29,10 @@ in {
|
|||||||
|
|
||||||
config = lib.mkIf cfg.enable {
|
config = lib.mkIf cfg.enable {
|
||||||
user.packages = with pkgs; [
|
user.packages = with pkgs; [
|
||||||
libreoffice
|
(if config.modules.desktop.kde.enable == true then libreoffice-qt else libreoffice)
|
||||||
|
hunspell
|
||||||
|
hunspellDicts.en-gb-large
|
||||||
|
hunspellDicts.en-us-large
|
||||||
];
|
];
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
@ -2,7 +2,6 @@
|
|||||||
|
|
||||||
let
|
let
|
||||||
cfg = config.modules.editors.neovim;
|
cfg = config.modules.editors.neovim;
|
||||||
dev = config.modules.dev;
|
|
||||||
in {
|
in {
|
||||||
options.modules.editors.neovim = {
|
options.modules.editors.neovim = {
|
||||||
enable = lib.mkOption {
|
enable = lib.mkOption {
|
||||||
@ -12,124 +11,129 @@ in {
|
|||||||
};
|
};
|
||||||
|
|
||||||
config = lib.mkIf cfg.enable {
|
config = lib.mkIf cfg.enable {
|
||||||
user.packages = with pkgs; [
|
home.programs.nixvim = {
|
||||||
(neovim.override {
|
enable = true;
|
||||||
configure = {
|
defaultEditor = true;
|
||||||
customRC = ''
|
|
||||||
luafile ~/.config/nvim/init.lua
|
viAlias = true;
|
||||||
'';
|
vimAlias = true;
|
||||||
packages.myPlugins = with pkgs.vimPlugins; {
|
|
||||||
start = [
|
options = {
|
||||||
(nvim-treesitter.withPlugins (
|
number = true;
|
||||||
plugins: with plugins; [
|
tabstop = 2;
|
||||||
bash
|
shiftwidth = 2;
|
||||||
c
|
expandtab = true;
|
||||||
cmake
|
foldlevel = 99;
|
||||||
cpp
|
splitbelow = true;
|
||||||
css
|
splitright = true;
|
||||||
dockerfile
|
undofile = true;
|
||||||
elm
|
updatetime = 100;
|
||||||
glsl
|
list = true;
|
||||||
graphql
|
};
|
||||||
haskell
|
|
||||||
http
|
globals = {
|
||||||
html
|
mapleader = ",";
|
||||||
java
|
maplocalleader = ",";
|
||||||
javascript
|
};
|
||||||
jsdoc
|
|
||||||
json
|
clipboard = {
|
||||||
json5
|
register = "unnamedplus";
|
||||||
latex
|
|
||||||
lua
|
providers.wl-copy.enable = true;
|
||||||
markdown
|
};
|
||||||
ninja
|
|
||||||
nix
|
plugins.comment.enable = true;
|
||||||
org
|
|
||||||
perl
|
plugins.hmts.enable = true;
|
||||||
php
|
|
||||||
pug
|
plugins.lightline.enable = true;
|
||||||
python
|
|
||||||
regex
|
plugins.luasnip.enable = true;
|
||||||
rst
|
|
||||||
ruby
|
plugins.lsp = {
|
||||||
rust
|
enable = true;
|
||||||
scala
|
servers = {
|
||||||
scss
|
bashls.enable = true;
|
||||||
toml
|
ccls.enable = true;
|
||||||
tsx
|
cssls.enable = true;
|
||||||
typescript
|
eslint.enable = true;
|
||||||
vim
|
gopls.enable = true;
|
||||||
yaml
|
html.enable = true;
|
||||||
zig
|
lua-ls.enable = true;
|
||||||
]
|
pylsp.enable = true;
|
||||||
))
|
nixd.enable = true;
|
||||||
nvim-treesitter-context
|
rust-analyzer = {
|
||||||
nvim-treesitter-textobjects
|
enable = true;
|
||||||
nvim-lspconfig
|
installCargo = true;
|
||||||
|
installRustc = true;
|
||||||
|
};
|
||||||
|
tsserver.enable = true;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
plugins.nvim-autopairs.enable = true;
|
||||||
|
|
||||||
|
plugins.cmp = {
|
||||||
|
enable = true;
|
||||||
|
autoEnableSources = true;
|
||||||
|
settings = {
|
||||||
|
sources = [
|
||||||
|
{ name = "nvim_lsp"; }
|
||||||
|
{ name = "path"; }
|
||||||
|
{ name = "buffer"; }
|
||||||
];
|
];
|
||||||
|
mapping = {
|
||||||
|
"<Tab>" = "cmp.mapping(cmp.mapping.select_next_item(), {'i', 's'})";
|
||||||
|
"<S-Tab>" = "cmp.mapping(cmp.mapping.select_prev_item(), {'i', 's'})";
|
||||||
|
"<CR>" = "cmp.mapping.confirm({ select = true })";
|
||||||
|
};
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
})
|
|
||||||
] ++
|
|
||||||
|
|
||||||
# Install appropriate language servers
|
plugins.telescope = {
|
||||||
(if dev.cc.enable then [
|
enable = true;
|
||||||
ccls # C/C++
|
keymaps = {
|
||||||
] else []) ++
|
"<leader>ff" = "find_files";
|
||||||
(if dev.java.enable then [
|
"<leader>fg" = "live_grep";
|
||||||
java-language-server # Java
|
"<leader>b" = "buffers";
|
||||||
ltex-ls # LaTeX
|
"<leader>fh" = "help_tags";
|
||||||
] else []) ++
|
"<C-p>" = "git_files";
|
||||||
(if dev.lua.enable then [
|
"<C-f>" = "live_grep";
|
||||||
sumneko-lua-language-server # Lua
|
};
|
||||||
] else []) ++
|
};
|
||||||
(if dev.node.enable then [
|
|
||||||
nodePackages.bash-language-server # Bash
|
|
||||||
nodePackages.dockerfile-language-server-nodejs # Dockerfile
|
|
||||||
nodePackages.graphql-language-service-cli # GraphQL
|
|
||||||
nodePackages.purescript-language-server # PureScript
|
|
||||||
nodePackages.svelte-language-server # Svelte
|
|
||||||
nodePackages.typescript-language-server # JavaScript/TypeScript
|
|
||||||
nodePackages.vim-language-server # Vim
|
|
||||||
nodePackages.vscode-langservers-extracted # HTML, CSS, JSON, ESLint
|
|
||||||
nodePackages.vue-language-server # Vue.js
|
|
||||||
nodePackages.yaml-language-server # YAML
|
|
||||||
] else []) ++
|
|
||||||
(if dev.python.enable then [
|
|
||||||
cmake-language-server # CMake
|
|
||||||
python310Packages.python-lsp-server # Python
|
|
||||||
] else []) ++
|
|
||||||
(if dev.rust.enable then [
|
|
||||||
rust-analyzer # Rust
|
|
||||||
] else []) ++
|
|
||||||
(if dev.scala.enable then [
|
|
||||||
metals # Scala
|
|
||||||
] else []) ++
|
|
||||||
(if dev.zig.enable then [
|
|
||||||
zls # Zig
|
|
||||||
] else []);
|
|
||||||
|
|
||||||
home.configFile = {
|
plugins.treesitter = {
|
||||||
"nvim/init.lua".source = ./init.lua;
|
enable = true;
|
||||||
"nvim/lua" = { source = ./lua; recursive = true; };
|
|
||||||
"nvim/lua/config/lsp.lua".text = ''
|
nixvimInjections = true;
|
||||||
-- This file is autogenerated, do not edit.
|
|
||||||
${if dev.cc.enable then "require('config.lsp.cc')\n" else ""}
|
folding = true;
|
||||||
${if dev.java.enable then "require('config.lsp.java')\n" else ""}
|
indent = true;
|
||||||
${if dev.lua.enable then "require('config.lsp.lua')\n" else ""}
|
};
|
||||||
${if dev.node.enable then "require('config.lsp.node')\n" else ""}
|
|
||||||
${if dev.python.enable then "require('config.lsp.python')\n" else ""}
|
plugins.treesitter-refactor = {
|
||||||
${if dev.rust.enable then "require('config.lsp.rust')\n" else ""}
|
enable = true;
|
||||||
${if dev.scala.enable then "require('config.lsp.scala')\n" else ""}
|
highlightDefinitions = {
|
||||||
${if dev.zig.enable then "require('config.lsp.zig')\n" else ""}
|
enable = true;
|
||||||
'';
|
clearOnCursorMove = false;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
plugins.undotree.enable = true;
|
||||||
|
|
||||||
|
# plugins.gitsigns.enable = true;
|
||||||
|
# plugins.gitgutter.enable = true;
|
||||||
|
# plugins.goyo.enable = true;
|
||||||
|
# plugins.fugitive.enable = true;
|
||||||
|
# plugins.fzf-lua.enable = true;
|
||||||
|
# plugins.neo-tree.enable = true;
|
||||||
|
# plugins.none-ls.enable = true;
|
||||||
|
# plugins.nvim-tree.enable = true;
|
||||||
|
# plugins.oil.enable = true;
|
||||||
|
# plugins.project-nvim.enable = true;
|
||||||
|
# plugins.surround.enable = true;
|
||||||
};
|
};
|
||||||
|
|
||||||
env.EDITOR = "nvim";
|
env.EDITOR = "nvim";
|
||||||
|
|
||||||
environment.shellAliases = {
|
|
||||||
vim = "nvim";
|
|
||||||
v = "nvim";
|
|
||||||
};
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
@ -1,6 +0,0 @@
|
|||||||
require("config.core")
|
|
||||||
require("config.keymap")
|
|
||||||
require("config.treesitter")
|
|
||||||
require("config.plugins")
|
|
||||||
require("config.lsp")
|
|
||||||
|
|
@ -1,36 +0,0 @@
|
|||||||
local o = vim.opt
|
|
||||||
local wo = vim.wo
|
|
||||||
local bo = vim.bo
|
|
||||||
|
|
||||||
-- Global dirs
|
|
||||||
local cachedir = os.getenv("XDG_CACHE_HOME")
|
|
||||||
o.backupdir = cachedir .. "/nvim/backup/"
|
|
||||||
o.directory = cachedir .. "/nvim/swap/"
|
|
||||||
o.undodir = cachedir .. "/nvim/undo/"
|
|
||||||
|
|
||||||
-- Global
|
|
||||||
o.breakindent = true
|
|
||||||
o.clipboard = "unnamedplus"
|
|
||||||
o.compatible = false
|
|
||||||
o.encoding = "utf-8"
|
|
||||||
o.expandtab = true
|
|
||||||
o.foldlevel = 99
|
|
||||||
o.hidden = true
|
|
||||||
o.hlsearch = false
|
|
||||||
o.ignorecase = true
|
|
||||||
o.laststatus = 2
|
|
||||||
o.listchars = { eol = '↲', tab = '▸ ', trail = '·' }
|
|
||||||
o.relativenumber = true
|
|
||||||
o.shiftwidth = 2
|
|
||||||
o.showmode = false
|
|
||||||
o.smartcase = true
|
|
||||||
o.smarttab = true
|
|
||||||
o.softtabstop = 2
|
|
||||||
o.synmaxcol = 150
|
|
||||||
o.tabstop = 4
|
|
||||||
o.undofile = true
|
|
||||||
o.wildmenu = true
|
|
||||||
|
|
||||||
-- Window
|
|
||||||
|
|
||||||
-- Buffer
|
|
@ -1,35 +0,0 @@
|
|||||||
local keymap = vim.keymap.set
|
|
||||||
local opts = { noremap = true, silent = true }
|
|
||||||
|
|
||||||
vim.g.mapleader = ","
|
|
||||||
|
|
||||||
-- Modes
|
|
||||||
-- Normal = "n",
|
|
||||||
-- Insert = "i",
|
|
||||||
-- Visual = "v",
|
|
||||||
-- Visual Block = "x",
|
|
||||||
-- Term = "t",
|
|
||||||
-- Command = "c"
|
|
||||||
|
|
||||||
keymap("n", "<Left>", "<Nop>", opts)
|
|
||||||
keymap("n", "<Right>", "<Nop>", opts)
|
|
||||||
keymap("n", "<Up>", "<Nop>", opts)
|
|
||||||
keymap("n", "<Down>", "<Nop>", opts)
|
|
||||||
|
|
||||||
keymap("n", "<C-h>", "<C-w>h", { noremap = true })
|
|
||||||
keymap("n", "<C-j>", "<C-w>j", { noremap = true })
|
|
||||||
keymap("n", "<C-k>", "<C-w>k", { noremap = true })
|
|
||||||
keymap("n", "<C-l>", "<C-w>l", { noremap = true })
|
|
||||||
|
|
||||||
keymap("n", "gV", "`[v`]", opts)
|
|
||||||
|
|
||||||
keymap("n", ";", ":", { noremap = true })
|
|
||||||
|
|
||||||
-- Bubble single lines with vim-unimpaired
|
|
||||||
keymap("n", "<C-Up>", "[e", opts)
|
|
||||||
keymap("n", "<C-Down>", "]e", opts)
|
|
||||||
|
|
||||||
-- Bubble multiple lines with vim-unimpaired
|
|
||||||
keymap("v", "<C-Up>", "[egv", opts)
|
|
||||||
keymap("v", "<C-Down>", "]egv", opts)
|
|
||||||
|
|
@ -1,5 +0,0 @@
|
|||||||
lspconfig = require('lspconfig')
|
|
||||||
|
|
||||||
-- Requires C/C++
|
|
||||||
lspconfig.ccls.setup{}
|
|
||||||
|
|
@ -1,6 +0,0 @@
|
|||||||
lspconfig = require('lspconfig')
|
|
||||||
|
|
||||||
-- Requires Java
|
|
||||||
lspconfig.java_language_server.setup{}
|
|
||||||
lspconfig.ltex.setup{}
|
|
||||||
|
|
@ -1,22 +0,0 @@
|
|||||||
lspconfig = require('lspconfig')
|
|
||||||
|
|
||||||
-- Requires Lua
|
|
||||||
lspconfig.sumneko_lua.setup {
|
|
||||||
settings = {
|
|
||||||
Lua = {
|
|
||||||
runtime = {
|
|
||||||
-- Tell the language server which version of Lua you're using (most likely LuaJIT in the case of Neovim)
|
|
||||||
version = 'LuaJIT',
|
|
||||||
},
|
|
||||||
diagnostics = {
|
|
||||||
-- Get the language server to recognize the `vim` global
|
|
||||||
globals = {'vim'},
|
|
||||||
},
|
|
||||||
-- Do not send telemetry data containing a randomized but unique identifier
|
|
||||||
telemetry = {
|
|
||||||
enable = false,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
@ -1,17 +0,0 @@
|
|||||||
lspconfig = require('lspconfig')
|
|
||||||
|
|
||||||
-- Requires Node.js
|
|
||||||
lspconfig.bashls.setup{}
|
|
||||||
lspconfig.cssls.setup{}
|
|
||||||
lspconfig.dockerls.setup{}
|
|
||||||
lspconfig.eslint.setup{}
|
|
||||||
lspconfig.graphql.setup{}
|
|
||||||
lspconfig.html.setup{}
|
|
||||||
lspconfig.jsonls.setup{}
|
|
||||||
lspconfig.purescriptls.setup{}
|
|
||||||
lspconfig.svelte.setup{}
|
|
||||||
lspconfig.tsserver.setup{}
|
|
||||||
lspconfig.vimls.setup{}
|
|
||||||
lspconfig.vuels.setup{}
|
|
||||||
lspconfig.yamlls.setup{}
|
|
||||||
|
|
@ -1,6 +0,0 @@
|
|||||||
lspconfig = require('lspconfig')
|
|
||||||
|
|
||||||
-- Requires Python
|
|
||||||
lspconfig.cmake.setup{}
|
|
||||||
lspconfig.pylsp.setup{}
|
|
||||||
|
|
@ -1,5 +0,0 @@
|
|||||||
lspconfig = require('lspconfig')
|
|
||||||
|
|
||||||
-- Requires Rust
|
|
||||||
lspconfig.rls.setup{}
|
|
||||||
|
|
@ -1,5 +0,0 @@
|
|||||||
lspconfig = require('lspconfig')
|
|
||||||
|
|
||||||
-- Requires Scala
|
|
||||||
lspconfig.metals.setup{}
|
|
||||||
|
|
@ -1,5 +0,0 @@
|
|||||||
lspconfig = require('lspconfig')
|
|
||||||
|
|
||||||
-- Requires Zig
|
|
||||||
lspconfig.zls.setup{}
|
|
||||||
|
|
@ -1,77 +0,0 @@
|
|||||||
local fn = vim.fn
|
|
||||||
|
|
||||||
local install_path = fn.stdpath "data" .. "/site/pack/packer/start/packer.nvim"
|
|
||||||
if fn.empty(fn.glob(install_path)) > 0 then
|
|
||||||
PACKER_BOOTSTRAP = fn.system {
|
|
||||||
"git",
|
|
||||||
"clone",
|
|
||||||
"--depth",
|
|
||||||
"1",
|
|
||||||
"https://github.com/wbthomason/packer.nvim",
|
|
||||||
install_path,
|
|
||||||
}
|
|
||||||
print "Installing packer close and reopen Neovim..."
|
|
||||||
vim.cmd [[packadd packer.nvim]]
|
|
||||||
end
|
|
||||||
|
|
||||||
vim.cmd [[
|
|
||||||
augroup packer_user_config
|
|
||||||
autocmd!
|
|
||||||
autocmd BufWritePost plugins.lua source <afile> | PackerSync
|
|
||||||
augroup end
|
|
||||||
]]
|
|
||||||
|
|
||||||
local status_ok, packer = pcall(require, "packer")
|
|
||||||
if not status_ok then
|
|
||||||
return
|
|
||||||
end
|
|
||||||
|
|
||||||
packer.init {
|
|
||||||
display = {
|
|
||||||
open_fn = function()
|
|
||||||
return require("packer.util").float { border = "rounded" }
|
|
||||||
end,
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
return packer.startup(function(use)
|
|
||||||
-- Utilities
|
|
||||||
use { "wbthomason/packer.nvim", opt = true }
|
|
||||||
use { "mbbill/undotree" }
|
|
||||||
use { "nvim-lua/plenary.nvim" }
|
|
||||||
use { "tpope/vim-fugitive", event = "User InGitRepo" }
|
|
||||||
|
|
||||||
-- Editing
|
|
||||||
use { "andymass/vim-matchup" }
|
|
||||||
use { "godlygeek/tabular" }
|
|
||||||
use { "JoosepAlviste/nvim-ts-context-commentstring" }
|
|
||||||
use { "kana/vim-textobj-user" }
|
|
||||||
use { "mg979/vim-visual-multi", branch = "master" }
|
|
||||||
use { "p00f/nvim-ts-rainbow" }
|
|
||||||
use { "terryma/vim-expand-region" }
|
|
||||||
use { "tommcdo/vim-exchange", event = "VimEnter" }
|
|
||||||
use { "tpope/vim-abolish" }
|
|
||||||
use { "tpope/vim-commentary", event = "VimEnter" }
|
|
||||||
use { "tpope/vim-repeat", event = "VimEnter" }
|
|
||||||
use { "tpope/vim-surround", event = "VimEnter" }
|
|
||||||
use { "windwp/nvim-autopairs" }
|
|
||||||
use { "windwp/nvim-ts-autotag" }
|
|
||||||
|
|
||||||
-- UI
|
|
||||||
use { "junegunn/goyo.vim" }
|
|
||||||
use { "junegunn/limelight.vim" }
|
|
||||||
use { "markonm/traces.vim" }
|
|
||||||
|
|
||||||
-- Searching
|
|
||||||
use { "nvim-telescope/telescope.nvim", config = [[require('config.telescope')]] }
|
|
||||||
use { "cljoly/telescope-repo.nvim", requires = "telescope.nvim" }
|
|
||||||
use { "dyng/ctrlsf.vim" }
|
|
||||||
|
|
||||||
-- LSP
|
|
||||||
use { "jose-elias-alvarez/null-ls.nvim" }
|
|
||||||
|
|
||||||
if PACKER_BOOTSTRAP then
|
|
||||||
require("packer").sync()
|
|
||||||
end
|
|
||||||
end)
|
|
||||||
|
|
@ -1,46 +0,0 @@
|
|||||||
local status_ok, telescope = pcall(require, "telescope")
|
|
||||||
if not status_ok then
|
|
||||||
return
|
|
||||||
end
|
|
||||||
|
|
||||||
local actions = require("telescope.actions")
|
|
||||||
|
|
||||||
telescope.setup({
|
|
||||||
defaults = {
|
|
||||||
file_ignore_patterns = { ".git/", "node_modules" },
|
|
||||||
},
|
|
||||||
mappings = {
|
|
||||||
i = {
|
|
||||||
["<Down>"] = actions.cycle_history_next,
|
|
||||||
["<Up>"] = actions.cycle_history_prev,
|
|
||||||
["<C-j>"] = actions.move_selection_next,
|
|
||||||
["<C-k>"] = actions.move_selection_previous,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
extensions = {
|
|
||||||
repo = {
|
|
||||||
list = {
|
|
||||||
fd_opts = {
|
|
||||||
"--no-ignore-vcs",
|
|
||||||
},
|
|
||||||
search_dirs = {
|
|
||||||
"~/projects",
|
|
||||||
"~/repos",
|
|
||||||
"~/workspace",
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
})
|
|
||||||
|
|
||||||
telescope.load_extension("repo")
|
|
||||||
|
|
||||||
local keymap = vim.keymap.set
|
|
||||||
local opts = { noremap = true, silent = true }
|
|
||||||
|
|
||||||
keymap("n", "<Leader>ff", "<cmd>Telescope find_files<cr>", opts)
|
|
||||||
keymap("n", "<Leader>fg", "<cmd>Telescope live_grep<cr>", opts)
|
|
||||||
keymap("n", "<Leader>fb", "<cmd>Telescope buffers<cr>", opts)
|
|
||||||
keymap("n", "<Leader>fh", "<cmd>Telescope help_tags<cr>", opts)
|
|
||||||
keymap("n", "<Leader>fr", "<cmd>Telescope repo list<cr>", opts)
|
|
||||||
|
|
@ -1,35 +0,0 @@
|
|||||||
require("nvim-treesitter.configs").setup({
|
|
||||||
ignore_install = {},
|
|
||||||
highlight = {
|
|
||||||
enable = true,
|
|
||||||
disable = {},
|
|
||||||
},
|
|
||||||
indent = { enable = true },
|
|
||||||
incremental_selection = {
|
|
||||||
enable = true,
|
|
||||||
keymaps = {
|
|
||||||
init_selection = "gnn",
|
|
||||||
node_incremental = "grn",
|
|
||||||
scope_incremental = "grc",
|
|
||||||
node_decremental = "grm",
|
|
||||||
},
|
|
||||||
},
|
|
||||||
-- Extensions
|
|
||||||
autotag = { enable = true },
|
|
||||||
context_commentstring = { enable = true },
|
|
||||||
matchup = { enable = true },
|
|
||||||
rainbow = { enable = true },
|
|
||||||
textobjects = {
|
|
||||||
select = {
|
|
||||||
enable = true,
|
|
||||||
keymaps = {
|
|
||||||
["af"] = "@function.outer",
|
|
||||||
["if"] = "@function.inner",
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
})
|
|
||||||
|
|
||||||
vim.opt.foldmethod = "expr"
|
|
||||||
vim.opt.foldexpr = "nvim_treesitter#foldexpr()"
|
|
||||||
|
|
88
modules/hardware/presonus-studio.nix
Normal file
88
modules/hardware/presonus-studio.nix
Normal file
@ -0,0 +1,88 @@
|
|||||||
|
{ config, lib, pkgs, ... }:
|
||||||
|
let
|
||||||
|
cfg = config.modules.hardware.presonus-studio;
|
||||||
|
snd-usb-audio-module = pkgs.callPackage ./snd-usb-audio.nix {
|
||||||
|
kernel = config.boot.kernelPackages.kernel;
|
||||||
|
};
|
||||||
|
patched = snd-usb-audio-module.overrideAttrs (prev: {
|
||||||
|
patches = [ ./0001-Update-device-ID-for-PreSonus-1824c.patch ];
|
||||||
|
});
|
||||||
|
upmixConfig = {
|
||||||
|
"stream.properties" = {
|
||||||
|
"channelmix.upmix" = true;
|
||||||
|
"channelmix.upmix-method" = "psd";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
in {
|
||||||
|
options.modules.hardware.presonus-studio = {
|
||||||
|
enable = lib.mkOption {
|
||||||
|
default = false;
|
||||||
|
example = true;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
config = lib.mkIf cfg.enable {
|
||||||
|
boot.kernelModules = [ "snd-usb-audio" ];
|
||||||
|
boot.extraModulePackages = [
|
||||||
|
(patched)
|
||||||
|
];
|
||||||
|
|
||||||
|
# Workaround for mainline module loading instead of patched module
|
||||||
|
systemd.services.reload-snd-usb-audio = {
|
||||||
|
description = "Reload snd_usb_audio kernel module";
|
||||||
|
wantedBy = [ "sound.target" ];
|
||||||
|
serviceConfig.Type = "oneshot";
|
||||||
|
path = with pkgs; [
|
||||||
|
kmod
|
||||||
|
];
|
||||||
|
script = ''
|
||||||
|
# Only reload if device hasn't been initialised
|
||||||
|
if ! cat /proc/asound/card*/usbmixer | grep -q "Mute Main Out Switch"; then
|
||||||
|
rmmod snd_usb_audio
|
||||||
|
insmod /run/booted-system/kernel-modules/lib/modules/$(uname -r)/extra/snd-usb-audio.ko.xz
|
||||||
|
fi
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
|
||||||
|
services.pipewire.extraConfig = {
|
||||||
|
pipewire = {
|
||||||
|
"10-network" = {
|
||||||
|
"context.modules" = [
|
||||||
|
{
|
||||||
|
"name" = "libpipewire-module-rtp-session";
|
||||||
|
"args" = {
|
||||||
|
"stream.props" = {
|
||||||
|
"node.name" = "rtp-source";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
||||||
|
];
|
||||||
|
};
|
||||||
|
"surround" = {
|
||||||
|
"context.modules" = [
|
||||||
|
{
|
||||||
|
"name" = "libpipewire-module-loopback";
|
||||||
|
"args" = {
|
||||||
|
"node.description" = "Genelec 4.1 Surround";
|
||||||
|
"capture.props" = {
|
||||||
|
"node.name" = "Genelec_Speakers";
|
||||||
|
"media.class" = "Audio/Sink";
|
||||||
|
"audio.position" = [ "FL" "FR" "SL" "SR" "LFE" ];
|
||||||
|
};
|
||||||
|
"playback.props" = {
|
||||||
|
"node.name" = "playback.Genelec_Speakers";
|
||||||
|
"audio.position" = [ "AUX0" "AUX1" "AUX3" "AUX4" "AUX5" ];
|
||||||
|
"target.object" = "alsa_output.usb-PreSonus_Studio_1824c_SC4E21110775-00.multichannel-output";
|
||||||
|
"stream.dont-remix" = true;
|
||||||
|
"node.passive" = true;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
||||||
|
];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
pipewire-pulse."40-upmix" = upmixConfig;
|
||||||
|
client-rt."40-upmix" = upmixConfig;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
70
modules/networking/netbird.nix
Normal file
70
modules/networking/netbird.nix
Normal file
@ -0,0 +1,70 @@
|
|||||||
|
{ config, lib, self, ... }:
|
||||||
|
|
||||||
|
let
|
||||||
|
cfg = config.modules.networking.netbird;
|
||||||
|
hostname = config.networking.hostName;
|
||||||
|
in {
|
||||||
|
options.modules.networking.netbird = {
|
||||||
|
enable = lib.mkEnableOption "netbird";
|
||||||
|
coordinatorDomain = lib.mkOption {
|
||||||
|
type = lib.types.str;
|
||||||
|
default = "netbird.vimium.net";
|
||||||
|
};
|
||||||
|
meshDomain = lib.mkOption {
|
||||||
|
type = lib.types.str;
|
||||||
|
default = "mesh.vimium.net";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
config = lib.mkIf cfg.enable {
|
||||||
|
age.secrets."passwords/services/netbird/data-store-encryption-key" = {
|
||||||
|
file = "${self.inputs.secrets}/passwords/services/netbird/data-store-encryption-key.age";
|
||||||
|
};
|
||||||
|
|
||||||
|
services.netbird = {
|
||||||
|
enable = true;
|
||||||
|
};
|
||||||
|
|
||||||
|
services.netbird.server = {
|
||||||
|
domain = cfg.coordinatorDomain;
|
||||||
|
enable = true;
|
||||||
|
enableNginx = true;
|
||||||
|
dashboard.settings = {
|
||||||
|
AUTH_AUTHORITY = "https://auth.vimium.com/oauth2/openid/netbird";
|
||||||
|
};
|
||||||
|
management = rec {
|
||||||
|
disableAnonymousMetrics = true;
|
||||||
|
dnsDomain = cfg.meshDomain;
|
||||||
|
oidcConfigEndpoint = "https://auth.vimium.com/oauth2/openid/netbird/.well-known/openid-configuration";
|
||||||
|
settings = {
|
||||||
|
DataStoreEncryptionKey = {
|
||||||
|
_secret = config.age.secrets."passwords/services/netbird/data-store-encryption-key".path;
|
||||||
|
};
|
||||||
|
HttpConfig = {
|
||||||
|
AuthAudience = "netbird";
|
||||||
|
};
|
||||||
|
StoreConfig = { Engine = "sqlite"; };
|
||||||
|
TURNConfig = {
|
||||||
|
Secret._secret = config.age.secrets."passwords/services/coturn/static-auth-secret".path;
|
||||||
|
TimeBasedCredentials = true;
|
||||||
|
};
|
||||||
|
PKCEAuthorizationFlow.ProviderConfig = {
|
||||||
|
AuthorizationEndpoint = "https://auth.vimium.com/ui/oauth2";
|
||||||
|
TokenEndpoint = "https://auth.vimium.com/oauth2/token";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
singleAccountModeDomain = dnsDomain;
|
||||||
|
turnDomain = config.services.coturn.realm;
|
||||||
|
turnPort = config.services.coturn.listening-port;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
systemd.services.netbird-signal.serviceConfig.RestartSec = "60";
|
||||||
|
systemd.services.netbird-management.serviceConfig.RestartSec = "60";
|
||||||
|
|
||||||
|
services.nginx.virtualHosts."netbird.vimium.net" = {
|
||||||
|
enableACME = true;
|
||||||
|
forceSSL = true;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
@ -1,6 +1,9 @@
|
|||||||
{ config, lib, pkgs, ... }:
|
{ config, lib, pkgs, self, ... }:
|
||||||
|
|
||||||
let cfg = config.modules.networking.tailscale;
|
let
|
||||||
|
cfg = config.modules.networking.tailscale;
|
||||||
|
headscale = "https://headscale.vimium.net";
|
||||||
|
hostname = config.networking.hostName;
|
||||||
in {
|
in {
|
||||||
options.modules.networking.tailscale = {
|
options.modules.networking.tailscale = {
|
||||||
enable = lib.mkOption {
|
enable = lib.mkOption {
|
||||||
@ -14,8 +17,24 @@ in {
|
|||||||
};
|
};
|
||||||
|
|
||||||
config = lib.mkIf cfg.enable {
|
config = lib.mkIf cfg.enable {
|
||||||
services.tailscale.enable = true;
|
age.secrets."passwords/services/tailscale/${hostname}-authkey" = {
|
||||||
|
file = "${self.inputs.secrets}/passwords/services/tailscale/${hostname}-authkey.age";
|
||||||
|
};
|
||||||
|
|
||||||
|
environment.systemPackages = [ pkgs.tailscale ];
|
||||||
|
|
||||||
|
services.tailscale = {
|
||||||
|
enable = true;
|
||||||
|
authKeyFile = config.age.secrets."passwords/services/tailscale/${hostname}-authkey".path;
|
||||||
|
|
||||||
|
extraUpFlags = [
|
||||||
|
"--login-server"
|
||||||
|
headscale
|
||||||
|
];
|
||||||
|
};
|
||||||
|
|
||||||
services.openssh.openFirewall = !cfg.restrictSSH;
|
services.openssh.openFirewall = !cfg.restrictSSH;
|
||||||
|
|
||||||
networking.firewall = {
|
networking.firewall = {
|
||||||
checkReversePath = "loose";
|
checkReversePath = "loose";
|
||||||
trustedInterfaces = [ "tailscale0" ];
|
trustedInterfaces = [ "tailscale0" ];
|
||||||
|
60
modules/networking/wireless.nix
Normal file
60
modules/networking/wireless.nix
Normal file
@ -0,0 +1,60 @@
|
|||||||
|
{ config, lib, pkgs, self, ... }:
|
||||||
|
|
||||||
|
with lib;
|
||||||
|
|
||||||
|
let cfg = config.modules.networking.wireless;
|
||||||
|
in {
|
||||||
|
options.modules.networking.wireless = {
|
||||||
|
enable = mkOption {
|
||||||
|
default = false;
|
||||||
|
example = true;
|
||||||
|
description = mdDoc "Automatically connect to known networks";
|
||||||
|
};
|
||||||
|
interfaces = mkOption {
|
||||||
|
default = [ ]; # All interfaces
|
||||||
|
example = [ "wlan0" ];
|
||||||
|
description = mdDoc "Interfaces for `wpa_supplicant` to bind to";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
config = mkIf cfg.enable {
|
||||||
|
age.secrets."passwords/networks" = {
|
||||||
|
file = "${self.inputs.secrets}/passwords/networks.age";
|
||||||
|
};
|
||||||
|
|
||||||
|
networking = {
|
||||||
|
wireless = {
|
||||||
|
enable = true;
|
||||||
|
interfaces = cfg.interfaces;
|
||||||
|
environmentFile = config.age.secrets."passwords/networks".path;
|
||||||
|
networks = {
|
||||||
|
"Apollo 600 Mbps".psk = "@PSK_APOLLO@";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
networkmanager.ensureProfiles.profiles = {
|
||||||
|
"Apollo" = {
|
||||||
|
connection = {
|
||||||
|
id = "Apollo 600 Mbps";
|
||||||
|
type = "wifi";
|
||||||
|
};
|
||||||
|
wifi = {
|
||||||
|
mode = "infrastructure";
|
||||||
|
ssid = "Apollo 600 Mbps";
|
||||||
|
};
|
||||||
|
wifi-security = {
|
||||||
|
auth-alg = "open";
|
||||||
|
key-mgmt = "wpa-psk";
|
||||||
|
psk = "";
|
||||||
|
};
|
||||||
|
ipv4 = {
|
||||||
|
method = "auto";
|
||||||
|
};
|
||||||
|
ipv6 = {
|
||||||
|
addr-gen-mode = "stable-privacy";
|
||||||
|
method = "auto";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
@ -1,4 +1,4 @@
|
|||||||
{ config, options, lib, home-manager, ... }:
|
{ config, options, lib, self, ... }:
|
||||||
|
|
||||||
with lib;
|
with lib;
|
||||||
{
|
{
|
||||||
@ -29,6 +29,7 @@ with lib;
|
|||||||
};
|
};
|
||||||
|
|
||||||
config = {
|
config = {
|
||||||
|
age.secrets."passwords/users/jordan".file = "${self.inputs.secrets}/passwords/users/jordan.age";
|
||||||
user =
|
user =
|
||||||
let user = builtins.getEnv "USER";
|
let user = builtins.getEnv "USER";
|
||||||
name = if elem user [ "" "root" ] then "jordan" else user;
|
name = if elem user [ "" "root" ] then "jordan" else user;
|
||||||
@ -41,6 +42,7 @@ with lib;
|
|||||||
openssh.authorizedKeys.keys = [
|
openssh.authorizedKeys.keys = [
|
||||||
"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAILVHTjsyMIV4THNw6yz0OxAxGnC+41gX72UrPqTzR+OS jordan@vimium.com"
|
"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAILVHTjsyMIV4THNw6yz0OxAxGnC+41gX72UrPqTzR+OS jordan@vimium.com"
|
||||||
];
|
];
|
||||||
|
hashedPasswordFile = config.age.secrets."passwords/users/jordan".path;
|
||||||
home = "/home/${name}";
|
home = "/home/${name}";
|
||||||
group = "users";
|
group = "users";
|
||||||
uid = 1000;
|
uid = 1000;
|
||||||
@ -64,6 +66,11 @@ with lib;
|
|||||||
};
|
};
|
||||||
dconf.settings = mkAliasDefinitions options.dconf.settings;
|
dconf.settings = mkAliasDefinitions options.dconf.settings;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
sharedModules = [
|
||||||
|
self.inputs.nixvim.homeManagerModules.nixvim
|
||||||
|
self.inputs.plasma-manager.homeManagerModules.plasma-manager
|
||||||
|
];
|
||||||
};
|
};
|
||||||
|
|
||||||
users.users.${config.user.name} = mkAliasDefinitions options.user;
|
users.users.${config.user.name} = mkAliasDefinitions options.user;
|
||||||
|
45
modules/podman.nix
Normal file
45
modules/podman.nix
Normal file
@ -0,0 +1,45 @@
|
|||||||
|
{ pkgs, lib, config, ... }:
|
||||||
|
|
||||||
|
with lib;
|
||||||
|
|
||||||
|
let
|
||||||
|
cfg = config.modules.podman;
|
||||||
|
in {
|
||||||
|
options.modules.podman = {
|
||||||
|
enable = mkOption {
|
||||||
|
default = false;
|
||||||
|
example = true;
|
||||||
|
description = mdDoc "Enable podman on this host";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
config = mkIf cfg.enable {
|
||||||
|
virtualisation = {
|
||||||
|
docker.enable = false;
|
||||||
|
|
||||||
|
podman = {
|
||||||
|
enable = true;
|
||||||
|
defaultNetwork.settings.dns_enabled = true;
|
||||||
|
autoPrune = {
|
||||||
|
enable = true;
|
||||||
|
dates = "weekly";
|
||||||
|
flags = [ "--all" ];
|
||||||
|
};
|
||||||
|
extraPackages = [ pkgs.zfs ];
|
||||||
|
};
|
||||||
|
|
||||||
|
containers.storage.settings.storage = {
|
||||||
|
driver = "zfs";
|
||||||
|
graphroot = "/var/lib/containers/storage";
|
||||||
|
runroot = "/run/containers/storage";
|
||||||
|
};
|
||||||
|
|
||||||
|
oci-containers.backend = "podman";
|
||||||
|
};
|
||||||
|
|
||||||
|
networking.firewall.interfaces."podman+" = {
|
||||||
|
allowedUDPPorts = [ 53 ];
|
||||||
|
allowedTCPPorts = [ 53 ];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
61
modules/services/borgmatic/default.nix
Normal file
61
modules/services/borgmatic/default.nix
Normal file
@ -0,0 +1,61 @@
|
|||||||
|
{ config, lib, self, ... }:
|
||||||
|
|
||||||
|
let
|
||||||
|
cfg = config.modules.services.borgmatic;
|
||||||
|
hostname = config.networking.hostName;
|
||||||
|
in {
|
||||||
|
options.modules.services.borgmatic = {
|
||||||
|
enable = lib.mkOption {
|
||||||
|
default = false;
|
||||||
|
example = true;
|
||||||
|
description = lib.mdDoc "Enable backups on this host with `borgmatic`";
|
||||||
|
};
|
||||||
|
directories = lib.mkOption {
|
||||||
|
type = lib.types.listOf lib.types.str;
|
||||||
|
default = [];
|
||||||
|
example = [
|
||||||
|
"/home/jordan/Documents"
|
||||||
|
];
|
||||||
|
description = lib.mdDoc "List of directories to backup";
|
||||||
|
};
|
||||||
|
repoPath = lib.mkOption {
|
||||||
|
type = lib.types.str;
|
||||||
|
example = "ssh://example@example.repo.borgbase.com/./repo";
|
||||||
|
description = lib.mdDoc "Destination borg repository for backup";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
config = lib.mkIf cfg.enable {
|
||||||
|
age.secrets."passwords/services/borg/${hostname}-passphrase" = {
|
||||||
|
file = "${self.inputs.secrets}/passwords/services/borg/${hostname}-passphrase.age";
|
||||||
|
};
|
||||||
|
|
||||||
|
services.borgmatic = {
|
||||||
|
enable = true;
|
||||||
|
settings = {
|
||||||
|
source_directories = cfg.directories;
|
||||||
|
repositories = [
|
||||||
|
{ label = "borgbase"; path = cfg.repoPath; }
|
||||||
|
];
|
||||||
|
encryption_passcommand = "cat ${config.age.secrets."passwords/services/borg/${hostname}-passphrase".path}";
|
||||||
|
ssh_command = "ssh -i /etc/ssh/ssh_host_ed25519_key";
|
||||||
|
keep_daily = 7;
|
||||||
|
keep_weekly = 4;
|
||||||
|
keep_monthly = 6;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
services.postgresql.ensureUsers = [
|
||||||
|
{
|
||||||
|
name = "root";
|
||||||
|
ensureClauses.superuser = true;
|
||||||
|
}
|
||||||
|
];
|
||||||
|
|
||||||
|
# Add `pg_dumpall` to unit environment
|
||||||
|
systemd.services.borgmatic.path = [ config.services.postgresql.package ];
|
||||||
|
|
||||||
|
# Without this override, `cat` is unavailable for `encryption_passcommand`
|
||||||
|
systemd.services.borgmatic.confinement.fullUnit = true;
|
||||||
|
};
|
||||||
|
}
|
41
modules/services/chrony/default.nix
Normal file
41
modules/services/chrony/default.nix
Normal file
@ -0,0 +1,41 @@
|
|||||||
|
{ config, lib, pkgs, ... }:
|
||||||
|
|
||||||
|
with lib;
|
||||||
|
|
||||||
|
let
|
||||||
|
cfg = config.modules.services.chrony;
|
||||||
|
in {
|
||||||
|
options.modules.services.chrony = {
|
||||||
|
enable = mkOption {
|
||||||
|
default = false;
|
||||||
|
example = true;
|
||||||
|
description = "Enable chrony NTP deamon";
|
||||||
|
};
|
||||||
|
|
||||||
|
config = mkIf cfg.enable {
|
||||||
|
services.chrony = {
|
||||||
|
enable = true;
|
||||||
|
|
||||||
|
servers = [
|
||||||
|
"uk.pool.ntp.org"
|
||||||
|
"time.cloudflare.com"
|
||||||
|
];
|
||||||
|
|
||||||
|
extraConfig = ''
|
||||||
|
makestep 1.0 3
|
||||||
|
|
||||||
|
bindaddress 0.0.0.0
|
||||||
|
port 123
|
||||||
|
allow
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
|
||||||
|
services.timesyncd.enable = mkForce false;
|
||||||
|
|
||||||
|
networking.firewall = {
|
||||||
|
allowedUDPPorts = [ 123 ];
|
||||||
|
allowedTCPPorts = [ 123 ];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
118
modules/services/coturn/default.nix
Normal file
118
modules/services/coturn/default.nix
Normal file
@ -0,0 +1,118 @@
|
|||||||
|
{ config, lib, self, ... }:
|
||||||
|
|
||||||
|
let
|
||||||
|
cfg = config.modules.services.coturn;
|
||||||
|
in {
|
||||||
|
options.modules.services.coturn = {
|
||||||
|
enable = lib.mkOption {
|
||||||
|
default = false;
|
||||||
|
example = true;
|
||||||
|
};
|
||||||
|
realm = lib.mkOption {
|
||||||
|
type = lib.types.str;
|
||||||
|
description = "The realm to be used by the TURN server.";
|
||||||
|
example = "turn.vimium.com";
|
||||||
|
};
|
||||||
|
matrixIntegration = lib.mkOption {
|
||||||
|
default = false;
|
||||||
|
description = "Configure the matrix-synapse module to use this TURN server.";
|
||||||
|
example = true;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
config = lib.mkIf cfg.enable {
|
||||||
|
networking.firewall = let
|
||||||
|
range = with config.services.coturn; lib.singleton {
|
||||||
|
from = min-port;
|
||||||
|
to = max-port;
|
||||||
|
};
|
||||||
|
in {
|
||||||
|
allowedTCPPorts = [
|
||||||
|
3478 # TURN listener
|
||||||
|
5349 # STUN TLS
|
||||||
|
5350 # STUN TLS alt
|
||||||
|
];
|
||||||
|
allowedUDPPorts = [
|
||||||
|
3478 # TURN listener
|
||||||
|
5349 # TLS
|
||||||
|
5350 # TLS alt
|
||||||
|
];
|
||||||
|
allowedUDPPortRanges = range; # TURN peer relays
|
||||||
|
};
|
||||||
|
|
||||||
|
security.acme.certs = {
|
||||||
|
"${config.services.coturn.realm}" = {
|
||||||
|
group = "turnserver";
|
||||||
|
reloadServices = [ "coturn" ];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
age.secrets = {
|
||||||
|
"passwords/services/coturn/static-auth-secret" = {
|
||||||
|
file = "${self.inputs.secrets}/passwords/services/coturn/static-auth-secret.age";
|
||||||
|
owner = "turnserver";
|
||||||
|
group = "turnserver";
|
||||||
|
};
|
||||||
|
} // (if cfg.matrixIntegration then {
|
||||||
|
"passwords/services/coturn/matrix-turn-config.yml" = {
|
||||||
|
file = "${self.inputs.secrets}/passwords/services/coturn/matrix-turn-config.yml.age";
|
||||||
|
owner = "matrix-synapse";
|
||||||
|
group = "matrix-synapse";
|
||||||
|
};
|
||||||
|
} else {});
|
||||||
|
|
||||||
|
services.coturn = rec {
|
||||||
|
enable = true;
|
||||||
|
realm = cfg.realm;
|
||||||
|
use-auth-secret = true;
|
||||||
|
static-auth-secret-file = config.age.secrets."passwords/services/coturn/static-auth-secret".path;
|
||||||
|
cert = "${config.security.acme.certs.${realm}.directory}/full.pem";
|
||||||
|
pkey = "${config.security.acme.certs.${realm}.directory}/key.pem";
|
||||||
|
min-port = 49000;
|
||||||
|
max-port = 50000;
|
||||||
|
no-cli = true;
|
||||||
|
no-tcp-relay = true;
|
||||||
|
extraConfig = ''
|
||||||
|
cipher-list="HIGH"
|
||||||
|
no-multicast-peers
|
||||||
|
|
||||||
|
# Ban private CIDR blocks
|
||||||
|
denied-peer-ip=0.0.0.0-0.255.255.255
|
||||||
|
denied-peer-ip=10.0.0.0-10.255.255.255
|
||||||
|
denied-peer-ip=100.64.0.0-100.127.255.255
|
||||||
|
denied-peer-ip=127.0.0.0-127.255.255.255
|
||||||
|
denied-peer-ip=169.254.0.0-169.254.255.255
|
||||||
|
denied-peer-ip=172.16.0.0-172.31.255.255
|
||||||
|
denied-peer-ip=192.0.0.0-192.0.0.255
|
||||||
|
denied-peer-ip=192.0.2.0-192.0.2.255
|
||||||
|
denied-peer-ip=192.88.99.0-192.88.99.255
|
||||||
|
denied-peer-ip=192.168.0.0-192.168.255.255
|
||||||
|
denied-peer-ip=198.18.0.0-198.19.255.255
|
||||||
|
denied-peer-ip=198.51.100.0-198.51.100.255
|
||||||
|
denied-peer-ip=203.0.113.0-203.0.113.255
|
||||||
|
denied-peer-ip=240.0.0.0-255.255.255.255
|
||||||
|
denied-peer-ip=::1
|
||||||
|
denied-peer-ip=64:ff9b::-64:ff9b::ffff:ffff
|
||||||
|
denied-peer-ip=::ffff:0.0.0.0-::ffff:255.255.255.255
|
||||||
|
denied-peer-ip=100::-100::ffff:ffff:ffff:ffff
|
||||||
|
denied-peer-ip=2001::-2001:1ff:ffff:ffff:ffff:ffff:ffff:ffff
|
||||||
|
denied-peer-ip=2002::-2002:ffff:ffff:ffff:ffff:ffff:ffff:ffff
|
||||||
|
denied-peer-ip=fc00::-fdff:ffff:ffff:ffff:ffff:ffff:ffff:ffff
|
||||||
|
denied-peer-ip=fe80::-febf:ffff:ffff:ffff:ffff:ffff:ffff:ffff
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
|
||||||
|
services.matrix-synapse = lib.mkIf cfg.matrixIntegration {
|
||||||
|
settings = with config.services.coturn; {
|
||||||
|
turn_uris = [
|
||||||
|
"turn:${realm}:3478?transport=udp"
|
||||||
|
"turn:${realm}:3478?transport=tcp"
|
||||||
|
];
|
||||||
|
turn_user_lifetime = "1h";
|
||||||
|
};
|
||||||
|
extraConfigFiles = [
|
||||||
|
config.age.secrets."passwords/services/coturn/matrix-turn-config.yml".path
|
||||||
|
];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
226
modules/services/gitea-runner/default.nix
Normal file
226
modules/services/gitea-runner/default.nix
Normal file
@ -0,0 +1,226 @@
|
|||||||
|
{ pkgs, config, lib, self, ... }:
|
||||||
|
|
||||||
|
# Based on: https://git.clan.lol/clan/clan-infra/src/branch/main/modules/web01/gitea/actions-runner.nix
|
||||||
|
|
||||||
|
with lib;
|
||||||
|
|
||||||
|
let
|
||||||
|
cfg = config.modules.services.gitea-runner;
|
||||||
|
hostname = config.networking.hostName;
|
||||||
|
giteaUrl = "https://git.vimium.com";
|
||||||
|
|
||||||
|
storeDepsBins = with pkgs; [
|
||||||
|
coreutils
|
||||||
|
findutils
|
||||||
|
gnugrep
|
||||||
|
gawk
|
||||||
|
git
|
||||||
|
nix
|
||||||
|
nix-update
|
||||||
|
bash
|
||||||
|
jq
|
||||||
|
nodejs
|
||||||
|
];
|
||||||
|
|
||||||
|
storeDeps = pkgs.runCommand "store-deps" { } ''
|
||||||
|
mkdir -p $out/bin
|
||||||
|
for dir in ${toString storeDepsBins}; do
|
||||||
|
for bin in "$dir"/bin/*; do
|
||||||
|
ln -s "$bin" "$out/bin/$(basename "$bin")"
|
||||||
|
done
|
||||||
|
done
|
||||||
|
|
||||||
|
# Add SSL CA certs
|
||||||
|
mkdir -p $out/etc/ssl/certs
|
||||||
|
cp -a "${pkgs.cacert}/etc/ssl/certs/ca-bundle.crt" $out/etc/ssl/certs/ca-bundle.crt
|
||||||
|
'';
|
||||||
|
in
|
||||||
|
{
|
||||||
|
options.modules.services.gitea-runner = {
|
||||||
|
enable = mkOption {
|
||||||
|
default = false;
|
||||||
|
example = true;
|
||||||
|
description = mdDoc "Enable a runner for Gitea Actions on this host";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
config = mkIf cfg.enable {
|
||||||
|
modules.podman.enable = true;
|
||||||
|
|
||||||
|
systemd.services = {
|
||||||
|
gitea-runner-nix-image = {
|
||||||
|
wantedBy = [ "multi-user.target" ];
|
||||||
|
after = [ "podman.service" ];
|
||||||
|
requires = [ "podman.service" ];
|
||||||
|
path = [ config.virtualisation.podman.package pkgs.gnutar pkgs.shadow pkgs.getent ];
|
||||||
|
script = ''
|
||||||
|
set -eux -o pipefail
|
||||||
|
mkdir -p etc/nix
|
||||||
|
|
||||||
|
# Create an unpriveleged user that we can use also without the run-as-user.sh script
|
||||||
|
touch etc/passwd etc/group
|
||||||
|
groupid=$(cut -d: -f3 < <(getent group nix-ci-user))
|
||||||
|
userid=$(cut -d: -f3 < <(getent passwd nix-ci-user))
|
||||||
|
groupadd --prefix $(pwd) --gid "$groupid" nix-ci-user
|
||||||
|
emptypassword='$6$1ero.LwbisiU.h3D$GGmnmECbPotJoPQ5eoSTD6tTjKnSWZcjHoVTkxFLZP17W9hRi/XkmCiAMOfWruUwy8gMjINrBMNODc7cYEo4K.'
|
||||||
|
useradd --prefix $(pwd) -p "$emptypassword" -m -d /tmp -u "$userid" -g "$groupid" -G nix-ci-user nix-ci-user
|
||||||
|
|
||||||
|
cat <<NIX_CONFIG > etc/nix/nix.conf
|
||||||
|
accept-flake-config = true
|
||||||
|
experimental-features = nix-command flakes
|
||||||
|
NIX_CONFIG
|
||||||
|
|
||||||
|
cat <<NSSWITCH > etc/nsswitch.conf
|
||||||
|
passwd: files mymachines systemd
|
||||||
|
group: files mymachines systemd
|
||||||
|
shadow: files
|
||||||
|
|
||||||
|
hosts: files mymachines dns myhostname
|
||||||
|
networks: files
|
||||||
|
|
||||||
|
ethers: files
|
||||||
|
services: files
|
||||||
|
protocols: files
|
||||||
|
rpc: files
|
||||||
|
NSSWITCH
|
||||||
|
|
||||||
|
# list the content as it will be imported into the container
|
||||||
|
tar -cv . | tar -tvf -
|
||||||
|
tar -cv . | podman import - gitea-runner-nix
|
||||||
|
'';
|
||||||
|
serviceConfig = {
|
||||||
|
RuntimeDirectory = "gitea-runner-nix-image";
|
||||||
|
WorkingDirectory = "/run/gitea-runner-nix-image";
|
||||||
|
Type = "oneshot";
|
||||||
|
RemainAfterExit = true;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
gitea-runner-nix = {
|
||||||
|
after = [ "gitea-runner-nix-image.service" ];
|
||||||
|
requires = [ "gitea-runner-nix-image.service" ];
|
||||||
|
|
||||||
|
serviceConfig = {
|
||||||
|
# Hardening (may overlap with DynamicUser=)
|
||||||
|
# The following options are only for optimizing output of systemd-analyze
|
||||||
|
AmbientCapabilities = "";
|
||||||
|
CapabilityBoundingSet = "";
|
||||||
|
# ProtectClock= adds DeviceAllow=char-rtc r
|
||||||
|
DeviceAllow = "";
|
||||||
|
NoNewPrivileges = true;
|
||||||
|
PrivateDevices = true;
|
||||||
|
PrivateMounts = true;
|
||||||
|
PrivateTmp = true;
|
||||||
|
PrivateUsers = true;
|
||||||
|
ProtectClock = true;
|
||||||
|
ProtectControlGroups = true;
|
||||||
|
ProtectHome = true;
|
||||||
|
ProtectHostname = true;
|
||||||
|
ProtectKernelLogs = true;
|
||||||
|
ProtectKernelModules = true;
|
||||||
|
ProtectKernelTunables = true;
|
||||||
|
ProtectSystem = "strict";
|
||||||
|
RemoveIPC = true;
|
||||||
|
RestrictNamespaces = true;
|
||||||
|
RestrictRealtime = true;
|
||||||
|
RestrictSUIDSGID = true;
|
||||||
|
UMask = "0066";
|
||||||
|
ProtectProc = "invisible";
|
||||||
|
SystemCallFilter = [
|
||||||
|
"~@clock"
|
||||||
|
"~@cpu-emulation"
|
||||||
|
"~@module"
|
||||||
|
"~@mount"
|
||||||
|
"~@obsolete"
|
||||||
|
"~@raw-io"
|
||||||
|
"~@reboot"
|
||||||
|
"~@swap"
|
||||||
|
# needed by go?
|
||||||
|
#"~@resources"
|
||||||
|
"~@privileged"
|
||||||
|
"~capset"
|
||||||
|
"~setdomainname"
|
||||||
|
"~sethostname"
|
||||||
|
];
|
||||||
|
RestrictAddressFamilies = [ "AF_INET" "AF_INET6" "AF_UNIX" "AF_NETLINK" ];
|
||||||
|
|
||||||
|
# Needs network access
|
||||||
|
PrivateNetwork = false;
|
||||||
|
# Cannot be true due to Node
|
||||||
|
MemoryDenyWriteExecute = false;
|
||||||
|
|
||||||
|
# The more restrictive "pid" option makes `nix` commands in CI emit
|
||||||
|
# "GC Warning: Couldn't read /proc/stat"
|
||||||
|
# You may want to set this to "pid" if not using `nix` commands
|
||||||
|
ProcSubset = "all";
|
||||||
|
# Coverage programs for compiled code such as `cargo-tarpaulin` disable
|
||||||
|
# ASLR (address space layout randomization) which requires the
|
||||||
|
# `personality` syscall
|
||||||
|
# You may want to set this to `true` if not using coverage tooling on
|
||||||
|
# compiled code
|
||||||
|
LockPersonality = false;
|
||||||
|
|
||||||
|
# Note that this has some interactions with the User setting; so you may
|
||||||
|
# want to consult the systemd docs if using both.
|
||||||
|
DynamicUser = true;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
users.users.nix-ci-user = {
|
||||||
|
group = "nix-ci-user";
|
||||||
|
description = "Used for running nix-based CI jobs";
|
||||||
|
home = "/var/empty";
|
||||||
|
isSystemUser = true;
|
||||||
|
};
|
||||||
|
users.groups.nix-ci-user = { };
|
||||||
|
|
||||||
|
age.secrets."files/services/gitea-runner/${hostname}-token" = {
|
||||||
|
file = "${self.inputs.secrets}/files/services/gitea-runner/${hostname}-token.age";
|
||||||
|
group = "podman";
|
||||||
|
};
|
||||||
|
|
||||||
|
services.gitea-actions-runner.instances = {
|
||||||
|
act = {
|
||||||
|
enable = true;
|
||||||
|
url = giteaUrl;
|
||||||
|
name = "act-runner-${hostname}";
|
||||||
|
|
||||||
|
tokenFile = config.age.secrets."files/services/gitea-runner/${hostname}-token".path;
|
||||||
|
settings = {
|
||||||
|
cache.enabled = true;
|
||||||
|
runner.capacity = 4;
|
||||||
|
};
|
||||||
|
|
||||||
|
labels = [
|
||||||
|
"debian-latest:docker://ghcr.io/catthehacker/ubuntu:act-latest"
|
||||||
|
"ubuntu-latest:docker://ghcr.io/catthehacker/ubuntu:act-latest"
|
||||||
|
];
|
||||||
|
};
|
||||||
|
nix = {
|
||||||
|
enable = true;
|
||||||
|
url = giteaUrl;
|
||||||
|
name = "nix-runner-${hostname}";
|
||||||
|
|
||||||
|
tokenFile = config.age.secrets."files/services/gitea-runner/${hostname}-token".path;
|
||||||
|
settings = {
|
||||||
|
cache.enabled = true;
|
||||||
|
container = {
|
||||||
|
options = "-e NIX_BUILD_SHELL=/bin/bash -e PAGER=cat -e PATH=/bin -e SSL_CERT_FILE=/etc/ssl/certs/ca-bundle.crt --device /dev/kvm -v /nix:/nix -v ${storeDeps}/bin:/bin -v ${storeDeps}/etc/ssl:/etc/ssl --user nix-ci-user";
|
||||||
|
network = "host";
|
||||||
|
valid_volumes = [
|
||||||
|
"/nix"
|
||||||
|
"${storeDeps}/bin"
|
||||||
|
"${storeDeps}/etc/ssl"
|
||||||
|
];
|
||||||
|
};
|
||||||
|
runner.capacity = 4;
|
||||||
|
};
|
||||||
|
|
||||||
|
labels = [
|
||||||
|
"nix:docker://gitea-runner-nix"
|
||||||
|
];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
93
modules/services/gitea/default.nix
Normal file
93
modules/services/gitea/default.nix
Normal file
@ -0,0 +1,93 @@
|
|||||||
|
{ config, lib, pkgs, self, ... }:
|
||||||
|
|
||||||
|
let
|
||||||
|
cfg = config.modules.services.gitea;
|
||||||
|
in {
|
||||||
|
options.modules.services.gitea = {
|
||||||
|
enable = lib.mkEnableOption "gitea";
|
||||||
|
domain = lib.mkOption {
|
||||||
|
type = lib.types.string;
|
||||||
|
default = "git.vimium.com";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
config = lib.mkIf cfg.enable {
|
||||||
|
users = {
|
||||||
|
users.git = {
|
||||||
|
isSystemUser = true;
|
||||||
|
useDefaultShell = true;
|
||||||
|
group = "git";
|
||||||
|
extraGroups = [ "gitea" ];
|
||||||
|
home = config.services.gitea.stateDir;
|
||||||
|
};
|
||||||
|
groups.git = { };
|
||||||
|
};
|
||||||
|
|
||||||
|
services.nginx = {
|
||||||
|
upstreams.gitea = {
|
||||||
|
servers = {
|
||||||
|
"unix:${config.services.gitea.settings.server.HTTP_ADDR}" = { };
|
||||||
|
};
|
||||||
|
};
|
||||||
|
virtualHosts = {
|
||||||
|
"${cfg.domain}" = {
|
||||||
|
forceSSL = true;
|
||||||
|
enableACME = true;
|
||||||
|
locations."/".proxyPass = "http://gitea";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
systemd.tmpfiles.rules = [
|
||||||
|
"d '${config.services.gitea.customDir}/public/assets/css' 0750 ${config.services.gitea.user} ${config.services.gitea.group} - -"
|
||||||
|
"L+ '${config.services.gitea.customDir}/public/assets/css/theme-github.css' - - - - ${self.inputs.gitea-github-theme}/theme-github.css"
|
||||||
|
"L+ '${config.services.gitea.customDir}/public/assets/css/theme-github-auto.css' - - - - ${self.inputs.gitea-github-theme}/theme-github-auto.css"
|
||||||
|
"L+ '${config.services.gitea.customDir}/public/assets/css/theme-github-dark.css' - - - - ${self.inputs.gitea-github-theme}/theme-github-dark.css"
|
||||||
|
];
|
||||||
|
|
||||||
|
services.gitea = rec {
|
||||||
|
package = pkgs.unstable.gitea;
|
||||||
|
enable = true;
|
||||||
|
user = "git";
|
||||||
|
appName = "Vimium Git";
|
||||||
|
stateDir = "/var/lib/gitea";
|
||||||
|
repositoryRoot = "${stateDir}/repositories";
|
||||||
|
database = {
|
||||||
|
type = "sqlite3";
|
||||||
|
inherit user;
|
||||||
|
path = "${stateDir}/gitea.db";
|
||||||
|
};
|
||||||
|
lfs = {
|
||||||
|
enable = true;
|
||||||
|
contentDir = "${stateDir}/lfs";
|
||||||
|
};
|
||||||
|
settings = {
|
||||||
|
server = {
|
||||||
|
DOMAIN = config.networking.domain;
|
||||||
|
LANDING_PAGE = "explore";
|
||||||
|
OFFLINE_MODE = true;
|
||||||
|
PROTOCOL = "http+unix";
|
||||||
|
SSH_USER = "git";
|
||||||
|
SSH_DOMAIN = "${cfg.domain}";
|
||||||
|
SSH_PORT = lib.head config.services.openssh.ports;
|
||||||
|
ROOT_URL = "https://${cfg.domain}/";
|
||||||
|
};
|
||||||
|
service.DISABLE_REGISTRATION = true;
|
||||||
|
session.COOKIE_SECURE = true;
|
||||||
|
log = {
|
||||||
|
ROOT_PATH = "${stateDir}/log";
|
||||||
|
"logger.router.MODE" = "";
|
||||||
|
};
|
||||||
|
ui = {
|
||||||
|
THEMES = "gitea,arc-green,github,github-auto,github-dark";
|
||||||
|
DEFAULT_THEME = "github-dark";
|
||||||
|
};
|
||||||
|
actions.ENABLED = true;
|
||||||
|
indexer = {
|
||||||
|
REPO_INDEXER_ENABLED = true;
|
||||||
|
};
|
||||||
|
packages.CHUNKED_UPLOAD_PATH = lib.mkForce "${stateDir}/data/tmp/package-upload";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
67
modules/services/headscale/default.nix
Normal file
67
modules/services/headscale/default.nix
Normal file
@ -0,0 +1,67 @@
|
|||||||
|
{ config, lib, pkgs, ... }:
|
||||||
|
|
||||||
|
let
|
||||||
|
cfg = config.modules.services.headscale;
|
||||||
|
fqdn = "headscale.vimium.net";
|
||||||
|
in {
|
||||||
|
options.modules.services.headscale = {
|
||||||
|
enable = lib.mkOption {
|
||||||
|
default = false;
|
||||||
|
example = true;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
config = lib.mkIf cfg.enable {
|
||||||
|
environment.systemPackages = [ pkgs.headscale ];
|
||||||
|
|
||||||
|
services.headscale = {
|
||||||
|
enable = true;
|
||||||
|
|
||||||
|
port = 8080;
|
||||||
|
|
||||||
|
settings = {
|
||||||
|
acl_policy_path = null;
|
||||||
|
ip_prefixes = [
|
||||||
|
"100.64.0.0/10"
|
||||||
|
];
|
||||||
|
server_url = "https://${fqdn}";
|
||||||
|
derp = {
|
||||||
|
auto_update_enable = false;
|
||||||
|
update_frequency = "24h";
|
||||||
|
urls = [];
|
||||||
|
};
|
||||||
|
dns_config = {
|
||||||
|
base_domain = "vimium.net";
|
||||||
|
extra_records = [
|
||||||
|
{
|
||||||
|
name = "grafana.mesh.vimium.net";
|
||||||
|
type = "A";
|
||||||
|
value = "100.64.0.6";
|
||||||
|
}
|
||||||
|
{
|
||||||
|
name = "home.mesh.vimium.net";
|
||||||
|
type = "A";
|
||||||
|
value = "100.64.0.7";
|
||||||
|
}
|
||||||
|
];
|
||||||
|
magic_dns = true;
|
||||||
|
nameservers = [
|
||||||
|
"9.9.9.9"
|
||||||
|
];
|
||||||
|
};
|
||||||
|
logtail.enabled = false;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
services.nginx.virtualHosts = {
|
||||||
|
"${fqdn}" = {
|
||||||
|
forceSSL = true;
|
||||||
|
enableACME = true;
|
||||||
|
locations."/" = {
|
||||||
|
proxyPass = "http://localhost:${toString config.services.headscale.port}";
|
||||||
|
proxyWebsockets = true;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
54
modules/services/immich/default.nix
Normal file
54
modules/services/immich/default.nix
Normal file
@ -0,0 +1,54 @@
|
|||||||
|
{ config, lib, self, ... }:
|
||||||
|
|
||||||
|
with lib;
|
||||||
|
|
||||||
|
let cfg = config.modules.services.immich;
|
||||||
|
in {
|
||||||
|
options.modules.services.immich = {
|
||||||
|
enable = mkOption {
|
||||||
|
default = false;
|
||||||
|
example = true;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
config = mkIf cfg.enable {
|
||||||
|
services.nginx = {
|
||||||
|
virtualHosts = {
|
||||||
|
"gallery.vimium.com" = {
|
||||||
|
forceSSL = true;
|
||||||
|
enableACME = true;
|
||||||
|
locations."/" = {
|
||||||
|
proxyPass = "http://localhost:${toString config.services.immich.port}";
|
||||||
|
extraConfig = ''
|
||||||
|
client_max_body_size 50000M;
|
||||||
|
|
||||||
|
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||||
|
proxy_set_header X-Forwarded-Proto $scheme;
|
||||||
|
proxy_set_header X-Real-IP $remote_addr;
|
||||||
|
proxy_set_header Host $host;
|
||||||
|
|
||||||
|
proxy_buffering off;
|
||||||
|
proxy_redirect off;
|
||||||
|
proxy_http_version 1.1;
|
||||||
|
proxy_set_header Upgrade $http_upgrade;
|
||||||
|
proxy_set_header Connection "upgrade";
|
||||||
|
|
||||||
|
proxy_read_timeout 600s;
|
||||||
|
proxy_send_timeout 600s;
|
||||||
|
send_timeout 600s;
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
age.secrets."files/services/immich/envfile" = {
|
||||||
|
file = "${self.inputs.secrets}/files/services/immich/envfile.age";
|
||||||
|
};
|
||||||
|
|
||||||
|
services.immich = {
|
||||||
|
enable = true;
|
||||||
|
secretsFile = config.age.secrets."files/services/immich/envfile".path;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
74
modules/services/mail/default.nix
Normal file
74
modules/services/mail/default.nix
Normal file
@ -0,0 +1,74 @@
|
|||||||
|
{ config, lib, self, ... }:
|
||||||
|
|
||||||
|
let
|
||||||
|
cfg = config.modules.services.mail;
|
||||||
|
domains = [
|
||||||
|
"h0lt.com"
|
||||||
|
"jdholt.com"
|
||||||
|
"jordanholt.xyz"
|
||||||
|
"vimium.co"
|
||||||
|
"vimium.com"
|
||||||
|
"vimium.co.uk"
|
||||||
|
"vimium.info"
|
||||||
|
"vimium.net"
|
||||||
|
"vimium.org"
|
||||||
|
"vimium.xyz"
|
||||||
|
];
|
||||||
|
in {
|
||||||
|
options.modules.services.mail = {
|
||||||
|
enable = lib.mkOption {
|
||||||
|
default = false;
|
||||||
|
example = true;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
imports = [
|
||||||
|
self.inputs.nixos-mailserver.nixosModule
|
||||||
|
];
|
||||||
|
|
||||||
|
config = lib.mkIf cfg.enable {
|
||||||
|
services.roundcube = {
|
||||||
|
enable = true;
|
||||||
|
hostName = config.mailserver.fqdn;
|
||||||
|
extraConfig = ''
|
||||||
|
$config['smtp_server'] = "tls://${config.mailserver.fqdn}";
|
||||||
|
$config['smtp_user'] = "%u";
|
||||||
|
$config['smtp_pass'] = "%p";
|
||||||
|
'';
|
||||||
|
plugins = [ "contextmenu" ];
|
||||||
|
};
|
||||||
|
|
||||||
|
services.nginx.enable = true;
|
||||||
|
|
||||||
|
networking.firewall.allowedTCPPorts = [ 80 443 ];
|
||||||
|
|
||||||
|
mailserver = {
|
||||||
|
enable = true;
|
||||||
|
fqdn = "mail.vimium.com";
|
||||||
|
domains = domains;
|
||||||
|
indexDir = "/var/lib/dovecot/indices";
|
||||||
|
|
||||||
|
certificateDomains = [
|
||||||
|
"imap.vimium.com"
|
||||||
|
"smtp.vimium.com"
|
||||||
|
];
|
||||||
|
certificateScheme = "acme-nginx";
|
||||||
|
|
||||||
|
fullTextSearch.enable = true;
|
||||||
|
|
||||||
|
loginAccounts = {
|
||||||
|
"jordan@vimium.com" = {
|
||||||
|
hashedPasswordFile = config.users.users.jordan.hashedPasswordFile;
|
||||||
|
catchAll = domains;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
extraVirtualAliases = {
|
||||||
|
"hostmaster@vimium.com" = "jordan@vimium.com";
|
||||||
|
"postmaster@vimium.com" = "jordan@vimium.com";
|
||||||
|
"webmaster@vimium.com" = "jordan@vimium.com";
|
||||||
|
"abuse@vimium.com" = "jordan@vimium.com";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
253
modules/services/matrix/default.nix
Normal file
253
modules/services/matrix/default.nix
Normal file
@ -0,0 +1,253 @@
|
|||||||
|
{ config, lib, pkgs, self, ... }:
|
||||||
|
|
||||||
|
let
|
||||||
|
cfg = config.modules.services.matrix;
|
||||||
|
in {
|
||||||
|
options.modules.services.matrix = {
|
||||||
|
enable = lib.mkEnableOption "matrix";
|
||||||
|
element = {
|
||||||
|
enable = lib.mkOption {
|
||||||
|
type = lib.types.bool;
|
||||||
|
default = true;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
bridges = {
|
||||||
|
signal = lib.mkOption {
|
||||||
|
type = lib.types.bool;
|
||||||
|
default = false;
|
||||||
|
description = "Enable Signal bridge.";
|
||||||
|
};
|
||||||
|
whatsapp = lib.mkOption {
|
||||||
|
type = lib.types.bool;
|
||||||
|
default = false;
|
||||||
|
description = "Enable WhatsApp bridge.";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
serverName = lib.mkOption {
|
||||||
|
type = lib.types.str;
|
||||||
|
default = "vimium.com";
|
||||||
|
example = "vimium.com";
|
||||||
|
};
|
||||||
|
slidingSync = {
|
||||||
|
enable = lib.mkEnableOption "sliding-sync";
|
||||||
|
};
|
||||||
|
usePostgresql = lib.mkEnableOption "postgresql";
|
||||||
|
};
|
||||||
|
|
||||||
|
config = let
|
||||||
|
matrixSubdomain = "matrix.${cfg.serverName}";
|
||||||
|
elementSubdomain = "chat.${cfg.serverName}";
|
||||||
|
matrixClientConfig = {
|
||||||
|
"m.homeserver" = {
|
||||||
|
base_url = "https://${matrixSubdomain}";
|
||||||
|
server_name = cfg.serverName;
|
||||||
|
};
|
||||||
|
"m.identity_server" = {};
|
||||||
|
"org.matrix.msc3575.proxy" = if cfg.slidingSync.enable then {
|
||||||
|
"url" = "https://${matrixSubdomain}";
|
||||||
|
} else { };
|
||||||
|
};
|
||||||
|
matrixServerConfig."m.server" = "${matrixSubdomain}:443";
|
||||||
|
commonBridgeSettings = bridge: {
|
||||||
|
appservice = {
|
||||||
|
database = lib.mkIf cfg.usePostgresql {
|
||||||
|
type = "postgres";
|
||||||
|
uri = "postgresql:///${bridge}?host=/run/postgresql";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
bridge = {
|
||||||
|
encryption = {
|
||||||
|
allow = true;
|
||||||
|
default = true;
|
||||||
|
require = true;
|
||||||
|
};
|
||||||
|
permissions = {
|
||||||
|
"${cfg.serverName}" = "user";
|
||||||
|
"@jordan:${cfg.serverName}" = "admin";
|
||||||
|
};
|
||||||
|
provisioning = {
|
||||||
|
shared_secret = "disable";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
homeserver = {
|
||||||
|
address = "https://${matrixSubdomain}";
|
||||||
|
domain = cfg.serverName;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
in lib.mkIf cfg.enable {
|
||||||
|
networking.firewall.allowedTCPPorts = [
|
||||||
|
8448 # Matrix federation
|
||||||
|
];
|
||||||
|
|
||||||
|
security.acme.certs = {
|
||||||
|
"${matrixSubdomain}" = {
|
||||||
|
reloadServices = [ "matrix-synapse" ];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
services.nginx.virtualHosts = {
|
||||||
|
"${matrixSubdomain}" = {
|
||||||
|
forceSSL = true;
|
||||||
|
enableACME = true;
|
||||||
|
listen = [
|
||||||
|
{
|
||||||
|
addr = "0.0.0.0";
|
||||||
|
port = 443;
|
||||||
|
ssl = true;
|
||||||
|
}
|
||||||
|
{
|
||||||
|
addr = "0.0.0.0";
|
||||||
|
port = 80;
|
||||||
|
}
|
||||||
|
{
|
||||||
|
addr = "0.0.0.0";
|
||||||
|
port = 8448;
|
||||||
|
ssl = true;
|
||||||
|
}
|
||||||
|
{
|
||||||
|
addr = "[::1]";
|
||||||
|
port = 443;
|
||||||
|
ssl = true;
|
||||||
|
}
|
||||||
|
{
|
||||||
|
addr = "[::1]";
|
||||||
|
port = 80;
|
||||||
|
}
|
||||||
|
{
|
||||||
|
addr = "[::1]";
|
||||||
|
port = 8448;
|
||||||
|
ssl = true;
|
||||||
|
}
|
||||||
|
];
|
||||||
|
locations = {
|
||||||
|
"/" = {
|
||||||
|
proxyPass = "http://localhost:8008";
|
||||||
|
extraConfig = ''
|
||||||
|
proxy_set_header X-Forwarded-For $remote_addr;
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
"/_matrix" = {
|
||||||
|
proxyPass = "http://localhost:8008";
|
||||||
|
extraConfig = ''
|
||||||
|
proxy_set_header X-Forwarded-For $remote_addr;
|
||||||
|
client_max_body_size 50M;
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
"/_synapse/client".proxyPass = "http://localhost:8008";
|
||||||
|
"~ ^/(client/|_matrix/client/unstable/org.matrix.msc3575/sync)" = lib.mkIf cfg.slidingSync.enable {
|
||||||
|
priority = 100;
|
||||||
|
proxyPass = "http://localhost:8009";
|
||||||
|
extraConfig = ''
|
||||||
|
proxy_set_header X-Forwarded-For $remote_addr;
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
"${cfg.serverName}" = let
|
||||||
|
mkWellKnown = data: ''
|
||||||
|
more_set_headers 'Content-Type: application/json';
|
||||||
|
return 200 '${builtins.toJSON data}';
|
||||||
|
'';
|
||||||
|
in {
|
||||||
|
locations."= /.well-known/matrix/server".extraConfig = (mkWellKnown matrixServerConfig);
|
||||||
|
locations."= /.well-known/matrix/client".extraConfig = (mkWellKnown matrixClientConfig);
|
||||||
|
};
|
||||||
|
} // (if cfg.element.enable then {
|
||||||
|
"${elementSubdomain}" = {
|
||||||
|
forceSSL = true;
|
||||||
|
enableACME = true;
|
||||||
|
root = pkgs.unstable.element-web.override {
|
||||||
|
conf = {
|
||||||
|
default_server_config = matrixClientConfig;
|
||||||
|
brand = "Vimium Chat";
|
||||||
|
branding = {
|
||||||
|
auth_header_logo_url = "https://vimium.com/images/logo.svg";
|
||||||
|
auth_footer_links = [
|
||||||
|
{ "text" = "Vimium.com"; "url" = "https://vimium.com"; }
|
||||||
|
];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
} else {});
|
||||||
|
|
||||||
|
nixpkgs.config.permittedInsecurePackages = [
|
||||||
|
"jitsi-meet-1.0.8043"
|
||||||
|
"olm-3.2.16"
|
||||||
|
];
|
||||||
|
|
||||||
|
services.matrix-synapse = {
|
||||||
|
enable = true;
|
||||||
|
enableRegistrationScript = true;
|
||||||
|
settings = {
|
||||||
|
database.name = (if cfg.usePostgresql then "psycopg2" else "sqlite3");
|
||||||
|
enable_metrics = false;
|
||||||
|
enable_registration = false;
|
||||||
|
max_upload_size = "100M";
|
||||||
|
report_stats = false;
|
||||||
|
server_name = cfg.serverName;
|
||||||
|
app_service_config_files = (lib.optional cfg.bridges.whatsapp
|
||||||
|
"/var/lib/mautrix-whatsapp/whatsapp-registration.yaml");
|
||||||
|
};
|
||||||
|
};
|
||||||
|
systemd.services.matrix-synapse.serviceConfig.SupplementaryGroups =
|
||||||
|
(lib.optional cfg.bridges.whatsapp
|
||||||
|
config.systemd.services.mautrix-whatsapp.serviceConfig.Group);
|
||||||
|
|
||||||
|
age.secrets = if cfg.slidingSync.enable then {
|
||||||
|
"files/services/matrix/sliding-sync" = {
|
||||||
|
file = "${self.inputs.secrets}/files/services/matrix/sliding-sync.age";
|
||||||
|
};
|
||||||
|
} else {};
|
||||||
|
|
||||||
|
services.matrix-sliding-sync = lib.mkIf cfg.slidingSync.enable {
|
||||||
|
enable = true;
|
||||||
|
environmentFile = config.age.secrets."files/services/matrix/sliding-sync".path;
|
||||||
|
settings = { SYNCV3_SERVER = "https://${matrixSubdomain}"; };
|
||||||
|
};
|
||||||
|
|
||||||
|
services.postgresql = lib.mkIf cfg.usePostgresql {
|
||||||
|
ensureUsers = [
|
||||||
|
{
|
||||||
|
name = "matrix-synapse";
|
||||||
|
ensureDBOwnership = true;
|
||||||
|
}
|
||||||
|
] ++ (lib.optional cfg.bridges.signal
|
||||||
|
{
|
||||||
|
name = "mautrix-signal";
|
||||||
|
ensureDBOwnership = true;
|
||||||
|
})
|
||||||
|
++ (lib.optional cfg.bridges.whatsapp
|
||||||
|
{
|
||||||
|
name = "mautrix-whatsapp";
|
||||||
|
ensureDBOwnership = true;
|
||||||
|
});
|
||||||
|
ensureDatabases = [
|
||||||
|
"matrix-synapse"
|
||||||
|
] ++ (lib.optional cfg.bridges.signal
|
||||||
|
"mautrix-signal")
|
||||||
|
++ (lib.optional cfg.bridges.whatsapp
|
||||||
|
"mautrix-whatsapp");
|
||||||
|
};
|
||||||
|
|
||||||
|
services.mautrix-signal = lib.mkIf cfg.bridges.signal {
|
||||||
|
enable = true;
|
||||||
|
settings = commonBridgeSettings "mautrix-signal";
|
||||||
|
};
|
||||||
|
|
||||||
|
services.mautrix-whatsapp = lib.mkIf cfg.bridges.whatsapp {
|
||||||
|
enable = true;
|
||||||
|
settings = {
|
||||||
|
bridge = {
|
||||||
|
history_sync = {
|
||||||
|
backfill = true;
|
||||||
|
max_initial_conversations = -1;
|
||||||
|
message_count = 50;
|
||||||
|
request_full_sync = true;
|
||||||
|
};
|
||||||
|
mute_bridging = true;
|
||||||
|
};
|
||||||
|
} // commonBridgeSettings "mautrix-whatsapp";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
182
modules/services/nginx/default.nix
Normal file
182
modules/services/nginx/default.nix
Normal file
@ -0,0 +1,182 @@
|
|||||||
|
{ config, lib, pkgs, ... }:
|
||||||
|
|
||||||
|
with lib;
|
||||||
|
|
||||||
|
let
|
||||||
|
cfg = config.modules.services.nginx;
|
||||||
|
nginxErrorPages = ''
|
||||||
|
location @error_pages {
|
||||||
|
rewrite ^.*$ /''${status}.html break;
|
||||||
|
|
||||||
|
root "/var/www/html/errors";
|
||||||
|
}
|
||||||
|
'';
|
||||||
|
nginxEdgeHeaders = ''
|
||||||
|
more_set_headers 'Server: Vimium';
|
||||||
|
more_set_headers 'Access-Control-Allow-Origin: *';
|
||||||
|
add_header Expect-CT max-age=30 always;
|
||||||
|
add_header Referrer-Policy strict-origin-when-cross-origin always;
|
||||||
|
add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" always;
|
||||||
|
add_header Vimium-Responding-Instance $hostname;
|
||||||
|
add_header X-XSS-Protection "1; mode=block" always;
|
||||||
|
add_header X-Content-Type-Options nosniff always;
|
||||||
|
'';
|
||||||
|
nginxStrictHeaders = ''
|
||||||
|
add_header X-Frame-Options SAMEORIGIN always;
|
||||||
|
add_header Permissions-Policy "fullscreen=(self), sync-xhr=(self)" always;
|
||||||
|
'';
|
||||||
|
mkRedirect = from: to: {
|
||||||
|
"${from}" = {
|
||||||
|
forceSSL = true;
|
||||||
|
enableACME = true;
|
||||||
|
serverAliases = [ "www.${from}" ];
|
||||||
|
locations."/".return = "301 https://${to}$request_uri";
|
||||||
|
extraConfig = nginxErrorPages + nginxEdgeHeaders + nginxStrictHeaders;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
in {
|
||||||
|
options.modules.services.nginx = {
|
||||||
|
enable = mkOption {
|
||||||
|
default = false;
|
||||||
|
example = true;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
config = mkIf cfg.enable {
|
||||||
|
networking.firewall.allowedTCPPorts = [
|
||||||
|
80 # HTTP
|
||||||
|
443 # HTTPS
|
||||||
|
];
|
||||||
|
|
||||||
|
services.nginx = {
|
||||||
|
enable = true;
|
||||||
|
package = pkgs.openresty;
|
||||||
|
recommendedGzipSettings = true;
|
||||||
|
recommendedOptimisation = true;
|
||||||
|
recommendedTlsSettings = true;
|
||||||
|
clientMaxBodySize = "2G";
|
||||||
|
sslProtocols = "TLSv1.2 TLSv1.3";
|
||||||
|
sslCiphers = "ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384";
|
||||||
|
appendHttpConfig = ''
|
||||||
|
error_page 400 @error_pages;
|
||||||
|
error_page 401 @error_pages;
|
||||||
|
error_page 403 @error_pages;
|
||||||
|
error_page 404 @error_pages;
|
||||||
|
error_page 405 @error_pages;
|
||||||
|
error_page 429 @error_pages;
|
||||||
|
error_page 500 @error_pages;
|
||||||
|
error_page 501 @error_pages;
|
||||||
|
error_page 502 @error_pages;
|
||||||
|
error_page 503 @error_pages;
|
||||||
|
error_page 504 @error_pages;
|
||||||
|
|
||||||
|
client_body_buffer_size 16k;
|
||||||
|
client_header_buffer_size 8k;
|
||||||
|
'';
|
||||||
|
appendConfig = ''
|
||||||
|
worker_processes auto;
|
||||||
|
worker_cpu_affinity auto;
|
||||||
|
worker_rlimit_nofile 50000;
|
||||||
|
'';
|
||||||
|
eventsConfig = ''
|
||||||
|
worker_connections 20000;
|
||||||
|
multi_accept off;
|
||||||
|
'';
|
||||||
|
proxyCachePath = {
|
||||||
|
"skycam" = {
|
||||||
|
enable = true;
|
||||||
|
keysZoneName = "skycam_cache";
|
||||||
|
maxSize = "100m";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
virtualHosts = {
|
||||||
|
## Static sites
|
||||||
|
"jellyfin.vimium.com" = {
|
||||||
|
forceSSL = true;
|
||||||
|
enableACME = true;
|
||||||
|
extraConfig = nginxErrorPages + nginxEdgeHeaders;
|
||||||
|
locations."/" = {
|
||||||
|
proxyPass = "http://localhost:8000";
|
||||||
|
extraConfig = ''
|
||||||
|
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||||
|
proxy_set_header X-Forwarded-Proto $scheme;
|
||||||
|
proxy_set_header X-Real-IP $remote_addr;
|
||||||
|
proxy_set_header Host $host;
|
||||||
|
|
||||||
|
proxy_set_header Range $http_range;
|
||||||
|
proxy_set_header If-Range $http_if_range;
|
||||||
|
|
||||||
|
proxy_http_version 1.1;
|
||||||
|
proxy_set_header Upgrade $http_upgrade;
|
||||||
|
proxy_set_header Connection "upgrade";
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
};
|
||||||
|
"jdholt.com" = {
|
||||||
|
forceSSL = true;
|
||||||
|
enableACME = true;
|
||||||
|
serverAliases = [ "www.jdholt.com" ];
|
||||||
|
extraConfig = nginxErrorPages + nginxEdgeHeaders + nginxStrictHeaders;
|
||||||
|
locations."/skycam/snapshot.jpg" = {
|
||||||
|
extraConfig = ''
|
||||||
|
set $backend "skycam.mesh.vimium.net:8080";
|
||||||
|
|
||||||
|
resolver 100.100.100.100;
|
||||||
|
|
||||||
|
proxy_pass http://$backend/snapshot;
|
||||||
|
proxy_cache skycam_cache;
|
||||||
|
proxy_cache_valid any 10s;
|
||||||
|
proxy_ignore_headers Cache-Control Expires Set-Cookie;
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
locations."/".return = "301 https://vimium.com$request_uri";
|
||||||
|
};
|
||||||
|
"pki.vimium.com" = {
|
||||||
|
addSSL = true;
|
||||||
|
forceSSL = false;
|
||||||
|
enableACME = true;
|
||||||
|
extraConfig = ''
|
||||||
|
${nginxErrorPages}
|
||||||
|
more_set_headers 'Server: Vimium';
|
||||||
|
'';
|
||||||
|
locations."/" = {
|
||||||
|
root = "/var/www/pki.vimium.com";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
"suhailhussain.com" = {
|
||||||
|
forceSSL = true;
|
||||||
|
enableACME = true;
|
||||||
|
serverAliases = [ "www.suhailhussain.com" ];
|
||||||
|
extraConfig = nginxErrorPages + nginxEdgeHeaders + nginxStrictHeaders;
|
||||||
|
locations."/" = {
|
||||||
|
root = "/var/www/suhailhussain.com";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
"vimium.com" = {
|
||||||
|
default = true;
|
||||||
|
forceSSL = true;
|
||||||
|
enableACME = true;
|
||||||
|
serverAliases = [ "www.vimium.com" ];
|
||||||
|
extraConfig = nginxErrorPages + nginxEdgeHeaders + nginxStrictHeaders + ''
|
||||||
|
add_header Content-Security-Policy "default-src 'self' https://vimium.com https://www.vimium.com; style-src 'unsafe-inline'; object-src 'none'; upgrade-insecure-requests" always;
|
||||||
|
'';
|
||||||
|
locations."/" = {
|
||||||
|
root = "/var/www/vimium.com";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
||||||
|
## Redirects
|
||||||
|
// (mkRedirect "h0lt.com" "jdholt.com")
|
||||||
|
// (mkRedirect "jordanholt.xyz" "jdholt.com")
|
||||||
|
// (mkRedirect "omnimagic.com" "vimium.com")
|
||||||
|
// (mkRedirect "omnimagic.net" "vimium.com")
|
||||||
|
// (mkRedirect "thelostlegend.com" "suhailhussain.com")
|
||||||
|
// (mkRedirect "vimium.co" "vimium.com")
|
||||||
|
// (mkRedirect "vimium.co.uk" "vimium.com")
|
||||||
|
// (mkRedirect "vimium.info" "vimium.com")
|
||||||
|
// (mkRedirect "vimium.net" "vimium.com")
|
||||||
|
// (mkRedirect "vimium.org" "vimium.com")
|
||||||
|
// (mkRedirect "vimium.xyz" "vimium.com");
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
57
modules/services/photoprism/default.nix
Normal file
57
modules/services/photoprism/default.nix
Normal file
@ -0,0 +1,57 @@
|
|||||||
|
{ config, lib, pkgs, self, ... }:
|
||||||
|
|
||||||
|
with lib;
|
||||||
|
|
||||||
|
let cfg = config.modules.services.photoprism;
|
||||||
|
in {
|
||||||
|
options.modules.services.photoprism = {
|
||||||
|
enable = mkOption {
|
||||||
|
default = false;
|
||||||
|
example = true;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
config = mkIf cfg.enable {
|
||||||
|
services.nginx = {
|
||||||
|
virtualHosts = {
|
||||||
|
"gallery.vimium.com" = {
|
||||||
|
forceSSL = true;
|
||||||
|
enableACME = true;
|
||||||
|
locations."/" = {
|
||||||
|
proxyPass = "http://localhost:${toString config.services.photoprism.port}";
|
||||||
|
extraConfig = ''
|
||||||
|
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||||
|
proxy_set_header X-Forwarded-Proto $scheme;
|
||||||
|
proxy_set_header X-Real-IP $remote_addr;
|
||||||
|
proxy_set_header Host $host;
|
||||||
|
|
||||||
|
proxy_buffering off;
|
||||||
|
proxy_http_version 1.1;
|
||||||
|
proxy_set_header Upgrade $http_upgrade;
|
||||||
|
proxy_set_header Connection "upgrade";
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
age.secrets."passwords/services/photoprism/admin" = {
|
||||||
|
file = "${self.inputs.secrets}/passwords/services/photoprism/admin.age";
|
||||||
|
};
|
||||||
|
|
||||||
|
services.photoprism = {
|
||||||
|
enable = true;
|
||||||
|
address = "localhost";
|
||||||
|
passwordFile = config.age.secrets."passwords/services/photoprism/admin".path;
|
||||||
|
originalsPath = "${config.services.photoprism.storagePath}/originals";
|
||||||
|
settings = {
|
||||||
|
PHOTOPRISM_APP_NAME = "Vimium Gallery";
|
||||||
|
PHOTOPRISM_SITE_AUTHOR = "Vimium";
|
||||||
|
PHOTOPRISM_SITE_TITLE = "Vimium Gallery";
|
||||||
|
PHOTOPRISM_SITE_CAPTION = "Vimium Gallery";
|
||||||
|
PHOTOPRISM_DISABLE_TLS = "true";
|
||||||
|
PHOTOPRISM_SPONSOR = "true";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
@ -21,7 +21,7 @@ in {
|
|||||||
|
|
||||||
user.packages = with pkgs; [
|
user.packages = with pkgs; [
|
||||||
fd
|
fd
|
||||||
fzf
|
unstable.fzf
|
||||||
jq
|
jq
|
||||||
nix-zsh-completions
|
nix-zsh-completions
|
||||||
nnn
|
nnn
|
||||||
|
25
overlays/0001-Ignore-IPA-signing.patch
Normal file
25
overlays/0001-Ignore-IPA-signing.patch
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
From 625939e594ce255afa3fab3a40c3e524460e1f8b Mon Sep 17 00:00:00 2001
|
||||||
|
From: Jordan Holt <jordan@vimium.com>
|
||||||
|
Date: Sat, 10 Aug 2024 18:28:08 +0100
|
||||||
|
Subject: [PATCH] Ignore IPA signing
|
||||||
|
|
||||||
|
---
|
||||||
|
src/libcamera/ipa_manager.cpp | 2 +-
|
||||||
|
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||||
|
|
||||||
|
diff --git a/src/libcamera/ipa_manager.cpp b/src/libcamera/ipa_manager.cpp
|
||||||
|
index 6d5bbd05..43004175 100644
|
||||||
|
--- a/src/libcamera/ipa_manager.cpp
|
||||||
|
+++ b/src/libcamera/ipa_manager.cpp
|
||||||
|
@@ -295,7 +295,7 @@ bool IPAManager::isSignatureValid([[maybe_unused]] IPAModule *ipa) const
|
||||||
|
if (data.empty())
|
||||||
|
return false;
|
||||||
|
|
||||||
|
- bool valid = pubKey_.verify(data, ipa->signature());
|
||||||
|
+ bool valid = true;
|
||||||
|
|
||||||
|
LOG(IPAManager, Debug)
|
||||||
|
<< "IPA module " << ipa->path() << " signature is "
|
||||||
|
--
|
||||||
|
2.44.1
|
||||||
|
|
142
overlays/0001-Remove-relative-config-lookups.patch
Normal file
142
overlays/0001-Remove-relative-config-lookups.patch
Normal file
@ -0,0 +1,142 @@
|
|||||||
|
From 57128bb78f56cadf9e2dcca5ba4d710c3bd478a7 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Jordan Holt <jordan@vimium.com>
|
||||||
|
Date: Mon, 5 Aug 2024 21:53:09 +0100
|
||||||
|
Subject: [PATCH] Remove relative config lookups
|
||||||
|
|
||||||
|
---
|
||||||
|
src/libcamera/ipa_manager.cpp | 16 ----------
|
||||||
|
src/libcamera/ipa_proxy.cpp | 48 ++----------------------------
|
||||||
|
src/libcamera/pipeline_handler.cpp | 21 ++-----------
|
||||||
|
3 files changed, 4 insertions(+), 81 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/src/libcamera/ipa_manager.cpp b/src/libcamera/ipa_manager.cpp
|
||||||
|
index f4e0b633..6d5bbd05 100644
|
||||||
|
--- a/src/libcamera/ipa_manager.cpp
|
||||||
|
+++ b/src/libcamera/ipa_manager.cpp
|
||||||
|
@@ -131,22 +131,6 @@ IPAManager::IPAManager()
|
||||||
|
<< "No IPA found in '" << modulePaths << "'";
|
||||||
|
}
|
||||||
|
|
||||||
|
- /*
|
||||||
|
- * When libcamera is used before it is installed, load IPAs from the
|
||||||
|
- * same build directory as the libcamera library itself.
|
||||||
|
- */
|
||||||
|
- std::string root = utils::libcameraBuildPath();
|
||||||
|
- if (!root.empty()) {
|
||||||
|
- std::string ipaBuildPath = root + "src/ipa";
|
||||||
|
- constexpr int maxDepth = 2;
|
||||||
|
-
|
||||||
|
- LOG(IPAManager, Info)
|
||||||
|
- << "libcamera is not installed. Adding '"
|
||||||
|
- << ipaBuildPath << "' to the IPA search path";
|
||||||
|
-
|
||||||
|
- ipaCount += addDir(ipaBuildPath.c_str(), maxDepth);
|
||||||
|
- }
|
||||||
|
-
|
||||||
|
/* Finally try to load IPAs from the installed system path. */
|
||||||
|
ipaCount += addDir(IPA_MODULE_DIR);
|
||||||
|
|
||||||
|
diff --git a/src/libcamera/ipa_proxy.cpp b/src/libcamera/ipa_proxy.cpp
|
||||||
|
index 69975d8f..cd9284a3 100644
|
||||||
|
--- a/src/libcamera/ipa_proxy.cpp
|
||||||
|
+++ b/src/libcamera/ipa_proxy.cpp
|
||||||
|
@@ -122,33 +122,11 @@ std::string IPAProxy::configurationFile(const std::string &name,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
- std::string root = utils::libcameraSourcePath();
|
||||||
|
- if (!root.empty()) {
|
||||||
|
- /*
|
||||||
|
- * When libcamera is used before it is installed, load
|
||||||
|
- * configuration files from the source directory. The
|
||||||
|
- * configuration files are then located in the 'data'
|
||||||
|
- * subdirectory of the corresponding IPA module.
|
||||||
|
- */
|
||||||
|
- std::string ipaConfDir = root + "src/ipa/" + ipaName + "/data";
|
||||||
|
-
|
||||||
|
- LOG(IPAProxy, Info)
|
||||||
|
- << "libcamera is not installed. Loading IPA configuration from '"
|
||||||
|
- << ipaConfDir << "'";
|
||||||
|
-
|
||||||
|
- std::string confPath = ipaConfDir + "/" + name;
|
||||||
|
+ for (const auto &dir : utils::split(IPA_CONFIG_DIR, ":")) {
|
||||||
|
+ std::string confPath = dir + "/" + ipaName + "/" + name;
|
||||||
|
ret = stat(confPath.c_str(), &statbuf);
|
||||||
|
if (ret == 0 && (statbuf.st_mode & S_IFMT) == S_IFREG)
|
||||||
|
return confPath;
|
||||||
|
-
|
||||||
|
- } else {
|
||||||
|
- /* Else look in the system locations. */
|
||||||
|
- for (const auto &dir : utils::split(IPA_CONFIG_DIR, ":")) {
|
||||||
|
- std::string confPath = dir + "/" + ipaName + "/" + name;
|
||||||
|
- ret = stat(confPath.c_str(), &statbuf);
|
||||||
|
- if (ret == 0 && (statbuf.st_mode & S_IFMT) == S_IFREG)
|
||||||
|
- return confPath;
|
||||||
|
- }
|
||||||
|
}
|
||||||
|
|
||||||
|
if (fallbackName.empty()) {
|
||||||
|
@@ -197,28 +175,6 @@ std::string IPAProxy::resolvePath(const std::string &file) const
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
- /*
|
||||||
|
- * When libcamera is used before it is installed, load proxy workers
|
||||||
|
- * from the same build directory as the libcamera directory itself.
|
||||||
|
- * This requires identifying the path of the libcamera.so, and
|
||||||
|
- * referencing a relative path for the proxy workers from that point.
|
||||||
|
- */
|
||||||
|
- std::string root = utils::libcameraBuildPath();
|
||||||
|
- if (!root.empty()) {
|
||||||
|
- std::string ipaProxyDir = root + "src/libcamera/proxy/worker";
|
||||||
|
-
|
||||||
|
- LOG(IPAProxy, Info)
|
||||||
|
- << "libcamera is not installed. Loading proxy workers from '"
|
||||||
|
- << ipaProxyDir << "'";
|
||||||
|
-
|
||||||
|
- std::string proxyPath = ipaProxyDir + proxyFile;
|
||||||
|
- if (!access(proxyPath.c_str(), X_OK))
|
||||||
|
- return proxyPath;
|
||||||
|
-
|
||||||
|
- return std::string();
|
||||||
|
- }
|
||||||
|
-
|
||||||
|
- /* Else try finding the exec target from the install directory. */
|
||||||
|
std::string proxyPath = std::string(IPA_PROXY_DIR) + proxyFile;
|
||||||
|
if (!access(proxyPath.c_str(), X_OK))
|
||||||
|
return proxyPath;
|
||||||
|
diff --git a/src/libcamera/pipeline_handler.cpp b/src/libcamera/pipeline_handler.cpp
|
||||||
|
index 5ea2ca78..fd8555ca 100644
|
||||||
|
--- a/src/libcamera/pipeline_handler.cpp
|
||||||
|
+++ b/src/libcamera/pipeline_handler.cpp
|
||||||
|
@@ -561,25 +561,8 @@ std::string PipelineHandler::configurationFile(const std::string &subdir,
|
||||||
|
struct stat statbuf;
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
- std::string root = utils::libcameraSourcePath();
|
||||||
|
- if (!root.empty()) {
|
||||||
|
- /*
|
||||||
|
- * When libcamera is used before it is installed, load
|
||||||
|
- * configuration files from the source directory. The
|
||||||
|
- * configuration files are then located in the 'data'
|
||||||
|
- * subdirectory of the corresponding pipeline handler.
|
||||||
|
- */
|
||||||
|
- std::string confDir = root + "src/libcamera/pipeline/";
|
||||||
|
- confPath = confDir + subdir + "/data/" + name;
|
||||||
|
-
|
||||||
|
- LOG(Pipeline, Info)
|
||||||
|
- << "libcamera is not installed. Loading platform configuration file from '"
|
||||||
|
- << confPath << "'";
|
||||||
|
- } else {
|
||||||
|
- /* Else look in the system locations. */
|
||||||
|
- confPath = std::string(LIBCAMERA_DATA_DIR)
|
||||||
|
- + "/pipeline/" + subdir + '/' + name;
|
||||||
|
- }
|
||||||
|
+ confPath = std::string(LIBCAMERA_DATA_DIR)
|
||||||
|
+ + "/pipeline/" + subdir + '/' + name;
|
||||||
|
|
||||||
|
ret = stat(confPath.c_str(), &statbuf);
|
||||||
|
if (ret == 0 && (statbuf.st_mode & S_IFMT) == S_IFREG)
|
||||||
|
--
|
||||||
|
2.44.1
|
||||||
|
|
35
overlays/default.nix
Normal file
35
overlays/default.nix
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
final: prev:
|
||||||
|
|
||||||
|
/*
|
||||||
|
Generate an overlay from `pkgs` by handling the `callPackage` behaviour
|
||||||
|
ourselves, making exceptions for namespaced package sets. We cannot reuse
|
||||||
|
the definitions from `self.legacyPackages.${prev.system}`, as that would
|
||||||
|
evaluate nixpkgs twice here (prev.system does not exist then).
|
||||||
|
*/
|
||||||
|
|
||||||
|
let
|
||||||
|
lib = prev.lib;
|
||||||
|
|
||||||
|
pkgs = lib.packagesFromDirectoryRecursive {
|
||||||
|
callPackage = path: overrides: path;
|
||||||
|
directory = ../pkgs;
|
||||||
|
};
|
||||||
|
in
|
||||||
|
lib.mapAttrs
|
||||||
|
(name: value:
|
||||||
|
if lib.isAttrs value then
|
||||||
|
if lib.hasAttrByPath [ name "overrideScope" ] prev then
|
||||||
|
# Namespaced package sets created with `lib.makeScope pkgs.newScope`.
|
||||||
|
prev.${name}.overrideScope (final': prev':
|
||||||
|
lib.mapAttrs (name': value': final'.callPackage value' { }) value)
|
||||||
|
else if lib.hasAttrByPath [ name "extend" ] prev then
|
||||||
|
# Namespaced package sets created with `lib.makeExtensible`.
|
||||||
|
prev.${name}.extend (final': prev':
|
||||||
|
lib.mapAttrs (name': value': final.callPackage value' { }) value)
|
||||||
|
else
|
||||||
|
# Namespaced package sets in regular attrsets.
|
||||||
|
prev.${name} // value
|
||||||
|
else
|
||||||
|
final.callPackage value { })
|
||||||
|
pkgs
|
||||||
|
|
@ -1,10 +1,10 @@
|
|||||||
self: super:
|
final: prev:
|
||||||
{
|
{
|
||||||
gnome = super.gnome.overrideScope' (gself: gsuper: {
|
gnome = prev.gnome.overrideScope' (gself: gsuper: {
|
||||||
mutter = gsuper.mutter.overrideAttrs (oldAttrs: {
|
mutter = gsuper.mutter.overrideAttrs (oldAttrs: {
|
||||||
src = super.fetchurl {
|
src = prev.fetchurl {
|
||||||
url = "https://gitlab.gnome.org/Community/Ubuntu/mutter/-/archive/triple-buffering-v4-45/mutter-triple-buffering-v4-45.tar.gz";
|
url = "https://gitlab.gnome.org/Community/Ubuntu/mutter/-/archive/triple-buffering-v4-46/mutter-triple-buffering-v4-46.tar.gz";
|
||||||
sha256 = "tN+zQ5brk+hc+louIipqPV/Bqft42ghKOzjZZMj5Q8A=";
|
sha256 = "9MVb53tcOTkcXJ025bF2kX1+fGSfffliA43q00x2c/Y=";
|
||||||
};
|
};
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
64
overlays/libcamera.nix
Normal file
64
overlays/libcamera.nix
Normal file
@ -0,0 +1,64 @@
|
|||||||
|
final: prev:
|
||||||
|
{
|
||||||
|
libpisp = final.stdenv.mkDerivation {
|
||||||
|
name = "libpisp";
|
||||||
|
version = "1.0.5";
|
||||||
|
src = final.fetchFromGitHub {
|
||||||
|
owner = "raspberrypi";
|
||||||
|
repo = "libpisp";
|
||||||
|
rev = "v1.0.5";
|
||||||
|
hash = "sha256-CHd44CH5dBcZuK+5fZtONZ8HE/lwGKwK5U0BYUK8gG4=";
|
||||||
|
};
|
||||||
|
|
||||||
|
nativeBuildInputs = with final; [
|
||||||
|
pkg-config
|
||||||
|
meson
|
||||||
|
ninja
|
||||||
|
];
|
||||||
|
|
||||||
|
buildInputs = with final; [
|
||||||
|
nlohmann_json
|
||||||
|
boost
|
||||||
|
];
|
||||||
|
|
||||||
|
BOOST_INCLUDEDIR = "${prev.lib.getDev final.boost}/include";
|
||||||
|
BOOST_LIBRARYDIR = "${prev.lib.getLib final.boost}/lib";
|
||||||
|
};
|
||||||
|
|
||||||
|
libcamera = prev.libcamera.overrideAttrs (old: {
|
||||||
|
src = final.fetchFromGitHub {
|
||||||
|
owner = "raspberrypi";
|
||||||
|
repo = "libcamera";
|
||||||
|
rev = "eb00c13d7c9f937732305d47af5b8ccf895e700f";
|
||||||
|
hash = "sha256-p0/inkHPRUkxSIsTmj7VI7sIaX7OXdqjMGZ31W7cnt4=";
|
||||||
|
};
|
||||||
|
|
||||||
|
postPatch = ''
|
||||||
|
patchShebangs utils/ src/py/
|
||||||
|
'';
|
||||||
|
|
||||||
|
patches = [
|
||||||
|
./0001-Remove-relative-config-lookups.patch
|
||||||
|
./0001-Ignore-IPA-signing.patch
|
||||||
|
];
|
||||||
|
|
||||||
|
buildInputs = old.buildInputs ++ (with final; [
|
||||||
|
libpisp
|
||||||
|
libglibutil
|
||||||
|
]);
|
||||||
|
|
||||||
|
mesonFlags = old.mesonFlags ++ [
|
||||||
|
"--buildtype=release"
|
||||||
|
"-Dpipelines=rpi/vc4,rpi/pisp"
|
||||||
|
"-Dipas=rpi/vc4,rpi/pisp"
|
||||||
|
"-Dgstreamer=enabled"
|
||||||
|
"-Dtest=false"
|
||||||
|
"-Dcam=enabled"
|
||||||
|
"-Dpycamera=disabled"
|
||||||
|
];
|
||||||
|
});
|
||||||
|
|
||||||
|
camera-streamer = prev.callPackage ../pkgs/camera-streamer/package.nix {
|
||||||
|
libcamera = final.libcamera;
|
||||||
|
};
|
||||||
|
}
|
25
pkgs/camera-streamer/0001-Disable-libdatachannel.patch
Normal file
25
pkgs/camera-streamer/0001-Disable-libdatachannel.patch
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
From 0f17bb86772afe9495891e420a809a0b3c071caf Mon Sep 17 00:00:00 2001
|
||||||
|
From: Jordan Holt <jordan@vimium.com>
|
||||||
|
Date: Sat, 10 Aug 2024 15:37:15 +0100
|
||||||
|
Subject: [PATCH] Disable libdatachannel
|
||||||
|
|
||||||
|
---
|
||||||
|
Makefile | 2 +-
|
||||||
|
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||||
|
|
||||||
|
diff --git a/Makefile b/Makefile
|
||||||
|
index d5029bd..e50ba1a 100644
|
||||||
|
--- a/Makefile
|
||||||
|
+++ b/Makefile
|
||||||
|
@@ -23,7 +23,7 @@ USE_HW_H264 ?= 1
|
||||||
|
USE_FFMPEG ?= $(shell pkg-config libavutil libavformat libavcodec && echo 1)
|
||||||
|
USE_LIBCAMERA ?= $(shell pkg-config libcamera && echo 1)
|
||||||
|
USE_RTSP ?= $(shell pkg-config live555 && echo 1)
|
||||||
|
-USE_LIBDATACHANNEL ?= $(shell [ -e $(LIBDATACHANNEL_PATH)/CMakeLists.txt ] && echo 1)
|
||||||
|
+USE_LIBDATACHANNEL ?= 0
|
||||||
|
|
||||||
|
ifeq (1,$(DEBUG))
|
||||||
|
CFLAGS += -g
|
||||||
|
--
|
||||||
|
2.44.1
|
||||||
|
|
78
pkgs/camera-streamer/package.nix
Normal file
78
pkgs/camera-streamer/package.nix
Normal file
@ -0,0 +1,78 @@
|
|||||||
|
{ stdenv
|
||||||
|
, fetchFromGitHub
|
||||||
|
|
||||||
|
, cmake
|
||||||
|
, gnumake
|
||||||
|
, pkg-config
|
||||||
|
, xxd
|
||||||
|
|
||||||
|
, v4l-utils
|
||||||
|
, nlohmann_json
|
||||||
|
, ffmpegSupport ? true
|
||||||
|
, ffmpeg
|
||||||
|
, libcameraSupport ? true
|
||||||
|
, libcamera
|
||||||
|
, rtspSupport ? false
|
||||||
|
, live555
|
||||||
|
, webrtcSupport ? false
|
||||||
|
, openssl
|
||||||
|
|
||||||
|
, lib
|
||||||
|
}:
|
||||||
|
|
||||||
|
stdenv.mkDerivation (finalAttrs: {
|
||||||
|
pname = "camera-streamer";
|
||||||
|
version = "0.2.8";
|
||||||
|
|
||||||
|
src = fetchFromGitHub {
|
||||||
|
owner = "ayufan";
|
||||||
|
repo = "camera-streamer";
|
||||||
|
rev = "refs/tags/v${finalAttrs.version}";
|
||||||
|
hash = "sha256-8vV8BMFoDeh22I1/qxk6zttJROaD/lrThBxXHZSPpT4=";
|
||||||
|
fetchSubmodules = true;
|
||||||
|
};
|
||||||
|
|
||||||
|
patches = [
|
||||||
|
./0001-Disable-libdatachannel.patch
|
||||||
|
];
|
||||||
|
|
||||||
|
# Second replacement fixes literal newline in generated version.h.
|
||||||
|
postPatch = ''
|
||||||
|
substituteInPlace Makefile \
|
||||||
|
--replace '/usr/local/bin' '/bin' \
|
||||||
|
--replace 'echo "#define' 'echo -e "#define'
|
||||||
|
'';
|
||||||
|
|
||||||
|
env.NIX_CFLAGS_COMPILE = builtins.toString [
|
||||||
|
"-Wno-error=stringop-overflow"
|
||||||
|
"-Wno-error=format"
|
||||||
|
"-Wno-format"
|
||||||
|
"-Wno-format-security"
|
||||||
|
"-Wno-error=unused-result"
|
||||||
|
];
|
||||||
|
|
||||||
|
nativeBuildInputs = [
|
||||||
|
cmake
|
||||||
|
gnumake
|
||||||
|
pkg-config
|
||||||
|
xxd
|
||||||
|
];
|
||||||
|
|
||||||
|
dontUseCmakeConfigure = true;
|
||||||
|
|
||||||
|
buildInputs = [ nlohmann_json v4l-utils ]
|
||||||
|
++ (lib.optional ffmpegSupport ffmpeg)
|
||||||
|
++ (lib.optional libcameraSupport libcamera)
|
||||||
|
++ (lib.optional rtspSupport live555)
|
||||||
|
++ (lib.optional webrtcSupport openssl);
|
||||||
|
|
||||||
|
installFlags = [ "DESTDIR=${builtins.placeholder "out"}" ];
|
||||||
|
preInstall = "mkdir -p $out/bin";
|
||||||
|
|
||||||
|
meta = with lib; {
|
||||||
|
description = "High-performance low-latency camera streamer for Raspberry Pi's";
|
||||||
|
website = "https://github.com/ayufan/camera-streamer";
|
||||||
|
license = licenses.gpl3Only;
|
||||||
|
};
|
||||||
|
})
|
||||||
|
|
58
pkgs/rpicam-apps/package.nix
Normal file
58
pkgs/rpicam-apps/package.nix
Normal file
@ -0,0 +1,58 @@
|
|||||||
|
{ stdenv
|
||||||
|
, fetchFromGitHub
|
||||||
|
, meson
|
||||||
|
, ninja
|
||||||
|
, pkg-config
|
||||||
|
, boost
|
||||||
|
, ffmpeg
|
||||||
|
, libcamera
|
||||||
|
, libdrm
|
||||||
|
, libexif
|
||||||
|
, libjpeg
|
||||||
|
, libpng
|
||||||
|
, libtiff
|
||||||
|
, lib
|
||||||
|
}:
|
||||||
|
|
||||||
|
stdenv.mkDerivation (finalAttrs: {
|
||||||
|
pname = "rpicam-apps";
|
||||||
|
version = "1.4.1";
|
||||||
|
|
||||||
|
src = fetchFromGitHub {
|
||||||
|
owner = "raspberrypi";
|
||||||
|
repo = "rpicam-apps";
|
||||||
|
rev = "v" + finalAttrs.version;
|
||||||
|
hash = "sha256-3NG2ZE/Ub3lTbfne0LCXuDgLGTPaAAADRdElEbZwvls=";
|
||||||
|
};
|
||||||
|
|
||||||
|
nativeBuildInputs = [
|
||||||
|
meson
|
||||||
|
ninja
|
||||||
|
pkg-config
|
||||||
|
];
|
||||||
|
|
||||||
|
buildInputs = [
|
||||||
|
boost
|
||||||
|
ffmpeg
|
||||||
|
libcamera
|
||||||
|
libdrm
|
||||||
|
libexif
|
||||||
|
libjpeg
|
||||||
|
libpng
|
||||||
|
libtiff
|
||||||
|
];
|
||||||
|
|
||||||
|
# Meson is no longer able to pick up Boost automatically:
|
||||||
|
# https://github.com/NixOS/nixpkgs/issues/86131
|
||||||
|
BOOST_INCLUDEDIR = "${lib.getDev boost}/include";
|
||||||
|
BOOST_LIBRARYDIR = "${lib.getLib boost}/lib";
|
||||||
|
|
||||||
|
meta = with lib; {
|
||||||
|
description = ''
|
||||||
|
libcamera-based applications to drive the cameras on a Raspberry Pi platform
|
||||||
|
'';
|
||||||
|
homepage = "https://github.com/raspberrypi/rpicam-apps";
|
||||||
|
license = licenses.bsd2;
|
||||||
|
};
|
||||||
|
})
|
||||||
|
|
10
secrets.nix
10
secrets.nix
@ -1,10 +0,0 @@
|
|||||||
let
|
|
||||||
jordan = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAILVHTjsyMIV4THNw6yz0OxAxGnC+41gX72UrPqTzR+OS";
|
|
||||||
users = [ jordan ];
|
|
||||||
|
|
||||||
odyssey = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIJre8/cjdoUnbTu0x4ClTITcq4lq+FjpEyJBbLbOlox7";
|
|
||||||
systems = [ odyssey ];
|
|
||||||
in
|
|
||||||
{
|
|
||||||
"secrets/odyssey_borg_passphrase.age".publicKeys = [ jordan odyssey ];
|
|
||||||
}
|
|
Binary file not shown.
Reference in New Issue
Block a user