zfs_unstable: 2.3.0-rc3 -> 2.3.0-rc4 (#365045)
[NixPkgs.git] / nixos / modules / services / networking / thelounge.nix
blob96fa9a41bf6e1463e626c352f3f00512c89f335b
1 { pkgs, lib, config, ... }:
3 with lib;
5 let
6   cfg = config.services.thelounge;
7   dataDir = "/var/lib/thelounge";
8   configJsData = "module.exports = " + builtins.toJSON (
9     { inherit (cfg) public port; } // cfg.extraConfig
10   );
11   pluginManifest = {
12     dependencies = builtins.listToAttrs (builtins.map (pkg: { name = getName pkg; value = getVersion pkg; }) cfg.plugins);
13   };
14   plugins = pkgs.runCommand "thelounge-plugins" {
15     preferLocalBuild = true;
16   } ''
17     mkdir -p $out/node_modules
18     echo ${escapeShellArg (builtins.toJSON pluginManifest)} >> $out/package.json
19     ${concatMapStringsSep "\n" (pkg: ''
20     ln -s ${pkg}/lib/node_modules/${getName pkg} $out/node_modules/${getName pkg}
21     '') cfg.plugins}
22   '';
25   imports = [ (mkRemovedOptionModule [ "services" "thelounge" "private" ] "The option was renamed to `services.thelounge.public` to follow upstream changes.") ];
27   options.services.thelounge = {
28     enable = mkEnableOption "The Lounge web IRC client";
30     package = mkPackageOption pkgs "thelounge" { };
32     public = mkOption {
33       type = types.bool;
34       default = false;
35       description = ''
36         Make your The Lounge instance public.
37         Setting this to `false` will require you to configure user
38         accounts by using the ({command}`thelounge`) command or by adding
39         entries in {file}`${dataDir}/users`. You might need to restart
40         The Lounge after making changes to the state directory.
41       '';
42     };
44     port = mkOption {
45       type = types.port;
46       default = 9000;
47       description = "TCP port to listen on for http connections.";
48     };
50     extraConfig = mkOption {
51       default = { };
52       type = types.attrs;
53       example = literalExpression ''
54         {
55           reverseProxy = true;
56           defaults = {
57             name = "Your Network";
58             host = "localhost";
59             port = 6697;
60           };
61         }
62       '';
63       description = ''
64         The Lounge's {file}`config.js` contents as attribute set (will be
65         converted to JSON to generate the configuration file).
67         The options defined here will be merged to the default configuration file.
68         Note: In case of duplicate configuration, options from {option}`extraConfig` have priority.
70         Documentation: <https://thelounge.chat/docs/server/configuration>
71       '';
72     };
74     plugins = mkOption {
75       default = [ ];
76       type = types.listOf types.package;
77       example = literalExpression "[ pkgs.theLoungePlugins.themes.solarized ]";
78       description = ''
79         The Lounge plugins to install. Plugins can be found in
80         `pkgs.theLoungePlugins.plugins` and `pkgs.theLoungePlugins.themes`.
81       '';
82     };
83   };
85   config = mkIf cfg.enable {
86     users.users.thelounge = {
87       description = "The Lounge service user";
88       group = "thelounge";
89       isSystemUser = true;
90     };
92     users.groups.thelounge = { };
94     systemd.services.thelounge = {
95       description = "The Lounge web IRC client";
96       wantedBy = [ "multi-user.target" ];
97       preStart = "ln -sf ${pkgs.writeText "config.js" configJsData} ${dataDir}/config.js";
98       environment.THELOUNGE_PACKAGES = mkIf (cfg.plugins != [ ]) "${plugins}";
99       serviceConfig = {
100         User = "thelounge";
101         StateDirectory = baseNameOf dataDir;
102         ExecStart = "${getExe cfg.package} start";
103       };
104     };
106     environment.systemPackages = [ cfg.package ];
107   };
109   meta = {
110     maintainers = with lib.maintainers; [ winter ];
111   };