forked from mirrors_public/oddlama_nix-config
feat: enable OIDC in paperless
This commit is contained in:
parent
605aee0a67
commit
6c9042b4d2
6 changed files with 77 additions and 39 deletions
|
@ -2,6 +2,7 @@
|
||||||
config,
|
config,
|
||||||
lib,
|
lib,
|
||||||
nodes,
|
nodes,
|
||||||
|
pkgs,
|
||||||
...
|
...
|
||||||
}: let
|
}: let
|
||||||
sentinelCfg = nodes.sentinel.config;
|
sentinelCfg = nodes.sentinel.config;
|
||||||
|
@ -47,6 +48,13 @@ in {
|
||||||
group = "paperless";
|
group = "paperless";
|
||||||
};
|
};
|
||||||
|
|
||||||
|
# Mirror the original oauth2 secret
|
||||||
|
age.secrets.paperless-oauth2-client-secret = {
|
||||||
|
inherit (nodes.ward-kanidm.config.age.secrets.kanidm-oauth2-paperless) rekeyFile;
|
||||||
|
mode = "440";
|
||||||
|
group = "paperless";
|
||||||
|
};
|
||||||
|
|
||||||
environment.persistence."/persist".directories = [
|
environment.persistence."/persist".directories = [
|
||||||
{
|
{
|
||||||
directory = "/var/lib/paperless";
|
directory = "/var/lib/paperless";
|
||||||
|
@ -56,11 +64,6 @@ in {
|
||||||
}
|
}
|
||||||
];
|
];
|
||||||
|
|
||||||
# TODO: workaround for https://github.com/paperless-ngx/paperless-ngx/discussions/5606
|
|
||||||
systemd.services.paperless-web.script = lib.mkBefore ''
|
|
||||||
mkdir -p /tmp/paperless
|
|
||||||
'';
|
|
||||||
|
|
||||||
services.paperless = {
|
services.paperless = {
|
||||||
enable = true;
|
enable = true;
|
||||||
address = "0.0.0.0";
|
address = "0.0.0.0";
|
||||||
|
@ -73,6 +76,24 @@ in {
|
||||||
PAPERLESS_CORS_ALLOWED_HOSTS = "https://${paperlessDomain}";
|
PAPERLESS_CORS_ALLOWED_HOSTS = "https://${paperlessDomain}";
|
||||||
PAPERLESS_TRUSTED_PROXIES = sentinelCfg.meta.wireguard.proxy-sentinel.ipv4;
|
PAPERLESS_TRUSTED_PROXIES = sentinelCfg.meta.wireguard.proxy-sentinel.ipv4;
|
||||||
|
|
||||||
|
# Authentication via kanidm
|
||||||
|
PAPERLESS_APPS = "allauth.socialaccount.providers.openid_connect";
|
||||||
|
PAPERLESS_SOCIALACCOUNT_PROVIDERS = builtins.toJSON {
|
||||||
|
openid_connect = {
|
||||||
|
OAUTH_PKCE_ENABLED = "True";
|
||||||
|
APPS = [
|
||||||
|
rec {
|
||||||
|
provider_id = "kanidm";
|
||||||
|
name = "Kanidm";
|
||||||
|
client_id = "paperless";
|
||||||
|
# secret will be added dynamically
|
||||||
|
#secret = "";
|
||||||
|
settings.server_url = "https://${sentinelCfg.networking.providedDomains.kanidm}/oauth2/openid/${client_id}/.well-known/openid-configuration";
|
||||||
|
}
|
||||||
|
];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
# Ghostscript is entirely bug-free.
|
# Ghostscript is entirely bug-free.
|
||||||
PAPERLESS_OCR_USER_ARGS = builtins.toJSON {
|
PAPERLESS_OCR_USER_ARGS = builtins.toJSON {
|
||||||
continue_on_soft_render_error = true;
|
continue_on_soft_render_error = true;
|
||||||
|
@ -109,6 +130,16 @@ in {
|
||||||
mode = "0700";
|
mode = "0700";
|
||||||
};
|
};
|
||||||
|
|
||||||
|
# Add secret to PAPERLESS_SOCIALACCOUNT_PROVIDERS
|
||||||
|
systemd.services.paperless-web.script = lib.mkBefore ''
|
||||||
|
oidcSecret=$(< ${config.age.secrets.paperless-oauth2-client-secret.path})
|
||||||
|
export PAPERLESS_SOCIALACCOUNT_PROVIDERS=$(
|
||||||
|
${pkgs.jq}/bin/jq <<< "$PAPERLESS_SOCIALACCOUNT_PROVIDERS" \
|
||||||
|
--compact-output \
|
||||||
|
--arg oidcSecret "$oidcSecret" '.openid_connect.APPS.[0].secret = $oidcSecret'
|
||||||
|
)
|
||||||
|
'';
|
||||||
|
|
||||||
systemd.services.paperless-backup = let
|
systemd.services.paperless-backup = let
|
||||||
cfg = config.systemd.services.paperless-consumer;
|
cfg = config.systemd.services.paperless-consumer;
|
||||||
in {
|
in {
|
||||||
|
|
|
@ -7,6 +7,12 @@
|
||||||
sentinelCfg = nodes.sentinel.config;
|
sentinelCfg = nodes.sentinel.config;
|
||||||
kanidmDomain = "auth.${domains.me}";
|
kanidmDomain = "auth.${domains.me}";
|
||||||
kanidmPort = 8300;
|
kanidmPort = 8300;
|
||||||
|
|
||||||
|
mkRandomSecret = {
|
||||||
|
generator.script = "alnum";
|
||||||
|
mode = "440";
|
||||||
|
group = "kanidm";
|
||||||
|
};
|
||||||
in {
|
in {
|
||||||
meta.wireguard-proxy.sentinel.allowedTCPPorts = [kanidmPort];
|
meta.wireguard-proxy.sentinel.allowedTCPPorts = [kanidmPort];
|
||||||
|
|
||||||
|
@ -22,41 +28,14 @@ in {
|
||||||
group = "kanidm";
|
group = "kanidm";
|
||||||
};
|
};
|
||||||
|
|
||||||
age.secrets.kanidm-admin-password = {
|
age.secrets.kanidm-admin-password = mkRandomSecret;
|
||||||
generator.script = "alnum";
|
age.secrets.kanidm-idm-admin-password = mkRandomSecret;
|
||||||
mode = "440";
|
|
||||||
group = "kanidm";
|
|
||||||
};
|
|
||||||
|
|
||||||
age.secrets.kanidm-idm-admin-password = {
|
age.secrets.kanidm-oauth2-forgejo = mkRandomSecret;
|
||||||
generator.script = "alnum";
|
age.secrets.kanidm-oauth2-grafana = mkRandomSecret;
|
||||||
mode = "440";
|
age.secrets.kanidm-oauth2-immich = mkRandomSecret;
|
||||||
group = "kanidm";
|
age.secrets.kanidm-oauth2-paperless = mkRandomSecret;
|
||||||
};
|
age.secrets.kanidm-oauth2-web-sentinel = mkRandomSecret;
|
||||||
|
|
||||||
age.secrets.kanidm-oauth2-immich = {
|
|
||||||
generator.script = "alnum";
|
|
||||||
mode = "440";
|
|
||||||
group = "kanidm";
|
|
||||||
};
|
|
||||||
|
|
||||||
age.secrets.kanidm-oauth2-grafana = {
|
|
||||||
generator.script = "alnum";
|
|
||||||
mode = "440";
|
|
||||||
group = "kanidm";
|
|
||||||
};
|
|
||||||
|
|
||||||
age.secrets.kanidm-oauth2-forgejo = {
|
|
||||||
generator.script = "alnum";
|
|
||||||
mode = "440";
|
|
||||||
group = "kanidm";
|
|
||||||
};
|
|
||||||
|
|
||||||
age.secrets.kanidm-oauth2-web-sentinel = {
|
|
||||||
generator.script = "alnum";
|
|
||||||
mode = "440";
|
|
||||||
group = "kanidm";
|
|
||||||
};
|
|
||||||
|
|
||||||
nodes.sentinel = {
|
nodes.sentinel = {
|
||||||
networking.providedDomains.kanidm = kanidmDomain;
|
networking.providedDomains.kanidm = kanidmDomain;
|
||||||
|
@ -130,6 +109,16 @@ in {
|
||||||
scopeMaps."immich.access" = ["openid" "email" "profile"];
|
scopeMaps."immich.access" = ["openid" "email" "profile"];
|
||||||
};
|
};
|
||||||
|
|
||||||
|
# Paperless
|
||||||
|
groups."paperless.access" = {};
|
||||||
|
systems.oauth2.paperless = {
|
||||||
|
displayName = "Paperless";
|
||||||
|
originUrl = "https://${sentinelCfg.networking.providedDomains.paperless}/";
|
||||||
|
basicSecretFile = config.age.secrets.kanidm-oauth2-paperless.path;
|
||||||
|
preferShortUsername = true;
|
||||||
|
scopeMaps."paperless.access" = ["openid" "email" "profile"];
|
||||||
|
};
|
||||||
|
|
||||||
# Grafana
|
# Grafana
|
||||||
groups."grafana.access" = {};
|
groups."grafana.access" = {};
|
||||||
groups."grafana.editors" = {};
|
groups."grafana.editors" = {};
|
||||||
|
|
11
secrets/generated/ward-kanidm/kanidm-oauth2-paperless.age
Normal file
11
secrets/generated/ward-kanidm/kanidm-oauth2-paperless.age
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
age-encryption.org/v1
|
||||||
|
-> X25519 hzkY1fcGtdk9GFrYskb/0fFAAgD4hAwtyd23quaPCD8
|
||||||
|
akEojVvE36WwAGv9aZFWZLbBvhIeZjOaSncWtVfwAn4
|
||||||
|
-> piv-p256 xqSe8Q A2icKgRBVKO9BjUUSNDLds1Eq+DL1+wfLy0r4U1Q8YNP
|
||||||
|
630Lq8Y4XgZcDFGa4deEHGXTE3qkxPHgev7i4mKtM+o
|
||||||
|
-> dI-grease _8iXML(
|
||||||
|
22JTt6b8FjyMsaFuddGHWGgurfZBbpMTUhIHzTn7RC9/RxQblyAWinMlZjcDyGAP
|
||||||
|
+wQYeeqG0aIyFgasJLMuu1IRBQaEmRKVTiGRgh7Sm5FHnF0u6aAu0pj/iOX2xbw
|
||||||
|
--- 04iwf902sMdNHLYmynps8wNLhwrYNoK0w99KdPz7SO0
|
||||||
|
º¼Ãyež€=$¿qÄuÕ°M·/ùú\�àâƒûû}Žu4ÔÈšj¿YŸ…Tõo,_µ
lOí fS24�•Ãþù¬SÁ
|
||||||
|
T;7—pÍ{6²š
|
Binary file not shown.
|
@ -0,0 +1,7 @@
|
||||||
|
age-encryption.org/v1
|
||||||
|
-> ssh-ed25519 vqFVQw q5QZqkI20/kI0xMQ3sRewA122Cm13qfE0LhuFr9K6g8
|
||||||
|
0qWz+XFjeyiNnGlAfffoL/iZdwS9NzXOYyl7FmUY2hI
|
||||||
|
-> 2FQ(N@-grease
|
||||||
|
|
||||||
|
--- AVDxWkWApQ6FCrAwGvzg9u3RklcWZeQFg2iqqqeNQ2E
|
||||||
|
Ê^Ç|´^ „²1»D¼ä©"®Zм/Ç`JàÛ¯ãã€òu'ñPv‘ÎU,)Ew¤\§ä¾ä¼gó‹‚ÈdAþ/ Má€X@2›
|
Binary file not shown.
Loading…
Add table
Add a link
Reference in a new issue