+3
-5
hosts/marvin/default.nix
+3
-5
hosts/marvin/default.nix
···
8
8
./hardware.nix
9
9
10
10
# Running Services
11
+
# keep-sorted start
11
12
./services/anubis.nix
12
-
# ./services/authentik.nix
13
13
./services/avahi.nix
14
14
./services/bots.nix
15
15
./services/deemix.nix
···
17
17
./services/git.nix
18
18
./services/golink.nix
19
19
./services/grafana.nix
20
-
# ./services/iceshrimp.nix
21
20
./services/jellyfin.nix
22
21
./services/matrix.nix
23
22
./services/miniflux.nix
24
-
./services/nginx.nix
25
23
./services/nextcloud
24
+
./services/nginx.nix
26
25
./services/pinchflat.nix
27
-
./services/pingvin-share.nix
28
26
./services/planka.nix
29
27
./services/pocket-id.nix
30
28
./services/podman.nix
31
29
./services/postgres.nix
32
30
./services/prometheus.nix
33
-
# ./services/redlib.nix
34
31
./services/scrutiny.nix
35
32
./services/syncthing.nix
36
33
./services/tailscale.nix
37
34
./services/tangled.nix
38
35
./services/vaultwarden.nix
39
36
./services/zfs.nix
37
+
# keep-sorted end
40
38
];
41
39
nix.settings.max-jobs = 12;
42
40
networking = {
-92
hosts/marvin/services/authentik.nix
-92
hosts/marvin/services/authentik.nix
···
1
-
{
2
-
config,
3
-
self,
4
-
...
5
-
}:
6
-
let
7
-
d = self.lib.data.services.authentik;
8
-
in
9
-
{
10
-
virtualisation.oci-containers.containers =
11
-
let
12
-
authentikVersion = "2025.4";
13
-
base = {
14
-
environmentFiles = [ config.age.secrets.authentik-env.path ];
15
-
extraOptions = [ "--network=authentik" ];
16
-
};
17
-
authentikBase = base // {
18
-
image = "ghcr.io/goauthentik/server:${authentikVersion}";
19
-
environment = {
20
-
AUTHENTIK_REDIS__HOST = "authentik-redict";
21
-
22
-
# Postgres Settings
23
-
AUTHENTIK_POSTGRESQL__HOST = "authentik-db";
24
-
AUTHENTIK_POSTGRESQL__PORT = "5432";
25
-
AUTHENTIK_POSTGRESQL__USER = "authentik";
26
-
AUTHENTIK_POSTGRESQL__NAME = "authentik";
27
-
AUTHENTIK_POSTGRESQL__PASSWORD = "\${PG_PASS}";
28
-
29
-
# Disable error reporting
30
-
AUTHENTIK_ERROR_REPORTING__ENABLED = "false";
31
-
32
-
# Avatars are an attribute based on an uploaded file
33
-
AUTHENTIK_AVATARS = "attributes.user.avatar";
34
-
35
-
# Email Settings
36
-
AUTHENTIK_EMAIL__HOST = "mail.pyrox.dev";
37
-
AUTHENTIK_EMAIL__USERNAME = "auth@pyrox.dev";
38
-
AUTHENTIK_EMAIL__PORT = "465";
39
-
AUTHENTIK_EMAIL__USE_TLS = "true";
40
-
AUTHENTIK_EMAIL__FROM = "PyroServ Auth <auth@pyrox.dev>";
41
-
};
42
-
};
43
-
authentikVols = [
44
-
"/var/lib/authentik/media:/media"
45
-
"/var/lib/authentik/templates:/templates"
46
-
];
47
-
in
48
-
{
49
-
authentik-db = base // {
50
-
image = "postgres:17-alpine";
51
-
volumes = [ "/var/lib/authentik/db:/var/lib/postgresql/data" ];
52
-
environment = {
53
-
POSTGRES_PASSWORD = "\${PG_PASS}";
54
-
POSTGRES_USER = "authentik";
55
-
POSTGRES_DB = "authentik";
56
-
};
57
-
};
58
-
authentik-redict = {
59
-
image = "registry.redict.io/redict:alpine";
60
-
extraOptions = [ "--network=authentik" ];
61
-
};
62
-
authentik-server = authentikBase // {
63
-
cmd = [ "server" ];
64
-
ports = [
65
-
"${toString d.port}:9000"
66
-
"6943:9443"
67
-
"9301:9300"
68
-
];
69
-
volumes = authentikVols ++ [ "/var/lib/authentik/custom.css:/web/dist/custom.css" ];
70
-
};
71
-
authentik-worker = authentikBase // {
72
-
cmd = [ "worker" ];
73
-
volumes = authentikVols ++ [ "/var/lib/authentik/certs:/certs" ];
74
-
};
75
-
authentik-ldap = base // {
76
-
image = "ghcr.io/goauthentik/ldap:${authentikVersion}";
77
-
ports = [
78
-
"389:3389"
79
-
"636:6636"
80
-
];
81
-
environment = {
82
-
AUTHENTIK_HOST = "https://${d.extUrl}";
83
-
AUTHENTIK_INSECURE = "false";
84
-
};
85
-
};
86
-
};
87
-
age.secrets.authentik-env = {
88
-
file = ./secrets/authentik-env.age;
89
-
owner = "thehedgehog";
90
-
group = "misc";
91
-
};
92
-
}
-5
hosts/marvin/services/bookstack.nix
-5
hosts/marvin/services/bookstack.nix
-97
hosts/marvin/services/iceshrimp.nix
-97
hosts/marvin/services/iceshrimp.nix
···
1
-
{
2
-
config,
3
-
inputs,
4
-
pkgs,
5
-
lib,
6
-
self,
7
-
...
8
-
}:
9
-
let
10
-
11
-
d = self.lib.data.services.iceshrimp;
12
-
13
-
package = inputs.iceshrimp.packages.x86_64-linux.iceshrimp-pre.overrideAttrs rec {
14
-
version = "2023.12.8-pyrox1";
15
-
src = pkgs.fetchgit {
16
-
url = "https://iceshrimp.dev/pyrox/iceshrimp";
17
-
hash = "sha256-hxZ3rVVAiAMFAYhZ2o+WhlMuhjbt5EyHKOl1VyyL5RA=";
18
-
rev = "v${version}";
19
-
fetchLFS = true;
20
-
deepClone = false;
21
-
};
22
-
patches = [ ];
23
-
};
24
-
in
25
-
{
26
-
services.iceshrimp = {
27
-
inherit package;
28
-
enable = false;
29
-
secretConfig = config.age.secrets.iceshrimp-secret-config.path;
30
-
dbPasswordFile = config.age.secrets.iceshrimp-db-password.path;
31
-
createDb = true;
32
-
configureNginx.enable = false;
33
-
settings = {
34
-
inherit (d) port;
35
-
url = "https://${d.extUrl}";
36
-
accountDomain = "pyrox.dev";
37
-
redis.port = 6997;
38
-
maxNoteLength = 16384;
39
-
maxCaptionLength = 8192;
40
-
clusterLimit = 4;
41
-
deliverJobConcurrency = 192;
42
-
inboxJobConcurrency = 32;
43
-
deliverJobPerSec = 256;
44
-
inboxJobPerSec = 32;
45
-
outgoingAddressFamily = "dual";
46
-
# See the withdrawal patches for obliterate info
47
-
enableObliterate = true;
48
-
obliterateJobPerSec = 16;
49
-
obliterateJobMaxAttempts = 3;
50
-
mediaCleanup = {
51
-
cron = true;
52
-
maxAgeDays = 30;
53
-
cleanAvatars = true;
54
-
cleanHeaders = true;
55
-
};
56
-
htmlCache = {
57
-
ttl = "6h";
58
-
prewarm = true;
59
-
dbFallback = true;
60
-
};
61
-
wordMuteCache.ttl = "24h";
62
-
isManagedHosting = true;
63
-
email = {
64
-
managed = true;
65
-
address = "social@pyrox.dev";
66
-
host = "mail.pyrox.dev";
67
-
port = 465;
68
-
user = "social@pyrox.dev";
69
-
useImplicitSslTls = true;
70
-
};
71
-
objectStorage = {
72
-
managed = true;
73
-
baseUrl = "https://pool.jortage.com/socialpyroxdev";
74
-
bucket = "socialpyroxdev";
75
-
prefix = "mkmedia";
76
-
endpoint = "pool-api.jortage.com";
77
-
region = "jort";
78
-
useSsl = true;
79
-
connnectOverProxy = false;
80
-
setPublicReadOnUpload = false;
81
-
s3ForcePathStyle = true;
82
-
};
83
-
};
84
-
};
85
-
age.secrets = lib.mkIf config.services.iceshrimp.enable {
86
-
iceshrimp-secret-config = {
87
-
inherit (config.services.iceshrimp) group;
88
-
file = ./secrets/iceshrimp-secret-config.age;
89
-
owner = config.services.iceshrimp.user;
90
-
};
91
-
iceshrimp-db-password = {
92
-
file = ./secrets/iceshrimp-db-password.age;
93
-
owner = "postgres";
94
-
group = "postgres";
95
-
};
96
-
};
97
-
}
-11
hosts/marvin/services/minio.nix
-11
hosts/marvin/services/minio.nix
-5
hosts/marvin/services/prosody.nix
-5
hosts/marvin/services/prosody.nix
-12
hosts/marvin/services/redlib.nix
-12
hosts/marvin/services/redlib.nix
-23
hosts/marvin/services/webmentiond.nix
-23
hosts/marvin/services/webmentiond.nix
···
1
-
{ config, self, ... }:
2
-
let
3
-
d = self.lib.data.services.webmentiond;
4
-
p = toString d.port;
5
-
in
6
-
{
7
-
virtualisation.oci-containers.containers.webmentiond = {
8
-
image = "zerok/webmentiond:latest";
9
-
volumes = [ "/var/lib/webmentiond:/data" ];
10
-
environmentFiles = [ config.age.secrets.webmentiond-env.path ];
11
-
ports = [ "${p}:${p}" ];
12
-
cmd = [
13
-
"--addr 0.0.0.0:${p}"
14
-
"--public-url https://${d.extUrl}"
15
-
"--auth-admin-emails pyrox@pyrox.dev"
16
-
];
17
-
};
18
-
config.age.secrets = {
19
-
webmentiond-env.path = ./secrets/webmentiond-env.age;
20
-
owner = "thehedgehog";
21
-
group = "misc";
22
-
};
23
-
}