1{ config, lib, pkgs, ... }:
2let
3 cfg = config.services.clickhouse;
4in
5with lib;
6{
7
8 ###### interface
9
10 options = {
11
12 services.clickhouse = {
13
14 enable = mkEnableOption (lib.mdDoc "ClickHouse database server");
15
16 package = mkOption {
17 type = types.package;
18 default = pkgs.clickhouse;
19 defaultText = lib.literalExpression "pkgs.clickhouse";
20 description = lib.mdDoc ''
21 ClickHouse package to use.
22 '';
23 };
24
25 };
26
27 };
28
29
30 ###### implementation
31
32 config = mkIf cfg.enable {
33
34 users.users.clickhouse = {
35 name = "clickhouse";
36 uid = config.ids.uids.clickhouse;
37 group = "clickhouse";
38 description = "ClickHouse server user";
39 };
40
41 users.groups.clickhouse.gid = config.ids.gids.clickhouse;
42
43 systemd.services.clickhouse = {
44 description = "ClickHouse server";
45
46 wantedBy = [ "multi-user.target" ];
47
48 after = [ "network.target" ];
49
50 serviceConfig = {
51 Type = "notify";
52 User = "clickhouse";
53 Group = "clickhouse";
54 ConfigurationDirectory = "clickhouse-server";
55 AmbientCapabilities = "CAP_SYS_NICE";
56 StateDirectory = "clickhouse";
57 LogsDirectory = "clickhouse";
58 ExecStart = "${cfg.package}/bin/clickhouse-server --config-file=/etc/clickhouse-server/config.xml";
59 TimeoutStartSec = "infinity";
60 };
61
62 environment = {
63 # Switching off watchdog is very important for sd_notify to work correctly.
64 CLICKHOUSE_WATCHDOG_ENABLE = "0";
65 };
66 };
67
68 environment.etc = {
69 "clickhouse-server/config.xml" = {
70 source = "${cfg.package}/etc/clickhouse-server/config.xml";
71 };
72
73 "clickhouse-server/users.xml" = {
74 source = "${cfg.package}/etc/clickhouse-server/users.xml";
75 };
76 };
77
78 environment.systemPackages = [ cfg.package ];
79
80 # startup requires a `/etc/localtime` which only if exists if `time.timeZone != null`
81 time.timeZone = mkDefault "UTC";
82
83 };
84
85}