9 Commits

305 changed files with 1135 additions and 19902 deletions

67
flake.lock generated
View File

@@ -20,11 +20,11 @@
] ]
}, },
"locked": { "locked": {
"lastModified": 1766984802, "lastModified": 1764721663,
"narHash": "sha256-SYZ/MXVtJEb3sRWxvPL/2HtpSL1CzQgu1o8ASXqCO98=", "narHash": "sha256-gdyZQ41CoJ4u4XSuXcZlDB/pqiLNni1xALMYP3VTk3Y=",
"ref": "refs/heads/main", "ref": "refs/heads/main",
"rev": "052b66d8dc724c3e519b9003281c2f9a210fc380", "rev": "6ace9cefb0780f34c33c016c108fc2bf0a87bdc4",
"revCount": 11770, "revCount": 11386,
"type": "git", "type": "git",
"url": "https://git.clan.lol/clan/clan-core" "url": "https://git.clan.lol/clan/clan-core"
}, },
@@ -49,11 +49,11 @@
] ]
}, },
"locked": { "locked": {
"lastModified": 1766977667, "lastModified": 1762942435,
"narHash": "sha256-LUALgG4ZpsA0k7pGYzMDto/r6T8aIPlYTok3lGlojjA=", "narHash": "sha256-zIWGs5FIytTtJN+dhDb8Yx+q4TQI/yczuL539yVcyPE=",
"rev": "3f852546b5d8bd2e9659a81c6b2cc14922e63a94", "rev": "0ee328404b12c65e8106bde9e9fab8abf4ecada4",
"type": "tarball", "type": "tarball",
"url": "https://git.clan.lol/api/v1/repos/clan/data-mesher/archive/3f852546b5d8bd2e9659a81c6b2cc14922e63a94.tar.gz" "url": "https://git.clan.lol/api/v1/repos/clan/data-mesher/archive/0ee328404b12c65e8106bde9e9fab8abf4ecada4.tar.gz"
}, },
"original": { "original": {
"type": "tarball", "type": "tarball",
@@ -88,11 +88,11 @@
] ]
}, },
"locked": { "locked": {
"lastModified": 1766150702, "lastModified": 1764627417,
"narHash": "sha256-P0kM+5o+DKnB6raXgFEk3azw8Wqg5FL6wyl9jD+G5a4=", "narHash": "sha256-D6xc3Rl8Ab6wucJWdvjNsGYGSxNjQHzRc2EZ6eeQ6l4=",
"owner": "nix-community", "owner": "nix-community",
"repo": "disko", "repo": "disko",
"rev": "916506443ecd0d0b4a0f4cf9d40a3c22ce39b378", "rev": "5a88a6eceb8fd732b983e72b732f6f4b8269bef3",
"type": "github" "type": "github"
}, },
"original": { "original": {
@@ -121,26 +121,6 @@
"type": "github" "type": "github"
} }
}, },
"home-manager": {
"inputs": {
"nixpkgs": [
"nixpkgs"
]
},
"locked": {
"lastModified": 1768068402,
"narHash": "sha256-bAXnnJZKJiF7Xr6eNW6+PhBf1lg2P1aFUO9+xgWkXfA=",
"owner": "nix-community",
"repo": "home-manager",
"rev": "8bc5473b6bc2b6e1529a9c4040411e1199c43b4c",
"type": "github"
},
"original": {
"owner": "nix-community",
"repo": "home-manager",
"type": "github"
}
},
"import-tree": { "import-tree": {
"locked": { "locked": {
"lastModified": 1752730890, "lastModified": 1752730890,
@@ -182,11 +162,11 @@
] ]
}, },
"locked": { "locked": {
"lastModified": 1766784396, "lastModified": 1764161084,
"narHash": "sha256-rIlgatT0JtwxsEpzq+UrrIJCRfVAXgbYPzose1DmAcM=", "narHash": "sha256-HN84sByg9FhJnojkGGDSrcjcbeioFWoNXfuyYfJ1kBE=",
"owner": "nix-darwin", "owner": "nix-darwin",
"repo": "nix-darwin", "repo": "nix-darwin",
"rev": "f0c8e1f6feb562b5db09cee9fb566a2f989e6b55", "rev": "e95de00a471d07435e0527ff4db092c84998698e",
"type": "github" "type": "github"
}, },
"original": { "original": {
@@ -210,11 +190,11 @@
}, },
"nixos-facter-modules": { "nixos-facter-modules": {
"locked": { "locked": {
"lastModified": 1766558141, "lastModified": 1764252389,
"narHash": "sha256-Ud9v49ZPsoDBFuyJSQ2Mpw1ZgAH/aMwUwwzrVoetNus=", "narHash": "sha256-3bbuneTKZBkYXlm0bE36kUjiDsasoIC1GWBw/UEJ9T4=",
"owner": "nix-community", "owner": "nix-community",
"repo": "nixos-facter-modules", "repo": "nixos-facter-modules",
"rev": "e796d536e3d83de74267069e179dc620a608ed7d", "rev": "5ea68886d95218646d11d3551a476d458df00778",
"type": "github" "type": "github"
}, },
"original": { "original": {
@@ -225,11 +205,11 @@
}, },
"nixpkgs": { "nixpkgs": {
"locked": { "locked": {
"lastModified": 1768395095, "lastModified": 1761656231,
"narHash": "sha256-ZhuYJbwbZT32QA95tSkXd9zXHcdZj90EzHpEXBMabaw=", "narHash": "sha256-krgZxGAIIIKFJS+UB0l8do3sYUDWJc75M72tepmVMzE=",
"owner": "nixos", "owner": "nixos",
"repo": "nixpkgs", "repo": "nixpkgs",
"rev": "13868c071cc73a5e9f610c47d7bb08e5da64fdd5", "rev": "d7f52a7a640bc54c7bb414cca603835bf8dd4b10",
"type": "github" "type": "github"
}, },
"original": { "original": {
@@ -244,7 +224,6 @@
"clan-core": "clan-core", "clan-core": "clan-core",
"devshell": "devshell", "devshell": "devshell",
"flake-parts": "flake-parts", "flake-parts": "flake-parts",
"home-manager": "home-manager",
"import-tree": "import-tree", "import-tree": "import-tree",
"liminix": "liminix", "liminix": "liminix",
"nixpkgs": "nixpkgs", "nixpkgs": "nixpkgs",
@@ -259,11 +238,11 @@
] ]
}, },
"locked": { "locked": {
"lastModified": 1766894905, "lastModified": 1764483358,
"narHash": "sha256-pn8AxxfajqyR/Dmr1wnZYdUXHgM3u6z9x0Z1Ijmz2UQ=", "narHash": "sha256-EyyvCzXoHrbL467YSsQBTWWg4sR96MH1sPpKoSOelB4=",
"owner": "Mic92", "owner": "Mic92",
"repo": "sops-nix", "repo": "sops-nix",
"rev": "61b39c7b657081c2adc91b75dd3ad8a91d6f07a7", "rev": "5aca6ff67264321d47856a2ed183729271107c9c",
"type": "github" "type": "github"
}, },
"original": { "original": {

View File

@@ -15,10 +15,6 @@
inputs.nixpkgs-lib.follows = "nixpkgs"; inputs.nixpkgs-lib.follows = "nixpkgs";
url = "github:hercules-ci/flake-parts"; url = "github:hercules-ci/flake-parts";
}; };
home-manager = {
inputs.nixpkgs.follows = "nixpkgs";
url = "github:nix-community/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 = {
@@ -48,25 +44,9 @@
./machines ./machines
./routers ./routers
./inventories ./inventories
./overlays
./tests
./modules/clan/flake-module.nix ./modules/clan/flake-module.nix
./modules/nixos/flake-module.nix ./modules/nixos/flake-module.nix
]; ];
perSystem =
{ pkgs, system, ... }:
{
_module.args.pkgs = import inputs.nixpkgs {
inherit system;
overlays = [
inputs.self.overlays.packagesOverlay
];
config = { };
};
packages.think = pkgs.think-gtcm;
packages.think-be = pkgs.think-backend-gtcm;
packages.file-uploader = pkgs.gtcm-file-uploader;
};
} }
); );
} }

View File

@@ -1,5 +1,4 @@
{ {
imports = [ ./personal-computer.nix ];
clan = { clan = {
inventory = { inventory = {
@@ -8,21 +7,9 @@
"vega" "vega"
"ramus" "ramus"
]; ];
b4l = [ "rigel" ];
w = [ "sirius" ]; w = [ "sirius" ];
b4l = [ fax-bridge = [ ];
"rigel"
"neptune"
"rana"
];
phonebox = [
"neptune"
"rigel"
"almach"
"alpheratz"
"mirach"
"adhil"
"buna"
];
}; };
instances = { instances = {
@@ -88,28 +75,18 @@
roles.peer.tags.b4l = { }; roles.peer.tags.b4l = { };
}; };
yggdrasil-phone-network = { yggdrasil = {
module = { module = {
name = "yggdrasil"; name = "yggdrasil";
input = "clan-core";
};
roles.default.tags."phonebox" = { };
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"
];
};
phonebox = {
module = {
name = "phonebox";
input = "self"; input = "self";
}; };
roles.default.tags."phonebox" = { }; roles.default.tags."fax-bridge" = { };
roles.default.machines."adhil".settings = { };
ata-ethernet-iface = "end0";
asterisk = {
module = {
name = "asterisk";
input = "self";
}; };
}; };
@@ -162,6 +139,13 @@
}; };
roles.default.machines.b4l = { }; roles.default.machines.b4l = { };
}; };
pingvin = {
module = {
name = "pingvin";
input = "self";
};
roles.default.machines.b4l = { };
};
paperless = { paperless = {
module = { module = {
name = "paperless"; name = "paperless";
@@ -169,80 +153,6 @@
}; };
roles.default.machines.b4l = { }; roles.default.machines.b4l = { };
}; };
pulse-stream = {
module = {
name = "pulse-stream";
input = "self";
};
roles.default.machines.neptune = {
settings.client-ip-ranges = [
"10.0.0.0/24"
];
};
};
jukebox = {
module = {
name = "jukebox";
input = "self";
};
roles.default.machines.neptune = {
settings = {
binds = [ "wlp1s0" ];
disks.m3 = {
uuid = "105D-319E";
mountOptions = [ "utf8" ];
};
};
};
};
git-daemon = {
module = {
name = "git-daemon";
input = "self";
};
roles.default.machines.neptune = {
settings.repositories =
let
defaults = rec {
write-access = [
"10.0.0.0/24"
"200:d7b1:c5d5:ea7:27ad:6837:40f6:404d/128"
];
read-access = write-access;
};
PUBLIC = {
read-access = [
"10.0.0.0/24"
"0200::/7"
];
};
in
builtins.mapAttrs (_: override: defaults // override) {
"9e" = PUBLIC;
archive-dl = { };
barrytown = { };
cleanroom = PUBLIC;
community-memory = { };
eris = { };
ftdi-sd-spi = { };
go-go-gadget = { };
hacking-the-kindle = { };
islands = PUBLIC;
kt = { };
legba = { };
llb = PUBLIC;
llc = PUBLIC;
lora = { };
mute = { };
navi = { };
notmuch-memoryhole = PUBLIC;
pms5003 = { };
thinc = PUBLIC;
toad = { };
yggdrasil-erlang = { };
};
};
};
}; };
}; };
}; };

View File

@@ -1,37 +0,0 @@
{
clan.inventory = {
tags = {
kde-desktop = [ "rana" ];
personal-computer = [ "rana" ];
};
instances = {
emmie-home = {
module = {
name = "home-user";
input = "self";
};
roles.default.settings = {
username = "emmie";
kbLayout = "us,th";
kbOptions = "grp:win_space_toggle,grp:alt_shift_toggle";
};
roles.default.machines."rana" = { };
};
personal-computer = {
module = {
name = "personal-computer";
input = "self";
};
roles.default.tags."personal-computer" = { };
};
kde = {
module = {
name = "kde";
input = "clan-core";
};
roles.default.tags."kde-desktop" = { };
};
};
};
}

View File

@@ -11,18 +11,6 @@
}, },
"almach": { "almach": {
"installedAt": 1764745787 "installedAt": 1764745787
},
"neptune": {
"installedAt": 1762147067
},
"adhil": {
"installedAt": 1765277591
},
"buna": {
"installedAt": 1765343708
},
"rana": {
"installedAt": 1768294839
} }
} }
} }

View File

@@ -1,13 +0,0 @@
{ ... }:
{
nixpkgs.hostPlatform = {
system = "aarch64-linux";
};
system.stateVersion = "25.11";
clan.core.sops.defaultGroups = [ "admins" ];
# clan.core.networking.targetHost = "root@";
clan.core.settings.name = "adhil";
# clan.meta.description = "Raspberry Pi 4 SBC board for one of w phone network. (With w office)";
}

View File

@@ -1,56 +0,0 @@
{ ... }:
let
hashDisk = disk: "os-${builtins.substring 0 5 (builtins.hashString "sha256" disk)}";
os = "/dev/disk/by-id/mmc-SD64G_0xfb330ff6";
in
{
boot.loader = {
systemd-boot = {
enable = true;
};
efi = {
canTouchEfiVariables = 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"
];
};
};
};
};
};
};
};
}

File diff suppressed because it is too large Load Diff

View File

@@ -7,7 +7,7 @@
clan.core.sops.defaultGroups = [ "admins" ]; clan.core.sops.defaultGroups = [ "admins" ];
# clan.core.networking.targetHost = "root@"; # clan.core.networking.targetHost = "root@";
clan.core.settings.name = "almach"; clan.meta.name = "almach";
# clan.meta.description = "Radxa X4 SBC board for one of w phone network."; clan.meta.description = "Radxa X4 SBC board for one of w phone network.";
} }

View File

@@ -25,7 +25,10 @@
{ {
"index": 31, "index": 31,
"attached_to": 32, "attached_to": 32,
"class_list": ["usb", "bluetooth"], "class_list": [
"usb",
"bluetooth"
],
"bus_type": { "bus_type": {
"hex": "0086", "hex": "0086",
"name": "USB", "name": "USB",
@@ -93,14 +96,21 @@
"hotplug": "usb", "hotplug": "usb",
"driver": "btusb", "driver": "btusb",
"driver_module": "btusb", "driver_module": "btusb",
"drivers": ["btusb"], "drivers": [
"driver_modules": ["btusb"], "btusb"
],
"driver_modules": [
"btusb"
],
"module_alias": "usb:v13D3p3572d0000dcE0dsc01dp01icE0isc01ip01in00" "module_alias": "usb:v13D3p3572d0000dcE0dsc01dp01icE0isc01ip01in00"
}, },
{ {
"index": 33, "index": 33,
"attached_to": 32, "attached_to": 32,
"class_list": ["usb", "bluetooth"], "class_list": [
"usb",
"bluetooth"
],
"bus_type": { "bus_type": {
"hex": "0086", "hex": "0086",
"name": "USB", "name": "USB",
@@ -168,8 +178,12 @@
"hotplug": "usb", "hotplug": "usb",
"driver": "btusb", "driver": "btusb",
"driver_module": "btusb", "driver_module": "btusb",
"drivers": ["btusb"], "drivers": [
"driver_modules": ["btusb"], "btusb"
],
"driver_modules": [
"btusb"
],
"module_alias": "usb:v13D3p3572d0000dcE0dsc01dp01icE0isc01ip01in01" "module_alias": "usb:v13D3p3572d0000dcE0dsc01dp01icE0isc01ip01in01"
} }
], ],
@@ -177,7 +191,10 @@
{ {
"index": 8, "index": 8,
"attached_to": 0, "attached_to": 0,
"class_list": ["pci", "bridge"], "class_list": [
"pci",
"bridge"
],
"bus_type": { "bus_type": {
"hex": "0004", "hex": "0004",
"name": "PCI", "name": "PCI",
@@ -241,14 +258,21 @@
}, },
"driver": "pcieport", "driver": "pcieport",
"driver_module": "pcieportdrv", "driver_module": "pcieportdrv",
"drivers": ["pcieport"], "drivers": [
"driver_modules": ["pcieportdrv"], "pcieport"
],
"driver_modules": [
"pcieportdrv"
],
"module_alias": "pci:v00008086d000054BBsv00008086sd00007270bc06sc04i00" "module_alias": "pci:v00008086d000054BBsv00008086sd00007270bc06sc04i00"
}, },
{ {
"index": 10, "index": 10,
"attached_to": 0, "attached_to": 0,
"class_list": ["pci", "bridge"], "class_list": [
"pci",
"bridge"
],
"bus_type": { "bus_type": {
"hex": "0004", "hex": "0004",
"name": "PCI", "name": "PCI",
@@ -303,7 +327,10 @@
{ {
"index": 16, "index": 16,
"attached_to": 0, "attached_to": 0,
"class_list": ["pci", "bridge"], "class_list": [
"pci",
"bridge"
],
"bus_type": { "bus_type": {
"hex": "0004", "hex": "0004",
"name": "PCI", "name": "PCI",
@@ -354,15 +381,22 @@
}, },
"driver": "igen6_edac", "driver": "igen6_edac",
"driver_module": "igen6_edac", "driver_module": "igen6_edac",
"drivers": ["igen6_edac"], "drivers": [
"driver_modules": ["igen6_edac"], "igen6_edac"
],
"driver_modules": [
"igen6_edac"
],
"module_alias": "pci:v00008086d0000461Csv00008086sd00007270bc06sc00i00", "module_alias": "pci:v00008086d0000461Csv00008086sd00007270bc06sc00i00",
"label": "Onboard - Other" "label": "Onboard - Other"
}, },
{ {
"index": 19, "index": 19,
"attached_to": 0, "attached_to": 0,
"class_list": ["pci", "bridge"], "class_list": [
"pci",
"bridge"
],
"bus_type": { "bus_type": {
"hex": "0004", "hex": "0004",
"name": "PCI", "name": "PCI",
@@ -426,8 +460,12 @@
}, },
"driver": "pcieport", "driver": "pcieport",
"driver_module": "pcieportdrv", "driver_module": "pcieportdrv",
"drivers": ["pcieport"], "drivers": [
"driver_modules": ["pcieportdrv"], "pcieport"
],
"driver_modules": [
"pcieportdrv"
],
"module_alias": "pci:v00008086d000054BEsv00008086sd00007270bc06sc04i00" "module_alias": "pci:v00008086d000054BEsv00008086sd00007270bc06sc04i00"
} }
], ],
@@ -610,7 +648,10 @@
{ {
"index": 27, "index": 27,
"attached_to": 25, "attached_to": 25,
"class_list": ["disk", "block_device"], "class_list": [
"disk",
"block_device"
],
"base_class": { "base_class": {
"hex": "0106", "hex": "0106",
"name": "Mass Storage Device", "name": "Mass Storage Device",
@@ -655,13 +696,21 @@
], ],
"driver": "sdhci-pci", "driver": "sdhci-pci",
"driver_module": "sdhci_pci", "driver_module": "sdhci_pci",
"drivers": ["mmcblk", "sdhci-pci"], "drivers": [
"driver_modules": ["sdhci_pci"] "mmcblk",
"sdhci-pci"
],
"driver_modules": [
"sdhci_pci"
]
}, },
{ {
"index": 28, "index": 28,
"attached_to": 25, "attached_to": 25,
"class_list": ["disk", "block_device"], "class_list": [
"disk",
"block_device"
],
"base_class": { "base_class": {
"hex": "0106", "hex": "0106",
"name": "Mass Storage Device", "name": "Mass Storage Device",
@@ -683,7 +732,9 @@
"minor": 32, "minor": 32,
"range": 32 "range": 32
}, },
"unix_device_names": ["/dev/mmcblk0boot0"], "unix_device_names": [
"/dev/mmcblk0boot0"
],
"resources": [ "resources": [
{ {
"type": "disk_geo", "type": "disk_geo",
@@ -701,12 +752,17 @@
} }
], ],
"driver": "mmcblk", "driver": "mmcblk",
"drivers": ["mmcblk"] "drivers": [
"mmcblk"
]
}, },
{ {
"index": 29, "index": 29,
"attached_to": 25, "attached_to": 25,
"class_list": ["disk", "block_device"], "class_list": [
"disk",
"block_device"
],
"base_class": { "base_class": {
"hex": "0106", "hex": "0106",
"name": "Mass Storage Device", "name": "Mass Storage Device",
@@ -728,7 +784,9 @@
"minor": 64, "minor": 64,
"range": 32 "range": 32
}, },
"unix_device_names": ["/dev/mmcblk0boot1"], "unix_device_names": [
"/dev/mmcblk0boot1"
],
"resources": [ "resources": [
{ {
"type": "disk_geo", "type": "disk_geo",
@@ -746,12 +804,19 @@
} }
], ],
"driver": "mmcblk", "driver": "mmcblk",
"drivers": ["mmcblk"] "drivers": [
"mmcblk"
]
}, },
{ {
"index": 30, "index": 30,
"attached_to": 22, "attached_to": 22,
"class_list": ["disk", "usb", "scsi", "block_device"], "class_list": [
"disk",
"usb",
"scsi",
"block_device"
],
"bus_type": { "bus_type": {
"hex": "0084", "hex": "0084",
"name": "SCSI", "name": "SCSI",
@@ -837,8 +902,14 @@
], ],
"driver": "usb-storage", "driver": "usb-storage",
"driver_module": "usb_storage", "driver_module": "usb_storage",
"drivers": ["sd", "usb-storage"], "drivers": [
"driver_modules": ["sd_mod", "usb_storage"], "sd",
"usb-storage"
],
"driver_modules": [
"sd_mod",
"usb_storage"
],
"module_alias": "usb:v05E3p0749d1532dc00dsc00dp00ic08isc06ip50in00" "module_alias": "usb:v05E3p0749d1532dc00dsc00dp00ic08isc06ip50in00"
} }
], ],
@@ -846,7 +917,10 @@
{ {
"index": 21, "index": 21,
"attached_to": 0, "attached_to": 0,
"class_list": ["graphics_card", "pci"], "class_list": [
"graphics_card",
"pci"
],
"bus_type": { "bus_type": {
"hex": "0004", "hex": "0004",
"name": "PCI", "name": "PCI",
@@ -941,8 +1015,12 @@
}, },
"driver": "i915", "driver": "i915",
"driver_module": "i915", "driver_module": "i915",
"drivers": ["i915"], "drivers": [
"driver_modules": ["i915"], "i915"
],
"driver_modules": [
"i915"
],
"module_alias": "pci:v00008086d000046D1sv00008086sd00007270bc03sc00i00", "module_alias": "pci:v00008086d000046D1sv00008086sd00007270bc03sc00i00",
"label": "Onboard - Video" "label": "Onboard - Video"
} }
@@ -951,7 +1029,10 @@
{ {
"index": 32, "index": 32,
"attached_to": 22, "attached_to": 22,
"class_list": ["usb", "hub"], "class_list": [
"usb",
"hub"
],
"bus_type": { "bus_type": {
"hex": "0086", "hex": "0086",
"name": "USB", "name": "USB",
@@ -1024,14 +1105,21 @@
"hotplug": "usb", "hotplug": "usb",
"driver": "hub", "driver": "hub",
"driver_module": "usbcore", "driver_module": "usbcore",
"drivers": ["hub"], "drivers": [
"driver_modules": ["usbcore"], "hub"
],
"driver_modules": [
"usbcore"
],
"module_alias": "usb:v1D6Bp0002d0615dc09dsc00dp01ic09isc00ip00in00" "module_alias": "usb:v1D6Bp0002d0615dc09dsc00dp01ic09isc00ip00in00"
}, },
{ {
"index": 34, "index": 34,
"attached_to": 22, "attached_to": 22,
"class_list": ["usb", "hub"], "class_list": [
"usb",
"hub"
],
"bus_type": { "bus_type": {
"hex": "0086", "hex": "0086",
"name": "USB", "name": "USB",
@@ -1094,14 +1182,21 @@
"hotplug": "usb", "hotplug": "usb",
"driver": "hub", "driver": "hub",
"driver_module": "usbcore", "driver_module": "usbcore",
"drivers": ["hub"], "drivers": [
"driver_modules": ["usbcore"], "hub"
],
"driver_modules": [
"usbcore"
],
"module_alias": "usb:v1D6Bp0003d0615dc09dsc00dp03ic09isc00ip00in00" "module_alias": "usb:v1D6Bp0003d0615dc09dsc00dp03ic09isc00ip00in00"
}, },
{ {
"index": 35, "index": 35,
"attached_to": 9, "attached_to": 9,
"class_list": ["usb", "hub"], "class_list": [
"usb",
"hub"
],
"bus_type": { "bus_type": {
"hex": "0086", "hex": "0086",
"name": "USB", "name": "USB",
@@ -1174,14 +1269,21 @@
"hotplug": "usb", "hotplug": "usb",
"driver": "hub", "driver": "hub",
"driver_module": "usbcore", "driver_module": "usbcore",
"drivers": ["hub"], "drivers": [
"driver_modules": ["usbcore"], "hub"
],
"driver_modules": [
"usbcore"
],
"module_alias": "usb:v1D6Bp0002d0615dc09dsc00dp01ic09isc00ip00in00" "module_alias": "usb:v1D6Bp0002d0615dc09dsc00dp01ic09isc00ip00in00"
}, },
{ {
"index": 37, "index": 37,
"attached_to": 9, "attached_to": 9,
"class_list": ["usb", "hub"], "class_list": [
"usb",
"hub"
],
"bus_type": { "bus_type": {
"hex": "0086", "hex": "0086",
"name": "USB", "name": "USB",
@@ -1244,8 +1346,12 @@
"hotplug": "usb", "hotplug": "usb",
"driver": "hub", "driver": "hub",
"driver_module": "usbcore", "driver_module": "usbcore",
"drivers": ["hub"], "drivers": [
"driver_modules": ["usbcore"], "hub"
],
"driver_modules": [
"usbcore"
],
"module_alias": "usb:v1D6Bp0003d0615dc09dsc00dp03ic09isc00ip00in00" "module_alias": "usb:v1D6Bp0003d0615dc09dsc00dp03ic09isc00ip00in00"
} }
], ],
@@ -1253,7 +1359,9 @@
{ {
"index": 7, "index": 7,
"attached_to": 0, "attached_to": 0,
"class_list": ["memory"], "class_list": [
"memory"
],
"base_class": { "base_class": {
"hex": "0101", "hex": "0101",
"name": "Internally Used Class", "name": "Internally Used Class",
@@ -1285,7 +1393,9 @@
{ {
"index": 25, "index": 25,
"attached_to": 0, "attached_to": 0,
"class_list": ["mmc_controller"], "class_list": [
"mmc_controller"
],
"bus_type": { "bus_type": {
"hex": "0093", "hex": "0093",
"name": "MMC", "name": "MMC",
@@ -1306,14 +1416,18 @@
"sysfs_id": "/devices/pci0000:00/0000:00:1a.0/mmc_host/mmc0/mmc0:0001", "sysfs_id": "/devices/pci0000:00/0000:00:1a.0/mmc_host/mmc0/mmc0:0001",
"sysfs_bus_id": "mmc0:0001", "sysfs_bus_id": "mmc0:0001",
"driver": "mmcblk", "driver": "mmcblk",
"drivers": ["mmcblk"] "drivers": [
"mmcblk"
]
} }
], ],
"monitor": [ "monitor": [
{ {
"index": 26, "index": 26,
"attached_to": 21, "attached_to": 21,
"class_list": ["monitor"], "class_list": [
"monitor"
],
"base_class": { "base_class": {
"hex": "0100", "hex": "0100",
"name": "Monitor", "name": "Monitor",
@@ -1460,7 +1574,10 @@
{ {
"index": 11, "index": 11,
"attached_to": 19, "attached_to": 19,
"class_list": ["network_controller", "pci"], "class_list": [
"network_controller",
"pci"
],
"bus_type": { "bus_type": {
"hex": "0004", "hex": "0004",
"name": "PCI", "name": "PCI",
@@ -1506,7 +1623,9 @@
"sysfs_id": "/devices/pci0000:00/0000:00:1c.6/0000:02:00.0", "sysfs_id": "/devices/pci0000:00/0000:00:1c.6/0000:02:00.0",
"sysfs_bus_id": "0000:02:00.0", "sysfs_bus_id": "0000:02:00.0",
"unix_device_name": "enp2s0", "unix_device_name": "enp2s0",
"unix_device_names": ["enp2s0"], "unix_device_names": [
"enp2s0"
],
"resources": [ "resources": [
{ {
"type": "hwaddr", "type": "hwaddr",
@@ -1557,14 +1676,22 @@
}, },
"driver": "igc", "driver": "igc",
"driver_module": "igc", "driver_module": "igc",
"drivers": ["igc"], "drivers": [
"driver_modules": ["igc"], "igc"
],
"driver_modules": [
"igc"
],
"module_alias": "pci:v00008086d0000125Csv00008086sd00000000bc02sc00i00" "module_alias": "pci:v00008086d0000125Csv00008086sd00000000bc02sc00i00"
}, },
{ {
"index": 13, "index": 13,
"attached_to": 8, "attached_to": 8,
"class_list": ["network_controller", "pci", "wlan_card"], "class_list": [
"network_controller",
"pci",
"wlan_card"
],
"bus_type": { "bus_type": {
"hex": "0004", "hex": "0004",
"name": "PCI", "name": "PCI",
@@ -1604,7 +1731,9 @@
"sysfs_id": "/devices/pci0000:00/0000:00:1c.0/0000:01:00.0", "sysfs_id": "/devices/pci0000:00/0000:00:1c.0/0000:01:00.0",
"sysfs_bus_id": "0000:01:00.0", "sysfs_bus_id": "0000:01:00.0",
"unix_device_name": "wlan0", "unix_device_name": "wlan0",
"unix_device_names": ["wlan0"], "unix_device_names": [
"wlan0"
],
"resources": [ "resources": [
{ {
"type": "hwaddr", "type": "hwaddr",
@@ -1705,8 +1834,18 @@
"5.66", "5.66",
"5.68" "5.68"
], ],
"auth_modes": ["open", "sharedkey", "wpa-psk", "wpa-eap"], "auth_modes": [
"enc_modes": ["WEP40", "WEP104", "TKIP", "CCMP"] "open",
"sharedkey",
"wpa-psk",
"wpa-eap"
],
"enc_modes": [
"WEP40",
"WEP104",
"TKIP",
"CCMP"
]
} }
], ],
"detail": { "detail": {
@@ -1719,8 +1858,12 @@
}, },
"driver": "rtw89_8852be", "driver": "rtw89_8852be",
"driver_module": "rtw89_8852be", "driver_module": "rtw89_8852be",
"drivers": ["rtw89_8852be"], "drivers": [
"driver_modules": ["rtw89_8852be"], "rtw89_8852be"
],
"driver_modules": [
"rtw89_8852be"
],
"module_alias": "pci:v000010ECd0000B852sv00001A3Bsd00005480bc02sc80i00" "module_alias": "pci:v000010ECd0000B852sv00001A3Bsd00005480bc02sc80i00"
} }
], ],
@@ -1728,7 +1871,9 @@
{ {
"index": 38, "index": 38,
"attached_to": 11, "attached_to": 11,
"class_list": ["network_interface"], "class_list": [
"network_interface"
],
"base_class": { "base_class": {
"hex": "0107", "hex": "0107",
"name": "Network Interface", "name": "Network Interface",
@@ -1743,7 +1888,9 @@
"sysfs_id": "/class/net/enp2s0", "sysfs_id": "/class/net/enp2s0",
"sysfs_device_link": "/devices/pci0000:00/0000:00:1c.6/0000:02:00.0", "sysfs_device_link": "/devices/pci0000:00/0000:00:1c.6/0000:02:00.0",
"unix_device_name": "enp2s0", "unix_device_name": "enp2s0",
"unix_device_names": ["enp2s0"], "unix_device_names": [
"enp2s0"
],
"resources": [ "resources": [
{ {
"type": "hwaddr", "type": "hwaddr",
@@ -1756,13 +1903,19 @@
], ],
"driver": "igc", "driver": "igc",
"driver_module": "igc", "driver_module": "igc",
"drivers": ["igc"], "drivers": [
"driver_modules": ["igc"] "igc"
],
"driver_modules": [
"igc"
]
}, },
{ {
"index": 39, "index": 39,
"attached_to": 0, "attached_to": 0,
"class_list": ["network_interface"], "class_list": [
"network_interface"
],
"base_class": { "base_class": {
"hex": "0107", "hex": "0107",
"name": "Network Interface", "name": "Network Interface",
@@ -1776,12 +1929,16 @@
"model": "Loopback network interface", "model": "Loopback network interface",
"sysfs_id": "/class/net/lo", "sysfs_id": "/class/net/lo",
"unix_device_name": "lo", "unix_device_name": "lo",
"unix_device_names": ["lo"] "unix_device_names": [
"lo"
]
}, },
{ {
"index": 40, "index": 40,
"attached_to": 13, "attached_to": 13,
"class_list": ["network_interface"], "class_list": [
"network_interface"
],
"base_class": { "base_class": {
"hex": "0107", "hex": "0107",
"name": "Network Interface", "name": "Network Interface",
@@ -1796,7 +1953,9 @@
"sysfs_id": "/class/net/wlan0", "sysfs_id": "/class/net/wlan0",
"sysfs_device_link": "/devices/pci0000:00/0000:00:1c.0/0000:01:00.0", "sysfs_device_link": "/devices/pci0000:00/0000:00:1c.0/0000:01:00.0",
"unix_device_name": "wlan0", "unix_device_name": "wlan0",
"unix_device_names": ["wlan0"], "unix_device_names": [
"wlan0"
],
"resources": [ "resources": [
{ {
"type": "hwaddr", "type": "hwaddr",
@@ -1809,15 +1968,22 @@
], ],
"driver": "rtw89_8852be", "driver": "rtw89_8852be",
"driver_module": "rtw89_8852be", "driver_module": "rtw89_8852be",
"drivers": ["rtw89_8852be"], "drivers": [
"driver_modules": ["rtw89_8852be"] "rtw89_8852be"
],
"driver_modules": [
"rtw89_8852be"
]
} }
], ],
"pci": [ "pci": [
{ {
"index": 12, "index": 12,
"attached_to": 0, "attached_to": 0,
"class_list": ["pci", "unknown"], "class_list": [
"pci",
"unknown"
],
"bus_type": { "bus_type": {
"hex": "0004", "hex": "0004",
"name": "PCI", "name": "PCI",
@@ -1884,15 +2050,22 @@
}, },
"driver": "mei_me", "driver": "mei_me",
"driver_module": "mei_me", "driver_module": "mei_me",
"drivers": ["mei_me"], "drivers": [
"driver_modules": ["mei_me"], "mei_me"
],
"driver_modules": [
"mei_me"
],
"module_alias": "pci:v00008086d000054E0sv00008086sd00007270bc07sc80i00", "module_alias": "pci:v00008086d000054E0sv00008086sd00007270bc07sc80i00",
"label": "Onboard - Other" "label": "Onboard - Other"
}, },
{ {
"index": 14, "index": 14,
"attached_to": 0, "attached_to": 0,
"class_list": ["pci", "unknown"], "class_list": [
"pci",
"unknown"
],
"bus_type": { "bus_type": {
"hex": "0004", "hex": "0004",
"name": "PCI", "name": "PCI",
@@ -1952,15 +2125,22 @@
}, },
"driver": "intel-spi", "driver": "intel-spi",
"driver_module": "spi_intel_pci", "driver_module": "spi_intel_pci",
"drivers": ["intel-spi"], "drivers": [
"driver_modules": ["spi_intel_pci"], "intel-spi"
],
"driver_modules": [
"spi_intel_pci"
],
"module_alias": "pci:v00008086d000054A4sv00008086sd00007270bc0Csc80i00", "module_alias": "pci:v00008086d000054A4sv00008086sd00007270bc0Csc80i00",
"label": "Onboard - Other" "label": "Onboard - Other"
}, },
{ {
"index": 17, "index": 17,
"attached_to": 0, "attached_to": 0,
"class_list": ["pci", "unknown"], "class_list": [
"pci",
"unknown"
],
"bus_type": { "bus_type": {
"hex": "0004", "hex": "0004",
"name": "PCI", "name": "PCI",
@@ -2036,7 +2216,10 @@
{ {
"index": 18, "index": 18,
"attached_to": 0, "attached_to": 0,
"class_list": ["pci", "unknown"], "class_list": [
"pci",
"unknown"
],
"bus_type": { "bus_type": {
"hex": "0004", "hex": "0004",
"name": "PCI", "name": "PCI",
@@ -2106,15 +2289,22 @@
}, },
"driver": "sdhci-pci", "driver": "sdhci-pci",
"driver_module": "sdhci_pci", "driver_module": "sdhci_pci",
"drivers": ["sdhci-pci"], "drivers": [
"driver_modules": ["sdhci_pci"], "sdhci-pci"
],
"driver_modules": [
"sdhci_pci"
],
"module_alias": "pci:v00008086d000054C4sv00008086sd00007270bc08sc05i01", "module_alias": "pci:v00008086d000054C4sv00008086sd00007270bc08sc05i01",
"label": "Onboard - Other" "label": "Onboard - Other"
}, },
{ {
"index": 20, "index": 20,
"attached_to": 0, "attached_to": 0,
"class_list": ["pci", "unknown"], "class_list": [
"pci",
"unknown"
],
"bus_type": { "bus_type": {
"hex": "0004", "hex": "0004",
"name": "PCI", "name": "PCI",
@@ -2187,7 +2377,10 @@
{ {
"index": 23, "index": 23,
"attached_to": 0, "attached_to": 0,
"class_list": ["pci", "unknown"], "class_list": [
"pci",
"unknown"
],
"bus_type": { "bus_type": {
"hex": "0004", "hex": "0004",
"name": "PCI", "name": "PCI",
@@ -2261,15 +2454,22 @@
}, },
"driver": "i801_smbus", "driver": "i801_smbus",
"driver_module": "i2c_i801", "driver_module": "i2c_i801",
"drivers": ["i801_smbus"], "drivers": [
"driver_modules": ["i2c_i801"], "i801_smbus"
],
"driver_modules": [
"i2c_i801"
],
"module_alias": "pci:v00008086d000054A3sv00008086sd00007270bc0Csc05i00", "module_alias": "pci:v00008086d000054A3sv00008086sd00007270bc0Csc05i00",
"label": "Onboard - Other" "label": "Onboard - Other"
}, },
{ {
"index": 24, "index": 24,
"attached_to": 0, "attached_to": 0,
"class_list": ["pci", "unknown"], "class_list": [
"pci",
"unknown"
],
"bus_type": { "bus_type": {
"hex": "0004", "hex": "0004",
"name": "PCI", "name": "PCI",
@@ -2334,8 +2534,12 @@
}, },
"driver": "intel_vsec", "driver": "intel_vsec",
"driver_module": "intel_vsec", "driver_module": "intel_vsec",
"drivers": ["intel_vsec"], "drivers": [
"driver_modules": ["intel_vsec"], "intel_vsec"
],
"driver_modules": [
"intel_vsec"
],
"module_alias": "pci:v00008086d0000467Dsv00008086sd00007270bc11sc80i00", "module_alias": "pci:v00008086d0000467Dsv00008086sd00007270bc11sc80i00",
"label": "Onboard - Other" "label": "Onboard - Other"
} }
@@ -2344,7 +2548,10 @@
{ {
"index": 15, "index": 15,
"attached_to": 0, "attached_to": 0,
"class_list": ["sound", "pci"], "class_list": [
"sound",
"pci"
],
"bus_type": { "bus_type": {
"hex": "0004", "hex": "0004",
"name": "PCI", "name": "PCI",
@@ -2418,8 +2625,12 @@
}, },
"driver": "snd_hda_intel", "driver": "snd_hda_intel",
"driver_module": "snd_hda_intel", "driver_module": "snd_hda_intel",
"drivers": ["snd_hda_intel"], "drivers": [
"driver_modules": ["snd_hda_intel"], "snd_hda_intel"
],
"driver_modules": [
"snd_hda_intel"
],
"module_alias": "pci:v00008086d000054C8sv00008086sd00007270bc04sc03i00", "module_alias": "pci:v00008086d000054C8sv00008086sd00007270bc04sc03i00",
"label": "Onboard - Sound" "label": "Onboard - Sound"
} }
@@ -2431,7 +2642,10 @@
{ {
"index": 9, "index": 9,
"attached_to": 0, "attached_to": 0,
"class_list": ["usb_controller", "pci"], "class_list": [
"usb_controller",
"pci"
],
"bus_type": { "bus_type": {
"hex": "0004", "hex": "0004",
"name": "PCI", "name": "PCI",
@@ -2502,15 +2716,22 @@
}, },
"driver": "xhci_hcd", "driver": "xhci_hcd",
"driver_module": "xhci_pci", "driver_module": "xhci_pci",
"drivers": ["xhci_hcd"], "drivers": [
"driver_modules": ["xhci_pci"], "xhci_hcd"
],
"driver_modules": [
"xhci_pci"
],
"module_alias": "pci:v00008086d0000464Esv00008086sd00007270bc0Csc03i30", "module_alias": "pci:v00008086d0000464Esv00008086sd00007270bc0Csc03i30",
"label": "Onboard - Other" "label": "Onboard - Other"
}, },
{ {
"index": 22, "index": 22,
"attached_to": 0, "attached_to": 0,
"class_list": ["usb_controller", "pci"], "class_list": [
"usb_controller",
"pci"
],
"bus_type": { "bus_type": {
"hex": "0004", "hex": "0004",
"name": "PCI", "name": "PCI",
@@ -2581,8 +2802,12 @@
}, },
"driver": "xhci_hcd", "driver": "xhci_hcd",
"driver_module": "xhci_pci", "driver_module": "xhci_pci",
"drivers": ["xhci_hcd"], "drivers": [
"driver_modules": ["xhci_pci"], "xhci_hcd"
],
"driver_modules": [
"xhci_pci"
],
"module_alias": "pci:v00008086d000054EDsv00008086sd00007270bc0Csc03i30", "module_alias": "pci:v00008086d000054EDsv00008086sd00007270bc0Csc03i30",
"label": "Onboard - Other" "label": "Onboard - Other"
} }
@@ -2629,7 +2854,10 @@
"name": "Motherboard", "name": "Motherboard",
"value": 10 "value": 10
}, },
"features": ["Hosting Board", "Replaceable"], "features": [
"Hosting Board",
"Replaceable"
],
"location": "Default string", "location": "Default string",
"chassis": 3 "chassis": 3
}, },
@@ -2668,8 +2896,12 @@
"name": "8-way Set-Associative", "name": "8-way Set-Associative",
"value": 7 "value": 7
}, },
"sram_type_current": ["Synchronous"], "sram_type_current": [
"sram_type_supported": ["Synchronous"] "Synchronous"
],
"sram_type_supported": [
"Synchronous"
]
}, },
{ {
"handle": 55, "handle": 55,
@@ -2705,8 +2937,12 @@
"name": "8-way Set-Associative", "name": "8-way Set-Associative",
"value": 7 "value": 7
}, },
"sram_type_current": ["Synchronous"], "sram_type_current": [
"sram_type_supported": ["Synchronous"] "Synchronous"
],
"sram_type_supported": [
"Synchronous"
]
}, },
{ {
"handle": 56, "handle": 56,
@@ -2742,8 +2978,12 @@
"name": "16-way Set-Associative", "name": "16-way Set-Associative",
"value": 8 "value": 8
}, },
"sram_type_current": ["Synchronous"], "sram_type_current": [
"sram_type_supported": ["Synchronous"] "Synchronous"
],
"sram_type_supported": [
"Synchronous"
]
}, },
{ {
"handle": 57, "handle": 57,
@@ -2779,8 +3019,12 @@
"name": "Other", "name": "Other",
"value": 9 "value": 9
}, },
"sram_type_current": ["Synchronous"], "sram_type_current": [
"sram_type_supported": ["Synchronous"] "Synchronous"
],
"sram_type_supported": [
"Synchronous"
]
} }
], ],
"chassis": [ "chassis": [
@@ -2819,19 +3063,27 @@
], ],
"config": { "config": {
"handle": 16, "handle": 16,
"options": ["Default string"] "options": [
"Default string"
]
}, },
"group_associations": [ "group_associations": [
{ {
"handle": 119, "handle": 119,
"name": "$MEI", "name": "$MEI",
"handles": [0] "handles": [
0
]
}, },
{ {
"handle": 122, "handle": 122,
"name": "Firmware Version Info", "name": "Firmware Version Info",
"handles": [ "handles": [
214748364849, 219043332146, 223338299443, 227633266740, 313532612661, 214748364849,
219043332146,
223338299443,
227633266740,
313532612661,
4471060955209 4471060955209
] ]
} }
@@ -2839,11 +3091,15 @@
"language": [ "language": [
{ {
"handle": 17, "handle": 17,
"languages": ["en|US|iso8859-1"] "languages": [
"en|US|iso8859-1"
]
}, },
{ {
"handle": 75, "handle": 75,
"languages": ["enUS"] "languages": [
"enUS"
]
} }
], ],
"memory_array": [ "memory_array": [
@@ -2951,7 +3207,9 @@
"name": "Other", "name": "Other",
"value": 30 "value": 30
}, },
"memory_type_details": ["Synchronous"], "memory_type_details": [
"Synchronous"
],
"speed": 6400 "speed": 6400
}, },
{ {
@@ -2976,7 +3234,9 @@
"name": "Other", "name": "Other",
"value": 30 "value": 30
}, },
"memory_type_details": ["Synchronous"], "memory_type_details": [
"Synchronous"
],
"speed": 6400 "speed": 6400
} }
], ],
@@ -3730,7 +3990,10 @@
"value": 3 "value": 3
}, },
"id": 1, "id": 1,
"features": ["3.3 V", "PME#"] "features": [
"3.3 V",
"PME#"
]
}, },
{ {
"handle": 10, "handle": 10,
@@ -3756,7 +4019,10 @@
"value": 3 "value": 3
}, },
"id": 1, "id": 1,
"features": ["3.3 V", "PME#"] "features": [
"3.3 V",
"PME#"
]
}, },
{ {
"handle": 11, "handle": 11,
@@ -3782,7 +4048,10 @@
"value": 3 "value": 3
}, },
"id": 1, "id": 1,
"features": ["3.3 V", "PME#"] "features": [
"3.3 V",
"PME#"
]
}, },
{ {
"handle": 12, "handle": 12,
@@ -3808,7 +4077,10 @@
"value": 3 "value": 3
}, },
"id": 1, "id": 1,
"features": ["3.3 V", "PME#"] "features": [
"3.3 V",
"PME#"
]
}, },
{ {
"handle": 13, "handle": 13,
@@ -3834,7 +4106,10 @@
"value": 3 "value": 3
}, },
"id": 1, "id": 1,
"features": ["3.3 V", "PME#"] "features": [
"3.3 V",
"PME#"
]
} }
], ],
"system": { "system": {

View File

@@ -7,7 +7,7 @@
clan.core.sops.defaultGroups = [ "admins" ]; clan.core.sops.defaultGroups = [ "admins" ];
# clan.core.networking.targetHost = "root@"; # clan.core.networking.targetHost = "root@";
clan.core.settings.name = "alpheratz"; clan.meta.name = "alpheratz";
# clan.meta.description = "Radxa X4 SBC board for one of w phone network."; clan.meta.description = "Radxa X4 SBC board for one of w phone network.";
} }

View File

@@ -19,18 +19,4 @@
services.nginx.virtualHosts."${config.networking.fqdn}" = { services.nginx.virtualHosts."${config.networking.fqdn}" = {
enableACME = true; enableACME = true;
}; };
clan.core.vars.generators.acme = {
share = true;
files.email.secret = false;
prompts.email = {
type = "line";
description = "Email for ACME registeration";
};
script = ''
cat $prompts/email > $out/email
'';
};
} }

View File

@@ -19,7 +19,7 @@ in
services.nextcloud = { services.nextcloud = {
hostName = ncDomain; hostName = ncDomain;
package = pkgs.nextcloud32; package = pkgs.nextcloud31;
settings = { settings = {

View File

@@ -0,0 +1,45 @@
{
pkgs,
config,
...
}:
let
serviceName = "${config.networking.hostName}-pingvin";
domain-name = "${
config.clan.core.vars.generators."${serviceName}".files.subdomain.value
}.${config.networking.fqdn}";
in
{
clan.core.vars.generators."${serviceName}" = {
files = {
subdomain.secret = false;
};
prompts = {
subdomain = {
persist = true;
type = "line";
description = "Sub-domain for Pingvin. Default:(share)";
};
};
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 "share" > "$out"/subdomain
fi
'';
};
services.pingvin-share = {
nginx.enable = true;
https = true;
hostname = domain-name;
};
}

View File

@@ -1,13 +0,0 @@
{ config, ... }:
{
nixpkgs.hostPlatform = {
system = "x86_64-linux";
};
system.stateVersion = "25.11";
clan.core.sops.defaultGroups = [ "admins" ];
# clan.core.networking.targetHost = "root@";
clan.core.settings.name = "buna";
# clan.meta.description = "Radxa X4 SBC board for one of w phone network. (With w whitehouse)";
}

View File

@@ -1,56 +0,0 @@
{ ... }:
let
hashDisk = disk: "os-${builtins.substring 0 5 (builtins.hashString "sha256" disk)}";
os = "/dev/disk/by-id/usb-Generic_MassStorageClass_000000001539-0:0";
in
{
boot.loader = {
systemd-boot = {
enable = true;
};
efi = {
canTouchEfiVariables = 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"
];
};
};
};
};
};
};
};
}

File diff suppressed because it is too large Load Diff

View File

@@ -7,7 +7,7 @@
clan.core.sops.defaultGroups = [ "admins" ]; clan.core.sops.defaultGroups = [ "admins" ];
# clan.core.networking.targetHost = "root@"; # clan.core.networking.targetHost = "root@";
clan.core.settings.name = "mirach"; clan.meta.name = "mirach";
# clan.meta.description = "Radxa X4 SBC board for one of w phone network."; clan.meta.description = "Radxa X4 SBC board for one of w phone network.";
} }

View File

@@ -25,7 +25,10 @@
{ {
"index": 31, "index": 31,
"attached_to": 32, "attached_to": 32,
"class_list": ["usb", "bluetooth"], "class_list": [
"usb",
"bluetooth"
],
"bus_type": { "bus_type": {
"hex": "0086", "hex": "0086",
"name": "USB", "name": "USB",
@@ -93,14 +96,21 @@
"hotplug": "usb", "hotplug": "usb",
"driver": "btusb", "driver": "btusb",
"driver_module": "btusb", "driver_module": "btusb",
"drivers": ["btusb"], "drivers": [
"driver_modules": ["btusb"], "btusb"
],
"driver_modules": [
"btusb"
],
"module_alias": "usb:v13D3p3572d0000dcE0dsc01dp01icE0isc01ip01in00" "module_alias": "usb:v13D3p3572d0000dcE0dsc01dp01icE0isc01ip01in00"
}, },
{ {
"index": 33, "index": 33,
"attached_to": 32, "attached_to": 32,
"class_list": ["usb", "bluetooth"], "class_list": [
"usb",
"bluetooth"
],
"bus_type": { "bus_type": {
"hex": "0086", "hex": "0086",
"name": "USB", "name": "USB",
@@ -168,8 +178,12 @@
"hotplug": "usb", "hotplug": "usb",
"driver": "btusb", "driver": "btusb",
"driver_module": "btusb", "driver_module": "btusb",
"drivers": ["btusb"], "drivers": [
"driver_modules": ["btusb"], "btusb"
],
"driver_modules": [
"btusb"
],
"module_alias": "usb:v13D3p3572d0000dcE0dsc01dp01icE0isc01ip01in01" "module_alias": "usb:v13D3p3572d0000dcE0dsc01dp01icE0isc01ip01in01"
} }
], ],
@@ -177,7 +191,10 @@
{ {
"index": 8, "index": 8,
"attached_to": 0, "attached_to": 0,
"class_list": ["pci", "bridge"], "class_list": [
"pci",
"bridge"
],
"bus_type": { "bus_type": {
"hex": "0004", "hex": "0004",
"name": "PCI", "name": "PCI",
@@ -241,14 +258,21 @@
}, },
"driver": "pcieport", "driver": "pcieport",
"driver_module": "pcieportdrv", "driver_module": "pcieportdrv",
"drivers": ["pcieport"], "drivers": [
"driver_modules": ["pcieportdrv"], "pcieport"
],
"driver_modules": [
"pcieportdrv"
],
"module_alias": "pci:v00008086d000054BBsv00008086sd00007270bc06sc04i00" "module_alias": "pci:v00008086d000054BBsv00008086sd00007270bc06sc04i00"
}, },
{ {
"index": 10, "index": 10,
"attached_to": 0, "attached_to": 0,
"class_list": ["pci", "bridge"], "class_list": [
"pci",
"bridge"
],
"bus_type": { "bus_type": {
"hex": "0004", "hex": "0004",
"name": "PCI", "name": "PCI",
@@ -303,7 +327,10 @@
{ {
"index": 16, "index": 16,
"attached_to": 0, "attached_to": 0,
"class_list": ["pci", "bridge"], "class_list": [
"pci",
"bridge"
],
"bus_type": { "bus_type": {
"hex": "0004", "hex": "0004",
"name": "PCI", "name": "PCI",
@@ -354,15 +381,22 @@
}, },
"driver": "igen6_edac", "driver": "igen6_edac",
"driver_module": "igen6_edac", "driver_module": "igen6_edac",
"drivers": ["igen6_edac"], "drivers": [
"driver_modules": ["igen6_edac"], "igen6_edac"
],
"driver_modules": [
"igen6_edac"
],
"module_alias": "pci:v00008086d0000461Csv00008086sd00007270bc06sc00i00", "module_alias": "pci:v00008086d0000461Csv00008086sd00007270bc06sc00i00",
"label": "Onboard - Other" "label": "Onboard - Other"
}, },
{ {
"index": 19, "index": 19,
"attached_to": 0, "attached_to": 0,
"class_list": ["pci", "bridge"], "class_list": [
"pci",
"bridge"
],
"bus_type": { "bus_type": {
"hex": "0004", "hex": "0004",
"name": "PCI", "name": "PCI",
@@ -426,8 +460,12 @@
}, },
"driver": "pcieport", "driver": "pcieport",
"driver_module": "pcieportdrv", "driver_module": "pcieportdrv",
"drivers": ["pcieport"], "drivers": [
"driver_modules": ["pcieportdrv"], "pcieport"
],
"driver_modules": [
"pcieportdrv"
],
"module_alias": "pci:v00008086d000054BEsv00008086sd00007270bc06sc04i00" "module_alias": "pci:v00008086d000054BEsv00008086sd00007270bc06sc04i00"
} }
], ],
@@ -610,7 +648,10 @@
{ {
"index": 27, "index": 27,
"attached_to": 25, "attached_to": 25,
"class_list": ["disk", "block_device"], "class_list": [
"disk",
"block_device"
],
"base_class": { "base_class": {
"hex": "0106", "hex": "0106",
"name": "Mass Storage Device", "name": "Mass Storage Device",
@@ -655,13 +696,21 @@
], ],
"driver": "sdhci-pci", "driver": "sdhci-pci",
"driver_module": "sdhci_pci", "driver_module": "sdhci_pci",
"drivers": ["mmcblk", "sdhci-pci"], "drivers": [
"driver_modules": ["sdhci_pci"] "mmcblk",
"sdhci-pci"
],
"driver_modules": [
"sdhci_pci"
]
}, },
{ {
"index": 28, "index": 28,
"attached_to": 25, "attached_to": 25,
"class_list": ["disk", "block_device"], "class_list": [
"disk",
"block_device"
],
"base_class": { "base_class": {
"hex": "0106", "hex": "0106",
"name": "Mass Storage Device", "name": "Mass Storage Device",
@@ -683,7 +732,9 @@
"minor": 32, "minor": 32,
"range": 32 "range": 32
}, },
"unix_device_names": ["/dev/mmcblk0boot0"], "unix_device_names": [
"/dev/mmcblk0boot0"
],
"resources": [ "resources": [
{ {
"type": "disk_geo", "type": "disk_geo",
@@ -701,12 +752,17 @@
} }
], ],
"driver": "mmcblk", "driver": "mmcblk",
"drivers": ["mmcblk"] "drivers": [
"mmcblk"
]
}, },
{ {
"index": 29, "index": 29,
"attached_to": 25, "attached_to": 25,
"class_list": ["disk", "block_device"], "class_list": [
"disk",
"block_device"
],
"base_class": { "base_class": {
"hex": "0106", "hex": "0106",
"name": "Mass Storage Device", "name": "Mass Storage Device",
@@ -728,7 +784,9 @@
"minor": 64, "minor": 64,
"range": 32 "range": 32
}, },
"unix_device_names": ["/dev/mmcblk0boot1"], "unix_device_names": [
"/dev/mmcblk0boot1"
],
"resources": [ "resources": [
{ {
"type": "disk_geo", "type": "disk_geo",
@@ -746,12 +804,19 @@
} }
], ],
"driver": "mmcblk", "driver": "mmcblk",
"drivers": ["mmcblk"] "drivers": [
"mmcblk"
]
}, },
{ {
"index": 30, "index": 30,
"attached_to": 22, "attached_to": 22,
"class_list": ["disk", "usb", "scsi", "block_device"], "class_list": [
"disk",
"usb",
"scsi",
"block_device"
],
"bus_type": { "bus_type": {
"hex": "0084", "hex": "0084",
"name": "SCSI", "name": "SCSI",
@@ -837,8 +902,14 @@
], ],
"driver": "usb-storage", "driver": "usb-storage",
"driver_module": "usb_storage", "driver_module": "usb_storage",
"drivers": ["sd", "usb-storage"], "drivers": [
"driver_modules": ["sd_mod", "usb_storage"], "sd",
"usb-storage"
],
"driver_modules": [
"sd_mod",
"usb_storage"
],
"module_alias": "usb:v05E3p0749d1532dc00dsc00dp00ic08isc06ip50in00" "module_alias": "usb:v05E3p0749d1532dc00dsc00dp00ic08isc06ip50in00"
} }
], ],
@@ -846,7 +917,10 @@
{ {
"index": 21, "index": 21,
"attached_to": 0, "attached_to": 0,
"class_list": ["graphics_card", "pci"], "class_list": [
"graphics_card",
"pci"
],
"bus_type": { "bus_type": {
"hex": "0004", "hex": "0004",
"name": "PCI", "name": "PCI",
@@ -941,8 +1015,12 @@
}, },
"driver": "i915", "driver": "i915",
"driver_module": "i915", "driver_module": "i915",
"drivers": ["i915"], "drivers": [
"driver_modules": ["i915"], "i915"
],
"driver_modules": [
"i915"
],
"module_alias": "pci:v00008086d000046D1sv00008086sd00007270bc03sc00i00", "module_alias": "pci:v00008086d000046D1sv00008086sd00007270bc03sc00i00",
"label": "Onboard - Video" "label": "Onboard - Video"
} }
@@ -951,7 +1029,10 @@
{ {
"index": 32, "index": 32,
"attached_to": 22, "attached_to": 22,
"class_list": ["usb", "hub"], "class_list": [
"usb",
"hub"
],
"bus_type": { "bus_type": {
"hex": "0086", "hex": "0086",
"name": "USB", "name": "USB",
@@ -1024,14 +1105,21 @@
"hotplug": "usb", "hotplug": "usb",
"driver": "hub", "driver": "hub",
"driver_module": "usbcore", "driver_module": "usbcore",
"drivers": ["hub"], "drivers": [
"driver_modules": ["usbcore"], "hub"
],
"driver_modules": [
"usbcore"
],
"module_alias": "usb:v1D6Bp0002d0615dc09dsc00dp01ic09isc00ip00in00" "module_alias": "usb:v1D6Bp0002d0615dc09dsc00dp01ic09isc00ip00in00"
}, },
{ {
"index": 34, "index": 34,
"attached_to": 22, "attached_to": 22,
"class_list": ["usb", "hub"], "class_list": [
"usb",
"hub"
],
"bus_type": { "bus_type": {
"hex": "0086", "hex": "0086",
"name": "USB", "name": "USB",
@@ -1094,14 +1182,21 @@
"hotplug": "usb", "hotplug": "usb",
"driver": "hub", "driver": "hub",
"driver_module": "usbcore", "driver_module": "usbcore",
"drivers": ["hub"], "drivers": [
"driver_modules": ["usbcore"], "hub"
],
"driver_modules": [
"usbcore"
],
"module_alias": "usb:v1D6Bp0003d0615dc09dsc00dp03ic09isc00ip00in00" "module_alias": "usb:v1D6Bp0003d0615dc09dsc00dp03ic09isc00ip00in00"
}, },
{ {
"index": 35, "index": 35,
"attached_to": 9, "attached_to": 9,
"class_list": ["usb", "hub"], "class_list": [
"usb",
"hub"
],
"bus_type": { "bus_type": {
"hex": "0086", "hex": "0086",
"name": "USB", "name": "USB",
@@ -1174,14 +1269,21 @@
"hotplug": "usb", "hotplug": "usb",
"driver": "hub", "driver": "hub",
"driver_module": "usbcore", "driver_module": "usbcore",
"drivers": ["hub"], "drivers": [
"driver_modules": ["usbcore"], "hub"
],
"driver_modules": [
"usbcore"
],
"module_alias": "usb:v1D6Bp0002d0615dc09dsc00dp01ic09isc00ip00in00" "module_alias": "usb:v1D6Bp0002d0615dc09dsc00dp01ic09isc00ip00in00"
}, },
{ {
"index": 37, "index": 37,
"attached_to": 9, "attached_to": 9,
"class_list": ["usb", "hub"], "class_list": [
"usb",
"hub"
],
"bus_type": { "bus_type": {
"hex": "0086", "hex": "0086",
"name": "USB", "name": "USB",
@@ -1244,8 +1346,12 @@
"hotplug": "usb", "hotplug": "usb",
"driver": "hub", "driver": "hub",
"driver_module": "usbcore", "driver_module": "usbcore",
"drivers": ["hub"], "drivers": [
"driver_modules": ["usbcore"], "hub"
],
"driver_modules": [
"usbcore"
],
"module_alias": "usb:v1D6Bp0003d0615dc09dsc00dp03ic09isc00ip00in00" "module_alias": "usb:v1D6Bp0003d0615dc09dsc00dp03ic09isc00ip00in00"
} }
], ],
@@ -1253,7 +1359,9 @@
{ {
"index": 7, "index": 7,
"attached_to": 0, "attached_to": 0,
"class_list": ["memory"], "class_list": [
"memory"
],
"base_class": { "base_class": {
"hex": "0101", "hex": "0101",
"name": "Internally Used Class", "name": "Internally Used Class",
@@ -1285,7 +1393,9 @@
{ {
"index": 25, "index": 25,
"attached_to": 0, "attached_to": 0,
"class_list": ["mmc_controller"], "class_list": [
"mmc_controller"
],
"bus_type": { "bus_type": {
"hex": "0093", "hex": "0093",
"name": "MMC", "name": "MMC",
@@ -1306,14 +1416,18 @@
"sysfs_id": "/devices/pci0000:00/0000:00:1a.0/mmc_host/mmc0/mmc0:0001", "sysfs_id": "/devices/pci0000:00/0000:00:1a.0/mmc_host/mmc0/mmc0:0001",
"sysfs_bus_id": "mmc0:0001", "sysfs_bus_id": "mmc0:0001",
"driver": "mmcblk", "driver": "mmcblk",
"drivers": ["mmcblk"] "drivers": [
"mmcblk"
]
} }
], ],
"monitor": [ "monitor": [
{ {
"index": 26, "index": 26,
"attached_to": 21, "attached_to": 21,
"class_list": ["monitor"], "class_list": [
"monitor"
],
"base_class": { "base_class": {
"hex": "0100", "hex": "0100",
"name": "Monitor", "name": "Monitor",
@@ -1460,7 +1574,10 @@
{ {
"index": 11, "index": 11,
"attached_to": 19, "attached_to": 19,
"class_list": ["network_controller", "pci"], "class_list": [
"network_controller",
"pci"
],
"bus_type": { "bus_type": {
"hex": "0004", "hex": "0004",
"name": "PCI", "name": "PCI",
@@ -1506,7 +1623,9 @@
"sysfs_id": "/devices/pci0000:00/0000:00:1c.6/0000:02:00.0", "sysfs_id": "/devices/pci0000:00/0000:00:1c.6/0000:02:00.0",
"sysfs_bus_id": "0000:02:00.0", "sysfs_bus_id": "0000:02:00.0",
"unix_device_name": "enp2s0", "unix_device_name": "enp2s0",
"unix_device_names": ["enp2s0"], "unix_device_names": [
"enp2s0"
],
"resources": [ "resources": [
{ {
"type": "hwaddr", "type": "hwaddr",
@@ -1557,14 +1676,22 @@
}, },
"driver": "igc", "driver": "igc",
"driver_module": "igc", "driver_module": "igc",
"drivers": ["igc"], "drivers": [
"driver_modules": ["igc"], "igc"
],
"driver_modules": [
"igc"
],
"module_alias": "pci:v00008086d0000125Csv00008086sd00000000bc02sc00i00" "module_alias": "pci:v00008086d0000125Csv00008086sd00000000bc02sc00i00"
}, },
{ {
"index": 13, "index": 13,
"attached_to": 8, "attached_to": 8,
"class_list": ["network_controller", "pci", "wlan_card"], "class_list": [
"network_controller",
"pci",
"wlan_card"
],
"bus_type": { "bus_type": {
"hex": "0004", "hex": "0004",
"name": "PCI", "name": "PCI",
@@ -1604,7 +1731,9 @@
"sysfs_id": "/devices/pci0000:00/0000:00:1c.0/0000:01:00.0", "sysfs_id": "/devices/pci0000:00/0000:00:1c.0/0000:01:00.0",
"sysfs_bus_id": "0000:01:00.0", "sysfs_bus_id": "0000:01:00.0",
"unix_device_name": "wlan0", "unix_device_name": "wlan0",
"unix_device_names": ["wlan0"], "unix_device_names": [
"wlan0"
],
"resources": [ "resources": [
{ {
"type": "hwaddr", "type": "hwaddr",
@@ -1705,8 +1834,18 @@
"5.66", "5.66",
"5.68" "5.68"
], ],
"auth_modes": ["open", "sharedkey", "wpa-psk", "wpa-eap"], "auth_modes": [
"enc_modes": ["WEP40", "WEP104", "TKIP", "CCMP"] "open",
"sharedkey",
"wpa-psk",
"wpa-eap"
],
"enc_modes": [
"WEP40",
"WEP104",
"TKIP",
"CCMP"
]
} }
], ],
"detail": { "detail": {
@@ -1719,8 +1858,12 @@
}, },
"driver": "rtw89_8852be", "driver": "rtw89_8852be",
"driver_module": "rtw89_8852be", "driver_module": "rtw89_8852be",
"drivers": ["rtw89_8852be"], "drivers": [
"driver_modules": ["rtw89_8852be"], "rtw89_8852be"
],
"driver_modules": [
"rtw89_8852be"
],
"module_alias": "pci:v000010ECd0000B852sv00001A3Bsd00005480bc02sc80i00" "module_alias": "pci:v000010ECd0000B852sv00001A3Bsd00005480bc02sc80i00"
} }
], ],
@@ -1728,7 +1871,9 @@
{ {
"index": 38, "index": 38,
"attached_to": 11, "attached_to": 11,
"class_list": ["network_interface"], "class_list": [
"network_interface"
],
"base_class": { "base_class": {
"hex": "0107", "hex": "0107",
"name": "Network Interface", "name": "Network Interface",
@@ -1743,7 +1888,9 @@
"sysfs_id": "/class/net/enp2s0", "sysfs_id": "/class/net/enp2s0",
"sysfs_device_link": "/devices/pci0000:00/0000:00:1c.6/0000:02:00.0", "sysfs_device_link": "/devices/pci0000:00/0000:00:1c.6/0000:02:00.0",
"unix_device_name": "enp2s0", "unix_device_name": "enp2s0",
"unix_device_names": ["enp2s0"], "unix_device_names": [
"enp2s0"
],
"resources": [ "resources": [
{ {
"type": "hwaddr", "type": "hwaddr",
@@ -1756,13 +1903,19 @@
], ],
"driver": "igc", "driver": "igc",
"driver_module": "igc", "driver_module": "igc",
"drivers": ["igc"], "drivers": [
"driver_modules": ["igc"] "igc"
],
"driver_modules": [
"igc"
]
}, },
{ {
"index": 39, "index": 39,
"attached_to": 0, "attached_to": 0,
"class_list": ["network_interface"], "class_list": [
"network_interface"
],
"base_class": { "base_class": {
"hex": "0107", "hex": "0107",
"name": "Network Interface", "name": "Network Interface",
@@ -1776,12 +1929,16 @@
"model": "Loopback network interface", "model": "Loopback network interface",
"sysfs_id": "/class/net/lo", "sysfs_id": "/class/net/lo",
"unix_device_name": "lo", "unix_device_name": "lo",
"unix_device_names": ["lo"] "unix_device_names": [
"lo"
]
}, },
{ {
"index": 40, "index": 40,
"attached_to": 13, "attached_to": 13,
"class_list": ["network_interface"], "class_list": [
"network_interface"
],
"base_class": { "base_class": {
"hex": "0107", "hex": "0107",
"name": "Network Interface", "name": "Network Interface",
@@ -1796,7 +1953,9 @@
"sysfs_id": "/class/net/wlan0", "sysfs_id": "/class/net/wlan0",
"sysfs_device_link": "/devices/pci0000:00/0000:00:1c.0/0000:01:00.0", "sysfs_device_link": "/devices/pci0000:00/0000:00:1c.0/0000:01:00.0",
"unix_device_name": "wlan0", "unix_device_name": "wlan0",
"unix_device_names": ["wlan0"], "unix_device_names": [
"wlan0"
],
"resources": [ "resources": [
{ {
"type": "hwaddr", "type": "hwaddr",
@@ -1809,15 +1968,22 @@
], ],
"driver": "rtw89_8852be", "driver": "rtw89_8852be",
"driver_module": "rtw89_8852be", "driver_module": "rtw89_8852be",
"drivers": ["rtw89_8852be"], "drivers": [
"driver_modules": ["rtw89_8852be"] "rtw89_8852be"
],
"driver_modules": [
"rtw89_8852be"
]
} }
], ],
"pci": [ "pci": [
{ {
"index": 12, "index": 12,
"attached_to": 0, "attached_to": 0,
"class_list": ["pci", "unknown"], "class_list": [
"pci",
"unknown"
],
"bus_type": { "bus_type": {
"hex": "0004", "hex": "0004",
"name": "PCI", "name": "PCI",
@@ -1884,15 +2050,22 @@
}, },
"driver": "mei_me", "driver": "mei_me",
"driver_module": "mei_me", "driver_module": "mei_me",
"drivers": ["mei_me"], "drivers": [
"driver_modules": ["mei_me"], "mei_me"
],
"driver_modules": [
"mei_me"
],
"module_alias": "pci:v00008086d000054E0sv00008086sd00007270bc07sc80i00", "module_alias": "pci:v00008086d000054E0sv00008086sd00007270bc07sc80i00",
"label": "Onboard - Other" "label": "Onboard - Other"
}, },
{ {
"index": 14, "index": 14,
"attached_to": 0, "attached_to": 0,
"class_list": ["pci", "unknown"], "class_list": [
"pci",
"unknown"
],
"bus_type": { "bus_type": {
"hex": "0004", "hex": "0004",
"name": "PCI", "name": "PCI",
@@ -1952,15 +2125,22 @@
}, },
"driver": "intel-spi", "driver": "intel-spi",
"driver_module": "spi_intel_pci", "driver_module": "spi_intel_pci",
"drivers": ["intel-spi"], "drivers": [
"driver_modules": ["spi_intel_pci"], "intel-spi"
],
"driver_modules": [
"spi_intel_pci"
],
"module_alias": "pci:v00008086d000054A4sv00008086sd00007270bc0Csc80i00", "module_alias": "pci:v00008086d000054A4sv00008086sd00007270bc0Csc80i00",
"label": "Onboard - Other" "label": "Onboard - Other"
}, },
{ {
"index": 17, "index": 17,
"attached_to": 0, "attached_to": 0,
"class_list": ["pci", "unknown"], "class_list": [
"pci",
"unknown"
],
"bus_type": { "bus_type": {
"hex": "0004", "hex": "0004",
"name": "PCI", "name": "PCI",
@@ -2036,7 +2216,10 @@
{ {
"index": 18, "index": 18,
"attached_to": 0, "attached_to": 0,
"class_list": ["pci", "unknown"], "class_list": [
"pci",
"unknown"
],
"bus_type": { "bus_type": {
"hex": "0004", "hex": "0004",
"name": "PCI", "name": "PCI",
@@ -2106,15 +2289,22 @@
}, },
"driver": "sdhci-pci", "driver": "sdhci-pci",
"driver_module": "sdhci_pci", "driver_module": "sdhci_pci",
"drivers": ["sdhci-pci"], "drivers": [
"driver_modules": ["sdhci_pci"], "sdhci-pci"
],
"driver_modules": [
"sdhci_pci"
],
"module_alias": "pci:v00008086d000054C4sv00008086sd00007270bc08sc05i01", "module_alias": "pci:v00008086d000054C4sv00008086sd00007270bc08sc05i01",
"label": "Onboard - Other" "label": "Onboard - Other"
}, },
{ {
"index": 20, "index": 20,
"attached_to": 0, "attached_to": 0,
"class_list": ["pci", "unknown"], "class_list": [
"pci",
"unknown"
],
"bus_type": { "bus_type": {
"hex": "0004", "hex": "0004",
"name": "PCI", "name": "PCI",
@@ -2187,7 +2377,10 @@
{ {
"index": 23, "index": 23,
"attached_to": 0, "attached_to": 0,
"class_list": ["pci", "unknown"], "class_list": [
"pci",
"unknown"
],
"bus_type": { "bus_type": {
"hex": "0004", "hex": "0004",
"name": "PCI", "name": "PCI",
@@ -2261,15 +2454,22 @@
}, },
"driver": "i801_smbus", "driver": "i801_smbus",
"driver_module": "i2c_i801", "driver_module": "i2c_i801",
"drivers": ["i801_smbus"], "drivers": [
"driver_modules": ["i2c_i801"], "i801_smbus"
],
"driver_modules": [
"i2c_i801"
],
"module_alias": "pci:v00008086d000054A3sv00008086sd00007270bc0Csc05i00", "module_alias": "pci:v00008086d000054A3sv00008086sd00007270bc0Csc05i00",
"label": "Onboard - Other" "label": "Onboard - Other"
}, },
{ {
"index": 24, "index": 24,
"attached_to": 0, "attached_to": 0,
"class_list": ["pci", "unknown"], "class_list": [
"pci",
"unknown"
],
"bus_type": { "bus_type": {
"hex": "0004", "hex": "0004",
"name": "PCI", "name": "PCI",
@@ -2334,8 +2534,12 @@
}, },
"driver": "intel_vsec", "driver": "intel_vsec",
"driver_module": "intel_vsec", "driver_module": "intel_vsec",
"drivers": ["intel_vsec"], "drivers": [
"driver_modules": ["intel_vsec"], "intel_vsec"
],
"driver_modules": [
"intel_vsec"
],
"module_alias": "pci:v00008086d0000467Dsv00008086sd00007270bc11sc80i00", "module_alias": "pci:v00008086d0000467Dsv00008086sd00007270bc11sc80i00",
"label": "Onboard - Other" "label": "Onboard - Other"
} }
@@ -2344,7 +2548,10 @@
{ {
"index": 15, "index": 15,
"attached_to": 0, "attached_to": 0,
"class_list": ["sound", "pci"], "class_list": [
"sound",
"pci"
],
"bus_type": { "bus_type": {
"hex": "0004", "hex": "0004",
"name": "PCI", "name": "PCI",
@@ -2418,8 +2625,12 @@
}, },
"driver": "snd_hda_intel", "driver": "snd_hda_intel",
"driver_module": "snd_hda_intel", "driver_module": "snd_hda_intel",
"drivers": ["snd_hda_intel"], "drivers": [
"driver_modules": ["snd_hda_intel"], "snd_hda_intel"
],
"driver_modules": [
"snd_hda_intel"
],
"module_alias": "pci:v00008086d000054C8sv00008086sd00007270bc04sc03i00", "module_alias": "pci:v00008086d000054C8sv00008086sd00007270bc04sc03i00",
"label": "Onboard - Sound" "label": "Onboard - Sound"
} }
@@ -2431,7 +2642,10 @@
{ {
"index": 9, "index": 9,
"attached_to": 0, "attached_to": 0,
"class_list": ["usb_controller", "pci"], "class_list": [
"usb_controller",
"pci"
],
"bus_type": { "bus_type": {
"hex": "0004", "hex": "0004",
"name": "PCI", "name": "PCI",
@@ -2502,15 +2716,22 @@
}, },
"driver": "xhci_hcd", "driver": "xhci_hcd",
"driver_module": "xhci_pci", "driver_module": "xhci_pci",
"drivers": ["xhci_hcd"], "drivers": [
"driver_modules": ["xhci_pci"], "xhci_hcd"
],
"driver_modules": [
"xhci_pci"
],
"module_alias": "pci:v00008086d0000464Esv00008086sd00007270bc0Csc03i30", "module_alias": "pci:v00008086d0000464Esv00008086sd00007270bc0Csc03i30",
"label": "Onboard - Other" "label": "Onboard - Other"
}, },
{ {
"index": 22, "index": 22,
"attached_to": 0, "attached_to": 0,
"class_list": ["usb_controller", "pci"], "class_list": [
"usb_controller",
"pci"
],
"bus_type": { "bus_type": {
"hex": "0004", "hex": "0004",
"name": "PCI", "name": "PCI",
@@ -2581,8 +2802,12 @@
}, },
"driver": "xhci_hcd", "driver": "xhci_hcd",
"driver_module": "xhci_pci", "driver_module": "xhci_pci",
"drivers": ["xhci_hcd"], "drivers": [
"driver_modules": ["xhci_pci"], "xhci_hcd"
],
"driver_modules": [
"xhci_pci"
],
"module_alias": "pci:v00008086d000054EDsv00008086sd00007270bc0Csc03i30", "module_alias": "pci:v00008086d000054EDsv00008086sd00007270bc0Csc03i30",
"label": "Onboard - Other" "label": "Onboard - Other"
} }
@@ -2629,7 +2854,10 @@
"name": "Motherboard", "name": "Motherboard",
"value": 10 "value": 10
}, },
"features": ["Hosting Board", "Replaceable"], "features": [
"Hosting Board",
"Replaceable"
],
"location": "Default string", "location": "Default string",
"chassis": 3 "chassis": 3
}, },
@@ -2668,8 +2896,12 @@
"name": "8-way Set-Associative", "name": "8-way Set-Associative",
"value": 7 "value": 7
}, },
"sram_type_current": ["Synchronous"], "sram_type_current": [
"sram_type_supported": ["Synchronous"] "Synchronous"
],
"sram_type_supported": [
"Synchronous"
]
}, },
{ {
"handle": 55, "handle": 55,
@@ -2705,8 +2937,12 @@
"name": "8-way Set-Associative", "name": "8-way Set-Associative",
"value": 7 "value": 7
}, },
"sram_type_current": ["Synchronous"], "sram_type_current": [
"sram_type_supported": ["Synchronous"] "Synchronous"
],
"sram_type_supported": [
"Synchronous"
]
}, },
{ {
"handle": 56, "handle": 56,
@@ -2742,8 +2978,12 @@
"name": "16-way Set-Associative", "name": "16-way Set-Associative",
"value": 8 "value": 8
}, },
"sram_type_current": ["Synchronous"], "sram_type_current": [
"sram_type_supported": ["Synchronous"] "Synchronous"
],
"sram_type_supported": [
"Synchronous"
]
}, },
{ {
"handle": 57, "handle": 57,
@@ -2779,8 +3019,12 @@
"name": "Other", "name": "Other",
"value": 9 "value": 9
}, },
"sram_type_current": ["Synchronous"], "sram_type_current": [
"sram_type_supported": ["Synchronous"] "Synchronous"
],
"sram_type_supported": [
"Synchronous"
]
} }
], ],
"chassis": [ "chassis": [
@@ -2819,19 +3063,27 @@
], ],
"config": { "config": {
"handle": 16, "handle": 16,
"options": ["Default string"] "options": [
"Default string"
]
}, },
"group_associations": [ "group_associations": [
{ {
"handle": 119, "handle": 119,
"name": "$MEI", "name": "$MEI",
"handles": [0] "handles": [
0
]
}, },
{ {
"handle": 122, "handle": 122,
"name": "Firmware Version Info", "name": "Firmware Version Info",
"handles": [ "handles": [
214748364849, 219043332146, 223338299443, 227633266740, 313532612661, 214748364849,
219043332146,
223338299443,
227633266740,
313532612661,
4471060955209 4471060955209
] ]
} }
@@ -2839,11 +3091,15 @@
"language": [ "language": [
{ {
"handle": 17, "handle": 17,
"languages": ["en|US|iso8859-1"] "languages": [
"en|US|iso8859-1"
]
}, },
{ {
"handle": 75, "handle": 75,
"languages": ["enUS"] "languages": [
"enUS"
]
} }
], ],
"memory_array": [ "memory_array": [
@@ -2951,7 +3207,9 @@
"name": "Other", "name": "Other",
"value": 30 "value": 30
}, },
"memory_type_details": ["Synchronous"], "memory_type_details": [
"Synchronous"
],
"speed": 6400 "speed": 6400
}, },
{ {
@@ -2976,7 +3234,9 @@
"name": "Other", "name": "Other",
"value": 30 "value": 30
}, },
"memory_type_details": ["Synchronous"], "memory_type_details": [
"Synchronous"
],
"speed": 6400 "speed": 6400
} }
], ],
@@ -3730,7 +3990,10 @@
"value": 3 "value": 3
}, },
"id": 1, "id": 1,
"features": ["3.3 V", "PME#"] "features": [
"3.3 V",
"PME#"
]
}, },
{ {
"handle": 10, "handle": 10,
@@ -3756,7 +4019,10 @@
"value": 3 "value": 3
}, },
"id": 1, "id": 1,
"features": ["3.3 V", "PME#"] "features": [
"3.3 V",
"PME#"
]
}, },
{ {
"handle": 11, "handle": 11,
@@ -3782,7 +4048,10 @@
"value": 3 "value": 3
}, },
"id": 1, "id": 1,
"features": ["3.3 V", "PME#"] "features": [
"3.3 V",
"PME#"
]
}, },
{ {
"handle": 12, "handle": 12,
@@ -3808,7 +4077,10 @@
"value": 3 "value": 3
}, },
"id": 1, "id": 1,
"features": ["3.3 V", "PME#"] "features": [
"3.3 V",
"PME#"
]
}, },
{ {
"handle": 13, "handle": 13,
@@ -3834,7 +4106,10 @@
"value": 3 "value": 3
}, },
"id": 1, "id": 1,
"features": ["3.3 V", "PME#"] "features": [
"3.3 V",
"PME#"
]
} }
], ],
"system": { "system": {

View File

@@ -1,62 +0,0 @@
{
inputs,
config,
lib,
...
}:
{
nixpkgs.hostPlatform = {
system = "x86_64-linux";
};
system.stateVersion = "25.11";
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
clan.core.vars.generators.wireless-credentials = {
files = {
essid.secret = false;
psk.secret = true;
};
prompts = {
essid.persist = true;
psk.persist = true;
};
script = ''
cat "$prompts"/essid > $out/essid
prompt_psk=$(cat "$prompts"/psk)
echo "psk=$prompt_psk" > $out/psk
'';
};
networking.wireless =
let
credentials = config.clan.core.vars.generators.wireless-credentials.files;
in
{
enable = true;
secretsFile = credentials.psk.path;
networks.${credentials.essid.value}.pskRaw = "ext:psk";
};
networking.interfaces.wlp1s0 = {
useDHCP = false;
ipv4.addresses = [
{
address = "10.0.0.9";
prefixLength = 24;
}
];
};
services.yggdrasil.settings.Peers = lib.mkForce [
"tcp://newt.barry.town:1337"
"tls://yg-hkg.magicum.net:32333"
"tls://astrra.space:55535"
];
clan.core.settings.name = "neptune";
# clan.meta.description = "Radxa SBC board for testing. (With vi)";
}

View File

@@ -1,90 +0,0 @@
{ ... }:
let
hashDisk = disk: "os-${builtins.substring 0 5 (builtins.hashString "sha256" disk)}";
os = "/dev/disk/by-id/mmc-CUTB42_0x9d59499c";
in
{
boot.loader = {
systemd-boot = {
enable = true;
};
efi = {
canTouchEfiVariables = 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";
};
};
swap = {
size = "16G";
content = {
type = "swap";
};
};
};
};
};
};
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

View File

@@ -1,35 +1,15 @@
{ self, config, ... }: { config, ... }:
{ {
system.stateVersion = "25.11"; system.stateVersion = "25.11";
nixpkgs.hostPlatform = { nixpkgs.hostPlatform = {
system = "x86_64-linux"; system = "x86_64-linux";
}; };
clan.core.settings.name = "ramus"; clan.meta.name = "ramus";
# clan.meta.description = '' clan.meta.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.networking.targetHost = "root@[${config.clan.core.vars.generators.zerotier.files.zerotier-ip.value}]";
clan.core.vars.generators.acme = {
share = true;
files.email.secret = false;
prompts.email = {
type = "line";
description = "Email for ACME registeration";
};
script = ''
cat $prompts/email > $out/email
'';
};
users.users.nginx.extraGroups = [ "acme" ];
security.acme.acceptTerms = true;
imports = [ ./think-greater-chiangmai.nix ];
} }

View File

@@ -1,139 +0,0 @@
{ self, config, ... }:
let
commonSettings = rec {
APP_NAME = "Laravel";
APP_ENV = "local";
APP_KEY._secret = config.clan.core.vars.generators.greaterchiangmai.files.app_key.path;
APP_DEBUG = "false";
APP_URL = "http://localhost";
DB_CONNECTION = "mysql";
DB_HOST = "localhost";
DB_PORT = 3306;
DB_DATABASE = "thinkgtcm";
DB_USERNAME = "gtcm";
R2_SCHEMA_URL = "https://${R2_BUCKET}.${R2_REGION}.your-objectstorage.com/test-large-files/";
R2_ACCESS_KEY_ID = config.clan.core.vars.generators.greaterchiangmai-s3.files.access_key_id.value;
R2_SECRET_ACCESS_KEY._secret =
config.clan.core.vars.generators.greaterchiangmai-s3.files.secret_access_key.path;
R2_REGION = config.clan.core.vars.generators.greaterchiangmai-s3.files.region.value;
R2_BUCKET = config.clan.core.vars.generators.greaterchiangmai-s3.files.bucket.value;
R2_ENDPOINT = config.clan.core.vars.generators.greaterchiangmai-s3.files.endpoint.value;
R2_BUCKET_NAME = R2_BUCKET;
LOG_CHANNEL = "stack";
LOG_LEVEL = "debug";
FILESYSTEM_DISK = "local";
BROADCAST_DRIVER = "log";
CACHE_DRIVER = "file";
QUEUE_CONNECTION = "sync";
SESSION_DRIVER = "file";
SESSION_LIFETIME = 120;
MEMCACHED_HOST = "127.0.0.1";
REDIS_HOST = "127.0.0.1";
REDIS_PORT = 6379;
UPLOAD_MAX_FILESIZE = "5000M";
POST_MAX_SIZE = "5000M";
TEST_LOCAL = true;
};
baseDomain = "greaterchiangmai.com";
domain = "think.${baseDomain}";
domainBackend = "think-backend.${baseDomain}";
in
{
imports = [
self.nixosModules.think-gtcm
self.nixosModules.think-backend-gtcm
];
nixpkgs.overlays = [ self.overlays.packagesOverlay ];
clan.core.vars.generators.greaterchiangmai = {
files = {
app_key = {
secret = true;
owner = config.services.think-greaterchiangmai.user;
group = config.services.think-greaterchiangmai.group;
};
};
prompts = {
app_key.persist = true;
};
script = ''
cat $prompts/app_key > $out/app_key
'';
};
clan.core.vars.generators.greaterchiangmai-s3 = {
files = {
access_key_id.secret = false;
secret_access_key = {
secret = true;
owner = config.services.think-greaterchiangmai.user;
group = config.services.think-greaterchiangmai.group;
};
endpoint.secret = false;
region.secret = false;
bucket.secret = false;
};
prompts = {
access_key_id.persist = true;
secret_access_key.persist = true;
endpoint.persist = true;
region.persist = true;
bucket.persist = true;
};
script = ''
cat $prompts/access_key_id > $out/access_key_id
cat $prompts/secret_access_key > $out/secret_access_key
cat $prompts/endpoint > $out/endpoint
cat $prompts/region > $out/region
cat $prompts/bucket > $out/bucket
'';
};
services.think-greaterchiangmai = {
enable = true;
domain = domain;
settings = commonSettings;
};
services.think-backend-greaterchiangmai = {
enable = true;
domain = domainBackend;
settings = commonSettings;
};
security.acme.certs = {
"${domain}" = {
email = config.clan.core.vars.generators.acme.files.email.value;
webroot = "/var/lib/acme/acme-challenge/${domain}";
};
"${domainBackend}" = {
email = config.clan.core.vars.generators.acme.files.email.value;
webroot = "/var/lib/acme/acme-challenge/${domainBackend}";
};
};
services.nginx.virtualHosts.${domain} = {
forceSSL = true;
useACMEHost = domain;
acmeRoot = config.security.acme.certs.${domain}.webroot;
};
services.nginx.virtualHosts.${domainBackend} = {
forceSSL = true;
useACMEHost = domainBackend;
acmeRoot = config.security.acme.certs.${domainBackend}.webroot;
};
}

View File

@@ -1,12 +0,0 @@
{ self, ... }:
{
imports = [
self.nixosModules.common
];
nixpkgs.hostPlatform = {
system = "x86_64-linux";
};
system.stateVersion = "25.11";
clan.core.sops.defaultGroups = [ "admins" ];
}

View File

@@ -1,90 +0,0 @@
{ ... }:
let
hashDisk = disk: "os-${builtins.substring 0 5 (builtins.hashString "sha256" disk)}";
os = "/dev/disk/by-id/nvme-SAMSUNG_MZVL81T0HFLB-00BLL_S7XKNF0Y966645";
in
{
boot.loader = {
systemd-boot = {
enable = true;
};
efi = {
canTouchEfiVariables = 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";
};
};
swap = {
size = "16G";
content = {
type = "swap";
};
};
};
};
};
};
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

View File

@@ -19,6 +19,7 @@
system = "x86_64-linux"; system = "x86_64-linux";
}; };
networking.fqdn = config.clan.core.vars.generators.vega-internal-domain.files.name.value;
system.stateVersion = "25.11"; system.stateVersion = "25.11";
} }

View File

@@ -3,11 +3,9 @@
_class = "clan.service"; _class = "clan.service";
manifest.name = "actual-budget"; manifest.name = "actual-budget";
manifest.description = "A local-first personal finance app "; manifest.description = "A local-first personal finance app ";
manifest.readme = "A local-first personal finance app";
manifest.categories = [ "System" ]; manifest.categories = [ "System" ];
roles.default = { roles.default = {
description = "A default server role.";
perInstance.nixosModule = perInstance.nixosModule =
{ {

View File

@@ -0,0 +1,69 @@
{ ... }:
{
_class = "clan.service";
manifest.name = "asterisk";
manifest.description = "Asterisk PBX server";
manifest.categories = [ "System" ];
roles.default = {
perInstance.nixosModule =
{
lib,
...
}:
{
services.asterisk = {
enable = lib.mkDefault true;
confFiles = {
# Dial plan config
"extensions.conf" = ''
exten => 1001,1,Dial(PJSIP/user1,20)
exten => 1002,1,Dial(PJSIP/user2,20)
exten => 100,1,Answer()
same => n,Wait(1)
same => n,Playback(hello-world)
same => n,Hangup()
'';
"pjsip.conf" = ''
[transport-udp]
type=transport
protocol=udp
bind=0.0.0.0,[::]
[endpoint_internal](!)
type=endpoint
context=from-internal
disallow=all
allow=ulaw
[auth_userpass](!)
type=auth
auth_type=userpass
[aor_dynamic](!)
type=aor
max_contacts=1
[user1](endpoint_internal)
auth=user1
aors=user1
[user1](auth_userpass)
password=user1
username=user1
[user1](aor_dynamic)
[user2](endpoint_internal)
auth=user2
aors=user2
[user2](auth_userpass)
password=user2
username=user2
[user2](aor_dynamic)
'';
};
};
};
};
}

View File

@@ -0,0 +1,18 @@
{ lib, ... }:
let
module = lib.modules.importApply ./default.nix { };
in
{
clan.modules = {
asterisk = module;
};
perSystem =
{ ... }:
{
clan.nixosTests.asterisk = {
imports = [ ./tests/vm/default.nix ];
clan.modules."@clan/asterisk" = module;
};
};
}

View File

@@ -0,0 +1,39 @@
{
pkgs,
...
}:
{
name = "service-asterisk";
clan = {
directory = ./.;
inventory = {
machines.server = { };
instances = {
asterisk-test = {
module.name = "@clan/asterisk";
module.input = "self";
roles.default.machines."server".settings = { };
};
};
};
};
nodes = {
server = {
services.asterisk = {
};
};
};
testScript = ''
start_all()
server.wait_for_unit("asterisk")
# Check that garage is running
server.succeed("systemctl status asterisk")
'';
}

View File

@@ -1,174 +0,0 @@
{ ... }:
{
_class = "clan.service";
manifest.name = "git-daemon";
manifest.description = "a really simple server for git repositories";
manifest.readme = "a really simple server for git repositories";
manifest.categories = [ "System" ];
roles.default = {
description = "a default server role";
interface =
{ lib, ... }:
{
options = with lib; {
directory = lib.mkOption {
type = types.str;
default = "/var/git";
};
repositories = lib.mkOption {
type =
with lib.types;
attrsOf (
submodule (
{ name, ... }:
{
options = {
name = lib.mkOption {
type = str;
default = name;
};
read-access = lib.mkOption {
type = listOf str;
default = [ ];
};
write-access = lib.mkOption {
type = listOf str;
default = [ ];
};
};
}
)
);
default = { };
};
};
};
perInstance =
{
settings,
...
}:
{
nixosModule =
{
pkgs,
lib,
config,
...
}:
{
systemd.services.git-init = {
serviceConfig = {
Type = "oneshot";
User = config.services.gitDaemon.user;
Group = config.services.gitDaemon.group;
ExecStartPre = toString [
"+${pkgs.coreutils}/bin/install"
"--directory"
"--owner=${config.services.gitDaemon.user}"
"--group=${config.services.gitDaemon.group}"
"--mode=0750"
settings.directory
];
ExecStart =
let
git-template = pkgs.stdenv.mkDerivation {
name = "git-template";
buildCommand = ''
cp --no-preserve=mode,ownership --recursive \
${pkgs.git}/share/git-core/templates $out
install -m550 $out/hooks/post-update{.sample,}
'';
};
init-script =
{ name, ... }:
pkgs.writeShellScript "git-init-${name}" ''
${pkgs.git}/bin/git init \
--bare --template=${git-template} --shared=0660 \
${settings.directory}/${name}.git
${pkgs.git}/bin/git \
-C ${settings.directory}/${name}.git \
config set receive.denyNonFastforwards false
'';
in
map init-script (lib.attrValues settings.repositories);
};
};
services.gitDaemon = {
enable = true;
user = "git";
group = "git";
options =
let
firewall = pkgs.writeText "git-daemon-firewall.json" (
builtins.toJSON (builtins.attrValues settings.repositories)
);
hook = pkgs.writers.writePython3 "hook.py" { flakeIgnore = [ "E" ]; } ''
import os, sys, enum, pathlib, ipaddress, json
class Service(enum.Enum):
UploadPack = enum.auto()
ReceivePack = enum.auto()
UploadArchive = enum.auto()
@classmethod
def parse(cls, string):
return {
'upload-pack': cls.UploadPack,
'receive-pack': cls.ReceivePack,
'upload-archive': cls.UploadArchive
}[string]
@property
def service(self):
return {
UploadPack: 'read-access',
ReceivePack: 'write-access'
}[self]
UploadPack = Service.UploadPack
ReceivePack = Service.ReceivePack
def parse_remote_addr(remote_addr):
if remote_addr.startswith('[') and remote_addr.endswith(']'):
return ipaddress.ip_address(remote_addr[1:-1])
return ipaddress.ip_address(remote_addr)
service = Service.parse(sys.argv[1])
repo = pathlib.Path(sys.argv[2]).stem
client = parse_remote_addr(os.environ['REMOTE_ADDR'])
with open("${firewall}", 'r') as f:
firewall = json.load(f)
for rule in firewall:
if rule["name"] == repo:
for network in rule[service.service]:
if client in ipaddress.ip_network(network):
sys.exit(0)
print('stairway denied')
sys.exit(1)
'';
in
toString [
"--enable=upload-pack"
"--enable=receive-pack"
"--disable=upload-archive"
"--access-hook=${hook}"
"--informative-errors"
];
exportAll = true;
basePath = settings.directory;
};
systemd.services.git-daemon = {
requires = [ "git-init.service" ];
after = [ "git-init.service" ];
};
networking.firewall.allowedTCPPorts = [ 9418 ];
};
};
};
}

View File

@@ -1,9 +0,0 @@
{ lib, ... }:
let
module = lib.modules.importApply ./default.nix { };
in
{
clan.modules = {
git-daemon = module;
};
}

View File

@@ -3,11 +3,9 @@
_class = "clan.service"; _class = "clan.service";
manifest.name = "grafana"; manifest.name = "grafana";
manifest.description = "Platform for data analytics and monitoring"; manifest.description = "Platform for data analytics and monitoring";
manifest.readme = "Platform for data analytics and monitoring";
manifest.categories = [ "System" ]; manifest.categories = [ "System" ];
roles.default = { roles.default = {
description = "A default server role";
perInstance.nixosModule = perInstance.nixosModule =
{ {

View File

@@ -1,6 +0,0 @@
{ lib, ... }:
{
clan.modules = {
home-user = lib.modules.importApply ./home-user { };
};
}

View File

@@ -1,64 +0,0 @@
{ ... }:
{
_class = "clan.service";
manifest.name = "common-user-home-manager";
manifest.description = "General users' home-manager profile generator";
manifest.readme = "General users' home-manager profile generator";
manifest.categories = [ "System" ];
roles.default = {
description = "a default role for the user";
interface =
{ lib, ... }:
{
options = {
username = lib.mkOption {
type = lib.types.str;
};
kbLayout = lib.mkOption {
type = lib.types.str;
default = "us";
};
kbOptions = lib.mkOption {
type = lib.types.str;
default = "grp:win_space_toggle";
};
};
};
perInstance =
{ settings, ... }:
{
nixosModule =
{ inputs, ... }:
let
username = settings.username;
in
{
imports = [ inputs.home-manager.nixosModules.home-manager ];
users.users.${username} = {
initialPassword = "";
isNormalUser = true;
extraGroups = [
"audio"
"video"
"networkmanager"
];
};
services.xserver = {
enable = true;
xkb.layout = settings.kbLayout;
xkb.options = settings.kbOptions;
};
home-manager.useGlobalPkgs = true;
home-manager.useUserPackages = true;
home-manager.users.${username} = ./home.nix;
home-manager.extraSpecialArgs = {
inherit inputs username;
};
};
};
};
}

View File

@@ -1,24 +0,0 @@
{
osConfig,
pkgs,
lib,
username,
...
}:
{
home = {
inherit username;
homeDirectory = lib.mkForce "/home/${username}";
stateVersion = osConfig.system.stateVersion;
packages = with pkgs; [
libreoffice
element-desktop
brave
firefox
keepassxc
vlc
thunderbird
];
};
programs.home-manager.enable = true;
}

View File

@@ -1,138 +0,0 @@
{ ... }:
{
_class = "clan.service";
manifest.name = "jukebox";
manifest.description = "mpd server, library on removable disks";
manifest.readme = "mpd server, library on removable disks";
manifest.categories = [ "System" ];
roles.default = {
description = "a default server role";
interface =
{ lib, ... }:
{
options = {
baseDir = lib.mkOption {
type = lib.types.str;
default = "/mnt/jukebox";
};
binds = lib.mkOption {
type = with lib.types; listOf str;
default = [ ];
};
disks = lib.mkOption {
type =
with lib.types;
attrsOf (
submodule (
{ name, ... }:
{
options = {
name = lib.mkOption {
type = str;
default = name;
};
uuid = lib.mkOption {
type = str;
};
mountOptions = lib.mkOption {
type = listOf str;
default = [ ];
};
};
}
)
);
default = { };
description = "disks comprising library";
};
};
};
perInstance =
{
settings,
...
}:
{
nixosModule =
{
config,
lib,
pkgs,
...
}:
{
services.pulseaudio.enable = true;
# workaround cookie permissions
services.pulseaudio.tcp.enable = true;
services.pulseaudio.tcp.anonymousClients = {
allowedIpRanges = [ "127.0.0.1" ];
allowAll = true;
};
systemd.tmpfiles.rules = [
"d ${settings.baseDir} 0755 root root"
];
fileSystems =
let
disk2fs =
{
name,
uuid,
mountOptions,
...
}:
lib.nameValuePair "${settings.baseDir}/${name}" {
device = "/dev/disk/by-uuid/${uuid}";
fsType = "auto";
options = [
"noauto"
"nofail"
]
++ mountOptions;
};
in
lib.listToAttrs (lib.mapAttrsToList (_: disk2fs) settings.disks);
services.udev.extraRules =
let
translate-prefix = path: (lib.removePrefix "-" (lib.replaceStrings [ "/" ] [ "-" ] path));
mount-name = name: "${translate-prefix settings.baseDir}-${name}.mount";
disk2rule =
{ name, uuid, ... }:
lib.concatStringsSep ", " [
''ACTION=="add"''
''SUBSYSTEM=="block"''
''ENV{DEVLINKS}=="*/dev/disk/by-uuid/${uuid}*"''
''ENV{SYSTEMD_WANTS}="${mount-name name}"''
];
in
lib.concatMapStringsSep "\n" disk2rule (lib.attrValues settings.disks);
services.mpd = {
enable = true;
openFirewall = true;
settings = {
bind_to_address = "any";
music_directory = settings.baseDir;
audio_output = [
{
type = "pulse";
name = "jukebox";
server = "localhost";
}
];
};
};
networking.firewall.interfaces = lib.genAttrs settings.binds (_: {
allowedTCPPorts = [ config.services.mpd.settings.port ];
});
environment.systemPackages = [ pkgs.mpc ];
};
};
};
}

View File

@@ -1,9 +0,0 @@
{ lib, ... }:
let
module = lib.modules.importApply ./default.nix { };
in
{
clan.modules = {
jukebox = module;
};
}

View File

@@ -3,11 +3,9 @@
_class = "clan.service"; _class = "clan.service";
manifest.name = "nextcloud"; manifest.name = "nextcloud";
manifest.description = "Nextcloud server, a safe home for all your data"; manifest.description = "Nextcloud server, a safe home for all your data";
manifest.readme = "Nextcloud server, a safe home for all your data";
manifest.categories = [ "System" ]; manifest.categories = [ "System" ];
roles.default = { roles.default = {
description = "a default server role";
perInstance.nixosModule = perInstance.nixosModule =
{ {

View File

@@ -3,11 +3,9 @@
_class = "clan.service"; _class = "clan.service";
manifest.name = "paperless"; manifest.name = "paperless";
manifest.description = "A community-supported supercharged document management system: scan, index and archive all your documents"; manifest.description = "A community-supported supercharged document management system: scan, index and archive all your documents";
manifest.readme = "A community-supported supercharged document management system: scan, index and archive all your documents";
manifest.categories = [ "System" ]; manifest.categories = [ "System" ];
roles.default = { roles.default = {
description = "a default server role";
perInstance.nixosModule = perInstance.nixosModule =
{ {

View File

@@ -1,8 +0,0 @@
{ lib, ... }:
{
services.automatic-timezoned.enable = true;
services.geoclue2 = {
enableDemoAgent = lib.mkForce true;
geoProviderUrl = "https://beacondb.net/v1/geolocate";
};
}

View File

@@ -1,21 +0,0 @@
{ ... }:
{
_class = "clan.service";
manifest.name = "personal-computer";
manifest.description = "A service for configuring personal computer such as printing, automatic-timezone, etc.";
manifest.readme = "A service for configuring personal computer such as printing, automatic-timezone, etc.";
manifest.categories = [ "System" ];
roles.default = {
description = "an only one default role";
perInstance.nixosModule =
{ inputs, lib, ... }:
{
imports = [
(inputs.import-tree.initFilter (
p: !lib.hasSuffix "default.nix" p && !lib.hasSuffix "flake-module.nix" p
) ./.)
];
};
};
}

View File

@@ -1,4 +0,0 @@
{ config, ... }:
{
security.pam.services."sddm".kwallet.enable = config.services.desktopManager.plasma6.enable;
}

View File

@@ -1,6 +0,0 @@
{ lib, ... }:
{
clan.modules = {
personal-computer = lib.modules.importApply ./default.nix { };
};
}

View File

@@ -1,11 +0,0 @@
{
services = {
libinput = {
enable = true;
touchpad = {
disableWhileTyping = true;
naturalScrolling = true;
};
};
};
}

View File

@@ -1,62 +0,0 @@
{
pkgs,
lib,
config,
...
}:
let
allowManageGroups = [
"root"
"wheel"
"lpadmin"
];
polkitAllowGroups = builtins.concatStringsSep "||" (
builtins.map (group: ''subject.isInGroup("${group}")'') allowManageGroups
);
printerMember = lib.map (user: user.name) (
lib.attrsets.attrsToList (
lib.attrsets.filterAttrs (name: value: value.isNormalUser) config.users.users
)
);
in
{
services.printing = {
enable = true;
drivers = [
pkgs.brlaser
pkgs.gutenprint
];
extraFilesConf = ''
SystemGroup ${builtins.concatStringsSep " " allowManageGroups}
'';
};
security.polkit = {
enable = true;
extraConfig = ''
polkit.addRule(function(action, subject) {
var actionMatchs = (
action.id.indexOf('org.opensuse.cupspkhelper.mechanism.') === 0
);
if (actionMatchs) {
if (${polkitAllowGroups}) {
return polkit.Result.YES
}
}
});
'';
};
hardware.sane = {
enable = true;
};
users.groups.lpadmin.members = printerMember;
users.groups.lp.members = printerMember;
users.groups.scanner.members = printerMember;
}

View File

@@ -1,11 +0,0 @@
{ lib, ... }:
{
users.mutableUsers = lib.mkForce true;
security.polkit.extraConfig = ''
polkit.addRule(function(action, subject) {
if ((action.id == "org.freedesktop.accounts.change-own-password")) {
return polkit.Result.AUTH_SELF;
}
});
'';
}

View File

@@ -1,4 +0,0 @@
{
networking.networkmanager.enable = true;
hardware.bluetooth.enable = true;
}

View File

@@ -1,455 +0,0 @@
{
clanLib,
...
}:
{
_class = "clan.service";
manifest.name = "phonebox";
manifest.description = "A peer to peer phone relay network built on top of yggdrasil.";
manifest.readme = "A peer to peer phone relay network built on top of yggdrasil.";
manifest.categories = [ "System" ];
roles.default = {
description = "a default server role";
interface =
{ lib, ... }:
{
options.ata-ethernet-iface = lib.mkOption {
type = lib.types.str;
description = "An Ethernet interface that connect to ATA box.";
default = "enp2s0";
};
options.ownerName = lib.mkOption {
type = lib.types.str;
description = "";
default = "";
};
};
perInstance =
{
roles,
settings,
...
}:
{
nixosModule =
{
lib,
config,
pkgs,
...
}:
let
asterisk = pkgs.asterisk.overrideAttrs (old: {
propagatedNativeBuildInputs = [ pkgs.spandsp3 ];
});
machines = lib.attrNames roles.default.machines;
user = "asterisk";
faxDir = "/run/asterisk/fax";
rtpPortFrom = 10000;
rtpPortTo = 20000;
ata-interface = settings.ata-ethernet-iface;
contactList = builtins.map (machineName: {
name = "${clanLib.getPublicValue {
flake = config.clan.core.settings.directory;
machine = machineName;
generator = "phonebox";
file = "owner-name";
default = null;
}}";
number = "${
clanLib.getPublicValue {
flake = config.clan.core.settings.directory;
machine = machineName;
generator = "phonebox";
file = "server-prefix-number";
default = null;
}
}${
clanLib.getPublicValue {
flake = config.clan.core.settings.directory;
machine = machineName;
generator = "phonebox";
file = "ata-local-number";
default = null;
}
}";
}) machines;
createContactListTiff =
let
contactTXT = lib.concatStringsSep "\n" (
builtins.map (contact: "${contact.number}\t\t: \t\t${contact.name}") contactList
);
in
pkgs.writeShellApplication {
name = "create-contact-tiff";
text = ''
magick -background white -fill black -pointsize 20 -font DejaVu-Sans label:"${contactTXT}" "$1"
magick "$1" -border 20x50 -bordercolor white "$1"
magick "$1" -resize 1728x -units PixelsPerInch -compress Group4 -density 204x196 -monochrome -depth 1 "$1"
'';
runtimeInputs = [ pkgs.imagemagick ];
};
genServerSIPEndpoint =
{ hostname, address }:
''
[${hostname}](internal_endpoint)
aors=${hostname}
[${hostname}](ip_auth)
endpoint=${hostname}
match=[${address}]
[${hostname}](dynamiic_aor)
contact=sip:[${address}]
'';
genLocalSIPEndpoint =
{ localNumber }:
''
[${localNumber}](internal_endpoint)
aors=${localNumber}
auth=${localNumber}
[${localNumber}](userpass_auth)
username=${localNumber}
password=${localNumber}
[${localNumber}](dynamiic_aor)
max_contacts=1
'';
genLocalExtenConf =
{ localNumber }:
''
exten => ${localNumber},1,Dial(PJSIP/${localNumber},20)
'';
genExtentConf =
{
prefixNumber,
hostname,
localNumber,
}:
let
replaceWithX =
ln: builtins.concatStringsSep "" (builtins.genList (_: "X") (builtins.stringLength ln));
in
''
exten => _${prefixNumber}${replaceWithX localNumber},1,Dial(PJSIP/''${EXTEN:${builtins.toString (builtins.stringLength prefixNumber)}}@${hostname},30)
'';
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";
in
{
clan.core.vars.generators.phonebox = builtins.break {
files = {
server-prefix-number.secret = false;
ata-local-number.secret = false;
owner-name.secret = false;
};
prompts = {
server-prefix-number = {
type = "line";
persist = true;
description = "Server prefix number: indicate server to connect to [10XX]";
};
ata-local-number = {
persist = true;
type = "line";
description = "Local suffix number: indicate local number on the server [XX00]";
};
owner-name = {
persist = true;
type = "line";
description = "The owner's name for this unit";
};
};
script = ''
cat $prompts/server-prefix-number > $out/server-prefix-number
cat $prompts/ata-local-number > $out/ata-local-number
cat $prompts/owner-name > $out/owner-name
'';
};
networking.interfaces = {
${ata-interface} = {
useDHCP = false;
ipv4.addresses = [
{
address = "192.168.254.1";
prefixLength = 24;
}
];
};
};
services.dnsmasq = {
enable = true;
settings = {
bind-dynamic = true;
listen-address = "192.168.254.1";
# enable-ra = true;
domain-needed = true;
domain = "localhost";
dhcp-range = [
"192.168.254.100,192.168.254.100,255.255.255.0,3m"
];
dhcp-leasefile = "/dev/null";
dhcp-option = [
"3,192.168.254.1"
];
interface = [ ata-interface ];
};
};
services.nginx = {
enable = true;
virtualHosts = {
"_" = {
locations."/" = {
proxyPass = "http://192.168.254.100";
extraConfig = ''
client_max_body_size 100M;
'';
};
};
};
};
networking.firewall.allowedUDPPortRanges = [
{
from = rtpPortFrom;
to = rtpPortTo;
}
];
networking.firewall.allowedUDPPorts = [
53
67
5060
];
networking.firewall.allowedTCPPorts = [
53
];
networking.firewall.interfaces =
let
matchAll = if !config.networking.nftables.enable then "zt+" else "zt*";
in
{
"${matchAll}".allowedTCPPorts = [ 80 ];
};
services.asterisk = {
enable = lib.mkDefault true;
package = lib.mkDefault asterisk;
confFiles =
let
nodes = builtins.foldl' (
nodes: name:
nodes
++ [
{
hostname = name;
address = getYggdrasilIP name;
prefixNumber = clanLib.getPublicValue {
flake = config.clan.core.settings.directory;
machine = name;
generator = "phonebox";
file = "server-prefix-number";
default = null;
};
localNumber = clanLib.getPublicValue {
flake = config.clan.core.settings.directory;
machine = name;
generator = "phonebox";
file = "ata-local-number";
default = null;
};
}
]
) [ ] machines;
in
{
"logger.conf" = ''
[general]
dateformat = %F %T.%3q ; ISO 8601 date format with milliseconds
use_callids = yes
appendhostname = no
queue_log = yes
queue_log_to_file = no
queue_log_name = queue_log
queue_log_realtime_use_gmt = no
rotatestrategy = rotate
exec_after_rotate=gzip -9 $\{filename\}.2
[logfiles]
console => notice,warning,error
security => security
messages => notice,warning,error
full => notice,warning,error,verbose,dtmf,fax
syslog.local0 => notice,warning,error
'';
"modules.conf" = ''
[modules]
autoload=yes
load => res_fax_spandsp.so
'';
# Dial plan config
"extensions.conf" =
let
serverConf = builtins.foldl' (
config: node:
config
+ (genExtentConf {
inherit (node) prefixNumber hostname localNumber;
})
) "" nodes;
in
''
[from-internal]
exten => 999,1,Answer()
same => n,Playback(hello-world)
same => n,Hangup()
exten => 000,1,Answer()
same => n,ReceiveFAX(${faxDir}/echo-''${UNIQUEID}.tiff)
same => n,Set(FAXFILE=${faxDir}/echo-''${UNIQUEID}.tiff)
same => n,Set(FAXECHO=true)
exten => 888,1,Answer()
same => n,Set(FAXFILE=${faxDir}/contact.tiff)
same => n,System(${lib.getExe createContactListTiff} ''${FAXFILE})
same => n,Set(FAXECHO=true)
same => n,Playback(vm-goodbye)
same => n,Wait(3)
exten => h,1,GotoIf($[''${FAXECHO}]?sendfax)
same => n,Hangup()
same => n(sendfax),Originate(PJSIP/00,app,SendFAX,''${FAXFILE})
same => n,Set(FAXECHO=false)
''
+ (genLocalExtenConf {
localNumber = config.clan.core.vars.generators.phonebox.files.ata-local-number.value;
})
+ serverConf;
"rtp.conf" = ''
[general]
rtpstart=${builtins.toString rtpPortFrom}
rtpend=${builtins.toString rtpPortTo}
'';
"pjsip.conf" =
let
serverConf = builtins.foldl' (
conf: node:
conf
+ (genServerSIPEndpoint {
hostname = node.hostname;
address = node.address;
})
) "" nodes;
in
''
[transport-udp]
type=transport
protocol=udp
bind=0.0.0.0
[transport-udp6]
type=transport
protocol=udp
bind=::
[base_endpoint](!)
type=endpoint
disallow=all
allow=ulaw,alaw,g722,gsm
direct_media=no
[internal_endpoint](!,base_endpoint)
context=from-internal
[userpass_auth](!)
type=auth
auth_type=userpass
[ip_auth](!)
type=identify
endpoint=external
[dynamiic_aor](!)
type=aor
''
+ (genLocalSIPEndpoint {
localNumber = config.clan.core.vars.generators.phonebox.files.ata-local-number.value;
})
+ serverConf;
};
};
environment.systemPackages = [
createContactListTiff
];
systemd.tmpfiles.rules = [
"d ${faxDir} 0755 ${user} ${user} - -"
];
systemd.services.asterisk-watcher = {
enable = true;
description = "Asterisk Configuration files watcher";
requires = [ "asterisk.service" ];
after = [ "network.target" ];
wantedBy = [ "multi-user.target" ];
path = with pkgs; [
inotify-tools
asterisk
];
script = ''
inotifywait -m -e move /etc/asterisk |
while read path action file; do
case "$file" in
pjsip.conf)
echo "restarting pjsip"
asterisk -rx "pjsip reload"
;;
esac
case "$file" in
extensions.conf)
echo "restarting core"
asterisk -rx "core restart now"
;;
esac
done
'';
};
};
};
};
}

View File

@@ -1,23 +0,0 @@
{
inputs,
self,
...
}:
let
module = ./default.nix;
in
{
clan.modules = {
phonebox = module;
};
perSystem =
{ ... }:
{
clan.nixosTests.service-phonebox = {
imports = [ ./tests/vm/default.nix ];
_module.args = { inherit self inputs; };
clan.modules."@clan/phonebox" = module;
};
};
}

View File

@@ -1,59 +0,0 @@
{
self,
hostPkgs,
config,
inputs,
lib,
...
}:
{
name = "service-phonebox";
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 = ./.;
inventory = {
machines.server = { };
instances = {
yggdrasil = {
module.name = "yggdrasil";
roles.default.machines.server = { };
};
phonebox-test = {
module.name = "@clan/phonebox";
module.input = "self";
roles.default.machines."server".settings = {
ata-ethernet-iface = "enp2s0";
};
};
};
};
};
nodes = {
server = {
services.asterisk = {
};
};
};
testScript = ''
start_all()
server.wait_for_unit("asterisk")
server.succeed("systemctl status asterisk")
'';
}

View File

@@ -1,6 +0,0 @@
[
{
"publickey": "age1fdkan6n20swmut0sa86g5a6gxrj8qj2sgqe8hxtw32c0u9rr4drqlyr5mf",
"type": "age"
}
]

View File

@@ -1,14 +0,0 @@
{
"data": "ENC[AES256_GCM,data:t+zYfcA2f1sdUNBAl+bRGyhPEl5HZFIu+au6heH3+SoHf0zy+Deh25gaVay/oswIg2q806ozjEnTw9q2eaq0VXwMSAWOoTWteI0=,iv:sXoOmfzoCv6GHe21n2Elxr/GTdViI5vfLzMwOLvf1F4=,tag:Fmo9MjEaKV3BehR/bYRdVw==,type:str]",
"sops": {
"age": [
{
"recipient": "age1qm0p4vf9jvcnn43s6l4prk8zn6cx0ep9gzvevxecv729xz540v8qa742eg",
"enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBzVlo0YjZFVFF2VkFlSzBL\ndHp4YTQ5RlNxV2FWNnNScTh5d0hXR05RL0NVCnBVUENNNjg0dTFVcmx3N3djZ25l\ncmxYTVVrNGhGSkdwVThoaC9UVTQ3L2sKLS0tIG1uREdFcXNubGxzUUQ1Rkh5Wnlx\nRG5OZmJwaGh2dkt6RSttb0gxZ3FBaEkKZzwUuQmOeBk5kfRfVVdqgNvsTU1Ssb/I\nx9Iv9w/YKHDmmcFLcAbGAHbS0/Js0YqBKZonxEMDdWP/+/F+Pv8LqQ==\n-----END AGE ENCRYPTED FILE-----\n"
}
],
"lastmodified": "2025-10-31T07:08:30Z",
"mac": "ENC[AES256_GCM,data:CBuTnVIta0eFqlB7ZpDkzPOEGbIQbb5oCpksI4umscB3uE0HM3j4N5r6bCPEcYpehB3qWXuCxlj4NfH7zmp6CDq6Be6bfpB1f8MCwTlPvQUho2f31so3U/g99q6ZyWI2rJO50dzn77bdma3JXo9VQb3uRqJ0mk72IYXFwdHvO9s=,iv:9uwjtGYpqsLcXRoBFmjJjfHUq7R47ZqkrKEXMulw4OY=,tag:4Auq3mnhlusogyW44SJfqg==,type:str]",
"version": "3.11.0"
}
}

View File

@@ -1 +0,0 @@
../../../users/admin

View File

@@ -1,4 +0,0 @@
{
"publickey": "age1qm0p4vf9jvcnn43s6l4prk8zn6cx0ep9gzvevxecv729xz540v8qa742eg",
"type": "age"
}

View File

@@ -1 +0,0 @@
../../../../../../sops/machines/server

View File

@@ -1,18 +0,0 @@
{
"data": "ENC[AES256_GCM,data:L4fWAVQdQP2tgYPzUnDY5X0=,iv:fWeTc1buW/JI/8qngZwzDp+wq2OTZPGdItqG0Up5eZ8=,tag:RJt6PQdCisDhtbr3ph3fWA==,type:str]",
"sops": {
"age": [
{
"recipient": "age1fdkan6n20swmut0sa86g5a6gxrj8qj2sgqe8hxtw32c0u9rr4drqlyr5mf",
"enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBFK2x0SkcxK2RxTDRvOEpZ\nTS9QNGJxbmZIL2xtUWxyNjA2VDNVWEQzQVc4CkkxeEZDQm1mQVdUUzVIQThDVkV3\nU2lWbnlnb3lqWDZ0NWRqa2RJV0pVK1UKLS0tIHc5eUJBUUtiL0NwZDRnN004UEtr\nYnU2SWlFOGlucTdydGVmZCtGK3NjS28KkNAxwz9MesicLWtViL302AwZYdiTHmd5\nppbwelisNVlsYHSa5ybVDYER4IUz1d8AKO0jtS7qEDfT53R36swSAA==\n-----END AGE ENCRYPTED FILE-----\n"
},
{
"recipient": "age1qm0p4vf9jvcnn43s6l4prk8zn6cx0ep9gzvevxecv729xz540v8qa742eg",
"enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSArbEpzdk0xQTFkM2V0K2xz\nRFhDak0ybkhZUjJJdVI4YTl3cStXT2hTZDBFCmRvQ3ZXYkQ1NktCb004ZE1FS1FF\naSt4RlVXSlRhYWdlQ3htTkdkb2dyVDAKLS0tIG16VFNQM0dnaGVSRmlFRFB0WWtW\nN0dPL08rV01sY3ovRnEvUnNMaWVhd2sKvQIZIo5pPMXKh9Ea3ZgHj99Dn1X3JkmB\noscG8S7HOJh/cw+uITmkuv00TyIA9pid6L1kXvfcfv+tcuY9H1Vg4w==\n-----END AGE ENCRYPTED FILE-----\n"
}
],
"lastmodified": "2025-10-31T07:08:30Z",
"mac": "ENC[AES256_GCM,data:bmvshL97XNvNYYg0EjkUAQViHpKJ/+A+CGE90/uSM2WXooJF5yzvVJSHLAuYxWM295awN8ygTRUZ2VJ0SyfjzjAyUIH4SxqlrgywqMouyVsiFDAB6R4AmMmbvvC6rSs/TSMOwYC5pchrISbpsE2kmJnAXCqcev6Q0fl8Sa1PSxo=,iv:BuBQCFb3EWfG+bPzgaRDseDq6MJQ/Fs8okvksvEj1bA=,tag:n14VDbQk+zl+XbJPkTRAGg==,type:str]",
"version": "3.11.0"
}
}

View File

@@ -1 +0,0 @@
../../../../../../sops/users/admin

View File

@@ -1 +0,0 @@
202:fe87:1ca6:3cfd:e095:c2b1:321c:c391

View File

@@ -1 +0,0 @@
../../../../../../sops/machines/server

View File

@@ -1,18 +0,0 @@
{
"data": "ENC[AES256_GCM,data:0LwQxArH6fpIYpGIEzPtjh8elyKSaed7L+KqgnIlPVneR0UbsbOM6p5kVGTRPh5LWH6jmkURCqc2c5oT5CNLBePLQcgvtfLDSFWyyPrD9WtBSPu+YGF7K51JUUIkX07//LqTQQaM5Uu/STQRIoL1BD0Tofk2woA=,iv:3rSDqBj8N9RsSLijZm7mUUjUhiLHc2yidGkil8NvCD8=,tag:F8zlw9pfMjZdJSObDePLsQ==,type:str]",
"sops": {
"age": [
{
"recipient": "age1fdkan6n20swmut0sa86g5a6gxrj8qj2sgqe8hxtw32c0u9rr4drqlyr5mf",
"enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSB0NnVzT0lOWnFTUU85c0d5\nZ0Q1b0xkS1NWbWVsc0o1emxLOW5NRU52REFZCjRkUGJHaDhyazdFdkxWaW1XVW53\nb25pUXlDRmhrTHlIWGl6RDJBZ2hTOW8KLS0tIGsxQmlQejkvQk9wTmtMQzZJa2dB\na0piOGlyMzVrTmNOUEhtaDNTWHdwTDAKroQG8KlnWZ6gwu1y0mr0gGezDF1jsS0Y\nC1LUAarHl+lY51sw+HJT88Y9mDfLjvYIMHKS33zdJuBXbNpoIfWyzA==\n-----END AGE ENCRYPTED FILE-----\n"
},
{
"recipient": "age1qm0p4vf9jvcnn43s6l4prk8zn6cx0ep9gzvevxecv729xz540v8qa742eg",
"enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBqQVJhYkI1eEFYL0d5OE1F\nSStqV0xPb0pybyt2QWd4SEpiaDhlNDJicTA0CkgrVU9FcThuQktaMThTaXBmWHNV\nd2tpMVVYT21TWUFvMS9wakl4RyszTGsKLS0tIHVVeDdoMUJQaURMOGFkM3dNa3ZG\nMmVPdEg3bmdZZHgwaGpnbFFKUTdvcUUKTaxEfp19+9AJihqx51m0cLz6IuR5pvnT\nt90kZxq+BH3/6gjiDlhwzqztnMbdqQYcVuCDVp/1aVWfThABUZ92aQ==\n-----END AGE ENCRYPTED FILE-----\n"
}
],
"lastmodified": "2025-12-05T04:42:06Z",
"mac": "ENC[AES256_GCM,data:1/u3c/wf2Gh6PPeVTKKGBxG1FWvN7hyuzx3Qa7yU3yKCD7LDHrrzTbQkFHDo1ZrXixK5NICCw48BWA0Jao0kItu6aU1Dbk5PexZI9ls1eyaDS7nwtZuHKDSEtDYu/kx5kZgQKH9tsokLqKlcoeocS0Mp1tjvUSQsiZFaYsuKaM4=,iv:gCPqFgpwjSONn/JN3dpJOk1BXtdd9cvIAz/NKPuAdKg=,tag:j8upk9sgDiYj5lmfU4V+OQ==,type:str]",
"version": "3.11.0"
}
}

View File

@@ -1 +0,0 @@
../../../../../../sops/users/admin

View File

@@ -1,3 +0,0 @@
-----BEGIN PUBLIC KEY-----
MCowBQYDK2VwAyEAIC8cazhgQ+1Hqdm8Z43J5ooymP2ytrBEvdfXYz0ryp8=
-----END PUBLIC KEY-----

View File

@@ -1 +0,0 @@
201:b9d:4329:71c2:79ca:3648:e86d:4236

View File

@@ -1 +0,0 @@
../../../../../../sops/machines/server

View File

@@ -1,18 +0,0 @@
{
"data": "ENC[AES256_GCM,data:bAJv40t1hkgMBz4boOEIw9GIY/4UFYI2WZidRrU88ky0JDBwSmHDnxuBFRpdjfAx7sO9d6vSHxAmaf45NlTKwnkUJnaIW0NK+979lXbLV+AG0suc4Vci6fsdbAHofR//3DfTYs03HoALkRUgRemTl7kQtdMB6E6LN02OE19HSVuFjMiEipwosmFfMoR69ZZuPSzNg1uVnw==,iv:LbZZGbwkXc71PAKgjD2CvXJVtyiqgi+cNsBzbulPyIk=,tag:VPESc2Y8SdU5CovQinZleA==,type:str]",
"sops": {
"age": [
{
"recipient": "age1fdkan6n20swmut0sa86g5a6gxrj8qj2sgqe8hxtw32c0u9rr4drqlyr5mf",
"enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSB2L3FzSkh3UTkvdTR6eEVE\nNnYrcnAydUl4QnJSbWJRbFFQODFmSld1YkJZCnNFUHp6YjQ3WW0vVHh5dXZBMzFJ\nYWRnZWNHN2dkL1JBWHNrZTcvTHI5S3MKLS0tIGpnekxneURuMWFkQ1RLTEszTFhi\nUUkzR2ljTXFhb1c2RDhpeFJXaXpYakUK/fLOqjNR2LML7uN3fiB9GdhWTDcr0wn4\n37ESeS1kx0EobRMaDVu8GPZovcdypFOOPiuUpEu6hIEdwvl736oDSA==\n-----END AGE ENCRYPTED FILE-----\n"
},
{
"recipient": "age1qm0p4vf9jvcnn43s6l4prk8zn6cx0ep9gzvevxecv729xz540v8qa742eg",
"enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBjQWE2L3F1RW9oNlQzR0I3\nZDJoZ1hIM2N0Mm1aQ1IrN1gweWZxeWVGdUdzCmlIZXdKYm8rUGkvVVpiY1BJZmlD\nN0MwRHN3dUNrRU9McjNFMXpranJGU1UKLS0tIG1yMmJGaEp1cU1iZGdqdzRUTWZW\nZzZrVkRuOTBTcnFuaTE1Um1ISUxBaTQKf842rL3N7Gl1QfrIURWiu26LwO0ERkP4\nvfXN2HH1jjp2pblQF9qb+5vmUsaX1pPSY1R+YMvUK7wIwOb9zyIfmQ==\n-----END AGE ENCRYPTED FILE-----\n"
}
],
"lastmodified": "2025-10-31T07:50:02Z",
"mac": "ENC[AES256_GCM,data:/c1jqMSLd9/fxm1PxtRITr3qkjtrlJ/5wJgEVkraAqU6XTuzSyseMhdeWLL2Fy2OunT/+alM6VpaliBmcZqRkSSGngbuvMsujDiJLgUXQ8wNhMcK7ln/dqFMcA+RYGxihGEMwuPKs3yOVKj9PDzFYnm6TUCFkU/heotI/hQ1lQI=,iv:EsWsi4r4DctMLvi4WmqKe0D1NTHwYVKCcxKQ+6grzYg=,tag:28dmpzF/6dbvGIriaBVKPw==,type:str]",
"version": "3.11.0"
}
}

View File

@@ -1 +0,0 @@
../../../../../../sops/users/admin

View File

@@ -0,0 +1,23 @@
{ ... }:
{
_class = "clan.service";
manifest.name = "pingvin";
manifest.description = "A self-hosted file sharing platform that combines lightness and beauty, perfect for seamless and efficient file sharing.";
manifest.categories = [ "System" ];
roles.default = {
perInstance.nixosModule =
{
config,
...
}:
{
services.pingvin-share = {
enable = true;
};
clan.core.state.pingvin-share.folders = [ config.services.pingvin-share.dataDir ];
};
};
}

View File

@@ -0,0 +1,19 @@
{ lib, ... }:
let
module = lib.modules.importApply ./default.nix { };
in
{
clan.modules = {
pingvin = module;
};
perSystem =
{ ... }:
{
clan.nixosTests.service-pingvin = {
imports = [ ./tests/vm/default.nix ];
clan.modules."@clan/pingvin" = module;
};
};
}

View File

@@ -0,0 +1,42 @@
{
...
}:
{
name = "service-pingvin";
clan = {
directory = ./.;
inventory = {
machines.server = { };
instances = {
pingvin-test = {
module.name = "@clan/pingvin";
module.input = "self";
roles.default.machines."server".settings = { };
};
};
};
};
nodes = {
server = {
services.pingvin-share = {
hostname = "share.localhost";
frontend.port = 3000;
backend.port = 8000;
};
};
};
testScript = ''
start_all()
server.wait_for_unit("pingvin-share-frontend")
server.succeed("systemctl status pingvin-share-frontend")
server.wait_for_open_port(3000)
server.wait_for_open_port(8000)
server.succeed("curl -H \"Host: share.localhost\" http://127.0.0.1:3000 ")
'';
}

View File

@@ -3,11 +3,9 @@
_class = "clan.service"; _class = "clan.service";
manifest.name = "pocket-id"; manifest.name = "pocket-id";
manifest.description = "A simple and easy-to-use OIDC provider that allows users to authenticate with their passkeys to your services."; manifest.description = "A simple and easy-to-use OIDC provider that allows users to authenticate with their passkeys to your services.";
manifest.readme = "A simple and easy-to-use OIDC provider that allows users to authenticate with their passkeys to your services.";
manifest.categories = [ "System" ]; manifest.categories = [ "System" ];
roles.default = { roles.default = {
description = "a default server role";
perInstance.nixosModule = perInstance.nixosModule =
{ {

View File

@@ -1,44 +0,0 @@
{ ... }:
{
_class = "clan.service";
manifest.name = "pulse-stream";
manifest.description = "stream audio to attached speakers";
manifest.readme = "stream audio to attached speakers";
manifest.categories = [ "System" ];
roles.default = {
description = "a default role";
interface =
{ lib, ... }:
{
options.client-ip-ranges = lib.mkOption {
type = lib.types.listOf lib.types.str;
description = "ip subnets permitted to stream to the server";
default = [ ];
};
};
perInstance =
{
roles,
settings,
...
}:
{
nixosModule =
{ ... }:
{
services.pulseaudio = {
enable = true;
systemWide = true;
tcp = {
enable = true;
anonymousClients.allowedIpRanges = settings.client-ip-ranges;
anonymousClients.allowAll = true;
};
zeroconf.publish.enable = true;
};
networking.firewall.allowedTCPPorts = [ 4713 ];
};
};
};
}

View File

@@ -1,9 +0,0 @@
{ lib, ... }:
let
module = lib.modules.importApply ./default.nix { };
in
{
clan.modules = {
pulse-stream = module;
};
}

View File

@@ -3,11 +3,9 @@
_class = "clan.service"; _class = "clan.service";
manifest.name = "stirling-pdf"; manifest.name = "stirling-pdf";
manifest.description = "Your locally hosted one-stop-shop for all your PDF needs."; manifest.description = "Your locally hosted one-stop-shop for all your PDF needs.";
manifest.readme = "Your locally hosted one-stop-shop for all your PDF needs.";
manifest.categories = [ "System" ]; manifest.categories = [ "System" ];
roles.default = { roles.default = {
description = "a default server role";
perInstance.nixosModule = perInstance.nixosModule =
{ {
lib, lib,

View File

@@ -3,11 +3,9 @@
_class = "clan.service"; _class = "clan.service";
manifest.name = "Victoria Metrics"; manifest.name = "Victoria Metrics";
manifest.description = "VictoriaMetrics: fast, cost-effective monitoring solution and time series database"; manifest.description = "VictoriaMetrics: fast, cost-effective monitoring solution and time series database";
manifest.readme = "VictoriaMetrics: fast, cost-effective monitoring solution and time series database";
manifest.categories = [ "System" ]; manifest.categories = [ "System" ];
roles.default = { roles.default = {
description = "a default server role";
perInstance.nixosModule = perInstance.nixosModule =
{ {
config, config,

View File

@@ -3,11 +3,9 @@
_class = "clan.service"; _class = "clan.service";
manifest.name = "vikunja"; manifest.name = "vikunja";
manifest.description = "The to-do app to organize your life."; manifest.description = "The to-do app to organize your life.";
manifest.readme = "The to-do app to organize your life.";
manifest.categories = [ "System" ]; manifest.categories = [ "System" ];
roles.default = { roles.default = {
description = "a default server role";
perInstance.nixosModule = perInstance.nixosModule =
{ {
lib, lib,

View File

@@ -3,11 +3,9 @@
_class = "clan.service"; _class = "clan.service";
manifest.name = "yggdrasil"; manifest.name = "yggdrasil";
manifest.description = "An in scalable routing as an encrypted IPv6 overlay network"; manifest.description = "An in scalable routing as an encrypted IPv6 overlay network";
manifest.readme = "An in scalable routing as an encrypted IPv6 overlay network";
manifest.categories = [ "System" ]; manifest.categories = [ "System" ];
roles.default = { roles.default = {
description = "a default peer role";
perInstance.nixosModule = perInstance.nixosModule =
{ {
lib, lib,

View File

@@ -3,11 +3,5 @@
common = { common = {
imports = [ ./common.nix ]; imports = [ ./common.nix ];
}; };
think-gtcm = {
imports = [ ./think-gtcm.nix ];
};
think-backend-gtcm = {
imports = [ ./think-backend-gtcm.nix ];
};
}; };
} }

View File

@@ -1,348 +0,0 @@
{
config,
pkgs,
lib,
...
}:
let
cfg = config.services.think-backend-greaterchiangmai;
think-backend-gtcm = pkgs.think-backend-gtcm.override { dataDir = cfg.dataDir; };
file-uploader = pkgs.gtcm-file-uploader.override { dataDir = cfg.dataDir; };
nginxNodeProxyConfig = ''
proxy_pass http://127.0.0.1:3000;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $host;
proxy_set_header x-webobjects-server-protocol HTTP/1.0;
proxy_set_header x-webobjects-remote-host 127.0.0.1;
proxy_set_header x-webobjects-server-port $server_port;
proxy_set_header x-webobjects-server-name $server_name;
proxy_set_header x-webobjects-server-url $scheme://$host;
proxy_connect_timeout 90;
proxy_send_timeout 90;
proxy_read_timeout 90;
proxy_buffer_size 64k;
proxy_buffers 8 64k;
proxy_busy_buffers_size 64k;
proxy_temp_file_write_size 64k;
client_max_body_size 50m;
client_body_buffer_size 128k;
'';
defaultUser = "gtcm";
defaultGroup = "gtcm";
php = pkgs.php83;
artisan-be = pkgs.writeScriptBin "gtcm-be" ''
#! ${pkgs.runtimeShell}
cd ${think-backend-gtcm}
sudo() {
if [[ "$USER" != ${cfg.user} ]]; then
exec /run/wrappers/bin/sudo -u ${cfg.user} "$@"
else
exec "$@"
fi
}
sudo ${lib.getExe php} artisan "$@"
'';
in
{
options.services.think-backend-greaterchiangmai = {
enable = lib.mkEnableOption "To enable think.greaterchiangmai.com";
dataDir = lib.mkOption {
type = lib.types.path;
default = "/var/lib/think-backend.greaterchiangmai.com";
description = "A place where to store states";
};
user = lib.mkOption {
type = lib.types.str;
default = defaultUser;
description = "User account under which this runs.";
};
group = lib.mkOption {
type = lib.types.str;
default = defaultGroup;
defaultText = "${defaultGroup}";
description = "Group under which the website runs.";
};
package = lib.mkPackageOption pkgs "think-backend-gtcm" { };
domain = lib.mkOption {
type = lib.types.str;
default = "think-backend.greaterchiangmai.com";
example = "forum.example.com";
description = "Domain to serve on.";
};
settings = lib.mkOption {
type =
with lib.types;
attrsOf (
nullOr (
either
(oneOf [
bool
int
port
path
str
])
(submodule {
options = {
_secret = lib.mkOption {
type = nullOr str;
description = ''
The path to a file containing the value the
option should be set to in the final
configuration file.
'';
};
};
})
)
);
default = { };
description = ''
Options for settings environment variables
'';
example = lib.literalExpression ''
{
APP_NAME = "Laravel";
APP_ENV = "local";
APP_KEY = "key";
APP_DEBUG = true;
APP_URL = "http://localhost";
LOG_CHANNEL = "stack";
LOG_DEPRECATIONS_CHANNEL = "null";
LOG_LEVEL = "debug";
DB_CONNECTION = "mysql";
DB_HOST = "127.0.0.1";
DB_PORT = "3306";
DB_DATABASE = "laravel";
DB_USERNAME = "root";
DB_PASSWORD = "";
}
'';
};
};
config = lib.mkIf cfg.enable {
users.users.${cfg.user} = lib.mkForce {
isSystemUser = true;
home = cfg.dataDir;
createHome = true;
homeMode = "755";
group = cfg.group;
};
users.groups.${cfg.group} = { };
services.phpfpm.pools.think-backend-gtcm = {
inherit (cfg) user group;
phpPackage = php;
settings = {
"listen.owner" = config.services.nginx.user;
"listen.group" = config.services.nginx.group;
"listen.mode" = "0600";
"pm" = lib.mkDefault "dynamic";
"pm.max_children" = lib.mkDefault 10;
"pm.max_requests" = lib.mkDefault 500;
"pm.start_servers" = lib.mkDefault 2;
"pm.min_spare_servers" = lib.mkDefault 1;
"pm.max_spare_servers" = lib.mkDefault 3;
};
phpOptions = ''
error_log = syslog
log_errors = on
'';
};
systemd.services.gtcm-file-uploader = {
description = "File upload service for think-backend.greaterchiangmai.com";
requiredBy = [ "phpfpm-think-backend-gtcm.service" ];
before = [ "phpfpm-think-backend-gtcm.service" ];
serviceConfig = {
User = cfg.user;
WorkingDirectory = "${file-uploader}";
ExecStart = "${lib.getExe pkgs.nodejs_20} ${file-uploader}/src/be/index.js";
Restart = "on-failure";
};
path = [ pkgs.nodejs_20 ];
};
environment.systemPackages = [
artisan-be
];
services.think-backend-greaterchiangmai.settings = {
APP_SERVICES_CACHE = lib.mkDefault "${cfg.dataDir}/cache/services.php";
APP_PACKAGES_CACHE = lib.mkDefault "${cfg.dataDir}/cache/packages.php";
APP_CONFIG_CACHE = lib.mkDefault "${cfg.dataDir}/cache/config.php";
APP_ROUTES_CACHE = lib.mkDefault "${cfg.dataDir}/cache/routes-v7.php";
APP_EVENTS_CACHE = lib.mkDefault "${cfg.dataDir}/cache/events.php";
};
systemd.services.think-backend-gtcm-setup = {
description = "think-backend.greaterchiangmai installation";
requiredBy = [ "phpfpm-think-backend-gtcm.service" ];
before = [ "phpfpm-think-backend-gtcm.service" ];
requires = [ "mysql.service" ];
after = [ "mysql.service" ];
serviceConfig = {
type = "oneshot";
RemainAfterExit = true;
User = cfg.user;
UMask = 77;
WorkingDirectory = "${think-backend-gtcm}";
RuntimeDirectory = "think-backend-gtcm/cache";
RuntimeDirectoryMode = 700;
};
path = [ pkgs.replace-secret ];
script =
let
isSecret = v: lib.isAttrs v && v ? _secret && lib.isString v._secret;
gtcmEnvVars = lib.generators.toKeyValue {
mkKeyValue = lib.flip lib.generators.mkKeyValueDefault "=" {
mkValueString =
v:
with builtins;
if isInt v then
toString v
else if isString v then
v
else if true == v then
"true"
else if false == v then
"false"
else if isSecret v then
hashString "sha256" v._secret
else
throw "unsupported type ${typeOf v}: ${(lib.generators.toPretty { }) v}";
};
};
secretPaths = lib.mapAttrsToList (_: v: v._secret) (lib.filterAttrs (_: isSecret) cfg.settings);
mkSecretReplacement = file: ''
replace-secret ${
lib.escapeShellArgs [
(builtins.hashString "sha256" file)
file
"${cfg.dataDir}/.env"
]
}
'';
secretReplacements = lib.concatMapStrings mkSecretReplacement secretPaths;
filteredConfig = lib.converge (lib.filterAttrsRecursive (
_: v:
!lib.elem v [
{ }
null
]
)) cfg.settings;
gtcmEnv = pkgs.writeText "gtcm-be.env" (gtcmEnvVars filteredConfig);
in
''
# error handling
set -euo pipefail
# create .env file
install -T -m 0600 -o ${cfg.user} ${gtcmEnv} "${cfg.dataDir}/.env"
${secretReplacements}
if ! grep 'APP_KEY=base64:' "${cfg.dataDir}/.env" >/dev/null; then
sed -i 's/APP_KEY=/APP_KEY=base64:/' "${cfg.dataDir}/.env"
fi
# migrate & seed db
${lib.getExe php} artisan key:generate --force
${lib.getExe php} artisan migrate --force
${lib.getExe php} artisan storage:link
${lib.getExe php} artisan config:cache
'';
};
systemd.tmpfiles.rules = [
"d ${cfg.dataDir} 0710 ${cfg.user} ${cfg.group} - -"
"d ${cfg.dataDir}/cache 0700 ${cfg.user} ${cfg.group} - -"
"d ${cfg.dataDir}/public 0755 ${cfg.user} ${cfg.group} - -"
"d ${cfg.dataDir}/public/uploads 0755 ${cfg.user} ${cfg.group} - -"
"d ${cfg.dataDir}/storage 0700 ${cfg.user} ${cfg.group} - -"
"d ${cfg.dataDir}/storage/app 0700 ${cfg.user} ${cfg.group} - -"
"d ${cfg.dataDir}/storage/fonts 0700 ${cfg.user} ${cfg.group} - -"
"d ${cfg.dataDir}/storage/framework 0700 ${cfg.user} ${cfg.group} - -"
"d ${cfg.dataDir}/storage/framework/cache 0700 ${cfg.user} ${cfg.group} - -"
"d ${cfg.dataDir}/storage/framework/sessions 0700 ${cfg.user} ${cfg.group} - -"
"d ${cfg.dataDir}/storage/framework/views 0700 ${cfg.user} ${cfg.group} - -"
"d ${cfg.dataDir}/storage/logs 0700 ${cfg.user} ${cfg.group} - -"
"d ${cfg.dataDir}/storage/uploads 0700 ${cfg.user} ${cfg.group} - -"
"d ${cfg.dataDir}/gtcm-file-uploader/uploads 0700 ${cfg.user} ${cfg.group} - -"
];
networking.firewall.allowedTCPPorts = [
80
443
];
services.nginx = {
enable = true;
recommendedTlsSettings = true;
recommendedOptimisation = true;
recommendedGzipSettings = true;
recommendedBrotliSettings = true;
recommendedProxySettings = true;
virtualHosts."${cfg.domain}" = {
root = "${think-backend-gtcm}/public";
locations = {
"/" = {
index = "index.php";
tryFiles = "$uri $uri/ /index.php?$query_string";
};
"/uploads" = {
root = "${cfg.dataDir}/public/uploads";
index = "index.php index.html";
tryFiles = "$uri $uri/ /index.php";
};
"/storage" = {
root = "${cfg.dataDir}/public/storage";
index = "index.php index.html";
tryFiles = "$uri $uri/ /index.php";
};
"~ \\.php$".extraConfig = ''
fastcgi_pass unix:${config.services.phpfpm.pools."think-backend-gtcm".socket};
'';
"~ \\.(js|css|gif|png|ico|jpg|jpeg)$" = {
extraConfig = "expires 365d;";
};
"^~ /initiate-multipart-upload".extraConfig = nginxNodeProxyConfig;
"^~ /get-presigned-url".extraConfig = nginxNodeProxyConfig;
"^~ /complete-multipart-upload".extraConfig = nginxNodeProxyConfig;
"^~ /generate-presigned-url".extraConfig = nginxNodeProxyConfig;
"^~ /enable-bucket-cors".extraConfig = nginxNodeProxyConfig;
"^~ /upload".extraConfig = nginxNodeProxyConfig;
};
};
};
services.mysql = {
enable = true;
package = lib.mkForce pkgs.mariadb;
ensureDatabases = [ cfg.settings.DB_DATABASE ];
ensureUsers = [
{
name = cfg.settings.DB_USERNAME;
ensurePermissions = {
"${cfg.settings.DB_DATABASE}.*" = "ALL PRIVILEGES";
};
}
];
};
};
}

View File

@@ -1,305 +0,0 @@
{
config,
pkgs,
lib,
...
}:
let
cfg = config.services.think-greaterchiangmai;
think-gtcm = pkgs.think-gtcm.override { dataDir = cfg.dataDir; };
defaultUser = "gtcm";
defaultGroup = "gtcm";
php = pkgs.php83;
artisan = pkgs.writeScriptBin "gtcm" ''
#! ${pkgs.runtimeShell}
cd ${think-gtcm}
sudo() {
if [[ "$USER" != ${cfg.user} ]]; then
exec /run/wrappers/bin/sudo -u ${cfg.user} "$@"
else
exec "$@"
fi
}
sudo ${lib.getExe php} artisan "$@"
'';
in
{
options.services.think-greaterchiangmai = {
enable = lib.mkEnableOption "To enable think.greaterchiangmai.com";
dataDir = lib.mkOption {
type = lib.types.path;
default = "/var/lib/think.greaterchiangmai.com";
description = "A place where to store states";
};
user = lib.mkOption {
type = lib.types.str;
default = defaultUser;
description = "User account under which this runs.";
};
group = lib.mkOption {
type = lib.types.str;
default = defaultGroup;
defaultText = "${defaultGroup}";
description = "Group under which the website runs.";
};
package = lib.mkPackageOption pkgs "think-gtcm" { };
packageBackend = lib.mkPackageOption pkgs "think-backend-gtcm" { };
domain = lib.mkOption {
type = lib.types.str;
default = "think.greaterchiangmai.com";
example = "forum.example.com";
description = "Domain to serve on.";
};
settings = lib.mkOption {
type =
with lib.types;
attrsOf (
nullOr (
either
(oneOf [
bool
int
port
path
str
])
(submodule {
options = {
_secret = lib.mkOption {
type = nullOr str;
description = ''
The path to a file containing the value the
option should be set to in the final
configuration file.
'';
};
};
})
)
);
default = { };
description = ''
Options for settings environment variables
'';
example = lib.literalExpression ''
{
APP_NAME = "Laravel";
APP_ENV = "local";
APP_KEY = "key";
APP_DEBUG = true;
APP_URL = "http://localhost";
LOG_CHANNEL = "stack";
LOG_DEPRECATIONS_CHANNEL = "null";
LOG_LEVEL = "debug";
DB_CONNECTION = "mysql";
DB_HOST = "127.0.0.1";
DB_PORT = "3306";
DB_DATABASE = "laravel";
DB_USERNAME = "root";
DB_PASSWORD = "";
}
'';
};
};
config = lib.mkIf cfg.enable {
users.users.${cfg.user} = {
isSystemUser = true;
home = cfg.dataDir;
createHome = true;
homeMode = "755";
group = cfg.group;
};
users.groups.${cfg.group} = { };
services.phpfpm.pools.think-gtcm = {
inherit (cfg) user group;
phpPackage = php;
settings = {
"listen.owner" = config.services.nginx.user;
"listen.group" = config.services.nginx.group;
"listen.mode" = "0600";
"pm" = lib.mkDefault "dynamic";
"pm.max_children" = lib.mkDefault 10;
"pm.max_requests" = lib.mkDefault 500;
"pm.start_servers" = lib.mkDefault 2;
"pm.min_spare_servers" = lib.mkDefault 1;
"pm.max_spare_servers" = lib.mkDefault 3;
};
phpOptions = ''
error_log = syslog
log_errors = on
'';
};
environment.systemPackages = [
artisan
];
services.think-greaterchiangmai.settings = {
APP_SERVICES_CACHE = lib.mkDefault "${cfg.dataDir}/cache/services.php";
APP_PACKAGES_CACHE = lib.mkDefault "${cfg.dataDir}/cache/packages.php";
APP_CONFIG_CACHE = lib.mkDefault "${cfg.dataDir}/cache/config.php";
APP_ROUTES_CACHE = lib.mkDefault "${cfg.dataDir}/cache/routes-v7.php";
APP_EVENTS_CACHE = lib.mkDefault "${cfg.dataDir}/cache/events.php";
};
systemd.services.think-gtcm-setup = {
description = "think.greaterchiangmai installation";
requiredBy = [ "phpfpm-think-gtcm.service" ];
before = [ "phpfpm-think-gtcm.service" ];
requires = [ "mysql.service" ];
after = [ "mysql.service" ];
serviceConfig = {
type = "oneshot";
RemainAfterExit = true;
User = cfg.user;
UMask = 77;
WorkingDirectory = "${think-gtcm}";
RuntimeDirectory = "think-gtcm/cache";
RuntimeDirectoryMode = 700;
};
path = [ pkgs.replace-secret ];
script =
let
isSecret = v: lib.isAttrs v && v ? _secret && lib.isString v._secret;
gtcmEnvVars = lib.generators.toKeyValue {
mkKeyValue = lib.flip lib.generators.mkKeyValueDefault "=" {
mkValueString =
v:
with builtins;
if isInt v then
toString v
else if isString v then
v
else if true == v then
"true"
else if false == v then
"false"
else if isSecret v then
hashString "sha256" v._secret
else
throw "unsupported type ${typeOf v}: ${(lib.generators.toPretty { }) v}";
};
};
secretPaths = lib.mapAttrsToList (_: v: v._secret) (lib.filterAttrs (_: isSecret) cfg.settings);
mkSecretReplacement = file: ''
replace-secret ${
lib.escapeShellArgs [
(builtins.hashString "sha256" file)
file
"${cfg.dataDir}/.env"
]
}
'';
secretReplacements = lib.concatMapStrings mkSecretReplacement secretPaths;
filteredConfig = lib.converge (lib.filterAttrsRecursive (
_: v:
!lib.elem v [
{ }
null
]
)) cfg.settings;
gtcmEnv = pkgs.writeText "gtcm.env" (gtcmEnvVars filteredConfig);
in
''
# error handling
set -euo pipefail
# create .env file
install -T -m 0600 -o ${cfg.user} ${gtcmEnv} "${cfg.dataDir}/.env"
${secretReplacements}
if ! grep 'APP_KEY=base64:' "${cfg.dataDir}/.env" >/dev/null; then
sed -i 's/APP_KEY=/APP_KEY=base64:/' "${cfg.dataDir}/.env"
fi
# migrate & seed db
${lib.getExe php} artisan key:generate --force
${lib.getExe php} artisan migrate --force
${lib.getExe php} artisan storage:link
${lib.getExe php} artisan config:cache
'';
};
systemd.tmpfiles.rules = [
"d ${cfg.dataDir} 0710 ${cfg.user} ${cfg.group} - -"
"d ${cfg.dataDir}/cache 0700 ${cfg.user} ${cfg.group} - -"
"d ${cfg.dataDir}/public 0750 ${cfg.user} ${cfg.group} - -"
"d ${cfg.dataDir}/public/uploads 0750 ${cfg.user} ${cfg.group} - -"
"d ${cfg.dataDir}/storage 0700 ${cfg.user} ${cfg.group} - -"
"d ${cfg.dataDir}/storage/app 0700 ${cfg.user} ${cfg.group} - -"
"d ${cfg.dataDir}/storage/fonts 0700 ${cfg.user} ${cfg.group} - -"
"d ${cfg.dataDir}/storage/framework 0700 ${cfg.user} ${cfg.group} - -"
"d ${cfg.dataDir}/storage/framework/cache 0700 ${cfg.user} ${cfg.group} - -"
"d ${cfg.dataDir}/storage/framework/sessions 0700 ${cfg.user} ${cfg.group} - -"
"d ${cfg.dataDir}/storage/framework/views 0700 ${cfg.user} ${cfg.group} - -"
"d ${cfg.dataDir}/storage/logs 0700 ${cfg.user} ${cfg.group} - -"
"d ${cfg.dataDir}/storage/uploads 0700 ${cfg.user} ${cfg.group} - -"
];
networking.firewall.allowedTCPPorts = [
80
443
];
services.nginx = {
enable = true;
recommendedTlsSettings = true;
recommendedOptimisation = true;
recommendedGzipSettings = true;
recommendedBrotliSettings = true;
recommendedProxySettings = true;
virtualHosts."${cfg.domain}" = {
root = "${think-gtcm}/public";
locations = {
"/" = {
index = "index.php";
tryFiles = "$uri $uri/ /index.php?$query_string";
};
"/uploads" = {
root = "${cfg.dataDir}/public/uploads";
index = "index.php index.html";
tryFiles = "$uri $uri/ /index.php";
};
"/storage" = {
root = "${cfg.dataDir}/public/storage";
index = "index.php index.html";
tryFiles = "$uri $uri/ /index.php";
};
"~ \\.php$".extraConfig = ''
fastcgi_pass unix:${config.services.phpfpm.pools."think-gtcm".socket};
'';
"~ \\.(js|css|gif|png|ico|jpg|jpeg)$" = {
extraConfig = "expires 365d;";
};
};
};
};
services.mysql = {
enable = true;
package = pkgs.mariadb;
ensureDatabases = [ cfg.settings.DB_DATABASE ];
ensureUsers = [
{
name = cfg.settings.DB_USERNAME;
ensurePermissions = {
"${cfg.settings.DB_DATABASE}.*" = "ALL PRIVILEGES";
};
}
];
};
};
}

View File

@@ -1,6 +0,0 @@
{ ... }:
{
flake.overlays = {
packagesOverlay = import ../pkgs/overlay.nix;
};
}

View File

@@ -1,40 +0,0 @@
{
fetchgit,
buildNpmPackage,
pkgs,
dataDir ? "/var/lib/gtcm-file-uploader",
}:
let
repoSrc = fetchgit {
url = "https://git.b4l.co.th/newedge/think-greaterchiangmai";
rev = "6f8c8d7dfaf5a0c1eb2077de1d6fb35ceaf3d4ec";
hash = "sha256-2mCdn8xGjWZrANclctGTmxQhkNc43VzlzMTVwVIFJcM=";
};
src = "${repoSrc}/upload-large-file";
in
buildNpmPackage {
pname = "gtcm-file-uploader";
version = "1.0.0";
nativeBuildInputs = with pkgs; [
nodejs_20
breakpointHook
];
inherit src;
npmDepsHash = "sha256-JEp2F1CQfuV9fSYZRdRO+BiOE9dy1ReK6doJcqCuxu4=";
buildPhase = ''
npm install
'';
installPhase = ''
runHook preInstall
mkdir -p $out
cp -r * $out
ln -s ${dataDir}/.env $out/.env
ln -s ${dataDir}/gtcm-file-uploader/uploads $out/src/be/uploads
runHook postInstall
'';
}

View File

@@ -1,5 +0,0 @@
final: prev: {
think-gtcm = final.callPackage ./think-gtcm.nix { };
think-backend-gtcm = final.callPackage ./think-backend-gtcm.nix { php = final.php83; };
gtcm-file-uploader = final.callPackage ./gtcm-file-uploader.nix { };
}

View File

@@ -1,36 +0,0 @@
{
fetchgit,
php,
dataDir ? "/var/lib/think-backend-gtcm",
}:
let
repoSrc = fetchgit {
url = "https://git.b4l.co.th/newedge/think-greaterchiangmai";
rev = "7c17aa78436538241c09fc7d633904d3c063011e";
hash = "sha256-GDx0+PmuCXC+UPtsvsocCZQiTPcnOZEzJI17sxrVv7Q=";
};
src = "${repoSrc}/think-backend.greaterchiangmai.com";
in
php.buildComposerProject2 (finalAttrs: {
pname = "think-backend-gtcm";
version = "1.0.0";
inherit src;
installPhase = ''
runHook preInstall
mkdir -p $out
cp -R * $out
rm -rf $out/storage
ln -s ${dataDir}/.env $out/.env
ln -s ${dataDir}/storage $out/storage
ln -s ${dataDir}/public/storage $out/public/storage
ln -s ${dataDir}/public/uploads $out/public/uploads
runHook postInstall
'';
composerStrictValidation = false;
vendorHash = "sha256-wGfbprSDULBje1s5y3+ZiU/nCwYGDEULobZzyzGZ9bQ=";
})

View File

@@ -1,36 +0,0 @@
{
fetchgit,
php,
dataDir ? "/var/lib/think-gtcm",
}:
let
repoSrc = fetchgit {
url = "https://git.b4l.co.th/newedge/think-greaterchiangmai";
rev = "7c17aa78436538241c09fc7d633904d3c063011e";
hash = "sha256-GDx0+PmuCXC+UPtsvsocCZQiTPcnOZEzJI17sxrVv7Q=";
};
src = "${repoSrc}/think.greaterchiangmai.com";
in
php.buildComposerProject2 (finalAttrs: {
pname = "think-gtcm";
version = "1.0.0";
inherit src;
installPhase = ''
runHook preInstall
mkdir -p $out
cp -R * $out
rm -rf $out/storage
ln -s ${dataDir}/.env $out/.env
ln -s ${dataDir}/storage $out/storage
ln -s ${dataDir}/public/storage $out/public/storage
ln -s ${dataDir}/public/uploads $out/public/uploads
runHook postInstall
'';
composerStrictValidation = false;
vendorHash = "sha256-b8+AKUmjQiOdV8UC9GYfJzAHFs9+FRSH91YsxKt0rDA=";
})

View File

@@ -1,6 +0,0 @@
[
{
"publickey": "age1dytdeqtct0jy3vvmqvapgqjf3v9p486jjcpx60gfxwgrptgyyqrs0lj9vc",
"type": "age"
}
]

View File

@@ -1,6 +0,0 @@
[
{
"publickey": "age1pgxgvwck2vr3va6c4c3utj7w2rfg2st9qvm76nc92vhfmplqmu4qs928lm",
"type": "age"
}
]

View File

@@ -1,6 +0,0 @@
[
{
"publickey": "age14x2fatvz802dyvnfukgkxfu30khuqml5ang9smm3pr9lc95eqpjs2ywxxf",
"type": "age"
}
]

View File

@@ -1,6 +0,0 @@
[
{
"publickey": "age14l00770djurg4uycw5988nklpeha2wxy35t5jx7x8yp2d6uv7y6s47nskp",
"type": "age"
}
]

View File

@@ -1 +0,0 @@
../../../groups/admins

View File

@@ -1,46 +0,0 @@
{
"data": "ENC[AES256_GCM,data:DXK8BjWBriLUvOP2jz+48QP87iolYrob32o2D13EID/wiRoJDzz4Txr1AobrHa1NU791coXU2r7gteWA5KjYudXEgQW2opDjPFw=,iv:jLBLq3KqTvuntbLLCCMB8cVTGejetM7oGYV2j9rRlrw=,tag:0h3UtQ4tTDgGxksKmRoSVw==,type:str]",
"sops": {
"age": [
{
"recipient": "age134vt63pjqpd0m7702fyn8vhdlzyj2deqc2q78sp9uw9052kxsgwq6d25ez",
"enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBET3d5UTJRNExVRkppSE5I\ncG02V0lDcGZnTmdLRVBkWUlWS3hUaWVaa1NJCkV3V2pseDFQV3RvR0N4cjNqaEk4\naGRkaDBMQnJIc1BlMCtvVW94M0dkYTAKLS0tIHRySkpXMzJiMzFrUU1UekdPUmVi\nMmZiRXBSc3FXMndVNjRqc2xTSlU3RTAK/erwb450pgiQAdYQlrVe32BEiaFIthl2\nUVQTCHQILnxyfC19ZOmlAnSuhXXrj7XdAQmK40DLb0A52QpFC2EP9w==\n-----END AGE ENCRYPTED FILE-----\n"
},
{
"recipient": "age17d4qt0n9edq57tgcqyk8eu5mrendl59yt6z2y3a4vkq7el8krqtq6lq28g",
"enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSAxN0dFdWFOdGgrR0hsemYr\nOGpFV1VqQS8vRHA3UURXMEQ2ZDJHcWNCVzBZCitvZTZYdDYzYm8xQzlYNHNVYmRt\nMWNzbitjaUxMSXN5WHp2SVhPY29XY0EKLS0tIGJOSUFBOU1RMHBnQWJsQkg0cFlp\nZ2c5QU5aeDlUMG1KTlMzQ1FPMldTeEUKxyt4xdySOfB8Fa8KjPytjjq0oGgeFBlo\n+uT97/DvDbiBfGaZPaSyJPRP+Mca0yQz9nltCOm7qz68BEjboFKUEw==\n-----END AGE ENCRYPTED FILE-----\n"
},
{
"recipient": "age1fido2-hmac1qqpf43tgcfjm048lsqskvq34w2t4uvrm5qy6m2eg6zjj82ctca8wctgpczxvj0q4y6337uhvsxdh5j86k9h9ymautpvv2759ucwnef75ez7pa7fpkddklp40mxk2tedsp74359g0kefn5rsq0x0yss6cu4yd0h06up0rp08t6yc4l0hfa9y8jn5fkx6nk0hjhz06ykwv0fyxe7z42q683jy0",
"enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IGZpZG8yLWhtYWMgQUFJIGU1YU05Y1Zm\nZ0Q4RDB5ZFc4cndmaTVTRXc1MXNmdllocGdVa2xrREQwa1kgQVEgd0l6SlBCVW1v\neDl5N0lHYmVrajZzVzVTYjd4WVdNVjZoZVlkUEtmVXlMdyBIdmtoczF0dmhxL1py\nS1hsc0ErckdoVVB0bE02RGdCNW5raERXT1ZJMTkzNjRGNHd2T3ZSTVYrKzZlbEll\nVTZKc2JVN1B2SzRuNkpaekhwSWJQaFZVQQpPNEJKRkdxc1RkRWJ5d3diQzhuTjBy\nV1VNYXRKV2JXMGpPbWEycUlJSUh3Ci0tLSB2Y2dMV0M2OWwyUVRzZVNCZm91a3FL\nQnlFTjV0dnFhZWkxd2tNOWZScUMwCri3NvW7zXusWvELSRNc4kLfAc6JTbR8q4KS\nqu8E80e4gwng53PpHkmK0pBRYnJbZUf5DPITOy1mrbnNGMh6Nbs=\n-----END AGE ENCRYPTED FILE-----\n"
},
{
"recipient": "age1fido2-hmac1qqprw0vfpc8wzsu78quc777kmee54ln6nnsjrnrhl7nr33eh4kvkksqp05qqxj4kgfzrmrugrsvg7skx6ghh3q9xc0x0agthtkvy25d9eq7eklta5wf7s30hexkuyl5546rdz9ffa5tawlp5yweqkgccntw0ny540n2am3cqw3luhxkfmrp63kwr6mwplhr9u26wll48x0n3k5f60c7hg9a3",
"enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IGZpZG8yLWhtYWMgQUFJIEI3YWUzWWxp\nUSszSGNybG9oMitaUXludExlKzVOVFNNVkJteFpadWhtMDggQVEgZlFBRFNyWkNS\nRDJQaUJ3WWowTEcwaTk0Z0tiRHpQNmhkMTJZUlZHbHlEMCBtMzE5bzVQb1JmZkpy\nY0orbEs2RzBSVXA3UmZYZkRRanNnc2pHSnJjK1pLVmZOWGR4d0IwZjh1YXlkakRx\nTm5EMXR3ZjNHWGl0Ty8rcHpQbkcxRTZmZwpiTDJ2VGI5VjZZU0xKdTY4czhiT0RP\nbmZtU1ZQZERLNzk0MHpQM2gzdTVNCi0tLSBheWw4OVk5SzJYbW5ZZWl6SFRraXVK\nKzgrODM2alJON1FqTXczOW5JaWN3CpdplHYscbileaUWp0wSuirTOZUefZNUkbyh\nCqwS2/3JZ2IMhAYLfLoeVRbp7OrncmQF7L3KuvPPaE7WjAYwYug=\n-----END AGE ENCRYPTED FILE-----\n"
},
{
"recipient": "age1fido2-hmac1qqpyewum3q8dfcumfgec8nn958aec9f4q9aqy0k06kw5kq27d6fdqdgp0p7y4ru3n5xk90u747xevxa2af3v37e85j9g3axrmw5hdwdfh0wz22hut5vrafxsx26a7vh8fjwkymz3ramfgvvu4detztu075kmpr8l9ydqda0rnjwatdwmfgswg849p37astvld98s3nleeq575azlwc2hhpuh",
"enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IGZpZG8yLWhtYWMgQUFJIFRMU0NKM2Fh\nQm9uYzYwQnNSWUdReGV1QXFXaXRORUJobURKOTFBbFoxRm8gQVEgZUh4S2o1R2RE\nV0svbnErTmxodXE2bUxJK3lla2lvajB3OXVwZHJtcHU5dyBKU3I4WFJnK3BOQXl0\nZDh5NTB5ZFlteFJIM2FVTVp5cmNyRXZqL1V0c0l6L0tSb0c5ZU9jbmRXMTIwb2c1\nQjZsREgzWUxaOXBUd2pQK2NncDZuUmZkZwpSVVgrL3RicHh2OEgvbC9xSzhjKzNz\nYnRIa0Qyc1I1cUhVZmJkSGk5YU1nCi0tLSBPb3Nud0Q3TjZMMkJvRGZNWklQSlFZ\nNHVndHNjZmljVExmNzNYdzRrZmJRCgwWFdIGjZJfugyk8GSk9zPE/cgERs9E48S9\nVjUEetmVvRPj3jOsseyrF8KF4ZAppo7u10WXKvTZOBTDISpCW0U=\n-----END AGE ENCRYPTED FILE-----\n"
},
{
"recipient": "age1hlzrpqqgndcthq5m5yj9egfgyet2fzrxwa6ynjzwx2r22uy6m3hqr3rd06",
"enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBuMUoyTlhwOWVSNG1vbGdz\ncDJwc3ZTUjI4OUpLN3lnQWJvME0vbzkyTVJJCkJMbXUwbnVDMG5oNjVJR25wSVZw\nYjEyMWk2Y2pCa2N5ZTlka2tNTFVybXMKLS0tIE45akZVUWdsQmRUWFhuVmdhYTR5\nZ1hKVytCb2pvM0c5UDJlVVBUdXNxS2MKnQXRfa5eXzos/rAa3KUNtzKwXWuyqvU4\naMSGMpzI62JYrzv51od2sJVOPog0jrUsaIFx8rp6nuYsqRZ1fmDzKg==\n-----END AGE ENCRYPTED FILE-----\n"
},
{
"recipient": "age1sg0rvgyetdcqw7j2x983fh69kdkvqsngpe5x36e5920qa7fze3cqhj4wgx",
"enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBpUmdlRldqaFFrZWp5eU5y\nSTRPeTVHdVFOYldkYVdKcFl6dklRMXpVWTE4Ci9KWUhJcnREMzJyNExZSFk0TFJl\nYmlVK1E5ZlFGWlJRZWwreVY3MWtHUzQKLS0tIElDNEl4UXFFNTJyODB6UnhaT3gw\nK1ViUzFLYjFTemcweERlaDNnR0FsaEkKJjG/XkynVLGQVdywXn0cM0db7X7aYrpP\nxYAUaS5SM7Ny0x3sEyP0+KdsWjBuHfi/CVsiTdBJ8CDpwkYSrpw5Lg==\n-----END AGE ENCRYPTED FILE-----\n"
},
{
"recipient": "age1swlyyk2rzvevqawyeekv75nx2dz34zpe3xqhkqme26gcgeavy4dqrfpcd8",
"enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBXVnNpbUV3Z25weGFmTVg5\nOFV6cjl1eHJXemYzbitQNW9tSmNwaWdtQTA4Ci9ueHRSMndKVnJjVTFDQ044NEhs\nUEpuNnpSZDJjZzJuNjFMQ2ZVQWZ2b28KLS0tIE9LMjhPUndWNVBMR3QxQ041Qnc2\nbXR1U1VOWUxPd1ZBMzBxbGEvS2tFK2sKGnpSdS9f3sNFLstp8ONYTRqZVU7ujFAE\nqwTq4BJUlffEc9JXnvS/ZaC7O1yKmz8V5coKSHlbn+IyrZPbx9scaQ==\n-----END AGE ENCRYPTED FILE-----\n"
},
{
"recipient": "age1vphy2sr6uw4ptsua3gh9khrm2cqyt65t46tusmt44z98qa7q6ymq6prrdl",
"enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBFOGd1emMzZkxPRjU1Ylcr\nRlVXbHBnTVV3eU9QU3NxYzBKYUJ5cVg1SXpjClNOYUZBNXMwdHJEVlNoRjdRZWVC\ndTluVVdtdkZDVDcwaGFGZUM4MEE3WUUKLS0tIGlHVVprTjhYQmJva1dQT0ZrdkE0\nNHZZTnhnWi94eURxR3ZCczlCeWxZVmsKOKXVYQAMftId6wXOsI+G/1/xPuVCLZOh\nrDzvaUbipkBTdZ/DXXvXf2f1fDcIqXXtPJyBD7Yh/6+KIPxf8wjVVA==\n-----END AGE ENCRYPTED FILE-----\n"
}
],
"lastmodified": "2025-12-09T04:18:54Z",
"mac": "ENC[AES256_GCM,data:VpfhhVlfPQB94009yErF8NJl+BbhBgc/dAPNyvqQzqORpXsPa9DXjae+giPkRXhTS+263NIglUbPiNqZedj0d9ep78gj/rCupmYcGSsX0gqwFfwj50xX0qWDgs6Z5b7QytDlDPiNOCYM287Q7XLob7CcvAM46Ulo3vx/QKD76Qc=,iv:SBwlzN4PIEPo/iZl/VpkcgNtxqlyNOjqi5y9UGzWQgI=,tag:0/0mKGEQtGOrXYSsn+inmw==,type:str]",
"version": "3.11.0"
}
}

View File

@@ -1 +0,0 @@
../../../users/kurogeek

View File

@@ -1 +0,0 @@
../../../groups/admins

Some files were not shown because too many files have changed in this diff Show More