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