2025-06-18 19:53:44 +03:00
|
|
|
{
|
|
|
|
config,
|
|
|
|
lib,
|
|
|
|
pkgs,
|
|
|
|
...
|
|
|
|
}:
|
2023-12-03 03:26:29 +04:00
|
|
|
let
|
2024-02-15 13:56:12 +04:00
|
|
|
cfg = config.selfprivacy.modules.pleroma;
|
2025-09-02 15:13:17 +03:00
|
|
|
sp = config.selfprivacy;
|
2023-12-03 03:26:29 +04:00
|
|
|
in
|
|
|
|
{
|
|
|
|
options.selfprivacy.modules.pleroma = {
|
2025-06-18 19:53:44 +03:00
|
|
|
enable =
|
|
|
|
(lib.mkOption {
|
|
|
|
default = false;
|
|
|
|
type = lib.types.bool;
|
|
|
|
description = "Enable";
|
|
|
|
})
|
|
|
|
// {
|
|
|
|
meta = {
|
|
|
|
type = "enable";
|
|
|
|
};
|
2024-12-18 15:40:15 +03:00
|
|
|
};
|
2025-06-18 19:53:44 +03:00
|
|
|
location =
|
|
|
|
(lib.mkOption {
|
|
|
|
type = lib.types.str;
|
|
|
|
description = "Location";
|
|
|
|
})
|
|
|
|
// {
|
|
|
|
meta = {
|
|
|
|
type = "location";
|
|
|
|
};
|
2024-12-18 15:40:15 +03:00
|
|
|
};
|
2025-06-18 19:53:44 +03:00
|
|
|
subdomain =
|
|
|
|
(lib.mkOption {
|
|
|
|
default = "social";
|
|
|
|
type = lib.types.strMatching "[A-Za-z0-9][A-Za-z0-9\-]{0,61}[A-Za-z0-9]";
|
|
|
|
description = "Subdomain";
|
|
|
|
})
|
|
|
|
// {
|
|
|
|
meta = {
|
|
|
|
widget = "subdomain";
|
|
|
|
type = "string";
|
|
|
|
regex = "[A-Za-z0-9][A-Za-z0-9\-]{0,61}[A-Za-z0-9]";
|
|
|
|
weight = 0;
|
|
|
|
};
|
2024-12-18 15:40:15 +03:00
|
|
|
};
|
2023-12-03 03:26:29 +04:00
|
|
|
};
|
2024-02-15 13:56:12 +04:00
|
|
|
config = lib.mkIf cfg.enable {
|
2023-12-03 03:26:29 +04:00
|
|
|
fileSystems = lib.mkIf sp.useBinds {
|
|
|
|
"/var/lib/pleroma" = {
|
2024-02-15 13:56:12 +04:00
|
|
|
device = "/volumes/${cfg.location}/pleroma";
|
2023-12-18 15:33:09 +04:00
|
|
|
options = [
|
|
|
|
"bind"
|
|
|
|
"x-systemd.required-by=pleroma-secrets.service"
|
|
|
|
"x-systemd.required-by=pleroma.service"
|
2023-12-22 18:07:14 +04:00
|
|
|
"x-systemd.before=pleroma.service"
|
|
|
|
"x-systemd.before=pleroma-secrets.service"
|
2023-12-18 15:33:09 +04:00
|
|
|
];
|
2023-12-03 03:26:29 +04:00
|
|
|
};
|
|
|
|
};
|
|
|
|
services = {
|
|
|
|
pleroma = {
|
|
|
|
enable = true;
|
|
|
|
user = "pleroma";
|
|
|
|
group = "pleroma";
|
|
|
|
configs = [
|
2025-06-18 19:53:44 +03:00
|
|
|
(builtins.replaceStrings [ "$DOMAIN" "$LUSER" ] [ sp.domain sp.username ] (
|
|
|
|
builtins.readFile ./config.exs.in
|
|
|
|
))
|
2023-12-03 03:26:29 +04:00
|
|
|
];
|
|
|
|
};
|
|
|
|
postgresql = {
|
|
|
|
initialScript = "/etc/setup.psql";
|
|
|
|
ensureDatabases = [
|
|
|
|
"pleroma"
|
|
|
|
];
|
|
|
|
ensureUsers = [
|
|
|
|
{
|
|
|
|
name = "pleroma";
|
2023-12-18 22:16:40 +04:00
|
|
|
ensureDBOwnership = true;
|
2023-12-03 03:26:29 +04:00
|
|
|
}
|
|
|
|
];
|
|
|
|
};
|
|
|
|
};
|
2023-12-03 10:37:37 +04:00
|
|
|
|
2023-12-03 03:26:29 +04:00
|
|
|
environment.etc."setup.psql".text = ''
|
|
|
|
\c pleroma;
|
|
|
|
--Extensions made by ecto.migrate that need superuser access
|
|
|
|
CREATE EXTENSION IF NOT EXISTS citext;
|
|
|
|
CREATE EXTENSION IF NOT EXISTS pg_trgm;
|
|
|
|
CREATE EXTENSION IF NOT EXISTS "uuid-ossp";
|
|
|
|
'';
|
|
|
|
users.users.pleroma = {
|
|
|
|
extraGroups = [ "postgres" ];
|
|
|
|
isNormalUser = false;
|
|
|
|
isSystemUser = true;
|
|
|
|
group = "pleroma";
|
|
|
|
};
|
2024-07-30 19:19:06 +03:00
|
|
|
systemd = {
|
|
|
|
services = {
|
|
|
|
pleroma-secrets = {
|
|
|
|
before = [ "pleroma.service" ];
|
|
|
|
requiredBy = [ "pleroma.service" ];
|
|
|
|
serviceConfig.Type = "oneshot";
|
2025-06-18 19:53:44 +03:00
|
|
|
path = with pkgs; [
|
|
|
|
coreutils
|
|
|
|
];
|
2024-07-30 19:19:06 +03:00
|
|
|
script = ''
|
|
|
|
set -o nounset
|
|
|
|
|
|
|
|
filecontents=$(cat <<- EOF
|
|
|
|
import Config
|
|
|
|
EOF
|
|
|
|
)
|
|
|
|
|
|
|
|
install -C -m 0700 -o pleroma -g pleroma -d /var/lib/pleroma
|
|
|
|
|
|
|
|
install -C -m 0600 -o pleroma -g pleroma -DT \
|
|
|
|
<(printf "%s" "$filecontents") ${secrets-exs}
|
|
|
|
'';
|
|
|
|
};
|
|
|
|
pleroma = {
|
|
|
|
# seems to be an upstream nixpkgs/nixos bug (missing hexdump)
|
|
|
|
path = [ pkgs.util-linux ];
|
|
|
|
serviceConfig.Slice = "pleroma.slice";
|
|
|
|
};
|
|
|
|
};
|
|
|
|
slices.pleroma = {
|
|
|
|
description = "Pleroma service slice";
|
|
|
|
};
|
|
|
|
};
|
2024-02-15 13:56:12 +04:00
|
|
|
services.nginx.virtualHosts."${cfg.subdomain}.${sp.domain}" = {
|
|
|
|
useACMEHost = sp.domain;
|
|
|
|
root = "/var/www/${cfg.subdomain}.${sp.domain}";
|
2023-12-19 01:07:05 +04:00
|
|
|
forceSSL = true;
|
|
|
|
extraConfig = ''
|
|
|
|
add_header Strict-Transport-Security $hsts_header;
|
|
|
|
#add_header Content-Security-Policy "script-src 'self'; object-src 'none'; base-uri 'none';" always;
|
|
|
|
add_header 'Referrer-Policy' 'origin-when-cross-origin';
|
|
|
|
add_header X-Frame-Options DENY;
|
|
|
|
add_header X-Content-Type-Options nosniff;
|
|
|
|
add_header X-XSS-Protection "1; mode=block";
|
|
|
|
proxy_cookie_path / "/; secure; HttpOnly; SameSite=strict";
|
|
|
|
'';
|
|
|
|
locations = {
|
|
|
|
"/" = {
|
|
|
|
proxyPass = "http://127.0.0.1:4000";
|
|
|
|
};
|
|
|
|
};
|
|
|
|
};
|
2023-12-03 03:26:29 +04:00
|
|
|
};
|
|
|
|
}
|