1{
2 config,
3 lib,
4 pkgs,
5 ...
6}:
7let
8 cfg = config.services.languagetool;
9 settingsFormat = pkgs.formats.javaProperties { };
10in
11{
12 options.services.languagetool = {
13 enable = lib.mkEnableOption "the LanguageTool server, a multilingual spelling, style, and grammar checker that helps correct or paraphrase texts";
14
15 package = lib.mkPackageOption pkgs "languagetool" { };
16
17 port = lib.mkOption {
18 type = lib.types.port;
19 default = 8081;
20 example = 8081;
21 description = ''
22 Port on which LanguageTool listens.
23 '';
24 };
25
26 public = lib.mkEnableOption "access from anywhere (rather than just localhost)";
27
28 allowOrigin = lib.mkOption {
29 type = lib.types.nullOr lib.types.str;
30 default = null;
31 example = "https://my-website.org";
32 description = ''
33 Set the Access-Control-Allow-Origin header in the HTTP response,
34 used for direct (non-proxy) JavaScript-based access from browsers.
35 `"*"` to allow access from all sites.
36 '';
37 };
38
39 settings = lib.mkOption {
40 type = lib.types.submodule {
41 freeformType = settingsFormat.type;
42
43 options.cacheSize = lib.mkOption {
44 type = lib.types.ints.unsigned;
45 default = 1000;
46 apply = toString;
47 description = "Number of sentences cached.";
48 };
49 };
50 default = { };
51 description = ''
52 Configuration file options for LanguageTool, see
53 'languagetool-http-server --help'
54 for supported settings.
55 '';
56 };
57
58 jrePackage = lib.mkPackageOption pkgs "jre" { };
59
60 jvmOptions = lib.mkOption {
61 description = ''
62 Extra command line options for the JVM running languagetool.
63 More information can be found here: <https://docs.oracle.com/en/java/javase/19/docs/specs/man/java.html#standard-options-for-java>
64 '';
65 default = [ ];
66 type = lib.types.listOf lib.types.str;
67 example = [
68 "-Xmx512m"
69 ];
70 };
71 };
72
73 config = lib.mkIf cfg.enable {
74
75 systemd.services.languagetool = {
76 description = "LanguageTool HTTP server";
77 wantedBy = [ "multi-user.target" ];
78 after = [ "network.target" ];
79 serviceConfig = {
80 DynamicUser = true;
81 User = "languagetool";
82 Group = "languagetool";
83 CapabilityBoundingSet = [ "" ];
84 RestrictNamespaces = [ "" ];
85 SystemCallFilter = [
86 "@system-service"
87 "~ @privileged"
88 ];
89 ProtectHome = "yes";
90 Restart = "on-failure";
91 ExecStart = ''
92 ${cfg.jrePackage}/bin/java \
93 -cp ${cfg.package}/share/languagetool-server.jar \
94 ${toString cfg.jvmOptions} \
95 org.languagetool.server.HTTPServer \
96 --port ${toString cfg.port} \
97 ${lib.optionalString cfg.public "--public"} \
98 ${lib.optionalString (cfg.allowOrigin != null) "--allow-origin ${cfg.allowOrigin}"} \
99 "--config" ${settingsFormat.generate "languagetool.conf" cfg.settings}
100 '';
101 };
102 };
103 };
104}