treewide: init flakes
This commit is contained in:
commit
79aceaa648
4
.envrc
Normal file
4
.envrc
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
use flake
|
||||||
|
if has sops; then
|
||||||
|
export TF_ENCRYPTION=$(sops --extract '["tofu"]' -d infra/secrets.yaml)
|
||||||
|
fi
|
3
.gitignore
vendored
Normal file
3
.gitignore
vendored
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
result*
|
||||||
|
.direnv
|
||||||
|
.pre-commit-config.yaml
|
29
.sops.yaml
Normal file
29
.sops.yaml
Normal file
|
@ -0,0 +1,29 @@
|
||||||
|
keys:
|
||||||
|
age:
|
||||||
|
- &marisa age1sfnct03u4cvfj98x4yjrcrrnu5gg8qgxrwk4uqq8w4e6wveeaedq97rn44
|
||||||
|
- &flandre age166kxtrcx99fxlgtvz5mvyt5ctvk3dt09f42gvm94ngnkyztmmelsyzdn77
|
||||||
|
- &reisen age1uf2h3hlv373ppdstjlngyuu7q5mee3u3ww3674lsj9rlt9ax7vqsv7wpe8
|
||||||
|
creation_rules:
|
||||||
|
- path_regex: infra/.*
|
||||||
|
key_groups:
|
||||||
|
- age:
|
||||||
|
- *marisa
|
||||||
|
- path_regex: secrets/local.*
|
||||||
|
key_groups:
|
||||||
|
- age:
|
||||||
|
- *marisa
|
||||||
|
- *flandre
|
||||||
|
- path_regex: secrets/hosts/(opentofu/)?marisa-.*
|
||||||
|
key_groups:
|
||||||
|
- age:
|
||||||
|
- *marisa
|
||||||
|
- path_regex: secrets/hosts/(opentofu/)?flandre-.*
|
||||||
|
key_groups:
|
||||||
|
- age:
|
||||||
|
- *marisa
|
||||||
|
- *flandre
|
||||||
|
- path_regex: secrets/hosts/(opentofu/)?reisen-.*
|
||||||
|
key_groups:
|
||||||
|
- age:
|
||||||
|
- *marisa
|
||||||
|
- *reisen
|
21
LICENSE
Normal file
21
LICENSE
Normal file
|
@ -0,0 +1,21 @@
|
||||||
|
MIT License
|
||||||
|
|
||||||
|
Copyright (c) 2024 rebmit
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all
|
||||||
|
copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
SOFTWARE.
|
552
flake.lock
Normal file
552
flake.lock
Normal file
|
@ -0,0 +1,552 @@
|
||||||
|
{
|
||||||
|
"nodes": {
|
||||||
|
"crane": {
|
||||||
|
"inputs": {
|
||||||
|
"nixpkgs": [
|
||||||
|
"lanzaboote",
|
||||||
|
"nixpkgs"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1717535930,
|
||||||
|
"narHash": "sha256-1hZ/txnbd/RmiBPNUs7i8UQw2N89uAK3UzrGAWdnFfU=",
|
||||||
|
"owner": "ipetkov",
|
||||||
|
"repo": "crane",
|
||||||
|
"rev": "55e7754ec31dac78980c8be45f8a28e80e370946",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "ipetkov",
|
||||||
|
"repo": "crane",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"devshell": {
|
||||||
|
"inputs": {
|
||||||
|
"nixpkgs": [
|
||||||
|
"rebmit",
|
||||||
|
"nixpkgs"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1728330715,
|
||||||
|
"narHash": "sha256-xRJ2nPOXb//u1jaBnDP56M7v5ldavjbtR6lfGqSvcKg=",
|
||||||
|
"owner": "numtide",
|
||||||
|
"repo": "devshell",
|
||||||
|
"rev": "dd6b80932022cea34a019e2bb32f6fa9e494dfef",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "numtide",
|
||||||
|
"repo": "devshell",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"disko": {
|
||||||
|
"inputs": {
|
||||||
|
"nixpkgs": [
|
||||||
|
"nixpkgs"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1730135292,
|
||||||
|
"narHash": "sha256-CI27qHAbc3/tIe8sb37kiHNaeCqGxNimckCMj0lW5kg=",
|
||||||
|
"owner": "nix-community",
|
||||||
|
"repo": "disko",
|
||||||
|
"rev": "ab58501b2341bc5e0fc88f2f5983a679b075ddf5",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "nix-community",
|
||||||
|
"ref": "v1.9.0",
|
||||||
|
"repo": "disko",
|
||||||
|
"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-parts": {
|
||||||
|
"inputs": {
|
||||||
|
"nixpkgs-lib": [
|
||||||
|
"rebmit",
|
||||||
|
"nixpkgs"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1730504689,
|
||||||
|
"narHash": "sha256-hgmguH29K2fvs9szpq2r3pz2/8cJd2LPS+b4tfNFCwE=",
|
||||||
|
"owner": "hercules-ci",
|
||||||
|
"repo": "flake-parts",
|
||||||
|
"rev": "506278e768c2a08bec68eb62932193e341f55c90",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "hercules-ci",
|
||||||
|
"repo": "flake-parts",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"flake-utils": {
|
||||||
|
"inputs": {
|
||||||
|
"systems": "systems"
|
||||||
|
},
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1731533236,
|
||||||
|
"narHash": "sha256-l0KFg5HjrsfsO/JpG+r7fRrqm12kzFHyUHqHCVpMMbI=",
|
||||||
|
"owner": "numtide",
|
||||||
|
"repo": "flake-utils",
|
||||||
|
"rev": "11707dc2f618dd54ca8739b309ec4fc024de578b",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "numtide",
|
||||||
|
"repo": "flake-utils",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"git-hooks-nix": {
|
||||||
|
"inputs": {
|
||||||
|
"flake-compat": [
|
||||||
|
"rebmit",
|
||||||
|
"flake-compat"
|
||||||
|
],
|
||||||
|
"gitignore": [
|
||||||
|
"rebmit",
|
||||||
|
"gitignore-nix"
|
||||||
|
],
|
||||||
|
"nixpkgs": [
|
||||||
|
"rebmit",
|
||||||
|
"nixpkgs"
|
||||||
|
],
|
||||||
|
"nixpkgs-stable": [
|
||||||
|
"rebmit",
|
||||||
|
"nixpkgs"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1731363552,
|
||||||
|
"narHash": "sha256-vFta1uHnD29VUY4HJOO/D6p6rxyObnf+InnSMT4jlMU=",
|
||||||
|
"owner": "cachix",
|
||||||
|
"repo": "git-hooks.nix",
|
||||||
|
"rev": "cd1af27aa85026ac759d5d3fccf650abe7e1bbf0",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "cachix",
|
||||||
|
"repo": "git-hooks.nix",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"gitignore-nix": {
|
||||||
|
"inputs": {
|
||||||
|
"nixpkgs": [
|
||||||
|
"rebmit",
|
||||||
|
"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"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"haumea": {
|
||||||
|
"inputs": {
|
||||||
|
"nixpkgs": [
|
||||||
|
"rebmit",
|
||||||
|
"nixpkgs"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1708375098,
|
||||||
|
"narHash": "sha256-DaFJp3wDHgOqx98U0SF57bXaH2Orp106c+jSdPCVu1E=",
|
||||||
|
"owner": "nix-community",
|
||||||
|
"repo": "haumea",
|
||||||
|
"rev": "ec6350fd9353e7f27ce0e85d31f82e3ed73e4d70",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "nix-community",
|
||||||
|
"repo": "haumea",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"home-manager": {
|
||||||
|
"inputs": {
|
||||||
|
"nixpkgs": [
|
||||||
|
"nixpkgs"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1732303962,
|
||||||
|
"narHash": "sha256-5Umjb5AdtxV5jSJd5jxoCckh5mlg+FBQDsyAilu637g=",
|
||||||
|
"owner": "nix-community",
|
||||||
|
"repo": "home-manager",
|
||||||
|
"rev": "8cf9cb2ee78aa129e5b8220135a511a2be254c0c",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "nix-community",
|
||||||
|
"repo": "home-manager",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"impermanence": {
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1731242966,
|
||||||
|
"narHash": "sha256-B3C3JLbGw0FtLSWCjBxU961gLNv+BOOBC6WvstKLYMw=",
|
||||||
|
"owner": "nix-community",
|
||||||
|
"repo": "impermanence",
|
||||||
|
"rev": "3ed3f0eaae9fcc0a8331e77e9319c8a4abd8a71a",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "nix-community",
|
||||||
|
"repo": "impermanence",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"lanzaboote": {
|
||||||
|
"inputs": {
|
||||||
|
"crane": "crane",
|
||||||
|
"flake-compat": [
|
||||||
|
"flake-compat"
|
||||||
|
],
|
||||||
|
"flake-parts": [
|
||||||
|
"flake-parts"
|
||||||
|
],
|
||||||
|
"flake-utils": [
|
||||||
|
"flake-utils"
|
||||||
|
],
|
||||||
|
"nixpkgs": [
|
||||||
|
"nixpkgs"
|
||||||
|
],
|
||||||
|
"pre-commit-hooks-nix": [
|
||||||
|
"git-hooks-nix"
|
||||||
|
],
|
||||||
|
"rust-overlay": "rust-overlay"
|
||||||
|
},
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1718178907,
|
||||||
|
"narHash": "sha256-eSZyrQ9uoPB9iPQ8Y5H7gAmAgAvCw3InStmU3oEjqsE=",
|
||||||
|
"owner": "nix-community",
|
||||||
|
"repo": "lanzaboote",
|
||||||
|
"rev": "b627ccd97d0159214cee5c7db1412b75e4be6086",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "nix-community",
|
||||||
|
"ref": "v0.4.1",
|
||||||
|
"repo": "lanzaboote",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"niri-flake": {
|
||||||
|
"inputs": {
|
||||||
|
"niri-stable": "niri-stable",
|
||||||
|
"niri-unstable": "niri-unstable",
|
||||||
|
"nixpkgs": [
|
||||||
|
"nixpkgs"
|
||||||
|
],
|
||||||
|
"nixpkgs-stable": [
|
||||||
|
"nixpkgs"
|
||||||
|
],
|
||||||
|
"xwayland-satellite-stable": "xwayland-satellite-stable",
|
||||||
|
"xwayland-satellite-unstable": "xwayland-satellite-unstable"
|
||||||
|
},
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1732261496,
|
||||||
|
"narHash": "sha256-GLPyY+OMmiTMPXUwwdFiM4GVwouOSh/hLoPg5D6X2bc=",
|
||||||
|
"owner": "sodiboo",
|
||||||
|
"repo": "niri-flake",
|
||||||
|
"rev": "d4b0bc42a58a4cee1deb19d7d8350384e9aa4240",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "sodiboo",
|
||||||
|
"repo": "niri-flake",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"niri-stable": {
|
||||||
|
"flake": false,
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1731483594,
|
||||||
|
"narHash": "sha256-Qjf7alRbPPERfiZsM9EMKX+HwjESky1tieh5PJIkLwE=",
|
||||||
|
"owner": "YaLTeR",
|
||||||
|
"repo": "niri",
|
||||||
|
"rev": "75c79116a7e40cbc0e110ce0cdd500e896458679",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "YaLTeR",
|
||||||
|
"ref": "v0.1.10.1",
|
||||||
|
"repo": "niri",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"niri-unstable": {
|
||||||
|
"flake": false,
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1732257446,
|
||||||
|
"narHash": "sha256-xTqbonT9ZJ1PkgDvftoyMYuDul8J4VJccOtsOeRorZM=",
|
||||||
|
"owner": "YaLTeR",
|
||||||
|
"repo": "niri",
|
||||||
|
"rev": "c239937fac836f308311eff5f5d5fc5262c6eb55",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "YaLTeR",
|
||||||
|
"repo": "niri",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"nixpkgs-unstable": {
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1731676054,
|
||||||
|
"narHash": "sha256-OZiZ3m8SCMfh3B6bfGC/Bm4x3qc1m2SVEAlkV6iY7Yg=",
|
||||||
|
"owner": "NixOS",
|
||||||
|
"repo": "nixpkgs",
|
||||||
|
"rev": "5e4fbfb6b3de1aa2872b76d49fafc942626e2add",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "NixOS",
|
||||||
|
"ref": "nixos-unstable",
|
||||||
|
"repo": "nixpkgs",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"ranet": {
|
||||||
|
"inputs": {
|
||||||
|
"flake-utils": [
|
||||||
|
"flake-utils"
|
||||||
|
],
|
||||||
|
"nixpkgs": [
|
||||||
|
"nixpkgs"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1728965628,
|
||||||
|
"narHash": "sha256-GB8FXnHzaM06MivfpYEFFIp4q0WfH3a7+jmoC3Tpwbs=",
|
||||||
|
"owner": "NickCao",
|
||||||
|
"repo": "ranet",
|
||||||
|
"rev": "964565690eddec2a660a887aea924c36f358f2a0",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "NickCao",
|
||||||
|
"repo": "ranet",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"rebmit": {
|
||||||
|
"inputs": {
|
||||||
|
"devshell": "devshell",
|
||||||
|
"flake-compat": "flake-compat",
|
||||||
|
"flake-parts": "flake-parts",
|
||||||
|
"git-hooks-nix": "git-hooks-nix",
|
||||||
|
"gitignore-nix": "gitignore-nix",
|
||||||
|
"haumea": "haumea",
|
||||||
|
"nixpkgs": [
|
||||||
|
"rebmit",
|
||||||
|
"nixpkgs-unstable"
|
||||||
|
],
|
||||||
|
"nixpkgs-unstable": "nixpkgs-unstable",
|
||||||
|
"treefmt-nix": "treefmt-nix"
|
||||||
|
},
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1732721386,
|
||||||
|
"narHash": "sha256-UPjh8eXgssjDH7XjMtO9Q9ysWEo9rnwJiX2Gpmt4aJY=",
|
||||||
|
"owner": "rebmit",
|
||||||
|
"repo": "nix-exprs",
|
||||||
|
"rev": "a5973d50b8660c3a87224a58ffd38bedff9559bb",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "rebmit",
|
||||||
|
"repo": "nix-exprs",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"root": {
|
||||||
|
"inputs": {
|
||||||
|
"devshell": [
|
||||||
|
"rebmit",
|
||||||
|
"devshell"
|
||||||
|
],
|
||||||
|
"disko": "disko",
|
||||||
|
"flake-compat": [
|
||||||
|
"rebmit",
|
||||||
|
"flake-compat"
|
||||||
|
],
|
||||||
|
"flake-parts": [
|
||||||
|
"rebmit",
|
||||||
|
"flake-parts"
|
||||||
|
],
|
||||||
|
"flake-utils": "flake-utils",
|
||||||
|
"git-hooks-nix": [
|
||||||
|
"rebmit",
|
||||||
|
"git-hooks-nix"
|
||||||
|
],
|
||||||
|
"home-manager": "home-manager",
|
||||||
|
"impermanence": "impermanence",
|
||||||
|
"lanzaboote": "lanzaboote",
|
||||||
|
"niri-flake": "niri-flake",
|
||||||
|
"nixpkgs": [
|
||||||
|
"rebmit",
|
||||||
|
"nixpkgs"
|
||||||
|
],
|
||||||
|
"nixpkgs-unstable": [
|
||||||
|
"rebmit",
|
||||||
|
"nixpkgs-unstable"
|
||||||
|
],
|
||||||
|
"ranet": "ranet",
|
||||||
|
"rebmit": "rebmit",
|
||||||
|
"sops-nix": "sops-nix",
|
||||||
|
"treefmt-nix": [
|
||||||
|
"rebmit",
|
||||||
|
"treefmt-nix"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"rust-overlay": {
|
||||||
|
"inputs": {
|
||||||
|
"flake-utils": [
|
||||||
|
"lanzaboote",
|
||||||
|
"flake-utils"
|
||||||
|
],
|
||||||
|
"nixpkgs": [
|
||||||
|
"lanzaboote",
|
||||||
|
"nixpkgs"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1717813066,
|
||||||
|
"narHash": "sha256-wqbRwq3i7g5EHIui0bIi84mdqZ/It1AXBSLJ5tafD28=",
|
||||||
|
"owner": "oxalica",
|
||||||
|
"repo": "rust-overlay",
|
||||||
|
"rev": "6dc3e45fe4aee36efeed24d64fc68b1f989d5465",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "oxalica",
|
||||||
|
"repo": "rust-overlay",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"sops-nix": {
|
||||||
|
"inputs": {
|
||||||
|
"nixpkgs": [
|
||||||
|
"nixpkgs"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1732186149,
|
||||||
|
"narHash": "sha256-N9JGWe/T8BC0Tss2Cv30plvZUYoiRmykP7ZdY2on2b0=",
|
||||||
|
"owner": "Mic92",
|
||||||
|
"repo": "sops-nix",
|
||||||
|
"rev": "53c853fb1a7e4f25f68805ee25c83d5de18dc699",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "Mic92",
|
||||||
|
"repo": "sops-nix",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"systems": {
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1681028828,
|
||||||
|
"narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
|
||||||
|
"owner": "nix-systems",
|
||||||
|
"repo": "default",
|
||||||
|
"rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "nix-systems",
|
||||||
|
"repo": "default",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"treefmt-nix": {
|
||||||
|
"inputs": {
|
||||||
|
"nixpkgs": [
|
||||||
|
"rebmit",
|
||||||
|
"nixpkgs"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1730321837,
|
||||||
|
"narHash": "sha256-vK+a09qq19QNu2MlLcvN4qcRctJbqWkX7ahgPZ/+maI=",
|
||||||
|
"owner": "numtide",
|
||||||
|
"repo": "treefmt-nix",
|
||||||
|
"rev": "746901bb8dba96d154b66492a29f5db0693dbfcc",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "numtide",
|
||||||
|
"repo": "treefmt-nix",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"xwayland-satellite-stable": {
|
||||||
|
"flake": false,
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1730166465,
|
||||||
|
"narHash": "sha256-nq7bouXQXaaPPo/E+Jbq+wNHnatD4dY8OxSrRqzvy6s=",
|
||||||
|
"owner": "Supreeeme",
|
||||||
|
"repo": "xwayland-satellite",
|
||||||
|
"rev": "a713cf46cb7db84a0d1b57c3a397c610cad3cf98",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "Supreeeme",
|
||||||
|
"ref": "v0.5",
|
||||||
|
"repo": "xwayland-satellite",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"xwayland-satellite-unstable": {
|
||||||
|
"flake": false,
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1732233710,
|
||||||
|
"narHash": "sha256-gWf9dX6DVx0ssK2G3yrFG9yMT9UU0mDwyD51z/Q6FTA=",
|
||||||
|
"owner": "Supreeeme",
|
||||||
|
"repo": "xwayland-satellite",
|
||||||
|
"rev": "02f30546264ff8407cbb39528b3a3cc3045e53c1",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"owner": "Supreeeme",
|
||||||
|
"repo": "xwayland-satellite",
|
||||||
|
"type": "github"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"root": "root",
|
||||||
|
"version": 7
|
||||||
|
}
|
78
flake.nix
Normal file
78
flake.nix
Normal file
|
@ -0,0 +1,78 @@
|
||||||
|
{
|
||||||
|
description = "a nixos configuration collection by rebmit";
|
||||||
|
|
||||||
|
outputs =
|
||||||
|
inputs@{ flake-parts, rebmit, ... }:
|
||||||
|
flake-parts.lib.mkFlake { inherit inputs; } {
|
||||||
|
inherit (rebmit.lib) systems;
|
||||||
|
imports = [
|
||||||
|
inputs.devshell.flakeModule
|
||||||
|
inputs.git-hooks-nix.flakeModule
|
||||||
|
inputs.treefmt-nix.flakeModule
|
||||||
|
inputs.rebmit.flakeModule
|
||||||
|
] ++ rebmit.lib.path.buildModuleList ./flake;
|
||||||
|
};
|
||||||
|
|
||||||
|
inputs = {
|
||||||
|
# flake-parts
|
||||||
|
|
||||||
|
flake-parts.follows = "rebmit/flake-parts";
|
||||||
|
|
||||||
|
# nixpkgs
|
||||||
|
|
||||||
|
nixpkgs.follows = "rebmit/nixpkgs";
|
||||||
|
nixpkgs-unstable.follows = "rebmit/nixpkgs-unstable";
|
||||||
|
|
||||||
|
# flake modules
|
||||||
|
|
||||||
|
devshell.follows = "rebmit/devshell";
|
||||||
|
git-hooks-nix.follows = "rebmit/git-hooks-nix";
|
||||||
|
treefmt-nix.follows = "rebmit/treefmt-nix";
|
||||||
|
|
||||||
|
# nixos modules
|
||||||
|
|
||||||
|
impermanence.url = "github:nix-community/impermanence";
|
||||||
|
home-manager = {
|
||||||
|
url = "github:nix-community/home-manager";
|
||||||
|
inputs.nixpkgs.follows = "nixpkgs";
|
||||||
|
};
|
||||||
|
sops-nix = {
|
||||||
|
url = "github:Mic92/sops-nix";
|
||||||
|
inputs.nixpkgs.follows = "nixpkgs";
|
||||||
|
};
|
||||||
|
disko = {
|
||||||
|
url = "github:nix-community/disko/v1.9.0";
|
||||||
|
inputs.nixpkgs.follows = "nixpkgs";
|
||||||
|
};
|
||||||
|
lanzaboote = {
|
||||||
|
url = "github:nix-community/lanzaboote/v0.4.1";
|
||||||
|
inputs.nixpkgs.follows = "nixpkgs";
|
||||||
|
inputs.flake-parts.follows = "flake-parts";
|
||||||
|
inputs.flake-utils.follows = "flake-utils";
|
||||||
|
inputs.flake-compat.follows = "flake-compat";
|
||||||
|
inputs.pre-commit-hooks-nix.follows = "git-hooks-nix";
|
||||||
|
};
|
||||||
|
|
||||||
|
# programs
|
||||||
|
|
||||||
|
niri-flake = {
|
||||||
|
url = "github:sodiboo/niri-flake";
|
||||||
|
inputs.nixpkgs.follows = "nixpkgs";
|
||||||
|
inputs.nixpkgs-stable.follows = "nixpkgs";
|
||||||
|
};
|
||||||
|
ranet = {
|
||||||
|
url = "github:NickCao/ranet";
|
||||||
|
inputs.nixpkgs.follows = "nixpkgs";
|
||||||
|
inputs.flake-utils.follows = "flake-utils";
|
||||||
|
};
|
||||||
|
|
||||||
|
# libraries
|
||||||
|
|
||||||
|
rebmit.url = "github:rebmit/nix-exprs";
|
||||||
|
flake-utils.url = "github:numtide/flake-utils";
|
||||||
|
|
||||||
|
# misc
|
||||||
|
|
||||||
|
flake-compat.follows = "rebmit/flake-compat";
|
||||||
|
};
|
||||||
|
}
|
30
flake/devshell.nix
Normal file
30
flake/devshell.nix
Normal file
|
@ -0,0 +1,30 @@
|
||||||
|
{
|
||||||
|
perSystem =
|
||||||
|
{
|
||||||
|
config,
|
||||||
|
pkgs,
|
||||||
|
lib,
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
{
|
||||||
|
devshells.default = {
|
||||||
|
packages = with pkgs; [
|
||||||
|
just
|
||||||
|
sops
|
||||||
|
rage
|
||||||
|
(opentofu.withPlugins (
|
||||||
|
ps: with ps; [
|
||||||
|
sops
|
||||||
|
tls
|
||||||
|
]
|
||||||
|
))
|
||||||
|
];
|
||||||
|
env = [
|
||||||
|
(lib.nameValuePair "DEVSHELL_NO_MOTD" 1)
|
||||||
|
# https://github.com/opentofu/opentofu/issues/1478
|
||||||
|
(lib.nameValuePair "OPENTOFU_STATEFILE_PROVIDER_ADDRESS_TRANSLATION" 0)
|
||||||
|
];
|
||||||
|
devshell.startup.pre-commit-hook.text = config.pre-commit.installationScript;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
73
flake/home-manager.nix
Normal file
73
flake/home-manager.nix
Normal file
|
@ -0,0 +1,73 @@
|
||||||
|
# Portions of this file are sourced from
|
||||||
|
# https://github.com/linyinfeng/dotfiles/blob/b618b0fd16fb9c79ab7199ed51c4c0f98a392cea/flake/hosts.nix
|
||||||
|
{
|
||||||
|
inputs,
|
||||||
|
lib,
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
let
|
||||||
|
inherit (inputs.rebmit.lib.path) buildModuleList rakeLeaves;
|
||||||
|
buildSuites = profiles: f: lib.mapAttrs (_: lib.flatten) (lib.fix (f profiles));
|
||||||
|
|
||||||
|
homeModules = buildModuleList ../home-manager/modules;
|
||||||
|
homeProfiles = rakeLeaves ../home-manager/profiles;
|
||||||
|
homeSuites = buildSuites homeProfiles (
|
||||||
|
profiles: suites: {
|
||||||
|
baseline = with profiles; [
|
||||||
|
# keep-sorted start
|
||||||
|
applications.base
|
||||||
|
fish
|
||||||
|
helix
|
||||||
|
tmux
|
||||||
|
yazi
|
||||||
|
# keep-sorted end
|
||||||
|
];
|
||||||
|
|
||||||
|
development = with profiles; [
|
||||||
|
# keep-sorted start
|
||||||
|
development
|
||||||
|
direnv
|
||||||
|
git
|
||||||
|
# keep-sorted end
|
||||||
|
];
|
||||||
|
|
||||||
|
workstation = suites.baseline ++ suites.development;
|
||||||
|
|
||||||
|
desktop-baseline =
|
||||||
|
suites.baseline
|
||||||
|
++ (with profiles; [
|
||||||
|
# keep-sorted start
|
||||||
|
applications.desktop
|
||||||
|
darkman
|
||||||
|
fcitx5
|
||||||
|
firefox
|
||||||
|
fontconfig
|
||||||
|
gtk
|
||||||
|
kitty
|
||||||
|
qt
|
||||||
|
theme.catppuccin
|
||||||
|
xdg-user-dirs
|
||||||
|
# keep-sorted end
|
||||||
|
]);
|
||||||
|
|
||||||
|
desktop-niri = with profiles; [
|
||||||
|
# keep-sorted start
|
||||||
|
cliphist
|
||||||
|
fuzzel
|
||||||
|
mako
|
||||||
|
niri
|
||||||
|
swaylock
|
||||||
|
swww
|
||||||
|
waybar.niri
|
||||||
|
# keep-sorted end
|
||||||
|
];
|
||||||
|
|
||||||
|
desktop-workstation = suites.workstation ++ suites.desktop-baseline ++ suites.desktop-niri;
|
||||||
|
}
|
||||||
|
);
|
||||||
|
in
|
||||||
|
{
|
||||||
|
passthru = {
|
||||||
|
inherit homeModules homeProfiles homeSuites;
|
||||||
|
};
|
||||||
|
}
|
152
flake/hosts.nix
Normal file
152
flake/hosts.nix
Normal file
|
@ -0,0 +1,152 @@
|
||||||
|
# Portions of this file are sourced from
|
||||||
|
# https://github.com/linyinfeng/dotfiles/blob/b618b0fd16fb9c79ab7199ed51c4c0f98a392cea/flake/hosts.nix
|
||||||
|
{
|
||||||
|
config,
|
||||||
|
inputs,
|
||||||
|
self,
|
||||||
|
lib,
|
||||||
|
getSystem,
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
let
|
||||||
|
inherit (config.passthru)
|
||||||
|
nixosModules
|
||||||
|
nixosProfiles
|
||||||
|
nixosSuites
|
||||||
|
homeModules
|
||||||
|
homeProfiles
|
||||||
|
homeSuites
|
||||||
|
;
|
||||||
|
|
||||||
|
data = builtins.fromJSON (builtins.readFile ../zones/data.json);
|
||||||
|
mylib = inputs.rebmit.lib;
|
||||||
|
|
||||||
|
nixosSpecialArgs = name: {
|
||||||
|
inherit
|
||||||
|
inputs
|
||||||
|
self
|
||||||
|
data
|
||||||
|
mylib
|
||||||
|
;
|
||||||
|
profiles = nixosProfiles;
|
||||||
|
suites = nixosSuites;
|
||||||
|
hostData = data.hosts."${name}";
|
||||||
|
};
|
||||||
|
|
||||||
|
homeSpecialArgs = name: {
|
||||||
|
inherit
|
||||||
|
inputs
|
||||||
|
self
|
||||||
|
data
|
||||||
|
mylib
|
||||||
|
;
|
||||||
|
profiles = homeProfiles;
|
||||||
|
suites = homeSuites;
|
||||||
|
hostData = data.hosts."${name}";
|
||||||
|
};
|
||||||
|
|
||||||
|
commonNixosModules =
|
||||||
|
name:
|
||||||
|
nixosModules
|
||||||
|
++ [
|
||||||
|
inputs.impermanence.nixosModules.impermanence
|
||||||
|
inputs.home-manager.nixosModules.home-manager
|
||||||
|
inputs.sops-nix.nixosModules.sops
|
||||||
|
inputs.disko.nixosModules.disko
|
||||||
|
inputs.lanzaboote.nixosModules.lanzaboote
|
||||||
|
|
||||||
|
(
|
||||||
|
{ ... }:
|
||||||
|
{
|
||||||
|
home-manager = {
|
||||||
|
useGlobalPkgs = true;
|
||||||
|
useUserPackages = true;
|
||||||
|
sharedModules = commonHomeModules name;
|
||||||
|
extraSpecialArgs = homeSpecialArgs name;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
)
|
||||||
|
];
|
||||||
|
|
||||||
|
commonHomeModules =
|
||||||
|
_name:
|
||||||
|
homeModules
|
||||||
|
++ [
|
||||||
|
inputs.niri-flake.homeModules.niri
|
||||||
|
|
||||||
|
(
|
||||||
|
{ osConfig, ... }:
|
||||||
|
{
|
||||||
|
home.stateVersion = osConfig.system.stateVersion;
|
||||||
|
}
|
||||||
|
)
|
||||||
|
];
|
||||||
|
|
||||||
|
mkHost =
|
||||||
|
{
|
||||||
|
name,
|
||||||
|
configurationName ? name,
|
||||||
|
nixpkgs ? inputs.nixpkgs,
|
||||||
|
system,
|
||||||
|
forceFlakeNixpkgs ? true,
|
||||||
|
}:
|
||||||
|
{
|
||||||
|
${name} = nixpkgs.lib.nixosSystem {
|
||||||
|
specialArgs = nixosSpecialArgs name;
|
||||||
|
modules =
|
||||||
|
(commonNixosModules name)
|
||||||
|
++ lib.optional (configurationName != null) ../nixos/hosts/${configurationName}
|
||||||
|
++ [
|
||||||
|
(
|
||||||
|
{ lib, ... }:
|
||||||
|
{
|
||||||
|
networking.hostName = lib.mkDefault name;
|
||||||
|
}
|
||||||
|
)
|
||||||
|
(
|
||||||
|
if forceFlakeNixpkgs then
|
||||||
|
{
|
||||||
|
imports = [ nixpkgs.nixosModules.readOnlyPkgs ];
|
||||||
|
nixpkgs = {
|
||||||
|
inherit ((getSystem system).allModuleArgs) pkgs;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
nixpkgs = {
|
||||||
|
inherit ((getSystem system).nixpkgs) config overlays;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
)
|
||||||
|
];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
in
|
||||||
|
{
|
||||||
|
flake.nixosConfigurations = lib.mkMerge [
|
||||||
|
(mkHost {
|
||||||
|
name = "marisa-7d76";
|
||||||
|
system = "x86_64-linux";
|
||||||
|
})
|
||||||
|
|
||||||
|
(mkHost {
|
||||||
|
name = "marisa-a7s";
|
||||||
|
system = "x86_64-linux";
|
||||||
|
})
|
||||||
|
|
||||||
|
(mkHost {
|
||||||
|
name = "flandre-m5p";
|
||||||
|
system = "x86_64-linux";
|
||||||
|
})
|
||||||
|
|
||||||
|
(mkHost {
|
||||||
|
name = "reisen-sin0";
|
||||||
|
system = "x86_64-linux";
|
||||||
|
})
|
||||||
|
|
||||||
|
(mkHost {
|
||||||
|
name = "reisen-lax0";
|
||||||
|
system = "x86_64-linux";
|
||||||
|
})
|
||||||
|
];
|
||||||
|
}
|
67
flake/nixos.nix
Normal file
67
flake/nixos.nix
Normal file
|
@ -0,0 +1,67 @@
|
||||||
|
# Portions of this file are sourced from
|
||||||
|
# https://github.com/linyinfeng/dotfiles/blob/b618b0fd16fb9c79ab7199ed51c4c0f98a392cea/flake/hosts.nix
|
||||||
|
{
|
||||||
|
inputs,
|
||||||
|
lib,
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
let
|
||||||
|
inherit (inputs.rebmit.lib.path) buildModuleList rakeLeaves;
|
||||||
|
buildSuites = profiles: f: lib.mapAttrs (_: lib.flatten) (lib.fix (f profiles));
|
||||||
|
|
||||||
|
nixosModules = buildModuleList ../nixos/modules;
|
||||||
|
nixosProfiles = rakeLeaves ../nixos/profiles;
|
||||||
|
nixosSuites = buildSuites nixosProfiles (
|
||||||
|
profiles: suites: {
|
||||||
|
baseline = with profiles; [
|
||||||
|
# keep-sorted start
|
||||||
|
programs.tools.common
|
||||||
|
security.polkit
|
||||||
|
services.dbus
|
||||||
|
services.journald
|
||||||
|
services.openssh
|
||||||
|
services.zram-generator
|
||||||
|
system.boot.kernel.latest
|
||||||
|
system.boot.systemd-initrd
|
||||||
|
system.common
|
||||||
|
system.global-persistence
|
||||||
|
system.nix.gc
|
||||||
|
system.nix.registry
|
||||||
|
system.nix.settings
|
||||||
|
system.nix.version
|
||||||
|
users.root
|
||||||
|
# keep-sorted end
|
||||||
|
];
|
||||||
|
|
||||||
|
network = with profiles; [
|
||||||
|
# keep-sorted start
|
||||||
|
programs.tools.network
|
||||||
|
services.firewall
|
||||||
|
services.networkd
|
||||||
|
services.resolved
|
||||||
|
system.boot.sysctl.tcp-bbr
|
||||||
|
# keep-sorted end
|
||||||
|
];
|
||||||
|
|
||||||
|
desktop = with profiles; [
|
||||||
|
# keep-sorted start
|
||||||
|
programs.dconf
|
||||||
|
programs.tools.system
|
||||||
|
security.rtkit
|
||||||
|
services.gnome-keyring
|
||||||
|
services.greetd
|
||||||
|
services.pipewire
|
||||||
|
# keep-sorted end
|
||||||
|
];
|
||||||
|
|
||||||
|
workstation = suites.baseline ++ suites.network ++ suites.desktop;
|
||||||
|
|
||||||
|
server = suites.baseline ++ suites.network;
|
||||||
|
}
|
||||||
|
);
|
||||||
|
in
|
||||||
|
{
|
||||||
|
passthru = {
|
||||||
|
inherit nixosModules nixosProfiles nixosSuites;
|
||||||
|
};
|
||||||
|
}
|
56
flake/nixpkgs.nix
Normal file
56
flake/nixpkgs.nix
Normal file
|
@ -0,0 +1,56 @@
|
||||||
|
{
|
||||||
|
inputs,
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
let
|
||||||
|
overlays = [
|
||||||
|
inputs.ranet.overlays.default
|
||||||
|
|
||||||
|
(_final: prev: {
|
||||||
|
libadwaita = prev.libadwaita.overrideAttrs (old: {
|
||||||
|
patches = (old.patches or [ ]) ++ [
|
||||||
|
../patches/libadwaita-without-adwaita-theme.patch
|
||||||
|
];
|
||||||
|
doCheck = false;
|
||||||
|
});
|
||||||
|
})
|
||||||
|
];
|
||||||
|
in
|
||||||
|
{
|
||||||
|
perSystem =
|
||||||
|
{ config, lib, ... }:
|
||||||
|
{
|
||||||
|
nixpkgs = {
|
||||||
|
config = {
|
||||||
|
allowUnfree = false;
|
||||||
|
allowUnfreePredicate =
|
||||||
|
p:
|
||||||
|
builtins.elem (lib.getName p) [
|
||||||
|
# keep-sorted start
|
||||||
|
# keep-sorted end
|
||||||
|
];
|
||||||
|
|
||||||
|
allowNonSource = false;
|
||||||
|
allowNonSourcePredicate =
|
||||||
|
p:
|
||||||
|
builtins.elem (lib.getName p) [
|
||||||
|
# keep-sorted start
|
||||||
|
"ant"
|
||||||
|
"cargo-bootstrap"
|
||||||
|
"dotnet-sdk"
|
||||||
|
"go"
|
||||||
|
"libreoffice"
|
||||||
|
"rustc-bootstrap"
|
||||||
|
"rustc-bootstrap-wrapper"
|
||||||
|
"sof-firmware"
|
||||||
|
"temurin-bin"
|
||||||
|
"zotero"
|
||||||
|
# keep-sorted end
|
||||||
|
];
|
||||||
|
|
||||||
|
allowInsecurePredicate = p: (p.pname or null) == "olm";
|
||||||
|
};
|
||||||
|
inherit overlays;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
7
flake/packages.nix
Normal file
7
flake/packages.nix
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
{
|
||||||
|
perSystem =
|
||||||
|
{ pkgs, ... }:
|
||||||
|
{
|
||||||
|
legacyPackages = pkgs;
|
||||||
|
};
|
||||||
|
}
|
36
flake/treefmt.nix
Normal file
36
flake/treefmt.nix
Normal file
|
@ -0,0 +1,36 @@
|
||||||
|
{
|
||||||
|
perSystem =
|
||||||
|
{
|
||||||
|
config,
|
||||||
|
lib,
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
{
|
||||||
|
treefmt = {
|
||||||
|
projectRootFile = "flake.nix";
|
||||||
|
programs = {
|
||||||
|
nixfmt.enable = true;
|
||||||
|
deadnix.enable = true;
|
||||||
|
terraform.enable = true;
|
||||||
|
prettier.enable = true;
|
||||||
|
keep-sorted.enable = true;
|
||||||
|
};
|
||||||
|
settings.formatter = {
|
||||||
|
keep-sorted = {
|
||||||
|
includes = lib.mkForce [ "*.nix" ];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
devshells.default.packages = lib.singleton config.treefmt.build.wrapper;
|
||||||
|
|
||||||
|
pre-commit.settings.hooks = {
|
||||||
|
treefmt = {
|
||||||
|
enable = true;
|
||||||
|
name = "treefmt";
|
||||||
|
entry = lib.getExe config.treefmt.build.wrapper;
|
||||||
|
pass_filenames = false;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
53
home-manager/modules/home/global-persistence.nix
Normal file
53
home-manager/modules/home/global-persistence.nix
Normal file
|
@ -0,0 +1,53 @@
|
||||||
|
# Portions of this file are sourced from
|
||||||
|
# https://github.com/linyinfeng/dotfiles/blob/b618b0fd16fb9c79ab7199ed51c4c0f98a392cea/home-manager/modules/home/global-persistence.nix
|
||||||
|
{
|
||||||
|
config,
|
||||||
|
lib,
|
||||||
|
osConfig,
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
with lib;
|
||||||
|
let
|
||||||
|
cfg = config.home.globalPersistence;
|
||||||
|
sysCfg = osConfig.environment.globalPersistence;
|
||||||
|
in
|
||||||
|
{
|
||||||
|
options.home.globalPersistence = {
|
||||||
|
enable = mkEnableOption "global presistence storage";
|
||||||
|
home = mkOption {
|
||||||
|
type = types.str;
|
||||||
|
description = ''
|
||||||
|
Home directory.
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
directories = mkOption {
|
||||||
|
type = with types; listOf str;
|
||||||
|
default = [ ];
|
||||||
|
description = ''
|
||||||
|
A list of directories in your home directory that you want to link to persistent storage.
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
files = mkOption {
|
||||||
|
type = with types; listOf str;
|
||||||
|
default = [ ];
|
||||||
|
description = ''
|
||||||
|
A list of files in your home directory you want to link to persistent storage.
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
enabled = mkOption {
|
||||||
|
type = types.bool;
|
||||||
|
default = false;
|
||||||
|
description = ''
|
||||||
|
Is global home persistence storage enabled.
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
config = mkIf (osConfig != null && sysCfg.enable) {
|
||||||
|
home.globalPersistence = {
|
||||||
|
inherit (sysCfg.user) directories;
|
||||||
|
inherit (sysCfg.user) files;
|
||||||
|
enabled = cfg.enable;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
68
home-manager/modules/theme.nix
Normal file
68
home-manager/modules/theme.nix
Normal file
|
@ -0,0 +1,68 @@
|
||||||
|
{ lib, ... }:
|
||||||
|
with lib;
|
||||||
|
let
|
||||||
|
themeOpts.options = {
|
||||||
|
iconTheme = mkOption {
|
||||||
|
type = types.str;
|
||||||
|
description = ''
|
||||||
|
The icon theme to use.
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
gtkTheme = mkOption {
|
||||||
|
type = types.str;
|
||||||
|
description = ''
|
||||||
|
The GTK theme to use.
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
wallpaper = mkOption {
|
||||||
|
type = types.str;
|
||||||
|
description = ''
|
||||||
|
The path to the wallpaper to use.
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
kittyTheme = mkOption {
|
||||||
|
type = types.str;
|
||||||
|
description = ''
|
||||||
|
The path to the kitty theme to use.
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
helixTheme = mkOption {
|
||||||
|
type = types.str;
|
||||||
|
description = ''
|
||||||
|
The path to the helix theme to use.
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
base24Theme = mkOption { };
|
||||||
|
};
|
||||||
|
in
|
||||||
|
{
|
||||||
|
options.theme = {
|
||||||
|
cursorTheme = mkOption {
|
||||||
|
type = types.str;
|
||||||
|
description = ''
|
||||||
|
The cursor theme to use.
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
cursorSize = mkOption {
|
||||||
|
type = types.int;
|
||||||
|
description = ''
|
||||||
|
The size of the cursor.
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
|
||||||
|
light = mkOption {
|
||||||
|
type = types.submodule themeOpts;
|
||||||
|
default = { };
|
||||||
|
description = ''
|
||||||
|
The light theme configuration.
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
dark = mkOption {
|
||||||
|
type = types.submodule themeOpts;
|
||||||
|
default = { };
|
||||||
|
description = ''
|
||||||
|
The dark theme configuration.
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
13
home-manager/profiles/applications/base.nix
Normal file
13
home-manager/profiles/applications/base.nix
Normal file
|
@ -0,0 +1,13 @@
|
||||||
|
{ pkgs, ... }:
|
||||||
|
{
|
||||||
|
home.packages = with pkgs; [
|
||||||
|
# keep-sorted start
|
||||||
|
fastfetch
|
||||||
|
fd
|
||||||
|
ffmpeg
|
||||||
|
fzf
|
||||||
|
numbat
|
||||||
|
ripgrep
|
||||||
|
# keep-sorted end
|
||||||
|
];
|
||||||
|
}
|
29
home-manager/profiles/applications/desktop.nix
Normal file
29
home-manager/profiles/applications/desktop.nix
Normal file
|
@ -0,0 +1,29 @@
|
||||||
|
{ pkgs, ... }:
|
||||||
|
{
|
||||||
|
home.packages = with pkgs; [
|
||||||
|
# keep-sorted start
|
||||||
|
celluloid
|
||||||
|
foliate
|
||||||
|
libreoffice-fresh
|
||||||
|
loupe
|
||||||
|
nheko
|
||||||
|
papers
|
||||||
|
seahorse
|
||||||
|
tdesktop
|
||||||
|
thunderbird
|
||||||
|
zotero-beta
|
||||||
|
# keep-sorted end
|
||||||
|
];
|
||||||
|
|
||||||
|
home.globalPersistence.directories = [
|
||||||
|
".thunderbird"
|
||||||
|
".zotero"
|
||||||
|
|
||||||
|
".config/nheko"
|
||||||
|
|
||||||
|
".local/share/nheko"
|
||||||
|
".local/share/TelegramDesktop"
|
||||||
|
|
||||||
|
"Zotero"
|
||||||
|
];
|
||||||
|
}
|
63
home-manager/profiles/cliphist/default.nix
Normal file
63
home-manager/profiles/cliphist/default.nix
Normal file
|
@ -0,0 +1,63 @@
|
||||||
|
# Portions of this file are sourced from
|
||||||
|
# https://github.com/linyinfeng/dotfiles/blob/d40b75ca0955d2a999b36fa1bd0f8b3a6e061ef3/home-manager/profiles/niri/default.nix
|
||||||
|
{
|
||||||
|
config,
|
||||||
|
lib,
|
||||||
|
pkgs,
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
let
|
||||||
|
cliphist = pkgs.cliphist;
|
||||||
|
in
|
||||||
|
lib.mkMerge [
|
||||||
|
{
|
||||||
|
home.packages = lib.singleton cliphist;
|
||||||
|
|
||||||
|
systemd.user.services.cliphist = {
|
||||||
|
Unit = {
|
||||||
|
Description = "Clipboard management daemon";
|
||||||
|
ConditionEnvironment = lib.singleton "WAYLAND_DISPLAY";
|
||||||
|
PartOf = [ "graphical-session.target" ];
|
||||||
|
After = [ "graphical-session.target" ];
|
||||||
|
Requisite = [ "graphical-session.target" ];
|
||||||
|
};
|
||||||
|
Install.WantedBy = [ "graphical-session.target" ];
|
||||||
|
Service = {
|
||||||
|
Type = "simple";
|
||||||
|
Restart = "on-failure";
|
||||||
|
ExecStart = "${pkgs.wl-clipboard}/bin/wl-paste --watch ${cliphist}/bin/cliphist store";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
systemd.user.services.cliphist-images = {
|
||||||
|
Unit = {
|
||||||
|
Description = "Clipboard management daemon - images";
|
||||||
|
ConditionEnvironment = lib.singleton "WAYLAND_DISPLAY";
|
||||||
|
PartOf = [ "graphical-session.target" ];
|
||||||
|
After = [ "graphical-session.target" ];
|
||||||
|
Requisite = [ "graphical-session.target" ];
|
||||||
|
};
|
||||||
|
Install.WantedBy = [ "graphical-session.target" ];
|
||||||
|
Service = {
|
||||||
|
Type = "simple";
|
||||||
|
Restart = "on-failure";
|
||||||
|
ExecStart = "${pkgs.wl-clipboard}/bin/wl-paste --type image --watch ${cliphist}/bin/cliphist store";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
||||||
|
(lib.mkIf config.programs.fuzzel.enable {
|
||||||
|
home.packages = with pkgs; [
|
||||||
|
(pkgs.writeShellApplication {
|
||||||
|
name = "cliphist-fuzzel";
|
||||||
|
runtimeInputs = with pkgs; [
|
||||||
|
wl-clipboard
|
||||||
|
config.programs.fuzzel.package
|
||||||
|
config.services.cliphist.package
|
||||||
|
];
|
||||||
|
text = ''
|
||||||
|
cliphist list | fuzzel -d | cliphist decode | wl-copy
|
||||||
|
'';
|
||||||
|
})
|
||||||
|
];
|
||||||
|
})
|
||||||
|
]
|
35
home-manager/profiles/darkman/default.nix
Normal file
35
home-manager/profiles/darkman/default.nix
Normal file
|
@ -0,0 +1,35 @@
|
||||||
|
{
|
||||||
|
config,
|
||||||
|
pkgs,
|
||||||
|
lib,
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
let
|
||||||
|
defaultMode = pkgs.writeText "darkman-default-mode" "light";
|
||||||
|
in
|
||||||
|
{
|
||||||
|
services.darkman.enable = true;
|
||||||
|
|
||||||
|
home.globalPersistence.directories = [ ".cache/darkman" ];
|
||||||
|
|
||||||
|
systemd.user.tmpfiles.rules = [
|
||||||
|
"C %h/.cache/darkman/mode.txt - - - - ${defaultMode}"
|
||||||
|
"z %h/.cache/darkman/mode.txt 644 - - -"
|
||||||
|
];
|
||||||
|
|
||||||
|
home.packages = with pkgs; [
|
||||||
|
(writeShellApplication {
|
||||||
|
name = "toggle-theme";
|
||||||
|
runtimeInputs = lib.singleton config.services.darkman.package;
|
||||||
|
text = ''
|
||||||
|
darkman toggle
|
||||||
|
'';
|
||||||
|
})
|
||||||
|
];
|
||||||
|
|
||||||
|
home.activation.restartDarkman = lib.hm.dag.entryAfter [ "writeBoundary" ] ''
|
||||||
|
if ${config.systemd.user.systemctlPath} --user is-active darkman; then
|
||||||
|
${config.systemd.user.systemctlPath} --user restart darkman
|
||||||
|
fi
|
||||||
|
'';
|
||||||
|
}
|
8
home-manager/profiles/development/default.nix
Normal file
8
home-manager/profiles/development/default.nix
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
{ ... }:
|
||||||
|
{
|
||||||
|
home.globalPersistence.directories = [
|
||||||
|
"Projects"
|
||||||
|
|
||||||
|
".local/share/uv"
|
||||||
|
];
|
||||||
|
}
|
9
home-manager/profiles/direnv/default.nix
Normal file
9
home-manager/profiles/direnv/default.nix
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
{ ... }:
|
||||||
|
{
|
||||||
|
programs.direnv = {
|
||||||
|
enable = true;
|
||||||
|
nix-direnv.enable = true;
|
||||||
|
};
|
||||||
|
|
||||||
|
home.globalPersistence.directories = [ ".local/share/direnv" ];
|
||||||
|
}
|
5
home-manager/profiles/fcitx5/_config/conf/classicui.conf
Normal file
5
home-manager/profiles/fcitx5/_config/conf/classicui.conf
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
EnableFractionalScale=False
|
||||||
|
Font=Sans Serif 11
|
||||||
|
MenuFont=Sans Serif 11
|
||||||
|
TrayFont=Sans Serif 11
|
||||||
|
|
2
home-manager/profiles/fcitx5/_config/conf/clipboard.conf
Normal file
2
home-manager/profiles/fcitx5/_config/conf/clipboard.conf
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
TriggerKey=
|
||||||
|
|
|
@ -0,0 +1,2 @@
|
||||||
|
Toggle Key=
|
||||||
|
|
2
home-manager/profiles/fcitx5/_config/conf/pinyin.conf
Normal file
2
home-manager/profiles/fcitx5/_config/conf/pinyin.conf
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
FirstRun=False
|
||||||
|
|
26
home-manager/profiles/fcitx5/_config/config
Normal file
26
home-manager/profiles/fcitx5/_config/config
Normal file
|
@ -0,0 +1,26 @@
|
||||||
|
[Hotkey]
|
||||||
|
ActivateKeys=
|
||||||
|
AltTriggerKeys=
|
||||||
|
DeactivateKeys=
|
||||||
|
EnumerateBackwardKeys=
|
||||||
|
EnumerateForwardKeys=
|
||||||
|
EnumerateGroupBackwardKeys=
|
||||||
|
EnumerateGroupForwardKeys=
|
||||||
|
EnumerateSkipFirst=False
|
||||||
|
EnumerateWithTriggerKeys=True
|
||||||
|
TogglePreedit=
|
||||||
|
|
||||||
|
[Hotkey/NextCandidate]
|
||||||
|
0=Tab
|
||||||
|
|
||||||
|
[Hotkey/NextPage]
|
||||||
|
0=Down
|
||||||
|
|
||||||
|
[Hotkey/PrevCandidate]
|
||||||
|
0=Shift+Tab
|
||||||
|
|
||||||
|
[Hotkey/PrevPage]
|
||||||
|
0=Up
|
||||||
|
|
||||||
|
[Hotkey/TriggerKeys]
|
||||||
|
0=Super+space
|
13
home-manager/profiles/fcitx5/_config/profile
Normal file
13
home-manager/profiles/fcitx5/_config/profile
Normal file
|
@ -0,0 +1,13 @@
|
||||||
|
[GroupOrder]
|
||||||
|
0=Default
|
||||||
|
|
||||||
|
[Groups/0]
|
||||||
|
Default Layout=us
|
||||||
|
DefaultIM=pinyin
|
||||||
|
Name=Default
|
||||||
|
|
||||||
|
[Groups/0/Items/0]
|
||||||
|
Name=keyboard-us
|
||||||
|
|
||||||
|
[Groups/0/Items/1]
|
||||||
|
Name=pinyin
|
30
home-manager/profiles/fcitx5/default.nix
Normal file
30
home-manager/profiles/fcitx5/default.nix
Normal file
|
@ -0,0 +1,30 @@
|
||||||
|
{ pkgs, lib, ... }:
|
||||||
|
let
|
||||||
|
fcitx5Package = pkgs.qt6Packages.fcitx5-with-addons.override {
|
||||||
|
addons = with pkgs; [
|
||||||
|
qt6Packages.fcitx5-chinese-addons
|
||||||
|
fcitx5-pinyin-zhwiki
|
||||||
|
];
|
||||||
|
withConfigtool = false;
|
||||||
|
};
|
||||||
|
in
|
||||||
|
{
|
||||||
|
home.packages = lib.singleton fcitx5Package;
|
||||||
|
|
||||||
|
systemd.user.services.fcitx5-daemon = {
|
||||||
|
Unit = {
|
||||||
|
Description = "Fcitx5 input method editor";
|
||||||
|
PartOf = [ "graphical-session.target" ];
|
||||||
|
After = [ "graphical-session.target" ];
|
||||||
|
Requisite = [ "graphical-session.target" ];
|
||||||
|
};
|
||||||
|
Service.ExecStart = "${fcitx5Package}/bin/fcitx5";
|
||||||
|
Install.WantedBy = [ "graphical-session.target" ];
|
||||||
|
};
|
||||||
|
|
||||||
|
xdg.configFile."fcitx5" = {
|
||||||
|
source = ./_config;
|
||||||
|
force = true;
|
||||||
|
recursive = true;
|
||||||
|
};
|
||||||
|
}
|
158
home-manager/profiles/firefox/default.nix
Normal file
158
home-manager/profiles/firefox/default.nix
Normal file
|
@ -0,0 +1,158 @@
|
||||||
|
# Portions of this file are sourced from
|
||||||
|
# https://github.com/NickCao/flakes/blob/3b03efb676ea602575c916b2b8bc9d9cd13b0d85/nixos/mainframe/home.nix
|
||||||
|
# https://github.com/llakala/nixos/blob/b3c5fbde5a5f78c91ee658250f9b42418b73a7b7/apps/gui/firefox.nix
|
||||||
|
{
|
||||||
|
lib,
|
||||||
|
pkgs,
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
{
|
||||||
|
programs.firefox.enable = true;
|
||||||
|
|
||||||
|
programs.firefox.policies = {
|
||||||
|
AutofillAddressEnabled = false;
|
||||||
|
AutofillCreditCardEnabled = false;
|
||||||
|
DisableAccounts = true;
|
||||||
|
DisableFirefoxAccounts = true;
|
||||||
|
DisableFirefoxStudies = true;
|
||||||
|
DisablePocket = true;
|
||||||
|
DisableTelemetry = true;
|
||||||
|
EnableTrackingProtection = {
|
||||||
|
Value = true;
|
||||||
|
Locked = true;
|
||||||
|
Cryptomining = true;
|
||||||
|
Fingerprinting = true;
|
||||||
|
EmailTracking = true;
|
||||||
|
};
|
||||||
|
FirefoxHome = {
|
||||||
|
Search = true;
|
||||||
|
TopSites = false;
|
||||||
|
SponsoredTopSites = false;
|
||||||
|
Highlights = false;
|
||||||
|
Pocket = false;
|
||||||
|
SponsoredPocket = false;
|
||||||
|
Snippets = false;
|
||||||
|
Locked = true;
|
||||||
|
};
|
||||||
|
FirefoxSuggest = {
|
||||||
|
WebSuggestions = false;
|
||||||
|
SponsoredSuggestions = false;
|
||||||
|
ImproveSuggest = false;
|
||||||
|
Locked = true;
|
||||||
|
};
|
||||||
|
PasswordManagerEnabled = false;
|
||||||
|
PostQuantumKeyAgreementEnabled = true;
|
||||||
|
SearchSuggestEnabled = false;
|
||||||
|
};
|
||||||
|
|
||||||
|
programs.firefox.policies.ExtensionSettings = {
|
||||||
|
"{446900e4-71c2-419f-a6a7-df9c091e268b}" = {
|
||||||
|
installation_mode = "force_installed";
|
||||||
|
install_url = "https://addons.mozilla.org/firefox/downloads/latest/bitwarden-password-manager/latest.xpi";
|
||||||
|
};
|
||||||
|
"uBlock0@raymondhill.net" = {
|
||||||
|
installation_mode = "force_installed";
|
||||||
|
install_url = "https://addons.mozilla.org/firefox/downloads/latest/ublock-origin/latest.xpi";
|
||||||
|
};
|
||||||
|
"addon@darkreader.org" = {
|
||||||
|
installation_mode = "force_installed";
|
||||||
|
install_url = "https://addons.mozilla.org/firefox/downloads/latest/darkreader/latest.xpi";
|
||||||
|
};
|
||||||
|
"@testpilot-containers" = {
|
||||||
|
installation_mode = "force_installed";
|
||||||
|
install_url = "https://addons.mozilla.org/firefox/downloads/latest/multi-account-containers/latest.xpi";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
programs.firefox.policies.Preferences = {
|
||||||
|
"browser.urlbar.autoFill.adaptiveHistory.enabled" = true;
|
||||||
|
"browser.tabs.closeWindowWithLastTab" = false;
|
||||||
|
"browser.tabs.inTitlebar" = 0;
|
||||||
|
};
|
||||||
|
|
||||||
|
programs.firefox.policies.Preferences."browser.uiCustomization.state" = builtins.toJSON {
|
||||||
|
placements = {
|
||||||
|
widget-overflow-fixed-list = [ ];
|
||||||
|
nav-bar = [
|
||||||
|
"back-button"
|
||||||
|
"forward-button"
|
||||||
|
"stop-reload-button"
|
||||||
|
"sidebar-button"
|
||||||
|
"urlbar-container"
|
||||||
|
"downloads-button"
|
||||||
|
"unified-extensions-button"
|
||||||
|
"fxa-toolbar-menu-button"
|
||||||
|
];
|
||||||
|
toolbar-menubar = [ "menubar-items" ];
|
||||||
|
TabsToolbar = [ ];
|
||||||
|
vertical-tabs = [ "tabbrowser-tabs" ];
|
||||||
|
PersonalToolbar = [ "personal-bookmarks" ];
|
||||||
|
};
|
||||||
|
currentVersion = 20;
|
||||||
|
newElementCount = 0;
|
||||||
|
};
|
||||||
|
|
||||||
|
programs.firefox.profiles.default = {
|
||||||
|
isDefault = true;
|
||||||
|
search = {
|
||||||
|
force = true;
|
||||||
|
default = "Google";
|
||||||
|
};
|
||||||
|
containersForce = true;
|
||||||
|
containers = {
|
||||||
|
"Domestic" = {
|
||||||
|
id = 1;
|
||||||
|
color = "green";
|
||||||
|
icon = "fingerprint";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
settings = {
|
||||||
|
"sidebar.revamp" = true;
|
||||||
|
"sidebar.verticalTabs" = true;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
programs.firefox.profiles.default.search.engines = {
|
||||||
|
"Bing".metaData.hidden = true;
|
||||||
|
"eBay".metaData.hidden = true;
|
||||||
|
"Amazon.com".metaData.hidden = true;
|
||||||
|
"Wikipedia (en)".metaData.hidden = true;
|
||||||
|
"Nixpkgs" = {
|
||||||
|
urls = lib.singleton {
|
||||||
|
template = "https://search.nixos.org/packages";
|
||||||
|
params = lib.attrsToList {
|
||||||
|
"channel" = "unstable";
|
||||||
|
"query" = "{searchTerms}";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
icon = "${pkgs.nixos-icons}/share/icons/hicolor/scalable/apps/nix-snowflake.svg";
|
||||||
|
definedAliases = [ "@np" ];
|
||||||
|
};
|
||||||
|
"NixOS Options" = {
|
||||||
|
urls = lib.singleton {
|
||||||
|
template = "https://search.nixos.org/options";
|
||||||
|
params = lib.attrsToList {
|
||||||
|
"channel" = "unstable";
|
||||||
|
"query" = "{searchTerms}";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
icon = "${pkgs.nixos-icons}/share/icons/hicolor/scalable/apps/nix-snowflake.svg";
|
||||||
|
definedAliases = [ "@no" ];
|
||||||
|
};
|
||||||
|
"Home Manager Options" = {
|
||||||
|
urls = lib.singleton {
|
||||||
|
template = "https://home-manager-options.extranix.com";
|
||||||
|
params = lib.attrsToList {
|
||||||
|
"release" = "master";
|
||||||
|
"query" = "{searchTerms}";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
iconUpdateURL = "https://home-manager-options.extranix.com/images/favicon.png";
|
||||||
|
definedAliases = [ "@ho" ];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
home.globalPersistence.directories = [ ".mozilla" ];
|
||||||
|
|
||||||
|
programs.niri.browser = lib.mkDefault [ "firefox" ];
|
||||||
|
}
|
43
home-manager/profiles/fish/default.nix
Normal file
43
home-manager/profiles/fish/default.nix
Normal file
|
@ -0,0 +1,43 @@
|
||||||
|
# Portions of this file are sourced from
|
||||||
|
# https://github.com/NickCao/flakes/blob/3b03efb676ea602575c916b2b8bc9d9cd13b0d85/nixos/mainframe/home.nix
|
||||||
|
{ pkgs, ... }:
|
||||||
|
{
|
||||||
|
programs.fish = {
|
||||||
|
enable = true;
|
||||||
|
plugins = [
|
||||||
|
{
|
||||||
|
name = "tide";
|
||||||
|
src = pkgs.fishPlugins.tide.src;
|
||||||
|
}
|
||||||
|
{
|
||||||
|
name = "autopair";
|
||||||
|
src = pkgs.fishPlugins.autopair.src;
|
||||||
|
}
|
||||||
|
];
|
||||||
|
shellInit = ''
|
||||||
|
set fish_greeting
|
||||||
|
|
||||||
|
set fish_cursor_default block
|
||||||
|
set fish_cursor_insert line
|
||||||
|
set fish_cursor_replace_one underscore
|
||||||
|
set fish_cursor_replace underscore
|
||||||
|
set fish_cursor_external line
|
||||||
|
set fish_cursor_visual block
|
||||||
|
|
||||||
|
function fish_user_key_bindings
|
||||||
|
fish_vi_key_bindings
|
||||||
|
bind f accept-autosuggestion
|
||||||
|
end
|
||||||
|
|
||||||
|
string replace -r '^' 'set -g ' < ${pkgs.fishPlugins.tide.src}/functions/tide/configure/icons.fish | source
|
||||||
|
string replace -r '^' 'set -g ' < ${pkgs.fishPlugins.tide.src}/functions/tide/configure/configs/lean.fish | source
|
||||||
|
string replace -r '^' 'set -g ' < ${pkgs.fishPlugins.tide.src}/functions/tide/configure/configs/lean_16color.fish | source
|
||||||
|
set -g tide_prompt_add_newline_before false
|
||||||
|
|
||||||
|
fish_config theme choose fish\ default
|
||||||
|
set fish_color_autosuggestion white
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
|
||||||
|
home.globalPersistence.directories = [ ".local/share/fish" ];
|
||||||
|
}
|
15
home-manager/profiles/fontconfig/default.nix
Normal file
15
home-manager/profiles/fontconfig/default.nix
Normal file
|
@ -0,0 +1,15 @@
|
||||||
|
{ pkgs, ... }:
|
||||||
|
{
|
||||||
|
home.packages = with pkgs; [
|
||||||
|
noto-fonts
|
||||||
|
noto-fonts-cjk-sans
|
||||||
|
noto-fonts-cjk-serif
|
||||||
|
noto-fonts-emoji
|
||||||
|
roboto-mono
|
||||||
|
(nerdfonts.override { fonts = [ "RobotoMono" ]; })
|
||||||
|
];
|
||||||
|
|
||||||
|
fonts.fontconfig.enable = true;
|
||||||
|
|
||||||
|
xdg.configFile."fontconfig/conf.d/30-default-fonts.conf".source = ./fonts.conf;
|
||||||
|
}
|
174
home-manager/profiles/fontconfig/fonts.conf
Normal file
174
home-manager/profiles/fontconfig/fonts.conf
Normal file
|
@ -0,0 +1,174 @@
|
||||||
|
<?xml version="1.0"?>
|
||||||
|
<!DOCTYPE fontconfig SYSTEM "urn:fontconfig:fonts.dtd">
|
||||||
|
<!-- https://catcat.cc/post/2021-03-07/ -->
|
||||||
|
<fontconfig>
|
||||||
|
|
||||||
|
<match target="pattern">
|
||||||
|
<test name="family">
|
||||||
|
<string>system-ui</string>
|
||||||
|
</test>
|
||||||
|
<edit name="family" mode="prepend" binding="strong">
|
||||||
|
<string>sans-serif</string>
|
||||||
|
</edit>
|
||||||
|
</match>
|
||||||
|
|
||||||
|
<match target="pattern">
|
||||||
|
<test name="family">
|
||||||
|
<string>sans-serif</string>
|
||||||
|
</test>
|
||||||
|
<edit name="family" mode="prepend" binding="strong">
|
||||||
|
<string>Noto Sans</string>
|
||||||
|
<string>Noto Sans CJK SC</string>
|
||||||
|
</edit>
|
||||||
|
</match>
|
||||||
|
|
||||||
|
<match target="pattern">
|
||||||
|
<test name="family">
|
||||||
|
<string>serif</string>
|
||||||
|
</test>
|
||||||
|
<edit name="family" mode="prepend" binding="strong">
|
||||||
|
<string>Noto Serif</string>
|
||||||
|
<string>Noto Serif CJK SC</string>
|
||||||
|
</edit>
|
||||||
|
</match>
|
||||||
|
|
||||||
|
<match target="pattern">
|
||||||
|
<test name="family">
|
||||||
|
<string>monospace</string>
|
||||||
|
</test>
|
||||||
|
<edit name="family" mode="prepend" binding="strong">
|
||||||
|
<string>RobotoMono Nerd Font Mono</string>
|
||||||
|
<string>Noto Sans Mono CJK SC</string>
|
||||||
|
</edit>
|
||||||
|
</match>
|
||||||
|
|
||||||
|
<match target="pattern">
|
||||||
|
<test name="family">
|
||||||
|
<string>emoji</string>
|
||||||
|
</test>
|
||||||
|
<edit name="family" mode="prepend" binding="strong">
|
||||||
|
<string>Noto Color Emoji</string>
|
||||||
|
</edit>
|
||||||
|
</match>
|
||||||
|
|
||||||
|
<match target="pattern">
|
||||||
|
<test name="lang" compare="contains">
|
||||||
|
<string>ja</string>
|
||||||
|
</test>
|
||||||
|
<test name="family" compare="contains">
|
||||||
|
<string>Noto Sans CJK SC</string>
|
||||||
|
</test>
|
||||||
|
<edit name="family" mode="prepend" binding="strong">
|
||||||
|
<string>Noto Sans CJK JP</string>
|
||||||
|
</edit>
|
||||||
|
</match>
|
||||||
|
|
||||||
|
<match target="pattern">
|
||||||
|
<test name="lang" compare="contains">
|
||||||
|
<string>ja</string>
|
||||||
|
</test>
|
||||||
|
<test name="family" compare="contains">
|
||||||
|
<string>Noto Serif CJK SC</string>
|
||||||
|
</test>
|
||||||
|
<edit name="family" mode="prepend" binding="strong">
|
||||||
|
<string>Noto Serif CJK JP</string>
|
||||||
|
</edit>
|
||||||
|
</match>
|
||||||
|
|
||||||
|
<match target="pattern">
|
||||||
|
<test name="lang" compare="contains">
|
||||||
|
<string>ko</string>
|
||||||
|
</test>
|
||||||
|
<test name="family" compare="contains">
|
||||||
|
<string>Noto Sans CJK SC</string>
|
||||||
|
</test>
|
||||||
|
<edit name="family" mode="prepend" binding="strong">
|
||||||
|
<string>Noto Sans CJK KR</string>
|
||||||
|
</edit>
|
||||||
|
</match>
|
||||||
|
|
||||||
|
<match target="pattern">
|
||||||
|
<test name="lang" compare="contains">
|
||||||
|
<string>ko</string>
|
||||||
|
</test>
|
||||||
|
<test name="family" compare="contains">
|
||||||
|
<string>Noto Serif CJK SC</string>
|
||||||
|
</test>
|
||||||
|
<edit name="family" mode="prepend" binding="strong">
|
||||||
|
<string>Noto Serif CJK KR</string>
|
||||||
|
</edit>
|
||||||
|
</match>
|
||||||
|
|
||||||
|
<match target="pattern">
|
||||||
|
<test name="lang" compare="contains">
|
||||||
|
<string>zh-CN</string>
|
||||||
|
</test>
|
||||||
|
<test name="family" compare="contains">
|
||||||
|
<string>Noto Sans</string>
|
||||||
|
</test>
|
||||||
|
<edit name="family" mode="prepend" binding="strong">
|
||||||
|
<string>Noto Sans CJK SC</string>
|
||||||
|
</edit>
|
||||||
|
</match>
|
||||||
|
|
||||||
|
<match target="pattern">
|
||||||
|
<test name="lang" compare="contains">
|
||||||
|
<string>zh-CN</string>
|
||||||
|
</test>
|
||||||
|
<test name="family" compare="contains">
|
||||||
|
<string>Noto Serif</string>
|
||||||
|
</test>
|
||||||
|
<edit name="family" mode="prepend" binding="strong">
|
||||||
|
<string>Noto Serif CJK SC</string>
|
||||||
|
</edit>
|
||||||
|
</match>
|
||||||
|
|
||||||
|
<match target="pattern">
|
||||||
|
<test name="lang" compare="contains">
|
||||||
|
<string>zh-HK</string>
|
||||||
|
</test>
|
||||||
|
<test name="family" compare="contains">
|
||||||
|
<string>Noto Sans CJK SC</string>
|
||||||
|
</test>
|
||||||
|
<edit name="family" mode="prepend" binding="strong">
|
||||||
|
<string>Noto Sans CJK HK</string>
|
||||||
|
</edit>
|
||||||
|
</match>
|
||||||
|
|
||||||
|
<match target="pattern">
|
||||||
|
<test name="lang" compare="contains">
|
||||||
|
<string>zh-HK</string>
|
||||||
|
</test>
|
||||||
|
<test name="family" compare="contains">
|
||||||
|
<string>Noto Serif CJK SC</string>
|
||||||
|
</test>
|
||||||
|
<edit name="family" mode="prepend" binding="strong">
|
||||||
|
<string>Noto Serif CJK HK</string>
|
||||||
|
</edit>
|
||||||
|
</match>
|
||||||
|
|
||||||
|
<match target="pattern">
|
||||||
|
<test name="lang" compare="contains">
|
||||||
|
<string>zh-TW</string>
|
||||||
|
</test>
|
||||||
|
<test name="family" compare="contains">
|
||||||
|
<string>Noto Sans CJK SC</string>
|
||||||
|
</test>
|
||||||
|
<edit name="family" mode="prepend" binding="strong">
|
||||||
|
<string>Noto Sans CJK TC</string>
|
||||||
|
</edit>
|
||||||
|
</match>
|
||||||
|
|
||||||
|
<match target="pattern">
|
||||||
|
<test name="lang" compare="contains">
|
||||||
|
<string>zh-TW</string>
|
||||||
|
</test>
|
||||||
|
<test name="family" compare="contains">
|
||||||
|
<string>Noto Serif CJK SC</string>
|
||||||
|
</test>
|
||||||
|
<edit name="family" mode="prepend" binding="strong">
|
||||||
|
<string>Noto Serif CJK TC</string>
|
||||||
|
</edit>
|
||||||
|
</match>
|
||||||
|
|
||||||
|
</fontconfig>
|
69
home-manager/profiles/fuzzel/default.nix
Normal file
69
home-manager/profiles/fuzzel/default.nix
Normal file
|
@ -0,0 +1,69 @@
|
||||||
|
{
|
||||||
|
config,
|
||||||
|
pkgs,
|
||||||
|
lib,
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
let
|
||||||
|
mkTheme =
|
||||||
|
mode:
|
||||||
|
let
|
||||||
|
inherit (config.theme.${mode}.base24Theme)
|
||||||
|
base00
|
||||||
|
base04
|
||||||
|
base05
|
||||||
|
base08
|
||||||
|
base0D
|
||||||
|
;
|
||||||
|
in
|
||||||
|
(pkgs.formats.ini { }).generate "fuzzel-theme-${mode}.ini" {
|
||||||
|
colors = {
|
||||||
|
background = "${base00}dd";
|
||||||
|
text = "${base05}ff";
|
||||||
|
match = "${base08}ff";
|
||||||
|
selection = "${base04}ff";
|
||||||
|
selection-text = "${base05}ff";
|
||||||
|
selection-match = "${base08}ff";
|
||||||
|
border = "${base0D}ff";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
in
|
||||||
|
{
|
||||||
|
programs.fuzzel = {
|
||||||
|
enable = true;
|
||||||
|
settings = {
|
||||||
|
main = {
|
||||||
|
fields = "filename,name,generic,exec,keywords";
|
||||||
|
font = "monospace:size=11";
|
||||||
|
dpi-aware = "no";
|
||||||
|
layer = "overlay";
|
||||||
|
};
|
||||||
|
border = {
|
||||||
|
width = "2";
|
||||||
|
radius = "0";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
programs.fuzzel.settings.main.include = "~/.config/fuzzel/theme.ini";
|
||||||
|
|
||||||
|
systemd.user.tmpfiles.rules = [
|
||||||
|
"L %h/.config/fuzzel/theme.ini - - - - ${mkTheme "light"}"
|
||||||
|
];
|
||||||
|
|
||||||
|
services.darkman =
|
||||||
|
let
|
||||||
|
mkScript =
|
||||||
|
mode:
|
||||||
|
pkgs.writeShellApplication {
|
||||||
|
name = "darkman-switch-fuzzel-${mode}";
|
||||||
|
text = ''
|
||||||
|
ln --force --symbolic --verbose "${mkTheme mode}" "$HOME/.config/fuzzel/theme.ini"
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
in
|
||||||
|
{
|
||||||
|
lightModeScripts.fuzzel = "${lib.getExe (mkScript "light")}";
|
||||||
|
darkModeScripts.fuzzel = "${lib.getExe (mkScript "dark")}";
|
||||||
|
};
|
||||||
|
}
|
16
home-manager/profiles/git/default.nix
Normal file
16
home-manager/profiles/git/default.nix
Normal file
|
@ -0,0 +1,16 @@
|
||||||
|
{ lib, ... }:
|
||||||
|
{
|
||||||
|
programs.git = {
|
||||||
|
enable = true;
|
||||||
|
lfs.enable = true;
|
||||||
|
extraConfig = {
|
||||||
|
commit.gpgSign = true;
|
||||||
|
gpg.format = "ssh";
|
||||||
|
pull.rebase = true;
|
||||||
|
init.defaultBranch = "master";
|
||||||
|
fetch.prune = true;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
programs.git.signing.key = lib.mkDefault "~/.ssh/id_ed25519";
|
||||||
|
}
|
49
home-manager/profiles/gtk/default.nix
Normal file
49
home-manager/profiles/gtk/default.nix
Normal file
|
@ -0,0 +1,49 @@
|
||||||
|
{
|
||||||
|
config,
|
||||||
|
lib,
|
||||||
|
pkgs,
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
{
|
||||||
|
gtk = {
|
||||||
|
enable = true;
|
||||||
|
gtk2.configLocation = "${config.xdg.configHome}/gtk-2.0/gtkrc";
|
||||||
|
cursorTheme = {
|
||||||
|
name = config.theme.cursorTheme;
|
||||||
|
size = config.theme.cursorSize;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
# https://github.com/nix-community/home-manager/pull/5206
|
||||||
|
# https://github.com/nix-community/home-manager/commit/e9b9ecef4295a835ab073814f100498716b05a96
|
||||||
|
xdg.configFile."gtk-4.0/gtk.css" = lib.mkForce {
|
||||||
|
text = config.gtk.gtk4.extraCss;
|
||||||
|
};
|
||||||
|
|
||||||
|
services.darkman =
|
||||||
|
let
|
||||||
|
mkScript =
|
||||||
|
mode:
|
||||||
|
let
|
||||||
|
inherit (config.theme.${mode})
|
||||||
|
gtkTheme
|
||||||
|
iconTheme
|
||||||
|
;
|
||||||
|
in
|
||||||
|
pkgs.writeShellApplication {
|
||||||
|
name = "darkman-switch-gtk-${mode}";
|
||||||
|
runtimeInputs = with pkgs; [
|
||||||
|
dconf
|
||||||
|
];
|
||||||
|
text = ''
|
||||||
|
dconf write /org/gnome/desktop/interface/color-scheme "'prefer-${mode}'"
|
||||||
|
dconf write /org/gnome/desktop/interface/gtk-theme "'${gtkTheme}'"
|
||||||
|
dconf write /org/gnome/desktop/interface/icon-theme "'${iconTheme}'"
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
in
|
||||||
|
{
|
||||||
|
lightModeScripts.gtk = "${lib.getExe (mkScript "light")}";
|
||||||
|
darkModeScripts.gtk = "${lib.getExe (mkScript "dark")}";
|
||||||
|
};
|
||||||
|
}
|
75
home-manager/profiles/helix/default.nix
Normal file
75
home-manager/profiles/helix/default.nix
Normal file
|
@ -0,0 +1,75 @@
|
||||||
|
{
|
||||||
|
config,
|
||||||
|
pkgs,
|
||||||
|
lib,
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
{
|
||||||
|
programs.helix = {
|
||||||
|
enable = true;
|
||||||
|
defaultEditor = true;
|
||||||
|
settings = {
|
||||||
|
editor = {
|
||||||
|
line-number = "relative";
|
||||||
|
cursorline = true;
|
||||||
|
bufferline = "multiple";
|
||||||
|
color-modes = true;
|
||||||
|
lsp.display-messages = true;
|
||||||
|
cursor-shape = {
|
||||||
|
insert = "bar";
|
||||||
|
normal = "block";
|
||||||
|
select = "underline";
|
||||||
|
};
|
||||||
|
indent-guides.render = true;
|
||||||
|
};
|
||||||
|
keys = {
|
||||||
|
normal = {
|
||||||
|
esc = [
|
||||||
|
"keep_primary_selection"
|
||||||
|
"collapse_selection"
|
||||||
|
];
|
||||||
|
S = ":w";
|
||||||
|
Q = ":q";
|
||||||
|
J = lib.replicate 5 "move_visual_line_down";
|
||||||
|
K = lib.replicate 5 "move_visual_line_up";
|
||||||
|
H = lib.replicate 5 "move_char_left";
|
||||||
|
L = lib.replicate 5 "move_char_right";
|
||||||
|
};
|
||||||
|
select = {
|
||||||
|
J = lib.replicate 5 "extend_line_down";
|
||||||
|
K = lib.replicate 5 "extend_line_up";
|
||||||
|
H = lib.replicate 5 "extend_char_left";
|
||||||
|
L = lib.replicate 5 "extend_char_right";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
programs.helix.settings.theme = "custom";
|
||||||
|
|
||||||
|
systemd.user.tmpfiles.rules = [
|
||||||
|
"L %h/.config/helix/themes/custom.toml - - - - ${config.theme.light.helixTheme}"
|
||||||
|
];
|
||||||
|
|
||||||
|
services.darkman =
|
||||||
|
let
|
||||||
|
mkScript =
|
||||||
|
mode:
|
||||||
|
pkgs.writeShellApplication {
|
||||||
|
name = "darkman-switch-helix-${mode}";
|
||||||
|
runtimeInputs = with pkgs; [
|
||||||
|
procps
|
||||||
|
];
|
||||||
|
text = ''
|
||||||
|
ln --force --symbolic --verbose "${
|
||||||
|
config.theme.${mode}.helixTheme
|
||||||
|
}" "$HOME/.config/helix/themes/custom.toml"
|
||||||
|
pkill -USR1 -u "$USER" hx || true
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
in
|
||||||
|
{
|
||||||
|
lightModeScripts.helix = "${lib.getExe (mkScript "light")}";
|
||||||
|
darkModeScripts.helix = "${lib.getExe (mkScript "dark")}";
|
||||||
|
};
|
||||||
|
}
|
55
home-manager/profiles/kitty/default.nix
Normal file
55
home-manager/profiles/kitty/default.nix
Normal file
|
@ -0,0 +1,55 @@
|
||||||
|
{
|
||||||
|
config,
|
||||||
|
lib,
|
||||||
|
pkgs,
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
{
|
||||||
|
programs.kitty = {
|
||||||
|
enable = true;
|
||||||
|
font = {
|
||||||
|
name = "monospace";
|
||||||
|
size = 12.0;
|
||||||
|
};
|
||||||
|
settings = {
|
||||||
|
background_opacity = "0.95";
|
||||||
|
hide_window_decorations = "yes";
|
||||||
|
confirm_os_window_close = "0";
|
||||||
|
enable_audio_bell = "no";
|
||||||
|
map = "kitty_mod+t no_op";
|
||||||
|
};
|
||||||
|
extraConfig = ''
|
||||||
|
include theme.conf
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
|
||||||
|
programs.fuzzel.settings.main.terminal = lib.mkDefault "kitty";
|
||||||
|
|
||||||
|
programs.niri.terminal = lib.mkDefault [ "kitty" ];
|
||||||
|
|
||||||
|
systemd.user.tmpfiles.rules = [
|
||||||
|
"L %h/.config/kitty/theme.conf - - - - ${config.theme.light.kittyTheme}"
|
||||||
|
];
|
||||||
|
|
||||||
|
services.darkman =
|
||||||
|
let
|
||||||
|
mkScript =
|
||||||
|
mode:
|
||||||
|
pkgs.writeShellApplication {
|
||||||
|
name = "darkman-switch-kitty-${mode}";
|
||||||
|
runtimeInputs = with pkgs; [
|
||||||
|
procps
|
||||||
|
];
|
||||||
|
text = ''
|
||||||
|
ln --force --symbolic --verbose "${
|
||||||
|
config.theme.${mode}.kittyTheme
|
||||||
|
}" "$HOME/.config/kitty/theme.conf"
|
||||||
|
pkill -USR1 -u "$USER" kitty || true
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
in
|
||||||
|
{
|
||||||
|
lightModeScripts.kitty = "${lib.getExe (mkScript "light")}";
|
||||||
|
darkModeScripts.kitty = "${lib.getExe (mkScript "dark")}";
|
||||||
|
};
|
||||||
|
}
|
56
home-manager/profiles/mako/default.nix
Normal file
56
home-manager/profiles/mako/default.nix
Normal file
|
@ -0,0 +1,56 @@
|
||||||
|
{
|
||||||
|
config,
|
||||||
|
pkgs,
|
||||||
|
lib,
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
let
|
||||||
|
mkConfig =
|
||||||
|
mode:
|
||||||
|
let
|
||||||
|
inherit (config.theme.${mode}.base24Theme)
|
||||||
|
base00
|
||||||
|
base02
|
||||||
|
base05
|
||||||
|
base09
|
||||||
|
base0D
|
||||||
|
;
|
||||||
|
in
|
||||||
|
pkgs.writeText "mako-config-${mode}" ''
|
||||||
|
font=sans-serif 11
|
||||||
|
background-color=#${base00}
|
||||||
|
text-color=#${base05}
|
||||||
|
border-color=#${base0D}
|
||||||
|
progress-color=over #${base02}
|
||||||
|
border-size=3
|
||||||
|
border-radius=3
|
||||||
|
|
||||||
|
[urgency=high]
|
||||||
|
border-color=#${base09}
|
||||||
|
'';
|
||||||
|
mako = pkgs.mako;
|
||||||
|
in
|
||||||
|
{
|
||||||
|
home.packages = lib.singleton mako;
|
||||||
|
|
||||||
|
systemd.user.tmpfiles.rules = [
|
||||||
|
"L %h/.config/mako/config - - - - ${mkConfig "light"}"
|
||||||
|
];
|
||||||
|
|
||||||
|
services.darkman =
|
||||||
|
let
|
||||||
|
mkScript =
|
||||||
|
mode:
|
||||||
|
pkgs.writeShellApplication {
|
||||||
|
name = "darkman-switch-mako-${mode}";
|
||||||
|
text = ''
|
||||||
|
ln --force --symbolic --verbose "${mkConfig mode}" "$HOME/.config/mako/config"
|
||||||
|
${mako}/bin/makoctl reload || true
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
in
|
||||||
|
{
|
||||||
|
lightModeScripts.mako = "${lib.getExe (mkScript "light")}";
|
||||||
|
darkModeScripts.mako = "${lib.getExe (mkScript "dark")}";
|
||||||
|
};
|
||||||
|
}
|
305
home-manager/profiles/niri/default.nix
Normal file
305
home-manager/profiles/niri/default.nix
Normal file
|
@ -0,0 +1,305 @@
|
||||||
|
# Portions of this file are sourced from
|
||||||
|
# https://github.com/linyinfeng/dotfiles/blob/d40b75ca0955d2a999b36fa1bd0f8b3a6e061ef3/home-manager/profiles/niri/default.nix
|
||||||
|
{
|
||||||
|
config,
|
||||||
|
lib,
|
||||||
|
pkgs,
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
let
|
||||||
|
cfg = config.programs.niri;
|
||||||
|
in
|
||||||
|
{
|
||||||
|
options.programs.niri = {
|
||||||
|
browser = lib.mkOption {
|
||||||
|
type = with lib.types; listOf str;
|
||||||
|
description = ''
|
||||||
|
The command of the default browser.
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
terminal = lib.mkOption {
|
||||||
|
type = with lib.types; listOf str;
|
||||||
|
description = ''
|
||||||
|
The command of the default terminal.
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
xwayland = lib.mkOption {
|
||||||
|
type = lib.types.bool;
|
||||||
|
default = false;
|
||||||
|
description = ''
|
||||||
|
Whether to enable xwayland support.
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
config = lib.mkMerge [
|
||||||
|
# niri
|
||||||
|
{
|
||||||
|
programs.niri = {
|
||||||
|
package = pkgs.niri;
|
||||||
|
settings = {
|
||||||
|
input = {
|
||||||
|
touchpad = {
|
||||||
|
tap = true;
|
||||||
|
natural-scroll = true;
|
||||||
|
dwt = true;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
layout = {
|
||||||
|
gaps = 8;
|
||||||
|
center-focused-column = "never";
|
||||||
|
preset-column-widths = [
|
||||||
|
{ proportion = 1.0 / 3.0; }
|
||||||
|
{ proportion = 1.0 / 2.0; }
|
||||||
|
{ proportion = 2.0 / 3.0; }
|
||||||
|
];
|
||||||
|
default-column-width = {
|
||||||
|
proportion = 1.0 / 2.0;
|
||||||
|
};
|
||||||
|
focus-ring = {
|
||||||
|
enable = true;
|
||||||
|
width = 4;
|
||||||
|
active.color = "#7fc8ff";
|
||||||
|
inactive.color = "#505050";
|
||||||
|
};
|
||||||
|
border = {
|
||||||
|
enable = false;
|
||||||
|
width = 4;
|
||||||
|
active.color = "#ffc87f";
|
||||||
|
inactive.color = "#505050";
|
||||||
|
};
|
||||||
|
struts = { };
|
||||||
|
};
|
||||||
|
hotkey-overlay = {
|
||||||
|
skip-at-startup = true;
|
||||||
|
};
|
||||||
|
spawn-at-startup = [ ];
|
||||||
|
prefer-no-csd = true;
|
||||||
|
screenshot-path = "~/Pictures/Screenshots/Screenshot from %Y-%m-%d %H-%M-%S.png";
|
||||||
|
animations.enable = true;
|
||||||
|
window-rules = [
|
||||||
|
{
|
||||||
|
geometry-corner-radius =
|
||||||
|
let
|
||||||
|
radius = 12.0;
|
||||||
|
in
|
||||||
|
{
|
||||||
|
bottom-left = radius;
|
||||||
|
bottom-right = radius;
|
||||||
|
top-left = radius;
|
||||||
|
top-right = radius;
|
||||||
|
};
|
||||||
|
clip-to-geometry = true;
|
||||||
|
}
|
||||||
|
];
|
||||||
|
binds =
|
||||||
|
let
|
||||||
|
modMove = "Shift";
|
||||||
|
modMonitor = "Ctrl";
|
||||||
|
keyUp = "K";
|
||||||
|
keyDown = "J";
|
||||||
|
keyLeft = "H";
|
||||||
|
keyRight = "L";
|
||||||
|
directions = {
|
||||||
|
left = {
|
||||||
|
keys = [
|
||||||
|
keyLeft
|
||||||
|
"WheelScrollLeft"
|
||||||
|
];
|
||||||
|
windowTerm = "column";
|
||||||
|
};
|
||||||
|
down = {
|
||||||
|
keys = lib.singleton keyDown;
|
||||||
|
windowTerm = "window";
|
||||||
|
};
|
||||||
|
up = {
|
||||||
|
keys = lib.singleton keyUp;
|
||||||
|
windowTerm = "window";
|
||||||
|
};
|
||||||
|
right = {
|
||||||
|
keys = [
|
||||||
|
keyRight
|
||||||
|
"WheelScrollRight"
|
||||||
|
];
|
||||||
|
windowTerm = "column";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
workspaceIndices = lib.range 1 9;
|
||||||
|
isWheelKey = lib.hasPrefix "Wheel";
|
||||||
|
wheelCooldownMs = 100;
|
||||||
|
windowBindings = lib.mkMerge (
|
||||||
|
lib.concatLists (
|
||||||
|
lib.mapAttrsToList (
|
||||||
|
direction: cfg:
|
||||||
|
(lib.lists.map (
|
||||||
|
key:
|
||||||
|
let
|
||||||
|
cooldown-ms = lib.mkIf (isWheelKey key) wheelCooldownMs;
|
||||||
|
in
|
||||||
|
{
|
||||||
|
"Mod+${key}" = {
|
||||||
|
action."focus-${cfg.windowTerm}-${direction}" = [ ];
|
||||||
|
inherit cooldown-ms;
|
||||||
|
};
|
||||||
|
"Mod+${modMove}+${key}" = {
|
||||||
|
action."move-${cfg.windowTerm}-${direction}" = [ ];
|
||||||
|
inherit cooldown-ms;
|
||||||
|
};
|
||||||
|
"Mod+${modMonitor}+${key}" = {
|
||||||
|
action."focus-monitor-${direction}" = [ ];
|
||||||
|
inherit cooldown-ms;
|
||||||
|
};
|
||||||
|
"Mod+${modMove}+${modMonitor}+${key}" = {
|
||||||
|
action."move-column-to-monitor-${direction}" = [ ];
|
||||||
|
inherit cooldown-ms;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
) cfg.keys)
|
||||||
|
) directions
|
||||||
|
)
|
||||||
|
);
|
||||||
|
indexedWorkspaceBindings = lib.mkMerge (
|
||||||
|
map (index: {
|
||||||
|
"Mod+${toString index}" = {
|
||||||
|
action.focus-workspace = [ index ];
|
||||||
|
};
|
||||||
|
"Mod+${modMove}+${toString index}" = {
|
||||||
|
action.move-column-to-workspace = [ index ];
|
||||||
|
};
|
||||||
|
}) workspaceIndices
|
||||||
|
);
|
||||||
|
specialBindings = {
|
||||||
|
"Mod+W".action.spawn = cfg.browser;
|
||||||
|
"Mod+Return".action.spawn = cfg.terminal;
|
||||||
|
"Mod+D".action.spawn = [ "fuzzel" ];
|
||||||
|
"Mod+M".action.spawn = [ "swaylock" ];
|
||||||
|
"Mod+V".action.spawn = [ "cliphist-fuzzel" ];
|
||||||
|
"XF86AudioRaiseVolume" = {
|
||||||
|
allow-when-locked = true;
|
||||||
|
action.spawn = [
|
||||||
|
"${pkgs.pulsemixer}/bin/pulsemixer"
|
||||||
|
"--change-volume"
|
||||||
|
"+5"
|
||||||
|
];
|
||||||
|
};
|
||||||
|
"XF86AudioLowerVolume" = {
|
||||||
|
allow-when-locked = true;
|
||||||
|
action.spawn = [
|
||||||
|
"${pkgs.pulsemixer}/bin/pulsemixer"
|
||||||
|
"--change-volume"
|
||||||
|
"-5"
|
||||||
|
];
|
||||||
|
};
|
||||||
|
"XF86AudioMute" = {
|
||||||
|
allow-when-locked = true;
|
||||||
|
action.spawn = [
|
||||||
|
"${pkgs.pulsemixer}/bin/pulsemixer"
|
||||||
|
"--toggle-mute"
|
||||||
|
];
|
||||||
|
};
|
||||||
|
"Mod+P".action.spawn = [
|
||||||
|
"${pkgs.playerctl}/bin/playerctl"
|
||||||
|
"play-pause"
|
||||||
|
];
|
||||||
|
"Mod+I".action.spawn = [
|
||||||
|
"${pkgs.playerctl}/bin/playerctl"
|
||||||
|
"previous"
|
||||||
|
];
|
||||||
|
"Mod+O".action.spawn = [
|
||||||
|
"${pkgs.playerctl}/bin/playerctl"
|
||||||
|
"next"
|
||||||
|
];
|
||||||
|
"Mod+Shift+Q".action.close-window = [ ];
|
||||||
|
"Mod+Tab".action.focus-workspace-previous = [ ];
|
||||||
|
"Mod+C".action.center-column = [ ];
|
||||||
|
"Mod+Comma".action.consume-window-into-column = [ ];
|
||||||
|
"Mod+Period".action.expel-window-from-column = [ ];
|
||||||
|
"Mod+BracketLeft".action.consume-or-expel-window-left = [ ];
|
||||||
|
"Mod+BracketRight".action.consume-or-expel-window-right = [ ];
|
||||||
|
"Mod+R".action.switch-preset-column-width = [ ];
|
||||||
|
"Mod+Shift+R".action.reset-window-height = [ ];
|
||||||
|
"Mod+F".action.maximize-column = [ ];
|
||||||
|
"Mod+Shift+F".action.fullscreen-window = [ ];
|
||||||
|
"Mod+Minus".action.set-column-width = [ "-10%" ];
|
||||||
|
"Mod+Equal".action.set-column-width = [ "+10%" ];
|
||||||
|
"Mod+Shift+Minus".action.set-window-height = [ "-10%" ];
|
||||||
|
"Mod+Shift+Equal".action.set-window-height = [ "+10%" ];
|
||||||
|
"Mod+Shift+S".action.screenshot = [ ];
|
||||||
|
"Mod+Ctrl+S".action.screenshot-window = [ ];
|
||||||
|
"Mod+Shift+E".action.quit = [ ];
|
||||||
|
};
|
||||||
|
in
|
||||||
|
lib.mkMerge [
|
||||||
|
windowBindings
|
||||||
|
indexedWorkspaceBindings
|
||||||
|
specialBindings
|
||||||
|
];
|
||||||
|
cursor = {
|
||||||
|
theme = config.theme.cursorTheme;
|
||||||
|
size = config.theme.cursorSize;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
home.packages = with pkgs; [
|
||||||
|
(hiPrio (writeShellApplication {
|
||||||
|
name = "wayland-session";
|
||||||
|
runtimeInputs = [ cfg.package ];
|
||||||
|
text = ''
|
||||||
|
niri-session
|
||||||
|
'';
|
||||||
|
}))
|
||||||
|
|
||||||
|
cfg.package
|
||||||
|
wl-clipboard
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
# xdg-desktop-portal
|
||||||
|
{
|
||||||
|
xdg.portal = {
|
||||||
|
enable = true;
|
||||||
|
extraPortals = with pkgs; [
|
||||||
|
xdg-desktop-portal-gtk
|
||||||
|
xdg-desktop-portal-gnome
|
||||||
|
];
|
||||||
|
config = {
|
||||||
|
common = {
|
||||||
|
"default" = [
|
||||||
|
"gnome"
|
||||||
|
"gtk"
|
||||||
|
];
|
||||||
|
"org.freedesktop.impl.portal.Secret" = [ "gnome-keyring" ];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
home.packages = with pkgs; [
|
||||||
|
xdg-utils
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
# xwayland
|
||||||
|
(lib.mkIf cfg.xwayland {
|
||||||
|
systemd.user.services.xwayland-satellite = {
|
||||||
|
Unit = {
|
||||||
|
PartOf = [ "graphical-session.target" ];
|
||||||
|
After = [ "graphical-session.target" ];
|
||||||
|
Requisite = [ "graphical-session.target" ];
|
||||||
|
};
|
||||||
|
Install.WantedBy = [ "graphical-session.target" ];
|
||||||
|
Service = {
|
||||||
|
Type = "simple";
|
||||||
|
ExecStart = "${lib.getExe pkgs.xwayland-satellite} :1";
|
||||||
|
NotifyAccess = "all";
|
||||||
|
StandardOutput = "journal";
|
||||||
|
Restart = "on-failure";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
programs.niri.settings.environment = lib.singleton {
|
||||||
|
DISPLAY = ":1";
|
||||||
|
};
|
||||||
|
})
|
||||||
|
];
|
||||||
|
}
|
5
home-manager/profiles/qt/default.nix
Normal file
5
home-manager/profiles/qt/default.nix
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
{
|
||||||
|
systemd.user.sessionVariables = {
|
||||||
|
QT_QPA_PLATFORMTHEME = "gtk3";
|
||||||
|
};
|
||||||
|
}
|
46
home-manager/profiles/swaylock/default.nix
Normal file
46
home-manager/profiles/swaylock/default.nix
Normal file
|
@ -0,0 +1,46 @@
|
||||||
|
# Portions of this file are sourced from
|
||||||
|
# https://github.com/NickCao/flakes/blob/3b03efb676ea602575c916b2b8bc9d9cd13b0d85/nixos/mainframe/home.nix
|
||||||
|
{
|
||||||
|
config,
|
||||||
|
pkgs,
|
||||||
|
lib,
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
let
|
||||||
|
mkBlurredWallpaper =
|
||||||
|
mode:
|
||||||
|
pkgs.runCommand "wallpaper-blurred-${mode}" { nativeBuildInputs = with pkgs; [ imagemagick ]; } ''
|
||||||
|
magick convert -blur 14x5 ${config.theme.${mode}.wallpaper} $out
|
||||||
|
'';
|
||||||
|
in
|
||||||
|
{
|
||||||
|
programs.swaylock = {
|
||||||
|
enable = true;
|
||||||
|
settings = {
|
||||||
|
show-failed-attempts = true;
|
||||||
|
daemonize = true;
|
||||||
|
image = "~/.config/swaylock/image";
|
||||||
|
scaling = "fill";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
systemd.user.tmpfiles.rules = [
|
||||||
|
"L %h/.config/swaylock/image - - - - ${mkBlurredWallpaper "light"}"
|
||||||
|
];
|
||||||
|
|
||||||
|
services.darkman =
|
||||||
|
let
|
||||||
|
mkScript =
|
||||||
|
mode:
|
||||||
|
pkgs.writeShellApplication {
|
||||||
|
name = "darkman-switch-swaylock-${mode}";
|
||||||
|
text = ''
|
||||||
|
ln --force --symbolic --verbose "${mkBlurredWallpaper mode}" "$HOME/.config/swaylock/image"
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
in
|
||||||
|
{
|
||||||
|
lightModeScripts.swaylock = "${lib.getExe (mkScript "light")}";
|
||||||
|
darkModeScripts.swaylock = "${lib.getExe (mkScript "dark")}";
|
||||||
|
};
|
||||||
|
}
|
54
home-manager/profiles/swww/default.nix
Normal file
54
home-manager/profiles/swww/default.nix
Normal file
|
@ -0,0 +1,54 @@
|
||||||
|
{
|
||||||
|
config,
|
||||||
|
pkgs,
|
||||||
|
lib,
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
let
|
||||||
|
swww = pkgs.swww;
|
||||||
|
in
|
||||||
|
{
|
||||||
|
systemd.user.services.swww-daemon = {
|
||||||
|
Unit = {
|
||||||
|
Description = "A Solution to your Wayland Wallpaper Woes";
|
||||||
|
Documentation = "https://github.com/LGFae/swww";
|
||||||
|
PartOf = [ "graphical-session.target" ];
|
||||||
|
After = [ "graphical-session.target" ];
|
||||||
|
Requisite = [ "graphical-session.target" ];
|
||||||
|
};
|
||||||
|
|
||||||
|
Service = {
|
||||||
|
ExecStart = "${swww}/bin/swww-daemon --no-cache";
|
||||||
|
ExecStartPost = "${swww}/bin/swww img %h/.config/swww/wallpaper";
|
||||||
|
Restart = "on-failure";
|
||||||
|
KillMode = "mixed";
|
||||||
|
};
|
||||||
|
|
||||||
|
Install.WantedBy = [ "graphical-session.target" ];
|
||||||
|
};
|
||||||
|
|
||||||
|
systemd.user.tmpfiles.rules = [
|
||||||
|
"L %h/.config/swww/wallpaper - - - - ${config.theme.light.wallpaper}"
|
||||||
|
];
|
||||||
|
|
||||||
|
services.darkman =
|
||||||
|
let
|
||||||
|
mkScript =
|
||||||
|
mode:
|
||||||
|
pkgs.writeShellApplication {
|
||||||
|
name = "darkman-switch-swww-${mode}";
|
||||||
|
text = ''
|
||||||
|
if ! ${config.systemd.user.systemctlPath} --user is-active swww-daemon; then
|
||||||
|
echo "swww-daemon is not active"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
ln --force --symbolic --verbose "${config.theme.${mode}.wallpaper}" "$HOME/.config/swww/wallpaper"
|
||||||
|
${swww}/bin/swww img ~/.config/swww/wallpaper
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
in
|
||||||
|
{
|
||||||
|
lightModeScripts.swww = "${lib.getExe (mkScript "light")}";
|
||||||
|
darkModeScripts.swww = "${lib.getExe (mkScript "dark")}";
|
||||||
|
};
|
||||||
|
}
|
6
home-manager/profiles/syncthing/default.nix
Normal file
6
home-manager/profiles/syncthing/default.nix
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
{ ... }:
|
||||||
|
{
|
||||||
|
services.syncthing.enable = true;
|
||||||
|
|
||||||
|
home.globalPersistence.directories = [ ".local/state/syncthing" ];
|
||||||
|
}
|
|
@ -0,0 +1,31 @@
|
||||||
|
# This file is sourced from https://github.com/tinted-theming/schemes/tree/spec-0.11/base24
|
||||||
|
system = "base24"
|
||||||
|
name = "Catppuccin Frappe"
|
||||||
|
author = "https://github.com/catppuccin/catppuccin"
|
||||||
|
variant = "dark"
|
||||||
|
|
||||||
|
[palette]
|
||||||
|
base00 = "#303446"
|
||||||
|
base01 = "#292c3c"
|
||||||
|
base02 = "#414559"
|
||||||
|
base03 = "#51576d"
|
||||||
|
base04 = "#626880"
|
||||||
|
base05 = "#c6d0f5"
|
||||||
|
base06 = "#f2d5cf"
|
||||||
|
base07 = "#babbf1"
|
||||||
|
base08 = "#e78284"
|
||||||
|
base09 = "#ef9f76"
|
||||||
|
base0A = "#e5c890"
|
||||||
|
base0B = "#a6d189"
|
||||||
|
base0C = "#81c8be"
|
||||||
|
base0D = "#8caaee"
|
||||||
|
base0E = "#ca9ee6"
|
||||||
|
base0F = "#eebebe"
|
||||||
|
base10 = "#292c3c"
|
||||||
|
base11 = "#232634"
|
||||||
|
base12 = "#ea999c"
|
||||||
|
base13 = "#f2d5cf"
|
||||||
|
base14 = "#a6d189"
|
||||||
|
base15 = "#99d1db"
|
||||||
|
base16 = "#85c1dc"
|
||||||
|
base17 = "#f4b8e4"
|
31
home-manager/profiles/theme/catppuccin/catppuccin-latte.toml
Normal file
31
home-manager/profiles/theme/catppuccin/catppuccin-latte.toml
Normal file
|
@ -0,0 +1,31 @@
|
||||||
|
# This file is sourced from https://github.com/tinted-theming/schemes/tree/spec-0.11/base24
|
||||||
|
system = "base24"
|
||||||
|
name = "Catppuccin Latte"
|
||||||
|
author = "https://github.com/catppuccin/catppuccin"
|
||||||
|
variant = "light"
|
||||||
|
|
||||||
|
[palette]
|
||||||
|
base00 = "#eff1f5"
|
||||||
|
base01 = "#e6e9ef"
|
||||||
|
base02 = "#ccd0da"
|
||||||
|
base03 = "#bcc0cc"
|
||||||
|
base04 = "#acb0be"
|
||||||
|
base05 = "#4c4f69"
|
||||||
|
base06 = "#dc8a78"
|
||||||
|
base07 = "#7287fd"
|
||||||
|
base08 = "#d20f39"
|
||||||
|
base09 = "#fe640b"
|
||||||
|
base0A = "#df8e1d"
|
||||||
|
base0B = "#40a02b"
|
||||||
|
base0C = "#179299"
|
||||||
|
base0D = "#1e66f5"
|
||||||
|
base0E = "#8839ef"
|
||||||
|
base0F = "#dd7878"
|
||||||
|
base10 = "#e6e9ef"
|
||||||
|
base11 = "#dce0e8"
|
||||||
|
base12 = "#e64553"
|
||||||
|
base13 = "#dc8a78"
|
||||||
|
base14 = "#40a02b"
|
||||||
|
base15 = "#04a5e5"
|
||||||
|
base16 = "#209fb5"
|
||||||
|
base17 = "#ea76cb"
|
|
@ -0,0 +1,31 @@
|
||||||
|
# This file is sourced from https://github.com/tinted-theming/schemes/tree/spec-0.11/base24
|
||||||
|
system = "base24"
|
||||||
|
name = "Catppuccin Macchiato"
|
||||||
|
author = "https://github.com/catppuccin/catppuccin"
|
||||||
|
variant = "dark"
|
||||||
|
|
||||||
|
[palette]
|
||||||
|
base00 = "#24273a"
|
||||||
|
base01 = "#1e2030"
|
||||||
|
base02 = "#363a4f"
|
||||||
|
base03 = "#494d64"
|
||||||
|
base04 = "#5b6078"
|
||||||
|
base05 = "#cad3f5"
|
||||||
|
base06 = "#f4dbd6"
|
||||||
|
base07 = "#b7bdf8"
|
||||||
|
base08 = "#ed8796"
|
||||||
|
base09 = "#f5a97f"
|
||||||
|
base0A = "#eed49f"
|
||||||
|
base0B = "#a6da95"
|
||||||
|
base0C = "#8bd5ca"
|
||||||
|
base0D = "#8aadf4"
|
||||||
|
base0E = "#c6a0f6"
|
||||||
|
base0F = "#f0c6c6"
|
||||||
|
base10 = "#1e2030"
|
||||||
|
base11 = "#181926"
|
||||||
|
base12 = "#ee99a0"
|
||||||
|
base13 = "#f4dbd6"
|
||||||
|
base14 = "#a6da95"
|
||||||
|
base15 = "#91d7e3"
|
||||||
|
base16 = "#7dc4e4"
|
||||||
|
base17 = "#f5bde6"
|
31
home-manager/profiles/theme/catppuccin/catppuccin-mocha.toml
Normal file
31
home-manager/profiles/theme/catppuccin/catppuccin-mocha.toml
Normal file
|
@ -0,0 +1,31 @@
|
||||||
|
# This file is sourced from https://github.com/tinted-theming/schemes/tree/spec-0.11/base24
|
||||||
|
system = "base24"
|
||||||
|
name = "Catppuccin Mocha"
|
||||||
|
author = "https://github.com/catppuccin/catppuccin"
|
||||||
|
variant = "dark"
|
||||||
|
|
||||||
|
[palette]
|
||||||
|
base00 = "#1e1e2e"
|
||||||
|
base01 = "#181825"
|
||||||
|
base02 = "#313244"
|
||||||
|
base03 = "#45475a"
|
||||||
|
base04 = "#585b70"
|
||||||
|
base05 = "#cdd6f4"
|
||||||
|
base06 = "#f5e0dc"
|
||||||
|
base07 = "#b4befe"
|
||||||
|
base08 = "#f38ba8"
|
||||||
|
base09 = "#fab387"
|
||||||
|
base0A = "#f9e2af"
|
||||||
|
base0B = "#a6e3a1"
|
||||||
|
base0C = "#94e2d5"
|
||||||
|
base0D = "#89b4fa"
|
||||||
|
base0E = "#cba6f7"
|
||||||
|
base0F = "#f2cdcd"
|
||||||
|
base10 = "#181825"
|
||||||
|
base11 = "#11111b"
|
||||||
|
base12 = "#eba0ac"
|
||||||
|
base13 = "#f5e0dc"
|
||||||
|
base14 = "#a6e3a1"
|
||||||
|
base15 = "#89dceb"
|
||||||
|
base16 = "#74c7ec"
|
||||||
|
base17 = "#f5c2e7"
|
48
home-manager/profiles/theme/catppuccin/default.nix
Normal file
48
home-manager/profiles/theme/catppuccin/default.nix
Normal file
|
@ -0,0 +1,48 @@
|
||||||
|
{ pkgs, ... }:
|
||||||
|
let
|
||||||
|
importBase24Theme =
|
||||||
|
file:
|
||||||
|
let
|
||||||
|
inherit (builtins.fromTOML (builtins.readFile file)) palette;
|
||||||
|
in
|
||||||
|
builtins.mapAttrs (_name: value: builtins.substring 1 6 value) palette;
|
||||||
|
in
|
||||||
|
{
|
||||||
|
theme = {
|
||||||
|
cursorTheme = "capitaine-cursors-white";
|
||||||
|
cursorSize = 36;
|
||||||
|
|
||||||
|
light = {
|
||||||
|
iconTheme = "Papirus-Light";
|
||||||
|
gtkTheme = "catppuccin-latte-blue-compact";
|
||||||
|
wallpaper = "${pkgs.nixos-artwork.wallpapers.nineish}/share/backgrounds/nixos/nix-wallpaper-nineish.png";
|
||||||
|
kittyTheme = "${pkgs.kitty-themes}/share/kitty-themes/themes/Catppuccin-Latte.conf";
|
||||||
|
helixTheme = "${pkgs.helix}/lib/runtime/themes/catppuccin_latte.toml";
|
||||||
|
base24Theme = importBase24Theme ./catppuccin-latte.toml;
|
||||||
|
};
|
||||||
|
|
||||||
|
dark = {
|
||||||
|
iconTheme = "Papirus-Dark";
|
||||||
|
gtkTheme = "catppuccin-frappe-blue-compact";
|
||||||
|
wallpaper = "${pkgs.nixos-artwork.wallpapers.nineish-dark-gray}/share/backgrounds/nixos/nix-wallpaper-nineish-dark-gray.png";
|
||||||
|
kittyTheme = "${pkgs.kitty-themes}/share/kitty-themes/themes/Catppuccin-Frappe.conf";
|
||||||
|
helixTheme = "${pkgs.helix}/lib/runtime/themes/catppuccin_frappe.toml";
|
||||||
|
base24Theme = importBase24Theme ./catppuccin-frappe.toml;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
home.packages = with pkgs; [
|
||||||
|
papirus-icon-theme
|
||||||
|
capitaine-cursors
|
||||||
|
(catppuccin-gtk.override {
|
||||||
|
accents = [ "blue" ];
|
||||||
|
size = "compact";
|
||||||
|
variant = "latte";
|
||||||
|
})
|
||||||
|
(catppuccin-gtk.override {
|
||||||
|
accents = [ "blue" ];
|
||||||
|
size = "compact";
|
||||||
|
variant = "frappe";
|
||||||
|
})
|
||||||
|
];
|
||||||
|
}
|
73
home-manager/profiles/tmux/default.nix
Normal file
73
home-manager/profiles/tmux/default.nix
Normal file
|
@ -0,0 +1,73 @@
|
||||||
|
{ pkgs, lib, ... }:
|
||||||
|
{
|
||||||
|
programs.tmux = {
|
||||||
|
enable = true;
|
||||||
|
baseIndex = 1;
|
||||||
|
escapeTime = 10;
|
||||||
|
keyMode = "vi";
|
||||||
|
terminal = "tmux-256color";
|
||||||
|
historyLimit = 50000;
|
||||||
|
plugins = with pkgs.tmuxPlugins; [
|
||||||
|
yank
|
||||||
|
open
|
||||||
|
];
|
||||||
|
extraConfig = ''
|
||||||
|
set -g set-clipboard on
|
||||||
|
set -g mouse on
|
||||||
|
set -g status-right ""
|
||||||
|
set -g renumber-windows on
|
||||||
|
set -g bell-action none
|
||||||
|
|
||||||
|
# keybind
|
||||||
|
bind \; command-prompt
|
||||||
|
bind p paste-buffer
|
||||||
|
bind C-p choose-buffer
|
||||||
|
|
||||||
|
# pane
|
||||||
|
bind k select-pane -U
|
||||||
|
bind j select-pane -D
|
||||||
|
bind h select-pane -L
|
||||||
|
bind l select-pane -R
|
||||||
|
bind -r C-k resize-pane -U 5
|
||||||
|
bind -r C-j resize-pane -D 5
|
||||||
|
bind -r C-h resize-pane -L 5
|
||||||
|
bind -r C-l resize-pane -R 5
|
||||||
|
|
||||||
|
# copy mode
|
||||||
|
bind Escape copy-mode
|
||||||
|
bind -T copy-mode-vi k send -X cursor-up
|
||||||
|
bind -T copy-mode-vi K send -N 5 -X cursor-up
|
||||||
|
bind -T copy-mode-vi j send -X cursor-down
|
||||||
|
bind -T copy-mode-vi J send -N 5 -X cursor-down
|
||||||
|
bind -T copy-mode-vi h send -X cursor-left
|
||||||
|
bind -T copy-mode-vi H send -N 5 -X cursor-left
|
||||||
|
bind -T copy-mode-vi C-h send -X start-of-line
|
||||||
|
bind -T copy-mode-vi l send -X cursor-right
|
||||||
|
bind -T copy-mode-vi L send -N 5 -X cursor-right
|
||||||
|
bind -T copy-mode-vi C-l send -X end-of-line
|
||||||
|
bind -T copy-mode-vi v send -X begin-selection
|
||||||
|
|
||||||
|
# window
|
||||||
|
bind -r [ previous-window
|
||||||
|
bind -r ] next-window
|
||||||
|
bind -r C-[ swap-window -d -t -1
|
||||||
|
bind -r C-] swap-window -d -t +1
|
||||||
|
bind -r - split-window -h -c "#{pane_current_path}"
|
||||||
|
bind -r = split-window -v -c "#{pane_current_path}"
|
||||||
|
bind C-x kill-window
|
||||||
|
bind c new-window -c "#{pane_current_path}"
|
||||||
|
bind r command-prompt "rename-window %%"
|
||||||
|
|
||||||
|
# session
|
||||||
|
bind q confirm-before -p "kill-session #S? (y/n)" kill-session
|
||||||
|
bind R command-prompt "rename-session %%"
|
||||||
|
|
||||||
|
# image preview
|
||||||
|
set -g allow-passthrough on
|
||||||
|
set -ga update-environment TERM
|
||||||
|
set -ga update-environment TERM_PROGRAM
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
|
||||||
|
programs.kitty.settings.shell = lib.mkDefault "tmux";
|
||||||
|
}
|
57
home-manager/profiles/waybar/_common.nix
Normal file
57
home-manager/profiles/waybar/_common.nix
Normal file
|
@ -0,0 +1,57 @@
|
||||||
|
{
|
||||||
|
pkgs,
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
{
|
||||||
|
height = 36;
|
||||||
|
layer = "top";
|
||||||
|
"niri/window" = {
|
||||||
|
format = "{}";
|
||||||
|
max-length = 80;
|
||||||
|
};
|
||||||
|
"wlr/taskbar" = {
|
||||||
|
all-outputs = false;
|
||||||
|
on-click = "activate";
|
||||||
|
on-click-middle = "close";
|
||||||
|
};
|
||||||
|
tray = {
|
||||||
|
icon-size = 18;
|
||||||
|
spacing = 10;
|
||||||
|
};
|
||||||
|
clock = {
|
||||||
|
format = "{:%a %b %d %H:%M}";
|
||||||
|
};
|
||||||
|
network = {
|
||||||
|
interval = 1;
|
||||||
|
format = "{ifname}";
|
||||||
|
format-wifi = " {bandwidthDownBytes} {bandwidthUpBytes}";
|
||||||
|
format-ethernet = " {bandwidthDownBytes} {bandwidthUpBytes}";
|
||||||
|
format-disconnected = "";
|
||||||
|
tooltip-format = "{ifname} via {gwaddr}";
|
||||||
|
tooltip-format-wifi = "{essid} {signalStrength}%";
|
||||||
|
tooltip-format-ethernet = "{ifname}";
|
||||||
|
tooltip-format-disconnected = "disconnected";
|
||||||
|
max-length = 40;
|
||||||
|
};
|
||||||
|
pulseaudio = {
|
||||||
|
format = "{icon} {volume}% {format_source}";
|
||||||
|
format-bluetooth = " {volume}% {format_source}";
|
||||||
|
format-bluetooth-muted = " {volume}% {format_source}";
|
||||||
|
format-icons = {
|
||||||
|
headphone = "";
|
||||||
|
default = [
|
||||||
|
""
|
||||||
|
""
|
||||||
|
];
|
||||||
|
};
|
||||||
|
format-muted = " {volume}% {format_source}";
|
||||||
|
format-source = " {volume}%";
|
||||||
|
format-source-muted = " {volume}%";
|
||||||
|
on-click = "${pkgs.pavucontrol}/bin/pavucontrol";
|
||||||
|
};
|
||||||
|
"custom/nixos" = {
|
||||||
|
format = "";
|
||||||
|
interval = "once";
|
||||||
|
tooltip = false;
|
||||||
|
};
|
||||||
|
}
|
49
home-manager/profiles/waybar/_default.nix
Normal file
49
home-manager/profiles/waybar/_default.nix
Normal file
|
@ -0,0 +1,49 @@
|
||||||
|
{
|
||||||
|
config,
|
||||||
|
pkgs,
|
||||||
|
lib,
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
let
|
||||||
|
mkTheme =
|
||||||
|
mode:
|
||||||
|
let
|
||||||
|
inherit (config.theme.${mode}) base24Theme;
|
||||||
|
in
|
||||||
|
pkgs.writeText "waybar-style-${mode}.css" (import ./_style.nix base24Theme);
|
||||||
|
in
|
||||||
|
{
|
||||||
|
programs.waybar = {
|
||||||
|
enable = true;
|
||||||
|
systemd.enable = true;
|
||||||
|
};
|
||||||
|
|
||||||
|
systemd.user.services.waybar = {
|
||||||
|
Unit = {
|
||||||
|
ConditionEnvironment = lib.singleton "WAYLAND_DISPLAY";
|
||||||
|
Requisite = lib.singleton "graphical-session.target";
|
||||||
|
After = lib.singleton "graphical-session.target";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
systemd.user.tmpfiles.rules = [
|
||||||
|
"L %h/.config/waybar/style.css - - - - ${mkTheme "light"}"
|
||||||
|
];
|
||||||
|
|
||||||
|
services.darkman =
|
||||||
|
let
|
||||||
|
mkScript =
|
||||||
|
mode:
|
||||||
|
pkgs.writeShellApplication {
|
||||||
|
name = "darkman-switch-waybar-${mode}";
|
||||||
|
text = ''
|
||||||
|
ln --force --symbolic --verbose "${mkTheme mode}" "$HOME/.config/waybar/style.css"
|
||||||
|
pkill -u "$USER" -USR2 waybar || true
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
in
|
||||||
|
{
|
||||||
|
lightModeScripts.waybar = "${lib.getExe (mkScript "light")}";
|
||||||
|
darkModeScripts.waybar = "${lib.getExe (mkScript "dark")}";
|
||||||
|
};
|
||||||
|
}
|
72
home-manager/profiles/waybar/_style.nix
Normal file
72
home-manager/profiles/waybar/_style.nix
Normal file
|
@ -0,0 +1,72 @@
|
||||||
|
{
|
||||||
|
base00,
|
||||||
|
base02,
|
||||||
|
base05,
|
||||||
|
base07,
|
||||||
|
base0A,
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
''
|
||||||
|
* {
|
||||||
|
border: none;
|
||||||
|
border-radius: 0;
|
||||||
|
font-family: 'RobotoMono Nerd Font', 'sans';
|
||||||
|
font-size: 11pt;
|
||||||
|
font-weight: bold;
|
||||||
|
min-height: 0;
|
||||||
|
color: #${base05};
|
||||||
|
}
|
||||||
|
|
||||||
|
window#waybar {
|
||||||
|
padding: 0pt;
|
||||||
|
opacity: 0.95;
|
||||||
|
color: #${base05};
|
||||||
|
background: #${base00};
|
||||||
|
border-bottom: 2pt solid #${base02};
|
||||||
|
}
|
||||||
|
|
||||||
|
window#waybar.hidden {
|
||||||
|
opacity: 0.0;
|
||||||
|
}
|
||||||
|
|
||||||
|
#workspaces button {
|
||||||
|
padding: 0pt;
|
||||||
|
background: transparent;
|
||||||
|
color: #${base05};
|
||||||
|
border-bottom: 2pt solid transparent;
|
||||||
|
}
|
||||||
|
|
||||||
|
#workspaces button.focused,
|
||||||
|
#workspaces button.active {
|
||||||
|
background: #${base02};
|
||||||
|
border-bottom: 2pt solid #${base07};
|
||||||
|
}
|
||||||
|
|
||||||
|
#workspaces button.urgent {
|
||||||
|
background: #${base0A};
|
||||||
|
}
|
||||||
|
|
||||||
|
#custom-nixos {
|
||||||
|
padding-left: 12pt;
|
||||||
|
padding-right: 15pt;
|
||||||
|
}
|
||||||
|
|
||||||
|
#window {
|
||||||
|
padding: 0pt 8pt;
|
||||||
|
}
|
||||||
|
|
||||||
|
#clock,
|
||||||
|
#tray,
|
||||||
|
#network,
|
||||||
|
#pulseaudio {
|
||||||
|
margin: 0pt 0pt;
|
||||||
|
padding: 0pt 8pt;
|
||||||
|
}
|
||||||
|
|
||||||
|
#clock,
|
||||||
|
#tray,
|
||||||
|
#network,
|
||||||
|
#pulseaudio {
|
||||||
|
border-left: 2pt solid #${base02};
|
||||||
|
}
|
||||||
|
''
|
32
home-manager/profiles/waybar/niri.nix
Normal file
32
home-manager/profiles/waybar/niri.nix
Normal file
|
@ -0,0 +1,32 @@
|
||||||
|
{
|
||||||
|
config,
|
||||||
|
pkgs,
|
||||||
|
lib,
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
let
|
||||||
|
args = {
|
||||||
|
inherit config pkgs lib;
|
||||||
|
};
|
||||||
|
in
|
||||||
|
{
|
||||||
|
imports = lib.singleton ./_default.nix;
|
||||||
|
|
||||||
|
programs.waybar.settings = lib.singleton (
|
||||||
|
{
|
||||||
|
position = "top";
|
||||||
|
modules-left = [
|
||||||
|
"custom/nixos"
|
||||||
|
"niri/workspaces"
|
||||||
|
"niri/window"
|
||||||
|
];
|
||||||
|
modules-right = [
|
||||||
|
"network"
|
||||||
|
"pulseaudio"
|
||||||
|
"clock"
|
||||||
|
"tray"
|
||||||
|
];
|
||||||
|
}
|
||||||
|
// (import ./_common.nix args)
|
||||||
|
);
|
||||||
|
}
|
23
home-manager/profiles/xdg-user-dirs/default.nix
Normal file
23
home-manager/profiles/xdg-user-dirs/default.nix
Normal file
|
@ -0,0 +1,23 @@
|
||||||
|
{ ... }:
|
||||||
|
{
|
||||||
|
xdg.userDirs = {
|
||||||
|
enable = true;
|
||||||
|
createDirectories = true;
|
||||||
|
desktop = "/var/empty";
|
||||||
|
documents = "$HOME/Documents";
|
||||||
|
download = "$HOME/Downloads";
|
||||||
|
music = "$HOME/Music";
|
||||||
|
pictures = "$HOME/Pictures";
|
||||||
|
publicShare = "/var/empty";
|
||||||
|
templates = "/var/empty";
|
||||||
|
videos = "$HOME/Videos";
|
||||||
|
};
|
||||||
|
|
||||||
|
home.globalPersistence.directories = [
|
||||||
|
"Documents"
|
||||||
|
"Downloads"
|
||||||
|
"Music"
|
||||||
|
"Pictures"
|
||||||
|
"Videos"
|
||||||
|
];
|
||||||
|
}
|
116
home-manager/profiles/yazi/default.nix
Normal file
116
home-manager/profiles/yazi/default.nix
Normal file
|
@ -0,0 +1,116 @@
|
||||||
|
{ ... }:
|
||||||
|
{
|
||||||
|
programs.yazi = {
|
||||||
|
enable = true;
|
||||||
|
enableBashIntegration = true;
|
||||||
|
enableFishIntegration = true;
|
||||||
|
shellWrapperName = "ra";
|
||||||
|
settings = {
|
||||||
|
manager = {
|
||||||
|
sort_by = "natural";
|
||||||
|
linemode = "size";
|
||||||
|
};
|
||||||
|
preview = {
|
||||||
|
tab_size = 2;
|
||||||
|
max_width = 1000;
|
||||||
|
max_height = 1000;
|
||||||
|
};
|
||||||
|
open.rules = [
|
||||||
|
{
|
||||||
|
name = "*/";
|
||||||
|
use = [
|
||||||
|
"open"
|
||||||
|
"edit"
|
||||||
|
"reveal"
|
||||||
|
];
|
||||||
|
}
|
||||||
|
{
|
||||||
|
mime = "text/*";
|
||||||
|
use = [
|
||||||
|
"edit"
|
||||||
|
"reveal"
|
||||||
|
];
|
||||||
|
}
|
||||||
|
{
|
||||||
|
mime = "{image,audio,video}/*";
|
||||||
|
use = [
|
||||||
|
"open"
|
||||||
|
"reveal"
|
||||||
|
];
|
||||||
|
}
|
||||||
|
{
|
||||||
|
mime = "application/{,g}zip";
|
||||||
|
use = [
|
||||||
|
"extract"
|
||||||
|
"reveal"
|
||||||
|
];
|
||||||
|
}
|
||||||
|
{
|
||||||
|
mime = "application/x-{tar,bzip*,7z-compressed,xz,rar}";
|
||||||
|
use = [
|
||||||
|
"extract"
|
||||||
|
"reveal"
|
||||||
|
];
|
||||||
|
}
|
||||||
|
{
|
||||||
|
mime = "application/{json,x-ndjson}";
|
||||||
|
use = [
|
||||||
|
"edit"
|
||||||
|
"reveal"
|
||||||
|
];
|
||||||
|
}
|
||||||
|
{
|
||||||
|
mime = "*/javascript";
|
||||||
|
use = [
|
||||||
|
"edit"
|
||||||
|
"reveal"
|
||||||
|
];
|
||||||
|
}
|
||||||
|
{
|
||||||
|
mime = "inode/x-empty";
|
||||||
|
use = [
|
||||||
|
"edit"
|
||||||
|
"reveal"
|
||||||
|
];
|
||||||
|
}
|
||||||
|
{
|
||||||
|
name = "*";
|
||||||
|
use = [
|
||||||
|
"open"
|
||||||
|
"reveal"
|
||||||
|
];
|
||||||
|
}
|
||||||
|
];
|
||||||
|
};
|
||||||
|
keymap = {
|
||||||
|
manager.prepend_keymap = [
|
||||||
|
{
|
||||||
|
on = [ "J" ];
|
||||||
|
run = "arrow 5";
|
||||||
|
}
|
||||||
|
{
|
||||||
|
on = [ "K" ];
|
||||||
|
run = "arrow -5";
|
||||||
|
}
|
||||||
|
{
|
||||||
|
on = [ "<C-j>" ];
|
||||||
|
run = "seek 5";
|
||||||
|
}
|
||||||
|
{
|
||||||
|
on = [ "<C-k>" ];
|
||||||
|
run = "seek -5";
|
||||||
|
}
|
||||||
|
];
|
||||||
|
input.prepend_keymap = [
|
||||||
|
{
|
||||||
|
on = [ "H" ];
|
||||||
|
run = "move -5";
|
||||||
|
}
|
||||||
|
{
|
||||||
|
on = [ "L" ];
|
||||||
|
run = "move 5";
|
||||||
|
}
|
||||||
|
];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
3
infra/.gitignore
vendored
Normal file
3
infra/.gitignore
vendored
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
/.terraform
|
||||||
|
/terraform.tfstate.*
|
||||||
|
/.terraform.lock.hcl
|
14
infra/backend.tf
Normal file
14
infra/backend.tf
Normal file
|
@ -0,0 +1,14 @@
|
||||||
|
terraform {
|
||||||
|
backend "local" {
|
||||||
|
path = "terraform.tfstate"
|
||||||
|
}
|
||||||
|
encryption {
|
||||||
|
method "aes_gcm" "default" {
|
||||||
|
keys = key_provider.pbkdf2.default
|
||||||
|
}
|
||||||
|
state {
|
||||||
|
method = method.aes_gcm.default
|
||||||
|
enforced = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
27
infra/enthalpy.tf
Normal file
27
infra/enthalpy.tf
Normal file
|
@ -0,0 +1,27 @@
|
||||||
|
locals {
|
||||||
|
enthalpy_network_prefix = "fde3:3be3:a244::/48"
|
||||||
|
enthalpy_organizations = {
|
||||||
|
core = "rebmit's core network"
|
||||||
|
edge = "rebmit's edge network"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
resource "tls_private_key" "enthalpy" {
|
||||||
|
for_each = local.enthalpy_organizations
|
||||||
|
algorithm = "ED25519"
|
||||||
|
}
|
||||||
|
|
||||||
|
output "enthalpy_network_prefix" {
|
||||||
|
value = local.enthalpy_network_prefix
|
||||||
|
sensitive = false
|
||||||
|
}
|
||||||
|
|
||||||
|
output "enthalpy_organizations" {
|
||||||
|
value = local.enthalpy_organizations
|
||||||
|
sensitive = false
|
||||||
|
}
|
||||||
|
|
||||||
|
output "enthalpy_public_key_pem" {
|
||||||
|
value = { for k, v in tls_private_key.enthalpy : k => trimspace(v.public_key_pem) }
|
||||||
|
sensitive = false
|
||||||
|
}
|
63
infra/hosts.tf
Normal file
63
infra/hosts.tf
Normal file
|
@ -0,0 +1,63 @@
|
||||||
|
locals {
|
||||||
|
hosts = {
|
||||||
|
"flandre-m5p" = {
|
||||||
|
endpoints_v4 = []
|
||||||
|
endpoints_v6 = []
|
||||||
|
enthalpy_node_id = parseint("a23", 16)
|
||||||
|
enthalpy_node_organization = "edge"
|
||||||
|
}
|
||||||
|
"marisa-7d76" = {
|
||||||
|
endpoints_v4 = []
|
||||||
|
endpoints_v6 = []
|
||||||
|
enthalpy_node_id = parseint("d79", 16)
|
||||||
|
enthalpy_node_organization = "edge"
|
||||||
|
}
|
||||||
|
"marisa-a7s" = {
|
||||||
|
endpoints_v4 = []
|
||||||
|
endpoints_v6 = []
|
||||||
|
enthalpy_node_id = parseint("572", 16)
|
||||||
|
enthalpy_node_organization = "edge"
|
||||||
|
}
|
||||||
|
"reisen-sin0" = {
|
||||||
|
endpoints_v4 = ["194.156.163.233"]
|
||||||
|
endpoints_v6 = ["2407:b9c0:e002:20b:26a3:f0ff:fe46:a4d0"]
|
||||||
|
enthalpy_node_id = parseint("267", 16)
|
||||||
|
enthalpy_node_organization = "core"
|
||||||
|
}
|
||||||
|
"reisen-lax0" = {
|
||||||
|
endpoints_v4 = ["38.175.109.149"]
|
||||||
|
endpoints_v6 = ["2a0e:6901:110:276:5054:ff:fe81:ec3b"]
|
||||||
|
enthalpy_node_id = null
|
||||||
|
enthalpy_node_organization = null
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
module "hosts" {
|
||||||
|
source = "./modules/host"
|
||||||
|
for_each = local.hosts
|
||||||
|
name = each.key
|
||||||
|
endpoints_v4 = each.value.endpoints_v4
|
||||||
|
endpoints_v6 = each.value.endpoints_v6
|
||||||
|
enthalpy_network_prefix = local.enthalpy_network_prefix
|
||||||
|
enthalpy_organizations = local.enthalpy_organizations
|
||||||
|
enthalpy_private_key = tls_private_key.enthalpy
|
||||||
|
enthalpy_node_id = each.value.enthalpy_node_id
|
||||||
|
enthalpy_node_organization = each.value.enthalpy_node_organization
|
||||||
|
}
|
||||||
|
|
||||||
|
output "hosts" {
|
||||||
|
value = module.hosts
|
||||||
|
sensitive = true
|
||||||
|
}
|
||||||
|
|
||||||
|
output "hosts_non_sensitive" {
|
||||||
|
value = {
|
||||||
|
for host, outputs in module.hosts :
|
||||||
|
host => {
|
||||||
|
for name, output in outputs :
|
||||||
|
name => output if !issensitive(output)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
sensitive = false
|
||||||
|
}
|
22
infra/modules/host/endpoints.tf
Normal file
22
infra/modules/host/endpoints.tf
Normal file
|
@ -0,0 +1,22 @@
|
||||||
|
variable "endpoints_v4" {
|
||||||
|
type = list(string)
|
||||||
|
}
|
||||||
|
|
||||||
|
variable "endpoints_v6" {
|
||||||
|
type = list(string)
|
||||||
|
}
|
||||||
|
|
||||||
|
output "endpoints" {
|
||||||
|
value = concat(var.endpoints_v4, var.endpoints_v6)
|
||||||
|
sensitive = false
|
||||||
|
}
|
||||||
|
|
||||||
|
output "endpoints_v4" {
|
||||||
|
value = var.endpoints_v4
|
||||||
|
sensitive = false
|
||||||
|
}
|
||||||
|
|
||||||
|
output "endpoints_v6" {
|
||||||
|
value = var.endpoints_v6
|
||||||
|
sensitive = false
|
||||||
|
}
|
55
infra/modules/host/enthalpy.tf
Normal file
55
infra/modules/host/enthalpy.tf
Normal file
|
@ -0,0 +1,55 @@
|
||||||
|
variable "enthalpy_network_prefix" {
|
||||||
|
type = string
|
||||||
|
}
|
||||||
|
|
||||||
|
variable "enthalpy_organizations" {
|
||||||
|
type = map(string)
|
||||||
|
}
|
||||||
|
|
||||||
|
variable "enthalpy_private_key" {
|
||||||
|
type = map(object({
|
||||||
|
private_key_pem = string
|
||||||
|
}))
|
||||||
|
}
|
||||||
|
|
||||||
|
variable "enthalpy_node_id" {
|
||||||
|
type = number
|
||||||
|
}
|
||||||
|
|
||||||
|
variable "enthalpy_node_organization" {
|
||||||
|
type = string
|
||||||
|
}
|
||||||
|
|
||||||
|
locals {
|
||||||
|
enthalpy_network_prefix_length = tonumber(regex(".*/([[:digit:]]+)", var.enthalpy_network_prefix)[0])
|
||||||
|
enthalpy_node_enabled = var.enthalpy_node_id != null && var.enthalpy_node_organization != null
|
||||||
|
enthalpy_node_organization = local.enthalpy_node_enabled ? var.enthalpy_organizations[var.enthalpy_node_organization] : null
|
||||||
|
enthalpy_node_private_key_pem = local.enthalpy_node_enabled ? var.enthalpy_private_key[var.enthalpy_node_organization].private_key_pem : null
|
||||||
|
enthalpy_node_prefix = local.enthalpy_node_enabled ? cidrsubnet(var.enthalpy_network_prefix, 60 - local.enthalpy_network_prefix_length, var.enthalpy_node_id) : null
|
||||||
|
enthalpy_node_address = local.enthalpy_node_enabled ? cidrhost(local.enthalpy_node_prefix, 1) : null
|
||||||
|
}
|
||||||
|
|
||||||
|
output "enthalpy_node_id" {
|
||||||
|
value = var.enthalpy_node_id
|
||||||
|
sensitive = false
|
||||||
|
}
|
||||||
|
|
||||||
|
output "enthalpy_node_organization" {
|
||||||
|
value = local.enthalpy_node_organization
|
||||||
|
sensitive = false
|
||||||
|
}
|
||||||
|
|
||||||
|
output "enthalpy_node_private_key_pem" {
|
||||||
|
value = local.enthalpy_node_private_key_pem
|
||||||
|
sensitive = true
|
||||||
|
}
|
||||||
|
|
||||||
|
output "enthalpy_node_prefix" {
|
||||||
|
value = local.enthalpy_node_prefix
|
||||||
|
sensitive = false
|
||||||
|
}
|
||||||
|
|
||||||
|
output "enthalpy_node_address" {
|
||||||
|
value = local.enthalpy_node_address
|
||||||
|
sensitive = false
|
||||||
|
}
|
3
infra/modules/host/main.tf
Normal file
3
infra/modules/host/main.tf
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
variable "name" {
|
||||||
|
type = string
|
||||||
|
}
|
28
infra/modules/host/openssh.tf
Normal file
28
infra/modules/host/openssh.tf
Normal file
|
@ -0,0 +1,28 @@
|
||||||
|
resource "tls_private_key" "host_rsa" {
|
||||||
|
algorithm = "RSA"
|
||||||
|
rsa_bits = 4096
|
||||||
|
}
|
||||||
|
|
||||||
|
resource "tls_private_key" "host_ed25519" {
|
||||||
|
algorithm = "ED25519"
|
||||||
|
}
|
||||||
|
|
||||||
|
output "ssh_host_rsa_key_pub" {
|
||||||
|
value = trimspace(tls_private_key.host_rsa.public_key_openssh)
|
||||||
|
sensitive = false
|
||||||
|
}
|
||||||
|
|
||||||
|
output "ssh_host_rsa_key" {
|
||||||
|
value = tls_private_key.host_rsa.private_key_openssh
|
||||||
|
sensitive = true
|
||||||
|
}
|
||||||
|
|
||||||
|
output "ssh_host_ed25519_key_pub" {
|
||||||
|
value = trimspace(tls_private_key.host_ed25519.public_key_openssh)
|
||||||
|
sensitive = false
|
||||||
|
}
|
||||||
|
|
||||||
|
output "ssh_host_ed25519_key" {
|
||||||
|
value = tls_private_key.host_ed25519.private_key_openssh
|
||||||
|
sensitive = true
|
||||||
|
}
|
7
infra/modules/host/providers.tf
Normal file
7
infra/modules/host/providers.tf
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
terraform {
|
||||||
|
required_providers {
|
||||||
|
tls = {
|
||||||
|
source = "registry.terraform.io/hashicorp/tls"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
10
infra/providers.tf
Normal file
10
infra/providers.tf
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
terraform {
|
||||||
|
required_providers {
|
||||||
|
sops = {
|
||||||
|
source = "registry.terraform.io/carlpett/sops"
|
||||||
|
}
|
||||||
|
tls = {
|
||||||
|
source = "registry.terraform.io/hashicorp/tls"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
7
infra/secrets.tf
Normal file
7
infra/secrets.tf
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
data "sops_file" "secrets" {
|
||||||
|
source_file = "secrets.yaml"
|
||||||
|
}
|
||||||
|
|
||||||
|
locals {
|
||||||
|
secrets = yamldecode(data.sops_file.secrets.raw)
|
||||||
|
}
|
21
infra/secrets.yaml
Normal file
21
infra/secrets.yaml
Normal file
|
@ -0,0 +1,21 @@
|
||||||
|
tofu: ENC[AES256_GCM,data:wv2zsYRcwM8boVYSaH4EtI4poL/modLixJ8gDoP1T7+JLDyCRyZQsu6WkMR9JPJrRsbMvQ2tFFrk8LPZU2hhh6BqqPX/ZlYUAmAQACuZa1JnUYeskc2TLVNkaL9Glz+cpfylyHQr0ARwEw5Q/cWdC1Xg55pnRFmVOQSY9Sf9asE6fxZ0JIAMPQeVTCe+CQ==,iv:O3smIEUNBPh4pAGUgbnKqLrqjCCK+ZRzVa9mnx9P4s0=,tag:Iv8UFwnUKTUgU+YFQ3gaqg==,type:str]
|
||||||
|
sops:
|
||||||
|
kms: []
|
||||||
|
gcp_kms: []
|
||||||
|
azure_kv: []
|
||||||
|
hc_vault: []
|
||||||
|
age:
|
||||||
|
- recipient: age1sfnct03u4cvfj98x4yjrcrrnu5gg8qgxrwk4uqq8w4e6wveeaedq97rn44
|
||||||
|
enc: |
|
||||||
|
-----BEGIN AGE ENCRYPTED FILE-----
|
||||||
|
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSArdnlvV09oUWNERmJyM0ZW
|
||||||
|
WStza2xMdm1JTVRzR0ZBcFlwOFdxamZQMmdZCkVIZG1HOVNla3RQbjRzNmlUUDRX
|
||||||
|
YitxTXQwUVUzb1JHbEI3NFlMbjI0MmMKLS0tIDRkdjhCcWRNYTkyYWJwUmZENjh3
|
||||||
|
Rk1mSHZicDNuVVFpL1NMcS9NS0NmRXcKT2GiNJ8L2ADuoJPm5XF1SrkNZtEzh/i5
|
||||||
|
8gGmswWnE+d7VM0BSnM64la/E4prcIhM4e4Ybyd8El6pwQN919gofQ==
|
||||||
|
-----END AGE ENCRYPTED FILE-----
|
||||||
|
lastmodified: "2024-11-23T07:54:24Z"
|
||||||
|
mac: ENC[AES256_GCM,data:03Bina9HvdovMlUBceqa321L628AR89knW+6wB1Do6fPv3JgDjnSByqq7uewzLms+npVJY6Vj1VtWfwplgnd/UZvvoE0m9yu0Kmv+hOKy5eF5gI+G43j9YKoGzFnqIV+pCXZBF0gqBU+7qpGz3w3C82CG5uHbd6hEQyS0rqDnHA=,iv:lYvY105TcODa3wwmQTJbPxoN3eam6RDNR2ZTI3I3zXw=,tag:h6FNgpN1Kj7sM1gSKZKE0g==,type:str]
|
||||||
|
pgp: []
|
||||||
|
unencrypted_suffix: _unencrypted
|
||||||
|
version: 3.9.1
|
1
infra/terraform.tfstate
Normal file
1
infra/terraform.tfstate
Normal file
File diff suppressed because one or more lines are too long
51
justfile
Normal file
51
justfile
Normal file
|
@ -0,0 +1,51 @@
|
||||||
|
set shell := ["bash", "-c"]
|
||||||
|
|
||||||
|
[linux]
|
||||||
|
[group('nix')]
|
||||||
|
remote name:
|
||||||
|
nixos-rebuild switch --flake .#{{name}} --target-host root@{{name}} --verbose --show-trace
|
||||||
|
|
||||||
|
[linux]
|
||||||
|
[group('nix')]
|
||||||
|
local name:
|
||||||
|
nixos-rebuild switch --use-remote-sudo --flake .#{{name}} --verbose --show-trace
|
||||||
|
|
||||||
|
[group('nix')]
|
||||||
|
up:
|
||||||
|
nix flake update
|
||||||
|
|
||||||
|
[group('nix')]
|
||||||
|
upp input:
|
||||||
|
nix flake lock --update-input {{input}}
|
||||||
|
|
||||||
|
[group('nix')]
|
||||||
|
history:
|
||||||
|
nix profile diff-closures --profile /nix/var/nix/profiles/system
|
||||||
|
|
||||||
|
[group('nix')]
|
||||||
|
repl:
|
||||||
|
nix repl -f flake:nixpkgs
|
||||||
|
|
||||||
|
[linux]
|
||||||
|
[group('infra')]
|
||||||
|
plan:
|
||||||
|
tofu -chdir="infra" plan
|
||||||
|
|
||||||
|
[linux]
|
||||||
|
[group('infra')]
|
||||||
|
apply:
|
||||||
|
tofu -chdir="infra" apply
|
||||||
|
|
||||||
|
[linux]
|
||||||
|
[group('infra')]
|
||||||
|
zone:
|
||||||
|
tofu -chdir="infra" output -json | jq -f zones/data.jq > zones/data.json
|
||||||
|
cat zones/data.json | jq -f zones/registry.jq > zones/registry.json
|
||||||
|
|
||||||
|
[linux]
|
||||||
|
[group('infra')]
|
||||||
|
secret name:
|
||||||
|
nix eval --raw .#nixosConfigurations.{{name}}.config.sops.opentofuTemplate > test.json
|
||||||
|
tofu -chdir="infra" output -json | jq -f test.json > secrets/hosts/opentofu/{{name}}.yaml
|
||||||
|
sops --input-type json --output-type yaml --in-place --encrypt secrets/hosts/opentofu/{{name}}.yaml
|
||||||
|
rm -i test.json
|
10
nixos/hosts/flandre-m5p/default.nix
Normal file
10
nixos/hosts/flandre-m5p/default.nix
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
{
|
||||||
|
suites,
|
||||||
|
mylib,
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
{
|
||||||
|
imports = suites.server ++ (mylib.path.scanPaths ./. "default.nix");
|
||||||
|
|
||||||
|
system.stateVersion = "24.05";
|
||||||
|
}
|
84
nixos/hosts/flandre-m5p/disko-fs.nix
Normal file
84
nixos/hosts/flandre-m5p/disko-fs.nix
Normal file
|
@ -0,0 +1,84 @@
|
||||||
|
{
|
||||||
|
disko.devices = {
|
||||||
|
nodev = {
|
||||||
|
"/" = {
|
||||||
|
fsType = "tmpfs";
|
||||||
|
mountOptions = [
|
||||||
|
"defaults"
|
||||||
|
"size=8G"
|
||||||
|
"mode=755"
|
||||||
|
"nosuid"
|
||||||
|
"nodev"
|
||||||
|
];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
disk = {
|
||||||
|
main = {
|
||||||
|
type = "disk";
|
||||||
|
device = "/dev/disk/by-path/pci-0000:04:00.0-nvme-1";
|
||||||
|
content = {
|
||||||
|
type = "gpt";
|
||||||
|
partitions = {
|
||||||
|
esp = {
|
||||||
|
label = "ESP";
|
||||||
|
size = "2G";
|
||||||
|
type = "EF00";
|
||||||
|
content = {
|
||||||
|
type = "filesystem";
|
||||||
|
format = "vfat";
|
||||||
|
mountpoint = "/boot";
|
||||||
|
mountOptions = [ "umask=0077" ];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
cryptroot = {
|
||||||
|
label = "CRYPTROOT";
|
||||||
|
size = "100%";
|
||||||
|
content = {
|
||||||
|
type = "luks";
|
||||||
|
name = "cryptroot";
|
||||||
|
settings = {
|
||||||
|
allowDiscards = true;
|
||||||
|
bypassWorkqueues = true;
|
||||||
|
crypttabExtraOpts = [
|
||||||
|
"same-cpu-crypt"
|
||||||
|
"submit-from-crypt-cpus"
|
||||||
|
];
|
||||||
|
# unattended boot via usb
|
||||||
|
keyFile = "/dev/disk/by-id/usb-aigo_U330_80101016-0:0";
|
||||||
|
keyFileSize = 512 * 64;
|
||||||
|
};
|
||||||
|
content = {
|
||||||
|
type = "btrfs";
|
||||||
|
extraArgs = [ "-f" ];
|
||||||
|
subvolumes = {
|
||||||
|
"/persist" = {
|
||||||
|
mountpoint = "/persist";
|
||||||
|
mountOptions = [ "compress=zstd" ];
|
||||||
|
};
|
||||||
|
"/nix" = {
|
||||||
|
mountpoint = "/nix";
|
||||||
|
mountOptions = [ "compress=zstd" ];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
fileSystems."/persist".neededForBoot = true;
|
||||||
|
|
||||||
|
environment.globalPersistence = {
|
||||||
|
enable = true;
|
||||||
|
root = "/persist";
|
||||||
|
};
|
||||||
|
|
||||||
|
services.btrfs.autoScrub = {
|
||||||
|
enable = true;
|
||||||
|
interval = "weekly";
|
||||||
|
fileSystems = [ "/persist" ];
|
||||||
|
};
|
||||||
|
}
|
26
nixos/hosts/flandre-m5p/hardware-configuration.nix
Normal file
26
nixos/hosts/flandre-m5p/hardware-configuration.nix
Normal file
|
@ -0,0 +1,26 @@
|
||||||
|
{ ... }:
|
||||||
|
{
|
||||||
|
boot = {
|
||||||
|
initrd.availableKernelModules = [
|
||||||
|
"xhci_pci"
|
||||||
|
"ahci"
|
||||||
|
"usbhid"
|
||||||
|
"usb_storage"
|
||||||
|
"sd_mod"
|
||||||
|
];
|
||||||
|
kernelModules = [ "kvm-amd" ];
|
||||||
|
loader = {
|
||||||
|
efi.canTouchEfiVariables = false;
|
||||||
|
systemd-boot.enable = true;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
networking.wireless.iwd.enable = true;
|
||||||
|
|
||||||
|
hardware = {
|
||||||
|
amdgpu.initrd.enable = true;
|
||||||
|
cpu.amd.updateMicrocode = true;
|
||||||
|
enableRedistributableFirmware = true;
|
||||||
|
graphics.enable = true;
|
||||||
|
};
|
||||||
|
}
|
67
nixos/hosts/flandre-m5p/networking.nix
Normal file
67
nixos/hosts/flandre-m5p/networking.nix
Normal file
|
@ -0,0 +1,67 @@
|
||||||
|
{ profiles, lib, ... }:
|
||||||
|
{
|
||||||
|
imports = with profiles; [
|
||||||
|
services.enthalpy
|
||||||
|
];
|
||||||
|
|
||||||
|
services.enthalpy.ipsec.interfaces = [ "enp2s0" ];
|
||||||
|
|
||||||
|
systemd.network = {
|
||||||
|
enable = true;
|
||||||
|
wait-online.anyInterface = true;
|
||||||
|
config = {
|
||||||
|
networkConfig = {
|
||||||
|
IPv4Forwarding = true;
|
||||||
|
IPv6Forwarding = true;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
networks = {
|
||||||
|
"30-enp1s0" = {
|
||||||
|
matchConfig.Name = "enp1s0";
|
||||||
|
networkConfig = {
|
||||||
|
DHCPServer = "yes";
|
||||||
|
IPv6SendRA = "yes";
|
||||||
|
IPv6PrivacyExtensions = true;
|
||||||
|
IPv6AcceptRA = "no";
|
||||||
|
KeepConfiguration = true;
|
||||||
|
};
|
||||||
|
dhcpServerConfig = {
|
||||||
|
ServerAddress = "100.64.0.1/20";
|
||||||
|
EmitDNS = true;
|
||||||
|
};
|
||||||
|
ipv6Prefixes = lib.singleton {
|
||||||
|
Prefix = "fdce:2962:c3c1:130c::/64";
|
||||||
|
Assign = true;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
"30-enp2s0" = {
|
||||||
|
matchConfig.Name = "enp2s0";
|
||||||
|
networkConfig = {
|
||||||
|
DHCP = "yes";
|
||||||
|
IPv6AcceptRA = true;
|
||||||
|
IPv6PrivacyExtensions = true;
|
||||||
|
KeepConfiguration = true;
|
||||||
|
};
|
||||||
|
dhcpV4Config.RouteMetric = 1024;
|
||||||
|
dhcpV6Config.RouteMetric = 1024;
|
||||||
|
ipv6AcceptRAConfig.RouteMetric = 1024;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
networking.nftables.tables.nat = {
|
||||||
|
family = "inet";
|
||||||
|
content = ''
|
||||||
|
chain input {
|
||||||
|
type filter hook input priority mangle; policy accept;
|
||||||
|
iifname enp2s0 tcp dport { http, https } counter drop
|
||||||
|
iifname enp2s0 udp dport { http, https } counter drop
|
||||||
|
}
|
||||||
|
|
||||||
|
chain postrouting {
|
||||||
|
type nat hook postrouting priority srcnat; policy accept;
|
||||||
|
oifname enp2s0 counter masquerade
|
||||||
|
}
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
}
|
31
nixos/hosts/marisa-7d76/default.nix
Normal file
31
nixos/hosts/marisa-7d76/default.nix
Normal file
|
@ -0,0 +1,31 @@
|
||||||
|
{
|
||||||
|
suites,
|
||||||
|
profiles,
|
||||||
|
mylib,
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
{
|
||||||
|
imports =
|
||||||
|
suites.workstation
|
||||||
|
++ [
|
||||||
|
profiles.system.boot.binfmt
|
||||||
|
profiles.system.boot.secure-boot
|
||||||
|
profiles.users.rebmit
|
||||||
|
]
|
||||||
|
++ (mylib.path.scanPaths ./. "default.nix");
|
||||||
|
|
||||||
|
home-manager.users.rebmit =
|
||||||
|
{ suites, profiles, ... }:
|
||||||
|
{
|
||||||
|
imports = suites.desktop-workstation ++ [
|
||||||
|
profiles.syncthing
|
||||||
|
];
|
||||||
|
|
||||||
|
programs.niri.settings = {
|
||||||
|
input.tablet.map-to-output = "HDMI-A-1";
|
||||||
|
outputs."HDMI-A-1".scale = 1.75;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
system.stateVersion = "24.05";
|
||||||
|
}
|
81
nixos/hosts/marisa-7d76/disko-fs.nix
Normal file
81
nixos/hosts/marisa-7d76/disko-fs.nix
Normal file
|
@ -0,0 +1,81 @@
|
||||||
|
{
|
||||||
|
disko.devices = {
|
||||||
|
nodev = {
|
||||||
|
"/" = {
|
||||||
|
fsType = "tmpfs";
|
||||||
|
mountOptions = [
|
||||||
|
"defaults"
|
||||||
|
"size=8G"
|
||||||
|
"mode=755"
|
||||||
|
"nosuid"
|
||||||
|
"nodev"
|
||||||
|
];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
disk = {
|
||||||
|
main = {
|
||||||
|
type = "disk";
|
||||||
|
device = "/dev/disk/by-path/pci-0000:04:00.0-nvme-1";
|
||||||
|
content = {
|
||||||
|
type = "gpt";
|
||||||
|
partitions = {
|
||||||
|
esp = {
|
||||||
|
label = "ESP";
|
||||||
|
size = "2G";
|
||||||
|
type = "EF00";
|
||||||
|
content = {
|
||||||
|
type = "filesystem";
|
||||||
|
format = "vfat";
|
||||||
|
mountpoint = "/boot";
|
||||||
|
mountOptions = [ "umask=0077" ];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
cryptroot = {
|
||||||
|
label = "CRYPTROOT";
|
||||||
|
size = "100%";
|
||||||
|
content = {
|
||||||
|
type = "luks";
|
||||||
|
name = "cryptroot";
|
||||||
|
settings = {
|
||||||
|
allowDiscards = true;
|
||||||
|
bypassWorkqueues = true;
|
||||||
|
crypttabExtraOpts = [
|
||||||
|
"same-cpu-crypt"
|
||||||
|
"submit-from-crypt-cpus"
|
||||||
|
];
|
||||||
|
};
|
||||||
|
content = {
|
||||||
|
type = "btrfs";
|
||||||
|
extraArgs = [ "-f" ];
|
||||||
|
subvolumes = {
|
||||||
|
"/persist" = {
|
||||||
|
mountpoint = "/persist";
|
||||||
|
mountOptions = [ "compress=zstd" ];
|
||||||
|
};
|
||||||
|
"/nix" = {
|
||||||
|
mountpoint = "/nix";
|
||||||
|
mountOptions = [ "compress=zstd" ];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
fileSystems."/persist".neededForBoot = true;
|
||||||
|
|
||||||
|
environment.globalPersistence = {
|
||||||
|
enable = true;
|
||||||
|
root = "/persist";
|
||||||
|
};
|
||||||
|
|
||||||
|
services.btrfs.autoScrub = {
|
||||||
|
enable = true;
|
||||||
|
interval = "weekly";
|
||||||
|
fileSystems = [ "/persist" ];
|
||||||
|
};
|
||||||
|
}
|
34
nixos/hosts/marisa-7d76/hardware-configuration.nix
Normal file
34
nixos/hosts/marisa-7d76/hardware-configuration.nix
Normal file
|
@ -0,0 +1,34 @@
|
||||||
|
{ lib, ... }:
|
||||||
|
{
|
||||||
|
boot = {
|
||||||
|
initrd.availableKernelModules = [
|
||||||
|
"nvme"
|
||||||
|
"ahci"
|
||||||
|
"xhci_pci"
|
||||||
|
"usbhid"
|
||||||
|
"sd_mod"
|
||||||
|
];
|
||||||
|
kernelModules = [ "kvm-amd" ];
|
||||||
|
loader = {
|
||||||
|
efi.canTouchEfiVariables = true;
|
||||||
|
systemd-boot.enable = lib.mkDefault true;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
networking.wireless.iwd.enable = true;
|
||||||
|
|
||||||
|
hardware = {
|
||||||
|
amdgpu.initrd.enable = true;
|
||||||
|
cpu.amd.updateMicrocode = true;
|
||||||
|
enableRedistributableFirmware = true;
|
||||||
|
graphics.enable = true;
|
||||||
|
};
|
||||||
|
|
||||||
|
services = {
|
||||||
|
udev.extraHwdb = ''
|
||||||
|
evdev:input:b*v046Dp4089*
|
||||||
|
KEYBOARD_KEY_70039=esc
|
||||||
|
KEYBOARD_KEY_70029=capslock
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
}
|
46
nixos/hosts/marisa-7d76/networking.nix
Normal file
46
nixos/hosts/marisa-7d76/networking.nix
Normal file
|
@ -0,0 +1,46 @@
|
||||||
|
{ profiles, lib, ... }:
|
||||||
|
{
|
||||||
|
imports = with profiles; [
|
||||||
|
services.enthalpy
|
||||||
|
];
|
||||||
|
|
||||||
|
services.enthalpy = {
|
||||||
|
ipsec.interfaces = [ "enp14s0" ];
|
||||||
|
sing-box = {
|
||||||
|
enable = true;
|
||||||
|
clat = {
|
||||||
|
enable = true;
|
||||||
|
segment = lib.singleton "fde3:3be3:a244:2676::2";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
systemd.network = {
|
||||||
|
enable = true;
|
||||||
|
wait-online.anyInterface = true;
|
||||||
|
networks = {
|
||||||
|
"30-enp14s0" = {
|
||||||
|
matchConfig.Name = "enp14s0";
|
||||||
|
networkConfig = {
|
||||||
|
DHCP = "yes";
|
||||||
|
IPv6AcceptRA = true;
|
||||||
|
IPv6PrivacyExtensions = true;
|
||||||
|
};
|
||||||
|
dhcpV4Config.RouteMetric = 1024;
|
||||||
|
dhcpV6Config.RouteMetric = 1024;
|
||||||
|
ipv6AcceptRAConfig.RouteMetric = 1024;
|
||||||
|
};
|
||||||
|
"40-wlan0" = {
|
||||||
|
matchConfig.Name = "wlan0";
|
||||||
|
networkConfig = {
|
||||||
|
DHCP = "yes";
|
||||||
|
IPv6AcceptRA = true;
|
||||||
|
IPv6PrivacyExtensions = true;
|
||||||
|
};
|
||||||
|
dhcpV4Config.RouteMetric = 2048;
|
||||||
|
dhcpV6Config.RouteMetric = 2048;
|
||||||
|
ipv6AcceptRAConfig.RouteMetric = 2048;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
30
nixos/hosts/marisa-a7s/default.nix
Normal file
30
nixos/hosts/marisa-a7s/default.nix
Normal file
|
@ -0,0 +1,30 @@
|
||||||
|
{
|
||||||
|
suites,
|
||||||
|
profiles,
|
||||||
|
mylib,
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
{
|
||||||
|
imports =
|
||||||
|
suites.workstation
|
||||||
|
++ [
|
||||||
|
profiles.users.rebmit
|
||||||
|
]
|
||||||
|
++ (mylib.path.scanPaths ./. "default.nix");
|
||||||
|
|
||||||
|
home-manager.users.rebmit =
|
||||||
|
{ suites, profiles, ... }:
|
||||||
|
{
|
||||||
|
imports = suites.desktop-workstation ++ [
|
||||||
|
profiles.syncthing
|
||||||
|
];
|
||||||
|
|
||||||
|
programs.niri.settings = {
|
||||||
|
outputs."eDP-1".scale = 1.2;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
services.power-profiles-daemon.enable = true;
|
||||||
|
|
||||||
|
system.stateVersion = "24.05";
|
||||||
|
}
|
81
nixos/hosts/marisa-a7s/disko-fs.nix
Normal file
81
nixos/hosts/marisa-a7s/disko-fs.nix
Normal file
|
@ -0,0 +1,81 @@
|
||||||
|
{
|
||||||
|
disko.devices = {
|
||||||
|
nodev = {
|
||||||
|
"/" = {
|
||||||
|
fsType = "tmpfs";
|
||||||
|
mountOptions = [
|
||||||
|
"defaults"
|
||||||
|
"size=8G"
|
||||||
|
"mode=755"
|
||||||
|
"nosuid"
|
||||||
|
"nodev"
|
||||||
|
];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
disk = {
|
||||||
|
main = {
|
||||||
|
type = "disk";
|
||||||
|
device = "/dev/disk/by-path/pci-0000:04:00.0-nvme-1";
|
||||||
|
content = {
|
||||||
|
type = "gpt";
|
||||||
|
partitions = {
|
||||||
|
esp = {
|
||||||
|
label = "ESP";
|
||||||
|
size = "2G";
|
||||||
|
type = "EF00";
|
||||||
|
content = {
|
||||||
|
type = "filesystem";
|
||||||
|
format = "vfat";
|
||||||
|
mountpoint = "/boot";
|
||||||
|
mountOptions = [ "umask=0077" ];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
cryptroot = {
|
||||||
|
label = "CRYPTROOT";
|
||||||
|
size = "100%";
|
||||||
|
content = {
|
||||||
|
type = "luks";
|
||||||
|
name = "cryptroot";
|
||||||
|
settings = {
|
||||||
|
allowDiscards = true;
|
||||||
|
bypassWorkqueues = true;
|
||||||
|
crypttabExtraOpts = [
|
||||||
|
"same-cpu-crypt"
|
||||||
|
"submit-from-crypt-cpus"
|
||||||
|
];
|
||||||
|
};
|
||||||
|
content = {
|
||||||
|
type = "btrfs";
|
||||||
|
extraArgs = [ "-f" ];
|
||||||
|
subvolumes = {
|
||||||
|
"/persist" = {
|
||||||
|
mountpoint = "/persist";
|
||||||
|
mountOptions = [ "compress=zstd" ];
|
||||||
|
};
|
||||||
|
"/nix" = {
|
||||||
|
mountpoint = "/nix";
|
||||||
|
mountOptions = [ "compress=zstd" ];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
fileSystems."/persist".neededForBoot = true;
|
||||||
|
|
||||||
|
environment.globalPersistence = {
|
||||||
|
enable = true;
|
||||||
|
root = "/persist";
|
||||||
|
};
|
||||||
|
|
||||||
|
services.btrfs.autoScrub = {
|
||||||
|
enable = true;
|
||||||
|
interval = "weekly";
|
||||||
|
fileSystems = [ "/persist" ];
|
||||||
|
};
|
||||||
|
}
|
36
nixos/hosts/marisa-a7s/hardware-configuration.nix
Normal file
36
nixos/hosts/marisa-a7s/hardware-configuration.nix
Normal file
|
@ -0,0 +1,36 @@
|
||||||
|
{ lib, ... }:
|
||||||
|
{
|
||||||
|
boot = {
|
||||||
|
initrd.availableKernelModules = [
|
||||||
|
"nvme"
|
||||||
|
"ahci"
|
||||||
|
"xhci_pci"
|
||||||
|
];
|
||||||
|
kernelModules = [ "kvm-amd" ];
|
||||||
|
loader = {
|
||||||
|
efi.canTouchEfiVariables = true;
|
||||||
|
systemd-boot.enable = lib.mkDefault true;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
networking.wireless.iwd.enable = true;
|
||||||
|
|
||||||
|
hardware = {
|
||||||
|
amdgpu.initrd.enable = true;
|
||||||
|
cpu.amd.updateMicrocode = true;
|
||||||
|
enableRedistributableFirmware = true;
|
||||||
|
graphics.enable = true;
|
||||||
|
};
|
||||||
|
|
||||||
|
services = {
|
||||||
|
udev.extraHwdb = ''
|
||||||
|
evdev:input:b*v046Dp4089*
|
||||||
|
KEYBOARD_KEY_70039=esc
|
||||||
|
KEYBOARD_KEY_70029=capslock
|
||||||
|
|
||||||
|
evdev:atkbd:dmi:*
|
||||||
|
KEYBOARD_KEY_3a=esc
|
||||||
|
KEYBOARD_KEY_01=capslock
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
}
|
49
nixos/hosts/marisa-a7s/networking.nix
Normal file
49
nixos/hosts/marisa-a7s/networking.nix
Normal file
|
@ -0,0 +1,49 @@
|
||||||
|
{ profiles, lib, ... }:
|
||||||
|
{
|
||||||
|
imports = with profiles; [
|
||||||
|
services.enthalpy
|
||||||
|
];
|
||||||
|
|
||||||
|
services.enthalpy = {
|
||||||
|
ipsec = {
|
||||||
|
interfaces = [ "wlan0" ];
|
||||||
|
whitelist = [ "rebmit's edge network" ];
|
||||||
|
};
|
||||||
|
sing-box = {
|
||||||
|
enable = true;
|
||||||
|
clat = {
|
||||||
|
enable = true;
|
||||||
|
segment = lib.singleton "fde3:3be3:a244:2676::2";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
systemd.network = {
|
||||||
|
enable = true;
|
||||||
|
wait-online.anyInterface = true;
|
||||||
|
networks = {
|
||||||
|
"30-enp3s0" = {
|
||||||
|
matchConfig.Name = "enp3s0";
|
||||||
|
networkConfig = {
|
||||||
|
DHCP = "yes";
|
||||||
|
IPv6AcceptRA = true;
|
||||||
|
IPv6PrivacyExtensions = true;
|
||||||
|
};
|
||||||
|
dhcpV4Config.RouteMetric = 1024;
|
||||||
|
dhcpV6Config.RouteMetric = 1024;
|
||||||
|
ipv6AcceptRAConfig.RouteMetric = 1024;
|
||||||
|
};
|
||||||
|
"40-wlan0" = {
|
||||||
|
matchConfig.Name = "wlan0";
|
||||||
|
networkConfig = {
|
||||||
|
DHCP = "yes";
|
||||||
|
IPv6AcceptRA = true;
|
||||||
|
IPv6PrivacyExtensions = true;
|
||||||
|
};
|
||||||
|
dhcpV4Config.RouteMetric = 2048;
|
||||||
|
dhcpV6Config.RouteMetric = 2048;
|
||||||
|
ipv6AcceptRAConfig.RouteMetric = 2048;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
20
nixos/hosts/reisen-lax0/default.nix
Normal file
20
nixos/hosts/reisen-lax0/default.nix
Normal file
|
@ -0,0 +1,20 @@
|
||||||
|
{
|
||||||
|
suites,
|
||||||
|
mylib,
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
{
|
||||||
|
imports = suites.server ++ (mylib.path.scanPaths ./. "default.nix");
|
||||||
|
|
||||||
|
services.caddy = {
|
||||||
|
enable = true;
|
||||||
|
virtualHosts."rebmit.moe".extraConfig = ''
|
||||||
|
header /.well-known/matrix/* Content-Type application/json
|
||||||
|
header /.well-known/matrix/* Access-Control-Allow-Origin *
|
||||||
|
respond /.well-known/matrix/server `{"m.server": "matrix.rebmit.moe:443"}`
|
||||||
|
respond /.well-known/matrix/client `{"m.homeserver":{"base_url":"https://matrix.rebmit.moe"}}`
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
|
||||||
|
system.stateVersion = "24.05";
|
||||||
|
}
|
68
nixos/hosts/reisen-lax0/disko-fs.nix
Normal file
68
nixos/hosts/reisen-lax0/disko-fs.nix
Normal file
|
@ -0,0 +1,68 @@
|
||||||
|
{
|
||||||
|
disko.devices = {
|
||||||
|
nodev = {
|
||||||
|
"/" = {
|
||||||
|
fsType = "tmpfs";
|
||||||
|
mountOptions = [
|
||||||
|
"defaults"
|
||||||
|
"size=2G"
|
||||||
|
"mode=755"
|
||||||
|
"nosuid"
|
||||||
|
"nodev"
|
||||||
|
];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
disk = {
|
||||||
|
main = {
|
||||||
|
type = "disk";
|
||||||
|
device = "/dev/vda";
|
||||||
|
content = {
|
||||||
|
type = "gpt";
|
||||||
|
partitions = {
|
||||||
|
boot = {
|
||||||
|
type = "EF02";
|
||||||
|
label = "BOOT";
|
||||||
|
start = "0";
|
||||||
|
end = "+1M";
|
||||||
|
};
|
||||||
|
root = {
|
||||||
|
label = "ROOT";
|
||||||
|
end = "-0";
|
||||||
|
content = {
|
||||||
|
type = "btrfs";
|
||||||
|
extraArgs = [ "-f" ];
|
||||||
|
subvolumes = {
|
||||||
|
"boot" = {
|
||||||
|
mountpoint = "/boot";
|
||||||
|
mountOptions = [ "compress=zstd" ];
|
||||||
|
};
|
||||||
|
"nix" = {
|
||||||
|
mountpoint = "/nix";
|
||||||
|
mountOptions = [ "compress=zstd" ];
|
||||||
|
};
|
||||||
|
"persist" = {
|
||||||
|
mountpoint = "/persist";
|
||||||
|
mountOptions = [ "compress=zstd" ];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
fileSystems."/persist".neededForBoot = true;
|
||||||
|
|
||||||
|
environment.globalPersistence = {
|
||||||
|
enable = true;
|
||||||
|
root = "/persist";
|
||||||
|
};
|
||||||
|
|
||||||
|
services.btrfs.autoScrub = {
|
||||||
|
enable = true;
|
||||||
|
interval = "weekly";
|
||||||
|
fileSystems = [ "/persist" ];
|
||||||
|
};
|
||||||
|
}
|
15
nixos/hosts/reisen-lax0/hardware-configuration.nix
Normal file
15
nixos/hosts/reisen-lax0/hardware-configuration.nix
Normal file
|
@ -0,0 +1,15 @@
|
||||||
|
{ modulesPath, ... }:
|
||||||
|
{
|
||||||
|
imports = [
|
||||||
|
(modulesPath + "/profiles/qemu-guest.nix")
|
||||||
|
];
|
||||||
|
|
||||||
|
boot.initrd.availableKernelModules = [
|
||||||
|
"ahci"
|
||||||
|
"sym53c8xx"
|
||||||
|
"xhci_pci"
|
||||||
|
"virtio_pci"
|
||||||
|
"sr_mod"
|
||||||
|
"virtio_blk"
|
||||||
|
];
|
||||||
|
}
|
185
nixos/hosts/reisen-lax0/matrix.nix
Normal file
185
nixos/hosts/reisen-lax0/matrix.nix
Normal file
|
@ -0,0 +1,185 @@
|
||||||
|
# Portions of this file are sourced from
|
||||||
|
# https://github.com/NickCao/flakes/blob/3b03efb676ea602575c916b2b8bc9d9cd13b0d85/nixos/hcloud/hio0/matrix.nix
|
||||||
|
{
|
||||||
|
config,
|
||||||
|
pkgs,
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
let
|
||||||
|
conf = {
|
||||||
|
default_server_config = {
|
||||||
|
"m.homeserver" = {
|
||||||
|
base_url = config.services.matrix-synapse.settings.public_baseurl;
|
||||||
|
server_name = config.services.matrix-synapse.settings.server_name;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
show_labs_settings = true;
|
||||||
|
};
|
||||||
|
in
|
||||||
|
{
|
||||||
|
services.postgresql = {
|
||||||
|
enable = true;
|
||||||
|
package = pkgs.postgresql_16;
|
||||||
|
};
|
||||||
|
|
||||||
|
services.postgresqlBackup = {
|
||||||
|
enable = true;
|
||||||
|
location = "/var/lib/backup/postgresql";
|
||||||
|
backupAll = true;
|
||||||
|
compression = "zstd";
|
||||||
|
};
|
||||||
|
|
||||||
|
sops.secrets."synapse/signing-key" = {
|
||||||
|
sopsFile = config.sops.secretFiles.get "hosts/reisen-lax0.yaml";
|
||||||
|
owner = config.systemd.services.matrix-synapse.serviceConfig.User;
|
||||||
|
};
|
||||||
|
|
||||||
|
sops.secrets."synapse/mautrix-telegram" = {
|
||||||
|
sopsFile = config.sops.secretFiles.get "hosts/reisen-lax0.yaml";
|
||||||
|
};
|
||||||
|
|
||||||
|
systemd.services.matrix-synapse.serviceConfig.LoadCredential = [
|
||||||
|
"telegram:/var/lib/mautrix-telegram/telegram-registration.yaml"
|
||||||
|
"irc:/var/lib/heisenbridge/registration.yml"
|
||||||
|
];
|
||||||
|
|
||||||
|
services.matrix-synapse = {
|
||||||
|
enable = true;
|
||||||
|
withJemalloc = true;
|
||||||
|
settings = {
|
||||||
|
server_name = "rebmit.moe";
|
||||||
|
public_baseurl = "https://matrix.rebmit.moe";
|
||||||
|
signing_key_path = config.sops.secrets."synapse/signing-key".path;
|
||||||
|
|
||||||
|
app_service_config_files = [
|
||||||
|
"/run/credentials/matrix-synapse.service/telegram"
|
||||||
|
"/run/credentials/matrix-synapse.service/irc"
|
||||||
|
];
|
||||||
|
|
||||||
|
enable_registration = true;
|
||||||
|
registration_requires_token = true;
|
||||||
|
|
||||||
|
listeners = [
|
||||||
|
{
|
||||||
|
bind_addresses = [ "127.0.0.1" ];
|
||||||
|
port = 8196;
|
||||||
|
tls = false;
|
||||||
|
type = "http";
|
||||||
|
x_forwarded = true;
|
||||||
|
resources = [
|
||||||
|
{
|
||||||
|
compress = true;
|
||||||
|
names = [
|
||||||
|
"client"
|
||||||
|
"federation"
|
||||||
|
];
|
||||||
|
}
|
||||||
|
];
|
||||||
|
}
|
||||||
|
];
|
||||||
|
|
||||||
|
media_retention = {
|
||||||
|
remote_media_lifetime = "14d";
|
||||||
|
};
|
||||||
|
|
||||||
|
experimental_features = {
|
||||||
|
# Room summary api
|
||||||
|
msc3266_enabled = true;
|
||||||
|
# Removing account data
|
||||||
|
msc3391_enabled = true;
|
||||||
|
# Thread notifications
|
||||||
|
msc3773_enabled = true;
|
||||||
|
# Remotely toggle push notifications for another client
|
||||||
|
msc3881_enabled = true;
|
||||||
|
# Remotely silence local notifications
|
||||||
|
msc3890_enabled = true;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
systemd.services.mautrix-telegram.serviceConfig.RuntimeMaxSec = 86400;
|
||||||
|
|
||||||
|
services.mautrix-telegram = {
|
||||||
|
enable = true;
|
||||||
|
environmentFile = config.sops.secrets."synapse/mautrix-telegram".path;
|
||||||
|
serviceDependencies = [ "matrix-synapse.service" ];
|
||||||
|
settings = {
|
||||||
|
homeserver = {
|
||||||
|
address = "http://127.0.0.1:8196";
|
||||||
|
domain = config.services.matrix-synapse.settings.server_name;
|
||||||
|
};
|
||||||
|
appservice = {
|
||||||
|
address = "http://127.0.0.1:29317";
|
||||||
|
database = "postgres:///mautrix-telegram?host=/run/postgresql";
|
||||||
|
hostname = "127.0.0.1";
|
||||||
|
port = 29317;
|
||||||
|
provisioning.enabled = false;
|
||||||
|
};
|
||||||
|
bridge = {
|
||||||
|
displayname_template = "{displayname}";
|
||||||
|
public_portals = true;
|
||||||
|
delivery_error_reports = true;
|
||||||
|
incoming_bridge_error_reports = true;
|
||||||
|
bridge_matrix_leave = false;
|
||||||
|
relay_user_distinguishers = [ ];
|
||||||
|
create_group_on_invite = false;
|
||||||
|
encryption = {
|
||||||
|
allow = true;
|
||||||
|
default = true;
|
||||||
|
};
|
||||||
|
animated_sticker = {
|
||||||
|
target = "webp";
|
||||||
|
convert_from_webm = true;
|
||||||
|
};
|
||||||
|
state_event_formats = {
|
||||||
|
join = "";
|
||||||
|
leave = "";
|
||||||
|
name_change = "";
|
||||||
|
};
|
||||||
|
permissions = {
|
||||||
|
"*" = "relaybot";
|
||||||
|
"@i:rebmit.moe" = "admin";
|
||||||
|
};
|
||||||
|
relaybot = {
|
||||||
|
authless_portals = false;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
telegram = {
|
||||||
|
device_info = {
|
||||||
|
app_version = "3.5.2";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
logging = {
|
||||||
|
loggers = {
|
||||||
|
mau.level = "INFO";
|
||||||
|
telethon.level = "INFO";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
services.heisenbridge = {
|
||||||
|
enable = true;
|
||||||
|
homeserver = "http://127.0.0.1:8196";
|
||||||
|
address = "127.0.0.1";
|
||||||
|
port = 9898;
|
||||||
|
owner = "@i:rebmit.moe";
|
||||||
|
};
|
||||||
|
|
||||||
|
services.caddy = {
|
||||||
|
virtualHosts."matrix.rebmit.moe".extraConfig = ''
|
||||||
|
reverse_proxy /_matrix/* 127.0.0.1:8196
|
||||||
|
reverse_proxy /_synapse/client/* 127.0.0.1:8196
|
||||||
|
|
||||||
|
header {
|
||||||
|
X-Frame-Options SAMEORIGIN
|
||||||
|
X-Content-Type-Options nosniff
|
||||||
|
X-XSS-Protection "1; mode=block"
|
||||||
|
Content-Security-Policy "frame-ancestors 'self'"
|
||||||
|
}
|
||||||
|
|
||||||
|
file_server
|
||||||
|
root * "${pkgs.element-web.override { inherit conf; }}"
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
}
|
21
nixos/hosts/reisen-lax0/networking.nix
Normal file
21
nixos/hosts/reisen-lax0/networking.nix
Normal file
|
@ -0,0 +1,21 @@
|
||||||
|
{ ... }:
|
||||||
|
{
|
||||||
|
systemd.network = {
|
||||||
|
enable = true;
|
||||||
|
wait-online.anyInterface = true;
|
||||||
|
networks = {
|
||||||
|
"30-enp3s0" = {
|
||||||
|
matchConfig.Name = "enp3s0";
|
||||||
|
networkConfig = {
|
||||||
|
DHCP = "yes";
|
||||||
|
IPv6AcceptRA = true;
|
||||||
|
IPv6PrivacyExtensions = false;
|
||||||
|
KeepConfiguration = true;
|
||||||
|
};
|
||||||
|
dhcpV4Config.RouteMetric = 1024;
|
||||||
|
dhcpV6Config.RouteMetric = 1024;
|
||||||
|
ipv6AcceptRAConfig.RouteMetric = 1024;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
10
nixos/hosts/reisen-sin0/default.nix
Normal file
10
nixos/hosts/reisen-sin0/default.nix
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
{
|
||||||
|
suites,
|
||||||
|
mylib,
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
{
|
||||||
|
imports = suites.server ++ (mylib.path.scanPaths ./. "default.nix");
|
||||||
|
|
||||||
|
system.stateVersion = "24.05";
|
||||||
|
}
|
68
nixos/hosts/reisen-sin0/disko-fs.nix
Normal file
68
nixos/hosts/reisen-sin0/disko-fs.nix
Normal file
|
@ -0,0 +1,68 @@
|
||||||
|
{
|
||||||
|
disko.devices = {
|
||||||
|
nodev = {
|
||||||
|
"/" = {
|
||||||
|
fsType = "tmpfs";
|
||||||
|
mountOptions = [
|
||||||
|
"defaults"
|
||||||
|
"size=1G"
|
||||||
|
"mode=755"
|
||||||
|
"nosuid"
|
||||||
|
"nodev"
|
||||||
|
];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
disk = {
|
||||||
|
main = {
|
||||||
|
type = "disk";
|
||||||
|
device = "/dev/vda";
|
||||||
|
content = {
|
||||||
|
type = "gpt";
|
||||||
|
partitions = {
|
||||||
|
boot = {
|
||||||
|
type = "EF02";
|
||||||
|
label = "BOOT";
|
||||||
|
start = "0";
|
||||||
|
end = "+1M";
|
||||||
|
};
|
||||||
|
root = {
|
||||||
|
label = "ROOT";
|
||||||
|
end = "-0";
|
||||||
|
content = {
|
||||||
|
type = "btrfs";
|
||||||
|
extraArgs = [ "-f" ];
|
||||||
|
subvolumes = {
|
||||||
|
"boot" = {
|
||||||
|
mountpoint = "/boot";
|
||||||
|
mountOptions = [ "compress=zstd" ];
|
||||||
|
};
|
||||||
|
"nix" = {
|
||||||
|
mountpoint = "/nix";
|
||||||
|
mountOptions = [ "compress=zstd" ];
|
||||||
|
};
|
||||||
|
"persist" = {
|
||||||
|
mountpoint = "/persist";
|
||||||
|
mountOptions = [ "compress=zstd" ];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
fileSystems."/persist".neededForBoot = true;
|
||||||
|
|
||||||
|
environment.globalPersistence = {
|
||||||
|
enable = true;
|
||||||
|
root = "/persist";
|
||||||
|
};
|
||||||
|
|
||||||
|
services.btrfs.autoScrub = {
|
||||||
|
enable = true;
|
||||||
|
interval = "weekly";
|
||||||
|
fileSystems = [ "/persist" ];
|
||||||
|
};
|
||||||
|
}
|
15
nixos/hosts/reisen-sin0/hardware-configuration.nix
Normal file
15
nixos/hosts/reisen-sin0/hardware-configuration.nix
Normal file
|
@ -0,0 +1,15 @@
|
||||||
|
{ modulesPath, ... }:
|
||||||
|
{
|
||||||
|
imports = [
|
||||||
|
(modulesPath + "/profiles/qemu-guest.nix")
|
||||||
|
];
|
||||||
|
|
||||||
|
boot.initrd.availableKernelModules = [
|
||||||
|
"ahci"
|
||||||
|
"sym53c8xx"
|
||||||
|
"xhci_pci"
|
||||||
|
"virtio_pci"
|
||||||
|
"sr_mod"
|
||||||
|
"virtio_blk"
|
||||||
|
];
|
||||||
|
}
|
51
nixos/hosts/reisen-sin0/networking.nix
Normal file
51
nixos/hosts/reisen-sin0/networking.nix
Normal file
|
@ -0,0 +1,51 @@
|
||||||
|
{ profiles, ... }:
|
||||||
|
{
|
||||||
|
imports = with profiles; [
|
||||||
|
services.enthalpy
|
||||||
|
];
|
||||||
|
|
||||||
|
services.enthalpy = {
|
||||||
|
ipsec.interfaces = [ "enp3s0" ];
|
||||||
|
exit = {
|
||||||
|
enable = true;
|
||||||
|
prefix = [ "::/0" ];
|
||||||
|
};
|
||||||
|
srv6.enable = true;
|
||||||
|
nat64.enable = true;
|
||||||
|
};
|
||||||
|
|
||||||
|
networking.nftables.tables.nat = {
|
||||||
|
family = "inet";
|
||||||
|
content = ''
|
||||||
|
chain postrouting {
|
||||||
|
type nat hook postrouting priority srcnat; policy accept;
|
||||||
|
oifname enp3s0 counter masquerade
|
||||||
|
}
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
|
||||||
|
systemd.network = {
|
||||||
|
enable = true;
|
||||||
|
wait-online.anyInterface = true;
|
||||||
|
config = {
|
||||||
|
networkConfig = {
|
||||||
|
IPv4Forwarding = true;
|
||||||
|
IPv6Forwarding = true;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
networks = {
|
||||||
|
"30-enp3s0" = {
|
||||||
|
matchConfig.Name = "enp3s0";
|
||||||
|
networkConfig = {
|
||||||
|
DHCP = "yes";
|
||||||
|
IPv6AcceptRA = true;
|
||||||
|
IPv6PrivacyExtensions = false;
|
||||||
|
KeepConfiguration = true;
|
||||||
|
};
|
||||||
|
dhcpV4Config.RouteMetric = 1024;
|
||||||
|
dhcpV6Config.RouteMetric = 1024;
|
||||||
|
ipv6AcceptRAConfig.RouteMetric = 1024;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
31
nixos/modules/networking/ports.nix
Normal file
31
nixos/modules/networking/ports.nix
Normal file
|
@ -0,0 +1,31 @@
|
||||||
|
{ config, lib, ... }:
|
||||||
|
with lib;
|
||||||
|
let
|
||||||
|
cfg = config.networking.ports;
|
||||||
|
noCollision = l: length (unique l) == length l;
|
||||||
|
in
|
||||||
|
{
|
||||||
|
options.networking.ports = mkOption {
|
||||||
|
type = with types; attrsOf port;
|
||||||
|
default = {
|
||||||
|
http = 80;
|
||||||
|
https = 443;
|
||||||
|
ssh = 2222;
|
||||||
|
|
||||||
|
# enthalpy
|
||||||
|
sing-box = 1080;
|
||||||
|
enthalpy-ipsec = 13000;
|
||||||
|
};
|
||||||
|
readOnly = true;
|
||||||
|
description = ''
|
||||||
|
A mapping of network ports, each identified by a unique name.
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
|
||||||
|
config = {
|
||||||
|
assertions = singleton {
|
||||||
|
assertion = noCollision (attrValues cfg);
|
||||||
|
message = "port collision";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
95
nixos/modules/networking/routing-tables.nix
Normal file
95
nixos/modules/networking/routing-tables.nix
Normal file
|
@ -0,0 +1,95 @@
|
||||||
|
{
|
||||||
|
config,
|
||||||
|
lib,
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
with lib;
|
||||||
|
let
|
||||||
|
cfg = config.networking;
|
||||||
|
noCollision = l: length (unique l) == length l;
|
||||||
|
reservedTables = [
|
||||||
|
"local"
|
||||||
|
"main"
|
||||||
|
"default"
|
||||||
|
"unspec"
|
||||||
|
];
|
||||||
|
in
|
||||||
|
{
|
||||||
|
options.networking = {
|
||||||
|
routingTables = mkOption {
|
||||||
|
type = with types; attrsOf int;
|
||||||
|
default = {
|
||||||
|
# reserved
|
||||||
|
unspec = 0;
|
||||||
|
default = 253;
|
||||||
|
main = 254;
|
||||||
|
local = 255;
|
||||||
|
|
||||||
|
# enthalpy
|
||||||
|
localsid = 300;
|
||||||
|
nat64 = 301;
|
||||||
|
sing-box = 302;
|
||||||
|
};
|
||||||
|
readOnly = true;
|
||||||
|
description = ''
|
||||||
|
A mapping of routing tables, each identified by a unique name.
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
routingMarks = mkOption {
|
||||||
|
type = with types; attrsOf int;
|
||||||
|
default = {
|
||||||
|
# enthalpy
|
||||||
|
sing-box = 1300;
|
||||||
|
};
|
||||||
|
readOnly = true;
|
||||||
|
description = ''
|
||||||
|
A mapping of routing marks, each identified by a unique name.
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
routingPolicyPriorities = mkOption {
|
||||||
|
type = with types; attrsOf int;
|
||||||
|
default = {
|
||||||
|
# reserved
|
||||||
|
local = 0;
|
||||||
|
main = 32766;
|
||||||
|
default = 32767;
|
||||||
|
|
||||||
|
# enthalpy
|
||||||
|
localsid = 500;
|
||||||
|
sing-box = 13000;
|
||||||
|
};
|
||||||
|
readOnly = true;
|
||||||
|
description = ''
|
||||||
|
A set of priorities for routing policies.
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
config = {
|
||||||
|
assertions = [
|
||||||
|
{
|
||||||
|
assertion = noCollision (attrValues cfg.routingTables);
|
||||||
|
message = "routing table id collision";
|
||||||
|
}
|
||||||
|
{
|
||||||
|
assertion = noCollision (attrValues cfg.routingMarks);
|
||||||
|
message = "routing mark id collision";
|
||||||
|
}
|
||||||
|
{
|
||||||
|
assertion = noCollision (attrValues cfg.routingPolicyPriorities);
|
||||||
|
message = "routing policy priority collision";
|
||||||
|
}
|
||||||
|
];
|
||||||
|
|
||||||
|
environment.etc."iproute2/rt_tables.d/routing_tables.conf" = {
|
||||||
|
mode = "0644";
|
||||||
|
text = ''
|
||||||
|
${concatStringsSep "\n" (
|
||||||
|
mapAttrsToList (name: table: "${toString table} ${name}") (
|
||||||
|
filterAttrs (name: _table: !(lib.elem name reservedTables)) cfg.routingTables
|
||||||
|
)
|
||||||
|
)}
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
127
nixos/modules/services/enthalpy/bird.nix
Normal file
127
nixos/modules/services/enthalpy/bird.nix
Normal file
|
@ -0,0 +1,127 @@
|
||||||
|
# Portions of this file are sourced from
|
||||||
|
# https://github.com/NickCao/flakes/blob/3b03efb676ea602575c916b2b8bc9d9cd13b0d85/modules/gravity/default.nix
|
||||||
|
{
|
||||||
|
config,
|
||||||
|
lib,
|
||||||
|
pkgs,
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
with lib;
|
||||||
|
let
|
||||||
|
cfg = config.services.enthalpy;
|
||||||
|
in
|
||||||
|
{
|
||||||
|
options.services.enthalpy.bird = {
|
||||||
|
enable = mkEnableOption "bird for site-scope connectivity";
|
||||||
|
socket = mkOption {
|
||||||
|
type = types.str;
|
||||||
|
default = "/run/enthalpy/bird.ctl";
|
||||||
|
description = ''
|
||||||
|
Path to the bird control socket.
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
config = mkOption {
|
||||||
|
type = types.lines;
|
||||||
|
description = ''
|
||||||
|
Configuration file for bird.
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
checkConfig = mkOption {
|
||||||
|
type = types.bool;
|
||||||
|
default = true;
|
||||||
|
description = ''
|
||||||
|
Whether to check the config at build time.
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
routerId = mkOption {
|
||||||
|
type = types.int;
|
||||||
|
description = ''
|
||||||
|
Router ID for the bird instance.
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
config = mkIf (cfg.enable && cfg.bird.enable) {
|
||||||
|
environment.etc."enthalpy/bird2.conf".source = pkgs.writeTextFile {
|
||||||
|
name = "bird2";
|
||||||
|
text = cfg.bird.config;
|
||||||
|
checkPhase = optionalString cfg.bird.checkConfig ''
|
||||||
|
ln -s $out bird2.conf
|
||||||
|
${pkgs.buildPackages.bird}/bin/bird -d -p -c bird2.conf
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
|
||||||
|
systemd.services.enthalpy-bird2 = {
|
||||||
|
serviceConfig = {
|
||||||
|
NetworkNamespacePath = "/run/netns/${cfg.netns}";
|
||||||
|
Type = "forking";
|
||||||
|
Restart = "on-failure";
|
||||||
|
RestartSec = 5;
|
||||||
|
DynamicUser = true;
|
||||||
|
RuntimeDirectory = "enthalpy";
|
||||||
|
ExecStart = "${pkgs.bird}/bin/bird -s ${cfg.bird.socket} -c /etc/enthalpy/bird2.conf";
|
||||||
|
ExecReload = "${pkgs.bird}/bin/birdc -s ${cfg.bird.socket} configure";
|
||||||
|
ExecStop = "${pkgs.bird}/bin/birdc -s ${cfg.bird.socket} down";
|
||||||
|
CapabilityBoundingSet = [
|
||||||
|
"CAP_NET_ADMIN"
|
||||||
|
"CAP_NET_BIND_SERVICE"
|
||||||
|
"CAP_NET_RAW"
|
||||||
|
];
|
||||||
|
AmbientCapabilities = [
|
||||||
|
"CAP_NET_ADMIN"
|
||||||
|
"CAP_NET_BIND_SERVICE"
|
||||||
|
"CAP_NET_RAW"
|
||||||
|
];
|
||||||
|
ProtectSystem = "full";
|
||||||
|
ProtectHome = "yes";
|
||||||
|
ProtectKernelTunables = true;
|
||||||
|
ProtectControlGroups = true;
|
||||||
|
PrivateTmp = true;
|
||||||
|
PrivateDevices = true;
|
||||||
|
SystemCallFilter = "~@cpu-emulation @debug @keyring @module @mount @obsolete @raw-io";
|
||||||
|
MemoryDenyWriteExecute = "yes";
|
||||||
|
};
|
||||||
|
partOf = [ "enthalpy.service" ];
|
||||||
|
after = [ "enthalpy.service" ];
|
||||||
|
requires = [ "enthalpy.service" ];
|
||||||
|
requiredBy = [ "enthalpy.service" ];
|
||||||
|
wantedBy = [ "multi-user.target" ];
|
||||||
|
reloadTriggers = [ config.environment.etc."enthalpy/bird2.conf".source ];
|
||||||
|
};
|
||||||
|
|
||||||
|
services.enthalpy.bird.config = mkBefore ''
|
||||||
|
router id ${toString cfg.bird.routerId};
|
||||||
|
ipv6 sadr table sadr6;
|
||||||
|
protocol device {
|
||||||
|
scan time 5;
|
||||||
|
}
|
||||||
|
protocol kernel {
|
||||||
|
ipv6 sadr {
|
||||||
|
export all;
|
||||||
|
import none;
|
||||||
|
};
|
||||||
|
metric 512;
|
||||||
|
}
|
||||||
|
protocol static {
|
||||||
|
ipv6 sadr;
|
||||||
|
route ${cfg.prefix} from ::/0 unreachable;
|
||||||
|
route ${cfg.network} from ::/0 unreachable;
|
||||||
|
};
|
||||||
|
protocol babel {
|
||||||
|
ipv6 sadr {
|
||||||
|
export all;
|
||||||
|
import all;
|
||||||
|
};
|
||||||
|
randomize router id;
|
||||||
|
interface "enta*" {
|
||||||
|
type tunnel;
|
||||||
|
rxcost 32;
|
||||||
|
hello interval 20 s;
|
||||||
|
rtt cost 1024;
|
||||||
|
rtt max 1024 ms;
|
||||||
|
rx buffer 2000;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
}
|
85
nixos/modules/services/enthalpy/common.nix
Normal file
85
nixos/modules/services/enthalpy/common.nix
Normal file
|
@ -0,0 +1,85 @@
|
||||||
|
# Portions of this file are sourced from
|
||||||
|
# https://github.com/NickCao/flakes/blob/882da114b98389121d98d909f115d49d9af6613e/modules/gravity.nix
|
||||||
|
{
|
||||||
|
config,
|
||||||
|
lib,
|
||||||
|
pkgs,
|
||||||
|
mylib,
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
with lib;
|
||||||
|
let
|
||||||
|
inherit (mylib.network) cidr;
|
||||||
|
cfg = config.services.enthalpy;
|
||||||
|
in
|
||||||
|
{
|
||||||
|
options.services.enthalpy = {
|
||||||
|
enable = mkEnableOption "enthalpy overlay network";
|
||||||
|
prefix = mkOption {
|
||||||
|
type = types.str;
|
||||||
|
description = ''
|
||||||
|
Prefix to be announced for the local node.
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
netns = mkOption {
|
||||||
|
type = types.str;
|
||||||
|
default = "enthalpy";
|
||||||
|
description = ''
|
||||||
|
Name of the network namespace for interfaces.
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
interface = mkOption {
|
||||||
|
type = types.str;
|
||||||
|
default = "enthalpy";
|
||||||
|
description = ''
|
||||||
|
Name of the interface to connect to the network namespace.
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
network = mkOption {
|
||||||
|
type = types.str;
|
||||||
|
description = ''
|
||||||
|
Prefix of the enthalpy network.
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
config = mkIf cfg.enable {
|
||||||
|
systemd.services.enthalpy = {
|
||||||
|
path = with pkgs; [
|
||||||
|
iproute2
|
||||||
|
coreutils
|
||||||
|
procps
|
||||||
|
];
|
||||||
|
script = ''
|
||||||
|
ip netns add ${cfg.netns}
|
||||||
|
ip link add ${cfg.interface} mtu 1400 address 02:00:00:00:00:01 type veth peer enthalpy mtu 1400 address 02:00:00:00:00:00 netns ${cfg.netns}
|
||||||
|
ip link set ${cfg.interface} up
|
||||||
|
ip -n ${cfg.netns} link set lo up
|
||||||
|
ip -n ${cfg.netns} link set enthalpy up
|
||||||
|
ip -n ${cfg.netns} addr add ${cidr.host 0 cfg.prefix}/127 dev enthalpy
|
||||||
|
ip netns exec ${cfg.netns} sysctl -w net.ipv6.conf.default.forwarding=1
|
||||||
|
ip netns exec ${cfg.netns} sysctl -w net.ipv6.conf.all.forwarding=1
|
||||||
|
'';
|
||||||
|
preStop = ''
|
||||||
|
ip link del ${cfg.interface}
|
||||||
|
ip netns del ${cfg.netns}
|
||||||
|
'';
|
||||||
|
serviceConfig = {
|
||||||
|
Type = "oneshot";
|
||||||
|
RemainAfterExit = true;
|
||||||
|
};
|
||||||
|
wants = [ "network-online.target" ];
|
||||||
|
after = [ "network-online.target" ];
|
||||||
|
wantedBy = [ "multi-user.target" ];
|
||||||
|
};
|
||||||
|
|
||||||
|
systemd.network.networks."50-enthalpy" = {
|
||||||
|
matchConfig.Name = cfg.interface;
|
||||||
|
networkConfig.Address = "${cidr.host 1 cfg.prefix}/127";
|
||||||
|
routes = singleton {
|
||||||
|
Destination = cfg.network;
|
||||||
|
Gateway = "fe80::ff:fe00:0";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
63
nixos/modules/services/enthalpy/exit.nix
Normal file
63
nixos/modules/services/enthalpy/exit.nix
Normal file
|
@ -0,0 +1,63 @@
|
||||||
|
# Portions of this file are sourced from
|
||||||
|
# https://github.com/NickCao/flakes/blob/3b03efb676ea602575c916b2b8bc9d9cd13b0d85/modules/gravity/default.nix
|
||||||
|
{
|
||||||
|
config,
|
||||||
|
lib,
|
||||||
|
pkgs,
|
||||||
|
mylib,
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
with lib;
|
||||||
|
let
|
||||||
|
inherit (mylib.network) cidr;
|
||||||
|
cfg = config.services.enthalpy;
|
||||||
|
internalPrefix = filter (p: cidr.child p cfg.prefix) cfg.exit.prefix;
|
||||||
|
externalPrefix = subtractLists internalPrefix cfg.exit.prefix;
|
||||||
|
in
|
||||||
|
{
|
||||||
|
options.services.enthalpy.exit = {
|
||||||
|
enable = mkEnableOption "netns route leaking";
|
||||||
|
prefix = mkOption {
|
||||||
|
type = types.listOf types.str;
|
||||||
|
default = [ ];
|
||||||
|
description = ''
|
||||||
|
Prefixes to be announced from the default netns to the enthalpy network.
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
config = mkIf (cfg.enable && cfg.exit.enable) {
|
||||||
|
services.enthalpy.bird.config = ''
|
||||||
|
protocol static {
|
||||||
|
ipv6 sadr;
|
||||||
|
${
|
||||||
|
concatMapStringsSep "\n" (p: ''
|
||||||
|
route ${p} from ${cfg.network} via fe80::ff:fe00:1 dev "enthalpy";
|
||||||
|
'') externalPrefix
|
||||||
|
}
|
||||||
|
}
|
||||||
|
'';
|
||||||
|
|
||||||
|
systemd.services.enthalpy-exit =
|
||||||
|
let
|
||||||
|
routes = map (p: "${p} via fe80::ff:fe00:1 dev enthalpy") internalPrefix;
|
||||||
|
in
|
||||||
|
mkIf (routes != [ ]) {
|
||||||
|
serviceConfig = {
|
||||||
|
Type = "oneshot";
|
||||||
|
RemainAfterExit = true;
|
||||||
|
ExecStart = builtins.map (route: "${pkgs.iproute2}/bin/ip -n ${cfg.netns} -6 r a ${route}") routes;
|
||||||
|
ExecStop = builtins.map (route: "${pkgs.iproute2}/bin/ip -n ${cfg.netns} -6 r d ${route}") routes;
|
||||||
|
};
|
||||||
|
partOf = [ "enthalpy.service" ];
|
||||||
|
after = [
|
||||||
|
"enthalpy.service"
|
||||||
|
"network-online.target"
|
||||||
|
];
|
||||||
|
requires = [ "enthalpy.service" ];
|
||||||
|
requiredBy = [ "enthalpy.service" ];
|
||||||
|
wants = [ "network-online.target" ];
|
||||||
|
wantedBy = [ "multi-user.target" ];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
204
nixos/modules/services/enthalpy/ipsec.nix
Normal file
204
nixos/modules/services/enthalpy/ipsec.nix
Normal file
|
@ -0,0 +1,204 @@
|
||||||
|
# Portions of this file are sourced from
|
||||||
|
# https://github.com/NickCao/flakes/blob/3b03efb676ea602575c916b2b8bc9d9cd13b0d85/modules/gravity/default.nix
|
||||||
|
{
|
||||||
|
config,
|
||||||
|
lib,
|
||||||
|
pkgs,
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
with lib;
|
||||||
|
let
|
||||||
|
cfg = config.services.enthalpy;
|
||||||
|
in
|
||||||
|
{
|
||||||
|
options.services.enthalpy.ipsec = {
|
||||||
|
enable = mkEnableOption "IPSec/IKEv2 for link-scope connectivity";
|
||||||
|
organization = mkOption {
|
||||||
|
type = types.str;
|
||||||
|
description = ''
|
||||||
|
Unique identifier of a keypair.
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
commonName = mkOption {
|
||||||
|
type = types.str;
|
||||||
|
description = ''
|
||||||
|
Name of this node, should be unique within an organization.
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
endpoints = mkOption {
|
||||||
|
type = types.listOf (
|
||||||
|
types.submodule {
|
||||||
|
options = {
|
||||||
|
serialNumber = mkOption { type = types.str; };
|
||||||
|
addressFamily = mkOption { type = types.str; };
|
||||||
|
address = mkOption {
|
||||||
|
type = types.nullOr types.str;
|
||||||
|
default = null;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
||||||
|
);
|
||||||
|
description = ''
|
||||||
|
List of endpoints available on this node.
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
port = mkOption {
|
||||||
|
type = types.port;
|
||||||
|
default = config.networking.ports.enthalpy-ipsec;
|
||||||
|
readOnly = true;
|
||||||
|
description = ''
|
||||||
|
UDP port used by IKEv2. NAT-T is enabled by default.
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
interfaces = mkOption {
|
||||||
|
type = types.listOf types.str;
|
||||||
|
default = [ ];
|
||||||
|
description = ''
|
||||||
|
List of network interfaces that should be used by charon daemon.
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
privateKeyPath = mkOption {
|
||||||
|
type = types.str;
|
||||||
|
description = ''
|
||||||
|
Path to the private key of this organization.
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
registry = mkOption {
|
||||||
|
type = types.path;
|
||||||
|
description = ''
|
||||||
|
Path to the registry.
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
blacklist = mkOption {
|
||||||
|
type = types.nullOr (types.listOf types.str);
|
||||||
|
default = null;
|
||||||
|
description = ''
|
||||||
|
A list of organizations that are blacklisted.
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
whitelist = mkOption {
|
||||||
|
type = types.nullOr (types.listOf types.str);
|
||||||
|
default = null;
|
||||||
|
description = ''
|
||||||
|
A list of organizations that are whitelisted.
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
config = mkIf (cfg.enable && cfg.ipsec.enable) {
|
||||||
|
assertions = [
|
||||||
|
{
|
||||||
|
assertion = builtins.all (lib.id) [
|
||||||
|
(cfg.ipsec.blacklist != null -> cfg.ipsec.whitelist == null)
|
||||||
|
(cfg.ipsec.whitelist != null -> cfg.ipsec.blacklist == null)
|
||||||
|
];
|
||||||
|
message = ''
|
||||||
|
Only one of `config.services.enthalpy.ipsec.blacklist` or
|
||||||
|
`config.services.enthalpy.ipsec.whitelist` can be defined at a time.
|
||||||
|
'';
|
||||||
|
}
|
||||||
|
];
|
||||||
|
|
||||||
|
environment.systemPackages = with pkgs; [ strongswan ];
|
||||||
|
|
||||||
|
environment.etc."ranet/config.json".source = (pkgs.formats.json { }).generate "config.json" {
|
||||||
|
organization = cfg.ipsec.organization;
|
||||||
|
common_name = cfg.ipsec.commonName;
|
||||||
|
endpoints = builtins.map (ep: {
|
||||||
|
serial_number = ep.serialNumber;
|
||||||
|
address_family = ep.addressFamily;
|
||||||
|
address = ep.address;
|
||||||
|
port = cfg.ipsec.port;
|
||||||
|
updown = pkgs.writeShellScript "updown" ''
|
||||||
|
LINK=enta$(printf '%08x\n' "$PLUTO_IF_ID_OUT")
|
||||||
|
case "$PLUTO_VERB" in
|
||||||
|
up-client)
|
||||||
|
ip link add "$LINK" type xfrm if_id "$PLUTO_IF_ID_OUT"
|
||||||
|
ip link set "$LINK" netns ${cfg.netns} multicast on mtu 1400 up
|
||||||
|
;;
|
||||||
|
down-client)
|
||||||
|
ip -n ${cfg.netns} link del "$LINK"
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
'';
|
||||||
|
}) cfg.ipsec.endpoints;
|
||||||
|
};
|
||||||
|
|
||||||
|
services.strongswan-swanctl = {
|
||||||
|
enable = true;
|
||||||
|
strongswan.extraConfig = ''
|
||||||
|
charon {
|
||||||
|
interfaces_use = ${strings.concatStringsSep "," cfg.ipsec.interfaces}
|
||||||
|
port = 0
|
||||||
|
port_nat_t = ${toString cfg.ipsec.port}
|
||||||
|
retransmit_base = 1
|
||||||
|
plugins {
|
||||||
|
socket-default {
|
||||||
|
set_source = yes
|
||||||
|
set_sourceif = yes
|
||||||
|
}
|
||||||
|
dhcp {
|
||||||
|
load = no
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
charon-systemd {
|
||||||
|
journal {
|
||||||
|
default = -1
|
||||||
|
ike = 0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
|
||||||
|
systemd.services.enthalpy-ipsec =
|
||||||
|
let
|
||||||
|
registry =
|
||||||
|
if cfg.ipsec.whitelist != null then
|
||||||
|
pkgs.runCommand "filtered-registry" { } ''
|
||||||
|
${pkgs.jq}/bin/jq "[.[] | select(.organization | IN(${
|
||||||
|
concatMapStringsSep "," (org: "\\\"${org}\\\"") cfg.ipsec.whitelist
|
||||||
|
}))]" ${cfg.ipsec.registry} > $out
|
||||||
|
''
|
||||||
|
else if cfg.ipsec.blacklist != null then
|
||||||
|
pkgs.runCommand "filtered-registry" { } ''
|
||||||
|
${pkgs.jq}/bin/jq "[.[] | select(.organization | IN(${
|
||||||
|
concatMapStringsSep "," (org: "\\\"${org}\\\"") cfg.ipsec.blacklist
|
||||||
|
}) | not)]" ${cfg.ipsec.registry} > $out
|
||||||
|
''
|
||||||
|
else
|
||||||
|
cfg.ipsec.registry;
|
||||||
|
command = "ranet -c /etc/ranet/config.json -r ${registry} -k ${cfg.ipsec.privateKeyPath}";
|
||||||
|
in
|
||||||
|
{
|
||||||
|
path = with pkgs; [
|
||||||
|
iproute2
|
||||||
|
ranet
|
||||||
|
];
|
||||||
|
script = "${command} up";
|
||||||
|
reload = "${command} up";
|
||||||
|
preStop = "${command} down";
|
||||||
|
serviceConfig = {
|
||||||
|
Type = "oneshot";
|
||||||
|
RemainAfterExit = true;
|
||||||
|
};
|
||||||
|
bindsTo = [
|
||||||
|
"strongswan-swanctl.service"
|
||||||
|
];
|
||||||
|
wants = [
|
||||||
|
"network-online.target"
|
||||||
|
"strongswan-swanctl.service"
|
||||||
|
];
|
||||||
|
requires = [
|
||||||
|
"enthalpy.service"
|
||||||
|
];
|
||||||
|
after = [
|
||||||
|
"network-online.target"
|
||||||
|
"strongswan-swanctl.service"
|
||||||
|
"enthalpy.service"
|
||||||
|
];
|
||||||
|
wantedBy = [ "multi-user.target" ];
|
||||||
|
reloadTriggers = [ config.environment.etc."ranet/config.json".source ];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
92
nixos/modules/services/enthalpy/nat64.nix
Normal file
92
nixos/modules/services/enthalpy/nat64.nix
Normal file
|
@ -0,0 +1,92 @@
|
||||||
|
# Portions of this file are sourced from
|
||||||
|
# https://github.com/NickCao/flakes/blob/3b03efb676ea602575c916b2b8bc9d9cd13b0d85/modules/gravity/default.nix
|
||||||
|
{
|
||||||
|
config,
|
||||||
|
lib,
|
||||||
|
pkgs,
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
with lib;
|
||||||
|
let
|
||||||
|
cfg = config.services.enthalpy;
|
||||||
|
in
|
||||||
|
{
|
||||||
|
options.services.enthalpy.nat64 = {
|
||||||
|
enable = mkEnableOption "NAT64";
|
||||||
|
table = mkOption {
|
||||||
|
type = types.int;
|
||||||
|
default = config.networking.routingTables.nat64;
|
||||||
|
readOnly = true;
|
||||||
|
description = ''
|
||||||
|
Routing table used for NAT64 entries.
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
prefix = mkOption {
|
||||||
|
type = types.str;
|
||||||
|
default = "64:ff9b::/96";
|
||||||
|
description = ''
|
||||||
|
IPv6 prefix used for NAT64 translation in the network.
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
dynamicPool = mkOption {
|
||||||
|
type = types.str;
|
||||||
|
default = "100.127.0.0/16";
|
||||||
|
description = ''
|
||||||
|
IPv4 address prefix allocated for dynamic IP assignment.
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
config = mkIf (cfg.enable && cfg.nat64.enable) {
|
||||||
|
systemd.network.config = {
|
||||||
|
networkConfig = {
|
||||||
|
IPv6Forwarding = true;
|
||||||
|
ManageForeignRoutes = false;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
systemd.network.networks."70-nat64" = {
|
||||||
|
matchConfig.Name = "nat64";
|
||||||
|
routes = [
|
||||||
|
{
|
||||||
|
Destination = cfg.nat64.prefix;
|
||||||
|
Table = cfg.nat64.table;
|
||||||
|
}
|
||||||
|
{ Destination = cfg.nat64.dynamicPool; }
|
||||||
|
];
|
||||||
|
networkConfig.LinkLocalAddressing = false;
|
||||||
|
linkConfig.RequiredForOnline = false;
|
||||||
|
};
|
||||||
|
|
||||||
|
systemd.services.enthalpy-nat64 = {
|
||||||
|
serviceConfig = {
|
||||||
|
ExecStart = "${pkgs.tayga}/bin/tayga -d --config ${pkgs.writeText "tayga.conf" ''
|
||||||
|
tun-device nat64
|
||||||
|
ipv6-addr fc00::
|
||||||
|
ipv4-addr 100.127.0.1
|
||||||
|
prefix ${cfg.nat64.prefix}
|
||||||
|
dynamic-pool ${cfg.nat64.dynamicPool}
|
||||||
|
''}";
|
||||||
|
};
|
||||||
|
partOf = [ "enthalpy.service" ];
|
||||||
|
after = [
|
||||||
|
"enthalpy.service"
|
||||||
|
"network.target"
|
||||||
|
];
|
||||||
|
requires = [ "enthalpy.service" ];
|
||||||
|
requiredBy = [ "enthalpy.service" ];
|
||||||
|
wantedBy = [ "multi-user.target" ];
|
||||||
|
};
|
||||||
|
|
||||||
|
networking.nftables.enable = true;
|
||||||
|
networking.nftables.tables.enthalpy4 = {
|
||||||
|
family = "ip";
|
||||||
|
content = ''
|
||||||
|
chain forward {
|
||||||
|
type filter hook forward priority 0;
|
||||||
|
tcp flags syn tcp option maxseg size set 1200
|
||||||
|
}
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
232
nixos/modules/services/enthalpy/sing-box.nix
Normal file
232
nixos/modules/services/enthalpy/sing-box.nix
Normal file
|
@ -0,0 +1,232 @@
|
||||||
|
# Portions of this file are sourced from
|
||||||
|
# https://github.com/NickCao/flakes/blob/3b03efb676ea602575c916b2b8bc9d9cd13b0d85/nixos/mainframe/gravity.nix
|
||||||
|
{
|
||||||
|
config,
|
||||||
|
lib,
|
||||||
|
pkgs,
|
||||||
|
mylib,
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
with lib;
|
||||||
|
let
|
||||||
|
inherit (mylib.network) cidr;
|
||||||
|
cfg = config.services.enthalpy;
|
||||||
|
in
|
||||||
|
{
|
||||||
|
options.services.enthalpy.sing-box = {
|
||||||
|
enable = mkEnableOption "sing-box universal proxy platform";
|
||||||
|
tableName = mkOption {
|
||||||
|
type = types.str;
|
||||||
|
default = "sing-box";
|
||||||
|
readOnly = true;
|
||||||
|
description = ''
|
||||||
|
Routing table used for sing-box.
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
table = mkOption {
|
||||||
|
type = types.int;
|
||||||
|
default = config.networking.routingTables."${cfg.sing-box.tableName}";
|
||||||
|
readOnly = true;
|
||||||
|
description = ''
|
||||||
|
Routing table ID associated with the sing-box routing table.
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
priority = mkOption {
|
||||||
|
type = types.int;
|
||||||
|
default = config.networking.routingPolicyPriorities."${cfg.sing-box.tableName}";
|
||||||
|
readOnly = true;
|
||||||
|
description = ''
|
||||||
|
Routing priority assigned to the sing-box routing table.
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
fwmark = mkOption {
|
||||||
|
type = types.int;
|
||||||
|
default = config.networking.routingMarks."${cfg.sing-box.tableName}";
|
||||||
|
readOnly = true;
|
||||||
|
description = ''
|
||||||
|
Firewall mark designated for the sing-box routing table.
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
port = mkOption {
|
||||||
|
type = types.int;
|
||||||
|
default = config.networking.ports.sing-box;
|
||||||
|
readOnly = true;
|
||||||
|
description = ''
|
||||||
|
Port for the mixed proxy to listen on.
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
clat = {
|
||||||
|
enable = mkEnableOption "464XLAT for IPv4 connectivity";
|
||||||
|
address = mkOption {
|
||||||
|
type = types.str;
|
||||||
|
default = cidr.host 2 cfg.prefix;
|
||||||
|
description = ''
|
||||||
|
IPv6 address used for 464XLAT as the mapped source address.
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
segment = mkOption {
|
||||||
|
type = types.listOf types.str;
|
||||||
|
description = ''
|
||||||
|
SRv6 segments used for NAT64.
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
config = mkIf (cfg.enable && cfg.sing-box.enable) (mkMerge [
|
||||||
|
# IPv6
|
||||||
|
{
|
||||||
|
systemd.network.networks."50-enthalpy" = {
|
||||||
|
routes = [
|
||||||
|
{
|
||||||
|
Destination = "::/0";
|
||||||
|
Gateway = "fe80::ff:fe00:0";
|
||||||
|
Table = cfg.sing-box.table;
|
||||||
|
Metric = 1024;
|
||||||
|
}
|
||||||
|
{
|
||||||
|
Destination = "::0/0";
|
||||||
|
Type = "blackhole";
|
||||||
|
Table = cfg.sing-box.table;
|
||||||
|
Metric = 4096;
|
||||||
|
}
|
||||||
|
];
|
||||||
|
routingPolicyRules = lib.singleton {
|
||||||
|
Family = "both";
|
||||||
|
FirewallMark = cfg.sing-box.fwmark;
|
||||||
|
Priority = cfg.sing-box.priority;
|
||||||
|
Table = cfg.sing-box.table;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
services.sing-box = {
|
||||||
|
enable = true;
|
||||||
|
settings = {
|
||||||
|
log = {
|
||||||
|
level = "info";
|
||||||
|
};
|
||||||
|
dns = {
|
||||||
|
servers = [
|
||||||
|
{
|
||||||
|
tag = "cloudflare";
|
||||||
|
address = "https://[2606:4700:4700::1111]/dns-query";
|
||||||
|
strategy = "prefer_ipv6";
|
||||||
|
}
|
||||||
|
{
|
||||||
|
tag = "local";
|
||||||
|
address = "local";
|
||||||
|
strategy = "prefer_ipv4";
|
||||||
|
}
|
||||||
|
];
|
||||||
|
rules = [
|
||||||
|
{
|
||||||
|
geosite = [ "cn" ];
|
||||||
|
server = "local";
|
||||||
|
}
|
||||||
|
];
|
||||||
|
final = "cloudflare";
|
||||||
|
};
|
||||||
|
inbounds = [
|
||||||
|
{
|
||||||
|
type = "mixed";
|
||||||
|
tag = "inbound";
|
||||||
|
listen = "127.0.0.1";
|
||||||
|
listen_port = cfg.sing-box.port;
|
||||||
|
sniff = true;
|
||||||
|
sniff_override_destination = true;
|
||||||
|
}
|
||||||
|
];
|
||||||
|
outbounds = [
|
||||||
|
{
|
||||||
|
type = "direct";
|
||||||
|
tag = "enthalpy";
|
||||||
|
routing_mark = cfg.sing-box.fwmark;
|
||||||
|
domain_strategy = "prefer_ipv6";
|
||||||
|
}
|
||||||
|
{
|
||||||
|
type = "direct";
|
||||||
|
tag = "direct";
|
||||||
|
}
|
||||||
|
];
|
||||||
|
route = {
|
||||||
|
rules = [
|
||||||
|
{
|
||||||
|
geosite = [ "cn" ];
|
||||||
|
geoip = [ "cn" ];
|
||||||
|
ip_cidr = [ "10.0.0.0/8" ];
|
||||||
|
outbound = "direct";
|
||||||
|
}
|
||||||
|
];
|
||||||
|
final = "enthalpy";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
environment.systemPackages = with pkgs; [ gg ];
|
||||||
|
|
||||||
|
environment.etc."ggconfig.toml".source = (pkgs.formats.toml { }).generate "ggconfig.toml" {
|
||||||
|
allow_insecure = false;
|
||||||
|
no_udp = false;
|
||||||
|
node = "socks5://127.0.0.1:${toString cfg.sing-box.port}";
|
||||||
|
proxy_private = false;
|
||||||
|
test_node_before_use = false;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
# IPv4 (464XLAT)
|
||||||
|
(mkIf cfg.sing-box.clat.enable {
|
||||||
|
systemd.network.config = {
|
||||||
|
networkConfig = {
|
||||||
|
IPv6Forwarding = true;
|
||||||
|
ManageForeignRoutes = false;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
systemd.network.networks."50-clat" = {
|
||||||
|
name = "clat";
|
||||||
|
linkConfig = {
|
||||||
|
MTUBytes = "1400";
|
||||||
|
RequiredForOnline = false;
|
||||||
|
};
|
||||||
|
addresses = singleton { Address = "192.0.0.2/32"; };
|
||||||
|
routes = [
|
||||||
|
{
|
||||||
|
Destination = "0.0.0.0/0";
|
||||||
|
Table = cfg.sing-box.table;
|
||||||
|
PreferredSource = "192.0.0.2";
|
||||||
|
Metric = 1024;
|
||||||
|
}
|
||||||
|
{ Destination = cfg.sing-box.clat.address; }
|
||||||
|
];
|
||||||
|
};
|
||||||
|
|
||||||
|
services.enthalpy.exit.enable = true;
|
||||||
|
services.enthalpy.exit.prefix = singleton "${cfg.sing-box.clat.address}/128";
|
||||||
|
|
||||||
|
systemd.services.enthalpy-clatd = {
|
||||||
|
path = with pkgs; [
|
||||||
|
iproute2
|
||||||
|
tayga
|
||||||
|
];
|
||||||
|
script = ''
|
||||||
|
ip r replace 64:ff9b::/96 from ${cfg.sing-box.clat.address} encap seg6 mode encap \
|
||||||
|
segs ${concatStringsSep "," cfg.sing-box.clat.segment} dev ${cfg.interface} mtu 1280
|
||||||
|
exec tayga -d --config ${pkgs.writeText "tayga.conf" ''
|
||||||
|
tun-device clat
|
||||||
|
prefix 64:ff9b::/96
|
||||||
|
ipv4-addr 192.0.0.1
|
||||||
|
map 192.0.0.2 ${cfg.sing-box.clat.address}
|
||||||
|
''}
|
||||||
|
'';
|
||||||
|
partOf = [ "enthalpy.service" ];
|
||||||
|
after = [
|
||||||
|
"enthalpy.service"
|
||||||
|
"network.target"
|
||||||
|
];
|
||||||
|
requires = [ "enthalpy.service" ];
|
||||||
|
requiredBy = [ "enthalpy.service" ];
|
||||||
|
wantedBy = [ "multi-user.target" ];
|
||||||
|
};
|
||||||
|
})
|
||||||
|
]);
|
||||||
|
}
|
109
nixos/modules/services/enthalpy/srv6.nix
Normal file
109
nixos/modules/services/enthalpy/srv6.nix
Normal file
|
@ -0,0 +1,109 @@
|
||||||
|
# Portions of this file are sourced from
|
||||||
|
# https://github.com/NickCao/flakes/blob/3b03efb676ea602575c916b2b8bc9d9cd13b0d85/modules/gravity/default.nix
|
||||||
|
{
|
||||||
|
config,
|
||||||
|
lib,
|
||||||
|
pkgs,
|
||||||
|
mylib,
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
with lib;
|
||||||
|
let
|
||||||
|
inherit (mylib.network) cidr;
|
||||||
|
cfg = config.services.enthalpy;
|
||||||
|
in
|
||||||
|
{
|
||||||
|
options.services.enthalpy.srv6 = {
|
||||||
|
enable = mkEnableOption "segment routing over IPv6";
|
||||||
|
tableName = mkOption {
|
||||||
|
type = types.str;
|
||||||
|
default = "localsid";
|
||||||
|
readOnly = true;
|
||||||
|
description = ''
|
||||||
|
Routing table designated for SRv6 SID.
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
table = mkOption {
|
||||||
|
type = types.int;
|
||||||
|
default = config.networking.routingTables."${cfg.srv6.tableName}";
|
||||||
|
readOnly = true;
|
||||||
|
description = ''
|
||||||
|
Routing table ID associated with the localsid routing table.
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
priority = mkOption {
|
||||||
|
type = types.int;
|
||||||
|
default = config.networking.routingPolicyPriorities."${cfg.srv6.tableName}";
|
||||||
|
readOnly = true;
|
||||||
|
description = ''
|
||||||
|
Routing priority assigned to the localsid routing table.
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
prefix = mkOption {
|
||||||
|
type = types.str;
|
||||||
|
default = cidr.subnet 4 6 cfg.prefix;
|
||||||
|
description = ''
|
||||||
|
Prefix used for SRv6 actions.
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
actions = mkOption {
|
||||||
|
type = types.listOf types.str;
|
||||||
|
default = [
|
||||||
|
"${cidr.host 1 cfg.srv6.prefix} encap seg6local action End.DT6 table main dev ${cfg.interface} table ${cfg.srv6.tableName}"
|
||||||
|
"${cidr.host 2 cfg.srv6.prefix} encap seg6local action End.DT6 table nat64 dev ${cfg.interface} table ${cfg.srv6.tableName}"
|
||||||
|
];
|
||||||
|
description = ''
|
||||||
|
List of SRv6 actions configured in the default network namespace.
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
config = mkIf (cfg.enable && cfg.srv6.enable) {
|
||||||
|
systemd.network.config = {
|
||||||
|
networkConfig = {
|
||||||
|
IPv6Forwarding = true;
|
||||||
|
ManageForeignRoutes = false;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
systemd.network.networks."50-enthalpy" = {
|
||||||
|
routes = singleton {
|
||||||
|
Destination = "::/0";
|
||||||
|
Type = "blackhole";
|
||||||
|
Table = cfg.srv6.table;
|
||||||
|
};
|
||||||
|
routingPolicyRules = singleton {
|
||||||
|
Priority = cfg.srv6.priority;
|
||||||
|
Family = "ipv6";
|
||||||
|
Table = cfg.srv6.table;
|
||||||
|
From = cfg.network;
|
||||||
|
To = cfg.srv6.prefix;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
systemd.services.enthalpy-srv6 = {
|
||||||
|
path = with pkgs; [ iproute2 ];
|
||||||
|
serviceConfig = {
|
||||||
|
Type = "oneshot";
|
||||||
|
RemainAfterExit = true;
|
||||||
|
ExecStartPre = [
|
||||||
|
"${pkgs.iproute2}/bin/ip -n ${cfg.netns} -6 r a ${cfg.srv6.prefix} from ${cfg.network} via fe80::ff:fe00:1 dev enthalpy"
|
||||||
|
];
|
||||||
|
ExecStart = builtins.map (route: "${pkgs.iproute2}/bin/ip -6 r a ${route}") cfg.srv6.actions;
|
||||||
|
ExecStop = builtins.map (route: "${pkgs.iproute2}/bin/ip -6 r d ${route}") cfg.srv6.actions;
|
||||||
|
ExecStopPost = [
|
||||||
|
"${pkgs.iproute2}/bin/ip -n ${cfg.netns} -6 r d ${cfg.srv6.prefix} from ${cfg.network} via fe80::ff:fe00:1 dev enthalpy"
|
||||||
|
];
|
||||||
|
};
|
||||||
|
partOf = [ "enthalpy.service" ];
|
||||||
|
after = [
|
||||||
|
"enthalpy.service"
|
||||||
|
"network-online.target"
|
||||||
|
];
|
||||||
|
requires = [ "enthalpy.service" ];
|
||||||
|
requiredBy = [ "enthalpy.service" ];
|
||||||
|
wants = [ "network-online.target" ];
|
||||||
|
wantedBy = [ "multi-user.target" ];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
79
nixos/modules/system/global-persistence.nix
Normal file
79
nixos/modules/system/global-persistence.nix
Normal file
|
@ -0,0 +1,79 @@
|
||||||
|
# Portions of this file are sourced from
|
||||||
|
# https://github.com/linyinfeng/dotfiles/blob/b618b0fd16fb9c79ab7199ed51c4c0f98a392cea/nixos/modules/environment/global-persistence/default.nix
|
||||||
|
{
|
||||||
|
config,
|
||||||
|
lib,
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
let
|
||||||
|
cfg = config.environment.globalPersistence;
|
||||||
|
userCfg =
|
||||||
|
name:
|
||||||
|
assert config.home-manager.users.${name}.home.globalPersistence.enabled;
|
||||||
|
{
|
||||||
|
inherit name;
|
||||||
|
value = {
|
||||||
|
inherit (config.home-manager.users.${name}.home.globalPersistence) home directories files;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
usersCfg = lib.listToAttrs (map userCfg cfg.user.users);
|
||||||
|
in
|
||||||
|
with lib;
|
||||||
|
{
|
||||||
|
options.environment.globalPersistence = {
|
||||||
|
enable = mkEnableOption "global persistence storage";
|
||||||
|
root = mkOption {
|
||||||
|
type = types.str;
|
||||||
|
description = ''
|
||||||
|
The root of persistence storage.
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
directories = mkOption {
|
||||||
|
type = with types; listOf str;
|
||||||
|
default = [ ];
|
||||||
|
description = ''
|
||||||
|
Directories to bind mount to persistent storage.
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
files = mkOption {
|
||||||
|
type = with types; listOf str;
|
||||||
|
default = [ ];
|
||||||
|
description = ''
|
||||||
|
Files that should be stored in persistent storage.
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
user = {
|
||||||
|
users = mkOption {
|
||||||
|
type = with types; listOf str;
|
||||||
|
default = [ ];
|
||||||
|
description = ''
|
||||||
|
Persistence for users.
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
directories = mkOption {
|
||||||
|
type = with types; listOf str;
|
||||||
|
default = [ ];
|
||||||
|
description = ''
|
||||||
|
Directories to bind mount to persistent storage for users.
|
||||||
|
Paths should be relative to home of user.
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
files = mkOption {
|
||||||
|
type = with types; listOf str;
|
||||||
|
default = [ ];
|
||||||
|
description = ''
|
||||||
|
Files to link to persistent storage for users.
|
||||||
|
Paths should be relative to home of user.
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
config = mkIf cfg.enable {
|
||||||
|
environment.persistence."${cfg.root}" = {
|
||||||
|
hideMounts = true;
|
||||||
|
inherit (cfg) directories files;
|
||||||
|
users = usersCfg;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue