X-Git-Url: https://git.immae.eu/?a=blobdiff_plain;f=modules%2Fwebapps%2Fmastodon.nix;h=df2dbb23dac2a2eec289a037de296790071f3c1d;hb=f0255dd5bd2b793741fa1f6f349b89219c9bd56a;hp=ad6d0c3aa625cdb15408dda1940a6554fed38212;hpb=613aea5685ad4c698386c374474d8853bb736503;p=perso%2FImmae%2FConfig%2FNix.git diff --git a/modules/webapps/mastodon.nix b/modules/webapps/mastodon.nix index ad6d0c3..df2dbb2 100644 --- a/modules/webapps/mastodon.nix +++ b/modules/webapps/mastodon.nix @@ -27,7 +27,7 @@ in ''; }; socketsPrefix = lib.mkOption { - type = lib.types.string; + type = lib.types.str; default = "live"; description = '' The prefix to use for Mastodon sockets. @@ -62,6 +62,26 @@ in ''; readOnly = true; }; + systemdStateDirectory = lib.mkOption { + type = lib.types.str; + # Use ReadWritePaths= instead if varDir is outside of /var/lib + default = assert lib.strings.hasPrefix "/var/lib/" cfg.dataDir; + lib.strings.removePrefix "/var/lib/" cfg.dataDir; + description = '' + Adjusted Mastodon data directory for systemd + ''; + readOnly = true; + }; + systemdRuntimeDirectory = lib.mkOption { + type = lib.types.str; + # Use ReadWritePaths= instead if socketsDir is outside of /run + default = assert lib.strings.hasPrefix "/run/" cfg.socketsDir; + lib.strings.removePrefix "/run/" cfg.socketsDir; + description = '' + Adjusted Mastodon sockets directory for systemd + ''; + readOnly = true; + }; sockets = lib.mkOption { type = lib.types.attrsOf lib.types.path; default = { @@ -76,18 +96,24 @@ in }; config = lib.mkIf cfg.enable { - users.users = lib.optionalAttrs (cfg.user == name) (lib.singleton { - inherit name; - inherit uid; - group = cfg.group; - description = "Mastodon user"; - home = cfg.dataDir; - useDefaultShell = true; - }); - users.groups = lib.optionalAttrs (cfg.group == name) (lib.singleton { - inherit name; - inherit gid; - }); + users.users = lib.optionalAttrs (cfg.user == name) { + "${name}" = { + inherit uid; + group = cfg.group; + description = "Mastodon user"; + home = cfg.dataDir; + useDefaultShell = true; + }; + }; + users.groups = lib.optionalAttrs (cfg.group == name) { + "${name}" = { + inherit gid; + }; + }; + + systemd.slices.mastodon = { + description = "Mastodon slice"; + }; systemd.services.mastodon-streaming = { description = "Mastodon Streaming"; @@ -115,6 +141,7 @@ in ''; serviceConfig = { + Slice = "mastodon.slice"; User = cfg.user; EnvironmentFile = cfg.configFile; PrivateTmp = true; @@ -122,6 +149,9 @@ in TimeoutSec = 15; Type = "simple"; WorkingDirectory = cfg.workdir; + StateDirectory = cfg.systemdStateDirectory; + RuntimeDirectory = cfg.systemdRuntimeDirectory; + RuntimeDirectoryPreserve = "yes"; }; unitConfig.RequiresMountsFor = cfg.dataDir; @@ -137,9 +167,10 @@ in environment.BUNDLE_GEMFILE = "${cfg.workdir.gems.confFiles}/Gemfile"; environment.SOCKET = cfg.sockets.rails; - path = [ cfg.workdir.gems cfg.workdir.gems.ruby pkgs.file ]; + path = [ cfg.workdir.gems cfg.workdir.gems.ruby pkgs.file pkgs.imagemagick ]; preStart = '' + install -m 0755 -d ${cfg.dataDir}/tmp/cache ./bin/bundle exec rails db:migrate ''; @@ -147,7 +178,11 @@ in exec ./bin/bundle exec puma -C config/puma.rb ''; + postStart = '' + exec ./bin/tootctl cache clear + ''; serviceConfig = { + Slice = "mastodon.slice"; User = cfg.user; EnvironmentFile = cfg.configFile; PrivateTmp = true; @@ -155,6 +190,39 @@ in TimeoutSec = 60; Type = "simple"; WorkingDirectory = cfg.workdir; + StateDirectory = cfg.systemdStateDirectory; + RuntimeDirectory = cfg.systemdRuntimeDirectory; + RuntimeDirectoryPreserve = "yes"; + }; + + unitConfig.RequiresMountsFor = cfg.dataDir; + }; + + systemd.services.mastodon-cleanup = { + description = "Cleanup mastodon"; + startAt = "daily"; + restartIfChanged = false; + + environment.RAILS_ENV = "production"; + environment.BUNDLE_PATH = "${cfg.workdir.gems}/${cfg.workdir.gems.ruby.gemPath}"; + environment.BUNDLE_GEMFILE = "${cfg.workdir.gems.confFiles}/Gemfile"; + environment.SOCKET = cfg.sockets.rails; + + path = [ cfg.workdir.gems cfg.workdir.gems.ruby pkgs.file ]; + + script = '' + exec ./bin/tootctl media remove --days 30 + ''; + + serviceConfig = { + User = cfg.user; + EnvironmentFile = cfg.configFile; + PrivateTmp = true; + Type = "oneshot"; + WorkingDirectory = cfg.workdir; + StateDirectory = cfg.systemdStateDirectory; + RuntimeDirectory = cfg.systemdRuntimeDirectory; + RuntimeDirectoryPreserve = "yes"; }; unitConfig.RequiresMountsFor = cfg.dataDir; @@ -177,6 +245,7 @@ in ''; serviceConfig = { + Slice = "mastodon.slice"; User = cfg.user; EnvironmentFile = cfg.configFile; PrivateTmp = true; @@ -184,18 +253,13 @@ in TimeoutSec = 15; Type = "simple"; WorkingDirectory = cfg.workdir; + StateDirectory = cfg.systemdStateDirectory; + RuntimeDirectory = cfg.systemdRuntimeDirectory; + RuntimeDirectoryPreserve = "yes"; }; unitConfig.RequiresMountsFor = cfg.dataDir; }; - system.activationScripts.mastodon = { - deps = [ "users" ]; - text = '' - install -m 0755 -o ${cfg.user} -g ${cfg.group} -d ${cfg.socketsDir} - install -m 0755 -o ${cfg.user} -g ${cfg.group} -d ${cfg.dataDir} ${cfg.dataDir}/tmp/cache - ''; - }; - }; }