diff --git a/nixos/modules/misc/ids.nix b/nixos/modules/misc/ids.nix
index c2523a3cc329..426518585520 100644
--- a/nixos/modules/misc/ids.nix
+++ b/nixos/modules/misc/ids.nix
@@ -214,6 +214,7 @@
ripple-data-api = 186;
mediatomb = 187;
rdnssd = 188;
+ ihaskell = 189;
# When adding a uid, make sure it doesn't match an existing gid. And don't use uids above 399!
@@ -405,6 +406,7 @@
#ripple-data-api = 186; #unused
mediatomb = 187;
#rdnssd = 188; # unused
+ ihaskell = 189;
# 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 17717c5988dc..8a4adfc24f52 100644
--- a/nixos/modules/module-list.nix
+++ b/nixos/modules/module-list.nix
@@ -193,6 +193,7 @@
./services/misc/gitlab.nix
./services/misc/gitolite.nix
./services/misc/gpsd.nix
+ ./services/misc/ihaskell.nix
./services/misc/mediatomb.nix
./services/misc/mesos-master.nix
./services/misc/mesos-slave.nix
diff --git a/nixos/modules/services/misc/ihaskell.nix b/nixos/modules/services/misc/ihaskell.nix
new file mode 100644
index 000000000000..b857045bb7d0
--- /dev/null
+++ b/nixos/modules/services/misc/ihaskell.nix
@@ -0,0 +1,77 @@
+{ pkgs, lib, config, ... }:
+
+with lib;
+
+let
+
+ cfg = config.services.ihaskell;
+ ihaskell = pkgs.ihaskell.override {
+ inherit (cfg.haskellPackages) ihaskell ghcWithPackages;
+ packages = self: cfg.extraPackages self;
+ };
+
+in
+
+{
+ options = {
+ services.ihaskell = {
+ enable = mkOption {
+ default = false;
+ example = true;
+ description = "Autostart an IHaskell notebook service.";
+ };
+
+ haskellPackages = mkOption {
+ default = pkgs.haskellngPackages;
+ defaultText = "pkgs.haskellngPackages";
+ example = literalExample "pkgs.haskell-ng.packages.ghc784";
+ description = ''
+ haskellPackages used to build IHaskell and other packages.
+ This can be used to change the GHC version used to build
+ IHaskell and the packages listed in
+ extraPackages.
+ '';
+ };
+
+ extraPackages = mkOption {
+ default = self: [];
+ example = literalExample ''
+ haskellPackages: [
+ haskellPackages.wreq
+ haskellPackages.lens
+ ]
+ '';
+ description = ''
+ Extra packages available to ghc when running ihaskell. The
+ value must be a function which receives the attrset defined
+ in haskellPackages as the sole argument.
+ '';
+ };
+ };
+ };
+
+ config = mkIf cfg.enable {
+
+ users.extraUsers.ihaskell = {
+ group = config.users.extraGroups.ihaskell.name;
+ description = "IHaskell user";
+ home = "/var/lib/ihaskell";
+ createHome = true;
+ uid = config.ids.uids.ihaskell;
+ };
+
+ users.extraGroups.ihaskell.gid = config.ids.gids.ihaskell;
+
+ systemd.services.ihaskell = {
+ description = "IHaskell notebook instance";
+ wantedBy = [ "multi-user.target" ];
+ after = [ "network.target" ];
+ serviceConfig = {
+ User = config.users.extraUsers.ihaskell.name;
+ Group = config.users.extraUsers.ihaskell.name;
+ Restart = "always";
+ ExecStart = "${ihaskell}/bin/IHaskell notebook";
+ };
+ };
+ };
+}