From 7ef59c4fe2a87682054572a504fc7c6046c282e5 Mon Sep 17 00:00:00 2001 From: Luca Bruno Date: Fri, 13 Mar 2015 14:11:59 +0000 Subject: [PATCH] nixos: Multiple service instances, apply to nginx. See #6784 --- lib/types.nix | 15 ++++++++++++++ .../services/web-servers/nginx/default.nix | 20 +++++++++---------- 2 files changed, 25 insertions(+), 10 deletions(-) diff --git a/lib/types.nix b/lib/types.nix index 1e7abf36535f..ba0f9a5b890c 100644 --- a/lib/types.nix +++ b/lib/types.nix @@ -227,4 +227,19 @@ rec { }; + mkMultiInstance = path: args: f: + let + def = f (args // { name = "default"; config = getAttrFromPath path args.config; }); + in { + options = setAttrByPath path (def.options // { + instances = mkOption { + type = types.attrsOf (types.submodule f); + default = {}; + description = "Additional instances of this service"; + }; + }); + + config = def.config; + }; + } diff --git a/nixos/modules/services/web-servers/nginx/default.nix b/nixos/modules/services/web-servers/nginx/default.nix index 0f21ef012639..94dad49f9fd1 100644 --- a/nixos/modules/services/web-servers/nginx/default.nix +++ b/nixos/modules/services/web-servers/nginx/default.nix @@ -1,9 +1,12 @@ -{ config, lib, pkgs, ... }: +{ config, lib, pkgs, ... }@args: with lib; +let topconfig = config; +in mkMultiInstance [ "services" "nginx" ] args ({ config, name, ... }: + let - cfg = config.services.nginx; + cfg = config; nginx = cfg.package; configFile = pkgs.writeText "nginx.conf" '' user ${cfg.user} ${cfg.group}; @@ -20,7 +23,6 @@ in { options = { - services.nginx = { enable = mkOption { default = false; type = types.bool; @@ -82,15 +84,13 @@ in description = "Group account under which nginx runs."; }; - }; - }; config = mkIf cfg.enable { # TODO: test user supplied config file pases syntax test - systemd.services.nginx = { - description = "Nginx Web Server"; + systemd.services."nginx-${name}" = { + description = "Nginx Web Server - ${name}"; after = [ "network.target" ]; wantedBy = [ "multi-user.target" ]; path = [ nginx ]; @@ -111,12 +111,12 @@ in users.extraUsers = optionalAttrs (cfg.user == "nginx") (singleton { name = "nginx"; group = cfg.group; - uid = config.ids.uids.nginx; + uid = topconfig.ids.uids.nginx; }); users.extraGroups = optionalAttrs (cfg.group == "nginx") (singleton { name = "nginx"; - gid = config.ids.gids.nginx; + gid = topconfig.ids.gids.nginx; }); }; -} +})