grafana-alloy: don't build the frontend twice
[NixPkgs.git] / nixos / modules / services / web-apps / gotosocial.nix
blobaee1edf66a6a75f7317f6ebb993f078ed296f6a0
1 { config, lib, pkgs, ... }:
2 let
3   cfg = config.services.gotosocial;
4   settingsFormat = pkgs.formats.yaml { };
5   configFile = settingsFormat.generate "config.yml" cfg.settings;
6   defaultSettings = {
7     application-name = "gotosocial";
9     protocol = "https";
11     bind-address = "127.0.0.1";
12     port = 8080;
14     storage-local-base-path = "/var/lib/gotosocial/storage";
16     db-type = "sqlite";
17     db-address = "/var/lib/gotosocial/database.sqlite";
18   };
19   gotosocial-admin = pkgs.writeShellScriptBin "gotosocial-admin" ''
20     exec systemd-run \
21       -u gotosocial-admin.service \
22       -p Group=gotosocial \
23       -p User=gotosocial \
24       -q -t -G --wait --service-type=exec \
25       ${cfg.package}/bin/gotosocial --config-path ${configFile} admin "$@"
26   '';
29   meta.doc = ./gotosocial.md;
30   meta.maintainers = with lib.maintainers; [ blakesmith ];
32   options.services.gotosocial = {
33     enable = lib.mkEnableOption "ActivityPub social network server";
35     package = lib.mkPackageOption pkgs "gotosocial" { };
37     openFirewall = lib.mkOption {
38       type = lib.types.bool;
39       default = false;
40       description = ''
41         Open the configured port in the firewall.
42         Using a reverse proxy instead is highly recommended.
43       '';
44     };
46     setupPostgresqlDB = lib.mkOption {
47       type = lib.types.bool;
48       default = false;
49       description = ''
50         Whether to setup a local postgres database and populate the
51         `db-type` fields in `services.gotosocial.settings`.
52       '';
53     };
55     settings = lib.mkOption {
56       type = settingsFormat.type;
57       default = defaultSettings;
58       example = {
59         application-name = "My GoToSocial";
60         host = "gotosocial.example.com";
61       };
62       description = ''
63         Contents of the GoToSocial YAML config.
65         Please refer to the
66         [documentation](https://docs.gotosocial.org/en/latest/configuration/)
67         and
68         [example config](https://github.com/superseriousbusiness/gotosocial/blob/main/example/config.yaml).
70         Please note that the `host` option cannot be changed later so it is important to configure this correctly before you start GoToSocial.
71       '';
72     };
74     environmentFile = lib.mkOption {
75       type = lib.types.nullOr lib.types.path;
76       description = ''
77         File path containing environment variables for configuring the GoToSocial service
78         in the format of an EnvironmentFile as described by systemd.exec(5).
80         This option could be used to pass sensitive configuration to the GoToSocial daemon.
82         Please refer to the Environment Variables section in the
83         [documentation](https://docs.gotosocial.org/en/latest/configuration/).
84       '';
85       default = null;
86       example = "/root/nixos/secrets/gotosocial.env";
87     };
89   };
91   config = lib.mkIf cfg.enable {
92     assertions = [
93       {
94         assertion = cfg.settings.host or null != null;
95         message = ''
96           You have to define a hostname for GoToSocial (`services.gotosocial.settings.host`), it cannot be changed later without starting over!
97         '';
98       }
99     ];
101     services.gotosocial.settings = (lib.mapAttrs (name: lib.mkDefault) (
102       defaultSettings // {
103         web-asset-base-dir = "${cfg.package}/share/gotosocial/web/assets/";
104         web-template-base-dir = "${cfg.package}/share/gotosocial/web/template/";
105       }
106     )) // (lib.optionalAttrs cfg.setupPostgresqlDB {
107       db-type = "postgres";
108       db-address = "/run/postgresql";
109       db-database = "gotosocial";
110       db-user = "gotosocial";
111     });
113     environment.systemPackages = [ gotosocial-admin ];
115     users.groups.gotosocial = { };
116     users.users.gotosocial = {
117       group = "gotosocial";
118       isSystemUser = true;
119     };
121     networking.firewall = lib.mkIf cfg.openFirewall {
122       allowedTCPPorts = [ cfg.settings.port ];
123     };
125     services.postgresql = lib.mkIf cfg.setupPostgresqlDB {
126       enable = true;
127       ensureDatabases = [ "gotosocial" ];
128       ensureUsers = [
129         {
130           name = "gotosocial";
131           ensureDBOwnership = true;
132         }
133       ];
134     };
136     systemd.services.gotosocial = {
137       description = "ActivityPub social network server";
138       wantedBy = [ "multi-user.target" ];
139       after = [ "network.target" ]
140         ++ lib.optional cfg.setupPostgresqlDB "postgresql.service";
141       requires = lib.optional cfg.setupPostgresqlDB "postgresql.service";
142       restartTriggers = [ configFile ];
144       serviceConfig = {
145         EnvironmentFile = lib.mkIf (cfg.environmentFile != null) cfg.environmentFile;
146         ExecStart = "${cfg.package}/bin/gotosocial --config-path ${configFile} server start";
147         Restart = "on-failure";
148         Group = "gotosocial";
149         User = "gotosocial";
150         StateDirectory = "gotosocial";
151         WorkingDirectory = "/var/lib/gotosocial";
153         # Security options:
154         # Based on https://github.com/superseriousbusiness/gotosocial/blob/v0.8.1/example/gotosocial.service
155         AmbientCapabilities = lib.optional (cfg.settings.port < 1024) "CAP_NET_BIND_SERVICE";
156         NoNewPrivileges = true;
157         PrivateTmp = true;
158         PrivateDevices = true;
159         RestrictAddressFamilies = "AF_UNIX AF_INET AF_INET6";
160         RestrictNamespaces = true;
161         RestrictRealtime = true;
162         DevicePolicy = "closed";
163         ProtectSystem = "full";
164         ProtectControlGroups = true;
165         ProtectKernelModules = true;
166         ProtectKernelTunables = true;
167         LockPersonality = true;
168       };
169     };
170   };