Compare commits

..

447 Commits

Author SHA1 Message Date
pinpox
bdaff0a8a4 Add favicon 2025-10-28 10:09:14 +01:00
pinpox
fabbfcaab6 fix template 2025-10-28 01:01:07 +01:00
pinpox
98cfaac849 Add prometheus console 2025-10-26 21:54:14 +01:00
pinpox
decb91a529 clanServices/monitoring: add prometheus role 2025-10-26 12:09:05 +01:00
pinpox
ea088b95e9 yggdrasil: read peers from exports 2025-10-26 12:07:52 +01:00
pinpox
a7a37f5320 Update readme 2025-10-26 12:02:17 +01:00
clan-bot
8bda4880a7 Merge pull request 'Update nixpkgs-dev in devFlake' (#5673) from update-devFlake-nixpkgs-dev into main 2025-10-26 10:06:09 +00:00
clan-bot
6eb83618c0 Update nixpkgs-dev in devFlake 2025-10-26 10:01:55 +00:00
pinpox
1fe3833779 Merge pull request 'clanServices/internet: set default for host export' (#5672) from issue-5671 into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/5672
2025-10-25 20:44:00 +00:00
pinpox
e63f5c966e clanServices/internet: set default for host export 2025-10-25 22:37:17 +02:00
pinpox
69241183ac Merge pull request 'Fix meta.tld option' (#5670) from issue-5669 into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/5670
2025-10-25 20:18:28 +00:00
pinpox
0a7c65cd27 Fix meta.tld option
The option curretly keeps it default value, even if set. This fixes the
value being passed through correctly, so that the user-specified value
is actually used.

Fixes: #5669
2025-10-25 22:08:44 +02:00
clan-bot
bd13eb3e23 Merge pull request 'Update treefmt-nix' (#5660) from update-treefmt-nix into main 2025-10-25 20:06:14 +00:00
clan-bot
1e5191a16c Update treefmt-nix 2025-10-25 20:01:34 +00:00
clan-bot
1e4bf0dd4e Merge pull request 'Update nixpkgs-dev in devFlake' (#5667) from update-devFlake-nixpkgs-dev into main 2025-10-25 10:07:40 +00:00
clan-bot
4d66dc59aa Update nixpkgs-dev in devFlake 2025-10-25 10:01:59 +00:00
hsjobeki
9a442c15e9 Merge pull request 'docs: add experimental note to 'exports'' (#5662) from exports into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/5662
2025-10-24 15:11:27 +00:00
clan-bot
157af90a56 Merge pull request 'Update treefmt-nix in devFlake' (#5661) from update-devFlake-treefmt-nix into main 2025-10-24 15:08:50 +00:00
Johannes Kirschbauer
24b94965d8 docs: add experimental note to 'exports' 2025-10-24 17:05:47 +02:00
clan-bot
46bcad9267 Update treefmt-nix in devFlake 2025-10-24 15:01:55 +00:00
Luis Hebendanz
383088af2d Merge pull request 'clan_lib/llm: get_llm_turn uses state transitions instead of callback function' (#5659) from Qubasa/clan-core:llm_no_callback2 into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/5659
2025-10-24 14:37:25 +00:00
Qubasa
c3456c1f0c clan_lib/llm: get_llm_turn uses state transitions instead of callback function 2025-10-24 16:31:09 +02:00
lassulus
183de9209f Merge pull request 'clan_lib select: fix maybe select storing miss as {}' (#5655) from select_cache_fix into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/5655
2025-10-24 12:51:33 +00:00
hsjobeki
1df5c5ff60 Merge pull request 'clanTest: throw when usage of 'self' is triggered' (#5658) from specialArgs into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/5658
2025-10-24 12:16:34 +00:00
Johannes Kirschbauer
e55a3b4fc6 clanTest: throw when usage of 'self' is triggered
That means we rely on a certain structure of the user flake
these assumptions cannot be made. Their flake can have any shape and is not controlled by us
2025-10-24 14:10:17 +02:00
lassulus
7294d8bcbe clan_lib select: fix maybe select storing miss as {} 2025-10-24 12:46:48 +02:00
hsjobeki
3fec5aa5b3 Merge pull request 'api: services simplify update services; update tests' (#5654) from inline into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/5654
2025-10-24 10:41:26 +00:00
Johannes Kirschbauer
63e55b8631 api: services simplify update services; update tests 2025-10-24 12:19:26 +02:00
clan-bot
dd771f8dd9 Merge pull request 'Update nixpkgs-dev in devFlake' (#5653) from update-devFlake-nixpkgs-dev into main 2025-10-24 10:05:38 +00:00
clan-bot
d31a4cc7d8 Update nixpkgs-dev in devFlake 2025-10-24 10:01:53 +00:00
hsjobeki
73d4cf51af Merge pull request 'services: allow inline modules' (#5652) from inline into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/5652
2025-10-23 16:48:06 +00:00
Johannes Kirschbauer
d015218226 api: update models 2025-10-23 18:43:07 +02:00
Johannes Kirschbauer
f50475fcfd services: allow inline modules 2025-10-23 18:43:07 +02:00
Johannes Kirschbauer
ae5efd9e2f inventory: fix path filter wrong length 2025-10-23 18:43:07 +02:00
hsjobeki
c2c2874e82 Merge pull request 'modules: move clan docs into clan-module' (#5651) from lib-modules into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/5651
2025-10-23 15:57:38 +00:00
Johannes Kirschbauer
1f8c2a3722 modules: move clan docs into clan-module 2025-10-23 17:52:39 +02:00
hgl
50aa7eb0cf Merge pull request 'ui: use storybook-solidjs-vite for storybook' (#5649) from hgl-sb-vite into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/5649
2025-10-23 15:11:01 +00:00
clan-bot
920b39a124 Merge pull request 'Update nixpkgs-dev in devFlake' (#5635) from update-devFlake-nixpkgs-dev into main 2025-10-23 15:06:59 +00:00
Glen Huang
c159ef79d2 ui: use storybook-solidjs-vite for storybook 2025-10-23 23:04:09 +08:00
clan-bot
7a95b169c1 Update nixpkgs-dev in devFlake 2025-10-23 15:02:00 +00:00
hsjobeki
0c3fd40120 Merge pull request 'inventory: clean up unused modules and submodule names' (#5638) from lib-modules into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/5638
2025-10-23 13:14:37 +00:00
hgl
7268697dc5 Merge pull request 'ui: not using wasm node' (#5642) from hgl-cleanup into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/5642
2025-10-23 12:52:26 +00:00
Glen Huang
ec395bada4 ui: not using wasm node
Tested both on arm64 darwin and linux that build can succeed without them
2025-10-23 20:48:59 +08:00
hsjobeki
757552671c Merge pull request 'API: init delete instance' (#5641) from instance-delete into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/5641
2025-10-23 12:46:24 +00:00
Johannes Kirschbauer
04b52d5bee inventory: clean up unused modules and submodule names 2025-10-23 14:44:38 +02:00
Johannes Kirschbauer
ffeb8b892a API: init delete instance 2025-10-23 14:40:52 +02:00
hgl
26806b5750 Merge pull request 'ui: clean up using knip' (#5633) from hgl-storybook into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/5633
2025-10-23 12:39:46 +00:00
Glen Huang
6e70054566 ui: clean up using knip 2025-10-23 20:25:47 +08:00
hsjobeki
93268e8592 Merge pull request 'modules/inventory: use filtered serialization of inventory instead' (#5634) from modules-1 into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/5634
2025-10-23 12:14:48 +00:00
Johannes Kirschbauer
a420c6ca25 inventory/tests: fixup test fixture 2025-10-23 13:51:37 +02:00
Johannes Kirschbauer
69fd13a76f clan-core-for-checks: update 2025-10-23 13:31:47 +02:00
Johannes Kirschbauer
ab3f262c22 modules/inventory: use filtered serialization of inventory
Opens up inventory for partially non-serializable parts
2025-10-23 10:37:14 +02:00
hgl
aabbe0dfac Merge pull request 'run storybook in nix derivation' (#5589) from hgl-storybook into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/5589
2025-10-23 07:23:26 +00:00
Glen Huang
35cb99a3a2 app: fix typo 2025-10-23 14:26:12 +08:00
Glen Huang
90e6d77e26 ui: fix running storybook tests in ci 2025-10-23 14:26:12 +08:00
Glen Huang
5fb4751bd8 ui: fail storybook tests if playwright version mismatch 2025-10-23 14:26:12 +08:00
Glen Huang
03640e44a4 ui: make ci run storybook tests 2025-10-23 14:26:12 +08:00
Glen Huang
51fd60917e ui: fix createInstaller.tsx fmt 2025-10-23 14:26:12 +08:00
Glen Huang
2d7e659953 ui: run storybook tests with nix 2025-10-23 14:26:12 +08:00
Brian McGee
c638df8ed9 wip(storybook): run storybook in nix derivation 2025-10-23 14:26:12 +08:00
Brian McGee
ec269a48f3 wip(storybook): run storybook in nix derivation 2025-10-23 14:26:12 +08:00
clan-bot
fc4c9287cb Merge pull request 'Update nixpkgs-dev in devFlake' (#5632) from update-devFlake-nixpkgs-dev into main 2025-10-23 05:07:25 +00:00
clan-bot
fee62373a9 Update nixpkgs-dev in devFlake 2025-10-23 05:02:06 +00:00
pinpox
f075b339b5 Merge pull request 'Add library function to read public vars' (#5628) from lib-vars-helper into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/5628
Reviewed-by: Kenji Berthold <aks.kenji@protonmail.com>
2025-10-22 22:52:57 +00:00
pinpox
872a622f71 Add tests 2025-10-23 00:42:32 +02:00
pinpox
4a41c4cefb clanServices/data-mesher: use clanLib.getPublicValue 2025-10-22 23:26:04 +02:00
pinpox
a5cd36e845 clanServices/zerotier: use clanLib.getPublicValue 2025-10-22 23:18:00 +02:00
pinpox
0dd6c08e33 clanServices/wireguard: use clanLib.getPublicValue 2025-10-22 22:48:56 +02:00
pinpox
dc0b7fc3bf Add library function to read public vars 2025-10-22 19:56:10 +02:00
hsjobeki
0d4bbbd17e Merge pull request 'inventory: filter extraModules and remove unneded top-level options' (#5603) from modules-1 into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/5603
2025-10-22 17:20:20 +00:00
Johannes Kirschbauer
90797ffa7d inventory: filter extraModules and remove unneded top-level options 2025-10-22 19:13:31 +02:00
hsjobeki
7f2bd809d6 Merge pull request 'modules: simplify inventoryClass module' (#5627) from lib-modules into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/5627
2025-10-22 16:56:29 +00:00
Johannes Kirschbauer
da7ff9a40a modules/inventory: distributed services output reduce lexical scope 2025-10-22 18:47:30 +02:00
Johannes Kirschbauer
410d0d0532 modules: move input-mapping into inventoryClass submodule 2025-10-22 18:46:10 +02:00
Johannes Kirschbauer
a25d983c87 modules: move introspection module into inventoryClass submodule 2025-10-22 18:28:09 +02:00
clan-bot
3953fa4047 Merge pull request 'Update nixpkgs-dev in devFlake' (#5630) from update-devFlake-nixpkgs-dev into main 2025-10-22 15:08:26 +00:00
clan-bot
ea93cb9987 Merge pull request 'Update nixos-facter-modules' (#5629) from update-nixos-facter-modules into main 2025-10-22 15:08:16 +00:00
clan-bot
c13278f3c2 Update nixpkgs-dev in devFlake 2025-10-22 15:02:13 +00:00
clan-bot
66fdf937e3 Update nixos-facter-modules 2025-10-22 15:01:13 +00:00
Johannes Kirschbauer
843f55f844 modules: simplify inventoryClass module 2025-10-22 16:29:33 +02:00
pinpox
5a5633d779 Merge pull request 'Add meta.tld clan option' (#5619) from add-tld into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/5619
2025-10-22 14:19:16 +00:00
Luis Hebendanz
8310433342 Merge pull request 'clan-lib: Add llm API for clan service selection' (#5626) from Qubasa/clan-core:llm_api into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/5626
2025-10-22 13:39:35 +00:00
Qubasa
51141772b3 clan_lib: Add llm integration tests 2025-10-22 15:36:11 +02:00
Qubasa
58b88e874f clan_lib: Add llm unit tests 2025-10-22 15:36:11 +02:00
Qubasa
5fb616efb4 clan_lib: Add llm container test data 2025-10-22 15:36:11 +02:00
Qubasa
6c6afd6f4b clan_lib: Move llm.py out of clan_lib/services towards it's own clan_lib/llm folder 2025-10-22 15:36:11 +02:00
Qubasa
4010953041 clan_lib: Add llm api 2025-10-22 15:36:11 +02:00
Luis Hebendanz
6b74c66292 Merge pull request 'clan-cli: Make select query reproducible, by sorting select keys' (#5625) from Qubasa/clan-core:repro_select into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/5625
2025-10-22 13:04:01 +00:00
Luis Hebendanz
fd35adbc3e Merge pull request 'clan-cli: Add support for ForwardRef type in type_to_jsonschema and tests' (#5624) from Qubasa/clan-core:forward_ref_add into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/5624
2025-10-22 12:58:34 +00:00
Qubasa
f86b0ec3da clan-cli: Make select query reproducible, by sorting select keys 2025-10-22 14:56:07 +02:00
Luis Hebendanz
5f6e0540cd Merge pull request 'clan-cli: Add passthru.sourceWithTest for container_test.py' (#5623) from Qubasa/clan-core:passthru_test into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/5623
2025-10-22 12:54:37 +00:00
Qubasa
c7ec9a9715 clan-cli: Add support for ForwardRef type in type_to_jsonschema and tests 2025-10-22 14:45:04 +02:00
Qubasa
841e9135fe clan-cli: Add passthru.sourceWithTest for container_test.py 2025-10-22 14:36:16 +02:00
pinpox
9299cd9666 Add tld 2025-10-22 12:40:09 +02:00
Kenji Berthold
9851993b82 Merge pull request 'pkgs/cli: Autocomplete --build-host' (#5609) from ke-cli-complete-buildhost into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/5609
2025-10-22 07:51:50 +00:00
Kenji Berthold
55d1807f07 Merge branch 'main' into ke-cli-complete-buildhost 2025-10-22 07:41:08 +00:00
clan-bot
ee0abdc7f4 Merge pull request 'Update nixpkgs-dev in devFlake' (#5616) from update-devFlake-nixpkgs-dev into main 2025-10-22 00:07:16 +00:00
clan-bot
6c9ab63842 Update nixpkgs-dev in devFlake 2025-10-22 00:02:06 +00:00
a-kenji
d70db5af79 pkgs/cli: Autocomplete buildhost 2025-10-21 22:40:37 +02:00
clan-bot
eae858dec6 Merge pull request 'Update nixos-facter-modules' (#5607) from update-nixos-facter-modules into main 2025-10-21 20:08:56 +00:00
clan-bot
2ec035a1cb Update nixos-facter-modules 2025-10-21 20:01:12 +00:00
hsjobeki
bd6c227bbe Merge pull request 'lib: move modules into a toplevel folder' (#5610) from lib-modules into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/5610
2025-10-21 19:06:45 +00:00
Johannes Kirschbauer
02f3474a58 modules: add source to eval tests 2025-10-21 21:01:06 +02:00
Johannes Kirschbauer
c838e08d77 lib/modules: fixup paths 2025-10-21 20:41:28 +02:00
Johannes Kirschbauer
346e3d816a lib/modules: move modules out of lib 2025-10-21 19:35:50 +02:00
Mic92
a15959fad2 Merge pull request 'pkgs/cli: Fix dynamic shell completions' (#5599) from ke-cli-completion-fix into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/5599
2025-10-21 14:36:10 +00:00
clan-bot
0e0c2ead1f Merge pull request 'Update sops-nix' (#5601) from update-sops-nix into main 2025-10-21 14:25:13 +00:00
a-kenji
c42381d810 pkgs/cli: Fix dynamic shell completions
Fix dynamic shell completions by correcting parameter names

Dynamic completions for the CLI were not working because completion
functions used `_prefix` as the first parameter name instead of `prefix`.
This is incompatible with how `argcomplete` passes it's arguments.

Add regression test for the prefix parameter as well as some basic shell
completion testing.
2025-10-21 14:19:30 +00:00
clan-bot
587ce7258a Update sops-nix 2025-10-21 14:19:11 +00:00
Mic92
d0bb804843 Merge pull request 'sshd: check searchDomains before accessing openssh-cert generator' (#5519) from fix-sshd-searchdomains-graceful-degrade into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/5519
Reviewed-by: Luis Hebendanz <consulting@qube.email>
2025-10-21 14:18:58 +00:00
Jörg Thalheim
410eecb988 monitoring: regenerate test certificates with 100-year expiration
Regenerated telegraf test certificates to use the new 100-year
expiration period instead of the default 30-day expiration.

Related to #5605
2025-10-21 15:28:41 +02:00
Jörg Thalheim
98136142b4 monitoring: extend telegraf certificate expiration to 100 years
The default 30-day expiration was causing certificates to expire
frequently, breaking monitoring. Setting to 100 years provides a
temporary solution until automated certificate rotation is implemented.

Fixes #5605
2025-10-21 15:28:41 +02:00
Jörg Thalheim
37da9fb3e4 sshd: client role inherits searchDomains from all servers
The client role now automatically collects and merges searchDomains from
ALL servers in the instance when not explicitly configured. This eliminates
redundant configuration and ensures clients trust certificates from all
servers.

Also uses lib.mkIf with .exists check to safely handle the openssh-cert
generator access, checking searchDomains first to enable lazy evaluation.
2025-10-21 15:28:41 +02:00
clan-bot
4566ad9789 Merge pull request 'Update nixpkgs-dev in devFlake' (#5602) from update-devFlake-nixpkgs-dev into main 2025-10-21 12:47:33 +00:00
clan-bot
6faacc7dde Update nixpkgs-dev in devFlake 2025-10-21 10:02:01 +00:00
hsjobeki
0d088cac7e Merge pull request 'modules-1' (#5598) from modules-1 into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/5598
2025-10-20 16:56:29 +00:00
Johannes Kirschbauer
3ffad3f97f inventory: add docs for available specialArgs in service submodules 2025-10-20 16:53:56 +00:00
Johannes Kirschbauer
3d0c281fd6 inventory: add clanLib to specialArgs 2025-10-20 16:53:56 +00:00
Mic92
5b399fd447 Merge pull request 'vars: respect deploy flag for shared secrets' (#5572) from oneingan/clan-core:vars-no-deploy into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/5572
2025-10-20 15:37:03 +00:00
clan-bot
bfedc93f2c Merge pull request 'Update test-fixtures in devFlake' (#5597) from update-devFlake-test-fixtures into main 2025-10-20 15:06:46 +00:00
clan-bot
c63e706fe9 Merge pull request 'Update nixpkgs-dev in devFlake' (#5596) from update-devFlake-nixpkgs-dev into main 2025-10-20 15:06:26 +00:00
clan-bot
dfc241c62d Update test-fixtures in devFlake 2025-10-20 15:01:44 +00:00
clan-bot
6fcdc05911 Update nixpkgs-dev in devFlake 2025-10-20 15:01:40 +00:00
hsjobeki
137f22b39e Merge pull request 'docs: add docs for clanLib' (#5594) from inventory-fixes-3 into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/5594
2025-10-20 14:24:57 +00:00
Johannes Kirschbauer
9857a395f1 docs: add docs for clanLib 2025-10-20 14:57:10 +02:00
hsjobeki
4302b06715 Merge pull request 'docs: add docs for finalSettings' (#5593) from inventory-fixes-3 into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/5593
2025-10-20 12:46:06 +00:00
Johannes Kirschbauer
064bc43f27 docs: add docs for finalSettings 2025-10-20 14:41:06 +02:00
hsjobeki
7ab1b6823f Merge pull request 'inventory: expose finalSettings of every machine' (#5581) from inventory-fixes-3 into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/5581
2025-10-20 12:38:50 +00:00
Johannes Kirschbauer
f96a487bc3 inventory: expose finalSettings of every machine 2025-10-20 14:32:49 +02:00
Mic92
e6a1953785 Merge pull request 'ci/build-clan-app: drop --system' (#5592) from mic92-patch-1 into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/5592
2025-10-20 12:30:03 +00:00
Mic92
4bedb380b8 ci/build-clan-app: drop --system
this changes nix into believing it can run darwin, when it cannot, it should however do remote builds
2025-10-20 12:27:12 +00:00
clan-bot
3b070ae1f3 Merge pull request 'Update treefmt-nix' (#5587) from update-treefmt-nix into main 2025-10-20 10:10:25 +00:00
clan-bot
bdb0a97285 Merge pull request 'Update flake-parts' (#5586) from update-flake-parts into main 2025-10-20 10:10:03 +00:00
clan-bot
a0cce07259 Merge pull request 'Update treefmt-nix in devFlake' (#5588) from update-devFlake-treefmt-nix into main 2025-10-20 10:09:53 +00:00
clan-bot
1edf576702 Update treefmt-nix in devFlake 2025-10-20 10:01:43 +00:00
clan-bot
7824ee99cb Update treefmt-nix 2025-10-20 10:01:21 +00:00
clan-bot
13c20242ad Update flake-parts 2025-10-20 10:00:47 +00:00
clan-bot
ba81b1ae12 Merge pull request 'Update nixpkgs-dev in devFlake' (#5585) from update-devFlake-nixpkgs-dev into main 2025-10-20 05:07:22 +00:00
clan-bot
7eb54b6564 Update nixpkgs-dev in devFlake 2025-10-20 05:01:42 +00:00
clan-bot
5c007edd9f Merge pull request 'Update treefmt-nix' (#5583) from update-treefmt-nix into main 2025-10-19 20:07:55 +00:00
clan-bot
03ba598842 Merge pull request 'Update treefmt-nix in devFlake' (#5584) from update-devFlake-treefmt-nix into main 2025-10-19 20:07:52 +00:00
clan-bot
d699f0b66a Update treefmt-nix in devFlake 2025-10-19 20:01:46 +00:00
clan-bot
65e599b92a Update treefmt-nix 2025-10-19 20:01:21 +00:00
hsjobeki
788f8beea4 Merge pull request 'inventory: remove role.settings' (#5579) from inventory-fixes-2 into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/5579
2025-10-19 16:54:31 +00:00
hsjobeki
da8768c4c0 Merge pull request 'helloWorld: bring back example code' (#5582) from dos into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/5582
2025-10-19 16:12:00 +00:00
Johannes Kirschbauer
eb11054f65 helloWorld: bring back example code 2025-10-19 18:07:14 +02:00
clan-bot
5922b4617c Merge pull request 'Update nixpkgs-dev in devFlake' (#5580) from update-devFlake-nixpkgs-dev into main 2025-10-19 15:06:11 +00:00
clan-bot
5286994288 Update nixpkgs-dev in devFlake 2025-10-19 15:01:39 +00:00
pinpox
8ad025b462 Merge pull request 'Fix deprecated test names' (#5575) from fix-borgbackup-vars into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/5575
Reviewed-by: Kenji Berthold <aks.kenji@protonmail.com>
Reviewed-by: hsjobeki <hsjobeki@gmail.com>
2025-10-19 14:47:22 +00:00
Johannes Kirschbauer
4442cb2fe0 inventory: remove role.settings
Within a clan.service the module can access 'role.peer.settings' and 'role.peer.machine.jon.settings'
While the current machine is jon, accessing the role settings is arguably a design mistake.
I didn't catch that problem, unfortunately this might be a breaking change
2025-10-19 16:43:21 +02:00
hsjobeki
460c6d4fc9 Merge pull request 'inventory: fix internal indentifier' (#5576) from inventory-fixes-2 into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/5576
2025-10-19 14:25:45 +00:00
pinpox
893fa47a50 Run treefmt 2025-10-19 15:17:41 +02:00
pinpox
62d3a18783 clanServices/wireguard: fix deprecated test name
- fix test name to new format
- regenerate vars via update-vars
2025-10-19 15:09:42 +02:00
pinpox
ac1cd5114a clanServices/admin: fix deprecated test name
- fix test name to new format
- regenerate vars via update-vars
2025-10-19 15:07:25 +02:00
pinpox
e0b5855013 clanServices/trusted-nix-caches: fix deprecated test name
- fix test name to new format
- regenerate vars via update-vars
2025-10-19 15:01:39 +02:00
pinpox
4fd057413f clanServices/sshd: fix deprecated test name
- fix test name to new format
- regenrate vars via update-vars
2025-10-19 14:59:40 +02:00
pinpox
96fcc41b19 clanServices/zerotier: fix deprecated test name
- fix test name to new format
- regenerate vars via update-vars
2025-10-19 14:55:03 +02:00
pinpox
811b994d57 clanServices/wireguard: fix deprecated test name
- fix test name to new format
2025-10-19 14:54:01 +02:00
pinpox
87aa62e128 clanServices/wifi: fix deprecated test name
- fix test name to new format
- regenerate vars via update-vars
2025-10-19 14:53:48 +02:00
pinpox
612275477a clanServices/users: fix deprecated test name
- fix test name to new format
- regenerate vars via update-vars
2025-10-19 14:52:55 +02:00
pinpox
046cfcb4d7 clanServices/syncthing: fix deprecated test name
- fix test name to new format
2025-10-19 14:52:21 +02:00
pinpox
965d41b37d clanServices/sshd: fix deprecated test name
- fix test name to new format
2025-10-19 14:52:08 +02:00
pinpox
c36935d81a clanServices/packages: fix deprecated test name
- fix test name to new format
- regenerate vars via update-vars
2025-10-19 14:51:54 +02:00
pinpox
ae4197277a clanServices/mycelium: fix deprecated test name
- fix test name to new format
- regenerate vars via update-vars
2025-10-19 14:51:22 +02:00
pinpox
0cc7bd7066 clanServices/localbackup: fix deprecated test name
- fix test name to new format
- regenerate vars via update-vars
2025-10-19 14:50:50 +02:00
pinpox
31f77f7a56 clanServices/hello-world: fix deprecated test name
- fix test name to new format
2025-10-19 14:50:19 +02:00
pinpox
d3d56e83e7 clanServices/garage: fix deprecated test name
- fix test name to new format
- regenerate vars via update-vars
2025-10-19 14:50:05 +02:00
pinpox
c725fc9fa3 clanServices/dyndns: fix deprecated test name
- fix test name to new format
- regenerate vars via update-vars
2025-10-19 14:49:27 +02:00
pinpox
7d6d5967dc clanServices/data-mesher: fix deprecated test name
- fix test name to new format
- regenerate vars via update-vars
2025-10-19 14:45:45 +02:00
Johannes Kirschbauer
afcc5d9e26 inventory: fix internal indentifier 2025-10-19 14:32:16 +02:00
hsjobeki
0e9931d749 Merge pull request 'app: typography fixes' (#5574) from ui-fix-2 into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/5574
2025-10-19 12:29:18 +00:00
pinpox
b4d1f07ed9 Fix borgbackup test name
- Fix deprecated name structure
- Re-generate vars
2025-10-19 14:26:45 +02:00
Johannes Kirschbauer
0d182f4431 app: fix 'added' tag typography; test linaria 2025-10-19 14:25:25 +02:00
Johannes Kirschbauer
20a6a5684d app: add typography tokens 2025-10-19 14:22:01 +02:00
pinpox
e5967bb0de Merge pull request 'Replace deprecated --fast nixos-rebuild option' (#4042) from deprecate-fast into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/4042
2025-10-19 10:49:36 +00:00
pinpox
dcd7b6a8a2 Replace depracated --fast nix option
The option is throwing a deprecation warning on current nix versions.
See for details: https://github.com/NixOS/nixpkgs/issues/417609#issuecomment-2981327326
2025-10-19 12:45:27 +02:00
oneingan
a48451cc8f Merge branch 'main' into vars-no-deploy 2025-10-19 08:01:36 +00:00
clan-bot
7580475cb6 Merge pull request 'Update sops-nix' (#5573) from update-sops-nix into main 2025-10-19 05:06:41 +00:00
clan-bot
ebe7a8ed0b Update sops-nix 2025-10-19 05:01:34 +00:00
Juanjo Presa
c7cee905d1 vars: respect deploy flag for shared secrets 2025-10-18 23:09:31 +02:00
clan-bot
5b7925c079 Merge pull request 'Update treefmt-nix' (#5569) from update-treefmt-nix into main 2025-10-18 20:08:40 +00:00
clan-bot
5e56f746ad Merge pull request 'Update treefmt-nix in devFlake' (#5571) from update-devFlake-treefmt-nix into main 2025-10-18 20:08:25 +00:00
clan-bot
4f5abe32f9 Merge pull request 'Update flake-parts' (#5568) from update-flake-parts into main 2025-10-18 20:08:07 +00:00
clan-bot
64a0dcb37f Merge pull request 'Update nixpkgs-dev in devFlake' (#5570) from update-devFlake-nixpkgs-dev into main 2025-10-18 20:07:35 +00:00
clan-bot
422f3da9df Update treefmt-nix in devFlake 2025-10-18 20:01:47 +00:00
clan-bot
f7e20f70a8 Update nixpkgs-dev in devFlake 2025-10-18 20:01:42 +00:00
clan-bot
cbabcd91ed Update treefmt-nix 2025-10-18 20:01:22 +00:00
clan-bot
5221d34448 Update flake-parts 2025-10-18 20:00:46 +00:00
clan-bot
5ab3c86b68 Merge pull request 'Update nixpkgs-dev in devFlake' (#5566) from update-devFlake-nixpkgs-dev into main 2025-10-18 15:05:13 +00:00
clan-bot
0324f68709 Update nixpkgs-dev in devFlake 2025-10-18 15:01:39 +00:00
clan-bot
7cd14a5959 Merge pull request 'Update nix-darwin' (#5562) from update-nix-darwin into main 2025-10-17 20:07:30 +00:00
clan-bot
a6584023ae Merge pull request 'Update nixpkgs-dev in devFlake' (#5563) from update-devFlake-nixpkgs-dev into main 2025-10-17 20:06:23 +00:00
clan-bot
2f381bf677 Update nixpkgs-dev in devFlake 2025-10-17 20:01:42 +00:00
clan-bot
a1c29f8aed Update nix-darwin 2025-10-17 20:00:49 +00:00
hsjobeki
42eb8e7a05 Merge pull request 'docs: show {internet,tor} in docs; with experimental notice' (#5557) from fix-deletions into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/5557
2025-10-17 18:17:08 +00:00
clan-bot
890cd47b2a Merge pull request 'Update disko' (#5561) from update-disko into main 2025-10-17 15:05:38 +00:00
clan-bot
cf4622052d Update disko 2025-10-17 15:00:46 +00:00
Luis Hebendanz
88bf893228 Merge pull request 'docs: Fix missing direnv installation steps' (#5560) from Qubasa/clan-core:fix_nix_direnv_docs into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/5560
2025-10-17 14:46:27 +00:00
Qubasa
0b1f711f2c docs: Fix missing direnv installation steps 2025-10-17 16:44:00 +02:00
Johannes Kirschbauer
39d9f44286 app: init linaria 2025-10-17 11:05:14 +02:00
Johannes Kirschbauer
f91aca959f docs: show {internet,tor} in docs; with experimental notice 2025-10-17 09:37:45 +02:00
clan-bot
8af166b899 Merge pull request 'Update nuschtos in devFlake' (#5556) from update-devFlake-nuschtos into main 2025-10-17 05:04:03 +00:00
clan-bot
61a185f947 Update nuschtos in devFlake 2025-10-17 05:01:45 +00:00
clan-bot
6ad2b0b124 Merge pull request 'Update nixpkgs-dev in devFlake' (#5555) from update-devFlake-nixpkgs-dev into main 2025-10-16 20:06:57 +00:00
clan-bot
b70c20b260 Update nixpkgs-dev in devFlake 2025-10-16 20:01:41 +00:00
Luis Hebendanz
9821e39b06 Merge pull request 'clanServices: add warning if manifest.readme is not set' (#5537) from Qubasa/clan-core:fix_manifest_readmes into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/5537
2025-10-16 17:12:46 +00:00
Qubasa
2ac65b9c83 clan_lib/modules.py: get_service_readmes now logs an error if the readme is empty 2025-10-16 19:07:49 +02:00
Qubasa
18dc042a0b inventory: Add warning if manifest.readme is missing 2025-10-16 19:07:49 +02:00
Qubasa
7a4a940e83 clanServices: add READMEs to internet and tor modules 2025-10-16 19:07:49 +02:00
Qubasa
df73169392 clanServices: Add missing manifest.readme to some services 2025-10-16 19:07:49 +02:00
clan-bot
50e4b7a2f4 Merge pull request 'Update data-mesher' (#5554) from update-data-mesher into main 2025-10-16 15:06:32 +00:00
clan-bot
e836ff86b4 Update data-mesher 2025-10-16 15:00:45 +00:00
hsjobeki
714bc58573 Merge pull request 'inventoryStore: align class names and methods' (#5551) from fix-deletions into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/5551
2025-10-16 11:09:29 +00:00
Johannes Kirschbauer
17c35c4259 persistence: align some more variable names 2025-10-16 13:04:24 +02:00
Johannes Kirschbauer
727474055e persistence: invert all writeability logic into not readonly 2025-10-16 13:01:34 +02:00
Johannes Kirschbauer
892cb1baae inventoryStore: invert writeability terms to readonly 2025-10-16 13:00:21 +02:00
brianmcgee
186656999f Merge pull request 'Update copyright dates in license file' (#5552) from brianmcgee-patch-1 into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/5552
2025-10-16 10:58:34 +00:00
brianmcgee
00b7347d00 Update copyright dates in license file 2025-10-16 10:54:54 +00:00
Johannes Kirschbauer
5eb6b703f0 inventoryStore: align class names and methods 2025-10-16 12:50:54 +02:00
hsjobeki
3d436b3c6b Merge pull request 'api: check deletions if possible' (#5538) from fix-deletions into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/5538
2025-10-16 10:50:15 +00:00
Johannes Kirschbauer
d78dca47e2 modules: update service test 2025-10-16 12:42:49 +02:00
Johannes Kirschbauer
8254d197f0 api: persistence allow path prefix 2025-10-16 12:42:45 +02:00
Johannes Kirschbauer
a4839f9cf2 api: persistence, fix regressions 2025-10-16 11:57:38 +02:00
DavHau
bb4b43f5be Merge pull request 'sshd: fix crash: attribute 'openssh-cert' missing' (#5546) from dave into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/5546
2025-10-16 09:56:39 +00:00
DavHau
4c7699b205 sshd: fix crash: attribute 'openssh-cert' missing 2025-10-16 16:50:38 +07:00
DavHau
b7013dc795 Merge pull request 'wireguard/test: move test to service directory' (#5507) from dave into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/5507
2025-10-16 07:55:53 +00:00
clan-bot
617e4b0ce1 Merge pull request 'Update nixpkgs-dev in devFlake' (#5541) from update-devFlake-nixpkgs-dev into main 2025-10-15 20:08:37 +00:00
clan-bot
600d37682c Update nixpkgs-dev in devFlake 2025-10-15 20:01:40 +00:00
clan-bot
ac4800a7df Merge pull request 'Update nixpkgs-dev in devFlake' (#5540) from update-devFlake-nixpkgs-dev into main 2025-10-15 15:05:45 +00:00
clan-bot
0af64dad01 Update nixpkgs-dev in devFlake 2025-10-15 15:01:48 +00:00
Johannes Kirschbauer
a32a5151dc api: remove unused validation method 2025-10-15 16:19:21 +02:00
Johannes Kirschbauer
16d245b179 api: check deletions if possible 2025-10-15 16:15:54 +02:00
Luis Hebendanz
24ecdb227e Merge pull request 'clan_lib: Add get_service_readmes api function' (#5530) from Qubasa/clan-core:add_get_readme into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/5530
2025-10-14 16:59:42 +00:00
Qubasa
867fa5140b clan_lib: Add get_service_readmes api function
Returns the README.md for one or multiple clan services, needed for the
clan ai feature
2025-10-14 18:54:22 +02:00
Luis Hebendanz
891aac8381 Merge pull request 'clan_lib: init platform independent service_runner' (#5382) from service_runner into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/5382
2025-10-14 16:47:31 +00:00
Qubasa
2b616575e1 service_runner: Fix starting a service twice 2025-10-14 17:32:21 +02:00
Qubasa
3f07f6ac79 service_runner: add grouping feature 2025-10-14 17:32:21 +02:00
Qubasa
c6b0b114c5 clan_lib: init platform independent service_runner 2025-10-14 17:31:37 +02:00
hsjobeki
8803343ae1 Merge pull request 'persistence: generate properties for data by traversing data' (#5502) from persistence_attributes into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/5502
2025-10-14 15:27:10 +00:00
hsjobeki
4cfe866079 Merge pull request 'lib/cli: tests collect coverage' (#5528) from test-cov into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/5528
2025-10-14 15:23:28 +00:00
Johannes Kirschbauer
8609538756 clan_lib: allow explicit readonly access to inventory attributes 2025-10-14 17:21:39 +02:00
clan-bot
5ea0e7776e Merge pull request 'Update nixpkgs-dev in devFlake' (#5527) from update-devFlake-nixpkgs-dev into main 2025-10-14 15:08:17 +00:00
Johannes Kirschbauer
a296b8a1fe lib/cli: tests collect coverage 2025-10-14 17:07:19 +02:00
clan-bot
ebbbdcaa59 Update nixpkgs-dev in devFlake 2025-10-14 15:01:54 +00:00
Mic92
ccf64d5951 Merge pull request 'fix: handle OSError when age keys are too long to be file paths' (#5523) from clan-secrets into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/5523
2025-10-14 14:35:05 +00:00
pinpox
16e20e159f Merge pull request 'Fix module mention in docs generation' (#5526) from fix-docs-service-roles into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/5526
2025-10-14 14:18:08 +00:00
pinpox
43a5a5db5a Merge pull request 'Merge pull request 'clanServices: add kde module' (#5487) from desktop-service into main' (#5525) from desktop-service into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/5525
2025-10-14 14:14:56 +00:00
pinpox
c1686691fa Fix module mention in docs generation 2025-10-14 16:14:40 +02:00
pinpox
115d0a05b7 Merge pull request 'clanServices: add kde module' (#5487) from desktop-service into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/5487
2025-10-14 16:10:55 +02:00
pinpox
4cfef1e21c Merge pull request 'clanServices: add kde module' (#5487) from desktop-service into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/5487
2025-10-14 14:08:04 +00:00
pinpox
42e3fea9e5 clanServices: add desktop module 2025-10-14 16:02:20 +02:00
DavHau
6b7530f27d wireguard/test: move test to service directory 2025-10-14 20:34:51 +07:00
DavHau
7e00a08111 Merge pull request 'lib/test/container-test-driver: Fix extraPythonPackages support' (#5491) from ke-test-extra-packages into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/5491
2025-10-14 13:33:08 +00:00
Johannes Kirschbauer
0c245f8eda persistence: generate properties for data by traversing data 2025-10-14 14:51:06 +02:00
Jörg Thalheim
9469968851 fix: handle OSError when age keys are too long to be file paths
Prevents "File name too long" errors when users provide age keys directly
to 'clan secrets users add', as Path.is_file() would fail before the key
validation could run.

Fixes: https://git.clan.lol/clan/clan-core/issues/5522
2025-10-14 13:15:54 +01:00
Luis Hebendanz
c2a71fb423 Merge pull request 'docs: add Vaultwarden, Easytier and Nix Cache to community modules' (#5521) from Qubasa/clan-core:add_community_role into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/5521
2025-10-14 11:23:50 +00:00
Qubasa
13d3bc9391 docs: add Vaultwarden, Easytier and Nix Cache to community modules 2025-10-14 13:07:18 +02:00
pinpox
3161ab3903 Merge pull request 'Add more community services' (#5517) from doc-community-services-2 into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/5517
2025-10-14 10:39:14 +00:00
pinpox
6df67aee00 Add more community services 2025-10-14 12:36:39 +02:00
pinpox
ed9f9c0d9d Merge pull request 'Document community service' (#5515) from doc-community-services into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/5515
2025-10-14 10:29:29 +00:00
pinpox
969c17e410 Document community service 2025-10-14 12:27:13 +02:00
Luis Hebendanz
3c7c52e35a Merge pull request 'clan_cli: Add typeAlias support for api.py' (#5509) from Qubasa/clan-core:fix_jsonschema_gen into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/5509
2025-10-14 10:21:11 +00:00
pinpox
b0e327e0d1 Merge pull request 'Document community service' (#5513) from doc-community-services into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/5513
2025-10-14 10:21:09 +00:00
pinpox
550b374d20 Document community service 2025-10-14 12:17:29 +02:00
Qubasa
23008d1f73 openapi: Add a test for TypeAliasing 2025-10-14 12:06:04 +02:00
hsjobeki
733d80d0b2 Merge pull request 'app: use geist font' (#5508) from fix-font into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/5508
2025-10-14 09:48:53 +00:00
Johannes Kirschbauer
9dceddc6c2 app: remove 'condensed' variant 2025-10-14 11:46:28 +02:00
Qubasa
f1747079c8 clan_cli: Add typeAlias support for api.py 2025-10-14 11:30:48 +02:00
Johannes Kirschbauer
ffdcd9b41e app: use geist font
Drop Archivo, ArchivoSemicondensed, CommitMono
in favour of only one
2025-10-14 11:19:57 +02:00
Luis Hebendanz
2ef56aff70 Merge pull request 'Fix sshd docs' (#5492) from Qubasa/clan-core:fix_sshd_docs into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/5492
2025-10-14 08:56:32 +00:00
pinpox
2ca4abbfef Merge pull request 'wireguard/docs: fix nix code in examples' (#5506) from wg-docs into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/5506
Reviewed-by: pinpox <clan@pablo.tools>
2025-10-14 07:06:53 +00:00
clan-bot
1344466097 Merge pull request 'Update sops-nix' (#5504) from update-sops-nix into main 2025-10-14 05:04:24 +00:00
DavHau
b1b68c514d wireguard/docs: fix nix code in examples
This was using outdated syntax
2025-10-14 12:02:59 +07:00
clan-bot
08072b3850 Update sops-nix 2025-10-14 05:01:51 +00:00
clan-bot
67637007a2 Merge pull request 'Update nuschtos in devFlake' (#5503) from update-devFlake-nuschtos into main 2025-10-13 20:11:04 +00:00
clan-bot
558dd55058 Update nuschtos in devFlake 2025-10-13 20:02:04 +00:00
Qubasa
63ccbd7ca7 clanServices: improve sshd docs 2025-10-13 19:56:09 +02:00
hsjobeki
d9f6b7e3fb Merge pull request 'api: prepare persistence_attributes' (#5453) from persistence_attributes into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/5453
2025-10-13 15:23:03 +00:00
clan-bot
254f9b9c5f Merge pull request 'Update nixpkgs-dev in devFlake' (#5498) from update-devFlake-nixpkgs-dev into main 2025-10-13 15:12:22 +00:00
clan-bot
44ff545436 Merge pull request 'Update sops-nix' (#5496) from update-sops-nix into main 2025-10-13 15:11:34 +00:00
Johannes Kirschbauer
40de60946a api: migrate to use persistence attributes everywhere 2025-10-13 17:04:01 +02:00
clan-bot
f25d17d9c2 Update nixpkgs-dev in devFlake 2025-10-13 15:02:14 +00:00
clan-bot
70233b5e53 Update sops-nix 2025-10-13 15:01:44 +00:00
clan-bot
044d5f1c7d Merge pull request 'Update clan-core-for-checks in devFlake' (#5497) from update-devFlake-clan-core-for-checks into main 2025-10-13 15:01:42 +00:00
clan-bot
389c586a26 Merge pull request 'Update nix-darwin' (#5494) from update-nix-darwin into main 2025-10-13 14:59:12 +00:00
clan-bot
e01a79696b Update clan-core-for-checks in devFlake 2025-10-13 14:30:29 +00:00
clan-bot
aade61b019 Update nix-darwin 2025-10-13 14:29:54 +00:00
Qubasa
6956858d61 clanServices: Fix sshd vars dependency 2025-10-13 16:05:51 +02:00
Michael Hoang
7e7e58eb64 Merge pull request 'Update nixpkgs' (#5211) from update-nixpkgs into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/5211
2025-10-13 13:19:45 +00:00
Michael Hoang
46f746d09c cli: fix installation test with latest release of nixos-anywhere 2025-10-13 15:06:20 +02:00
clan-bot
56e03d1f25 Update nixpkgs 2025-10-13 14:51:00 +02:00
Kenji Berthold
0343e4b91a Merge branch 'main' into ke-test-extra-packages 2025-10-13 12:31:37 +00:00
a-kenji
137d505c3b lib/test/container-test-driver: Fix extraPythonPackages support
Fix `extraPythonPackages` support in the container test driver.

It triggered the following warning from `nixpkgs`:
```
python3Packages = throw "do not use python3Packages when building Python packages, specify each used package as a separate argument"; # do not remove
```

The following `callPackage` usage triggered the `throw`:

```
hostPackages.python3.pkgs.callPackage
```

The change to a regular `callPackage` i`nvocation fixes this issue.

Added a container test with a popular package to ensure compatibility in the future.

Closes: #5459
2025-10-13 14:19:01 +02:00
DavHau
dd783bdf85 Merge pull request 'vars/sops: stop writing on clan vars check' (#5490) from dave into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/5490
2025-10-13 11:51:29 +00:00
DavHau
bf41a9ef00 vars/sops: stop writing on clan vars check
This fixes an issue where check_vars() would add machine keys or authorize machines for shared vars.

These write operations should only ever be done on a `clan vars generate`, which `clan vars check` should be a read-only operation
2025-10-13 18:43:49 +07:00
Qubasa
d8c9508507 Revert "Fix ssh docs"
This reverts commit fe8f7e919e.
2025-10-13 13:09:13 +02:00
pinpox
f313ace19a Merge pull request 'Revert SSH docs' (#5488) from revert-ssh-docs into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/5488
2025-10-13 10:56:54 +00:00
pinpox
fe8f7e919e Fix ssh docs 2025-10-13 12:51:42 +02:00
hsjobeki
c64276b64e Merge pull request 'lib: remove unused facts utils' (#5480) from fix-b into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/5480
2025-10-13 10:06:42 +00:00
hsjobeki
436da16bf9 Merge pull request 'facts: add bigger migration warnings' (#5484) from fix-c into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/5484
2025-10-13 08:11:38 +00:00
Johannes Kirschbauer
1c3282bb63 vars: simplify collectFiles 2025-10-13 10:05:53 +02:00
Johannes Kirschbauer
3c4b3e180e facts: add bigger migration warnings 2025-10-13 10:05:53 +02:00
hsjobeki
3953715b48 Merge pull request 'clan-cli: remove unused test fixture' (#5482) from fix-c into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/5482
2025-10-12 16:07:44 +00:00
Johannes Kirschbauer
7b95fa039f clan-cli: remove unused test fixture 2025-10-12 18:00:52 +02:00
Johannes Kirschbauer
347668a57f lib: remove unused facts utils 2025-10-12 17:49:05 +02:00
Johannes Kirschbauer
63fdc13928 persist: add attributes props to accumulator 2025-10-12 17:45:14 +02:00
Johannes Kirschbauer
9b0557803e introspection: update test 2025-10-12 17:45:14 +02:00
Johannes Kirschbauer
c13879ce69 persist: rename write map to attribute map 2025-10-12 17:45:14 +02:00
Johannes Kirschbauer
f57bc30c5a persist/writeability: rename non_writeable to readonly 2025-10-12 17:45:14 +02:00
hsjobeki
38712d6fe0 Merge pull request 'clan-core/nixos: remove autoloading magic in favour of simple code' (#5476) from fix-a into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/5476
2025-10-12 14:39:17 +00:00
Johannes Kirschbauer
1d38ffa9c2 inventory: unit test autoloading with a virtual fs 2025-10-12 16:32:55 +02:00
clan-bot
665f036dec Merge pull request 'Update clan-core-for-checks in devFlake' (#5478) from update-devFlake-clan-core-for-checks into main 2025-10-12 00:12:04 +00:00
clan-bot
b74b6ff449 Update clan-core-for-checks in devFlake 2025-10-12 00:01:53 +00:00
clan-bot
9c8797e770 Merge pull request 'Update clan-core-for-checks in devFlake' (#5477) from update-devFlake-clan-core-for-checks into main 2025-10-11 20:12:29 +00:00
clan-bot
2be6cedec4 Update clan-core-for-checks in devFlake 2025-10-11 20:01:49 +00:00
Johannes Kirschbauer
7f49449f94 clan-core/nixos: remove autoloading magic in favour of simple code 2025-10-11 18:02:32 +02:00
hsjobeki
1f7bfa4e34 Merge pull request 'inventory: wrap autoloaded machines with correct file' (#5474) from fix-a into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/5474
2025-10-11 16:00:37 +00:00
clan-bot
67fab4b11d Merge pull request 'Update clan-core-for-checks in devFlake' (#5475) from update-devFlake-clan-core-for-checks into main 2025-10-11 15:11:33 +00:00
clan-bot
18e3c72ef0 Update clan-core-for-checks in devFlake 2025-10-11 15:01:51 +00:00
Johannes Kirschbauer
84d4660a8d inventory: wrap autoloaded machines with correct file 2025-10-11 15:57:42 +02:00
clan-bot
13c3e1411a Merge pull request 'Update nixpkgs-dev in devFlake' (#5472) from update-devFlake-nixpkgs-dev into main 2025-10-11 10:14:29 +00:00
clan-bot
3c3a505aca Merge pull request 'Update clan-core-for-checks in devFlake' (#5471) from update-devFlake-clan-core-for-checks into main 2025-10-11 10:13:33 +00:00
clan-bot
f33c8e98fe Update nixpkgs-dev in devFlake 2025-10-11 10:02:05 +00:00
clan-bot
869a04e5af Update clan-core-for-checks in devFlake 2025-10-11 10:01:50 +00:00
clan-bot
d09fdc3528 Merge pull request 'Update clan-core-for-checks in devFlake' (#5470) from update-devFlake-clan-core-for-checks into main 2025-10-11 05:09:16 +00:00
clan-bot
652677d06f Update clan-core-for-checks in devFlake 2025-10-11 05:01:53 +00:00
clan-bot
ec163657cd Merge pull request 'Update clan-core-for-checks in devFlake' (#5469) from update-devFlake-clan-core-for-checks into main 2025-10-11 00:09:33 +00:00
clan-bot
7d3aa5936d Update clan-core-for-checks in devFlake 2025-10-11 00:01:51 +00:00
clan-bot
f8f8efbb88 Merge pull request 'Update treefmt-nix' (#5466) from update-treefmt-nix into main 2025-10-10 20:12:14 +00:00
clan-bot
8887e209d6 Merge pull request 'Update clan-core-for-checks in devFlake' (#5467) from update-devFlake-clan-core-for-checks into main 2025-10-10 20:10:50 +00:00
clan-bot
a72f74a36e Merge pull request 'Update treefmt-nix in devFlake' (#5468) from update-devFlake-treefmt-nix into main 2025-10-10 20:10:42 +00:00
clan-bot
0e0f8e73ec Update treefmt-nix in devFlake 2025-10-10 20:02:13 +00:00
clan-bot
f15a113f52 Update clan-core-for-checks in devFlake 2025-10-10 20:01:50 +00:00
clan-bot
1fbb4f5014 Update treefmt-nix 2025-10-10 20:01:49 +00:00
Michael Hoang
980a3c90b5 Merge pull request 'cli: ensure init-hardware-config passes Nix options to nixos-anywhere' (#5465) from push-mwotvwkqsluy into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/5465
2025-10-10 15:40:34 +00:00
clan-bot
c01b14aef5 Merge pull request 'Update clan-core-for-checks in devFlake' (#5464) from update-devFlake-clan-core-for-checks into main 2025-10-10 15:10:05 +00:00
clan-bot
0a3e564ec0 Update clan-core-for-checks in devFlake 2025-10-10 15:01:52 +00:00
Michael Hoang
bc09d5c886 cli: ensure init-hardware-config passes Nix options to nixos-anywhere 2025-10-10 17:00:10 +02:00
Michael Hoang
f6b8d660d8 Merge pull request 'checks: fix SSH debugging over vsock not working' (#5463) from push-yplypuoxymkt into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/5463
2025-10-10 14:40:10 +00:00
Michael Hoang
6014ddcd9a checks: fix SSH debugging over vsock not working 2025-10-10 16:32:54 +02:00
hsjobeki
551f5144c7 Merge pull request 'docs: Remove surprising statement on the front of documentation' (#5460) from kenji/ke-docs-fix into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/5460
2025-10-10 12:24:49 +00:00
a-kenji
9a664c323c docs: Remove surprising statement on the front of documentation 2025-10-10 13:35:29 +02:00
clan-bot
7572dc8c2b Merge pull request 'Update clan-core-for-checks in devFlake' (#5454) from update-devFlake-clan-core-for-checks into main 2025-10-10 10:09:30 +00:00
clan-bot
e22f0d9e36 Merge pull request 'Update nixpkgs-dev in devFlake' (#5455) from update-devFlake-nixpkgs-dev into main 2025-10-10 10:07:47 +00:00
clan-bot
f93ae13448 Update nixpkgs-dev in devFlake 2025-10-10 10:02:12 +00:00
clan-bot
749bac63f4 Update clan-core-for-checks in devFlake 2025-10-10 10:01:53 +00:00
clan-bot
2bac2ec7ee Merge pull request 'Update clan-core-for-checks in devFlake' (#5452) from update-devFlake-clan-core-for-checks into main 2025-10-10 05:09:28 +00:00
clan-bot
f224d4b20c Update clan-core-for-checks in devFlake 2025-10-10 05:01:54 +00:00
clan-bot
47aa0a3b8e Merge pull request 'Update clan-core-for-checks in devFlake' (#5451) from update-devFlake-clan-core-for-checks into main 2025-10-10 00:11:09 +00:00
clan-bot
dd1cab5daa Update clan-core-for-checks in devFlake 2025-10-10 00:01:51 +00:00
clan-bot
32edae4ebd Merge pull request 'Update clan-core-for-checks in devFlake' (#5450) from update-devFlake-clan-core-for-checks into main 2025-10-09 20:09:43 +00:00
clan-bot
d829aa5838 Update clan-core-for-checks in devFlake 2025-10-09 20:01:50 +00:00
clan-bot
fd6619668b Merge pull request 'Update clan-core-for-checks in devFlake' (#5449) from update-devFlake-clan-core-for-checks into main 2025-10-09 15:09:37 +00:00
clan-bot
50a26ece32 Update clan-core-for-checks in devFlake 2025-10-09 15:01:53 +00:00
brianmcgee
8f224b00a6 Merge pull request 'various-ui-fixes' (#5448) from various-ui-fixes into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/5448
2025-10-09 14:22:06 +00:00
Brian McGee
27d43ee21d fix(storybook): disable Sidebar story until we have a better mock data approach 2025-10-09 14:57:22 +01:00
Brian McGee
9626e22db7 fix(storybook): adjust flash installer on mount
It needs to handle possible missing state in the store on mount.
2025-10-09 14:57:22 +01:00
Brian McGee
1df329fe0d fix(storybook): disable service workflow stories
Temporary until we can decide how best to mock state.
2025-10-09 14:57:21 +01:00
Brian McGee
9da38abc77 fix(storybook): clan settings mock data shape changed 2025-10-09 14:57:20 +01:00
Brian McGee
2814c46e68 fix(storybook): button stories
- role="button" was removed at some point during refactoring which broke how the story was finding buttons
- button no longer has automatic loading state, instead it is now controlled.
2025-10-09 14:56:39 +01:00
Brian McGee
feef0a513e fix(storybook): remove cubes storybook
It wasn't adding much value and requires a mock Clan context which is a lot of effort at the min.
2025-10-09 14:56:38 +01:00
Brian McGee
9cc85b36c6 feat(ui): switch to webkit for storybook tests 2025-10-09 14:56:38 +01:00
hsjobeki
1465b18820 Merge pull request 'app: fix ClanSettings story' (#5447) from ui-cleanup into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/5447
2025-10-09 13:27:56 +00:00
Johannes Kirschbauer
6fa0062573 app: fix ClanSettings story 2025-10-09 15:24:30 +02:00
clan-bot
6cd68c23f5 Merge pull request 'Update clan-core-for-checks in devFlake' (#5444) from update-devFlake-clan-core-for-checks into main 2025-10-09 10:09:50 +00:00
clan-bot
fdddc60676 Merge pull request 'Update nixpkgs-dev in devFlake' (#5445) from update-devFlake-nixpkgs-dev into main 2025-10-09 10:08:18 +00:00
clan-bot
684aa27068 Update nixpkgs-dev in devFlake 2025-10-09 10:02:12 +00:00
clan-bot
35d8deb393 Update clan-core-for-checks in devFlake 2025-10-09 10:01:53 +00:00
DavHau
e2f20b5ffc Merge pull request 'vars: refactor - make shared generators carry machines list' (#5443) from dave into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/5443
2025-10-09 09:03:09 +00:00
DavHau
fd5d7934a0 vars: refactor - make shared generators carry machines list
This should make it simpler to improve the implementation of granting a new machine access to a shared secret.
The current approach using the health_check is  pretty hacky
2025-10-09 15:41:04 +07:00
Kenji Berthold
f194c31e0e Merge pull request 'Fix typo in "Authoring a 'clan.service' module"' (#5439) from nickdichev/clan-core:nickdichev-patch-1 into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/5439
2025-10-09 08:32:40 +00:00
DavHau
061b598adf Merge pull request 'vars: cleanup + fix wording' (#5442) from dave into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/5442
2025-10-09 05:44:14 +00:00
DavHau
744f35e0cc vars: cleanup + fix wording 2025-10-09 07:38:00 +02:00
clan-bot
4a6d46198c Merge pull request 'Update clan-core-for-checks in devFlake' (#5441) from update-devFlake-clan-core-for-checks into main 2025-10-09 05:11:10 +00:00
clan-bot
82d5ca9a0b Update clan-core-for-checks in devFlake 2025-10-09 05:01:51 +00:00
clan-bot
28d8a91a30 Merge pull request 'Update clan-core-for-checks in devFlake' (#5440) from update-devFlake-clan-core-for-checks into main 2025-10-09 00:09:59 +00:00
clan-bot
18f8d69728 Update clan-core-for-checks in devFlake 2025-10-09 00:01:50 +00:00
nickdichev
1feead4ce4 Fix typo in "Authoring a 'clan.service' module" 2025-10-08 20:16:16 +00:00
clan-bot
7f28110558 Merge pull request 'Update clan-core-for-checks in devFlake' (#5438) from update-devFlake-clan-core-for-checks into main 2025-10-08 20:09:55 +00:00
clan-bot
38787da891 Update clan-core-for-checks in devFlake 2025-10-08 20:01:48 +00:00
clan-bot
2b587da9fe Merge pull request 'Update clan-core-for-checks in devFlake' (#5437) from update-devFlake-clan-core-for-checks into main 2025-10-08 15:10:06 +00:00
clan-bot
acd2c1654b Update clan-core-for-checks in devFlake 2025-10-08 15:01:52 +00:00
hsjobeki
2ecb1399c3 Merge pull request 'docs: move generated markdown into a package' (#5436) from docs-source into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/5436
2025-10-08 14:40:41 +00:00
Johannes Kirschbauer
46ae6b49c1 docs: move generated markdown into a package 2025-10-08 16:37:31 +02:00
hsjobeki
50a8a69719 Merge pull request 'fix: pull request template folder' (#5435) from fix-j into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/5435
2025-10-08 14:28:00 +00:00
Johannes Kirschbauer
203761a99c fix: pull request template folder 2025-10-08 16:24:52 +02:00
hsjobeki
990b4e0223 Merge pull request 'docs: move option-search into own package' (#5434) from docs-source into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/5434
2025-10-08 14:05:38 +00:00
Johannes Kirschbauer
032f54cbfb docs: fix links 2025-10-08 16:02:31 +02:00
hsjobeki
47146efa0f Merge pull request 'PR: add pull request template' (#5428) from team-workflow into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/5428
2025-10-08 13:44:14 +00:00
Johannes Kirschbauer
c031abcd9e docs: move option-search into own package 2025-10-08 15:42:18 +02:00
Kenji Berthold
6b5dca5842 Merge pull request 'docs: Improve list view on testing' (#5433) from kenji/ke-docs-testing-display into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/5433
2025-10-08 12:31:43 +00:00
a-kenji
016fe3d114 docs: Improve list view on testing 2025-10-08 14:29:01 +02:00
DavHau
9b60b4a989 Merge pull request 'lib/introspection: Test skipping instrospection of oneOf' (#5432) from ke-oneof-test into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/5432
2025-10-08 12:07:58 +00:00
a-kenji
3088ce025b lib/introspection: Test skipping instrospection of oneOf
This builds on top of #5422.
And tests it's behavior.
2025-10-08 13:17:55 +02:00
hsjobeki
4f1fda3de6 Merge pull request 'docs: remove unused asciinema player' (#5431) from cus-docs into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/5431
2025-10-08 11:08:09 +00:00
Johannes Kirschbauer
57f14827c2 docs: remove unused asciinema player 2025-10-08 13:01:26 +02:00
Johannes Kirschbauer
0390d5999d PR: add pull request template 2025-10-08 12:44:36 +02:00
clan-bot
58e9a28f14 Merge pull request 'Update clan-core-for-checks in devFlake' (#5429) from update-devFlake-clan-core-for-checks into main 2025-10-08 10:14:43 +00:00
clan-bot
b4ad5ca1bd Merge pull request 'Update nixpkgs-dev in devFlake' (#5430) from update-devFlake-nixpkgs-dev into main 2025-10-08 10:14:17 +00:00
clan-bot
84ecb1aae6 Update nixpkgs-dev in devFlake 2025-10-08 10:02:10 +00:00
clan-bot
2b9971f538 Update clan-core-for-checks in devFlake 2025-10-08 10:01:51 +00:00
pinpox
81e15cab34 Merge pull request 'Fix capitalization issue' (#5427) from doc-fixes-1 into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/5427
2025-10-08 09:24:34 +00:00
pinpox
215c808071 Fix capitalization issue
fixes #4574
2025-10-08 11:21:06 +02:00
DavHau
4de052e58b Merge pull request 'lib/instrospection: Skip either(oneOf)' (#5422) from ke-introspection-either-or into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/5422
2025-10-08 07:42:12 +00:00
Louis Opter
a06a7a7a2c clan-cli/secrets: update some error message in encrypt_secret (#5271)
Found that while reading through some code.

Co-authored-by: Jörg Thalheim <joerg@thalheim.io>
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/5271
Co-authored-by: Louis Opter <louis@opter.org>
Co-committed-by: Louis Opter <louis@opter.org>
2025-10-08 07:41:14 +00:00
DavHau
94df3855b5 Merge pull request 'vars: raise error when shared generators differ between machines' (#5425) from dave into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/5425
2025-10-08 07:20:03 +00:00
DavHau
a83f3c23f4 vars: raise error when shared generators differ between machines
When generators are shared between machines, their definition has to be the same across all machines. If not, it might lead to unexpected problems, as the architecture assumes that all definitions are the same.

fixes https://git.clan.lol/clan/clan-core/issues/5253
2025-10-08 14:02:39 +07:00
DavHau
da6cd324f0 Merge pull request 'vars/performance: aggregate selects over all machines and generators' (#5402) from dave into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/5402
2025-10-08 06:04:50 +00:00
DavHau
c5b96df7b0 vars/performance: aggregate selects over all machines and generators
This improves the performance of deployment, by aggregating uncached select calls for vars generate into two batches.
batch 1: Get all generators of all machines
batch 2: get all final scripts for generators which need to run
2025-10-08 13:00:20 +07:00
clan-bot
c4feeace31 Merge pull request 'Update clan-core-for-checks in devFlake' (#5424) from update-devFlake-clan-core-for-checks into main 2025-10-08 05:06:31 +00:00
clan-bot
6117b664ae Update clan-core-for-checks in devFlake 2025-10-08 05:02:02 +00:00
clan-bot
b8fdb48fd8 Merge pull request 'Update clan-core-for-checks in devFlake' (#5423) from update-devFlake-clan-core-for-checks into main 2025-10-08 00:06:18 +00:00
clan-bot
9165f7ccaf Update clan-core-for-checks in devFlake 2025-10-08 00:01:52 +00:00
a-kenji
8058a7c158 lib/instrospection: Skip either(oneOf)
For either(oneOf) types, we skip introspection as we cannot
determine which branch of the union was taken without more context
This *should* be safe, as it can currently mostly be triggered through
The `extraModules` setting of inventory modules.

Example:

```
importer.roles.default.extraModules = [
    ../../modules/nixos/common.nix
];
```

Error Message:

```
Traceback (most recent call last):
  File "/nix/store/zaz4r4fic03m4whgz46p5jjszzlkq694-clan-cli/lib/python3.13/site-packages/clan_lib/templates/handler.py", line 91, in machine_template
    yield dst_machine_dir
  File "/nix/store/zaz4r4fic03m4whgz46p5jjszzlkq694-clan-cli/lib/python3.13/site-packages/clan_cli/machines/create.py", line 95, in create_machine
    inventory_store.write(inventory, message=f"machine '{machine_name}'")
    ~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/nix/store/zaz4r4fic03m4whgz46p5jjszzlkq694-clan-cli/lib/python3.13/site-packages/clan_lib/persist/inventory_store.py", line 269, in write
    write_info = self._write_map()
  File "/nix/store/zaz4r4fic03m4whgz46p5jjszzlkq694-clan-cli/lib/python3.13/site-packages/clan_lib/persist/inventory_store.py", line 214, in _write_map
    current_priority = self._get_inventory_current_priority()
  File "/nix/store/zaz4r4fic03m4whgz46p5jjszzlkq694-clan-cli/lib/python3.13/site-packages/clan_lib/persist/inventory_store.py", line 206, in _get_inventory_current_priority
    return self._flake.select("clanInternals.inventoryClass.introspection")
           ~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/nix/store/zaz4r4fic03m4whgz46p5jjszzlkq694-clan-cli/lib/python3.13/site-packages/clan_lib/flake/flake.py", line 1129, in select
    self.get_from_nix([selector])
    ~~~~~~~~~~~~~~~~~^^^^^^^^^^^^
  File "/nix/store/zaz4r4fic03m4whgz46p5jjszzlkq694-clan-cli/lib/python3.13/site-packages/clan_lib/flake/flake.py", line 1054, in get_from_nix
    raise ClanSelectError(
    ...<3 lines>...
    ) from e
clan_lib.flake.flake.ClanSelectError: Error on: $ clan select 'clanInternals.inventoryClass.introspection'
  Reason: Yet Unsupported type: either
Removing left-over machine directory: /tmp/hyperconfig/machines/trooo
Error on: $ clan select 'clanInternals.inventoryClass.introspection'
  Reason: Yet Unsupported type: either

```

Closes: #5387
2025-10-07 22:58:51 +02:00
clan-bot
fed61f49f9 Merge pull request 'Update clan-core-for-checks in devFlake' (#5421) from update-devFlake-clan-core-for-checks into main 2025-10-07 20:06:46 +00:00
clan-bot
f1f05c7e6b Update clan-core-for-checks in devFlake 2025-10-07 20:01:53 +00:00
clan-bot
7597d1560f Merge pull request 'Update nixpkgs-dev in devFlake' (#5419) from update-devFlake-nixpkgs-dev into main 2025-10-07 15:06:44 +00:00
clan-bot
f739e1b66d Merge pull request 'Update clan-core-for-checks in devFlake' (#5418) from update-devFlake-clan-core-for-checks into main 2025-10-07 15:06:44 +00:00
clan-bot
5d3609aacd Update nixpkgs-dev in devFlake 2025-10-07 15:02:06 +00:00
clan-bot
7aa51d6bd7 Update clan-core-for-checks in devFlake 2025-10-07 15:01:48 +00:00
pinpox
af91ae8c7f Merge pull request 'Add internal services guide' (#5254) from internal-service-doc into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/5254
2025-10-07 14:39:52 +00:00
pinpox
077bf55fd7 Add internal services guide 2025-10-07 16:37:22 +02:00
hsjobeki
1f6dcb910f Merge pull request 'clan: ignore nixpkgs version checks in core' (#5416) from fix-override into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/5416
2025-10-07 14:08:30 +00:00
Johannes Kirschbauer
6363d9c99c clan: ignore nixpkgs version checks in core 2025-10-07 16:03:56 +02:00
Kenji Berthold
fd30dbd1be Merge pull request 'docs: Fix typos' (#5415) from kenji/ke-docs-typo into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/5415
2025-10-07 12:15:11 +00:00
a-kenji
ba4dc36ddf docs: Fix typos 2025-10-07 14:09:38 +02:00
Mic92
5abac04b15 Merge pull request 'network: fix generator cleanup in nested context manager' (#5412) from no-leaks into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/5412
2025-10-07 11:51:38 +00:00
Kenji Berthold
8c84d32b13 Merge pull request 'docs: document vars generation requirement for service tests' (#5409) from kenji/ke-document-update-vars into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/5409
2025-10-07 11:48:46 +00:00
a-kenji
c083548795 docs: document vars generation requirement for service tests
Add documentation explaining that services defining vars need to run
update-vars before tests can execute. Clarifies how `clan.directory`
determines where vars are generated and loaded from during testing.

Closes: #5380
2025-10-07 13:45:39 +02:00
Kenji Berthold
11af5c3471 Merge pull request 'docs: docs-integrity enable UTF-8 support' (#5413) from kenji/ke-html-proofer into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/5413
2025-10-07 11:23:06 +00:00
a-kenji
dac8a40b9f docs: docs-integrity enable UTF-8 support 2025-10-07 13:13:55 +02:00
Jörg Thalheim
204f9d09e3 network: refactor get_best_remote to class-based context manager
Resolves the "RuntimeError: generator didn't stop after throw()" issue
by replacing the generator-based @contextmanager with an explicit class.

This maintains backward compatibility through a factory function.
2025-10-07 13:05:20 +02:00
Mic92
668067080d Merge pull request 'sops: don't leak secret key in debug logs' (#5411) from no-leaks into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/5411
2025-10-07 10:00:47 +00:00
Jörg Thalheim
10ed2cc7f7 sops: don't leak secret key in debug logs 2025-10-07 11:31:12 +02:00
Kenji Berthold
060b22cf21 Merge pull request 'docs: Fix nixpkgs hierarchy' (#5410) from kenji/ke-qa-nixpkgs-input into main
Reviewed-on: https://git.clan.lol/clan/clan-core/pulls/5410
2025-10-07 08:50:00 +00:00
a-kenji
965dddfee1 docs: Fix nixpkgs hierarchy 2025-10-07 10:34:22 +02:00
clan-bot
6e5d74ba22 Merge pull request 'Update nixpkgs-dev in devFlake' (#5408) from update-devFlake-nixpkgs-dev into main 2025-10-07 05:06:29 +00:00
clan-bot
4257f47a1a Merge pull request 'Update clan-core-for-checks in devFlake' (#5407) from update-devFlake-clan-core-for-checks into main 2025-10-07 05:06:22 +00:00
clan-bot
72b64a8b70 Update nixpkgs-dev in devFlake 2025-10-07 05:02:09 +00:00
clan-bot
e46e0543cd Update clan-core-for-checks in devFlake 2025-10-07 05:01:51 +00:00
clan-bot
0de79962ea Merge pull request 'Update clan-core-for-checks in devFlake' (#5406) from update-devFlake-clan-core-for-checks into main 2025-10-07 00:06:50 +00:00
clan-bot
6209816115 Update clan-core-for-checks in devFlake 2025-10-07 00:01:50 +00:00
clan-bot
ec21cda0cf Merge pull request 'Update clan-core-for-checks in devFlake' (#5404) from update-devFlake-clan-core-for-checks into main 2025-10-06 20:06:46 +00:00
clan-bot
8a29d102cd Merge pull request 'Update nixpkgs-dev in devFlake' (#5405) from update-devFlake-nixpkgs-dev into main 2025-10-06 20:06:28 +00:00
clan-bot
22787e7c93 Update nixpkgs-dev in devFlake 2025-10-06 20:02:12 +00:00
clan-bot
19fd72e075 Update clan-core-for-checks in devFlake 2025-10-06 20:01:53 +00:00
clan-bot
50be33088c Merge pull request 'Update clan-core-for-checks in devFlake' (#5403) from update-devFlake-clan-core-for-checks into main 2025-10-06 15:06:19 +00:00
434 changed files with 13949 additions and 4653 deletions

View File

@@ -0,0 +1,12 @@
## Description of the change
<!-- Brief summary of the change if not already clear from the title -->
## Checklist
- [ ] Updated Documentation
- [ ] Added tests
- [ ] Doesn't affect backwards compatibility - or check the next points
- [ ] Add the breaking change and migration details to docs/release-notes.md
- !!! Review from another person is required *BEFORE* merge !!!
- [ ] Add introduction of major feature to docs/release-notes.md

View File

@@ -17,4 +17,4 @@ jobs:
- name: Build clan-app for x86_64-darwin
run: |
nix build .#packages.x86_64-darwin.clan-app --system x86_64-darwin --log-format bar-with-logs
nix build .#packages.x86_64-darwin.clan-app --log-format bar-with-logs

View File

@@ -1,8 +1,10 @@
clanServices/.* @pinpox @kenji
lib/test/container-test-driver/.* @DavHau @mic92
lib/modules/inventory/.* @hsjobeki
lib/modules/inventoryClass/.* @hsjobeki
lib/inventory/.* @hsjobeki
lib/inventoryClass/.* @hsjobeki
modules/.* @hsjobeki
pkgs/clan-app/ui/.* @hsjobeki @brianmcgee
pkgs/clan-app/clan_app/.* @qubasa @hsjobeki

View File

@@ -1,4 +1,4 @@
Copyright 2023-2024 Clan contributors
Copyright 2023-2025 Clan contributors
Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal in

View File

@@ -19,28 +19,19 @@ let
nixosLib = import (self.inputs.nixpkgs + "/nixos/lib") { };
in
{
imports =
let
clanCoreModulesDir = ../nixosModules/clanCore;
getClanCoreTestModules =
let
moduleNames = attrNames (builtins.readDir clanCoreModulesDir);
testPaths = map (
moduleName: clanCoreModulesDir + "/${moduleName}/tests/flake-module.nix"
) moduleNames;
in
filter pathExists testPaths;
in
getClanCoreTestModules
++ filter pathExists [
./devshell/flake-module.nix
./flash/flake-module.nix
./installation/flake-module.nix
./update/flake-module.nix
./morph/flake-module.nix
./nixos-documentation/flake-module.nix
./dont-depend-on-repo-root.nix
];
imports = filter pathExists [
./devshell/flake-module.nix
./flash/flake-module.nix
./installation/flake-module.nix
./update/flake-module.nix
./morph/flake-module.nix
./nixos-documentation/flake-module.nix
./dont-depend-on-repo-root.nix
# clan core submodule tests
../nixosModules/clanCore/machine-id/tests/flake-module.nix
../nixosModules/clanCore/postgresql/tests/flake-module.nix
../nixosModules/clanCore/state-version/tests/flake-module.nix
];
flake.check = genAttrs [ "x86_64-linux" "aarch64-darwin" ] (
system:
let
@@ -95,11 +86,13 @@ in
# Container Tests
nixos-test-container = self.clanLib.test.containerTest ./container nixosTestArgs;
nixos-systemd-abstraction = self.clanLib.test.containerTest ./systemd-abstraction nixosTestArgs;
nixos-llm-test = self.clanLib.test.containerTest ./llm nixosTestArgs;
nixos-test-user-firewall-iptables = self.clanLib.test.containerTest ./user-firewall/iptables.nix nixosTestArgs;
nixos-test-user-firewall-nftables = self.clanLib.test.containerTest ./user-firewall/nftables.nix nixosTestArgs;
nixos-test-extra-python-packages = self.clanLib.test.containerTest ./test-extra-python-packages nixosTestArgs;
service-dummy-test = import ./service-dummy-test nixosTestArgs;
wireguard = import ./wireguard nixosTestArgs;
service-dummy-test-from-flake = import ./service-dummy-test-from-flake nixosTestArgs;
};
@@ -120,7 +113,7 @@ in
) (self.darwinConfigurations or { })
// lib.mapAttrs' (n: lib.nameValuePair "package-${n}") (
if system == "aarch64-darwin" then
lib.filterAttrs (n: _: n != "docs" && n != "deploy-docs" && n != "docs-options") packagesToBuild
lib.filterAttrs (n: _: n != "docs" && n != "deploy-docs" && n != "option-search") packagesToBuild
else
packagesToBuild
)

View File

@@ -15,7 +15,6 @@ let
networking.useNetworkd = true;
services.openssh.enable = true;
services.openssh.settings.UseDns = false;
services.openssh.settings.PasswordAuthentication = false;
system.nixos.variant_id = "installer";
environment.systemPackages = [
pkgs.nixos-facter

82
checks/llm/default.nix Normal file
View File

@@ -0,0 +1,82 @@
{ self, pkgs, ... }:
let
cli = self.packages.${pkgs.hostPlatform.system}.clan-cli-full;
ollama-model = pkgs.callPackage ./qwen3-4b-instruct.nix { };
in
{
name = "llm";
nodes = {
peer1 =
{ pkgs, ... }:
{
users.users.text-user = {
isNormalUser = true;
linger = true;
uid = 1000;
extraGroups = [ "systemd-journal" ];
};
# Set environment variables for user systemd
environment.extraInit = ''
if [ "$(id -u)" = "1000" ]; then
export XDG_RUNTIME_DIR="/run/user/1000"
export DBUS_SESSION_BUS_ADDRESS="unix:path=/run/user/1000/bus"
ollama_dir="$HOME/.ollama"
mkdir -p "$ollama_dir"
ln -sf ${ollama-model}/models "$ollama_dir"/models
fi
'';
# Enable PAM for user systemd sessions
security.pam.services.systemd-user = {
startSession = true;
# Workaround for containers - use pam_permit to avoid helper binary issues
text = pkgs.lib.mkForce ''
account required pam_permit.so
session required pam_permit.so
session required pam_env.so conffile=/etc/pam/environment readenv=0
session required ${pkgs.systemd}/lib/security/pam_systemd.so
'';
};
environment.systemPackages = [
cli
pkgs.ollama
(cli.pythonRuntime.withPackages (
ps: with ps; [
pytest
pytest-xdist
(cli.pythonRuntime.pkgs.toPythonModule cli)
self.legacyPackages.${pkgs.hostPlatform.system}.nixosTestLib
]
))
];
};
};
testScript =
{ ... }:
''
start_all()
peer1.wait_for_unit("multi-user.target")
peer1.wait_for_unit("user@1000.service")
# Fix user journal permissions so text-user can read their own logs
peer1.succeed("chown text-user:systemd-journal /var/log/journal/*/user-1000.journal*")
peer1.succeed("chmod 640 /var/log/journal/*/user-1000.journal*")
# the -o adopts="" is needed to overwrite any args coming from pyproject.toml
# -p no:cacheprovider disables pytest's cacheprovider which tries to write to the nix store in this case
cmd = "su - text-user -c 'pytest -s -n0 -m service_runner -p no:cacheprovider -o addopts="" ${cli.passthru.sourceWithTests}/clan_lib/llm'"
print("Running tests with command: " + cmd)
# Run tests as text-user (environment variables are set automatically)
peer1.succeed(cmd)
'';
}

View File

@@ -0,0 +1,70 @@
{ pkgs }:
let
# Got them from https://github.com/Gholamrezadar/ollama-direct-downloader
# Download manifest
manifest = pkgs.fetchurl {
url = "https://registry.ollama.ai/v2/library/qwen3/manifests/4b-instruct";
# You'll need to calculate this hash - run the derivation once and it will tell you the correct hash
hash = "sha256-Dtze80WT6sGqK+nH0GxDLc+BlFrcpeyi8nZiwY8Wi6A=";
};
# Download blobs
blob1 = pkgs.fetchurl {
url = "https://registry.ollama.ai/v2/library/qwen3/blobs/sha256:b72accf9724e93698c57cbd3b1af2d3341b3d05ec2089d86d273d97964853cd2";
hash = "sha256-tyrM+XJOk2mMV8vTsa8tM0Gz0F7CCJ2G0nPZeWSFPNI=";
};
blob2 = pkgs.fetchurl {
url = "https://registry.ollama.ai/v2/library/qwen3/blobs/sha256:85e4a5b7b8ef0e48af0e8658f5aaab9c2324c76c1641493f4d1e25fce54b18b9";
hash = "sha256-heSlt7jvDkivDoZY9aqrnCMkx2wWQUk/TR4l/OVLGLk=";
};
blob3 = pkgs.fetchurl {
url = "https://registry.ollama.ai/v2/library/qwen3/blobs/sha256:eade0a07cac7712787bbce23d12f9306adb4781d873d1df6e16f7840fa37afec";
hash = "sha256-6t4KB8rHcSeHu84j0S+TBq20eB2HPR324W94QPo3r+w=";
};
blob4 = pkgs.fetchurl {
url = "https://registry.ollama.ai/v2/library/qwen3/blobs/sha256:d18a5cc71b84bc4af394a31116bd3932b42241de70c77d2b76d69a314ec8aa12";
hash = "sha256-0YpcxxuEvErzlKMRFr05MrQiQd5wx30rdtaaMU7IqhI=";
};
blob5 = pkgs.fetchurl {
url = "https://registry.ollama.ai/v2/library/qwen3/blobs/sha256:0914c7781e001948488d937994217538375b4fd8c1466c5e7a625221abd3ea7a";
hash = "sha256-CRTHeB4AGUhIjZN5lCF1ODdbT9jBRmxeemJSIavT6no=";
};
in
pkgs.stdenv.mkDerivation {
pname = "ollama-qwen3-4b-instruct";
version = "1.0";
dontUnpack = true;
buildPhase = ''
mkdir -p $out/models/manifests/registry.ollama.ai/library/qwen3
mkdir -p $out/models/blobs
# Copy manifest
cp ${manifest} $out/models/manifests/registry.ollama.ai/library/qwen3/4b-instruct
# Copy blobs with correct names
cp ${blob1} $out/models/blobs/sha256-b72accf9724e93698c57cbd3b1af2d3341b3d05ec2089d86d273d97964853cd2
cp ${blob2} $out/models/blobs/sha256-85e4a5b7b8ef0e48af0e8658f5aaab9c2324c76c1641493f4d1e25fce54b18b9
cp ${blob3} $out/models/blobs/sha256-eade0a07cac7712787bbce23d12f9306adb4781d873d1df6e16f7840fa37afec
cp ${blob4} $out/models/blobs/sha256-d18a5cc71b84bc4af394a31116bd3932b42241de70c77d2b76d69a314ec8aa12
cp ${blob5} $out/models/blobs/sha256-0914c7781e001948488d937994217538375b4fd8c1466c5e7a625221abd3ea7a
'';
installPhase = ''
# buildPhase already created everything in $out
:
'';
meta = with pkgs.lib; {
description = "Qwen3 4B Instruct model for Ollama";
license = "apache-2.0";
platforms = platforms.all;
};
}

View File

@@ -27,6 +27,7 @@
modules.new-service = {
_class = "clan.service";
manifest.name = "new-service";
manifest.readme = "Just a sample readme to not trigger the warning.";
roles.peer = {
description = "A peer that uses the new-service to generate some files.";
};

View File

@@ -34,6 +34,7 @@ nixosLib.runTest (
modules.new-service = {
_class = "clan.service";
manifest.name = "new-service";
manifest.readme = "Just a sample readme to not trigger the warning.";
roles.peer = {
description = "A peer that uses the new-service to generate some files.";
};

View File

@@ -0,0 +1,67 @@
{ self, pkgs, ... }:
let
cli = self.packages.${pkgs.hostPlatform.system}.clan-cli-full;
in
{
name = "systemd-abstraction";
nodes = {
peer1 = {
users.users.text-user = {
isNormalUser = true;
linger = true;
uid = 1000;
extraGroups = [ "systemd-journal" ];
};
# Set environment variables for user systemd
environment.extraInit = ''
if [ "$(id -u)" = "1000" ]; then
export XDG_RUNTIME_DIR="/run/user/1000"
export DBUS_SESSION_BUS_ADDRESS="unix:path=/run/user/1000/bus"
fi
'';
# Enable PAM for user systemd sessions
security.pam.services.systemd-user = {
startSession = true;
# Workaround for containers - use pam_permit to avoid helper binary issues
text = pkgs.lib.mkForce ''
account required pam_permit.so
session required pam_permit.so
session required pam_env.so conffile=/etc/pam/environment readenv=0
session required ${pkgs.systemd}/lib/security/pam_systemd.so
'';
};
environment.systemPackages = [
cli
(cli.pythonRuntime.withPackages (
ps: with ps; [
pytest
pytest-xdist
]
))
];
};
};
testScript =
{ ... }:
''
start_all()
peer1.wait_for_unit("multi-user.target")
peer1.wait_for_unit("user@1000.service")
# Fix user journal permissions so text-user can read their own logs
peer1.succeed("chown text-user:systemd-journal /var/log/journal/*/user-1000.journal*")
peer1.succeed("chmod 640 /var/log/journal/*/user-1000.journal*")
# Run tests as text-user (environment variables are set automatically)
peer1.succeed("su - text-user -c 'pytest -p no:cacheprovider -o addopts="" -s -n0 ${cli.passthru.sourceWithTests}/clan_lib/service_runner'")
'';
}

View File

@@ -0,0 +1,26 @@
(
{ ... }:
{
name = "test-extra-python-packages";
extraPythonPackages = ps: [ ps.numpy ];
nodes.machine =
{ ... }:
{
networking.hostName = "machine";
};
testScript = ''
import numpy as np
start_all()
machine.wait_for_unit("multi-user.target")
# Test availability of numpy
arr = np.array([1, 2, 3])
print(f"Numpy array: {arr}")
assert len(arr) == 3
'';
}
)

View File

@@ -1,115 +0,0 @@
{
pkgs,
nixosLib,
clan-core,
lib,
...
}:
nixosLib.runTest (
{ ... }:
let
machines = [
"controller1"
"controller2"
"peer1"
"peer2"
"peer3"
];
in
{
imports = [
clan-core.modules.nixosTest.clanTest
];
hostPkgs = pkgs;
name = "wireguard";
clan = {
directory = ./.;
modules."@clan/wireguard" = import ../../clanServices/wireguard/default.nix;
inventory = {
machines = lib.genAttrs machines (_: { });
instances = {
/*
wg-test-one
controller2 controller1
peer2 peer1 peer3
*/
wg-test-one = {
module.name = "@clan/wireguard";
module.input = "self";
roles.controller.machines."controller1".settings = {
endpoint = "192.168.1.1";
};
roles.controller.machines."controller2".settings = {
endpoint = "192.168.1.2";
};
roles.peer.machines = {
peer1.settings.controller = "controller1";
peer2.settings.controller = "controller2";
peer3.settings.controller = "controller1";
};
};
# TODO: Will this actually work with conflicting ports? Can we re-use interfaces?
#wg-test-two = {
# module.name = "@clan/wireguard";
# roles.controller.machines."controller1".settings = {
# endpoint = "192.168.1.1";
# port = 51922;
# };
# roles.peer.machines = {
# peer1 = { };
# };
#};
};
};
};
testScript = ''
start_all()
# Show all addresses
machines = [peer1, peer2, peer3, controller1, controller2]
for m in machines:
m.systemctl("start network-online.target")
for m in machines:
m.wait_for_unit("network-online.target")
m.wait_for_unit("systemd-networkd.service")
print("\n\n" + "="*60)
print("STARTING PING TESTS")
print("="*60)
for m1 in machines:
for m2 in machines:
if m1 != m2:
print(f"\n--- Pinging from {m1.name} to {m2.name}.wg-test-one ---")
m1.wait_until_succeeds(f"ping -c1 {m2.name}.wg-test-one >&2")
'';
}
)

View File

@@ -0,0 +1,25 @@
The admin service aggregates components that allow an administrator to log in to and manage the machine.
The following configuration:
1. Enables OpenSSH with root login and adds an SSH public key named`myusersKey` to the machine's authorized_keys via the `allowedKeys` setting.
2. Automatically generates a password for the root user.
```nix
instances = {
admin = {
roles.default.tags = {
all = { };
};
roles.default.settings = {
allowedKeys = {
myusersKey = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIEFDNnynMbFWatSFdANzbJ8iiEKL7+9ZpDaMLrWRQjyH lhebendanz@wintux";
};
};
};
};
```

View File

@@ -3,6 +3,7 @@
manifest.name = "clan-core/admin";
manifest.description = "Adds a root user with ssh access";
manifest.categories = [ "Utility" ];
manifest.readme = builtins.readFile ./README.md;
roles.default = {
description = "Placeholder role to apply the admin service";

View File

@@ -2,7 +2,7 @@ let
public-key = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAII6zj7ubTg6z/aDwRNwvM/WlQdUocMprQ8E92NWxl6t+ test@test";
in
{
name = "service-admin";
name = "admin";
clan = {
directory = ./.;

View File

@@ -3,7 +3,7 @@
...
}:
{
name = "service-borgbackup";
name = "borgbackup";
clan = {
directory = ./.;

View File

@@ -1,4 +1,7 @@
{ ... }:
{
clanLib,
...
}:
let
sharedInterface =
{ lib, ... }:
@@ -51,15 +54,15 @@ let
builtins.foldl' (
urls: name:
let
ipPath = "${config.clan.core.settings.directory}/vars/per-machine/${name}/zerotier/zerotier-ip/value";
ip = clanLib.vars.getPublicValue {
flake = config.clan.core.settings.directory;
machine = name;
generator = "zerotier";
file = "zerotier-ip";
default = null;
};
in
if builtins.pathExists ipPath then
let
ip = builtins.readFile ipPath;
in
urls ++ [ "[${ip}]:${builtins.toString settings.network.port}" ]
else
urls
if ip != null then urls ++ [ "[${ip}]:${builtins.toString settings.network.port}" ] else urls
) [ ] (builtins.attrNames ((roles.admin.machines or { }) // (roles.signer.machines or { })))
);
@@ -156,9 +159,14 @@ in
readHostKey =
machine:
let
path = "${config.clan.core.settings.directory}/vars/per-machine/${machine}/data-mesher-host-key/public_key/value";
publicKey = clanLib.vars.getPublicValue {
flake = config.clan.core.settings.directory;
inherit machine;
generator = "data-mesher-host-key";
file = "public_key";
};
in
builtins.elemAt (lib.splitString "\n" (builtins.readFile path)) 1;
builtins.elemAt (lib.splitString "\n" publicKey) 1;
in
{
enable = true;

View File

@@ -9,7 +9,7 @@ in
perSystem =
{ ... }:
{
clan.nixosTests.service-data-mesher = {
clan.nixosTests.data-mesher = {
imports = [ ./tests/vm/default.nix ];
clan.modules."@clan/data-mesher" = module;
};

View File

@@ -2,7 +2,7 @@
...
}:
{
name = "service-data-mesher";
name = "data-mesher";
clan = {
directory = ./.;

View File

@@ -3,7 +3,7 @@
...
}:
{
name = "service-dyndns";
name = "dyndns";
clan = {
directory = ./.;

View File

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

View File

@@ -0,0 +1,14 @@
{
"data": "ENC[AES256_GCM,data:seLxbv590dO0KvMJmtN7WVvUcH27VYwAc3rmyD7q6ZmwCgswOKx55LFnh0stRDKSZa8K7Dq1x7D9adhZtPAMWX8tbJswBeNMPt8=,iv:G52eugxfTi0tTzH4EN4CWmpyv6feSL34++UVSjb0aAo=,tag:6r10/a7kD2hBAmae0nz2OQ==,type:str]",
"sops": {
"age": [
{
"recipient": "age1qm0p4vf9jvcnn43s6l4prk8zn6cx0ep9gzvevxecv729xz540v8qa742eg",
"enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBHVC8wZUZJYUl5MXVNa2k5\ndGV1MnFWbUNLNVdxeEtCVUc3MTd0ck9aeFFBCnFhZW40amVYc3FlN1FPRTFSWTJR\nQzhNOERKbnRnSlJVeElNSEM5ZUJsZGsKLS0tIG1uNnlNN3MweHlYczNRTW9xSytu\neThzUmxKZTJBT2lCcTdiNUI4N3paTVEKgS9j2/GVt1KBoggUj9d6UK/mIlK4niLQ\nzVq2BHt3irxQpkpGUogXH2b86zSAOEJFzsL1Rk8HM1mogTG8jqf0qA==\n-----END AGE ENCRYPTED FILE-----\n"
}
],
"lastmodified": "2025-10-19T12:49:11Z",
"mac": "ENC[AES256_GCM,data:T/2xw2mvUi8YALyxz78qG/g/xguoUTeHNzcZfXwwSyCXMg9ircsGGLO9SOVWy/QNkibnw3Yp80tXNJyr4oJH28PhFH7RrRp8jzNdopF49ZNJb2IqJ3C7xNYRZMHfjOCd/raka+ehZq8YGilEpXUWLRk1ere9lbBMh1ycL7jJS3c=,iv:FZbY/jTNPM+p4qD41FD0K7B9zoppGuvnUY5hL/EkmYM=,tag:IF5QTyUkHXWthlAGBn9R8w==,type:str]",
"version": "3.11.0"
}
}

View File

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

View File

@@ -0,0 +1,18 @@
{
"data": "ENC[AES256_GCM,data:Zu+n+DDYP7rQRTS17PJ6Apo=,iv:5WOs81Pj+S85kdC1AlOXSyPMGDfwM5UD8x7nyRZtRYQ=,tag:2JYkGnLugAni49Upv43o2g==,type:str]",
"sops": {
"age": [
{
"recipient": "age164wrhlnake7f7duhzs936lq6w49dtg53hcdyxqwxj0agad6tqg2s2u4yta",
"enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBlR3RGQ2ZLTkR3ZWxNVCsv\naXJHRjBiVUVYZVRIY2swY2xubGhmb3pLRkNvCldhQUV2WDlqYjZ4ZUFWYXkvUEEw\nZi9XRWw0Mi9mRENDcnI0aENDR2Z4MHcKLS0tIGFQU3Q4WEErbnBjOHpNR1BSR2cr\nRFg0anE1cHExT0sySmxuUks1R05nczAKZO3R6+f9co2+YGO8HPufoq1fLqqrdTWD\n4zqemMmG2BjMRDumxtcKp8CLaZWlJoP4e/+tonfdoe42qmNF5NJcFw==\n-----END AGE ENCRYPTED FILE-----\n"
},
{
"recipient": "age1qm0p4vf9jvcnn43s6l4prk8zn6cx0ep9gzvevxecv729xz540v8qa742eg",
"enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBzZWo4WGh1cWxKeDhDdlBm\nTVFjVFBIUU9xaGRkanNHaUVUUHN1czNRSUhNCkp5MmwzSGdycmsrZGhaRUhEbXBF\nNUhtdEF6bHZQOGJYUVhFVHlYc3FPODAKLS0tIDBRQ2VGT2IvU1F4MEVabzhYSFJq\nOWZmbGpkQmNSMnNKa0s4K2JXdGgwRlkKUQRREpG5H1mNHSc/cZrdMiSz0veJFR4N\n+W49XL/wQUZwajykwYj++G+dWDO7DQ+fpbB9w4mzbsAmCsXirseTLA==\n-----END AGE ENCRYPTED FILE-----\n"
}
],
"lastmodified": "2025-10-19T12:49:11Z",
"mac": "ENC[AES256_GCM,data:0msda7WbQQxXQ+juT7yErgT7NADgnzqEZLTQw+4JPuAE4xcqRIYwrrAALaA0GCCM2aIWlICzJigLCuzQUfSUbIzeP79tEHiKez+NOt/xgSM9ljz7GlsmLd0vzkxdt3WSxP+sHxy0S866N2sLMUkLqPGdqeTjB+Jji5ghGhzk9ys=,iv:8UU7iA4SdR6ZlVolm708l2Iea0sQYRT+5wPBBP5tpS0=,tag:VQXslAlqLqs1QEkwW6x6qg==,type:str]",
"version": "3.11.0"
}
}

View File

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

View File

@@ -0,0 +1,12 @@
[Garage](https://garagehq.deuxfleurs.fr/) is an open-source, S3-compatible distributed object storage service for self-hosting.
This module provisions a single-instance S3 bucket. To customize its behavior, set `services.garage.settings` in your Nix configuration.
Example configuration:
```
instances = {
garage = {
roles.default.machines."server" = {};
};
};
```

View File

@@ -4,6 +4,7 @@
manifest.name = "clan-core/garage";
manifest.description = "S3-compatible object store for small self-hosted geo-distributed deployments";
manifest.categories = [ "System" ];
manifest.readme = builtins.readFile ./README.md;
roles.default = {
description = "Placeholder role to apply the garage service";

View File

@@ -3,7 +3,7 @@
...
}:
{
name = "service-garage";
name = "garage";
clan = {
directory = ./.;

View File

@@ -0,0 +1 @@
This a test README just to appease the eval warnings if we don't have one

View File

@@ -9,6 +9,7 @@
_class = "clan.service";
manifest.name = "clan-core/hello-word";
manifest.description = "This is a test";
manifest.readme = builtins.readFile ./README.md;
# This service provides two roles: "morning" and "evening". Roles can be
# defined in this file directly (e.g. the "morning" role) or split up into a
@@ -34,10 +35,13 @@
settings,
# The name of this instance of the service
instanceName,
# The current machine
machine,
# All roles of this service, with their assigned machines
roles,
...
}:
{

View File

@@ -1,5 +1,5 @@
{
name = "service-hello-service";
name = "hello-service";
clan = {
directory = ./.;

View File

@@ -0,0 +1,27 @@
🚧🚧🚧 Experimental 🚧🚧🚧
Use at your own risk.
We are still refining its interfaces, instability and breakages are expected.
---
This module is part of Clan's [networking interface](https://docs.clan.lol/guides/networking/networking/).
Clan's networking module automatically manages connections across available network transports and falls back intelligently. When you run `clan ssh` or `clan machines update`, Clan attempts each configured network in priority order until a connection succeeds.
The example below shows how to configure a domain so server1 is reachable over the clearnet. By default, the `internet` module has the highest priority among networks.
```nix
inventory.instances = {
# Direct SSH with fallback support
internet = {
roles.default.machines.server1 = {
settings.host = "server1.example.com";
};
roles.default.machines.server2 = {
settings.host = "192.168.1.100";
};
};
};
```

View File

@@ -7,6 +7,7 @@
"System"
"Network"
];
manifest.readme = builtins.readFile ./README.md;
roles.default = {
description = "Placeholder role to apply the internet service";
interface =
@@ -15,6 +16,7 @@
options = {
host = lib.mkOption {
type = lib.types.str;
default = "";
description = ''
ip address or hostname (domain) of the machine
'';

View File

@@ -0,0 +1,28 @@
This module sets up the [KDE Plasma](https://kde.org) Desktop environment.
!!! Note "Customisation"
This service intentionally does not provide any settings or customisation
options, as desktop preferences are highly subjective. Clan currently
supports only this default desktop configuration. Any additional
customisation can be done via the `extraModules` option. Furthermore, if you
want to use a different desktop environment or compositor (e.g. Gnome or
sway), we encourage you to to build your own
[Clan Service](https://docs.clan.lol/guides/services/community/) or have a
look at the [Community Services](https://docs.clan.lol/services/community/).
## Example Usage
```nix
inventory = {
instances = {
kde = {
# Deploy on all machines
roles.default.tags.all = { };
# Or individual hosts
roles.default.machines.laptop = { };
};
};
};
```

View File

@@ -0,0 +1,19 @@
{ ... }:
{
_class = "clan.service";
manifest.name = "clan-core/kde";
manifest.description = "Sets up a graphical desktop environment";
manifest.categories = [ "Desktop" ];
manifest.readme = builtins.readFile ./README.md;
roles.default = {
description = "KDE/Plasma (wayland): Full-featured desktop environment with modern Qt-based interface";
perInstance.nixosModule = {
services = {
displayManager.sddm.enable = true;
displayManager.sddm.wayland.enable = true;
desktopManager.plasma6.enable = true;
};
};
};
}

View File

@@ -0,0 +1,24 @@
{
self,
lib,
...
}:
let
module = lib.modules.importApply ./default.nix {
inherit (self) packages;
};
in
{
clan.modules = {
kde = module;
};
perSystem =
{ ... }:
{
clan.nixosTests.kde = {
imports = [ ./tests/vm/default.nix ];
clan.modules.kde = module;
};
};
}

View File

@@ -0,0 +1,30 @@
{
name = "kde";
clan = {
directory = ./.;
inventory = {
machines.client = { };
instances = {
kde = {
module.name = "kde";
module.input = "self";
roles.default.machines."client" = { };
};
};
};
};
testScript = ''
start_all()
client.systemctl("start network-online.target")
client.wait_for_unit("network-online.target")
client.wait_for_unit("graphical.target")
client.wait_for_unit("display-manager.service")
client.succeed("systemctl status display-manager.service")
'';
}

View File

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

View File

@@ -1,6 +1,6 @@
{ ... }:
{
name = "service-localbackup";
name = "localbackup";
clan = {
directory = ./.;

View File

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

View File

@@ -0,0 +1,23 @@
This NixOS module installs and configures Synapse — a federated Matrix homeserver with end-to-end encryption — and optionally provides the Element web client.
The example below demonstrates a minimal setup that includes:
- Element web client.
- Synapse backed by PostgreSQL and nginx.
- An admin user and an additional regular user.
Example configuration:
```nix
instances = {
matrix-synapse = {
roles.default.machines."jon".settings = {
acmeEmail = "admins@clan.lol";
server_tld = "clan.test";
app_domain = "matrix.clan.test";
users.admin.admin = true;
users.someuser = { };
};
};
};
```

View File

@@ -4,6 +4,7 @@
manifest.name = "clan-core/matrix-synapese";
manifest.description = "A federated messaging server with end-to-end encryption.";
manifest.categories = [ "Social" ];
manifest.readme = builtins.readFile ./README.md;
roles.default = {
description = "Placeholder role to apply the matrix-synapse service";

View File

@@ -0,0 +1,24 @@
{ lib }:
lib.mapAttrsToList
(name: opts: {
alert = name;
expr = opts.condition;
for = opts.time or "2m";
labels = { };
annotations.description = opts.description;
})
{
# TODO Remove this alert, just for testing
"Filesystem > = 10%" = {
condition = ''disk_used_percent{fstype!~"tmpfs|vfat|devtmpfs|efivarfs"} > 10'';
time = "1m";
description = "{{$labels.instance}} device {{$labels.device}} on {{$labels.path}} got less than 90% space left on its filesystem.";
};
filesystem_full_80percent = {
condition = ''disk_used_percent{fstype!~"tmpfs|vfat|devtmpfs|efivarfs"} > 80'';
time = "1m";
description = "{{$labels.instance}} device {{$labels.device}} on {{$labels.path}} got less than 20% space left on its filesystem.";
};
}

View File

@@ -24,5 +24,48 @@
};
};
imports = [ ./telegraf.nix ];
roles.prometheus = {
description = "Prometheus monitoring daemon. Will collect metrics from all hosts with the telegraf role";
interface =
{ lib, ... }:
{
options.webExternalUrl = lib.mkOption {
type = lib.types.nullOr lib.types.str;
default = null;
example = "https://prometheus.tld";
description = "The URL under which Prometheus is externally reachable";
};
};
};
imports = [
./telegraf.nix
./prometheus.nix
];
perMachine.nixosModule =
{ pkgs, ... }:
{
clan.core.vars.generators."prometheus" = {
share = true;
files.password.restartUnits = [
"telegraf.service"
"prometheus.service"
];
files.password-env.restartUnits = [ "telegraf.service" ];
runtimeInputs = [
pkgs.coreutils
pkgs.xkcdpass
];
script = ''
xkcdpass --numwords 6 --delimiter - --count 1 | tr -d "\n" > $out/password
printf 'BASIC_AUTH_PWD=%s\n' "$(cat $out/password)" > $out/password-env
'';
};
};
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

View File

@@ -0,0 +1,11 @@
<svg xmlns="http://www.w3.org/2000/svg" version="1.1" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:svgjs="http://svgjs.dev/svgjs" width="1000" height="1000"><g clip-path="url(#SvgjsClipPath1007)"><rect width="1000" height="1000" fill="#ffffff"></rect><g transform="matrix(5.132341080724394,0,0,5.132341080724394,217.38764012391061,149.97935090550055)"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:svgjs="http://svgjs.dev/svgjs" width="110.13" height="136.39"><svg id="Layer_1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 110.13 136.39">
<defs>
<style>
.cls-1 {
fill: #231f20;
}
</style>
<clipPath id="SvgjsClipPath1007"><rect width="1000" height="1000" x="0" y="0" rx="350" ry="350"></rect></clipPath></defs>
<path class="cls-1" d="M88.27,30.81h16.69c1.77,0,3.21-1.44,3.21-3.21v-12.84c0-1.77-1.44-3.21-3.21-3.21h-5.26c-1.7,0-3.08-1.38-3.08-3.08V3.21c0-1.77-1.44-3.21-3.21-3.21h-47.49c-1.77,0-3.21,1.44-3.21,3.21v5.26c0,1.7-1.38,3.08-3.08,3.08h-5.26c-1.77,0-3.21,1.44-3.21,3.21v5.26c0,1.7-1.38,3.08-3.08,3.08h-5.26c-1.77,0-3.21,1.44-3.21,3.21,0,0-.77-1.95-.77,34.47,0,32.56.77,29.7.77,29.7,0,1.77,1.44,3.21,3.21,3.21h5.26c1.7,0,3.08,1.38,3.08,3.08v5.39c0,1.7,1.38,3.08,3.08,3.08h5.39c1.7,0,3.08,1.38,3.08,3.08v5.26c0,1.77,1.44,3.21,3.21,3.21h46.21c1.77,0,3.21-1.44,3.21-3.21v-5.26c0-1.7,1.38-3.08,3.08-3.08h8.5c1.77,0,3.21-1.44,3.21-3.21v-15.3c0-1.77-1.44-3.21-3.21-3.21h-19.93c-1.77,0-3.21,1.44-3.21,3.21v7.73c0,1.7-1.38,3.08-3.08,3.08h-23.36c-1.7,0-3.08-1.38-3.08-3.08v-7.83c0-1.77-1.44-3.21-3.21-3.21h-7.83c-1.7,0-2.66.25-3.08-3.08-.13-1.07-.2-2.38-.3-4.13-.25-4.41-.47-2.64-.47-15.89,0-18.52.48-23.85.77-26.42s1.38-3.08,3.08-3.08h7.83c1.77,0,3.21-1.44,3.21-3.21v-5.26c0-1.7,1.38-3.08,3.08-3.08h24.65c1.7,0,3.08,1.38,3.08,3.08v5.26c0,1.77,1.44,3.21,3.21,3.21Z"></path>
<path class="cls-1" d="M28.49,113.03h-3.79c-.74,0-1.33-.6-1.33-1.33v-3.79c0-1.47-1.19-2.67-2.67-2.67h-10.24c-1.47,0-2.67,1.19-2.67,2.67v3.79c0,.74-.6,1.33-1.33,1.33h-3.79c-1.47,0-2.67,1.19-2.67,2.67v10.24c0,1.47,1.19,2.67,2.67,2.67h3.79c.74,0,1.33.6,1.33,1.33v3.79c0,1.47,1.19,2.67,2.67,2.67h10.24c1.47,0,2.67-1.19,2.67-2.67v-3.79c0-.74.6-1.33,1.33-1.33h3.79c1.47,0,2.67-1.19,2.67-2.67v-10.24c0-1.47-1.19-2.67-2.67-2.67Z"></path>
</svg></svg></g></g></svg>

After

Width:  |  Height:  |  Size: 2.3 KiB

View File

@@ -0,0 +1,249 @@
<!DOCTYPE html> <html>
<head>
<meta charset="utf-8">
<title>Clan status</title>
<link rel="icon" type="image/png" href="favicon-48x48.png" sizes="48x48" />
<link rel="icon" type="image/svg+xml" href="favicon.svg" />
<link rel="shortcut icon" href="favicon.ico" />
<link rel="apple-touch-icon" sizes="180x180" href="apple-touch-icon.png" />
<meta name="viewport" content="width=device-width, initial-scale=1">
<style>
:root {
--dark: rgb(22, 35, 36);
--light: rgb(229, 231, 235);
}
body {
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;
margin: 0;
padding: 20px;
background: var(--dark);
}
.container {
max-width: 1400px;
margin: 0 auto;
background: var(--light);
padding: 30px;
border-radius: 8px;
box-shadow: 0 1px 3px rgba(0,0,0,0.1);
}
h1 {
margin-top: 0;
color: #333;
border-bottom: 2px solid var(--dark);
padding-bottom: 10px;
}
h2 {
color: #555;
margin-top: 30px;
}
table {
width: 100%;
border-collapse: collapse;
margin: 20px 0;
}
th {
background: var(--dark);
color: var(--light);
padding: 12px;
text-align: left;
font-weight: 600;
}
td {
padding: 10px 12px;
border-bottom: 1px solid #ddd;
}
tr:hover {
background: var(--light);
}
.status-up {
color: #28a745;
font-weight: bold;
}
.status-down {
color: #dc3545;
font-weight: bold;
}
.alert-success {
background: #d4edda;
color: #155724;
padding: 12px;
border-radius: 4px;
border: 1px solid #c3e6cb;
}
.grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(400px, 1fr));
gap: 20px;
margin: 20px 0;
}
.card {
border: 1px solid #ddd;
border-radius: 4px;
padding: 15px;
}
.metric-value {
font-size: 1.2em;
font-weight: bold;
color: var(--dark);
}
</style>
</head>
<body>
<div class="container">
<h1>Clan Status</h1>
<h2>Instances</h2>
<table>
<thead>
<tr>
<th>Host</th>
<th>Status</th>
<th>CPU Usage</th>
<th>Memory Usage</th>
<th>Disk Usage</th>
</tr>
</thead>
<tbody>
{{ range query "up" | sortByLabel "instance" }}
{{ $hostname := reReplaceAll "\\..*" "" .Labels.instance }}
<tr>
<td>{{ $hostname }}</td>
<td>
{{ if eq .Value 1.0 }}
<span class="status-up">UP</span>
{{ else }}
<span class="status-down">DOWN</span>
{{ end }}
</td>
<td>
{{ $cpuQuery := query (printf "100 - cpu_usage_idle{cpu=\"cpu-total\",host=\"%s\"}" $hostname) }}
{{ if $cpuQuery }}
{{ with $cpuQuery | first }}
<span class="metric-value">{{ . | value | printf "%.1f" }}%</span>
{{ end }}
{{ else }}
N/A
{{ end }}
</td>
<td>
{{ $memQuery := query (printf "(1 - (mem_available{host=\"%s\"} / mem_total{host=\"%s\"})) * 100" $hostname $hostname) }}
{{ if $memQuery }}
{{ with $memQuery | first }}
<span class="metric-value">{{ . | value | printf "%.1f" }}%</span>
{{ end }}
{{ else }}
N/A
{{ end }}
</td>
<td>
{{ $diskQuery := query (printf "(1 - (disk_free{host=\"%s\",path=\"/\"} / disk_total{host=\"%s\",path=\"/\"})) * 100" $hostname $hostname) }}
{{ if $diskQuery }}
{{ with $diskQuery | first }}
<span class="metric-value">{{ . | value | printf "%.1f" }}%</span>
{{ end }}
{{ else }}
N/A
{{ end }}
</td>
</tr>
{{ end }}
</tbody>
</table>
<h2>Services</h2>
<table>
<thead>
<tr>
<th>Service</th>
<th>Host</th>
<th>State</th>
</tr>
</thead>
<tbody>
<!-- <tr> -->
<!-- <td>Vaultwarden</td> -->
<!-- <td>kiwi</td> -->
<!-- <td> -->
<!-- <span class="status-up">UP</span> -->
<!-- </td> -->
<!-- </tr> -->
</tbody>
</table>
<!-- <h2>NixOS Systems</h2> -->
<!-- <table> -->
<!-- <thead> -->
<!-- <tr> -->
<!-- <th>Host</th> -->
<!-- <th>Booted System</th> -->
<!-- <th>Current System</th> -->
<!-- <th>Booted Kernel</th> -->
<!-- <th>Current Kernel</th> -->
<!-- </tr> -->
<!-- </thead> -->
<!-- <tbody> -->
<!-- {{ range query "nixos_systems_present" | sortByLabel "host" }} -->
<!-- <tr> -->
<!-- <td>{{ .Labels.host }}</td> -->
<!-- <td style="font-family: monospace; font-size: 0.85em;">{{ .Labels.booted_system }}</td> -->
<!-- <td style="font-family: monospace; font-size: 0.85em;">{{ .Labels.current_system }}</td> -->
<!-- <td>{{ .Labels.booted_kernel }}</td> -->
<!-- <td>{{ .Labels.current_kernel }}</td> -->
<!-- </tr> -->
<!-- {{ end }} -->
<!-- </tbody> -->
<!-- </table> -->
<h2>Failed Systemd Units</h2>
{{ $failedUnits := query "systemd_units_sub_code{sub=\"failed\"}" }}
{{ if $failedUnits }}
<table>
<thead>
<tr>
<th>Host</th>
<th>Unit</th>
</tr>
</thead>
<tbody>
{{ range $failedUnits | sortByLabel "host" }}
<tr>
<td>{{ .Labels.host }}</td>
<td style="color: #dc3545;">{{ .Labels.name }}</td>
</tr>
{{ end }}
</tbody>
</table>
{{ else }}
<div class="alert-success">No failed systemd units</div>
{{ end }}
<h2>Active Alerts</h2>
{{ with query "ALERTS{alertstate=\"firing\"}" }}
<table>
<thead>
<tr>
<th>Host</th>
<th>Alert</th>
<th>Value</th>
</tr>
</thead>
<tbody>
{{ range . }}
<tr>
<td>{{ or .Labels.host .Labels.instance }}</td>
<td>{{ .Labels.alertname }}</td>
<td>{{ .Value }}</td>
</tr>
{{ end }}
</tbody>
</table>
{{ else }}
<div class="alert-success">No active alerts</div>
{{ end }}
</div>
</body>
</html>

View File

@@ -0,0 +1,80 @@
:root {
--dark: rgb(22, 35, 36);
--light: rgb(229, 231, 235);
}
body {
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;
margin: 0;
padding: 20px;
background: var(--dark);
}
.container {
max-width: 1400px;
margin: 0 auto;
background: var(--light);
padding: 30px;
border-radius: 8px;
box-shadow: 0 1px 3px rgba(0,0,0,0.1);
}
h1 {
margin-top: 0;
color: #333;
border-bottom: 2px solid var(--dark);
padding-bottom: 10px;
}
h2 {
color: #555;
margin-top: 30px;
}
table {
width: 100%;
border-collapse: collapse;
margin: 20px 0;
}
th {
background: var(--dark);
color: var(--light);
padding: 12px;
text-align: left;
font-weight: 600;
}
td {
padding: 10px 12px;
border-bottom: 1px solid #ddd;
}
tr:hover {
background: var(--light);
}
.status-up {
color: #28a745;
font-weight: bold;
}
.status-down {
color: #dc3545;
font-weight: bold;
}
.alert-success {
background: #d4edda;
color: #155724;
padding: 12px;
border-radius: 4px;
border: 1px solid #c3e6cb;
}
.grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(400px, 1fr));
gap: 20px;
margin: 20px 0;
}
.card {
border: 1px solid #ddd;
border-radius: 4px;
padding: 15px;
}
.metric-value {
font-size: 1.2em;
font-weight: bold;
color: var(--dark);
}

View File

@@ -0,0 +1,83 @@
{
roles.prometheus.perInstance =
{
settings,
instanceName,
roles,
...
}:
{
nixosModule =
{
config,
lib,
pkgs,
...
}:
{
systemd.services.prometheus = {
serviceConfig = {
LoadCredential = "password:${config.clan.core.vars.generators.prometheus.files.password.path}";
BindReadOnlyPaths = "%d/password:/etc/prometheus/password";
};
};
services.prometheus = {
enable = true;
# TODO what do we set here? do we even need something?
# TODO this should be a export
# "https://prometheus.${config.clan.core.settings.tld}";
webExternalUrl = settings.webExternalUrl;
# Configure console templates and libraries paths
extraFlags = [
"--storage.tsdb.retention.time=30d"
"--web.console.templates=${./prometheus-consoles}"
"--web.console.libraries=${./prometheus-consoles}"
];
ruleFiles = [
(pkgs.writeText "prometheus-rules.yml" (
builtins.toJSON {
groups = [
{
name = "alerting-rules";
rules = import ./alert-rules.nix { inherit lib; };
}
];
}
))
];
scrapeConfigs = [
{
job_name = "telegraf";
scrape_interval = "60s";
metrics_path = "/metrics";
basic_auth.username = "prometheus";
basic_auth.password_file = "/etc/prometheus/password";
static_configs = [
{
# Scrape all machines with the `telegraf` role
# https://prometheus:<password>@<host>.<tld>:9273/metrics
# scheme = "https";
# scheme = "http";
targets = map (m: "${m}.${config.clan.core.settings.tld}:9273") (
lib.attrNames roles.telegraf.machines
);
labels.type = instanceName;
}
];
}
];
};
};
};
}

View File

@@ -1,126 +1,32 @@
{
roles.telegraf.perInstance =
{ settings, ... }:
{ ... }:
{
nixosModule =
{
config,
pkgs,
lib,
...
}:
let
auth_user = "prometheus";
in
{
warnings =
lib.optionals (settings.allowAllInterfaces != null) [
"monitoring.settings.allowAllInterfaces is deprecated and and has no effect. Please remove it from your inventory."
"The monitoring service will now always listen on all interfaces over https."
]
++ (lib.optionals (settings.interfaces != null) [
"monitoring.settings.interfaces is deprecated and and has no effect. Please remove it from your inventory."
"The monitoring service will now always listen on all interfaces over https."
]);
networking.firewall.allowedTCPPorts = [
9273
9990
];
clan.core.vars.generators."telegraf-certs" = {
files.crt = {
restartUnits = [ "telegraf.service" ];
deploy = true;
secret = false;
};
files.key = {
mode = "0600";
restartUnits = [ "telegraf.service" ];
};
runtimeInputs = [
pkgs.openssl
];
script = ''
openssl req -x509 -nodes -newkey rsa:4096 \
-keyout "$out"/key \
-out "$out"/crt \
-subj "/C=US/ST=CA/L=San Francisco/O=Example Corp/OU=IT/CN=example.com"
'';
};
clan.core.vars.generators."telegraf" = {
files.password.restartUnits = [ "telegraf.service" ];
files.password-env.restartUnits = [ "telegraf.service" ];
files.miniserve-auth.restartUnits = [ "telegraf.service" ];
dependencies = [ "telegraf-certs" ];
runtimeInputs = [
pkgs.coreutils
pkgs.xkcdpass
pkgs.mkpasswd
];
script = ''
PASSWORD=$(xkcdpass --numwords 4 --delimiter - --count 1 | tr -d "\n")
echo "BASIC_AUTH_PWD=$PASSWORD" > "$out"/password-env
echo "${auth_user}:$PASSWORD" > "$out"/miniserve-auth
echo "$PASSWORD" | tr -d "\n" > "$out"/password
'';
};
systemd.services.telegraf-json = {
enable = true;
wantedBy = [ "multi-user.target" ];
after = [ "telegraf.service" ];
requires = [ "telegraf.service" ];
serviceConfig = {
LoadCredential = [
"auth_file_path:${config.clan.core.vars.generators.telegraf.files.miniserve-auth.path}"
"telegraf_crt_path:${config.clan.core.vars.generators.telegraf-certs.files.crt.path}"
"telegraf_key_path:${config.clan.core.vars.generators.telegraf-certs.files.key.path}"
];
Environment = [
"AUTH_FILE_PATH=%d/auth_file_path"
"CRT_PATH=%d/telegraf_crt_path"
"KEY_PATH=%d/telegraf_key_path"
];
Restart = "on-failure";
User = "telegraf";
Group = "telegraf";
RuntimeDirectory = "telegraf-www";
};
script = "${pkgs.miniserve}/bin/miniserve -p 9990 /run/telegraf-www --auth-file \"$AUTH_FILE_PATH\" --tls-cert \"$CRT_PATH\" --tls-key \"$KEY_PATH\"";
};
systemd.services.telegraf = {
serviceConfig = {
LoadCredential = [
"telegraf_crt_path:${config.clan.core.vars.generators.telegraf-certs.files.crt.path}"
"telegraf_key_path:${config.clan.core.vars.generators.telegraf-certs.files.key.path}"
];
Environment = [
"CRT_PATH=%d/telegraf_crt_path"
"KEY_PATH=%d/telegraf_key_path"
];
};
};
networking.firewall.allowedTCPPorts = [ 9273 ];
services.telegraf = {
enable = true;
environmentFiles = [
(builtins.toString config.clan.core.vars.generators.telegraf.files.password-env.path)
];
environmentFiles = [ config.clan.core.vars.generators.prometheus.files.password-env.path ];
extraConfig = {
agent.interval = "60s";
inputs = {
# More input plugins available at:
# https://github.com/influxdata/telegraf/tree/master/plugins/inputs
diskio = { };
disk = { };
cpu = { };
processes = { };
kernel_vmstat = { };
system = { };
mem = { };
@@ -145,20 +51,12 @@
}
];
};
# sadly there doesn'T seem to exist a telegraf http_client output plugin
# sadly there doesn't seem to exist a telegraf http_client output plugin
outputs.prometheus_client = {
listen = ":9273";
metric_version = 2;
basic_username = "${auth_user}";
basic_username = "prometheus";
basic_password = "$${BASIC_AUTH_PWD}";
tls_cert = "$${CRT_PATH}";
tls_key = "$${KEY_PATH}";
};
outputs.file = {
files = [ "/run/telegraf-www/telegraf.json" ];
data_format = "json";
json_timestamp_units = "1s";
};
};
};

View File

@@ -1,33 +1,33 @@
-----BEGIN CERTIFICATE-----
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
k1PNWTkgLsXO8DNkCudxcvPElXfmaw6zwaLrZys=
VQQDDAtleGFtcGxlLmNvbTAgFw0yNTEwMjExMzE3MTZaGA8yMTI1MDkyNzEzMTcx
NlowbDELMAkGA1UEBhMCVVMxCzAJBgNVBAgMAkNBMRYwFAYDVQQHDA1TYW4gRnJh
bmNpc2NvMRUwEwYDVQQKDAxFeGFtcGxlIENvcnAxCzAJBgNVBAsMAklUMRQwEgYD
VQQDDAtleGFtcGxlLmNvbTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIB
AMbUCTs38JdEFlz+fiEwsEb9OV+6u4P5pkKkRFIJ04sTW9/NIeUJx5xOcAPn6B8K
mi+d6vHln2WDCNJHqthGHQDS250x8Qs+JrmtIvDPko+oDOlbWMPiT4Lv6p134+lV
obkiEMKSKz1gHuhlnHXFjkU+xTjxvEtGuq1+JPem4oJ9HUhSk1F6cftigzrYqUuk
JRROiUrbKiFp/TLedmAqQg/7wOrJKSKX91pQwNZhjB2/1REt0HP92W8uZIrzvLqq
JkrGfK9Y6e87DwXoTT0lvMAT7jbMsMWdGoCw/BQV8CwciUUG4ggI/jb+2TTktB3f
kMN/qRTKZ3zv/rn68RJfecAXYCQ2VfvO/Mr9nml2/cM7nrUBcs12YAHcm3766VWJ
pq6qBLcz/pHzMdt+/23nbO7bH2PL6r69VCSYvsDDnqpVL+LnYhgYUE0lPjuWuGmp
oKjggS6p4p1PXEQMOcj9UWdOyjefSzJsOp+25Of9SQzxHkBsVw0iArRFUYP6G15k
kNjYpuinFTw1XVDCFGPRIAhySnERlkv6WNyQQC87QTVJITKkz3R5cv4gwFG0kjAi
Va4nIJs2CctcizuEaPlwnEFrZ99gcB7RYPSUQVGAbfkqt2bhy/xGr+Jlp4kqPfS5
iPomwfcDwEnDbmcM8S2adPWtZ+oHskxZQmJ6+jhGgM73AgMBAAGjUzBRMB0GA1Ud
DgQWBBRHz2QAo1z8r9BewZro+HYv18AxTzAfBgNVHSMEGDAWgBRHz2QAo1z8r9Be
wZro+HYv18AxTzAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEBCwUAA4ICAQCz
BTuZI7VymDWerWLfHMWyogoJWOkFB2yEpQe7J+LjS8yZmJg4CYpA4JJ+uM2sBm2Q
yL6M57ZmSY6EFoYeYw3gRfwGC32qJHirhsWvrjUpRC5+4YT9P6fNmgm5aD27JZao
bjyNA9Vy9SCL4JMeWET2w9VGNDaYQCs0x57HZioxYRMSD5vMVbirvCtqX7H3F/X+
r/VHEqEae7tVtuAB2D2GdcFzslCRb9uomuVfLJNqR6Nz1Tw+2adyySijRMCDdpRl
Pg9MBv4sevL6F4C1vUqUG1LXzcfHLFtrV1oUIEpJ0frxAgpdhSbnHiQa64cKX3N0
CsS6VALipGFmxj01+jD0Vhhf4rjjTT5C3Ag4WTqI98Fu4RMW35eBstnt6UUWyJQO
Q1skk+hg0ynfb3lO8OIZ4sDkmxDqAOQXeMMo1tU2YMgNA5Lv1FyO9Silc0VlkOiO
ft1RC8UbECqYyTvz7SNrv8aQP6EUoNSpxQHyBHOQy65dyOLOdP4S+PccUwsdxv/N
O5eN9ndMWqNvnyPKyQ3M+MLVvkCR1vDb6ABgPhH17BLkj8fWQgy5lhjJy5a8VHlO
1VDzV1Xeezy/MYCpS+TamaWTXscbhLMzWWiiAiDT8dltKw4G6U+g7DiF80kM59L5
D1hOs4gOQ853+83L/Ej4ESTj0B04NLVMlzMGtl3qcA==
-----END CERTIFICATE-----

View File

@@ -1,19 +1,18 @@
{
"data": "ENC[AES256_GCM,data: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,iv:q3j8EAokyyxiszf+wyRqxEr2igaD1bX7YnFx/NbsGg8=,tag:HKKYWRJEUwW2/TxL+5dSng==,type:str]",
"data": "ENC[AES256_GCM,data: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,iv:dGSmyDNBdVyF54bYS/Zxm2NNXZyGtLjkyYlrI9/nKvc=,tag:ip2fy76NjObWbW20HyuZUA==,type:str]",
"sops": {
"age": [
{
"recipient": "age1ntpf7lqqw4zrk8swjvwtyfak7f2wg04uf7ggu6vk2yyt9qt74qkswn25ck",
"enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBaeXRjU214aWk5ajl1aW9E\naGJlb1ViaVRmMTBHdkFDQUNDZS94WFZiNUNvCllmWTJBck9hR3U3V09VWDZwQ2xI\nd3ZEQnBIUG5ZSTVIdS8rQ2FMYVhyNk0KLS0tIEE1UG8rSzFyU01sVXhGVHpoaE9i\nSis4Qi9tMGFqbTNMTDZUVk1ZdXkrM28Km4VkfaOsZ69ckjvrg+os43H/O1IoWHzC\nt4LqZRz1Tk7/d1aLWavSPPjVYrCOMZeNBqGbQpGfjjuXrafClRNQdQ==\n-----END AGE ENCRYPTED FILE-----\n"
"enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBNQS96MUFubVdOR2VCc2xO\ncTc5QnNHNTFpdURnSnF3dVhBQXQ3bnBuRW1RCngzSVlhSW9rNUxoSWdKcEtKVXc3\nQitLZ2NDUXBSUmxtVWpYRUlvOHVXcW8KLS0tIGZaWlRVak9NYmt2elpwYStYenRE\nanlkT3BET1FjQ2lFZkp3SXFMSkJSaVkKKkr+MNNqs6Ve3K5OrZfBEGlnc7OAthqf\nOZrP9NYOTMgkvhFsZTVpUS0zskry0iwmTNt+KeluYf0Tko8K53Kx2A==\n-----END AGE ENCRYPTED FILE-----\n"
},
{
"recipient": "age1qm0p4vf9jvcnn43s6l4prk8zn6cx0ep9gzvevxecv729xz540v8qa742eg",
"enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSB3R1RHTGViTnRLVVkyM3J0\nbm96cGVPTlo4NXBNL0g1eEVSNG9DUkgwVFRBCmRKVTlMRmV3Tmg2RTZIclBlWlcr\ndzI5MUxhcllzbE1IMDNxa08zVkpITmsKLS0tIG01Y2dyQkY3UmRudFk2d0p6bThn\nemlaWnZoS3p4VHhMTFFwTm9VN0ttYzQKVbLFgtK6NIRIiryWHeeOPD45iwUds4QD\n7b8xYYoxlo+DETggxK6Vz3IdT/BSK5bFtgAxl864b5gW+Aw4c6AO5w==\n-----END AGE ENCRYPTED FILE-----\n"
"enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBXd2dVYmJIbUVVeXk5Nk1E\nekFiUldVVUhRTmE4dHRiTHNDdEMyS1pRV1RrCkNScGdXVSs4UU5id29DV0pZWDQr\nenV1QmpnOFk5aFpTTUxmb0hDVHZDdFkKLS0tIHpmalJtRC94bEhaUStmeUlHT21w\nd3o3UzJHZklxK0RCYUUxc2c3aG1XclkKEPq1ZgyGiAK/Hy4zT7wfdDfPEE3vMHpR\nzwQV5y3M3DmlnKQEvJu0DpQ334CyAcubZC7cswQdUrM8TPqJhb/TuA==\n-----END AGE ENCRYPTED FILE-----\n"
}
],
"lastmodified": "2025-09-18T14:33:37Z",
"mac": "ENC[AES256_GCM,data:XKCnd0QrAlOCECSeSvbLYHMLbmUh4fMRnLaTb5ARoP4Zc9joWGsCaRZxokc2/sG4BXA/6pkbQXHyIOudKbcBpVjjvs9E+6Mnzt53nfRoH/iOkYPbN2EO49okVZJXW0M1rlBxrxvGuiDlz2p2p6L7neKLy4EB482pYea5+dUr2Yw=,iv:oj/MkZCfkvCmAb79uzEvKwEAm1bKtWhS4rPRAWSgRgw=,tag:h5TPPILXkhJplnDT2Gqtfw==,type:str]",
"unencrypted_suffix": "_unencrypted",
"version": "3.10.2"
"lastmodified": "2025-10-21T13:17:17Z",
"mac": "ENC[AES256_GCM,data:wdAFURkJZvclbz3UFPSPV9fma7zrZVEhMhsRqylGQMLepX/WohEAr8nJgeHl05be1Q8M8biPXCCoL0vfwg4BRZOkhD8PusJh8iBI3+STNQe/S1qoIK1ByfBFhJD+tIsVsgduLp6G32e6SRNvkuX3UpJqyViuRUavfQd3b8LRU4I=,iv:S3sMNTz5Kg4TxHj1tnk/ayiFuO74dR4aPnnomtkGByo=,tag:uive2bYe42s6VtPd03jTMw==,type:str]",
"version": "3.11.0"
}
}

View File

@@ -0,0 +1,20 @@
[Mycelium](https://github.com/threefoldtech/mycelium) is an end-to-end encrypted IPv6 overlay network that spans the globe.
## Features
- Locality-aware routing: finds the shortest path between nodes.
- All traffic is end-to-end encrypted.
- Can route traffic via friend nodes and is location-aware.
- Automatic rerouting if a physical link goes down.
- IPv6 addresses are derived from private keys.
- A simple, reliable message bus is implemented on top of Mycelium.
- Supports multiple transports (QUIC, TCP, …). Hole punching for QUIC is in progress to enable true P2P connectivity behind NATs.
- Designed for planetary-scale scalability; previous overlay networks reached practical limits, and Mycelium focuses on scaling.
- Can run without a TUN device and be used solely as a reliable message bus.
Example configuration below connects all your machines to the Mycelium network:
```nix
mycelium = {
roles.peer.tags.all = {};
};
```

View File

@@ -7,6 +7,7 @@
"System"
"Network"
];
manifest.readme = builtins.readFile ./README.md;
roles.peer = {
description = "A peer in the mycelium network";

View File

@@ -3,7 +3,7 @@
...
}:
{
name = "service-mycelium";
name = "mycelium";
clan = {
test.useContainers = false;

View File

@@ -0,0 +1,11 @@
This service is meant to be consumed by the UI / API, and exposes a JSON serializable interface to add packages to a machine over the inventory.
The example below demonstrates installing the "cbonsai" application to a machine named "server.
```
instances.packages = {
roles.default.machines."server".settings = {
packages = [ "cbonsai" ];
};
};
```

View File

@@ -6,6 +6,7 @@
manifest.categories = [
"System"
];
manifest.readme = builtins.readFile ./README.md;
roles.default = {
description = "Placeholder role to apply the packages service";

View File

@@ -1,5 +1,5 @@
{
name = "service-packages";
name = "packages";
clan = {
directory = ./.;

View File

@@ -1,16 +1,16 @@
# Clan service: sshd
What it does
## What it does
- Generates and persists SSH host keys via `vars`.
- Optionally issues CAsigned host certificates for servers.
- Installs the `server` CA public key into `clients` `known_hosts` for TOFUless verification.
- Optionally issues CA-signed host certificates for servers.
- Installs the `server` CA public key into `clients` `known_hosts` for TOFU-less verification.
When to use it
- ZeroTOFU SSH for dynamic fleets: admins/CI can connect to frequently rebuilt hosts (e.g., server-1.example.com) without prompts or perhost `known_hosts` churn.
## When to use it
- Zero-TOFU SSH for dynamic fleets: admins/CI can connect to frequently rebuilt hosts (e.g., server-1.example.com) without prompts or per-host `known_hosts` churn.
Roles
- Server: runs sshd, presents a CAsigned host certificate for `<machine>.<domain>`.
- Client: trusts the CA for the given domains to verify servers certificates.
### Roles
- Server: runs sshd, presents a CA-signed host certificate for `<machine>.<domain>`.
- Client: trusts the CA for the given domains to verify servers' certificates.
Tip: assign both roles to a machine if it should both present a cert and verify others.
Quick start (with host certificates)
@@ -80,12 +80,13 @@ Admins should trust only production; CI should trust prod and staging. Servers a
};
}
```
- Admin -> server1.prod.example.com: zeroTOFU (verified via cert).
### Explanation
- Admin -> server1.prod.example.com: zero-TOFU (verified via cert).
- Admin -> server1.staging.example.com: falls back to TOFU (or is blocked by policy).
- CI -> either prod or staging: zeroTOFU for both.
Note: server and client searchDomains dont have to be identical; they only need to overlap for the hostnames you actually use.
- CI -> either prod or staging: zero-TOFU for both.
Note: server and client searchDomains don't have to be identical; they only need to overlap for the hostnames you actually use.
Notes
### Notes
- Connect using a name that matches a cert principal (e.g., `server1.example.com`); wildcards are not allowed inside the certificate.
- CA private key stays in `vars` (not deployed); only the CA public key is distributed.
- Logins still require your user SSH keys on the server (passwords are disabled).

View File

@@ -2,7 +2,7 @@
{
_class = "clan.service";
manifest.name = "clan-core/sshd";
manifest.description = "Enables secure remote access to the machine over SSH";
manifest.description = "Enables secure remote access to the machine over SSH with automatic host key management and optional CA-signed host certificates.";
manifest.categories = [
"System"
"Network"
@@ -29,7 +29,7 @@
};
perInstance =
{ settings, ... }:
{ settings, roles, ... }:
{
nixosModule =
{
@@ -38,8 +38,19 @@
pkgs,
...
}:
let
uniqueStrings = list: builtins.attrNames (builtins.groupBy lib.id list);
# Collect searchDomains from all servers in this instance
allServerSearchDomains = lib.flatten (
lib.mapAttrsToList (_name: machineConfig: machineConfig.settings.certificate.searchDomains or [ ]) (
roles.server.machines or { }
)
);
# Merge client's searchDomains with all servers' searchDomains
searchDomains = uniqueStrings (settings.certificate.searchDomains ++ allServerSearchDomains);
in
{
clan.core.vars.generators.openssh-ca = lib.mkIf (settings.certificate.searchDomains != [ ]) {
clan.core.vars.generators.openssh-ca = lib.mkIf (searchDomains != [ ]) {
share = true;
files.id_ed25519.deploy = false;
files."id_ed25519.pub" = {
@@ -54,9 +65,9 @@
'';
};
programs.ssh.knownHosts.ssh-ca = lib.mkIf (settings.certificate.searchDomains != [ ]) {
programs.ssh.knownHosts.ssh-ca = lib.mkIf (searchDomains != [ ]) {
certAuthority = true;
extraHostNames = builtins.map (domain: "*.${domain}") settings.certificate.searchDomains;
extraHostNames = builtins.map (domain: "*.${domain}") searchDomains;
publicKey = config.clan.core.vars.generators.openssh-ca.files."id_ed25519.pub".value;
};
};
@@ -180,7 +191,9 @@
settings.PasswordAuthentication = false;
settings.HostCertificate = lib.mkIf (
# this check needs to go first, as otherwise generators.openssh-cert does not exist
settings.certificate.searchDomains != [ ]
&& config.clan.core.vars.generators.openssh-cert.files."ssh.id_ed25519-cert.pub".exists
) config.clan.core.vars.generators.openssh-cert.files."ssh.id_ed25519-cert.pub".path;
hostKeys = [

View File

@@ -13,6 +13,11 @@ in
clan.nixosTests.sshd = {
imports = [ ./tests/vm/default.nix ];
clan.modules."@clan/sshd" = module;
};
clan.nixosTests.sshd-no-search-domains = {
imports = [ ./tests/vm/no-search-domains.nix ];
clan.modules."@clan/sshd" = module;
};
};

View File

@@ -3,7 +3,7 @@
...
}:
{
name = "service-sshd";
name = "sshd";
clan = {
directory = ./.;

View File

@@ -0,0 +1,45 @@
/*
This is a regression test for the following error:
error: attribute 'openssh-cert' missing
at /nix/store/y1k4bqwjql6bhlry456cs4marpamiqlr-source/clanServices/sshd/default.nix:184:17:
183| # this check needs to go first, as otherwise generators.openssh-cert does not exist
184| config.clan.core.vars.generators.openssh-cert.files."ssh.id_ed25519-cert.pub".exists
| ^
185| && settings.certificate.searchDomains != [ ]
*/
{
...
}:
{
name = "sshd";
clan = {
directory = ./.;
inventory = {
machines.server = { };
machines.client = { };
instances = {
sshd-test = {
module.name = "@clan/sshd";
module.input = "self";
roles.server.machines."server".settings = {
hostKeys.rsa.enable = true;
};
roles.client.machines."client".settings = {
};
};
};
};
};
nodes = {
server = { };
client = { };
};
testScript = ''
# don't do anything, just evaluate the machines
exit(0)
'';
}

View File

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

View File

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

View File

@@ -2,9 +2,17 @@
"data": "ENC[AES256_GCM,data:Qje3bXRHcAiFCslFfAeUTcOn2woc06e1sLAoH16x1sZ7N0i07rHqwsBjn7nKvMee6tktIjLMGTPOQL9TLgYI+wDgU5MHqlZlVBnYLk+VXYEKhymDlS3RAg5pbrmJzkucl/Vw5VBlDK+n8qnrgFG2pgpiC6Lzb5f4I7pxUl4zcz9jCf0Stj10lVQgkbvnr8UMUvcb1vUF/EAhF6WhhhgrhpbYrK+PkNW6EXmxIXdUdXvSqVWvJby2NgBaGOM1lwnWv4LOOiJ1BNXnOnLE0a8+8SjqahzqroeFvUCtoFxJ45/LqFTtgS9cQ44FaqrMRSWlOgsNR2BkeT449fKUCwYfEW1g/R47I9hAm/bcKrOBpHdAji/hpcDy73Qb9ZKrY6/0kRXl/ECI3YVX8nrHIjEJpoZ7a/dxJu7z8OOdb7gP2mVPTiWcbpD/KwpefDWLKnYhBrXUNaqSajf95Ahln2Vn6sALbbjcUzs/x5OqchYe1/kYy7MaGbEFNPeINnGid73c7xfUoyI90Ho4azLW8Q/n,iv:9heXX8g1P8/4gGT3+RYYmz6rJ5EnIDr5w1OAbGybL+I=,tag:p6mHZ8+EaJ+Nyn59n2TQ4g==,type:str]",
"sops": {
"age": [
{
"recipient": "age124l8cfswl97ck0e0qw8l47usf375srn69e4mhxr3gr40erxw7pesftxshx",
"enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSA5b0Y3aldQWXJyZzU3aGZU\naWpOK1VXdUVlSUVvZzJqSDVCekQ0Z2JxblRvCmFWd0c1SC9jckMweTIrNmg0VnN3\ncTNwMkVTL0ZyT3RGeUs2NnlNb21GWTQKLS0tIEpGM2FacUNoakJ0dlJwMWZMNU0x\nVWhmV1pDOTRFNExpVHBTRUx2L2ZaMVUK+ka9oqcvoLjwwUqIol0rU1VsJHhs4S1P\nWpKKPetUPEF4xxWj0OdeMc40XCTjl6CBdbtcrslH3tuZHjeSWQ6QCg==\n-----END AGE ENCRYPTED FILE-----\n"
},
{
"recipient": "age1qm0p4vf9jvcnn43s6l4prk8zn6cx0ep9gzvevxecv729xz540v8qa742eg",
"enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBkNlpCNGR0SHVtVzJ2K0hM\ncng1ZWlTSGQzWndXVWhlbEZMN25TUklXV1I4Cm9PZkJ3Zi81YXoxdzVPTFI3dE1a\nUnJnUmJPbi9CYmdFL2ltaTRSQ1MreFUKLS0tIDE4Y05IamJjL0huY2l2YU4zbDJs\ndTl1b0wzaTM4MndlcFZYVThqbWtVeFUKuSZLJpUrccuusJPU2xWHw19wTN8mKZW3\n1GJJjlb79rZp/RbSMxFxkyVHgu+F9kbpRgViICJSWkeR495786oArA==\n-----END AGE ENCRYPTED FILE-----\n"
"enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBLM3lNL1UyUjhRdFBvenlv\naXBTYXJva0hCTS8vK1hCYmdQdlpBNGFNTkNrCmVTbFROTWVWRzZyc2E0SjVDT1hs\nMm9qT0plcHNJaWczcWJTd0llYldGMVkKLS0tIGh6M04yQ3RiMGVYbTNYMEdCVTNK\nUDhaS3FSVWl4ZGlPYTRodW80VElsZ1UKxi48UZpxuu7gkRtQrCi4//suOpuFY6sl\n8b1xcN/tMn2MWW9hvx4K4qJLXTWOm+9GiZqJ51JBb0hihRh7fC3SfA==\n-----END AGE ENCRYPTED FILE-----\n"
},
{
"recipient": "age1f39qxz84yv272wk636el0kdyagzudcs99ucpkjarsj2rey6yvccse9lwet",
"enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBGK2Z5OGFsVjBJcGFITENH\nL205TDBaNkRvQ3ZBbGVDU0wrWnl5QkJaSFZNCjhNSXpMTTd1ejlqbVNBUDZ2TlFn\neUhNdEh4M1RhQnFabHpaMVd5eG11THcKLS0tIE9PS3JlVFVPNG5sM3hpWG95V1ho\nSXBySU1SUExkVHNHZElmQWExTVN3cHMKvzdlCWP8/9xviu/9AMxw/4ZyXo4O3AE9\n84IQBDO4GYrqnXvOroxjsNCDrCBDH0WPuYAphctJvyI5SSAtL4uHhQ==\n-----END AGE ENCRYPTED FILE-----\n"
}
],
"lastmodified": "2025-06-09T19:51:28Z",

View File

@@ -1,20 +1,24 @@
## Usage
This service configures Syncthing to continuously synchronize a folder peer-to-peer across your machines.
Example configuration:
```nix
{
instances.syncthing = {
roles.peer.tags.all = { };
roles.peer.settings.folders = {
documents = {
path = "~/syncthing/documents";
};
};
instances.syncthing = {
roles.peer.tags.all = { };
roles.peer.settings.folders = {
documents = {
path = "/home/youruser/syncthing/documents";
};
};
};
}
```
Now the folder `~/syncthing/documents` will be shared and kept in sync with all your machines.
Notes:
- Each key under `folders` is a folder ID (an arbitrary identifier for Syncthing).
- Prefer absolute paths (example shown). `~` may work in some environments but can be ambiguous in service contexts.
## Documentation
Extensive documentation is available on the [Syncthing](https://docs.syncthing.net/) website.
## Documentation
See the official Syncthing docs: https://docs.syncthing.net/

View File

@@ -1,5 +1,5 @@
{
name = "service-syncthing-service";
name = "syncthing-service";
clan = {
directory = ./.;

View File

@@ -0,0 +1,22 @@
🚧🚧🚧 Experimental 🚧🚧🚧
Use at your own risk.
We are still refining its interfaces, instability and breakages are expected.
---
This module is part of Clan's [networking interface](https://docs.clan.lol/guides/networking/networking/).
Clan's networking module automatically manages connections across available network transports and falls back intelligently. When you run `clan ssh` or `clan machines update`, Clan attempts each configured network in priority order until a connection succeeds.
The example below configures all your nixos machines to be reachable over the Tor network. By default, the `tor` module has the lowest priority among networks, as it's the slowest.
```nix
inventory.instances = {
# Fallback: Secure connections via Tor
tor = {
roles.server.tags.nixos = { };
};
};
```

View File

@@ -7,6 +7,7 @@
"System"
"Network"
];
manifest.readme = builtins.readFile ./README.md;
roles.client = {
description = ''

View File

@@ -1,5 +1,5 @@
{
name = "service-trusted-nix-caches";
name = "trusted-nix-caches";
clan = {
directory = ./.;

View File

@@ -1,5 +1,5 @@
{
name = "service-users";
name = "users";
clan = {
directory = ./.;

View File

@@ -1,5 +1,5 @@
{
name = "service-wifi";
name = "wifi";
clan = {
directory = ./.;

View File

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

View File

@@ -0,0 +1,14 @@
{
"data": "ENC[AES256_GCM,data:xAQ6TcwttQNb1BXlq2j+xZX+vGbqV5XKZyZMBAnQ00hWLu6Ba6pN2qR4HItKQ1KWza8WGhzgGdcwZv6Qobgmp9wAcwWlAubS7FU=,iv:KalRsDqWxqscJOeZcnQfFkP7QTBVZpP8XAdPHvikfaM=,tag:EAndFTqRYRcCgD5/ixniBA==,type:str]",
"sops": {
"age": [
{
"recipient": "age1qm0p4vf9jvcnn43s6l4prk8zn6cx0ep9gzvevxecv729xz540v8qa742eg",
"enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBjZnpWd0grazhjak0ra3NK\nSEpVTWVEaXEzc3ZIeloySXBqVk01SVNsVmtzCk5weWJCSGNlb2FRM0RWVEYwTHlC\nTVFBd1cvYlZrNlQ4TFRydFNzWXNicE0KLS0tIFZ5WllRNEI0Q3hQaVU2WjhGNDFr\nLy9pSXU5Y2FINy9LbXg4dzdHREQveE0KyxWDDyRpo0eTIXj0lHQtOunLtAP/Q+70\n+GvfjW7WXHXvXyg6CXzpCy6F6UWie4LHO9VrJM2mTjoh+q4l5DT6CA==\n-----END AGE ENCRYPTED FILE-----\n"
}
],
"lastmodified": "2025-10-19T12:53:35Z",
"mac": "ENC[AES256_GCM,data:P6Wcm7daPMe6laceFIiIzhcGa9k37Fo5ZnBFhdVmkATuR2oqMZp9Ke5r73SbC5B95QoPnWVNNnrxkn/oiVQmSiiDaf718isLAfU+7zGkV0BZCtfCrqe82JzH2iQ0tKSxsVJqklCijAfUBGpt/EYN6c4QnM2IFulbiWs2kqWMi4I=,iv:mRuTg2RblZCNX3yQNFKCtuwjwIptZ5VGpSyLV6Ah5NI=,tag:Xl8/jrtIhxfAi+FrnwKh7Q==,type:str]",
"version": "3.11.0"
}
}

View File

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

View File

@@ -0,0 +1,18 @@
{
"data": "ENC[AES256_GCM,data:B08uqk2DxB8QJ93QBM71,iv:XawCB0nwWxso5+yC8az33cFnt/qKzITOwUP0ZFI20Ho=,tag:mZg5U4t9beHch+Oic2VsVw==,type:str]",
"sops": {
"age": [
{
"recipient": "age1afr59kwlpuapv2g9m0sa4k9yc22ulj7zcway538z7nnsgvf2re5qd7k03a",
"enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBLWEV0STNnMlRreElVSk1y\nRTB6cCtWc0tkNUEycklSU0x5cHZwN3FIQkcwCkJQemRZOWZFSit3QmZ2a3RrOGFh\nUEhLSEZLRW9lWkN2b1VKK2EybUYvcTQKLS0tIGt6VWFmVHpNc2c0T3E0TjBYeWp1\ncjFCcEd3MTlYVGRsRlpXWWRsWlU0dkEKe5NUijC+GVxzj8bMEY6v+qHw9iylpwQz\nFLKneLikKVcRYoTYecimaQdUbYCiEwUB7KCpENcNmjZx6eVmTvGeMQ==\n-----END AGE ENCRYPTED FILE-----\n"
},
{
"recipient": "age1qm0p4vf9jvcnn43s6l4prk8zn6cx0ep9gzvevxecv729xz540v8qa742eg",
"enc": "-----BEGIN AGE ENCRYPTED FILE-----\nYWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSB6T1hheHNaZ2h6Mlc5WEJq\nUk8zTC82N2ZHUUJQK0VLdXBkNEFnNlRHamh3CitrWGpVVGQreDRZdTF5L2VXNENn\neThUd0tjUWpCNW01QklZakx6NnNoT28KLS0tIGVOLytqUGtsaWhFbi9mU2ttMmow\nOFhwVmkyVDdZK09ramZOYktFdkV5R1EKWGseGbOtLS45gb6fb8LFzlfdsRGC7x9B\ncn03oAcfC2Yo/kqoT4tjQF/COn408SBkytwZ3GbL8Bnul/RyjcHJNQ==\n-----END AGE ENCRYPTED FILE-----\n"
}
],
"lastmodified": "2025-10-19T12:53:38Z",
"mac": "ENC[AES256_GCM,data:MneMlobCnJZVn5QEwxL1os48TOJhrfETry39G2Si1kT5OKq6SlNB2mtVOshmGv21Cue/JNZWr9kwO0SS4egs4CsWaW8MMoR+84KIGIu9uol3vieEayd8nOjJfCKp0fRQKi1ElJRUtjLApA1KQ05WjG+vlb2JxNl67NWRqtykA44=,iv:f91eVJiSfmvM9ym8a3VYlijNZW5SoGUCUqAgFEax6Bo=,tag:ciANv3ov6p0gCJTIQwBoJg==,type:str]",
"version": "3.11.0"
}
}

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