{ config, lib, ... }: { options.snowflake.services.containerised.clickhouse = { enable = lib.mkEnableOption "enable clickhouse"; servers = lib.mkOption { type = lib.types.attrsOf (lib.types.submodule { options = { version = lib.mkOption { type = lib.types.str; description = "clickhouse version to use"; }; ports = { native = lib.mkOption { type = lib.types.port; }; http = lib.mkOption { type = lib.types.port; }; keeper = lib.mkOption { type = lib.types.port; }; }; }; }); }; }; config = lib.mkIf config.snowflake.services.containerised.clickhouse.enable { virtualisation.oci-containers.containers = lib.mapAttrs (clickhouseName: clickhouseCfg: { autoStart = true; image = "docker.io/clickhouse/clickhouse-server:${clickhouseCfg.version}"; volumes = [ "/var/lib/clickhouse/${clickhouseName}/data:/var/lib/clickhouse" "/var/lib/clickhouse/${clickhouseName}/config/:/etc/clickhouse-server/config.d/" ]; ports = [ "127.0.0.1:${builtins.toString clickhouseCfg.ports.native}:9000" "127.0.0.1:${builtins.toString clickhouseCfg.ports.http}:8123" "127.0.0.1:${builtins.toString clickhouseCfg.ports.keeper}:9181" ]; extraOptions = [ "--ulimit=nofile=262144:262144" "--ulimit=nproc=65535" ]; }) config.snowflake.services.containerised.clickhouse.servers; }; }