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 = mkOption {
17 type = types.package;
18 default = pkgs.clickhouse;
19 defaultText = "pkgs.clickhouse";
20 description = ''
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 User = "clickhouse";
52 Group = "clickhouse";
53 ConfigurationDirectory = "clickhouse-server";
54 AmbientCapabilities = "CAP_SYS_NICE";
55 StateDirectory = "clickhouse";
56 LogsDirectory = "clickhouse";
57 ExecStart = "${cfg.package}/bin/clickhouse-server --config-file=${cfg.package}/etc/clickhouse-server/config.xml";
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}