1{ config, lib, pkgs, ... }:
2
3with lib;
4
5let
6 pkg = pkgs.haste-server;
7 cfg = config.services.haste-server;
8
9 format = pkgs.formats.json {};
10in
11{
12 options.services.haste-server = {
13 enable = mkEnableOption (lib.mdDoc "haste-server");
14 openFirewall = mkEnableOption (lib.mdDoc "firewall passthrough for haste-server");
15
16 settings = mkOption {
17 description = lib.mdDoc ''
18 Configuration for haste-server.
19 For documentation see [project readme](https://github.com/toptal/haste-server#settings)
20 '';
21 type = format.type;
22 };
23 };
24
25 config = mkIf (cfg.enable) {
26 networking.firewall.allowedTCPPorts = mkIf (cfg.openFirewall) [ cfg.settings.port ];
27
28 services.haste-server = {
29 settings = {
30 host = mkDefault "::";
31 port = mkDefault 7777;
32
33 keyLength = mkDefault 10;
34 maxLength = mkDefault 400000;
35
36 staticMaxAge = mkDefault 86400;
37 recompressStaticAssets = mkDefault false;
38
39 logging = mkDefault [
40 {
41 level = "verbose";
42 type = "Console";
43 colorize = true;
44 }
45 ];
46
47 keyGenerator = mkDefault {
48 type = "phonetic";
49 };
50
51 rateLimits = {
52 categories = {
53 normal = {
54 totalRequests = mkDefault 500;
55 every = mkDefault 60000;
56 };
57 };
58 };
59
60 storage = mkDefault {
61 type = "file";
62 };
63
64 documents = {
65 about = mkDefault "${pkg}/share/haste-server/about.md";
66 };
67 };
68 };
69
70 systemd.services.haste-server = {
71 wantedBy = [ "multi-user.target" ];
72 requires = [ "network.target" ];
73 after = [ "network.target" ];
74
75 serviceConfig = {
76 User = "haste-server";
77 DynamicUser = true;
78 StateDirectory = "haste-server";
79 WorkingDirectory = "/var/lib/haste-server";
80 ExecStart = "${pkg}/bin/haste-server ${format.generate "config.json" cfg.settings}";
81 };
82
83 path = with pkgs; [ pkg coreutils ];
84 };
85 };
86}