1{ config, lib, pkgs, ... }:
2
3with lib;
4
5let
6
7 cfg = config.services.memcached;
8
9 memcached = pkgs.memcached;
10
11in
12
13{
14
15 ###### interface
16
17 options = {
18
19 services.memcached = {
20
21 enable = mkOption {
22 default = false;
23 description = "
24 Whether to enable Memcached.
25 ";
26 };
27
28 user = mkOption {
29 default = "memcached";
30 description = "The user to run Memcached as";
31 };
32
33 listen = mkOption {
34 default = "127.0.0.1";
35 description = "The IP address to bind to";
36 };
37
38 port = mkOption {
39 default = 11211;
40 description = "The port to bind to";
41 };
42
43 enableUnixSocket = mkEnableOption "unix socket at /run/memcached/memcached.sock";
44
45 maxMemory = mkOption {
46 default = 64;
47 description = "The maximum amount of memory to use for storage, in megabytes.";
48 };
49
50 maxConnections = mkOption {
51 default = 1024;
52 description = "The maximum number of simultaneous connections";
53 };
54
55 extraOptions = mkOption {
56 default = [];
57 description = "A list of extra options that will be added as a suffix when running memcached";
58 };
59 };
60
61 };
62
63 ###### implementation
64
65 config = mkIf config.services.memcached.enable {
66
67 users.users = optional (cfg.user == "memcached") {
68 name = "memcached";
69 description = "Memcached server user";
70 };
71
72 environment.systemPackages = [ memcached ];
73
74 systemd.services.memcached = {
75 description = "Memcached server";
76
77 wantedBy = [ "multi-user.target" ];
78 after = [ "network.target" ];
79
80 serviceConfig = {
81 PermissionsStartOnly = true;
82 ExecStartPre = optionals cfg.enableUnixSocket [
83 "${pkgs.coreutils}/bin/install -d -o ${cfg.user} /run/memcached/"
84 "${pkgs.coreutils}/bin/chown -R ${cfg.user} /run/memcached/"
85 ];
86 ExecStart =
87 let
88 networking = if cfg.enableUnixSocket
89 then "-s /run/memcached/memcached.sock"
90 else "-l ${cfg.listen} -p ${toString cfg.port}";
91 in "${memcached}/bin/memcached ${networking} -m ${toString cfg.maxMemory} -c ${toString cfg.maxConnections} ${concatStringsSep " " cfg.extraOptions}";
92
93 User = cfg.user;
94 };
95 };
96 };
97 imports = [
98 (mkRemovedOptionModule ["services" "memcached" "socket"] ''
99 This option was replaced by a fixed unix socket path at /run/memcached/memcached.sock enabled using services.memached.enableUnixSocket.
100 '')
101 ];
102
103}