Compare commits
121
Commits
phone-eris
...
cf1451b1a0
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
cf1451b1a0 | ||
|
|
fa95098b7e | ||
|
|
0906700ad6 | ||
|
|
b9302e6192 | ||
|
|
5cb262857e | ||
|
|
47e536540f | ||
|
|
282a8f8287 | ||
|
|
a9254c424d | ||
|
|
5961254878 | ||
|
|
9403ddbf08 | ||
|
|
37ff958560 | ||
|
|
efa4b39782 | ||
|
|
e2341b7c79 | ||
|
|
dc1c94796a | ||
|
|
5b07b98f40 | ||
|
|
88ac5cbd83 | ||
|
|
969c006f97 | ||
|
|
1c7d0bb388 | ||
|
|
84c3bd92bb | ||
|
|
3340731c8d | ||
|
|
cd979fb771 | ||
|
|
7f6abc1d04 | ||
|
|
0946de0e46 | ||
|
|
a29e4611b2 | ||
|
|
7246ab1437 | ||
|
|
f8193425af | ||
|
|
3c54e8d6ef | ||
|
|
4a7d5340f3 | ||
|
|
458265f96b | ||
|
|
702ef6ab86 | ||
|
|
ea4e2f03a7 | ||
|
|
e738692558 | ||
|
|
ef698f8ad3 | ||
|
|
824b099ad6 | ||
|
|
651240f5a1 | ||
|
|
3b8c11b096 | ||
|
|
982c6c23ca | ||
|
|
e55bbaaa6b | ||
|
|
53c98dcba8 | ||
|
|
ce5f4ff43f | ||
|
|
dbb3e55cad | ||
|
|
d09f67a757 | ||
|
|
77b487a709 | ||
|
|
2b239eb162 | ||
|
|
8e64e88d8f | ||
|
|
6276d9aee0 | ||
|
|
9471d1a4e6 | ||
|
|
77d8e42ec2 | ||
|
|
0dafb8cd52 | ||
|
|
8b12656149 | ||
|
|
d622040d30 | ||
|
|
2bc05c2d6d | ||
|
|
5fa8444112 | ||
|
|
8874b33a5d | ||
|
|
521ccdc886 | ||
|
|
07b648db9a | ||
|
|
da6be4946f | ||
|
|
bc16c72707 | ||
|
|
3a26403590 | ||
|
|
5681a65c6f | ||
|
|
175087e9fd | ||
|
|
0b82ffa913 | ||
|
|
5d216dd56f | ||
|
|
48ea7cb6ea | ||
|
|
0f79022907 | ||
|
|
c15ac6fca5 | ||
|
|
e9ae808a7d | ||
|
|
8e085211f7 | ||
|
|
47c4f3143e | ||
|
|
f1e914b927 | ||
|
|
210a3101de | ||
|
|
06f1f990f0 | ||
|
|
781e70287d | ||
|
|
c030b045a2 | ||
|
|
6a29794575 | ||
|
|
da9ad2523c | ||
|
|
052082d631 | ||
|
|
1aab77c302 | ||
|
|
f146eaf0a5 | ||
|
|
0aabd4f527 | ||
|
|
a22582502b | ||
|
|
0c7c791f19 | ||
|
|
87a1ebba2c | ||
|
|
bc04896b63 | ||
|
|
1d823afe58 | ||
|
|
898f9f9320 | ||
|
|
a89a98d233 | ||
|
|
1923c096aa | ||
|
|
1e72ccb391 | ||
|
|
cbcc9e74c0 | ||
|
|
83e366a2b8 | ||
|
|
85333e6a3e | ||
|
|
6af195a3fd | ||
|
|
85497d5777 | ||
|
|
753e264c89 | ||
|
|
10a5a2265c | ||
|
|
29a09c53a6 | ||
|
|
c608c2f856 | ||
|
|
86b7d4bda5 | ||
|
|
e573bfd98a | ||
|
|
94901da15e | ||
|
|
ecbd5e00a6 | ||
|
|
d5b70b050c | ||
|
|
79eeb2a491 | ||
|
|
f5930ae9e6 | ||
|
|
aa3db27c77 | ||
|
|
44210e6bbb | ||
|
|
984d587d00 | ||
|
|
79be24d581 | ||
|
|
1518cd7db6 | ||
|
|
ac7117c13d | ||
|
|
38d13f2fa7 | ||
|
|
8b1ae80c54 | ||
|
|
1f867808d2 | ||
|
|
d8b20caf22 | ||
|
|
fc2da628e8 | ||
|
|
d4826d803e | ||
|
|
a123682c93 | ||
|
|
b3c8ee76e9 | ||
|
|
1d5a528cd1 | ||
|
|
891e80a3a9 |
@@ -3,3 +3,4 @@
|
|||||||
result
|
result
|
||||||
result-*
|
result-*
|
||||||
run-vm-*
|
run-vm-*
|
||||||
|
.nixos-test-history
|
||||||
|
|||||||
Generated
+955
-36
File diff suppressed because it is too large
Load Diff
@@ -7,6 +7,12 @@
|
|||||||
inputs.treefmt-nix.follows = "treefmt-nix";
|
inputs.treefmt-nix.follows = "treefmt-nix";
|
||||||
inputs.nixpkgs.follows = "nixpkgs";
|
inputs.nixpkgs.follows = "nixpkgs";
|
||||||
};
|
};
|
||||||
|
clan-community = {
|
||||||
|
url = "git+https://git.clan.lol/clan/clan-community";
|
||||||
|
inputs.clan-core.follows = "clan-core";
|
||||||
|
inputs.flake-parts.follows = "flake-parts";
|
||||||
|
inputs.treefmt-nix.follows = "treefmt-nix";
|
||||||
|
};
|
||||||
devshell = {
|
devshell = {
|
||||||
url = "github:numtide/devshell";
|
url = "github:numtide/devshell";
|
||||||
inputs.nixpkgs.follows = "nixpkgs";
|
inputs.nixpkgs.follows = "nixpkgs";
|
||||||
@@ -19,6 +25,11 @@
|
|||||||
inputs.nixpkgs.follows = "nixpkgs";
|
inputs.nixpkgs.follows = "nixpkgs";
|
||||||
url = "github:nix-community/home-manager";
|
url = "github:nix-community/home-manager";
|
||||||
};
|
};
|
||||||
|
plasma-manager = {
|
||||||
|
url = "github:nix-community/plasma-manager";
|
||||||
|
inputs.nixpkgs.follows = "nixpkgs";
|
||||||
|
inputs.home-manager.follows = "home-manager";
|
||||||
|
};
|
||||||
import-tree.url = "github:vic/import-tree";
|
import-tree.url = "github:vic/import-tree";
|
||||||
nixpkgs.url = "github:nixos/nixpkgs/nixpkgs-unstable";
|
nixpkgs.url = "github:nixos/nixpkgs/nixpkgs-unstable";
|
||||||
treefmt-nix = {
|
treefmt-nix = {
|
||||||
@@ -26,9 +37,37 @@
|
|||||||
inputs.nixpkgs.follows = "nixpkgs";
|
inputs.nixpkgs.follows = "nixpkgs";
|
||||||
};
|
};
|
||||||
liminix = {
|
liminix = {
|
||||||
url = "git+https://git.b4l.co.th/newedge/liminix?ref=refs/heads/fix-gl-ar750&rev=3f1f7c08d440130cce9262a93ce78ed7969d93cd";
|
url = "git+https://gti.telent.net/dan/liminix";
|
||||||
flake = false;
|
flake = false;
|
||||||
};
|
};
|
||||||
|
frappix = {
|
||||||
|
url = "github:kurogeek/frappix";
|
||||||
|
inputs.nixpkgs.follows = "nixpkgs";
|
||||||
|
inputs.devshell.follows = "devshell";
|
||||||
|
};
|
||||||
|
|
||||||
|
nixos-images = {
|
||||||
|
url = "github:nix-community/nixos-images";
|
||||||
|
inputs.nixos-unstable.follows = "nixpkgs";
|
||||||
|
inputs.nixos-stable.follows = "nixpkgs";
|
||||||
|
};
|
||||||
|
|
||||||
|
matthew-hardware = {
|
||||||
|
url = "git+https://codeberg.org/matthewcroughan/matthew-hardware?ref=mc/wip";
|
||||||
|
inputs.flake-parts.follows = "flake-parts";
|
||||||
|
inputs.nixpkgs.follows = "nixpkgs";
|
||||||
|
inputs.disko.follows = "clan-core/disko";
|
||||||
|
};
|
||||||
|
|
||||||
|
# `router` clan service (site gateway: PPPoE, VLAN bridge, Kea/Blocky,
|
||||||
|
# nftables). Consumed via `module.input = "cnx-network"` in inventories/router.nix.
|
||||||
|
cnx-network = {
|
||||||
|
url = "git+https://git.b4l.co.th/B4L/cnx-network-clan?ref=clanService-router-ai";
|
||||||
|
inputs.clan-core.follows = "clan-core";
|
||||||
|
inputs.nixpkgs.follows = "nixpkgs";
|
||||||
|
inputs.flake-parts.follows = "flake-parts";
|
||||||
|
inputs.treefmt-nix.follows = "treefmt-nix";
|
||||||
|
};
|
||||||
};
|
};
|
||||||
outputs =
|
outputs =
|
||||||
{
|
{
|
||||||
@@ -45,6 +84,7 @@
|
|||||||
./fmt.nix
|
./fmt.nix
|
||||||
./shell.nix
|
./shell.nix
|
||||||
|
|
||||||
|
./overlays
|
||||||
./machines
|
./machines
|
||||||
./routers
|
./routers
|
||||||
./inventories
|
./inventories
|
||||||
@@ -66,6 +106,20 @@
|
|||||||
packages.think = pkgs.think-gtcm;
|
packages.think = pkgs.think-gtcm;
|
||||||
packages.think-be = pkgs.think-backend-gtcm;
|
packages.think-be = pkgs.think-backend-gtcm;
|
||||||
packages.file-uploader = pkgs.gtcm-file-uploader;
|
packages.file-uploader = pkgs.gtcm-file-uploader;
|
||||||
|
packages.installer =
|
||||||
|
(pkgs.nixos [
|
||||||
|
inputs.nixos-images.nixosModules.image-installer
|
||||||
|
{
|
||||||
|
users.users.root.openssh.authorizedKeys.keys = [
|
||||||
|
"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIAB/raxJR8gASmquP63weHelbi+da2WBJR1DgzHPNz/f"
|
||||||
|
"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIDuhpzDHBPvn8nv8RH1MRomDOaXyP4GziQm7r3MZ1Syk"
|
||||||
|
"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIEcZ/p1Ofa9liwIzPWzNtONhJ7+FUWd2lCz33r81t8+w kurogeek@kurogeek"
|
||||||
|
"sk-ssh-ed25519@openssh.com AAAAGnNrLXNzaC1lZDI1NTE5QG9wZW5zc2guY29tAAAAIOJDRQfb1+7VK5tOe8W40iryfBWYRO6Uf1r2viDjmsJtAAAABHNzaDo="
|
||||||
|
"sk-ssh-ed25519@openssh.com AAAAGnNrLXNzaC1lZDI1NTE5QG9wZW5zc2guY29tAAAAIDgsWq+G/tcr6eUQYT7+sJeBtRmOMabgFiIgIV44XNc6AAAABHNzaDo="
|
||||||
|
"sk-ssh-ed25519@openssh.com AAAAGnNrLXNzaC1lZDI1NTE5QG9wZW5zc2guY29tAAAAIJMi3TAuwDtIeO4MsORlBZ31HzaV5bji1fFBPcC9/tWuAAAABHNzaDo="
|
||||||
|
];
|
||||||
|
}
|
||||||
|
]).config.system.build.isoImage;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|||||||
+357
-80
@@ -1,5 +1,9 @@
|
|||||||
{
|
{
|
||||||
imports = [ ./personal-computer.nix ];
|
imports = [
|
||||||
|
./personal-computer.nix
|
||||||
|
./emmie.nix
|
||||||
|
./router.nix
|
||||||
|
];
|
||||||
clan = {
|
clan = {
|
||||||
inventory = {
|
inventory = {
|
||||||
|
|
||||||
@@ -7,16 +11,23 @@
|
|||||||
glom = [
|
glom = [
|
||||||
"vega"
|
"vega"
|
||||||
"ramus"
|
"ramus"
|
||||||
|
"canopus"
|
||||||
|
];
|
||||||
|
poy = [
|
||||||
|
"deneb"
|
||||||
|
"bosona"
|
||||||
|
];
|
||||||
|
w = [
|
||||||
|
"sirius"
|
||||||
|
"stellio"
|
||||||
];
|
];
|
||||||
w = [ "sirius" ];
|
|
||||||
b4l = [
|
b4l = [
|
||||||
"rigel"
|
"rigel"
|
||||||
"neptune"
|
|
||||||
"rana"
|
"rana"
|
||||||
"petra"
|
"petra"
|
||||||
|
"alasia"
|
||||||
];
|
];
|
||||||
phonebox = [
|
phonebox = [
|
||||||
"neptune"
|
|
||||||
"rigel"
|
"rigel"
|
||||||
"almach"
|
"almach"
|
||||||
"alpheratz"
|
"alpheratz"
|
||||||
@@ -24,24 +35,173 @@
|
|||||||
"adhil"
|
"adhil"
|
||||||
"buna"
|
"buna"
|
||||||
];
|
];
|
||||||
global-network = [
|
|
||||||
|
prometheus = [
|
||||||
|
"cursa"
|
||||||
|
"rigel"
|
||||||
|
"vega"
|
||||||
|
"buna"
|
||||||
|
];
|
||||||
|
|
||||||
|
dm-bootstrapper = [
|
||||||
|
"rigel"
|
||||||
|
"cursa"
|
||||||
|
"deneb"
|
||||||
|
"bosona"
|
||||||
|
"canopus"
|
||||||
|
];
|
||||||
|
|
||||||
|
dm-pull-deploy = [
|
||||||
"rana"
|
"rana"
|
||||||
"sirius"
|
"rigel"
|
||||||
|
"vega"
|
||||||
];
|
];
|
||||||
};
|
};
|
||||||
|
|
||||||
instances = {
|
instances = {
|
||||||
admin = {
|
|
||||||
|
borgbackup = {
|
||||||
module = {
|
module = {
|
||||||
name = "admin";
|
name = "borgbackup";
|
||||||
input = "clan-core";
|
input = "clan-core";
|
||||||
};
|
};
|
||||||
roles.default.tags."all" = { };
|
roles.client.machines."cursa".settings.destinations = {
|
||||||
roles.default.settings.allowedKeys = {
|
alex = {
|
||||||
|
repo = "ssh://borg@10.0.10.225:2222/backup/cursa/backup";
|
||||||
|
rsh = "ssh -i /run/secrets/vars/borgbackup/borgbackup.ssh";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
roles.client.machines."hadar".settings.destinations = {
|
||||||
|
alex = {
|
||||||
|
repo = "ssh://borg@10.0.10.225:2222/backup/hadar/backup";
|
||||||
|
rsh = "ssh -i /run/secrets/vars/borgbackup/borgbackup.ssh";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
roles.client.machines."procyon".settings.destinations = {
|
||||||
|
alex = {
|
||||||
|
repo = "ssh://borg@10.0.10.225:2222/backup/procyon/backup";
|
||||||
|
rsh = "ssh -i /run/secrets/vars/borgbackup/borgbackup.ssh";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
roles.client.machines."bosona".settings.destinations = {
|
||||||
|
alex = {
|
||||||
|
repo = "ssh://borg@10.0.10.225:2222/backup/bosona/backup";
|
||||||
|
rsh = "ssh -i /run/secrets/vars/borgbackup/borgbackup.ssh";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
roles.client.machines."canopus".settings.destinations = {
|
||||||
|
alex = {
|
||||||
|
repo = "ssh://borg@10.0.10.225:2222/backup/canopus/backup";
|
||||||
|
rsh = "ssh -i /run/secrets/vars/borgbackup/borgbackup.ssh";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
roles.client.machines."deneb".settings.destinations = {
|
||||||
|
alex = {
|
||||||
|
repo = "ssh://borg@10.0.10.225:2222/backup/deneb/backup";
|
||||||
|
rsh = "ssh -i /run/secrets/vars/borgbackup/borgbackup.ssh";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
roles.client.machines."alasia".settings.destinations = {
|
||||||
|
alex = {
|
||||||
|
repo = "ssh://borg@10.0.10.225:2222/backup/alasia/backup";
|
||||||
|
rsh = "ssh -i /run/secrets/vars/borgbackup/borgbackup.ssh";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
data-mesher = {
|
||||||
|
module = {
|
||||||
|
name = "data-mesher";
|
||||||
|
input = "clan-core";
|
||||||
|
};
|
||||||
|
roles.bootstrap.tags = [ "dm-bootstrapper" ];
|
||||||
|
roles.default.tags = [ "all" ];
|
||||||
|
roles.default.settings.interfaces = [ "ygg" ];
|
||||||
|
};
|
||||||
|
|
||||||
|
auto-pull-update = {
|
||||||
|
module = {
|
||||||
|
name = "dm-pull-deploy";
|
||||||
|
input = "clan-community";
|
||||||
|
};
|
||||||
|
roles.push.machines."rigel".settings = {
|
||||||
|
gitUrl = "https://git.b4l.co.th/newedge/infra.git";
|
||||||
|
branch = "main";
|
||||||
|
};
|
||||||
|
roles.push.extraModules = [
|
||||||
|
(
|
||||||
|
{ pkgs, config, ... }:
|
||||||
|
{
|
||||||
|
# work around until upstream is fixed
|
||||||
|
environment.systemPackages = [
|
||||||
|
(pkgs.writeShellApplication {
|
||||||
|
name = "custom-dm-send-deploy";
|
||||||
|
runtimeInputs = [
|
||||||
|
config.services.data-mesher.package
|
||||||
|
pkgs.git
|
||||||
|
pkgs.nix
|
||||||
|
pkgs.jq
|
||||||
|
];
|
||||||
|
text =
|
||||||
|
let
|
||||||
|
settings.gitUrl = "https://git.b4l.co.th/newedge/infra.git";
|
||||||
|
settings.branch = "main";
|
||||||
|
in
|
||||||
|
''
|
||||||
|
if [ $# -gt 1 ]; then
|
||||||
|
echo "Usage: dm-send-deploy [<flake-ref>]"
|
||||||
|
echo "Without arguments, sends the latest commit on '${settings.branch}' from ${settings.gitUrl}"
|
||||||
|
echo "Example: dm-send-deploy git+https://example.com/repo.git?rev=abc123..."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
KEY="${config.clan.core.vars.generators.dm-pull-deploy-signing-key.files."signing.key".path}"
|
||||||
|
if [ ! -r "$KEY" ]; then
|
||||||
|
echo "Error: cannot read signing key at $KEY (are you root?)"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ $# -eq 1 ]; then
|
||||||
|
FLAKE_REF="$1"
|
||||||
|
else
|
||||||
|
REV=$(git ls-remote "${settings.gitUrl}" "refs/heads/${settings.branch}" | cut -f1)
|
||||||
|
if [ -z "$REV" ]; then
|
||||||
|
echo "Error: could not determine latest commit on ${settings.branch} from ${settings.gitUrl}"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
FLAKE_REF="git+${settings.gitUrl}?rev=$REV"
|
||||||
|
fi
|
||||||
|
|
||||||
|
TMPFILE=$(mktemp)
|
||||||
|
trap 'rm -f "$TMPFILE"' EXIT
|
||||||
|
|
||||||
|
printf '%s' "$FLAKE_REF" > "$TMPFILE"
|
||||||
|
|
||||||
|
NETWORK_ID="${config.clan.core.vars.generators.data-mesher-network.files."network.pub".path}"
|
||||||
|
|
||||||
|
data-mesher file update "$TMPFILE" \
|
||||||
|
--url http://localhost:7331 \
|
||||||
|
--network-id "$NETWORK_ID" \
|
||||||
|
--key "$KEY" \
|
||||||
|
--name "dm_pull_deploy/target"
|
||||||
|
|
||||||
|
echo "Deployment target pushed: $FLAKE_REF"
|
||||||
|
'';
|
||||||
|
})
|
||||||
|
];
|
||||||
|
}
|
||||||
|
)
|
||||||
|
];
|
||||||
|
roles.default.tags = [ "dm-pull-deploy" ];
|
||||||
|
roles.default.settings.action = "switch";
|
||||||
|
};
|
||||||
|
|
||||||
|
sshd = {
|
||||||
|
roles.server.tags."all" = { };
|
||||||
|
roles.server.settings = {
|
||||||
|
authorizedKeys = {
|
||||||
"berwn" = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIAB/raxJR8gASmquP63weHelbi+da2WBJR1DgzHPNz/f";
|
"berwn" = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIAB/raxJR8gASmquP63weHelbi+da2WBJR1DgzHPNz/f";
|
||||||
"davhau" = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIDuhpzDHBPvn8nv8RH1MRomDOaXyP4GziQm7r3MZ1Syk";
|
"davhau" = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIDuhpzDHBPvn8nv8RH1MRomDOaXyP4GziQm7r3MZ1Syk";
|
||||||
"vi" =
|
|
||||||
"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIAmgyEGuY/r7SDlJgrzYmQqpcWS5W+fCzRi3OS59ne4W openpgp:0xFF687387";
|
|
||||||
"kurogeek" =
|
"kurogeek" =
|
||||||
"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIEcZ/p1Ofa9liwIzPWzNtONhJ7+FUWd2lCz33r81t8+w kurogeek@kurogeek";
|
"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIEcZ/p1Ofa9liwIzPWzNtONhJ7+FUWd2lCz33r81t8+w kurogeek@kurogeek";
|
||||||
"matthewcroughan" =
|
"matthewcroughan" =
|
||||||
@@ -52,6 +212,18 @@
|
|||||||
"sk-ssh-ed25519@openssh.com AAAAGnNrLXNzaC1lZDI1NTE5QG9wZW5zc2guY29tAAAAIJMi3TAuwDtIeO4MsORlBZ31HzaV5bji1fFBPcC9/tWuAAAABHNzaDo=";
|
"sk-ssh-ed25519@openssh.com AAAAGnNrLXNzaC1lZDI1NTE5QG9wZW5zc2guY29tAAAAIJMi3TAuwDtIeO4MsORlBZ31HzaV5bji1fFBPcC9/tWuAAAABHNzaDo=";
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
root-password = {
|
||||||
|
module = {
|
||||||
|
name = "users";
|
||||||
|
input = "clan-core";
|
||||||
|
};
|
||||||
|
roles.default.tags."all" = { };
|
||||||
|
roles.default.settings = {
|
||||||
|
user = "root";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
tor = {
|
tor = {
|
||||||
module = {
|
module = {
|
||||||
@@ -80,7 +252,13 @@
|
|||||||
name = "zerotier";
|
name = "zerotier";
|
||||||
input = "clan-core";
|
input = "clan-core";
|
||||||
};
|
};
|
||||||
roles.controller.machines."vega" = { };
|
roles.controller.machines."vega" = {
|
||||||
|
settings.allowedIds = [
|
||||||
|
"dbe44c0287" # Alex-gateway
|
||||||
|
"b0e0b84fd3" # Alex
|
||||||
|
"2bd36db8cc" # kurogeek-thinkpad
|
||||||
|
];
|
||||||
|
};
|
||||||
roles.peer.tags.glom = { };
|
roles.peer.tags.glom = { };
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -89,16 +267,48 @@
|
|||||||
name = "zerotier";
|
name = "zerotier";
|
||||||
input = "clan-core";
|
input = "clan-core";
|
||||||
};
|
};
|
||||||
roles.controller.machines."rigel" = { };
|
roles.controller.machines."rigel" = {
|
||||||
|
settings.allowedIds = [
|
||||||
|
"dbe44c0287" # Alex-gateway
|
||||||
|
"b0e0b84fd3" # Alex
|
||||||
|
"2bd36db8cc" # kurogeek-thinkpad
|
||||||
|
];
|
||||||
|
};
|
||||||
roles.peer.tags.b4l = { };
|
roles.peer.tags.b4l = { };
|
||||||
};
|
};
|
||||||
|
|
||||||
|
poy-network = {
|
||||||
|
module = {
|
||||||
|
name = "zerotier";
|
||||||
|
input = "clan-core";
|
||||||
|
};
|
||||||
|
roles.controller.machines."deneb" = {
|
||||||
|
settings.allowedIps = [
|
||||||
|
#kurogeek
|
||||||
|
"fdfe:7bf:a795:4524:4c99:932b:d36d:b8cc"
|
||||||
|
];
|
||||||
|
};
|
||||||
|
roles.peer.tags."poy" = { };
|
||||||
|
};
|
||||||
|
|
||||||
|
internet = {
|
||||||
|
module.name = "internet";
|
||||||
|
roles.default.machines = {
|
||||||
|
ramus.settings.host = "5.223.63.55";
|
||||||
|
tangra.settings.host = "5.223.65.50";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
yggdrasil-global-network = {
|
yggdrasil-global-network = {
|
||||||
module = {
|
module = {
|
||||||
name = "yggdrasil";
|
name = "yggdrasil";
|
||||||
input = "clan-core";
|
input = "clan-core";
|
||||||
};
|
};
|
||||||
roles.default.tags."global-network" = { };
|
roles.default.tags."all" = { };
|
||||||
|
roles.default.settings.extraYggdrasilIPs = [
|
||||||
|
# kurogeek's laptop
|
||||||
|
"200:c8db:ea9b:5bdc:44ed:ad87:462a:6bd0"
|
||||||
|
];
|
||||||
roles.default.settings.extraPeers = [
|
roles.default.settings.extraPeers = [
|
||||||
"tls://ygg.jjolly.dev:3443"
|
"tls://ygg.jjolly.dev:3443"
|
||||||
"tls://[2602:fc24:18:7a42::1]:993"
|
"tls://[2602:fc24:18:7a42::1]:993"
|
||||||
@@ -107,18 +317,36 @@
|
|||||||
];
|
];
|
||||||
};
|
};
|
||||||
|
|
||||||
yggdrasil-phone-network = {
|
newedge-headscale = {
|
||||||
module = {
|
module = {
|
||||||
name = "yggdrasil";
|
name = "headscale";
|
||||||
input = "clan-core";
|
input = "self";
|
||||||
};
|
};
|
||||||
roles.default.tags."phonebox" = { };
|
roles.server.machines."alasia".settings = {
|
||||||
roles.default.settings.extraPeers = [
|
public_url = "tailvpn.public.newedge.house";
|
||||||
"tls://ygg.jjolly.dev:3443"
|
advertise_routes = [ "10.0.10.0/24" ];
|
||||||
"tls://[2602:fc24:18:7a42::1]:993"
|
dns = {
|
||||||
"tcp://leo.node.3dt.net:9002"
|
magic_dns = true;
|
||||||
"tcp://ygg-kcmo.incognet.io:8883"
|
base_domain = "tailvpn.newedge.house";
|
||||||
|
nameservers = [
|
||||||
|
"10.0.10.82"
|
||||||
|
"1.1.1.1"
|
||||||
|
"8.8.8.8"
|
||||||
];
|
];
|
||||||
|
extra_records = [
|
||||||
|
{
|
||||||
|
name = "poyerp.newedge.house";
|
||||||
|
type = "A";
|
||||||
|
value = "10.0.10.1";
|
||||||
|
}
|
||||||
|
{
|
||||||
|
name = "glomerp.newedge.house";
|
||||||
|
type = "A";
|
||||||
|
value = "10.0.10.1";
|
||||||
|
}
|
||||||
|
];
|
||||||
|
};
|
||||||
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
phonebox = {
|
phonebox = {
|
||||||
@@ -130,64 +358,15 @@
|
|||||||
roles.default.machines."adhil".settings = {
|
roles.default.machines."adhil".settings = {
|
||||||
ata-ethernet-iface = "end0";
|
ata-ethernet-iface = "end0";
|
||||||
};
|
};
|
||||||
|
roles.default.machines."rigel".settings = {
|
||||||
|
extraClientNumbers = [
|
||||||
|
"01"
|
||||||
|
"02"
|
||||||
|
];
|
||||||
|
extraFixedIPClient = { };
|
||||||
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
pocket-id = {
|
|
||||||
module = {
|
|
||||||
name = "pocket-id";
|
|
||||||
input = "self";
|
|
||||||
};
|
|
||||||
roles.default.machines.b4l = { };
|
|
||||||
};
|
|
||||||
nextcloud = {
|
|
||||||
module = {
|
|
||||||
name = "nextcloud";
|
|
||||||
input = "self";
|
|
||||||
};
|
|
||||||
roles.default.machines.b4l = { };
|
|
||||||
};
|
|
||||||
stirling-pdf = {
|
|
||||||
module = {
|
|
||||||
name = "stirling-pdf";
|
|
||||||
input = "self";
|
|
||||||
};
|
|
||||||
roles.default.machines.b4l = { };
|
|
||||||
};
|
|
||||||
actual-budget = {
|
|
||||||
module = {
|
|
||||||
name = "actual-budget";
|
|
||||||
input = "self";
|
|
||||||
};
|
|
||||||
roles.default.machines.b4l = { };
|
|
||||||
};
|
|
||||||
victoriametrics = {
|
|
||||||
module = {
|
|
||||||
name = "victoriametrics";
|
|
||||||
input = "self";
|
|
||||||
};
|
|
||||||
roles.default.machines.b4l = { };
|
|
||||||
};
|
|
||||||
vikunja = {
|
|
||||||
module = {
|
|
||||||
name = "vikunja";
|
|
||||||
input = "self";
|
|
||||||
};
|
|
||||||
roles.default.machines.b4l = { };
|
|
||||||
};
|
|
||||||
grafana = {
|
|
||||||
module = {
|
|
||||||
name = "grafana";
|
|
||||||
input = "self";
|
|
||||||
};
|
|
||||||
roles.default.machines.b4l = { };
|
|
||||||
};
|
|
||||||
paperless = {
|
|
||||||
module = {
|
|
||||||
name = "paperless";
|
|
||||||
input = "self";
|
|
||||||
};
|
|
||||||
roles.default.machines.b4l = { };
|
|
||||||
};
|
|
||||||
pulse-stream = {
|
pulse-stream = {
|
||||||
module = {
|
module = {
|
||||||
name = "pulse-stream";
|
name = "pulse-stream";
|
||||||
@@ -280,6 +459,104 @@
|
|||||||
dataDir = "/mnt/hdd/samba";
|
dataDir = "/mnt/hdd/samba";
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
wordpress = {
|
||||||
|
module = {
|
||||||
|
name = "wordpress";
|
||||||
|
input = "self";
|
||||||
|
};
|
||||||
|
roles.server.machines."tangra".settings = {
|
||||||
|
tenants = [
|
||||||
|
"poyfestival.com"
|
||||||
|
];
|
||||||
|
phpfpmOptions = ''
|
||||||
|
upload_max_filesize=64M
|
||||||
|
post_max_size=128M
|
||||||
|
'';
|
||||||
|
wpExtraConfig = ''
|
||||||
|
define('WP_MEMORY_LIMIT', '256M');
|
||||||
|
define('WP_DEBUG', false);
|
||||||
|
define('WP_DEBUG_DISPLAY', false);
|
||||||
|
define('WP_DEBUG_LOG', false);
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
prometheus-monitoring = {
|
||||||
|
module = {
|
||||||
|
name = "prometheus";
|
||||||
|
input = "self";
|
||||||
|
};
|
||||||
|
roles.server.machines."cursa".settings = {
|
||||||
|
matrix-alertmanager = {
|
||||||
|
enable = true;
|
||||||
|
homeserverUrl = "https://matrix-client.matrix.org";
|
||||||
|
matrixUser = "@nixapollo:matrix.org";
|
||||||
|
matrixRooms = [
|
||||||
|
{
|
||||||
|
receivers = [
|
||||||
|
"matrix"
|
||||||
|
];
|
||||||
|
roomId = "!rqIrWqPvsXqMgYpcNZ:matrix.org";
|
||||||
|
}
|
||||||
|
];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
roles.nodes.machines = {
|
||||||
|
vega.settings = {
|
||||||
|
exporters.smartctl = { };
|
||||||
|
exporters.zfs = { };
|
||||||
|
};
|
||||||
|
rigel.settings = {
|
||||||
|
exporters.smartctl = { };
|
||||||
|
};
|
||||||
|
sirius.settings = {
|
||||||
|
exporters.smartctl = { };
|
||||||
|
exporters.zfs = { };
|
||||||
|
};
|
||||||
|
buna.settings = {
|
||||||
|
exporters.smartctl = { };
|
||||||
|
};
|
||||||
|
mirach.settings = {
|
||||||
|
exporters.smartctl = { };
|
||||||
|
};
|
||||||
|
almach.settings = {
|
||||||
|
exporters.smartctl = { };
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
wifi =
|
||||||
|
let
|
||||||
|
networks = {
|
||||||
|
home = { };
|
||||||
|
glom = { };
|
||||||
|
};
|
||||||
|
in
|
||||||
|
{
|
||||||
|
module.name = "wifi";
|
||||||
|
module.input = "clan-community";
|
||||||
|
|
||||||
|
roles.default = {
|
||||||
|
machines."buna".settings = { inherit networks; };
|
||||||
|
|
||||||
|
extraModules = [
|
||||||
|
(
|
||||||
|
{ lib, ... }:
|
||||||
|
{
|
||||||
|
# profile names match the network attr names above;
|
||||||
|
# 0 = retry forever for both (defaults: 4 autoconnect attempts, 3 auth attempts)
|
||||||
|
networking.networkmanager.ensureProfiles.profiles = lib.mapAttrs (_: _: {
|
||||||
|
connection.autoconnect-retries = 0;
|
||||||
|
connection.auth-retries = 0;
|
||||||
|
}) networks;
|
||||||
|
}
|
||||||
|
)
|
||||||
|
];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -0,0 +1,43 @@
|
|||||||
|
{ config, ... }:
|
||||||
|
let
|
||||||
|
username = "emmie";
|
||||||
|
userhome = "/home/${username}";
|
||||||
|
in
|
||||||
|
{
|
||||||
|
clan.inventory = {
|
||||||
|
tags = {
|
||||||
|
emmie = [ "rana" ];
|
||||||
|
};
|
||||||
|
|
||||||
|
instances = {
|
||||||
|
emmie-syncthing = {
|
||||||
|
module = {
|
||||||
|
name = "syncthing";
|
||||||
|
input = "clan-core";
|
||||||
|
};
|
||||||
|
roles.peer.tags.emmie = { };
|
||||||
|
roles.peer.settings = {
|
||||||
|
folders = {
|
||||||
|
Syncthing.path = "${userhome}/Share/Syncthing";
|
||||||
|
Desktop.path = "${userhome}/Desktop";
|
||||||
|
};
|
||||||
|
extraDevices = {
|
||||||
|
pixel7a = {
|
||||||
|
id = "CEUJMEG-SOHXIJF-G2FT5QB-6MZW3EN-PONI3QN-HPEIOSU-IMSLGW7-XUU6BQK";
|
||||||
|
name = "eris";
|
||||||
|
addresses = [ "dynamic" ];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
roles.peer.extraModules = [
|
||||||
|
{
|
||||||
|
config.services.syncthing = {
|
||||||
|
user = username;
|
||||||
|
dataDir = "${userhome}/Share";
|
||||||
|
};
|
||||||
|
}
|
||||||
|
];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
||||||
@@ -14,14 +14,9 @@
|
|||||||
instances = {
|
instances = {
|
||||||
emmie-home = {
|
emmie-home = {
|
||||||
module = {
|
module = {
|
||||||
name = "home-user";
|
name = "emmie-home";
|
||||||
input = "self";
|
input = "self";
|
||||||
};
|
};
|
||||||
roles.default.settings = {
|
|
||||||
username = "emmie";
|
|
||||||
kbLayout = "us,th";
|
|
||||||
kbOptions = "grp:win_space_toggle,grp:alt_shift_toggle";
|
|
||||||
};
|
|
||||||
roles.default.machines."rana" = { };
|
roles.default.machines."rana" = { };
|
||||||
};
|
};
|
||||||
chocolate-home = {
|
chocolate-home = {
|
||||||
|
|||||||
@@ -0,0 +1,61 @@
|
|||||||
|
# Site gateways: the `router` clan service from cnx-network-clan (see
|
||||||
|
# flake.nix input `cnx-network`, and that repo's modules/clan/router/README.md).
|
||||||
|
# One instance for the fleet; each site adds its gateway machine with the
|
||||||
|
# site's port / VLAN layout. `clan vars generate <gw>` then prompts for the
|
||||||
|
# PPPoE username/password.
|
||||||
|
{ lib, ... }:
|
||||||
|
let
|
||||||
|
# Admin mesh = the site's ZeroTier network. The service only opens SSH,
|
||||||
|
# metrics and iperf3 to this prefix, so the gateway must also be a peer of
|
||||||
|
# the same network (tag membership in default.nix). Prefix derivation as in
|
||||||
|
# cnx-network's modules/mesh-hosts.nix: fd + 8-byte network id + 0x9993,
|
||||||
|
# /88 covers every peer.
|
||||||
|
meshSubnet =
|
||||||
|
instance:
|
||||||
|
let
|
||||||
|
networkId = lib.fileContents ../vars/shared/zerotier-network-${instance}/network-id/value;
|
||||||
|
full = "fd" + networkId + "9993";
|
||||||
|
hextet = i: builtins.substring (i * 4) 4 full;
|
||||||
|
in
|
||||||
|
"${hextet 0}:${hextet 1}:${hextet 2}:${hextet 3}:${hextet 4}:${builtins.substring 20 2 full}00::/88";
|
||||||
|
in
|
||||||
|
{
|
||||||
|
clan.inventory.instances.router = {
|
||||||
|
module = {
|
||||||
|
name = "router";
|
||||||
|
input = "cnx-network";
|
||||||
|
};
|
||||||
|
|
||||||
|
roles.default.settings.mesh.subnet = meshSubnet "w-network";
|
||||||
|
|
||||||
|
# stellio: GL.iNet Flint 2 (GL-MT6000, MT7986a). Ports as named by the
|
||||||
|
# device tree in matthew-hardware: eth1 = the 2.5G "WAN" port, lan1 = the
|
||||||
|
# 2.5G LAN port, lan2-lan5 = the 1G LAN ports (DSA on the MT7531 switch).
|
||||||
|
roles.default.machines.stellio.settings = {
|
||||||
|
site = "w";
|
||||||
|
siteId = 1;
|
||||||
|
|
||||||
|
# PPPoE on the ISP's VLAN 10, as on the liminix router it replaces
|
||||||
|
# (routers/white-house); set to null if the ISP runs PPPoE untagged.
|
||||||
|
wan.interface = "eth1";
|
||||||
|
wan.vlanId = 10;
|
||||||
|
|
||||||
|
# 2.5G port carries all VLANs tagged (towards a managed switch / AP).
|
||||||
|
trunkPorts = [ "lan1" ];
|
||||||
|
# 1G ports: untagged client ports on lan, and one always-available
|
||||||
|
# untagged mgmt port for on-site recovery.
|
||||||
|
accessPorts = {
|
||||||
|
lan2 = "lan";
|
||||||
|
lan3 = "lan";
|
||||||
|
lan4 = "lan";
|
||||||
|
lan5 = "mgmt";
|
||||||
|
};
|
||||||
|
|
||||||
|
# 10.1.<id>.0/24, router .1, DHCP pool .100-.199.
|
||||||
|
vlans = {
|
||||||
|
mgmt.id = 10;
|
||||||
|
lan.id = 20;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
||||||
+26
-2
@@ -19,16 +19,40 @@
|
|||||||
"installedAt": 1765277591
|
"installedAt": 1765277591
|
||||||
},
|
},
|
||||||
"buna": {
|
"buna": {
|
||||||
"installedAt": 1765343708
|
"installedAt": 1787123510
|
||||||
},
|
},
|
||||||
"rana": {
|
"rana": {
|
||||||
"installedAt": 1768294839
|
"installedAt": 1773134236
|
||||||
},
|
},
|
||||||
"petra": {
|
"petra": {
|
||||||
"installedAt": 1769064458
|
"installedAt": 1769064458
|
||||||
},
|
},
|
||||||
"sirius": {
|
"sirius": {
|
||||||
"installedAt": 1770974584
|
"installedAt": 1770974584
|
||||||
|
},
|
||||||
|
"deneb": {
|
||||||
|
"installedAt": 1775718970
|
||||||
|
},
|
||||||
|
"canopus": {
|
||||||
|
"installedAt": 1775793532
|
||||||
|
},
|
||||||
|
"hadar": {
|
||||||
|
"installedAt": 1774427255
|
||||||
|
},
|
||||||
|
"procyon": {
|
||||||
|
"installedAt": 1775458442
|
||||||
|
},
|
||||||
|
"alasia": {
|
||||||
|
"installedAt": 1778661666
|
||||||
|
},
|
||||||
|
"bosona": {
|
||||||
|
"installedAt": 1779098893
|
||||||
|
},
|
||||||
|
"tangra": {
|
||||||
|
"installedAt": 1779958921
|
||||||
|
},
|
||||||
|
"cursa": {
|
||||||
|
"installedAt": 1782187627
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -8,6 +8,7 @@
|
|||||||
# clan.core.networking.targetHost = "root@";
|
# clan.core.networking.targetHost = "root@";
|
||||||
|
|
||||||
clan.core.settings.name = "adhil";
|
clan.core.settings.name = "adhil";
|
||||||
# clan.meta.description = "Raspberry Pi 4 SBC board for one of w phone network. (With w office)";
|
clan.core.settings.machine.description =
|
||||||
|
"Raspberry Pi 4 SBC board for one of w phone network. (With w office)";
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,15 @@
|
|||||||
|
{
|
||||||
|
clan.core.settings.machine.description = "VM machine to host headplane instance";
|
||||||
|
|
||||||
|
nixpkgs.hostPlatform = {
|
||||||
|
system = "x86_64-linux";
|
||||||
|
};
|
||||||
|
|
||||||
|
networking.firewall.allowedTCPPorts = [
|
||||||
|
80
|
||||||
|
443
|
||||||
|
];
|
||||||
|
|
||||||
|
system.stateVersion = "25.11";
|
||||||
|
clan.core.sops.defaultGroups = [ "admins" ];
|
||||||
|
}
|
||||||
@@ -0,0 +1,85 @@
|
|||||||
|
let
|
||||||
|
hashDisk = disk: "os-${builtins.substring 0 5 (builtins.hashString "sha256" disk)}";
|
||||||
|
os = "/dev/disk/by-id/scsi-0QEMU_QEMU_HARDDISK_drive-scsi0";
|
||||||
|
in
|
||||||
|
{
|
||||||
|
|
||||||
|
boot.loader = {
|
||||||
|
systemd-boot = {
|
||||||
|
enable = true;
|
||||||
|
};
|
||||||
|
efi = {
|
||||||
|
canTouchEfiVariables = true;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
boot.zfs.forceImportRoot = false;
|
||||||
|
|
||||||
|
disko.devices = {
|
||||||
|
disk = {
|
||||||
|
"os-${hashDisk os}" = {
|
||||||
|
type = "disk";
|
||||||
|
device = os;
|
||||||
|
content = {
|
||||||
|
type = "gpt";
|
||||||
|
partitions = {
|
||||||
|
ESP = {
|
||||||
|
size = "1G";
|
||||||
|
type = "EF00";
|
||||||
|
content = {
|
||||||
|
type = "filesystem";
|
||||||
|
format = "vfat";
|
||||||
|
mountpoint = "/boot";
|
||||||
|
mountOptions = [ "nofail" ];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
system = {
|
||||||
|
size = "100%";
|
||||||
|
content = {
|
||||||
|
type = "zfs";
|
||||||
|
pool = "zroot";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
zpool = {
|
||||||
|
zroot = {
|
||||||
|
type = "zpool";
|
||||||
|
rootFsOptions = {
|
||||||
|
mountpoint = "none";
|
||||||
|
compression = "lz4";
|
||||||
|
acltype = "posixacl";
|
||||||
|
xattr = "sa";
|
||||||
|
"com.sun:auto-snapshot" = "true";
|
||||||
|
};
|
||||||
|
options.ashift = "12";
|
||||||
|
datasets = {
|
||||||
|
"root" = {
|
||||||
|
type = "zfs_fs";
|
||||||
|
options.mountpoint = "none";
|
||||||
|
};
|
||||||
|
"root/nixos" = {
|
||||||
|
type = "zfs_fs";
|
||||||
|
options.mountpoint = "/";
|
||||||
|
mountpoint = "/";
|
||||||
|
};
|
||||||
|
"root/home" = {
|
||||||
|
type = "zfs_fs";
|
||||||
|
options.mountpoint = "/home";
|
||||||
|
mountpoint = "/home";
|
||||||
|
};
|
||||||
|
"root/tmp" = {
|
||||||
|
type = "zfs_fs";
|
||||||
|
mountpoint = "/tmp";
|
||||||
|
options = {
|
||||||
|
mountpoint = "/tmp";
|
||||||
|
sync = "disabled";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -8,6 +8,6 @@
|
|||||||
# clan.core.networking.targetHost = "root@";
|
# clan.core.networking.targetHost = "root@";
|
||||||
|
|
||||||
clan.core.settings.name = "almach";
|
clan.core.settings.name = "almach";
|
||||||
# clan.meta.description = "Radxa X4 SBC board for one of w phone network.";
|
clan.core.settings.machine.description = "Radxa X4 SBC board for one of w phone network.";
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -14,6 +14,8 @@ in
|
|||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
boot.zfs.forceImportRoot = true;
|
||||||
|
|
||||||
disko.devices = {
|
disko.devices = {
|
||||||
disk = {
|
disk = {
|
||||||
"os-${hashDisk os}" = {
|
"os-${hashDisk os}" = {
|
||||||
|
|||||||
@@ -8,6 +8,6 @@
|
|||||||
# clan.core.networking.targetHost = "root@";
|
# clan.core.networking.targetHost = "root@";
|
||||||
|
|
||||||
clan.core.settings.name = "alpheratz";
|
clan.core.settings.name = "alpheratz";
|
||||||
# clan.meta.description = "Radxa X4 SBC board for one of w phone network.";
|
clan.core.settings.machine.description = "Radxa X4 SBC board for one of w phone network.";
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -14,6 +14,8 @@ in
|
|||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
boot.zfs.forceImportRoot = true;
|
||||||
|
|
||||||
disko.devices = {
|
disko.devices = {
|
||||||
disk = {
|
disk = {
|
||||||
"os-${hashDisk os}" = {
|
"os-${hashDisk os}" = {
|
||||||
|
|||||||
@@ -1,36 +0,0 @@
|
|||||||
{ config, ... }:
|
|
||||||
let
|
|
||||||
abDomain = "${config.clan.core.vars.generators.b4l-actual-budget.files.subdomain.value}.${config.networking.fqdn}";
|
|
||||||
in
|
|
||||||
{
|
|
||||||
clan.core.vars.generators.b4l-actual-budget = {
|
|
||||||
files.subdomain.secret = false;
|
|
||||||
|
|
||||||
prompts = {
|
|
||||||
subdomain = {
|
|
||||||
persist = true;
|
|
||||||
type = "line";
|
|
||||||
description = "Sub-domain for Actual Budget app. Default:(budget)";
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
script = ''cat $prompts/subdomain || echo -n "budget" > $out/subdomain'';
|
|
||||||
};
|
|
||||||
|
|
||||||
services.actual = {
|
|
||||||
settings = {
|
|
||||||
allowedLoginMethods = [
|
|
||||||
"password"
|
|
||||||
"openid"
|
|
||||||
];
|
|
||||||
trustedProxies = [ "127.0.0.1" ];
|
|
||||||
};
|
|
||||||
};
|
|
||||||
services.nginx.virtualHosts."${abDomain}" = {
|
|
||||||
useACMEHost = "${config.networking.fqdn}";
|
|
||||||
forceSSL = true;
|
|
||||||
locations."/" = {
|
|
||||||
proxyPass = "http://localhost:${builtins.toString config.services.actual.settings.port}";
|
|
||||||
};
|
|
||||||
};
|
|
||||||
}
|
|
||||||
@@ -1,79 +0,0 @@
|
|||||||
{
|
|
||||||
pkgs,
|
|
||||||
config,
|
|
||||||
lib,
|
|
||||||
...
|
|
||||||
}:
|
|
||||||
with lib;
|
|
||||||
let
|
|
||||||
serviceName = "${config.networking.hostName}-grafana";
|
|
||||||
gfDomain = "${
|
|
||||||
config.clan.core.vars.generators."${serviceName}".files.subdomain.value
|
|
||||||
}.${config.networking.fqdn}";
|
|
||||||
|
|
||||||
settingsFormatIni = pkgs.formats.ini {
|
|
||||||
listToValue = concatMapStringsSep " " (generators.mkValueStringDefault { });
|
|
||||||
mkKeyValue = generators.mkKeyValueDefault {
|
|
||||||
mkValueString = v: if v == null then "" else generators.mkValueStringDefault { } v;
|
|
||||||
} "=";
|
|
||||||
};
|
|
||||||
configFile = settingsFormatIni.generate "config.ini" config.services.grafana.settings;
|
|
||||||
in
|
|
||||||
{
|
|
||||||
clan.core.vars.generators."${serviceName}" = {
|
|
||||||
files = {
|
|
||||||
adminpassword.secret = true;
|
|
||||||
subdomain.secret = false;
|
|
||||||
};
|
|
||||||
prompts = {
|
|
||||||
subdomain = {
|
|
||||||
persist = true;
|
|
||||||
type = "line";
|
|
||||||
description = "Sub-domain for Grafana. Default:(grafana)";
|
|
||||||
};
|
|
||||||
adminpassword = {
|
|
||||||
persist = true;
|
|
||||||
type = "hidden";
|
|
||||||
description = "Password for the admin user. Leave empty to auto-generate.";
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
runtimeInputs = [
|
|
||||||
pkgs.xkcdpass
|
|
||||||
pkgs.coreutils
|
|
||||||
];
|
|
||||||
|
|
||||||
script = ''
|
|
||||||
prompt_domain=$(cat "$prompts"/subdomain)
|
|
||||||
if [[ -n "''${prompt_domain-}" ]]; then
|
|
||||||
echo $prompt_domain | tr -d "\n" > "$out"/subdomain
|
|
||||||
else
|
|
||||||
echo -n "grafana" > "$out"/subdomain
|
|
||||||
fi
|
|
||||||
|
|
||||||
prompt_password=$(cat "$prompts"/adminpassword)
|
|
||||||
if [[ -n "''${prompt_password-}" ]]; then
|
|
||||||
echo "$prompt_password" | tr -d "\n" > "$out"/adminpassword
|
|
||||||
else
|
|
||||||
xkcdpass --numwords 4 --delimiter - --count 1 | tr -d "\n" > "$out"/adminpassword
|
|
||||||
fi
|
|
||||||
'';
|
|
||||||
};
|
|
||||||
|
|
||||||
systemd.services.grafana.serviceConfig.ExecStartPre = [
|
|
||||||
"+${pkgs.writeShellScript "grafana-set-password" ''
|
|
||||||
${pkgs.grafana}/bin/grafana cli --homepath ${config.services.grafana.dataDir} --config ${configFile} admin reset-admin-password $(cat ${
|
|
||||||
config.clan.core.vars.generators."${serviceName}".files.adminpassword.path
|
|
||||||
})
|
|
||||||
''}"
|
|
||||||
];
|
|
||||||
|
|
||||||
services.nginx.virtualHosts."${gfDomain}" = {
|
|
||||||
forceSSL = true;
|
|
||||||
useACMEHost = "${config.networking.fqdn}";
|
|
||||||
locations."/" = {
|
|
||||||
proxyPass = "http://localhost:${builtins.toString config.services.grafana.settings.server.http_port}";
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,35 +0,0 @@
|
|||||||
{ config, pkgs, ... }:
|
|
||||||
let
|
|
||||||
ncDomain = "${config.clan.core.vars.generators.b4l-nextcloud.files.subdomain.value}.${config.networking.fqdn}";
|
|
||||||
in
|
|
||||||
{
|
|
||||||
clan.core.vars.generators.b4l-nextcloud = {
|
|
||||||
files.subdomain.secret = false;
|
|
||||||
|
|
||||||
prompts = {
|
|
||||||
subdomain = {
|
|
||||||
persist = true;
|
|
||||||
type = "line";
|
|
||||||
description = "Sub-domain for Nextcloud app. Default:(cloud)";
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
script = ''cat $prompts/subdomain || echo -n "cloud" > $out/subdomain'';
|
|
||||||
};
|
|
||||||
|
|
||||||
services.nextcloud = {
|
|
||||||
hostName = ncDomain;
|
|
||||||
package = pkgs.nextcloud32;
|
|
||||||
|
|
||||||
settings = {
|
|
||||||
|
|
||||||
overwriteprotocol = "https";
|
|
||||||
trusted_domains = [ ];
|
|
||||||
trusted_proxies = [ ];
|
|
||||||
};
|
|
||||||
};
|
|
||||||
services.nginx.virtualHosts."${ncDomain}" = {
|
|
||||||
useACMEHost = "${config.networking.fqdn}";
|
|
||||||
forceSSL = true;
|
|
||||||
};
|
|
||||||
}
|
|
||||||
@@ -1,67 +0,0 @@
|
|||||||
{ config, pkgs, ... }:
|
|
||||||
let
|
|
||||||
serviceName = "${config.networking.hostName}-paperless";
|
|
||||||
domain-name = "${
|
|
||||||
config.clan.core.vars.generators."${serviceName}".files.subdomain.value
|
|
||||||
}.${config.networking.fqdn}";
|
|
||||||
in
|
|
||||||
{
|
|
||||||
clan.core.vars.generators."${serviceName}" = {
|
|
||||||
files = {
|
|
||||||
subdomain.secret = false;
|
|
||||||
adminpassword = {
|
|
||||||
secret = true;
|
|
||||||
owner = config.services.paperless.user;
|
|
||||||
group = config.services.paperless.user;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
prompts = {
|
|
||||||
subdomain = {
|
|
||||||
persist = true;
|
|
||||||
type = "line";
|
|
||||||
description = "Sub-domain for Paperless. Default:(paperless)";
|
|
||||||
};
|
|
||||||
adminpassword = {
|
|
||||||
persist = true;
|
|
||||||
type = "hidden";
|
|
||||||
description = "Password for the admin user. Leave empty to auto-generate.";
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
runtimeInputs = [
|
|
||||||
pkgs.xkcdpass
|
|
||||||
pkgs.coreutils
|
|
||||||
];
|
|
||||||
|
|
||||||
script = ''
|
|
||||||
prompt_domain=$(cat "$prompts"/subdomain)
|
|
||||||
if [[ -n "''${prompt_domain-}" ]]; then
|
|
||||||
echo $prompt_domain | tr -d "\n" > "$out"/subdomain
|
|
||||||
else
|
|
||||||
echo -n "paperless" > "$out"/subdomain
|
|
||||||
fi
|
|
||||||
|
|
||||||
prompt_password=$(cat "$prompts"/adminpassword)
|
|
||||||
if [[ -n "''${prompt_password-}" ]]; then
|
|
||||||
echo "$prompt_password" | tr -d "\n" > "$out"/adminpassword
|
|
||||||
else
|
|
||||||
xkcdpass --numwords 4 --delimiter - --count 1 | tr -d "\n" > "$out"/adminpassword
|
|
||||||
fi
|
|
||||||
'';
|
|
||||||
};
|
|
||||||
|
|
||||||
environment.systemPackages = [ pkgs.toybox ];
|
|
||||||
|
|
||||||
services.paperless = {
|
|
||||||
passwordFile = config.clan.core.vars.generators."${serviceName}".files.adminpassword.path;
|
|
||||||
};
|
|
||||||
|
|
||||||
services.nginx.virtualHosts."${domain-name}" = {
|
|
||||||
forceSSL = true;
|
|
||||||
useACMEHost = "${config.networking.fqdn}";
|
|
||||||
locations."/" = {
|
|
||||||
proxyPass = "http://localhost:${builtins.toString config.services.paperless.port}";
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,35 +0,0 @@
|
|||||||
{ config, ... }:
|
|
||||||
let
|
|
||||||
pidDomain = "${config.clan.core.vars.generators.b4l-pocket-id.files.subdomain.value}.${config.networking.fqdn}";
|
|
||||||
in
|
|
||||||
{
|
|
||||||
clan.core.vars.generators.b4l-pocket-id = {
|
|
||||||
files.subdomain.secret = false;
|
|
||||||
|
|
||||||
prompts = {
|
|
||||||
subdomain = {
|
|
||||||
persist = true;
|
|
||||||
type = "line";
|
|
||||||
description = "Sub-domain for Pocket-ID app. Default:(auth)";
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
script = ''cat $prompts/subdomain || echo -n "auth" > $out/subdomain'';
|
|
||||||
};
|
|
||||||
|
|
||||||
services.pocket-id = {
|
|
||||||
settings = {
|
|
||||||
APP_ENV = "production";
|
|
||||||
APP_URL = "https://${pidDomain}";
|
|
||||||
TRUST_PROXY = true;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
services.nginx.virtualHosts."${pidDomain}" = {
|
|
||||||
useACMEHost = "${config.networking.fqdn}";
|
|
||||||
forceSSL = true;
|
|
||||||
locations."/" = {
|
|
||||||
proxyPass = "http://localhost:${builtins.toString config.services.pocket-id.settings.PORT}";
|
|
||||||
};
|
|
||||||
};
|
|
||||||
}
|
|
||||||
@@ -1,26 +0,0 @@
|
|||||||
{ config, ... }:
|
|
||||||
let
|
|
||||||
stDomain = "${config.clan.core.vars.generators.b4l-stirling-pdf.files.subdomain.value}.${config.networking.fqdn}";
|
|
||||||
in
|
|
||||||
{
|
|
||||||
clan.core.vars.generators.b4l-stirling-pdf = {
|
|
||||||
files.subdomain.secret = false;
|
|
||||||
|
|
||||||
prompts = {
|
|
||||||
subdomain = {
|
|
||||||
persist = true;
|
|
||||||
type = "line";
|
|
||||||
description = "Sub-domain for Stirling PDF app. Default:(pdf)";
|
|
||||||
};
|
|
||||||
};
|
|
||||||
script = ''cat $prompts/subdomain || echo -n "pdf" > $out/subdomain'';
|
|
||||||
};
|
|
||||||
|
|
||||||
services.nginx.virtualHosts."${stDomain}" = {
|
|
||||||
forceSSL = true;
|
|
||||||
useACMEHost = "${config.networking.fqdn}";
|
|
||||||
locations."/" = {
|
|
||||||
proxyPass = "http://localhost:${builtins.toString config.services.stirling-pdf.environment.SERVER_PORT}";
|
|
||||||
};
|
|
||||||
};
|
|
||||||
}
|
|
||||||
@@ -1,73 +0,0 @@
|
|||||||
{ config, pkgs, ... }:
|
|
||||||
let
|
|
||||||
vmDomain = "${config.clan.core.vars.generators.b4l-victoriametrics.files.subdomain.value}.${config.networking.fqdn}";
|
|
||||||
in
|
|
||||||
{
|
|
||||||
clan.core.vars.generators.b4l-victoriametrics = {
|
|
||||||
files.subdomain.secret = false;
|
|
||||||
files.adminuser.secret = false;
|
|
||||||
files.adminpassword.secret = true;
|
|
||||||
|
|
||||||
prompts = {
|
|
||||||
subdomain = {
|
|
||||||
persist = true;
|
|
||||||
type = "line";
|
|
||||||
description = "Sub-domain for Victoria Metrics app. Default:(metrics)";
|
|
||||||
};
|
|
||||||
adminuser = {
|
|
||||||
persist = true;
|
|
||||||
type = "line";
|
|
||||||
description = "Username for an admin user. Default:(admin)";
|
|
||||||
};
|
|
||||||
adminpassword = {
|
|
||||||
persist = true;
|
|
||||||
type = "hidden";
|
|
||||||
description = "Password for the admin user. Leave empty to auto-generate.";
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
runtimeInputs = [
|
|
||||||
pkgs.xkcdpass
|
|
||||||
pkgs.coreutils
|
|
||||||
];
|
|
||||||
|
|
||||||
script = ''
|
|
||||||
prompt_domain=$(cat "$prompts"/subdomain)
|
|
||||||
if [[ -n "''${prompt_domain-}" ]]; then
|
|
||||||
echo $prompt_domain | tr -d "\n" > "$out"/subdomain
|
|
||||||
else
|
|
||||||
echo -n "metrics" > "$out"/subdomain
|
|
||||||
fi
|
|
||||||
|
|
||||||
prompt_adminuser=$(cat "$prompts"/adminuser)
|
|
||||||
if [[ -n "''${prompt_adminuser-}" ]]; then
|
|
||||||
echo $prompt_adminuser | tr -d "\n" > "$out"/adminuser
|
|
||||||
else
|
|
||||||
echo -n "admin" > "$out"/adminuser
|
|
||||||
fi
|
|
||||||
|
|
||||||
prompt_password=$(cat "$prompts"/adminpassword)
|
|
||||||
if [[ -n "''${prompt_password-}" ]]; then
|
|
||||||
echo "$prompt_password" | tr -d "\n" > "$out"/adminpassword
|
|
||||||
else
|
|
||||||
xkcdpass --numwords 4 --delimiter - --count 1 | tr -d "\n" > "$out"/adminpassword
|
|
||||||
fi
|
|
||||||
'';
|
|
||||||
};
|
|
||||||
|
|
||||||
services.victoriametrics = {
|
|
||||||
extraOptions = [
|
|
||||||
"-httpAuth.username=file://${config.clan.core.vars.generators.b4l-victoriametrics.files.adminuser.path}"
|
|
||||||
"-httpAuth.password=file://${config.clan.core.vars.generators.b4l-victoriametrics.files.adminpassword.path}"
|
|
||||||
];
|
|
||||||
};
|
|
||||||
|
|
||||||
services.nginx.virtualHosts."${vmDomain}" = {
|
|
||||||
forceSSL = true;
|
|
||||||
useACMEHost = "${config.networking.fqdn}";
|
|
||||||
locations."/" = {
|
|
||||||
proxyPass = "http://localhost${builtins.toString config.services.victoriametrics.listenAddress}";
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,26 +0,0 @@
|
|||||||
{ config, ... }:
|
|
||||||
{
|
|
||||||
clan.core.vars.generators.b4l-vikunja = {
|
|
||||||
files.subdomain.secret = false;
|
|
||||||
|
|
||||||
prompts = {
|
|
||||||
subdomain = {
|
|
||||||
persist = true;
|
|
||||||
type = "line";
|
|
||||||
description = "Sub-domain for Vikunja todo app. Default:(todo)";
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
script = ''cat $prompts/subdomain || echo "todo" > $out/subdomain'';
|
|
||||||
};
|
|
||||||
services.vikunja = {
|
|
||||||
frontendHostname = "${config.clan.core.vars.generators.b4l-vikunja.files.subdomain.value}.${config.networking.fqdn}";
|
|
||||||
};
|
|
||||||
services.nginx.virtualHosts."${config.services.vikunja.frontendHostname}" = {
|
|
||||||
useACMEHost = "${config.networking.fqdn}";
|
|
||||||
forceSSL = true;
|
|
||||||
locations."/" = {
|
|
||||||
proxyPass = "${config.services.vikunja.frontendScheme}://${config.services.vikunja.frontendHostname}:${builtins.toString config.services.vikunja.port}";
|
|
||||||
};
|
|
||||||
};
|
|
||||||
}
|
|
||||||
@@ -0,0 +1,105 @@
|
|||||||
|
{
|
||||||
|
inputs,
|
||||||
|
pkgs,
|
||||||
|
config,
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
let
|
||||||
|
sitename = "tempoerp.newedge.house";
|
||||||
|
in
|
||||||
|
{
|
||||||
|
clan.core.settings.machine.description = "VM machine that host ERPNext for tempo";
|
||||||
|
imports = [
|
||||||
|
inputs.frappix.nixosModules.x86_64-linux.frappix
|
||||||
|
];
|
||||||
|
nixpkgs.overlays = [
|
||||||
|
inputs.self.overlays.frappixFrappeOverlay
|
||||||
|
inputs.self.overlays.frappixLibsOverlay
|
||||||
|
inputs.self.overlays.frappixPythonOverlay
|
||||||
|
inputs.self.overlays.frappixToolsOverlay
|
||||||
|
];
|
||||||
|
|
||||||
|
clan.core.vars.generators.frappix = {
|
||||||
|
files = {
|
||||||
|
sslCertificate.secret = false;
|
||||||
|
sslCertificateKey = {
|
||||||
|
owner = "nginx";
|
||||||
|
group = "nginx";
|
||||||
|
secret = true;
|
||||||
|
};
|
||||||
|
adminPassword.secret = true;
|
||||||
|
};
|
||||||
|
runtimeInputs = with pkgs; [
|
||||||
|
openssl
|
||||||
|
xkcdpass
|
||||||
|
];
|
||||||
|
script = ''
|
||||||
|
openssl req -x509 -newkey rsa:4096 -keyout $out/sslCertificateKey -out $out/sslCertificate -sha256 -days 3650 -nodes -subj "/C=TH/ST=ChiangMai/L=ChiangMai/O=kurogeek/CN=kurogeek.home"
|
||||||
|
xkcdpass --numwords 4 --delimiter - --count 1 | tr -d "\n" > "$out"/adminPassword
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
|
||||||
|
services.frappe = {
|
||||||
|
enable = true;
|
||||||
|
project = "poyerp";
|
||||||
|
gunicorn_workers = 2;
|
||||||
|
adminPassword = config.clan.core.vars.generators.frappix.files.adminPassword.path;
|
||||||
|
apps = [
|
||||||
|
pkgs.frappix.erpnext
|
||||||
|
pkgs.frappix.hrms
|
||||||
|
pkgs.frappix.crm
|
||||||
|
];
|
||||||
|
sites = {
|
||||||
|
"${sitename}" = {
|
||||||
|
domains = [ sitename ];
|
||||||
|
apps = [
|
||||||
|
"frappe"
|
||||||
|
"erpnext"
|
||||||
|
"hrms"
|
||||||
|
"crm"
|
||||||
|
];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
services.nginx.virtualHosts."${sitename}" = {
|
||||||
|
sslCertificate = config.clan.core.vars.generators.frappix.files.sslCertificate.path;
|
||||||
|
sslCertificateKey = config.clan.core.vars.generators.frappix.files.sslCertificateKey.path;
|
||||||
|
};
|
||||||
|
|
||||||
|
nixpkgs.hostPlatform = {
|
||||||
|
system = "x86_64-linux";
|
||||||
|
};
|
||||||
|
|
||||||
|
clan.core.vars.generators.nginx = {
|
||||||
|
files = {
|
||||||
|
sslCert = {
|
||||||
|
owner = "nginx";
|
||||||
|
group = "nginx";
|
||||||
|
secret = true;
|
||||||
|
};
|
||||||
|
sslKey = {
|
||||||
|
owner = "nginx";
|
||||||
|
group = "nginx";
|
||||||
|
secret = true;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
runtimeInputs = [
|
||||||
|
pkgs.openssl
|
||||||
|
];
|
||||||
|
script = ''
|
||||||
|
openssl req -x509 -nodes -days 3650 -newkey rsa:2048 \
|
||||||
|
-keyout $out/sslKey \
|
||||||
|
-out $out/sslCert \
|
||||||
|
-subj "/CN=localhost"
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
|
||||||
|
networking.firewall.allowedTCPPorts = [
|
||||||
|
80
|
||||||
|
443
|
||||||
|
];
|
||||||
|
|
||||||
|
system.stateVersion = "25.11";
|
||||||
|
clan.core.sops.defaultGroups = [ "admins" ];
|
||||||
|
}
|
||||||
@@ -0,0 +1,85 @@
|
|||||||
|
let
|
||||||
|
hashDisk = disk: "os-${builtins.substring 0 5 (builtins.hashString "sha256" disk)}";
|
||||||
|
os = "/dev/disk/by-id/scsi-0QEMU_QEMU_HARDDISK_drive-scsi0";
|
||||||
|
in
|
||||||
|
{
|
||||||
|
|
||||||
|
boot.loader = {
|
||||||
|
systemd-boot = {
|
||||||
|
enable = true;
|
||||||
|
};
|
||||||
|
efi = {
|
||||||
|
canTouchEfiVariables = true;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
boot.zfs.forceImportRoot = true;
|
||||||
|
|
||||||
|
disko.devices = {
|
||||||
|
disk = {
|
||||||
|
"os-${hashDisk os}" = {
|
||||||
|
type = "disk";
|
||||||
|
device = os;
|
||||||
|
content = {
|
||||||
|
type = "gpt";
|
||||||
|
partitions = {
|
||||||
|
ESP = {
|
||||||
|
size = "1G";
|
||||||
|
type = "EF00";
|
||||||
|
content = {
|
||||||
|
type = "filesystem";
|
||||||
|
format = "vfat";
|
||||||
|
mountpoint = "/boot";
|
||||||
|
mountOptions = [ "nofail" ];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
system = {
|
||||||
|
size = "100%";
|
||||||
|
content = {
|
||||||
|
type = "zfs";
|
||||||
|
pool = "zroot";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
zpool = {
|
||||||
|
zroot = {
|
||||||
|
type = "zpool";
|
||||||
|
rootFsOptions = {
|
||||||
|
mountpoint = "none";
|
||||||
|
compression = "lz4";
|
||||||
|
acltype = "posixacl";
|
||||||
|
xattr = "sa";
|
||||||
|
"com.sun:auto-snapshot" = "true";
|
||||||
|
};
|
||||||
|
options.ashift = "12";
|
||||||
|
datasets = {
|
||||||
|
"root" = {
|
||||||
|
type = "zfs_fs";
|
||||||
|
options.mountpoint = "none";
|
||||||
|
};
|
||||||
|
"root/nixos" = {
|
||||||
|
type = "zfs_fs";
|
||||||
|
options.mountpoint = "/";
|
||||||
|
mountpoint = "/";
|
||||||
|
};
|
||||||
|
"root/home" = {
|
||||||
|
type = "zfs_fs";
|
||||||
|
options.mountpoint = "/home";
|
||||||
|
mountpoint = "/home";
|
||||||
|
};
|
||||||
|
"root/tmp" = {
|
||||||
|
type = "zfs_fs";
|
||||||
|
mountpoint = "/tmp";
|
||||||
|
options = {
|
||||||
|
mountpoint = "/tmp";
|
||||||
|
sync = "disabled";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -8,6 +8,7 @@
|
|||||||
# clan.core.networking.targetHost = "root@";
|
# clan.core.networking.targetHost = "root@";
|
||||||
|
|
||||||
clan.core.settings.name = "buna";
|
clan.core.settings.name = "buna";
|
||||||
# clan.meta.description = "Radxa X4 SBC board for one of w phone network. (With w whitehouse)";
|
clan.core.settings.machine.description =
|
||||||
|
"Radxa X4 SBC board for one of w phone network. (With w whitehouse)";
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
+728
-606
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,109 @@
|
|||||||
|
{
|
||||||
|
inputs,
|
||||||
|
pkgs,
|
||||||
|
config,
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
let
|
||||||
|
sitename = "glomerp.newedge.house";
|
||||||
|
nbClientName = "netbird-b4l";
|
||||||
|
in
|
||||||
|
{
|
||||||
|
clan.core.settings.machine.description = "VM machine that host ERPNext for glomglom";
|
||||||
|
|
||||||
|
imports = [ inputs.frappix.nixosModules.x86_64-linux.frappix ];
|
||||||
|
nixpkgs.overlays = [
|
||||||
|
inputs.self.overlays.frappixFrappeOverlay
|
||||||
|
inputs.self.overlays.frappixLibsOverlay
|
||||||
|
inputs.self.overlays.frappixPythonOverlay
|
||||||
|
inputs.self.overlays.frappixToolsOverlay
|
||||||
|
];
|
||||||
|
|
||||||
|
clan.core.vars.generators.frappix = {
|
||||||
|
files = {
|
||||||
|
sslCertificate.secret = false;
|
||||||
|
sslCertificateKey = {
|
||||||
|
owner = "nginx";
|
||||||
|
group = "nginx";
|
||||||
|
secret = true;
|
||||||
|
};
|
||||||
|
adminPassword.secret = true;
|
||||||
|
};
|
||||||
|
runtimeInputs = with pkgs; [
|
||||||
|
openssl
|
||||||
|
xkcdpass
|
||||||
|
];
|
||||||
|
script = ''
|
||||||
|
openssl req -x509 -newkey rsa:4096 -keyout $out/sslCertificateKey -out $out/sslCertificate -sha256 -days 3650 -nodes -subj "/C=TH/ST=ChiangMai/L=ChiangMai/O=kurogeek/CN=kurogeek.home"
|
||||||
|
xkcdpass --numwords 4 --delimiter - --count 1 | tr -d "\n" > "$out"/adminPassword
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
|
||||||
|
services.frappe = {
|
||||||
|
enable = true;
|
||||||
|
project = "glomerp";
|
||||||
|
gunicorn_workers = 2;
|
||||||
|
adminPassword = config.clan.core.vars.generators.frappix.files.adminPassword.path;
|
||||||
|
apps = [
|
||||||
|
pkgs.frappix.erpnext
|
||||||
|
pkgs.frappix.hrms
|
||||||
|
];
|
||||||
|
sites = {
|
||||||
|
"${sitename}" = {
|
||||||
|
domains = [ sitename ];
|
||||||
|
apps = [
|
||||||
|
"frappe"
|
||||||
|
"erpnext"
|
||||||
|
"hrms"
|
||||||
|
];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
services.nginx.virtualHosts."${sitename}" = {
|
||||||
|
sslCertificate = config.clan.core.vars.generators.frappix.files.sslCertificate.path;
|
||||||
|
sslCertificateKey = config.clan.core.vars.generators.frappix.files.sslCertificateKey.path;
|
||||||
|
};
|
||||||
|
|
||||||
|
nixpkgs.hostPlatform = {
|
||||||
|
system = "x86_64-linux";
|
||||||
|
};
|
||||||
|
|
||||||
|
clan.core.vars.generators.nginx = {
|
||||||
|
files = {
|
||||||
|
sslCert = {
|
||||||
|
owner = "nginx";
|
||||||
|
group = "nginx";
|
||||||
|
secret = true;
|
||||||
|
};
|
||||||
|
sslKey = {
|
||||||
|
owner = "nginx";
|
||||||
|
group = "nginx";
|
||||||
|
secret = true;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
runtimeInputs = [
|
||||||
|
pkgs.openssl
|
||||||
|
];
|
||||||
|
script = ''
|
||||||
|
openssl req -x509 -nodes -days 3650 -newkey rsa:2048 \
|
||||||
|
-keyout $out/sslKey \
|
||||||
|
-out $out/sslCert \
|
||||||
|
-subj "/CN=localhost"
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
|
||||||
|
networking.firewall.allowedTCPPorts = [
|
||||||
|
80
|
||||||
|
443
|
||||||
|
];
|
||||||
|
|
||||||
|
# services.nginx.virtualHosts."${domain}" = {
|
||||||
|
# forceSSL = true;
|
||||||
|
# sslCertificate = config.clan.core.vars.generators.nginx.files.sslCert.path;
|
||||||
|
# sslCertificateKey = config.clan.core.vars.generators.nginx.files.sslKey.path;
|
||||||
|
# };
|
||||||
|
|
||||||
|
system.stateVersion = "25.11";
|
||||||
|
clan.core.sops.defaultGroups = [ "admins" ];
|
||||||
|
}
|
||||||
@@ -0,0 +1,85 @@
|
|||||||
|
let
|
||||||
|
hashDisk = disk: "os-${builtins.substring 0 5 (builtins.hashString "sha256" disk)}";
|
||||||
|
os = "/dev/disk/by-id/scsi-0QEMU_QEMU_HARDDISK_drive-scsi0";
|
||||||
|
in
|
||||||
|
{
|
||||||
|
|
||||||
|
boot.loader = {
|
||||||
|
systemd-boot = {
|
||||||
|
enable = true;
|
||||||
|
};
|
||||||
|
efi = {
|
||||||
|
canTouchEfiVariables = true;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
boot.zfs.forceImportRoot = true;
|
||||||
|
|
||||||
|
disko.devices = {
|
||||||
|
disk = {
|
||||||
|
"os-${hashDisk os}" = {
|
||||||
|
type = "disk";
|
||||||
|
device = os;
|
||||||
|
content = {
|
||||||
|
type = "gpt";
|
||||||
|
partitions = {
|
||||||
|
ESP = {
|
||||||
|
size = "1G";
|
||||||
|
type = "EF00";
|
||||||
|
content = {
|
||||||
|
type = "filesystem";
|
||||||
|
format = "vfat";
|
||||||
|
mountpoint = "/boot";
|
||||||
|
mountOptions = [ "nofail" ];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
system = {
|
||||||
|
size = "100%";
|
||||||
|
content = {
|
||||||
|
type = "zfs";
|
||||||
|
pool = "zroot";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
zpool = {
|
||||||
|
zroot = {
|
||||||
|
type = "zpool";
|
||||||
|
rootFsOptions = {
|
||||||
|
mountpoint = "none";
|
||||||
|
compression = "lz4";
|
||||||
|
acltype = "posixacl";
|
||||||
|
xattr = "sa";
|
||||||
|
"com.sun:auto-snapshot" = "true";
|
||||||
|
};
|
||||||
|
options.ashift = "12";
|
||||||
|
datasets = {
|
||||||
|
"root" = {
|
||||||
|
type = "zfs_fs";
|
||||||
|
options.mountpoint = "none";
|
||||||
|
};
|
||||||
|
"root/nixos" = {
|
||||||
|
type = "zfs_fs";
|
||||||
|
options.mountpoint = "/";
|
||||||
|
mountpoint = "/";
|
||||||
|
};
|
||||||
|
"root/home" = {
|
||||||
|
type = "zfs_fs";
|
||||||
|
options.mountpoint = "/home";
|
||||||
|
mountpoint = "/home";
|
||||||
|
};
|
||||||
|
"root/tmp" = {
|
||||||
|
type = "zfs_fs";
|
||||||
|
mountpoint = "/tmp";
|
||||||
|
options = {
|
||||||
|
mountpoint = "/tmp";
|
||||||
|
sync = "disabled";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,14 @@
|
|||||||
|
{
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
{
|
||||||
|
clan.core.settings.machine.description =
|
||||||
|
"VM machine for collecting prometheus metrics and fire alerts";
|
||||||
|
|
||||||
|
nixpkgs.hostPlatform = {
|
||||||
|
system = "x86_64-linux";
|
||||||
|
};
|
||||||
|
|
||||||
|
system.stateVersion = "25.11";
|
||||||
|
clan.core.sops.defaultGroups = [ "admins" ];
|
||||||
|
}
|
||||||
@@ -0,0 +1,85 @@
|
|||||||
|
let
|
||||||
|
hashDisk = disk: "os-${builtins.substring 0 5 (builtins.hashString "sha256" disk)}";
|
||||||
|
os = "/dev/disk/by-id/scsi-0QEMU_QEMU_HARDDISK_drive-scsi0";
|
||||||
|
in
|
||||||
|
{
|
||||||
|
|
||||||
|
boot.loader = {
|
||||||
|
systemd-boot = {
|
||||||
|
enable = true;
|
||||||
|
};
|
||||||
|
efi = {
|
||||||
|
canTouchEfiVariables = true;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
boot.zfs.forceImportRoot = true;
|
||||||
|
|
||||||
|
disko.devices = {
|
||||||
|
disk = {
|
||||||
|
"os-${hashDisk os}" = {
|
||||||
|
type = "disk";
|
||||||
|
device = os;
|
||||||
|
content = {
|
||||||
|
type = "gpt";
|
||||||
|
partitions = {
|
||||||
|
ESP = {
|
||||||
|
size = "1G";
|
||||||
|
type = "EF00";
|
||||||
|
content = {
|
||||||
|
type = "filesystem";
|
||||||
|
format = "vfat";
|
||||||
|
mountpoint = "/boot";
|
||||||
|
mountOptions = [ "nofail" ];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
system = {
|
||||||
|
size = "100%";
|
||||||
|
content = {
|
||||||
|
type = "zfs";
|
||||||
|
pool = "zroot";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
zpool = {
|
||||||
|
zroot = {
|
||||||
|
type = "zpool";
|
||||||
|
rootFsOptions = {
|
||||||
|
mountpoint = "none";
|
||||||
|
compression = "lz4";
|
||||||
|
acltype = "posixacl";
|
||||||
|
xattr = "sa";
|
||||||
|
"com.sun:auto-snapshot" = "true";
|
||||||
|
};
|
||||||
|
options.ashift = "12";
|
||||||
|
datasets = {
|
||||||
|
"root" = {
|
||||||
|
type = "zfs_fs";
|
||||||
|
options.mountpoint = "none";
|
||||||
|
};
|
||||||
|
"root/nixos" = {
|
||||||
|
type = "zfs_fs";
|
||||||
|
options.mountpoint = "/";
|
||||||
|
mountpoint = "/";
|
||||||
|
};
|
||||||
|
"root/home" = {
|
||||||
|
type = "zfs_fs";
|
||||||
|
options.mountpoint = "/home";
|
||||||
|
mountpoint = "/home";
|
||||||
|
};
|
||||||
|
"root/tmp" = {
|
||||||
|
type = "zfs_fs";
|
||||||
|
mountpoint = "/tmp";
|
||||||
|
options = {
|
||||||
|
mountpoint = "/tmp";
|
||||||
|
sync = "disabled";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
||||||
File diff suppressed because it is too large
Load Diff
+14
-2
@@ -1,11 +1,23 @@
|
|||||||
{ inputs, self, ... }:
|
{
|
||||||
|
inputs,
|
||||||
|
self,
|
||||||
|
...
|
||||||
|
}:
|
||||||
{
|
{
|
||||||
imports = [
|
imports = [
|
||||||
inputs.clan-core.flakeModules.default
|
inputs.clan-core.flakeModules.default
|
||||||
];
|
];
|
||||||
clan = {
|
clan = {
|
||||||
meta.name = "NewEdgeClan";
|
meta.name = "NewEdgeClan";
|
||||||
machines = { };
|
machines = {
|
||||||
|
cursa = { ... }: { clan.core.state."vars".folders = [ "/var/lib" ]; };
|
||||||
|
hadar = { ... }: { clan.core.state."vars".folders = [ "/var/lib" ]; };
|
||||||
|
procyon = { ... }: { clan.core.state."vars".folders = [ "/var/lib" ]; };
|
||||||
|
bosona = { ... }: { clan.core.state."vars".folders = [ "/var/lib" ]; };
|
||||||
|
canopus = { ... }: { clan.core.state."vars".folders = [ "/var/lib" ]; };
|
||||||
|
deneb = { ... }: { clan.core.state."vars".folders = [ "/var/lib" ]; };
|
||||||
|
alasia = { ... }: { clan.core.state."vars".folders = [ "/var/lib" ]; };
|
||||||
|
};
|
||||||
secrets.age.plugins = [
|
secrets.age.plugins = [
|
||||||
"age-plugin-yubikey"
|
"age-plugin-yubikey"
|
||||||
"age-plugin-fido2-hmac"
|
"age-plugin-fido2-hmac"
|
||||||
|
|||||||
@@ -0,0 +1,126 @@
|
|||||||
|
{
|
||||||
|
inputs,
|
||||||
|
pkgs,
|
||||||
|
config,
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
let
|
||||||
|
sitename = "poyerp.newedge.house";
|
||||||
|
in
|
||||||
|
{
|
||||||
|
clan.core.settings.machine.description = "VM machine that host ERPNext for poysound";
|
||||||
|
imports = [
|
||||||
|
inputs.frappix.nixosModules.x86_64-linux.frappix
|
||||||
|
|
||||||
|
# (import ../../lib/auto-accept-zerotier-members.nix {
|
||||||
|
# memberIds = [
|
||||||
|
# # Alex Caddy gateway
|
||||||
|
# "dbe44c0287"
|
||||||
|
# "e3d6559697"
|
||||||
|
# ];
|
||||||
|
# })
|
||||||
|
];
|
||||||
|
nixpkgs.overlays = [
|
||||||
|
inputs.self.overlays.frappixFrappeOverlay
|
||||||
|
inputs.self.overlays.frappixLibsOverlay
|
||||||
|
inputs.self.overlays.frappixPythonOverlay
|
||||||
|
inputs.self.overlays.frappixToolsOverlay
|
||||||
|
inputs.self.overlays.frappixAppsOverlay
|
||||||
|
];
|
||||||
|
|
||||||
|
fonts.packages = [ pkgs.tlwg ];
|
||||||
|
|
||||||
|
clan.core.vars.generators.frappix = {
|
||||||
|
files = {
|
||||||
|
sslCertificate.secret = false;
|
||||||
|
sslCertificateKey = {
|
||||||
|
owner = "nginx";
|
||||||
|
group = "nginx";
|
||||||
|
secret = true;
|
||||||
|
};
|
||||||
|
adminPassword.secret = true;
|
||||||
|
};
|
||||||
|
runtimeInputs = with pkgs; [
|
||||||
|
openssl
|
||||||
|
xkcdpass
|
||||||
|
];
|
||||||
|
script = ''
|
||||||
|
openssl req -x509 -newkey rsa:4096 -keyout $out/sslCertificateKey -out $out/sslCertificate -sha256 -days 3650 -nodes -subj "/C=TH/ST=ChiangMai/L=ChiangMai/O=kurogeek/CN=kurogeek.home"
|
||||||
|
xkcdpass --numwords 4 --delimiter - --count 1 | tr -d "\n" > "$out"/adminPassword
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
|
||||||
|
services.frappe = {
|
||||||
|
enable = true;
|
||||||
|
project = "poyerp";
|
||||||
|
gunicorn_workers = 2;
|
||||||
|
adminPassword = config.clan.core.vars.generators.frappix.files.adminPassword.path;
|
||||||
|
apps = [
|
||||||
|
pkgs.frappix.erpnext
|
||||||
|
pkgs.frappix.hrms
|
||||||
|
pkgs.frappix.crm
|
||||||
|
pkgs.frappix.posprinter
|
||||||
|
pkgs.frappix.default_thai_company
|
||||||
|
];
|
||||||
|
sites = {
|
||||||
|
"${sitename}" = {
|
||||||
|
domains = [ sitename ];
|
||||||
|
apps = [
|
||||||
|
"frappe"
|
||||||
|
"erpnext"
|
||||||
|
"hrms"
|
||||||
|
"crm"
|
||||||
|
"posprinter"
|
||||||
|
"default_thai_company"
|
||||||
|
];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
services.nginx.virtualHosts."${sitename}" = {
|
||||||
|
sslCertificate = config.clan.core.vars.generators.frappix.files.sslCertificate.path;
|
||||||
|
sslCertificateKey = config.clan.core.vars.generators.frappix.files.sslCertificateKey.path;
|
||||||
|
};
|
||||||
|
|
||||||
|
nixpkgs.hostPlatform = {
|
||||||
|
system = "x86_64-linux";
|
||||||
|
};
|
||||||
|
|
||||||
|
clan.core.vars.generators.nginx = {
|
||||||
|
files = {
|
||||||
|
sslCert = {
|
||||||
|
owner = "nginx";
|
||||||
|
group = "nginx";
|
||||||
|
secret = true;
|
||||||
|
};
|
||||||
|
sslKey = {
|
||||||
|
owner = "nginx";
|
||||||
|
group = "nginx";
|
||||||
|
secret = true;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
runtimeInputs = [
|
||||||
|
pkgs.openssl
|
||||||
|
];
|
||||||
|
script = ''
|
||||||
|
openssl req -x509 -nodes -days 3650 -newkey rsa:2048 \
|
||||||
|
-keyout $out/sslKey \
|
||||||
|
-out $out/sslCert \
|
||||||
|
-subj "/CN=localhost"
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
|
||||||
|
networking.firewall.allowedTCPPorts = [
|
||||||
|
80
|
||||||
|
443
|
||||||
|
];
|
||||||
|
|
||||||
|
# services.nginx.virtualHosts."${domain}" = {
|
||||||
|
# forceSSL = true;
|
||||||
|
# sslCertificate = config.clan.core.vars.generators.nginx.files.sslCert.path;
|
||||||
|
# sslCertificateKey = config.clan.core.vars.generators.nginx.files.sslKey.path;
|
||||||
|
# };
|
||||||
|
|
||||||
|
system.stateVersion = "25.11";
|
||||||
|
clan.core.sops.defaultGroups = [ "admins" ];
|
||||||
|
}
|
||||||
@@ -0,0 +1,85 @@
|
|||||||
|
let
|
||||||
|
hashDisk = disk: "os-${builtins.substring 0 5 (builtins.hashString "sha256" disk)}";
|
||||||
|
os = "/dev/disk/by-id/scsi-0QEMU_QEMU_HARDDISK_drive-scsi0";
|
||||||
|
in
|
||||||
|
{
|
||||||
|
|
||||||
|
boot.loader = {
|
||||||
|
systemd-boot = {
|
||||||
|
enable = true;
|
||||||
|
};
|
||||||
|
efi = {
|
||||||
|
canTouchEfiVariables = true;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
boot.zfs.forceImportRoot = true;
|
||||||
|
|
||||||
|
disko.devices = {
|
||||||
|
disk = {
|
||||||
|
"os-${hashDisk os}" = {
|
||||||
|
type = "disk";
|
||||||
|
device = os;
|
||||||
|
content = {
|
||||||
|
type = "gpt";
|
||||||
|
partitions = {
|
||||||
|
ESP = {
|
||||||
|
size = "1G";
|
||||||
|
type = "EF00";
|
||||||
|
content = {
|
||||||
|
type = "filesystem";
|
||||||
|
format = "vfat";
|
||||||
|
mountpoint = "/boot";
|
||||||
|
mountOptions = [ "nofail" ];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
system = {
|
||||||
|
size = "100%";
|
||||||
|
content = {
|
||||||
|
type = "zfs";
|
||||||
|
pool = "zroot";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
zpool = {
|
||||||
|
zroot = {
|
||||||
|
type = "zpool";
|
||||||
|
rootFsOptions = {
|
||||||
|
mountpoint = "none";
|
||||||
|
compression = "lz4";
|
||||||
|
acltype = "posixacl";
|
||||||
|
xattr = "sa";
|
||||||
|
"com.sun:auto-snapshot" = "true";
|
||||||
|
};
|
||||||
|
options.ashift = "12";
|
||||||
|
datasets = {
|
||||||
|
"root" = {
|
||||||
|
type = "zfs_fs";
|
||||||
|
options.mountpoint = "none";
|
||||||
|
};
|
||||||
|
"root/nixos" = {
|
||||||
|
type = "zfs_fs";
|
||||||
|
options.mountpoint = "/";
|
||||||
|
mountpoint = "/";
|
||||||
|
};
|
||||||
|
"root/home" = {
|
||||||
|
type = "zfs_fs";
|
||||||
|
options.mountpoint = "/home";
|
||||||
|
mountpoint = "/home";
|
||||||
|
};
|
||||||
|
"root/tmp" = {
|
||||||
|
type = "zfs_fs";
|
||||||
|
mountpoint = "/tmp";
|
||||||
|
options = {
|
||||||
|
mountpoint = "/tmp";
|
||||||
|
sync = "disabled";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,86 @@
|
|||||||
|
{
|
||||||
|
inputs,
|
||||||
|
config,
|
||||||
|
pkgs,
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
let
|
||||||
|
domain = "poy-inventory.newedge.house";
|
||||||
|
in
|
||||||
|
{
|
||||||
|
clan.core.settings.machine.description = "VM machine that host Inventree system for Poy";
|
||||||
|
|
||||||
|
nixpkgs.hostPlatform = {
|
||||||
|
system = "x86_64-linux";
|
||||||
|
};
|
||||||
|
|
||||||
|
clan.core.vars.generators.inventree = {
|
||||||
|
files = {
|
||||||
|
secret-key = {
|
||||||
|
owner = "inventree";
|
||||||
|
group = "inventree";
|
||||||
|
secret = true;
|
||||||
|
};
|
||||||
|
oidc-key = {
|
||||||
|
owner = "inventree";
|
||||||
|
group = "inventree";
|
||||||
|
secret = true;
|
||||||
|
};
|
||||||
|
admin-password = {
|
||||||
|
owner = "inventree";
|
||||||
|
group = "inventree";
|
||||||
|
secret = true;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
runtimeInputs = [
|
||||||
|
pkgs.pwgen
|
||||||
|
pkgs.xkcdpass
|
||||||
|
];
|
||||||
|
script = ''
|
||||||
|
pwgen -s 32 1 > $out/secret-key
|
||||||
|
pwgen -s 32 1 > $out/oidc-key
|
||||||
|
xkcdpass --numwords 4 --delimiter - --count 1 | tr -d "\n" > "$out"/admin-password
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
|
||||||
|
clan.core.vars.generators.nginx = {
|
||||||
|
files = {
|
||||||
|
sslCert = {
|
||||||
|
owner = "nginx";
|
||||||
|
group = "nginx";
|
||||||
|
secret = true;
|
||||||
|
};
|
||||||
|
sslKey = {
|
||||||
|
owner = "nginx";
|
||||||
|
group = "nginx";
|
||||||
|
secret = true;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
runtimeInputs = [
|
||||||
|
pkgs.openssl
|
||||||
|
];
|
||||||
|
script = ''
|
||||||
|
openssl req -x509 -nodes -days 3650 -newkey rsa:2048 \
|
||||||
|
-keyout $out/sslKey \
|
||||||
|
-out $out/sslCert \
|
||||||
|
-subj "/CN=localhost"
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
|
||||||
|
networking.firewall.allowedTCPPorts = [
|
||||||
|
80
|
||||||
|
443
|
||||||
|
];
|
||||||
|
|
||||||
|
services.inventree = {
|
||||||
|
enable = true;
|
||||||
|
inherit domain;
|
||||||
|
secretKeyFile = config.clan.core.vars.generators.inventree.files.secret-key.path;
|
||||||
|
adminPasswordFile = config.clan.core.vars.generators.inventree.files.admin-password.path;
|
||||||
|
settings.INVENTREE_SITE_URL = "https://${domain}";
|
||||||
|
};
|
||||||
|
|
||||||
|
system.stateVersion = "25.11";
|
||||||
|
clan.core.sops.defaultGroups = [ "admins" ];
|
||||||
|
}
|
||||||
@@ -0,0 +1,85 @@
|
|||||||
|
let
|
||||||
|
hashDisk = disk: "os-${builtins.substring 0 5 (builtins.hashString "sha256" disk)}";
|
||||||
|
os = "/dev/disk/by-id/scsi-0QEMU_QEMU_HARDDISK_drive-scsi0";
|
||||||
|
in
|
||||||
|
{
|
||||||
|
|
||||||
|
boot.loader = {
|
||||||
|
systemd-boot = {
|
||||||
|
enable = true;
|
||||||
|
};
|
||||||
|
efi = {
|
||||||
|
canTouchEfiVariables = true;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
boot.zfs.forceImportRoot = true;
|
||||||
|
|
||||||
|
disko.devices = {
|
||||||
|
disk = {
|
||||||
|
"os-${hashDisk os}" = {
|
||||||
|
type = "disk";
|
||||||
|
device = os;
|
||||||
|
content = {
|
||||||
|
type = "gpt";
|
||||||
|
partitions = {
|
||||||
|
ESP = {
|
||||||
|
size = "1G";
|
||||||
|
type = "EF00";
|
||||||
|
content = {
|
||||||
|
type = "filesystem";
|
||||||
|
format = "vfat";
|
||||||
|
mountpoint = "/boot";
|
||||||
|
mountOptions = [ "nofail" ];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
system = {
|
||||||
|
size = "100%";
|
||||||
|
content = {
|
||||||
|
type = "zfs";
|
||||||
|
pool = "zroot";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
zpool = {
|
||||||
|
zroot = {
|
||||||
|
type = "zpool";
|
||||||
|
rootFsOptions = {
|
||||||
|
mountpoint = "none";
|
||||||
|
compression = "lz4";
|
||||||
|
acltype = "posixacl";
|
||||||
|
xattr = "sa";
|
||||||
|
"com.sun:auto-snapshot" = "true";
|
||||||
|
};
|
||||||
|
options.ashift = "12";
|
||||||
|
datasets = {
|
||||||
|
"root" = {
|
||||||
|
type = "zfs_fs";
|
||||||
|
options.mountpoint = "none";
|
||||||
|
};
|
||||||
|
"root/nixos" = {
|
||||||
|
type = "zfs_fs";
|
||||||
|
options.mountpoint = "/";
|
||||||
|
mountpoint = "/";
|
||||||
|
};
|
||||||
|
"root/home" = {
|
||||||
|
type = "zfs_fs";
|
||||||
|
options.mountpoint = "/home";
|
||||||
|
mountpoint = "/home";
|
||||||
|
};
|
||||||
|
"root/tmp" = {
|
||||||
|
type = "zfs_fs";
|
||||||
|
mountpoint = "/tmp";
|
||||||
|
options = {
|
||||||
|
mountpoint = "/tmp";
|
||||||
|
sync = "disabled";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -8,6 +8,6 @@
|
|||||||
# clan.core.networking.targetHost = "root@";
|
# clan.core.networking.targetHost = "root@";
|
||||||
|
|
||||||
clan.core.settings.name = "mirach";
|
clan.core.settings.name = "mirach";
|
||||||
# clan.meta.description = "Radxa X4 SBC board for one of w phone network.";
|
clan.core.settings.machine.description = "Radxa X4 SBC board for one of w phone network.";
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -14,6 +14,8 @@ in
|
|||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
boot.zfs.forceImportRoot = true;
|
||||||
|
|
||||||
disko.devices = {
|
disko.devices = {
|
||||||
disk = {
|
disk = {
|
||||||
"os-${hashDisk os}" = {
|
"os-${hashDisk os}" = {
|
||||||
|
|||||||
@@ -10,7 +10,6 @@
|
|||||||
};
|
};
|
||||||
system.stateVersion = "25.11";
|
system.stateVersion = "25.11";
|
||||||
clan.core.sops.defaultGroups = [ "admins" ];
|
clan.core.sops.defaultGroups = [ "admins" ];
|
||||||
clan.core.networking.targetHost = "root@[${config.clan.core.vars.generators.zerotier.files.zerotier-ip.value}]";
|
|
||||||
|
|
||||||
networking.interfaces.enx00e04c106368.useDHCP = true; # recovery
|
networking.interfaces.enx00e04c106368.useDHCP = true; # recovery
|
||||||
|
|
||||||
@@ -57,6 +56,6 @@
|
|||||||
];
|
];
|
||||||
|
|
||||||
clan.core.settings.name = "neptune";
|
clan.core.settings.name = "neptune";
|
||||||
# clan.meta.description = "Radxa SBC board for testing. (With vi)";
|
clan.core.settings.machine.description = "Radxa SBC board for testing. (With vi)";
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -14,6 +14,8 @@ in
|
|||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
boot.zfs.forceImportRoot = true;
|
||||||
|
|
||||||
disko.devices = {
|
disko.devices = {
|
||||||
disk = {
|
disk = {
|
||||||
"os-${hashDisk os}" = {
|
"os-${hashDisk os}" = {
|
||||||
|
|||||||
@@ -9,4 +9,5 @@
|
|||||||
};
|
};
|
||||||
system.stateVersion = "25.11";
|
system.stateVersion = "25.11";
|
||||||
clan.core.sops.defaultGroups = [ "admins" ];
|
clan.core.sops.defaultGroups = [ "admins" ];
|
||||||
|
clan.core.settings.machine.description = "A personal computer for Chocolate Shop";
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -14,6 +14,8 @@ in
|
|||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
boot.zfs.forceImportRoot = true;
|
||||||
|
|
||||||
disko.devices = {
|
disko.devices = {
|
||||||
disk = {
|
disk = {
|
||||||
"os-${hashDisk os}" = {
|
"os-${hashDisk os}" = {
|
||||||
|
|||||||
@@ -0,0 +1,86 @@
|
|||||||
|
{
|
||||||
|
inputs,
|
||||||
|
config,
|
||||||
|
pkgs,
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
let
|
||||||
|
domain = "glom-inventory.newedge.house";
|
||||||
|
in
|
||||||
|
{
|
||||||
|
clan.core.settings.machine.description = "VM machine that host Inventree system for Glom";
|
||||||
|
|
||||||
|
nixpkgs.hostPlatform = {
|
||||||
|
system = "x86_64-linux";
|
||||||
|
};
|
||||||
|
|
||||||
|
clan.core.vars.generators.inventree = {
|
||||||
|
files = {
|
||||||
|
secret-key = {
|
||||||
|
owner = "inventree";
|
||||||
|
group = "inventree";
|
||||||
|
secret = true;
|
||||||
|
};
|
||||||
|
oidc-key = {
|
||||||
|
owner = "inventree";
|
||||||
|
group = "inventree";
|
||||||
|
secret = true;
|
||||||
|
};
|
||||||
|
admin-password = {
|
||||||
|
owner = "inventree";
|
||||||
|
group = "inventree";
|
||||||
|
secret = true;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
runtimeInputs = [
|
||||||
|
pkgs.pwgen
|
||||||
|
pkgs.xkcdpass
|
||||||
|
];
|
||||||
|
script = ''
|
||||||
|
pwgen -s 32 1 > $out/secret-key
|
||||||
|
pwgen -s 32 1 > $out/oidc-key
|
||||||
|
xkcdpass --numwords 4 --delimiter - --count 1 | tr -d "\n" > "$out"/admin-password
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
|
||||||
|
clan.core.vars.generators.nginx = {
|
||||||
|
files = {
|
||||||
|
sslCert = {
|
||||||
|
owner = "nginx";
|
||||||
|
group = "nginx";
|
||||||
|
secret = true;
|
||||||
|
};
|
||||||
|
sslKey = {
|
||||||
|
owner = "nginx";
|
||||||
|
group = "nginx";
|
||||||
|
secret = true;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
runtimeInputs = [
|
||||||
|
pkgs.openssl
|
||||||
|
];
|
||||||
|
script = ''
|
||||||
|
openssl req -x509 -nodes -days 3650 -newkey rsa:2048 \
|
||||||
|
-keyout $out/sslKey \
|
||||||
|
-out $out/sslCert \
|
||||||
|
-subj "/CN=localhost"
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
|
||||||
|
networking.firewall.allowedTCPPorts = [
|
||||||
|
80
|
||||||
|
443
|
||||||
|
];
|
||||||
|
|
||||||
|
services.inventree = {
|
||||||
|
enable = true;
|
||||||
|
inherit domain;
|
||||||
|
secretKeyFile = config.clan.core.vars.generators.inventree.files.secret-key.path;
|
||||||
|
adminPasswordFile = config.clan.core.vars.generators.inventree.files.admin-password.path;
|
||||||
|
settings.INVENTREE_SITE_URL = "https://${domain}";
|
||||||
|
};
|
||||||
|
|
||||||
|
system.stateVersion = "25.11";
|
||||||
|
clan.core.sops.defaultGroups = [ "admins" ];
|
||||||
|
}
|
||||||
@@ -0,0 +1,85 @@
|
|||||||
|
let
|
||||||
|
hashDisk = disk: "os-${builtins.substring 0 5 (builtins.hashString "sha256" disk)}";
|
||||||
|
os = "/dev/disk/by-id/scsi-0QEMU_QEMU_HARDDISK_drive-scsi0";
|
||||||
|
in
|
||||||
|
{
|
||||||
|
|
||||||
|
boot.loader = {
|
||||||
|
systemd-boot = {
|
||||||
|
enable = true;
|
||||||
|
};
|
||||||
|
efi = {
|
||||||
|
canTouchEfiVariables = true;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
boot.zfs.forceImportRoot = true;
|
||||||
|
|
||||||
|
disko.devices = {
|
||||||
|
disk = {
|
||||||
|
"os-${hashDisk os}" = {
|
||||||
|
type = "disk";
|
||||||
|
device = os;
|
||||||
|
content = {
|
||||||
|
type = "gpt";
|
||||||
|
partitions = {
|
||||||
|
ESP = {
|
||||||
|
size = "1G";
|
||||||
|
type = "EF00";
|
||||||
|
content = {
|
||||||
|
type = "filesystem";
|
||||||
|
format = "vfat";
|
||||||
|
mountpoint = "/boot";
|
||||||
|
mountOptions = [ "nofail" ];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
system = {
|
||||||
|
size = "100%";
|
||||||
|
content = {
|
||||||
|
type = "zfs";
|
||||||
|
pool = "zroot";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
zpool = {
|
||||||
|
zroot = {
|
||||||
|
type = "zpool";
|
||||||
|
rootFsOptions = {
|
||||||
|
mountpoint = "none";
|
||||||
|
compression = "lz4";
|
||||||
|
acltype = "posixacl";
|
||||||
|
xattr = "sa";
|
||||||
|
"com.sun:auto-snapshot" = "true";
|
||||||
|
};
|
||||||
|
options.ashift = "12";
|
||||||
|
datasets = {
|
||||||
|
"root" = {
|
||||||
|
type = "zfs_fs";
|
||||||
|
options.mountpoint = "none";
|
||||||
|
};
|
||||||
|
"root/nixos" = {
|
||||||
|
type = "zfs_fs";
|
||||||
|
options.mountpoint = "/";
|
||||||
|
mountpoint = "/";
|
||||||
|
};
|
||||||
|
"root/home" = {
|
||||||
|
type = "zfs_fs";
|
||||||
|
options.mountpoint = "/home";
|
||||||
|
mountpoint = "/home";
|
||||||
|
};
|
||||||
|
"root/tmp" = {
|
||||||
|
type = "zfs_fs";
|
||||||
|
mountpoint = "/tmp";
|
||||||
|
options = {
|
||||||
|
mountpoint = "/tmp";
|
||||||
|
sync = "disabled";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -6,12 +6,9 @@
|
|||||||
};
|
};
|
||||||
|
|
||||||
clan.core.settings.name = "ramus";
|
clan.core.settings.name = "ramus";
|
||||||
# clan.meta.description = ''
|
clan.core.settings.machine.description = "A Hetzner VPS machine own by Alex.";
|
||||||
# A Hetzner VPS machine own by Alex.
|
|
||||||
# '';
|
|
||||||
|
|
||||||
clan.core.sops.defaultGroups = [ "admins" ];
|
clan.core.sops.defaultGroups = [ "admins" ];
|
||||||
clan.core.networking.targetHost = "root@[${config.clan.core.vars.generators.zerotier.files.zerotier-ip.value}]";
|
|
||||||
|
|
||||||
clan.core.vars.generators.acme = {
|
clan.core.vars.generators.acme = {
|
||||||
share = true;
|
share = true;
|
||||||
|
|||||||
@@ -14,6 +14,8 @@ in
|
|||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
boot.zfs.forceImportRoot = true;
|
||||||
|
|
||||||
disko.devices = {
|
disko.devices = {
|
||||||
disk = {
|
disk = {
|
||||||
"os-${hashDisk os}" = {
|
"os-${hashDisk os}" = {
|
||||||
|
|||||||
@@ -1,5 +1,7 @@
|
|||||||
{ self, ... }:
|
{ self, pkgs, ... }:
|
||||||
{
|
{
|
||||||
|
clan.core.settings.machine.description = "Emmie personal computer";
|
||||||
|
|
||||||
imports = [
|
imports = [
|
||||||
self.nixosModules.common
|
self.nixosModules.common
|
||||||
];
|
];
|
||||||
@@ -9,4 +11,12 @@
|
|||||||
};
|
};
|
||||||
system.stateVersion = "25.11";
|
system.stateVersion = "25.11";
|
||||||
clan.core.sops.defaultGroups = [ "admins" ];
|
clan.core.sops.defaultGroups = [ "admins" ];
|
||||||
|
|
||||||
|
boot.kernelParams = [
|
||||||
|
"amdgpu.dcdebugmask=0x10"
|
||||||
|
"amdgpu.cwsr_enable=0"
|
||||||
|
"amdgpu.gpu_recovery=1"
|
||||||
|
];
|
||||||
|
|
||||||
|
boot.kernelPackages = pkgs.linuxKernel.packages.linux_6_12;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -14,6 +14,8 @@ in
|
|||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
boot.zfs.forceImportRoot = true;
|
||||||
|
|
||||||
disko.devices = {
|
disko.devices = {
|
||||||
disk = {
|
disk = {
|
||||||
"os-${hashDisk os}" = {
|
"os-${hashDisk os}" = {
|
||||||
@@ -53,6 +55,9 @@ in
|
|||||||
zroot = {
|
zroot = {
|
||||||
type = "zpool";
|
type = "zpool";
|
||||||
rootFsOptions = {
|
rootFsOptions = {
|
||||||
|
encryption = "aes-256-gcm";
|
||||||
|
keyformat = "passphrase";
|
||||||
|
keylocation = "file:///tmp/secret.key";
|
||||||
mountpoint = "none";
|
mountpoint = "none";
|
||||||
compression = "lz4";
|
compression = "lz4";
|
||||||
acltype = "posixacl";
|
acltype = "posixacl";
|
||||||
|
|||||||
+779
-681
File diff suppressed because it is too large
Load Diff
@@ -1,16 +1,7 @@
|
|||||||
{ config, ... }:
|
{ config, ... }:
|
||||||
{
|
{
|
||||||
imports = [
|
|
||||||
(import ../../lib/auto-accept-zerotier-members.nix {
|
|
||||||
memberIds = [
|
|
||||||
"dbe44c0287" # Alex-gateway
|
|
||||||
"b0e0b84fd3" # Alex
|
|
||||||
"2bd36db8cc" # kurogeek-thinkpad
|
|
||||||
];
|
|
||||||
})
|
|
||||||
];
|
|
||||||
|
|
||||||
system.stateVersion = "25.11";
|
system.stateVersion = "25.11";
|
||||||
clan.core.sops.defaultGroups = [ "admins" ];
|
clan.core.sops.defaultGroups = [ "admins" ];
|
||||||
clan.core.networking.targetHost = "root@[${config.clan.core.vars.generators.zerotier.files.zerotier-ip.value}]";
|
|
||||||
|
clan.core.settings.machine.description = "Zima board computer for testing in B4L";
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,21 @@
|
|||||||
|
## How to setup this machine.
|
||||||
|
|
||||||
|
This machine cannot be setup the same way as other machines are setup. Meaning that `clan machine install` won't work. Because of `disko` issue. So, below is how the machine is setup.
|
||||||
|
|
||||||
|
1. Build an image to flash to an sd-card using
|
||||||
|
|
||||||
|
```
|
||||||
|
nix build -L --show-trace .\#nixosConfigurations.sirius.config.system.build.images.sd-card
|
||||||
|
```
|
||||||
|
|
||||||
|
2. Import the `zdata`
|
||||||
|
|
||||||
|
```
|
||||||
|
zpool import zdata
|
||||||
|
```
|
||||||
|
|
||||||
|
3. Update configuration
|
||||||
|
|
||||||
|
```
|
||||||
|
clan machine update sirius
|
||||||
|
```
|
||||||
@@ -1,27 +1,32 @@
|
|||||||
{
|
{
|
||||||
config,
|
|
||||||
self,
|
self,
|
||||||
|
pkgs,
|
||||||
...
|
...
|
||||||
}:
|
}:
|
||||||
{
|
{
|
||||||
imports = [
|
imports = [
|
||||||
self.nixosModules.common
|
./hardware-configuration.nix
|
||||||
];
|
];
|
||||||
|
|
||||||
|
image.modules.sd-card = {
|
||||||
|
disabledModules = [
|
||||||
|
./hardware-configuration.nix
|
||||||
|
];
|
||||||
|
};
|
||||||
|
|
||||||
|
clan.core.settings.machine.description = "w NAS";
|
||||||
|
|
||||||
clan.core.sops.defaultGroups = [ "admins" ];
|
clan.core.sops.defaultGroups = [ "admins" ];
|
||||||
|
|
||||||
nixpkgs.hostPlatform = {
|
nixpkgs.hostPlatform = {
|
||||||
system = "aarch64-linux";
|
system = "aarch64-linux";
|
||||||
};
|
};
|
||||||
|
nixpkgs.buildPlatform = {
|
||||||
|
system = "x86_64-linux";
|
||||||
|
};
|
||||||
|
|
||||||
system.stateVersion = "25.11";
|
system.stateVersion = "25.11";
|
||||||
|
|
||||||
services.journald.extraConfig = ''
|
|
||||||
Storage=volatile
|
|
||||||
RuntimeMaxUse=30M
|
|
||||||
RuntimeMaxFileSize=10M
|
|
||||||
'';
|
|
||||||
|
|
||||||
services.udisks2.enable = false;
|
services.udisks2.enable = false;
|
||||||
|
|
||||||
nix.settings.log-lines = 25;
|
nix.settings.log-lines = 25;
|
||||||
@@ -32,4 +37,72 @@
|
|||||||
options = "--delete-older-than 15d";
|
options = "--delete-older-than 15d";
|
||||||
};
|
};
|
||||||
|
|
||||||
|
boot.loader.grub.enable = false;
|
||||||
|
boot.loader.generic-extlinux-compatible.enable = true;
|
||||||
|
|
||||||
|
boot.zfs.forceImportRoot = false;
|
||||||
|
|
||||||
|
boot.zfs.extraPools = [ "zdata" ];
|
||||||
|
boot.supportedFilesystems = [ "zfs" ];
|
||||||
|
boot.initrd.availableKernelModules = [
|
||||||
|
"usb_storage"
|
||||||
|
"sd_mod"
|
||||||
|
];
|
||||||
|
|
||||||
|
boot = {
|
||||||
|
consoleLogLevel = 0;
|
||||||
|
kernel.sysctl = {
|
||||||
|
"fs.suid_dumpable" = 0;
|
||||||
|
"kernel.core_pattern" = "/dev/null";
|
||||||
|
};
|
||||||
|
tmp = {
|
||||||
|
useTmpfs = true;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
services.journald.settings.Journal.Storage = "none";
|
||||||
|
|
||||||
|
systemd = {
|
||||||
|
coredump.enable = false;
|
||||||
|
};
|
||||||
|
|
||||||
|
fileSystems."/mnt/hdd" = {
|
||||||
|
device = "zdata/nas";
|
||||||
|
fsType = "zfs";
|
||||||
|
mountPoint = "/mnt/hdd";
|
||||||
|
options = [
|
||||||
|
"nofail"
|
||||||
|
"zfsutil"
|
||||||
|
];
|
||||||
|
};
|
||||||
|
|
||||||
|
fileSystems."/var/lib" = {
|
||||||
|
device = "zdata/service-data";
|
||||||
|
fsType = "zfs";
|
||||||
|
mountPoint = "/var/lib";
|
||||||
|
options = [
|
||||||
|
"x-initrd.mount"
|
||||||
|
"nofail"
|
||||||
|
"zfsutil"
|
||||||
|
];
|
||||||
|
};
|
||||||
|
|
||||||
|
systemd.services.heartbeat-push = {
|
||||||
|
description = "Heartbeat push to uptime monitor";
|
||||||
|
serviceConfig = {
|
||||||
|
Type = "oneshot";
|
||||||
|
ExecStart = "${pkgs.curl}/bin/curl -s -o /dev/null https://uptime.b4l.co.th/api/push/X0WCHAcY5gPf1U8If7BT1FLjpacZqGZu?status=up&msg=OK&ping=";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
systemd.timers.heartbeat-push = {
|
||||||
|
description = "Heartbeat push timer";
|
||||||
|
wantedBy = [ "timers.target" ];
|
||||||
|
timerConfig = {
|
||||||
|
OnBootSec = "60s";
|
||||||
|
OnUnitActiveSec = "60s";
|
||||||
|
Unit = "heartbeat-push.service";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,150 @@
|
|||||||
|
{ lib, pkgs, ... }:
|
||||||
|
let
|
||||||
|
hashDisk = disk: "os-${builtins.substring 0 5 (builtins.hashString "sha256" disk)}";
|
||||||
|
# os = "/dev/disk/by-id/mmc-SD64G_0x8336354b";
|
||||||
|
vdev = [
|
||||||
|
"/dev/disk/by-id/ata-ST20000NM002H-3KV133_ZYDBVV7Z"
|
||||||
|
"/dev/disk/by-id/ata-ST20000NM002H-3KV133_ZYDBSJRE"
|
||||||
|
];
|
||||||
|
configTxt = pkgs.writeText "config.txt" ''
|
||||||
|
[pi4]
|
||||||
|
kernel=u-boot-rpi4.bin
|
||||||
|
enable_gic=1
|
||||||
|
|
||||||
|
# Otherwise the resolution will be weird in most cases, compared to
|
||||||
|
# what the pi3 firmware does by default.
|
||||||
|
disable_overscan=1
|
||||||
|
|
||||||
|
# Supported in newer board revisions
|
||||||
|
arm_boost=1
|
||||||
|
|
||||||
|
[all]
|
||||||
|
# Boot in 64-bit mode.
|
||||||
|
arm_64bit=1
|
||||||
|
|
||||||
|
# U-Boot needs this to work, regardless of whether UART is actually used or not.
|
||||||
|
# Look in arch/arm/mach-bcm283x/Kconfig in the U-Boot tree to see if this is still
|
||||||
|
# a requirement in the future.
|
||||||
|
enable_uart=1
|
||||||
|
|
||||||
|
# Prevent the firmware from smashing the framebuffer setup done by the mainline kernel
|
||||||
|
# when attempting to show low-voltage or overtemperature warnings.
|
||||||
|
avoid_warnings=1
|
||||||
|
'';
|
||||||
|
in
|
||||||
|
{
|
||||||
|
|
||||||
|
boot.loader = {
|
||||||
|
systemd-boot = {
|
||||||
|
enable = true;
|
||||||
|
};
|
||||||
|
efi = {
|
||||||
|
canTouchEfiVariables = true;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
# boot.tmp.useTmpfs = true;
|
||||||
|
|
||||||
|
disko.devices = {
|
||||||
|
disk = {
|
||||||
|
# "os-${hashDisk os}" = {
|
||||||
|
# type = "disk";
|
||||||
|
# device = os;
|
||||||
|
# content = {
|
||||||
|
# type = "gpt";
|
||||||
|
# partitions = {
|
||||||
|
# firmware = {
|
||||||
|
# size = "60M";
|
||||||
|
# priority = 1;
|
||||||
|
# type = "0700";
|
||||||
|
# content = {
|
||||||
|
# type = "filesystem";
|
||||||
|
# format = "vfat";
|
||||||
|
# mountpoint = "/firmware";
|
||||||
|
# postMountHook = toString (
|
||||||
|
# pkgs.writeScript "postMountHook.sh" ''
|
||||||
|
# (cd ${pkgs.raspberrypifw}/share/raspberrypi/boot && cp bootcode.bin fixup*.dat start*.elf *.dtb /mnt/firmware/)
|
||||||
|
# cp ${pkgs.ubootRaspberryPi4_64bit}/u-boot.bin /mnt/firmware/u-boot-rpi4.bin
|
||||||
|
# cp ${configTxt} /mnt/firmware/config.txt
|
||||||
|
# ''
|
||||||
|
# );
|
||||||
|
# };
|
||||||
|
# };
|
||||||
|
# ESP = {
|
||||||
|
# size = "2G";
|
||||||
|
# type = "EF00";
|
||||||
|
# content = {
|
||||||
|
# type = "filesystem";
|
||||||
|
# format = "vfat";
|
||||||
|
# mountpoint = "/boot";
|
||||||
|
# mountOptions = [ "umask=0077" ];
|
||||||
|
# };
|
||||||
|
# };
|
||||||
|
# root = {
|
||||||
|
# name = "root";
|
||||||
|
# end = "-0";
|
||||||
|
# content = {
|
||||||
|
# type = "filesystem";
|
||||||
|
# format = "f2fs";
|
||||||
|
# mountpoint = "/";
|
||||||
|
# extraArgs = [
|
||||||
|
# "-O"
|
||||||
|
# "extra_attr,inode_checksum,sb_checksum,compression"
|
||||||
|
# ];
|
||||||
|
# mountOptions = [ "compress_algorithm=zstd:6,compress_chksum,atgc,gc_merge,lazytime,nodiscard" ];
|
||||||
|
# };
|
||||||
|
# };
|
||||||
|
# };
|
||||||
|
# };
|
||||||
|
# };
|
||||||
|
}
|
||||||
|
// (lib.listToAttrs (
|
||||||
|
map (disk: {
|
||||||
|
name = "data-${hashDisk disk}";
|
||||||
|
value = {
|
||||||
|
type = "disk";
|
||||||
|
device = disk;
|
||||||
|
content = {
|
||||||
|
type = "zfs";
|
||||||
|
pool = "zdata";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}) vdev
|
||||||
|
));
|
||||||
|
zpool = {
|
||||||
|
zdata = {
|
||||||
|
type = "zpool";
|
||||||
|
options.ashift = "12";
|
||||||
|
rootFsOptions = {
|
||||||
|
mountpoint = "none";
|
||||||
|
compression = "lz4";
|
||||||
|
acltype = "posixacl";
|
||||||
|
xattr = "sa";
|
||||||
|
"com.sun:auto-snapshot" = "true";
|
||||||
|
};
|
||||||
|
mode = {
|
||||||
|
topology = {
|
||||||
|
type = "topology";
|
||||||
|
vdev = [
|
||||||
|
{
|
||||||
|
mode = "mirror";
|
||||||
|
members = vdev;
|
||||||
|
}
|
||||||
|
];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
datasets = {
|
||||||
|
"nas" = {
|
||||||
|
type = "zfs_fs";
|
||||||
|
mountpoint = "/mnt/hdd";
|
||||||
|
mountOptions = [ "nofail" ];
|
||||||
|
};
|
||||||
|
"service-data" = {
|
||||||
|
type = "zfs_fs";
|
||||||
|
mountpoint = "/var/lib";
|
||||||
|
mountOptions = [ "nofail" ];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
||||||
@@ -1,108 +0,0 @@
|
|||||||
{ lib, ... }:
|
|
||||||
let
|
|
||||||
hashDisk = disk: "os-${builtins.substring 0 5 (builtins.hashString "sha256" disk)}";
|
|
||||||
os = "/dev/disk/by-id/mmc-SD64G_0x8336354b";
|
|
||||||
vdev = [
|
|
||||||
"/dev/disk/by-id/ata-ST20000NM002H-3KV133_ZYDBVV7Z"
|
|
||||||
"/dev/disk/by-id/ata-ST20000NM002H-3KV133_ZYDBSJRE"
|
|
||||||
];
|
|
||||||
in
|
|
||||||
{
|
|
||||||
|
|
||||||
boot.loader = {
|
|
||||||
systemd-boot = {
|
|
||||||
enable = true;
|
|
||||||
};
|
|
||||||
efi = {
|
|
||||||
canTouchEfiVariables = true;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
boot.tmp.useTmpfs = true;
|
|
||||||
|
|
||||||
disko.devices = {
|
|
||||||
disk = {
|
|
||||||
"os-${hashDisk os}" = {
|
|
||||||
type = "disk";
|
|
||||||
device = os;
|
|
||||||
content = {
|
|
||||||
type = "gpt";
|
|
||||||
partitions = {
|
|
||||||
ESP = {
|
|
||||||
end = "500M";
|
|
||||||
type = "EF00";
|
|
||||||
content = {
|
|
||||||
type = "filesystem";
|
|
||||||
format = "vfat";
|
|
||||||
mountpoint = "/boot";
|
|
||||||
mountOptions = [ "umask=0077" ];
|
|
||||||
};
|
|
||||||
};
|
|
||||||
root = {
|
|
||||||
name = "root";
|
|
||||||
end = "-0";
|
|
||||||
content = {
|
|
||||||
type = "filesystem";
|
|
||||||
format = "f2fs";
|
|
||||||
mountpoint = "/";
|
|
||||||
extraArgs = [
|
|
||||||
"-O"
|
|
||||||
"extra_attr,inode_checksum,sb_checksum,compression"
|
|
||||||
];
|
|
||||||
mountOptions = [ "compress_algorithm=zstd:6,compress_chksum,atgc,gc_merge,lazytime,nodiscard" ];
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
}
|
|
||||||
// (lib.listToAttrs (
|
|
||||||
map (disk: {
|
|
||||||
name = "data-${hashDisk disk}";
|
|
||||||
value = {
|
|
||||||
type = "disk";
|
|
||||||
device = disk;
|
|
||||||
content = {
|
|
||||||
type = "zfs";
|
|
||||||
pool = "zdata";
|
|
||||||
};
|
|
||||||
};
|
|
||||||
}) vdev
|
|
||||||
));
|
|
||||||
zpool = {
|
|
||||||
zdata = {
|
|
||||||
type = "zpool";
|
|
||||||
options.ashift = "12";
|
|
||||||
rootFsOptions = {
|
|
||||||
mountpoint = "none";
|
|
||||||
compression = "lz4";
|
|
||||||
acltype = "posixacl";
|
|
||||||
xattr = "sa";
|
|
||||||
"com.sun:auto-snapshot" = "true";
|
|
||||||
};
|
|
||||||
mode = {
|
|
||||||
topology = {
|
|
||||||
type = "topology";
|
|
||||||
vdev = [
|
|
||||||
{
|
|
||||||
mode = "mirror";
|
|
||||||
members = vdev;
|
|
||||||
}
|
|
||||||
];
|
|
||||||
};
|
|
||||||
};
|
|
||||||
datasets = {
|
|
||||||
"nas" = {
|
|
||||||
type = "zfs_fs";
|
|
||||||
mountpoint = "/mnt/hdd";
|
|
||||||
mountOptions = [ "nofail" ];
|
|
||||||
};
|
|
||||||
"service-data" = {
|
|
||||||
type = "zfs_fs";
|
|
||||||
mountpoint = "/var/lib";
|
|
||||||
mountOptions = [ "nofail" ];
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
}
|
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,6 @@
|
|||||||
|
{
|
||||||
|
fileSystems."/" = {
|
||||||
|
device = "/dev/disk/by-uuid/44444444-4444-4444-8888-888888888888";
|
||||||
|
fsType = "ext4";
|
||||||
|
};
|
||||||
|
}
|
||||||
@@ -0,0 +1,31 @@
|
|||||||
|
{ inputs, lib, ... }:
|
||||||
|
{
|
||||||
|
imports = [
|
||||||
|
inputs.matthew-hardware.nixosModules.mt7986a-glinet-gl-mt6000
|
||||||
|
];
|
||||||
|
|
||||||
|
# matthew-hardware's common/generic-uefi-image.nix still sets
|
||||||
|
# `image.repart.enable = true`; nixpkgs removed that option (importing
|
||||||
|
# image/repart.nix now always defines system.build.image). Declare it so the
|
||||||
|
# definition has somewhere to land. Drop once upstream stops setting it.
|
||||||
|
options.image.repart.enable = lib.mkOption {
|
||||||
|
type = lib.types.bool;
|
||||||
|
default = true;
|
||||||
|
internal = true;
|
||||||
|
};
|
||||||
|
|
||||||
|
config = {
|
||||||
|
hardware.mt7986a-glinet-gl-mt6000.enable = true;
|
||||||
|
hardware.mt7986a-glinet-gl-mt6000.zealous = true;
|
||||||
|
hardware.mt7986a-glinet-gl-mt6000.image.repart.enable = true;
|
||||||
|
|
||||||
|
nixpkgs.hostPlatform.system = "aarch64-linux";
|
||||||
|
nixpkgs.buildPlatform.system = "x86_64-linux";
|
||||||
|
|
||||||
|
system.stateVersion = "26.11";
|
||||||
|
clan.core.sops.defaultGroups = [ "admins" ];
|
||||||
|
|
||||||
|
clan.core.settings.name = "stellio";
|
||||||
|
clan.core.settings.machine.description = "Flint-2 router";
|
||||||
|
};
|
||||||
|
}
|
||||||
@@ -0,0 +1,13 @@
|
|||||||
|
{ inputs, ... }:
|
||||||
|
{
|
||||||
|
disko = {
|
||||||
|
imageBuilder = {
|
||||||
|
# Avoid double emulation to significantly speed up image building process.
|
||||||
|
# Update the system according to your host system.
|
||||||
|
# See https://github.com/nix-community/disko/issues/856
|
||||||
|
qemu =
|
||||||
|
inputs.nixpkgs.legacyPackages.x86_64-linux.qemu
|
||||||
|
+ "/bin/qemu-system-aarch64 -M virt -cpu cortex-a57";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
||||||
@@ -1,24 +1,14 @@
|
|||||||
{ inputs, config, ... }:
|
|
||||||
{
|
{
|
||||||
imports = [
|
system.stateVersion = "25.11";
|
||||||
(inputs.import-tree ./services)
|
|
||||||
];
|
|
||||||
nixpkgs.hostPlatform = {
|
nixpkgs.hostPlatform = {
|
||||||
system = "x86_64-linux";
|
system = "x86_64-linux";
|
||||||
};
|
};
|
||||||
boot.loader.grub.devices = [ "/dev/disk/by-id/FIXME" ];
|
|
||||||
fileSystems = {
|
|
||||||
"/".device = "/dev/FIXME";
|
|
||||||
};
|
|
||||||
networking.fqdn = "b4l.co.th";
|
|
||||||
system.stateVersion = "25.11";
|
|
||||||
clan.core.sops.defaultGroups = [ "admins" ];
|
|
||||||
|
|
||||||
security.acme.defaults.email = "admin@b4l.co.th";
|
clan.core.settings.name = "tangra";
|
||||||
security.acme.acceptTerms = true;
|
clan.core.settings.machine.description =
|
||||||
services.nginx.virtualHosts."${config.networking.fqdn}" = {
|
"A Hetzner VPS machine own by Alex. This is a machine for poyfestival.com";
|
||||||
enableACME = true;
|
|
||||||
};
|
clan.core.sops.defaultGroups = [ "admins" ];
|
||||||
|
|
||||||
clan.core.vars.generators.acme = {
|
clan.core.vars.generators.acme = {
|
||||||
share = true;
|
share = true;
|
||||||
@@ -33,4 +23,10 @@
|
|||||||
cat $prompts/email > $out/email
|
cat $prompts/email > $out/email
|
||||||
'';
|
'';
|
||||||
};
|
};
|
||||||
|
|
||||||
|
users.users.nginx.extraGroups = [ "acme" ];
|
||||||
|
|
||||||
|
security.acme.acceptTerms = true;
|
||||||
|
|
||||||
|
imports = [ ];
|
||||||
}
|
}
|
||||||
@@ -0,0 +1,86 @@
|
|||||||
|
{ ... }:
|
||||||
|
let
|
||||||
|
hashDisk = disk: "os-${builtins.substring 0 5 (builtins.hashString "sha256" disk)}";
|
||||||
|
os = "/dev/disk/by-id/scsi-0QEMU_QEMU_HARDDISK_119349241";
|
||||||
|
in
|
||||||
|
{
|
||||||
|
|
||||||
|
boot.loader = {
|
||||||
|
systemd-boot = {
|
||||||
|
enable = true;
|
||||||
|
};
|
||||||
|
efi = {
|
||||||
|
canTouchEfiVariables = true;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
boot.zfs.forceImportRoot = true;
|
||||||
|
|
||||||
|
disko.devices = {
|
||||||
|
disk = {
|
||||||
|
"os-${hashDisk os}" = {
|
||||||
|
type = "disk";
|
||||||
|
device = os;
|
||||||
|
content = {
|
||||||
|
type = "gpt";
|
||||||
|
partitions = {
|
||||||
|
ESP = {
|
||||||
|
size = "1G";
|
||||||
|
type = "EF00";
|
||||||
|
content = {
|
||||||
|
type = "filesystem";
|
||||||
|
format = "vfat";
|
||||||
|
mountpoint = "/boot";
|
||||||
|
mountOptions = [ "nofail" ];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
system = {
|
||||||
|
size = "100%";
|
||||||
|
content = {
|
||||||
|
type = "zfs";
|
||||||
|
pool = "zroot";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
zpool = {
|
||||||
|
zroot = {
|
||||||
|
type = "zpool";
|
||||||
|
rootFsOptions = {
|
||||||
|
mountpoint = "none";
|
||||||
|
compression = "lz4";
|
||||||
|
acltype = "posixacl";
|
||||||
|
xattr = "sa";
|
||||||
|
"com.sun:auto-snapshot" = "true";
|
||||||
|
};
|
||||||
|
options.ashift = "12";
|
||||||
|
datasets = {
|
||||||
|
"root" = {
|
||||||
|
type = "zfs_fs";
|
||||||
|
options.mountpoint = "none";
|
||||||
|
};
|
||||||
|
"root/nixos" = {
|
||||||
|
type = "zfs_fs";
|
||||||
|
options.mountpoint = "/";
|
||||||
|
mountpoint = "/";
|
||||||
|
};
|
||||||
|
"root/home" = {
|
||||||
|
type = "zfs_fs";
|
||||||
|
options.mountpoint = "/home";
|
||||||
|
mountpoint = "/home";
|
||||||
|
};
|
||||||
|
"root/tmp" = {
|
||||||
|
type = "zfs_fs";
|
||||||
|
mountpoint = "/tmp";
|
||||||
|
options = {
|
||||||
|
mountpoint = "/tmp";
|
||||||
|
sync = "disabled";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -10,17 +10,11 @@
|
|||||||
|
|
||||||
(inputs.import-tree ./services)
|
(inputs.import-tree ./services)
|
||||||
|
|
||||||
(import ../../lib/auto-accept-zerotier-members.nix {
|
|
||||||
memberIds = [
|
|
||||||
"dbe44c0287" # Alex-gateway
|
|
||||||
"b0e0b84fd3" # Alex
|
|
||||||
"2bd36db8cc" # kurogeek-thinkpad
|
|
||||||
];
|
|
||||||
})
|
|
||||||
];
|
];
|
||||||
|
|
||||||
clan.core.sops.defaultGroups = [ "admins" ];
|
clan.core.sops.defaultGroups = [ "admins" ];
|
||||||
clan.core.networking.targetHost = "root@[${config.clan.core.vars.generators.zerotier.files.zerotier-ip.value}]";
|
|
||||||
|
clan.core.settings.machine.description = "Glom NAS";
|
||||||
|
|
||||||
nixpkgs.hostPlatform = {
|
nixpkgs.hostPlatform = {
|
||||||
system = "x86_64-linux";
|
system = "x86_64-linux";
|
||||||
|
|||||||
@@ -18,6 +18,8 @@ in
|
|||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
boot.zfs.forceImportRoot = true;
|
||||||
|
|
||||||
disko.devices = {
|
disko.devices = {
|
||||||
disk = {
|
disk = {
|
||||||
"os-${hashDisk os}" = {
|
"os-${hashDisk os}" = {
|
||||||
|
|||||||
@@ -5,6 +5,7 @@
|
|||||||
name = "service-actual-budget";
|
name = "service-actual-budget";
|
||||||
|
|
||||||
clan = {
|
clan = {
|
||||||
|
test.useContainers = false;
|
||||||
directory = ./.;
|
directory = ./.;
|
||||||
inventory = {
|
inventory = {
|
||||||
machines.server = { };
|
machines.server = { };
|
||||||
|
|||||||
@@ -0,0 +1,3 @@
|
|||||||
|
# Apple Network
|
||||||
|
|
||||||
|
This service allows atalkd instances to connect to each other over vxlan over Yggdrasil. We need to use vxlan due to the support of broadcasting it provides. The service will form a network of star-topology vxlan using the underlying Yggdrasil network. With this vxlan network, we can have a private Apple Talk network over the internet.
|
||||||
@@ -0,0 +1,139 @@
|
|||||||
|
{ clanLib, ... }:
|
||||||
|
{
|
||||||
|
_class = "clan.service";
|
||||||
|
manifest.name = "apple-network";
|
||||||
|
manifest.description = "This service will create an instance of `atalkd` for each peer to talk to Apple machines over Apple Talk protocol and automatically connect each peer using vxlan over Yggdrasil network to achieve Apple Talk over internet experience";
|
||||||
|
manifest.readme = builtins.readFile ./README.md;
|
||||||
|
manifest.categories = [ "Network" ];
|
||||||
|
|
||||||
|
roles.peer = {
|
||||||
|
description = "A gateway machine that allow classic Apple machines to connect to other Apple machines over the internet";
|
||||||
|
|
||||||
|
interface =
|
||||||
|
{ lib, ... }:
|
||||||
|
{
|
||||||
|
options = {
|
||||||
|
zone_name = lib.mkOption {
|
||||||
|
type = with lib.types; str;
|
||||||
|
description = "Zone name for Apple Talk protocol";
|
||||||
|
default = "Default";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
perInstance =
|
||||||
|
{ roles, settings, ... }:
|
||||||
|
{
|
||||||
|
nixosModule =
|
||||||
|
{
|
||||||
|
lib,
|
||||||
|
config,
|
||||||
|
pkgs,
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
let
|
||||||
|
vxlanPort = 4789;
|
||||||
|
|
||||||
|
getYggdrasilIP =
|
||||||
|
machineName:
|
||||||
|
if config.clan.core.vars.generators.yggdrasil.files.address ? value then
|
||||||
|
clanLib.getPublicValue {
|
||||||
|
flake = config.clan.core.settings.directory;
|
||||||
|
machine = machineName;
|
||||||
|
generator = "yggdrasil";
|
||||||
|
file = "address";
|
||||||
|
default = null;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
throw "clanService/yggdrasil is required";
|
||||||
|
|
||||||
|
noSelfPeers = builtins.filter (peerName: peerName != config.clan.core.settings.machine.name) (
|
||||||
|
lib.mapAttrsToList (machineName: _: machineName) roles.peer.machines
|
||||||
|
);
|
||||||
|
|
||||||
|
sortedPeers = builtins.sort (x: y: x < y) (
|
||||||
|
lib.mapAttrsToList (machineName: _: machineName) roles.peer.machines
|
||||||
|
);
|
||||||
|
|
||||||
|
getMachineIndex = machineName: lib.lists.findFirstIndex (x: x == machineName) null sortedPeers;
|
||||||
|
|
||||||
|
selfVXAddress = "192.168.254.${
|
||||||
|
lib.toString ((getMachineIndex config.clan.core.settings.machine.name) + 1)
|
||||||
|
}/24";
|
||||||
|
in
|
||||||
|
{
|
||||||
|
|
||||||
|
services.atalkd = {
|
||||||
|
enable = true;
|
||||||
|
interfaces = {
|
||||||
|
vxlan.config = ''
|
||||||
|
-router -phase 2 -net 1 -zone "${settings.zone_name}"
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
networking.useNetworkd = true;
|
||||||
|
|
||||||
|
networking.firewall.interfaces."ygg".allowedUDPPorts = [ vxlanPort ];
|
||||||
|
|
||||||
|
boot.kernelModules = [ "vxlan" ];
|
||||||
|
|
||||||
|
systemd.network.netdevs =
|
||||||
|
builtins.listToAttrs (
|
||||||
|
map (
|
||||||
|
peerName:
|
||||||
|
(lib.nameValuePair "10-apl-vxlan-${peerName}" {
|
||||||
|
enable = true;
|
||||||
|
netdevConfig = {
|
||||||
|
Name = "vxlan-${peerName}";
|
||||||
|
Kind = "vxlan";
|
||||||
|
};
|
||||||
|
vxlanConfig = {
|
||||||
|
VNI = (getMachineIndex config.clan.core.settings.machine.name) + (getMachineIndex peerName);
|
||||||
|
Remote = getYggdrasilIP peerName;
|
||||||
|
DestinationPort = vxlanPort;
|
||||||
|
Independent = true;
|
||||||
|
};
|
||||||
|
})
|
||||||
|
) noSelfPeers
|
||||||
|
)
|
||||||
|
// {
|
||||||
|
"10-apl-vxlan" = {
|
||||||
|
enable = true;
|
||||||
|
netdevConfig = {
|
||||||
|
Kind = "bridge";
|
||||||
|
Name = "vxlan";
|
||||||
|
};
|
||||||
|
bridgeConfig = {
|
||||||
|
STP = true;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
systemd.network.networks =
|
||||||
|
builtins.listToAttrs (
|
||||||
|
map (
|
||||||
|
peerName:
|
||||||
|
(lib.nameValuePair "10-apl-vxlan-${peerName}" {
|
||||||
|
enable = true;
|
||||||
|
matchConfig.Name = "vxlan-${peerName}";
|
||||||
|
networkConfig.Bridge = "vxlan";
|
||||||
|
})
|
||||||
|
) noSelfPeers
|
||||||
|
)
|
||||||
|
// {
|
||||||
|
"10-apl-vxlan" = {
|
||||||
|
enable = true;
|
||||||
|
matchConfig.Name = "vxlan";
|
||||||
|
address = [ selfVXAddress ];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
environment.systemPackages = [
|
||||||
|
pkgs.netatalk
|
||||||
|
pkgs.bridge-utils
|
||||||
|
];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
||||||
@@ -0,0 +1,19 @@
|
|||||||
|
{ inputs, self, ... }:
|
||||||
|
let
|
||||||
|
module = ./default.nix;
|
||||||
|
in
|
||||||
|
{
|
||||||
|
clan.modules = {
|
||||||
|
apple-network = module;
|
||||||
|
};
|
||||||
|
perSystem =
|
||||||
|
{ ... }:
|
||||||
|
{
|
||||||
|
clan.nixosTests.service-apple-network = {
|
||||||
|
imports = [ ./tests/vm/default.nix ];
|
||||||
|
_module.args = { inherit self inputs; };
|
||||||
|
|
||||||
|
clan.modules."@clan/apple-network" = module;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
||||||
@@ -0,0 +1,76 @@
|
|||||||
|
{
|
||||||
|
self,
|
||||||
|
lib,
|
||||||
|
config,
|
||||||
|
hostPkgs,
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
{
|
||||||
|
name = "service-apple-network";
|
||||||
|
|
||||||
|
result.update-vars =
|
||||||
|
let
|
||||||
|
relativeDir = lib.removePrefix "${self}/" (toString config.clan.directory);
|
||||||
|
in
|
||||||
|
hostPkgs.writeShellScriptBin "update-vars" ''
|
||||||
|
set -x
|
||||||
|
export PRJ_ROOT=$(git rev-parse --show-toplevel)
|
||||||
|
${
|
||||||
|
self.inputs.clan-core.packages.${hostPkgs.system}.clan-cli
|
||||||
|
}/bin/clan-generate-test-vars $PRJ_ROOT/${relativeDir} ${config.name}
|
||||||
|
'';
|
||||||
|
|
||||||
|
clan = {
|
||||||
|
directory = ./.;
|
||||||
|
test.useContainers = false;
|
||||||
|
|
||||||
|
inventory = {
|
||||||
|
meta.domain = "test.clan";
|
||||||
|
|
||||||
|
machines.peer1 = { };
|
||||||
|
machines.peer2 = { };
|
||||||
|
machines.peer3 = { };
|
||||||
|
|
||||||
|
instances = {
|
||||||
|
apple-network = {
|
||||||
|
module.name = "@clan/apple-network";
|
||||||
|
module.input = "self";
|
||||||
|
roles.peer.machines = {
|
||||||
|
peer1 = { };
|
||||||
|
peer2 = { };
|
||||||
|
peer3 = { };
|
||||||
|
};
|
||||||
|
};
|
||||||
|
yggdrasil = {
|
||||||
|
module.name = "yggdrasil";
|
||||||
|
roles.default.tags.all = { };
|
||||||
|
roles.default.settings.extraPeers = [
|
||||||
|
"tls://ygg.jjolly.dev:3443"
|
||||||
|
"tls://[2602:fc24:18:7a42::1]:993"
|
||||||
|
"tcp://leo.node.3dt.net:9002"
|
||||||
|
"tcp://ygg-kcmo.incognet.io:8883"
|
||||||
|
];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
nodes = {
|
||||||
|
peer1 = { };
|
||||||
|
peer2 = { };
|
||||||
|
peer3 = { };
|
||||||
|
};
|
||||||
|
|
||||||
|
testScript = _: ''
|
||||||
|
# cannot test connectivity due to Yggdrasil's establishment
|
||||||
|
start_all()
|
||||||
|
peer1.wait_for_unit("atalkd")
|
||||||
|
peer1.succeed("systemctl status atalkd")
|
||||||
|
|
||||||
|
peer2.wait_for_unit("atalkd")
|
||||||
|
peer2.succeed("systemctl status atalkd")
|
||||||
|
|
||||||
|
peer3.wait_for_unit("atalkd")
|
||||||
|
peer3.succeed("systemctl status atalkd")
|
||||||
|
'';
|
||||||
|
}
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
[
|
||||||
|
{
|
||||||
|
"publickey": "age1f92zl8y70z5w9gn0l5leg2fhyvxy6m93dfh7n6ltgvuu9nyg6epsrw6t8x",
|
||||||
|
"type": "age"
|
||||||
|
}
|
||||||
|
]
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
[
|
||||||
|
{
|
||||||
|
"publickey": "age1u36fr87cru90vfznf5szasya9nhvvseh4atk8zsdj0rrsu0nnvwqsyt8g6",
|
||||||
|
"type": "age"
|
||||||
|
}
|
||||||
|
]
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
[
|
||||||
|
{
|
||||||
|
"publickey": "age1rka3368ltqc787xw99uu762lqfk7qxld9265u2t62fpxnp9xhufsc2q5rw",
|
||||||
|
"type": "age"
|
||||||
|
}
|
||||||
|
]
|
||||||
@@ -0,0 +1,14 @@
|
|||||||
|
{
|
||||||
|
"data": "ENC[AES256_GCM,data:hC4Lle6mXuTFq//wBHUTyH3X778u/gYJSXJOiQ7xUb+gnC8beH1olxL2ZhtUiMkktzhsPM/j6cxhltPp25UTeJnUOcoYesqZcp8=,iv:WOx2P2Cu4v58xM9ePjAw1gdA0fFnGG2UqEXH2iksGoo=,tag:43n1ibVSy2AeS9f5qQBKNQ==,type:str]",
|
||||||
|
"sops": {
|
||||||
|
"age": [
|
||||||
|
{
|
||||||
|
"enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBtT244N1Q3Zk9pRjFFQlUr\ncDExSTBwSWk5UXVyMjhWclQwSFZaYnpTRFY0CnE5YStVdzMrS3BKYzYvc3V3QVFY\nbDVwVytoNERveU1xQllqNUFGV2hYbGMKLS0tIDJSUmkwMUQzL3Y0MU5qZTJ3eFN3\nNGdwamM1UDBPdzhvSWsyZzR6anZ0eFEKKnr1/7rf3fH1i7KUoZdilLDgb44K2qzn\nI9Y+7FbV4gzQUzKWjAQeFN37Z4Qiuy0xJVA0lw8KvM+NCxSZDfh3kw==\n-----END AGE ENCRYPTED FILE-----\n",
|
||||||
|
"recipient": "age1qm0p4vf9jvcnn43s6l4prk8zn6cx0ep9gzvevxecv729xz540v8qa742eg"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"lastmodified": "2026-07-03T10:46:56Z",
|
||||||
|
"mac": "ENC[AES256_GCM,data:hmpbOtra6EyNiPg7EsA3F4elHEO87JPUr4VKVppvzUwLX1HSj67WrU6k3rEoJT+k7Hq1lxnAzDEckSG1fUOap11rk8ksp1IAGR0+yqykC/Qj/Nl8wXqP84gr49bJK6xE/DDdCRCcBff2d6IpnehyEr8fGFEZbWGygblec8U8GPo=,iv:+M1C3rL22foowr0VD80jwrNFb5xz4k5JQ/DJm4ThKHk=,tag:wabFAC5NTCVGfIQQzm0yGg==,type:str]",
|
||||||
|
"version": "3.13.1"
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
../../../users/admin
|
||||||
@@ -0,0 +1,14 @@
|
|||||||
|
{
|
||||||
|
"data": "ENC[AES256_GCM,data:ndWIEOqP2ybCN7Ak5g+8q3YG5rLQ7OuSv/vCbnMA8AK6Lby2JMGRkRGysqJdyEF7eh4w7PpZ/AtKPtPbUucjeTB5+8g76PPJTBE=,iv:EYy0GGqEBmIc5rSWP7Zleb5eQ0JzTz84HqeJPpCSpxk=,tag:iMgTUb9+wxE9S2kKoOEvsQ==,type:str]",
|
||||||
|
"sops": {
|
||||||
|
"age": [
|
||||||
|
{
|
||||||
|
"enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBQTEF6OXN4K0dHdXhWWmt2\neG5wdkNIc2F0UnFEeHFLQkdTWkFpUWhTa0NBCmw2N2J1T0FJVE9JR3VBRWV0THh5\nVEZlbVZrcXAwK3BsYXFOZUF6c3lRSkUKLS0tIFRCQzNUaGFHdERWNWR4enVWRGpx\nbDEzRU9jWHgxWHovaENjbkFlZERIbkkKvAW31gTJg9izrWuAMeDHS9SWPQYtxRBY\necDCn8QORFrnDdxEusCnGJrAU4kmS3Y3CwSHCtEijs3JdIgg9wl/MA==\n-----END AGE ENCRYPTED FILE-----\n",
|
||||||
|
"recipient": "age1qm0p4vf9jvcnn43s6l4prk8zn6cx0ep9gzvevxecv729xz540v8qa742eg"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"lastmodified": "2026-07-03T10:47:04Z",
|
||||||
|
"mac": "ENC[AES256_GCM,data:y1U2vsdqR97fPAnp6iZiLY1KbWYmgDqgZ5bwIkWPCr7Gjjrn+qV+sc2T1BTVz3Zo0JOz4ScCc+f6snVsFKdCDU/NmDVFt/sqyH4NHUPRQ3StsQim8C7IkSwUtm3EhrqpLYFD21MEjrYYdHMHbWybxrOI0qI6mDwZymHJFeCLdQA=,iv:lVvPn69eQE/huwDmwePepfpi2l9ZOPQO7W20o4AJBFQ=,tag:7VPfjKZsBVJTZxNwTcI6sg==,type:str]",
|
||||||
|
"version": "3.13.1"
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
../../../users/admin
|
||||||
@@ -0,0 +1,14 @@
|
|||||||
|
{
|
||||||
|
"data": "ENC[AES256_GCM,data:JPdetkhtF9eSmgEfCO2exXlGQ5KWLeIM3mnW5BfyTY8r0PxWSEGAwBskC1SiDdRERWB2VEbPiPgCNXMnGaYlDqSdZN6R9wSFvsQ=,iv:qGveNhUtgxvKnmdsPoPpffKyi5srlq0Pd6aW283B5C0=,tag:TcJsCrBlzfjXvztcRaxYFQ==,type:str]",
|
||||||
|
"sops": {
|
||||||
|
"age": [
|
||||||
|
{
|
||||||
|
"enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSAvdjNHa1RlcFJHazB5TXFu\nOUQ4REpCZm5Yc3ZhcVhwT1FqRHlvbnoxZWlFCnNrVUEyK2ZYSmlacmJ2b2QrclZl\nSDV1eWxXVmJxZlhMMXgrTWtjcjVhQlkKLS0tIHZPN3pCUVBLQmpRVGx6SDBQNDZo\nSitheGhXNGl5QW9HTGNsTTdTdWVwaE0KfuM5xZOPbR1lxkJPJUOVrtlW5Ujobemp\nid40reDqxKQxP3khJv8lf9ZoN8LAx2Iwh0DeAl+UJpsoVWgS7uI2qQ==\n-----END AGE ENCRYPTED FILE-----\n",
|
||||||
|
"recipient": "age1qm0p4vf9jvcnn43s6l4prk8zn6cx0ep9gzvevxecv729xz540v8qa742eg"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"lastmodified": "2026-07-07T04:54:10Z",
|
||||||
|
"mac": "ENC[AES256_GCM,data:Tt8yqzfAnSDe2n7KDt1Z/D73hkS1w7DsqIh+s5WljLzar9PEt5vUCLb8DIvBwITyzGAoHH1ym3v3NrnJWCdxajKExTMBf4aY3MJCtykeCG37701S/KxumjTW9/fJw74gcET5I6NafTWb6H5XHsrRaQX1Xnspcs8B7uLGZZ28dSM=,iv:Fo5UPVhnjuOx6Cp4grofHOiD2pm0TXuRRuoTwvxKn1s=,tag:VQ/TF1TiyJADj7/3RwPCAg==,type:str]",
|
||||||
|
"version": "3.13.1"
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
../../../users/admin
|
||||||
@@ -0,0 +1,4 @@
|
|||||||
|
{
|
||||||
|
"publickey": "age1qm0p4vf9jvcnn43s6l4prk8zn6cx0ep9gzvevxecv729xz540v8qa742eg",
|
||||||
|
"type": "age"
|
||||||
|
}
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
26.11
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
200:e6cc:c86:f02d:b0d5:fba9:9b2c:eb77
|
||||||
Symlink
+1
@@ -0,0 +1 @@
|
|||||||
|
../../../../../../sops/machines/peer1
|
||||||
+18
@@ -0,0 +1,18 @@
|
|||||||
|
{
|
||||||
|
"data": "ENC[AES256_GCM,data:6YDp5S2TzEnhDgGhcz8cA3uBsfDt0Oc4JpztB1JUcg/+tDBbeaQN4MLxuZKstXn2Hb1mYtBLlX0vHw++T181Js2sIznyfC1lr68GOvQAp4NYgf23dXpdZk/CMPNUMiGOYVwKWQ/Z0/p0azJ6xV29dYQcM4Q9hys=,iv:Ijzz8hm0looCWoSpjg/rYKp9jhvzRuLboKWHrlwVeFA=,tag:kJcH/1Pu+9q9f2J68LETug==,type:str]",
|
||||||
|
"sops": {
|
||||||
|
"age": [
|
||||||
|
{
|
||||||
|
"enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBYNDNEL3kvdEpEMjYyOFJG\nMk5adU04M3hxa21jTTZNM2dQREpmUlVES1NvCjh6eDNFZ1hzUVlTY3Nidnp3TkYr\nRVl4TFlrNUE3dVIzZzg2VWMwTFBYUXMKLS0tIFE0dVFQQmxwOFJ6YkdaQlh6dUlW\nTi8rdXdQbGR1eXpLcTdOandqQmxka3cKImbmJQo2YMYMSQD8kNTgol3VJ4YGIaoz\nl3AY4u/fobg5qlzVQwV33G0/Wf72Z2aTjSLnP4thnasQ89PdYvs7hA==\n-----END AGE ENCRYPTED FILE-----\n",
|
||||||
|
"recipient": "age1f92zl8y70z5w9gn0l5leg2fhyvxy6m93dfh7n6ltgvuu9nyg6epsrw6t8x"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBiaWw5SU9KWmJnVVVmTVpr\nL1V6RnRYUGg2UnhXR1BnVTh5eFhnNFpidGdjCmdMeU1nZkZmTTVwbkNaVElFa0Z4\nVkdGdjc4c2lPWGNrVGxocE9iQUZ3QTAKLS0tIHIzTzRRbXVkM3I4ZVRxeSs5eHV5\nTUxOaytzb2MxQ2UybkVCYWVWVmVEcUEKPeK+CC7r3CP5BJqg9thWNHWjPBp/ueHU\nRif6T79kqf+c3B34qXwR0zfyM1+a0r9GAVVC2/q+Ha/As5sPJU39ww==\n-----END AGE ENCRYPTED FILE-----\n",
|
||||||
|
"recipient": "age1qm0p4vf9jvcnn43s6l4prk8zn6cx0ep9gzvevxecv729xz540v8qa742eg"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"lastmodified": "2026-07-03T10:46:56Z",
|
||||||
|
"mac": "ENC[AES256_GCM,data:PffiPU1GR9DojTb7TxzBkpivKV2ybmmq9h4pOOyq7p5BAIPF+JSe+BDtbItQ+Gn5LnitQRUVvhat8E2iYfz3JgNxNKcsNFU/mWtCz3PlqyiuRzUBtEL3zYfhdMi8hYYlVdfMumaK3VMk+b4uDGExR+MpURL97TFku47qRbzbILs=,iv:3//fj7WtIX2QNYB9ub1JKAFIn5vJeuZl6rqaEsX0oQc=,tag:njU+WAVq7xBgE0sna2dMKA==,type:str]",
|
||||||
|
"version": "3.13.1"
|
||||||
|
}
|
||||||
|
}
|
||||||
+1
@@ -0,0 +1 @@
|
|||||||
|
../../../../../../sops/users/admin
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
8c99f9bc87e92795022b32698a440d6f9fe01d1110f867de8176bb190b92acab
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
26.11
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
200:eb95:7d1b:3ac3:62e7:24af:2274:3771
|
||||||
Symlink
+1
@@ -0,0 +1 @@
|
|||||||
|
../../../../../../sops/machines/peer2
|
||||||
+18
@@ -0,0 +1,18 @@
|
|||||||
|
{
|
||||||
|
"data": "ENC[AES256_GCM,data:vOwMqT12A5ap5hRvCGTjTUX4sXKO3N7KE8eQ+/SCcBWndU9/b2AehiNgplWWMGcYdmeDL9qI8V2pPkgBkQ/tWH6N8DccSM/zQzrBUkXvRApl6hvNZAWuBVf/P4MW4/EbRGtMg2tEXkaPDtRn2TsDK7ygmXmqArI=,iv:FkxFx/ClAftLu85S6Uq3ZOom+YDOpeWGlYLOFBmFfnk=,tag:zprw62qiu+hmLZEZbnqYXA==,type:str]",
|
||||||
|
"sops": {
|
||||||
|
"age": [
|
||||||
|
{
|
||||||
|
"enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSA0WVB1M2ttd0FocGhTSjNo\nUDFIcmpsL051TndWbkJVakJHbUxjY3Q3NjM0CnkrbFlHS1E4bkZJQTIvMDJ3VDFv\nNW1OdmwvalBEelN2d3YwbHVqTW94OFEKLS0tIGtpOWxCM29xdXhQL2Yzb094OG1n\nT21mc25yU1dJL29vekRHdldzdDR3dEkKoZ1dPRaPg8iVsuec6IhV3cLPchokV2wv\nu6qb92hsLQuyPHDA01Oey0jxmaYMQGtAVjo2zEM+E+zrKY+f2pHIUQ==\n-----END AGE ENCRYPTED FILE-----\n",
|
||||||
|
"recipient": "age1qm0p4vf9jvcnn43s6l4prk8zn6cx0ep9gzvevxecv729xz540v8qa742eg"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSArcmo5d2x6c3J0YTkwMGJE\nanphd2FiUjdGdmdNeW0rL0FpcTVSM3dublZ3CnphajNVV2YrTGl2a3ZqMTJKeU4v\nTzZRS2F5MlA5Ny84cFFoNWZQZnpBZTgKLS0tIHVKQUJWcmlPdy9GNXNBYnpJcEVC\nNmJVMlpvSzZPdk1JY2hIZVEvc3cwV2MKE/cMJU/j5g62njJ49AfnLutmxkpz/gxX\nIqWe1m7Uxl/awVFa7F8N7TUkd0jLbAGXZaonDjiBxOTwg/jr/apnuQ==\n-----END AGE ENCRYPTED FILE-----\n",
|
||||||
|
"recipient": "age1u36fr87cru90vfznf5szasya9nhvvseh4atk8zsdj0rrsu0nnvwqsyt8g6"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"lastmodified": "2026-07-03T10:47:04Z",
|
||||||
|
"mac": "ENC[AES256_GCM,data:wiIkwEDwGJZe0u8qLHthPkCXubeIGyHV8yBo8CsSengLVTOtRZ877zTrFvE74ATF1pGE3DFJ5qGRrOGgKJ4VOl043LbEBs0bxZC495pPMPYszimp2UAf/XE3QWlNi9p4Ce/kbvUDd0W3SRt4hIv6HOLWApiRoqfS2qSMUnBQeW0=,iv:Hs7EysUnje/iWZRhJLlqf8wuFJnIMpWfXWHrilfmM5I=,tag:Rgj9x4ZOM2fihKKNQ4ux3g==,type:str]",
|
||||||
|
"version": "3.13.1"
|
||||||
|
}
|
||||||
|
}
|
||||||
+1
@@ -0,0 +1 @@
|
|||||||
|
../../../../../../sops/users/admin
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
8a354172629e4e8c6da86ec5e447411e4238cf7bb439b798fae56509a82d7472
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
26.11
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
200:3dcd:9b0d:103c:f953:1e8:e3a2:ed90
|
||||||
Symlink
+1
@@ -0,0 +1 @@
|
|||||||
|
../../../../../../sops/machines/peer3
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user