grafana-alloy: don't build the frontend twice
[NixPkgs.git] / nixos / modules / services / misc / parsoid.nix
bloba1935d202172a38828cf904cd83db0563edeaf17
1 { config, lib, pkgs, ... }:
3 with lib;
5 let
7   cfg = config.services.parsoid;
9   parsoid = pkgs.nodePackages.parsoid;
11   confTree = {
12     worker_heartbeat_timeout = 300000;
13     logging = { level = "info"; };
14     services = [{
15       module = "lib/index.js";
16       entrypoint = "apiServiceWorker";
17       conf = {
18         mwApis = map (x: if isAttrs x then x else { uri = x; }) cfg.wikis;
19         serverInterface = cfg.interface;
20         serverPort = cfg.port;
21       };
22     }];
23   };
25   confFile = pkgs.writeText "config.yml" (builtins.toJSON (recursiveUpdate confTree cfg.extraConfig));
29   imports = [
30     (mkRemovedOptionModule [ "services" "parsoid" "interwikis" ] "Use services.parsoid.wikis instead")
31   ];
33   ##### interface
35   options = {
37     services.parsoid = {
39       enable = mkOption {
40         type = types.bool;
41         default = false;
42         description = ''
43           Whether to enable Parsoid -- bidirectional
44           wikitext parser.
45         '';
46       };
48       wikis = mkOption {
49         type = types.listOf (types.either types.str types.attrs);
50         example = [ "http://localhost/api.php" ];
51         description = ''
52           Used MediaWiki API endpoints.
53         '';
54       };
56       workers = mkOption {
57         type = types.int;
58         default = 2;
59         description = ''
60           Number of Parsoid workers.
61         '';
62       };
64       interface = mkOption {
65         type = types.str;
66         default = "127.0.0.1";
67         description = ''
68           Interface to listen on.
69         '';
70       };
72       port = mkOption {
73         type = types.port;
74         default = 8000;
75         description = ''
76           Port to listen on.
77         '';
78       };
80       extraConfig = mkOption {
81         type = types.attrs;
82         default = {};
83         description = ''
84           Extra configuration to add to parsoid configuration.
85         '';
86       };
88     };
90   };
92   ##### implementation
94   config = mkIf cfg.enable {
96     systemd.services.parsoid = {
97       description = "Bidirectional wikitext parser";
98       wantedBy = [ "multi-user.target" ];
99       after = [ "network.target" ];
100       serviceConfig = {
101         ExecStart = "${parsoid}/lib/node_modules/parsoid/bin/server.js -c ${confFile} -n ${toString cfg.workers}";
103         DynamicUser = true;
104         User = "parsoid";
105         Group = "parsoid";
107         CapabilityBoundingSet = "";
108         NoNewPrivileges = true;
109         ProtectSystem = "strict";
110         ProtectHome = true;
111         PrivateTmp = true;
112         PrivateDevices = true;
113         ProtectHostname = true;
114         ProtectKernelTunables = true;
115         ProtectKernelModules = true;
116         ProtectControlGroups = true;
117         RestrictAddressFamilies = [ "AF_INET" "AF_INET6" ];
118         RestrictNamespaces = true;
119         LockPersonality = true;
120         #MemoryDenyWriteExecute = true;
121         RestrictRealtime = true;
122         RestrictSUIDSGID = true;
123         RemoveIPC = true;
124       };
125     };
127   };