2022-11-26 11:10:35 +00:00
|
|
|
{ config, pkgs, inputs, lib, ... }:
|
|
|
|
let
|
|
|
|
domain = "peninsula.industries";
|
|
|
|
streamingPort = 55000;
|
|
|
|
webPort = 55001;
|
|
|
|
postgresPort = 5433;
|
|
|
|
path = "/var/lib/mastodon/";
|
|
|
|
mailgunSmtpSecretName = "mailgun-smtp-password";
|
|
|
|
mailgunSmtpPasswordPath = "/run/secrets/${mailgunSmtpSecretName}";
|
|
|
|
mastodonDbSecretName = "mastodon-db";
|
|
|
|
mastodonDbSecretPath = "/run/secrets/${mastodonDbSecretName}";
|
|
|
|
uid = 2049;
|
|
|
|
gid = 3049;
|
|
|
|
systemUserName = "mastodon";
|
|
|
|
systemGroupName = "mastodon";
|
2022-11-26 21:13:04 +00:00
|
|
|
users = {
|
|
|
|
users."${systemUserName}" = {
|
|
|
|
uid = uid;
|
|
|
|
isSystemUser = true;
|
|
|
|
isNormalUser = false;
|
|
|
|
group = systemGroupName;
|
|
|
|
};
|
|
|
|
groups."${systemGroupName}" = {
|
|
|
|
gid = gid;
|
|
|
|
members = [ "${systemUserName}" "nginx" ];
|
|
|
|
};
|
|
|
|
};
|
2022-11-26 21:54:48 +00:00
|
|
|
secretSettings = {
|
|
|
|
owner = systemUserName;
|
|
|
|
group = systemGroupName;
|
|
|
|
};
|
|
|
|
publicPath = "${path}/public-system/";
|
2022-11-26 21:13:04 +00:00
|
|
|
package =
|
|
|
|
inputs.nixpkgs-nixos-unstable.legacyPackages."${pkgs.system}".mastodon;
|
2022-11-26 11:10:35 +00:00
|
|
|
in {
|
|
|
|
imports = [ ../nginx.nix ];
|
|
|
|
|
|
|
|
services.nginx = {
|
|
|
|
virtualHosts = {
|
|
|
|
"${domain}" = {
|
|
|
|
forceSSL = true;
|
|
|
|
enableACME = true;
|
2022-11-26 21:13:04 +00:00
|
|
|
root = "${package}/public/";
|
2022-11-26 11:10:35 +00:00
|
|
|
|
|
|
|
locations."/" = { tryFiles = "$uri @proxy"; };
|
2022-11-26 21:54:48 +00:00
|
|
|
locations."/system/".alias = "${publicPath}";
|
2022-11-26 11:10:35 +00:00
|
|
|
|
|
|
|
locations."@proxy" = {
|
2022-11-26 21:13:04 +00:00
|
|
|
proxyPass = "http://127.0.0.1:" + toString webPort;
|
2022-11-26 11:10:35 +00:00
|
|
|
proxyWebsockets = true;
|
|
|
|
};
|
|
|
|
locations."/api/v1/streaming/" = {
|
2022-11-26 21:13:04 +00:00
|
|
|
proxyPass = "http://127.0.0.1:" + toString streamingPort;
|
2022-11-26 11:10:35 +00:00
|
|
|
proxyWebsockets = true;
|
|
|
|
};
|
|
|
|
};
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
sops.secrets."${mailgunSmtpSecretName}" = {
|
|
|
|
sopsFile = ./mailgun.sops.yaml;
|
|
|
|
path = mailgunSmtpPasswordPath;
|
2022-11-26 21:54:48 +00:00
|
|
|
} // secretSettings;
|
2022-11-26 11:10:35 +00:00
|
|
|
sops.secrets."${mastodonDbSecretName}" = {
|
|
|
|
sopsFile = ./mastodon-db.sops.yaml;
|
|
|
|
path = mastodonDbSecretPath;
|
2022-11-26 21:54:48 +00:00
|
|
|
} // secretSettings;
|
2022-11-26 21:13:04 +00:00
|
|
|
|
|
|
|
inherit users;
|
|
|
|
|
2022-11-26 21:54:48 +00:00
|
|
|
systemd.services.mastodon-make-path = {
|
|
|
|
script = ''
|
|
|
|
mkdir -p ${path}
|
|
|
|
chown -R ${systemUserName}:${systemGroupName} ${path}
|
|
|
|
mkdir -p ${publicPath}
|
|
|
|
chmod -R o-rwx ${publicPath}
|
|
|
|
chmod -R g-rwx ${publicPath}
|
|
|
|
chmod -R g+X ${publicPath}
|
|
|
|
chmod -R g+r ${publicPath}
|
|
|
|
'';
|
|
|
|
serviceConfig = {
|
|
|
|
Type = "oneshot";
|
|
|
|
ProtectSystem = "strict";
|
|
|
|
ReadWritePaths = path;
|
|
|
|
};
|
|
|
|
before = [ "container@mastodon.service" ];
|
|
|
|
};
|
|
|
|
|
2022-11-26 11:10:35 +00:00
|
|
|
containers.mastodon = {
|
|
|
|
autoStart = true;
|
|
|
|
forwardPorts = [
|
|
|
|
{
|
|
|
|
containerPort = streamingPort;
|
|
|
|
hostPort = streamingPort;
|
|
|
|
}
|
|
|
|
{
|
|
|
|
containerPort = webPort;
|
|
|
|
hostPort = webPort;
|
|
|
|
}
|
|
|
|
];
|
|
|
|
bindMounts = {
|
|
|
|
"${path}" = {
|
|
|
|
hostPath = "${path}";
|
|
|
|
isReadOnly = false;
|
|
|
|
};
|
|
|
|
"${mailgunSmtpPasswordPath}" = {
|
|
|
|
hostPath = "${mailgunSmtpPasswordPath}";
|
|
|
|
isReadOnly = true;
|
|
|
|
};
|
|
|
|
"${mastodonDbSecretPath}" = {
|
|
|
|
hostPath = "${mastodonDbSecretPath}";
|
|
|
|
isReadOnly = true;
|
|
|
|
};
|
|
|
|
};
|
|
|
|
config = { config, pkgs, lib, ... }: {
|
|
|
|
system.stateVersion = "22.05";
|
|
|
|
services.postgresql.port = postgresPort;
|
2022-11-26 21:13:04 +00:00
|
|
|
users = users // {
|
|
|
|
mutableUsers = false;
|
|
|
|
allowNoPasswordLogin = true;
|
2022-11-26 11:10:35 +00:00
|
|
|
};
|
|
|
|
services.mastodon = {
|
|
|
|
enable = true;
|
2022-11-26 21:13:04 +00:00
|
|
|
inherit package;
|
2022-11-26 11:10:35 +00:00
|
|
|
localDomain = "${domain}";
|
|
|
|
user = systemUserName;
|
|
|
|
group = systemGroupName;
|
|
|
|
smtp = {
|
|
|
|
host = "smtp.eu.mailgun.org";
|
|
|
|
port = 465;
|
|
|
|
authenticate = true;
|
|
|
|
user = "postmaster@${domain}";
|
|
|
|
fromAddress = "Peninsula Industries Mastodon <mastodon@${domain}>";
|
|
|
|
createLocally = false;
|
|
|
|
passwordFile = "${mailgunSmtpPasswordPath}";
|
|
|
|
};
|
|
|
|
extraConfig = {
|
|
|
|
SMTP_TLS = "true";
|
|
|
|
SMTP_ENABLE_STARTTLS_AUTO = "true";
|
2022-11-26 13:26:12 +00:00
|
|
|
SINGLE_USER_MODE = "true";
|
2022-11-26 21:13:04 +00:00
|
|
|
RAILS_SERVE_STATIC_FILES = "true";
|
2022-11-26 11:10:35 +00:00
|
|
|
};
|
|
|
|
inherit streamingPort;
|
|
|
|
inherit webPort;
|
|
|
|
configureNginx = false;
|
|
|
|
enableUnixSocket = false;
|
|
|
|
database = {
|
|
|
|
port = postgresPort;
|
|
|
|
passwordFile = mastodonDbSecretPath;
|
|
|
|
};
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
};
|
|
|
|
}
|