{ pkgs, ... }: let s3 = { bucket = "clickhouse-bucket"; accessKey = "BKIKJAA5BMMU2RHO6IBB"; secretKey = "V7f1CwQqAcwo80UEIJEjc5gVQUSSx5ohQ9GSrr12"; }; clickhouseS3StorageConfig = '' s3 http://minio:9000/${s3.bucket}/ ${s3.accessKey} ${s3.secretKey} /var/lib/clickhouse/disks/s3_disk/ cache s3_disk /var/lib/clickhouse/disks/s3_cache/ 10Gi
s3_disk
''; in { name = "clickhouse-s3"; meta.maintainers = with pkgs.lib.maintainers; [ jpds ]; nodes = { clickhouse = { environment.etc = { "clickhouse-server/config.d/s3.xml" = { text = "${clickhouseS3StorageConfig}"; }; }; services.clickhouse.enable = true; virtualisation.diskSize = 15 * 1024; virtualisation.memorySize = 4 * 1024; }; minio = { pkgs, ... }: { virtualisation.diskSize = 2 * 1024; networking.firewall.allowedTCPPorts = [ 9000 ]; services.minio = { enable = true; inherit (s3) accessKey secretKey; }; environment.systemPackages = [ pkgs.minio-client ]; }; }; testScript = let # work around quote/substitution complexity by Nix, Perl, bash and SQL. tableDDL = pkgs.writeText "ddl.sql" '' CREATE TABLE `demo` ( `value` String ) ENGINE = MergeTree ORDER BY value SETTINGS storage_policy = 's3_main'; ''; insertQuery = pkgs.writeText "insert.sql" "INSERT INTO `demo` (`value`) VALUES ('foo');"; selectQuery = pkgs.writeText "select.sql" "SELECT * from `demo`"; in '' minio.wait_for_unit("minio") minio.wait_for_open_port(9000) minio.succeed( "mc alias set minio " + "http://localhost:9000 " + "${s3.accessKey} ${s3.secretKey} --api s3v4", "mc mb minio/${s3.bucket}", ) clickhouse.start() clickhouse.wait_for_unit("clickhouse.service") clickhouse.wait_for_open_port(9000) clickhouse.wait_until_succeeds( """ journalctl -o cat -u clickhouse.service | grep "Merging configuration file '/etc/clickhouse-server/config.d/s3.xml'" """ ) clickhouse.succeed( "cat ${tableDDL} | clickhouse-client" ) clickhouse.succeed( "cat ${insertQuery} | clickhouse-client" ) clickhouse.succeed( "cat ${selectQuery} | clickhouse-client | grep foo" ) minio.log(minio.succeed( "mc ls minio/${s3.bucket}", )) ''; }