diff --git a/nixos/modules/misc/ids.nix b/nixos/modules/misc/ids.nix
index 47c140df2482..b61c1f4799ec 100644
--- a/nixos/modules/misc/ids.nix
+++ b/nixos/modules/misc/ids.nix
@@ -280,6 +280,7 @@
leaps = 260;
ipfs = 261;
stanchion = 262;
+ riak-cs = 263;
# When adding a uid, make sure it doesn't match an existing gid. And don't use uids above 399!
@@ -530,6 +531,7 @@
leaps = 260;
ipfs = 261;
stanchion = 262;
+ riak-cs = 263;
# When adding a gid, make sure it doesn't match an existing
# uid. Users and groups with the same name should have equal
diff --git a/nixos/modules/module-list.nix b/nixos/modules/module-list.nix
index 56f880fdbd38..d82f1fbc54fd 100644
--- a/nixos/modules/module-list.nix
+++ b/nixos/modules/module-list.nix
@@ -159,6 +159,7 @@
./services/databases/postgresql.nix
./services/databases/redis.nix
./services/databases/riak.nix
+ ./services/databases/riak-cs.nix
./services/databases/stanchion.nix
./services/databases/virtuoso.nix
./services/desktops/accountsservice.nix
diff --git a/nixos/modules/services/databases/riak-cs.nix b/nixos/modules/services/databases/riak-cs.nix
new file mode 100644
index 000000000000..77717118c645
--- /dev/null
+++ b/nixos/modules/services/databases/riak-cs.nix
@@ -0,0 +1,201 @@
+{ config, lib, pkgs, ... }:
+
+with lib;
+
+let
+
+ cfg = config.services.riak-cs;
+
+in
+
+{
+
+ ###### interface
+
+ options = {
+
+ services.riak-cs = {
+
+ enable = mkEnableOption "riak-cs";
+
+ package = mkOption {
+ type = types.package;
+ default = pkgs.riak-cs;
+ example = literalExample "pkgs.riak";
+ description = ''
+ Riak package to use.
+ '';
+ };
+
+ nodeName = mkOption {
+ type = types.string;
+ default = "riak-cs@127.0.0.1";
+ description = ''
+ Name of the Erlang node.
+ '';
+ };
+
+ anonymousUserCreation = mkOption {
+ type = types.bool;
+ default = false;
+ description = ''
+ Anonymous user creation.
+ '';
+ };
+
+ riakHost = mkOption {
+ type = types.string;
+ default = "127.0.0.1:8087";
+ description = ''
+ Name of riak hosting service.
+ '';
+ };
+
+ listener = mkOption {
+ type = types.string;
+ default = "127.0.0.1:8080";
+ description = ''
+ Name of Riak CS listening service.
+ '';
+ };
+
+ stanchionHost = mkOption {
+ type = types.string;
+ default = "127.0.0.1:8085";
+ description = ''
+ Name of stanchion hosting service.
+ '';
+ };
+
+ stanchionSsl = mkOption {
+ type = types.bool;
+ default = true;
+ description = ''
+ Tell stanchion to use SSL.
+ '';
+ };
+
+ distributedCookie = mkOption {
+ type = types.string;
+ default = "riak";
+ description = ''
+ Cookie for distributed node communication. All nodes in the
+ same cluster should use the same cookie or they will not be able to
+ communicate.
+ '';
+ };
+
+ dataDir = mkOption {
+ type = types.path;
+ default = "/var/db/riak-cs";
+ description = ''
+ Data directory for Riak CS.
+ '';
+ };
+
+ logDir = mkOption {
+ type = types.path;
+ default = "/var/log/riak-cs";
+ description = ''
+ Log directory for Riak CS.
+ '';
+ };
+
+ extraConfig = mkOption {
+ type = types.lines;
+ default = "";
+ description = ''
+ Additional text to be appended to riak-cs.conf.
+ '';
+ };
+
+ extraAdvancedConfig = mkOption {
+ type = types.lines;
+ default = "";
+ description = ''
+ Additional text to be appended to advanced.config.
+ '';
+ };
+ };
+
+ };
+
+ ###### implementation
+
+ config = mkIf cfg.enable {
+
+ environment.systemPackages = [ cfg.package ];
+ environment.etc."riak-cs/riak-cs.conf".text = ''
+ nodename = ${cfg.nodeName}
+ distributed_cookie = ${cfg.distributedCookie}
+
+ platform_log_dir = ${cfg.logDir}
+
+ riak_host = ${cfg.riakHost}
+ listener = ${cfg.listener}
+ stanchion_host = ${cfg.stanchionHost}
+
+ anonymous_user_creation = ${if cfg.anonymousUserCreation then "on" else "off"}
+
+ ${cfg.extraConfig}
+ '';
+
+ environment.etc."riak-cs/advanced.config".text = ''
+ ${cfg.extraAdvancedConfig}
+ '';
+
+ users.extraUsers.riak-cs = {
+ name = "riak-cs";
+ uid = config.ids.uids.riak-cs;
+ group = "riak";
+ description = "Riak CS server user";
+ };
+
+ systemd.services.riak-cs = {
+ description = "Riak CS Server";
+
+ wantedBy = [ "multi-user.target" ];
+ after = [ "network.target" ];
+
+ path = [
+ pkgs.utillinux # for `logger`
+ pkgs.bash
+ ];
+
+ environment.HOME = "${cfg.dataDir}";
+ environment.RIAK_CS_DATA_DIR = "${cfg.dataDir}";
+ environment.RIAK_CS_LOG_DIR = "${cfg.logDir}";
+ environment.RIAK_CS_ETC_DIR = "/etc/riak";
+
+ preStart = ''
+ if ! test -e ${cfg.logDir}; then
+ mkdir -m 0755 -p ${cfg.logDir}
+ chown -R riak-cs ${cfg.logDir}
+ fi
+
+ if ! test -e ${cfg.dataDir}; then
+ mkdir -m 0700 -p ${cfg.dataDir}
+ chown -R riak-cs ${cfg.dataDir}
+ fi
+ '';
+
+ serviceConfig = {
+ ExecStart = "${cfg.package}/bin/riak-cs console";
+ ExecStop = "${cfg.package}/bin/riak-cs stop";
+ StandardInput = "tty";
+ User = "riak-cs";
+ Group = "riak-cs";
+ PermissionsStartOnly = true;
+ # Give Riak a decent amount of time to clean up.
+ TimeoutStopSec = 120;
+ LimitNOFILE = 65536;
+ };
+
+ unitConfig.RequiresMountsFor = [
+ "${cfg.dataDir}"
+ "${cfg.logDir}"
+ "/etc/riak"
+ ];
+ };
+ };
+}
diff --git a/pkgs/servers/nosql/riak-cs/2.1.1.nix b/pkgs/servers/nosql/riak-cs/2.1.1.nix
new file mode 100644
index 000000000000..439af4da565b
--- /dev/null
+++ b/pkgs/servers/nosql/riak-cs/2.1.1.nix
@@ -0,0 +1,67 @@
+{ stdenv, lib, fetchurl, unzip, erlang, git, wget, which, pam, coreutils, riak }:
+
+stdenv.mkDerivation rec {
+ name = "riak_cs-2.1.1";
+
+ buildInputs = [
+ which unzip erlang pam git wget
+ ];
+
+ src = fetchurl {
+ url = "http://s3.amazonaws.com/downloads.basho.com/riak-cs/2.1/2.1.1/riak-cs-2.1.1.tar.gz";
+ sha256 = "115cac127aac6d759c1b429a52e0d18e491c0719a6530b1b88aa52c4efdbedd5";
+ };
+
+
+ postPatch = ''
+ sed -i deps/node_package/priv/base/env.sh \
+ -e 's@{{platform_data_dir}}@''${RIAK_DATA_DIR:-/var/db/riak-cs}@' \
+ -e 's@^RUNNER_SCRIPT_DIR=.*@RUNNER_SCRIPT_DIR='$out'/bin@' \
+ -e 's@^RUNNER_BASE_DIR=.*@RUNNER_BASE_DIR='$out'@' \
+ -e 's@^RUNNER_ETC_DIR=.*@RUNNER_ETC_DIR=''${RIAK_ETC_DIR:-/etc/riak-cs}@' \
+ -e 's@^RUNNER_LOG_DIR=.*@RUNNER_LOG_DIR=''${RIAK_LOG_DIR:-/var/log}@'
+
+ sed -i ./Makefile \
+ -e 's@rel: deps compile@rel: deps compile-src@'
+ '';
+
+ preBuild = ''
+ patchShebangs .
+ '';
+
+ buildPhase = ''
+ runHook preBuild
+
+ make locked-deps
+ make rel
+
+ runHook postBuild
+ '';
+
+ doCheck = false;
+
+ installPhase = ''
+ runHook preInstall
+
+ mkdir $out
+ mv rel/riak-cs/etc rel/riak-cs/riak-etc
+ mkdir -p rel/riak-cs/etc
+ mv rel/riak-cs/riak-etc rel/riak-cs/etc/riak-cs
+ mv rel/riak-cs/* $out
+
+ for prog in $out/bin/*; do
+ substituteInPlace $prog \
+ --replace '. "`cd \`dirname $0\` && /bin/pwd`/../lib/env.sh"' \
+ ". $out/lib/env.sh"
+ done
+
+ runHook postInstall
+ '';
+
+ meta = with lib; {
+ description = "Dynamo inspired NoSQL DB by Basho with S3 compatibility";
+ platforms = [ "x86_64-linux" ];
+ license = licenses.asl20;
+ maintainer = with maintainers; [ mdaiter ];
+ };
+}
diff --git a/pkgs/top-level/all-packages.nix b/pkgs/top-level/all-packages.nix
index c405b14d89cc..65ad74c6ee0b 100644
--- a/pkgs/top-level/all-packages.nix
+++ b/pkgs/top-level/all-packages.nix
@@ -10245,6 +10245,10 @@ in
riak = callPackage ../servers/nosql/riak/2.1.1.nix { };
+ riak-cs = callPackage ../servers/nosql/riak-cs/2.1.1.nix {
+ erlang = erlang_basho_R16B03;
+ };
+
stanchion = callPackage ../servers/nosql/riak-cs/stanchion.nix {
erlang = erlang_basho_R16B03;
};