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