grafana-alloy: don't build the frontend twice
[NixPkgs.git] / nixos / modules / services / databases / memcached.nix
blob7a3afc5efafcf1cc06ea0e8e81f37f7cfd4b053e
1 { config, lib, pkgs, ... }:
3 with lib;
5 let
7   cfg = config.services.memcached;
9   memcached = pkgs.memcached;
15   ###### interface
17   options = {
19     services.memcached = {
20       enable = mkEnableOption "Memcached";
22       user = mkOption {
23         type = types.str;
24         default = "memcached";
25         description = "The user to run Memcached as";
26       };
28       listen = mkOption {
29         type = types.str;
30         default = "127.0.0.1";
31         description = "The IP address to bind to.";
32       };
34       port = mkOption {
35         type = types.port;
36         default = 11211;
37         description = "The port to bind to.";
38       };
40       enableUnixSocket = mkEnableOption "Unix Domain Socket at /run/memcached/memcached.sock instead of listening on an IP address and port. The `listen` and `port` options are ignored";
42       maxMemory = mkOption {
43         type = types.ints.unsigned;
44         default = 64;
45         description = "The maximum amount of memory to use for storage, in megabytes.";
46       };
48       maxConnections = mkOption {
49         type = types.ints.unsigned;
50         default = 1024;
51         description = "The maximum number of simultaneous connections.";
52       };
54       extraOptions = mkOption {
55         type = types.listOf types.str;
56         default = [];
57         description = "A list of extra options that will be added as a suffix when running memcached.";
58       };
59     };
61   };
63   ###### implementation
65   config = mkIf config.services.memcached.enable {
67     users.users = optionalAttrs (cfg.user == "memcached") {
68       memcached.description = "Memcached server user";
69       memcached.isSystemUser = true;
70       memcached.group = "memcached";
71     };
72     users.groups = optionalAttrs (cfg.user == "memcached") { memcached = {}; };
74     environment.systemPackages = [ memcached ];
76     systemd.services.memcached = {
77       description = "Memcached server";
79       wantedBy = [ "multi-user.target" ];
80       after = [ "network.target" ];
82       serviceConfig = {
83         ExecStart =
84         let
85           networking = if cfg.enableUnixSocket
86           then "-s /run/memcached/memcached.sock"
87           else "-l ${cfg.listen} -p ${toString cfg.port}";
88         in "${memcached}/bin/memcached ${networking} -m ${toString cfg.maxMemory} -c ${toString cfg.maxConnections} ${concatStringsSep " " cfg.extraOptions}";
90         User = cfg.user;
92         # Filesystem access
93         ProtectSystem = "strict";
94         ProtectHome = true;
95         PrivateTmp = true;
96         PrivateDevices = true;
97         ProtectKernelTunables = true;
98         ProtectKernelModules = true;
99         ProtectControlGroups = true;
100         RuntimeDirectory = "memcached";
101         # Caps
102         CapabilityBoundingSet = "";
103         NoNewPrivileges = true;
104         # Misc.
105         LockPersonality = true;
106         RestrictRealtime = true;
107         PrivateMounts = true;
108         MemoryDenyWriteExecute = true;
109       };
110     };
111   };
112   imports = [
113     (mkRemovedOptionModule ["services" "memcached" "socket"] ''
114       This option was replaced by a fixed unix socket path at /run/memcached/memcached.sock enabled using services.memcached.enableUnixSocket.
115     '')
116   ];