···11+# changelog
22+33+## 2025-06-23
44+55+this update fixes usage with newer `@tangled.sh/core` revisions.
66+77+- replaced wrapped packages with just a wrapped keyfetch binary
88+- added `cfg.openFirewall` option to automatically open firewall ports (currently ssh only).
99+- reject module usage with old `@tangled.sh/core` revisions.
1010+- (**tests**) also test-run the wrapped `keyfetch` binary
···99let
1010 inherit (lib)
1111 mkOption
1212+ mkEnableOption
1213 types
1314 mkIf
1415 optional
···1617 cfg = config.services.tangled-knotserver;
1718 tangledPkgs = tangledFlake.packages.${pkgs.system};
18191919- wrapped-packages =
2020+ keyfetch-wrapped =
2021 pkgs.runCommandCC "tangled-packages-wrapped" { nativeBuildInputs = [ pkgs.makeBinaryWrapper ]; }
2122 ''
2223 mkdir -p $out/bin
23242424- makeBinaryWrapper ${lib.getExe' tangledPkgs.repoguard "repoguard"} $out/bin/repoguard \
2525- --add-flags -internal-api=http://${cfg.server.internalListenAddr}
2626- # other flags are set by keyfetch
2727-2828- makeBinaryWrapper ${lib.getExe' tangledPkgs.keyfetch "keyfetch"} $out/bin/keyfetch \
2929- --add-flags "-repoguard-path=$out/bin/repoguard" \
3030- --add-flags "-internal-api=http://${cfg.server.internalListenAddr}" \
3131- --add-flags "-git-dir=${cfg.repo.scanPath}" \
3232- --add-flags "-log-path=/var/log/knotserver/repoguard.log"
2525+ makeBinaryWrapper ${lib.getExe' tangledPkgs.knot "knot"} $out/bin/keyfetch \
2626+ --add-flags "keys" \
2727+ --append-flags "-output authorized-keys" \
2828+ --append-flags "-internal-api=http://${cfg.server.internalListenAddr}" \
2929+ --append-flags "-git-dir=${cfg.repo.scanPath}" \
3030+ --append-flags "-log-path=/var/log/knotserver/repoguard.log"
3331 '';
34323533in
···40384139 options = {
4240 services.tangled-knotserver = {
4343- enable = mkOption {
4141+ enable = mkEnableOption "a tangled knot server";
4242+4343+ openFirewall = mkOption {
4444 type = types.bool;
4545 default = false;
4646- description = "Enable a tangled knotserver";
4646+ description = "Whether to automatically configure the firewall to open necessary ports.";
4747 };
48484949 appviewEndpoint = mkOption {
···7070 description = "Git email address for git operations that requires one.";
7171 };
7272 };
7373+7474+ # TODO: should a `stateDirectory` option be added?
73757476 repo = {
7577 scanPath = mkOption {
···166168 tangled-knotserver: development mode is enabled. This is not recommended in production as signature checks are disabled.
167169 '';
168170171171+ assertions = [
172172+ {
173173+ assertion = tangledPkgs ? knot;
174174+ message = "tangled-knotserver: your version of tangled flake is not compatible with this version of the knotserver module. please consider updating the pinned @tangled.sh/core version.";
175175+ }
176176+ ];
177177+169178 environment.systemPackages = with pkgs; [ git ];
170179171180 users.users.${cfg.user} = {
181181+ createHome = true;
172182 home = cfg.repo.scanPath;
173183 group = cfg.user;
174184 isSystemUser = true;
···198208 serviceConfig = {
199209 User = cfg.user;
200210 WorkingDirectory = cfg.repo.scanPath;
201201- ExecStart = lib.getExe' tangledPkgs.knotserver "knotserver";
211211+ ExecStart = if (tangledPkgs ? knotserver) # compat
212212+ then lib.getExe' tangledPkgs.knotserver "knotserver"
213213+ else "${lib.getExe' tangledPkgs.knot "knot"} server";
202214 Restart = "always";
203215204216 StateDirectory = mkIf (lib.hasPrefix "/var/lib/tangled-knot" cfg.repo.scanPath) "tangled-knot";
···222234 };
223235224236 services.openssh = {
225225- enable = true;
237237+ enable = true; # required for the module to actually function
226238 extraConfig = ''
227239 Match User ${cfg.user}
228240 AuthorizedKeysCommand ${config.security.wrapperDir}/keyfetch
···236248 owner = "root";
237249 group = config.users.groups.${cfg.user}.name;
238250 permissions = "u+rx,go+x";
239239- source = lib.getExe' wrapped-packages "keyfetch";
251251+ source = lib.getExe' keyfetch-wrapped "keyfetch";
240252 };
253253+254254+ # open firewall ports if configured
255255+ networking.firewall.allowedTCPPorts = mkIf cfg.openFirewall [22];
241256 };
242257}
+29
readme.md
···1919 - logging to `/var/log/knotserver` prevents other users from messing around with repoguard, possibly a dos by just creating `/tmp/repoguard.log`.
2020 - these changes should not affect usage at all, just implementation details.
21212222+## usage
2323+2424+add this flake to your inputs, then import the module to your nixos config.
2525+2626+whilst not required, it is recommended to add the core flake and let the module flake follow that input, since i don't have all day updating this repo.
2727+2828+```nix
2929+{
3030+ inputs = {
3131+ # ...other stuff like nixpkgs
3232+ tangled.url = "git+https://tangled.sh/@tangled.sh/core";
3333+ knotserver-module = {
3434+ url = "git+https://tangled.sh/@soopy.moe/knotserver-module";
3535+ inputs.tangledCore.follows = "tangled";
3636+ };
3737+ };
3838+3939+ outputs = {nixpkgs, knotserver-module, ...}: {
4040+ nixosConfigurations.saturday = nixpkgs.lib.nixosSystem {
4141+ modules = [
4242+ knotserver-module.nixosModules.default
4343+ ./configuration.nix
4444+ ];
4545+ };
4646+ };
4747+}
4848+```
4949+5050+2251## stability
23522453this module is stable to use.
+1
test.nix
···2121 machine.wait_for_unit("knotserver.service")
2222 machine.wait_for_open_port(5555)
2323 machine.succeed('curl -f http://127.0.0.1:5555 | grep "This is a knot server"')
2424+ machine.succeed('/run/wrappers/bin/keyfetch')
2425 '';
2526}