silx: 2.1.1 -> 2.1.2 (#361612)
[NixPkgs.git] / nixos / modules / services / misc / soft-serve.nix
blob9a3fb1af9b8136d2de7cd083afa1e6c2e5425c2c
1 { config, lib, pkgs, ... }:
2 let
3   cfg = config.services.soft-serve;
4   configFile = format.generate "config.yaml" cfg.settings;
5   format = pkgs.formats.yaml { };
6   docUrl = "https://charm.sh/blog/self-hosted-soft-serve/";
7   stateDir = "/var/lib/soft-serve";
8 in
10   options = {
11     services.soft-serve = {
12       enable = lib.mkEnableOption "soft-serve";
14       package = lib.mkPackageOption pkgs "soft-serve" { };
16       settings = lib.mkOption {
17         type = format.type;
18         default = { };
19         description = ''
20           The contents of the configuration file for soft-serve.
22           See <${docUrl}>.
23         '';
24         example = lib.literalExpression ''
25           {
26             name = "dadada's repos";
27             log_format = "text";
28             ssh = {
29               listen_addr = ":23231";
30               public_url = "ssh://localhost:23231";
31               max_timeout = 30;
32               idle_timeout = 120;
33             };
34             stats.listen_addr = ":23233";
35           }
36         '';
37       };
38     };
39   };
41   config = lib.mkIf cfg.enable {
43     systemd.tmpfiles.rules = [
44       # The config file has to be inside the state dir
45       "L+ ${stateDir}/config.yaml - - - - ${configFile}"
46     ];
48     systemd.services.soft-serve = {
49       description = "Soft Serve git server";
50       documentation = [ docUrl ];
51       requires = [ "network-online.target" ];
52       after = [ "network-online.target" ];
53       wantedBy = [ "multi-user.target" ];
55       environment.SOFT_SERVE_DATA_PATH = stateDir;
57       serviceConfig = {
58         Type = "simple";
59         DynamicUser = true;
60         Restart = "always";
61         ExecStart = "${lib.getExe cfg.package} serve";
62         StateDirectory = "soft-serve";
63         WorkingDirectory = stateDir;
64         RuntimeDirectory = "soft-serve";
65         RuntimeDirectoryMode = "0750";
66         ProcSubset = "pid";
67         ProtectProc = "invisible";
68         UMask = "0027";
69         CapabilityBoundingSet = "";
70         ProtectHome = true;
71         PrivateDevices = true;
72         PrivateUsers = true;
73         ProtectHostname = true;
74         ProtectClock = true;
75         ProtectKernelTunables = true;
76         ProtectKernelModules = true;
77         ProtectKernelLogs = true;
78         ProtectControlGroups = true;
79         RestrictAddressFamilies = [ "AF_UNIX" "AF_INET" "AF_INET6" ];
80         RestrictNamespaces = true;
81         LockPersonality = true;
82         MemoryDenyWriteExecute = true;
83         RestrictRealtime = true;
84         RemoveIPC = true;
85         PrivateMounts = true;
86         SystemCallArchitectures = "native";
87         SystemCallFilter = [
88           "@system-service"
89           "~@cpu-emulation @debug @keyring @module @mount @obsolete @privileged @raw-io @reboot @setuid @swap"
90         ];
91       };
92     };
93   };
95   meta.maintainers = [ lib.maintainers.dadada ];