<?xml version="1.0" encoding="UTF-8"?><rss xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title>skowalak.de</title><link>https://skowalak.de</link><description>Sebastian Kowalak</description><generator>Zola</generator><language>en</language><atom:link href="https://skowalak.de/rss.xml" rel="self" type="application/rss+xml"/><lastBuildDate>Tue, 11 Aug 2026 00:00:00 +0000</lastBuildDate><item><title>Connect Paperless-ngx to Kanidm (with NixOS)</title><pubDate>Tue, 11 Aug 2026 00:00:00 +0000</pubDate><author>Unknown</author><link>https://skowalak.de/blog/paperless-kanidm/</link><guid>https://skowalak.de/blog/paperless-kanidm/</guid><description xml:base="https://skowalak.de/blog/paperless-kanidm/">&lt;p&gt;Running an OpenID-Connect Provider like Kanidm has many advantages, of of them
being able to configure it as Single-Sign-On (SSO) for apps that would
otherwise require you to have a different set of credentials for each
app/account.&lt;/p&gt;
&lt;p&gt;I have a working Paperless-ngx running holding about a thousand documents, and
it has been great so far. But SSO has always been something that was missing
yet. So when I got myself a Kanidm I set out to change that.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Kanidm&lt;/strong&gt; &lt;code&gt;1.10.4&lt;/code&gt; running at &lt;code&gt;https://idm.skowalak.de&lt;/code&gt;&lt;br&gt;
&lt;strong&gt;Paperless-ngx&lt;/strong&gt; &lt;code&gt;v2.20.15&lt;/code&gt; running at &lt;code&gt;https://paperless.skowalak.de&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;This is the basic config I had before starting (simplified for brevity):&lt;/p&gt;
&lt;pre class="giallo" style="color: #0E1116; background-color: #FFFFFF;"&gt;&lt;code data-lang="nix" data-name="paperless.nix"&gt;&lt;span class="giallo-l"&gt;&lt;span aria-hidden="true" class="giallo-ln" style="color: #88929D;"&gt; 1&lt;/span&gt;&lt;span&gt;{ config&lt;/span&gt;&lt;span style="color: #A0111F;"&gt;, ...&lt;/span&gt;&lt;span&gt; }:&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span aria-hidden="true" class="giallo-ln" style="color: #88929D;"&gt; 2&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span aria-hidden="true" class="giallo-ln" style="color: #88929D;"&gt; 3&lt;/span&gt;&lt;span style="color: #023B95;"&gt; sops&lt;/span&gt;&lt;span style="color: #A0111F;"&gt; =&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span aria-hidden="true" class="giallo-ln" style="color: #88929D;"&gt; 4&lt;/span&gt;&lt;span style="color: #023B95;"&gt; secrets&lt;/span&gt;&lt;span style="color: #A0111F;"&gt; =&lt;/span&gt;&lt;span&gt; { };&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span aria-hidden="true" class="giallo-ln" style="color: #88929D;"&gt; 5&lt;/span&gt;&lt;span style="color: #023B95;"&gt; templates&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span style="color: #032563;"&gt;&amp;quot;paperless.env&amp;quot;&lt;/span&gt;&lt;span style="color: #A0111F;"&gt; =&lt;/span&gt;&lt;span&gt; { };&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span aria-hidden="true" class="giallo-ln" style="color: #88929D;"&gt; 6&lt;/span&gt;&lt;span&gt; };&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span aria-hidden="true" class="giallo-ln" style="color: #88929D;"&gt; 7&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span aria-hidden="true" class="giallo-ln" style="color: #88929D;"&gt; 8&lt;/span&gt;&lt;span style="color: #023B95;"&gt; services&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span style="color: #023B95;"&gt;nginx&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span style="color: #023B95;"&gt;virtualHosts&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span style="color: #032563;"&gt;&amp;quot;paperless.skowalak.de&amp;quot;&lt;/span&gt;&lt;span style="color: #A0111F;"&gt; =&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span aria-hidden="true" class="giallo-ln" style="color: #88929D;"&gt; 9&lt;/span&gt;&lt;span style="color: #023B95;"&gt; forceSSL&lt;/span&gt;&lt;span style="color: #A0111F;"&gt; =&lt;/span&gt;&lt;span style="color: #023B95;"&gt; true&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span aria-hidden="true" class="giallo-ln" style="color: #88929D;"&gt;10&lt;/span&gt;&lt;span style="color: #023B95;"&gt; locations&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span style="color: #032563;"&gt;&amp;quot;/&amp;quot;&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span style="color: #023B95;"&gt;proxyPass&lt;/span&gt;&lt;span style="color: #A0111F;"&gt; =&lt;/span&gt;&lt;span style="color: #032563;"&gt; &amp;quot;http://localhost:28981&amp;quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span aria-hidden="true" class="giallo-ln" style="color: #88929D;"&gt;11&lt;/span&gt;&lt;span&gt; };&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span aria-hidden="true" class="giallo-ln" style="color: #88929D;"&gt;12&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span aria-hidden="true" class="giallo-ln" style="color: #88929D;"&gt;13&lt;/span&gt;&lt;span style="color: #023B95;"&gt; services&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span style="color: #023B95;"&gt;paperless&lt;/span&gt;&lt;span style="color: #A0111F;"&gt; =&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span aria-hidden="true" class="giallo-ln" style="color: #88929D;"&gt;14&lt;/span&gt;&lt;span style="color: #023B95;"&gt; enable&lt;/span&gt;&lt;span style="color: #A0111F;"&gt; =&lt;/span&gt;&lt;span style="color: #023B95;"&gt; true&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span aria-hidden="true" class="giallo-ln" style="color: #88929D;"&gt;15&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span aria-hidden="true" class="giallo-ln" style="color: #88929D;"&gt;16&lt;/span&gt;&lt;span style="color: #023B95;"&gt; settings&lt;/span&gt;&lt;span style="color: #A0111F;"&gt; =&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span aria-hidden="true" class="giallo-ln" style="color: #88929D;"&gt;17&lt;/span&gt;&lt;span style="color: #023B95;"&gt; PAPERLESS_URL&lt;/span&gt;&lt;span style="color: #A0111F;"&gt; =&lt;/span&gt;&lt;span style="color: #032563;"&gt; &amp;quot;https://paperless.skowalak.de&amp;quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span aria-hidden="true" class="giallo-ln" style="color: #88929D;"&gt;18&lt;/span&gt;&lt;span&gt; };&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span aria-hidden="true" class="giallo-ln" style="color: #88929D;"&gt;19&lt;/span&gt;&lt;span style="color: #023B95;"&gt; environmentFile&lt;/span&gt;&lt;span style="color: #A0111F;"&gt; =&lt;/span&gt;&lt;span style="color: #702C00;"&gt; config&lt;/span&gt;&lt;span style="color: #A0111F;"&gt;.&lt;/span&gt;&lt;span style="color: #702C00;"&gt;sops&lt;/span&gt;&lt;span style="color: #A0111F;"&gt;.&lt;/span&gt;&lt;span style="color: #702C00;"&gt;templates&lt;/span&gt;&lt;span style="color: #A0111F;"&gt;.&lt;/span&gt;&lt;span style="color: #032563;"&gt;&amp;quot;paperless.env&amp;quot;&lt;/span&gt;&lt;span style="color: #A0111F;"&gt;.&lt;/span&gt;&lt;span style="color: #702C00;"&gt;path&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span aria-hidden="true" class="giallo-ln" style="color: #88929D;"&gt;20&lt;/span&gt;&lt;span&gt; };&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span aria-hidden="true" class="giallo-ln" style="color: #88929D;"&gt;21&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="configure-kanidm"&gt;Configure Kanidm&lt;/h3&gt;
&lt;p&gt;I wanted to connect my Kanidm account &lt;code&gt;sebastian@idm.skowalak.de&lt;/code&gt; to my
Paperless-ngx account &lt;code&gt;sebastian&lt;/code&gt;. Both accounts did already exist. So on the
Kanidm side the following config was added by using the &lt;code&gt;kanidm&lt;/code&gt; cli:&lt;/p&gt;
&lt;pre class="giallo" style="color: #0E1116; background-color: #FFFFFF;"&gt;&lt;code data-lang="shellscript"&gt;&lt;span class="giallo-l"&gt;&lt;span style="color: #702C00;"&gt;kanidm&lt;/span&gt;&lt;span style="color: #032563;"&gt; group create paperless_users&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span style="color: #66707B;"&gt;# Successfully created group &amp;#39;paperless_users&amp;#39;&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span style="color: #702C00;"&gt;kanidm&lt;/span&gt;&lt;span style="color: #032563;"&gt; group add-members paperless_users sebastian&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span style="color: #66707B;"&gt;# Successfully added [&amp;quot;sebastian&amp;quot;] to group &amp;quot;paperless_users&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span style="color: #702C00;"&gt;kanidm&lt;/span&gt;&lt;span style="color: #032563;"&gt; system oauth2 create paperless &amp;#39;Paperless-ngx&amp;#39; &amp;#39;https://paperless.skowalak.de&amp;#39;&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span style="color: #66707B;"&gt;# Success&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span style="color: #702C00;"&gt;kanidm&lt;/span&gt;&lt;span style="color: #032563;"&gt; system oauth2 add-redirect-url paperless &amp;#39;https://paperless.skowalak.de/accounts/oidc/kanidm/login/callback/&amp;#39;&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span style="color: #66707B;"&gt;# Success&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span style="color: #702C00;"&gt;kanidm&lt;/span&gt;&lt;span style="color: #032563;"&gt; system oauth2 update-scope-map paperless paperless_users openid profile email&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span style="color: #66707B;"&gt;# Success&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span style="color: #702C00;"&gt;kanidm&lt;/span&gt;&lt;span style="color: #032563;"&gt; system oauth2 prefer-short-username paperless&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span style="color: #66707B;"&gt;# Success&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span style="color: #702C00;"&gt;kanidm&lt;/span&gt;&lt;span style="color: #032563;"&gt; system oauth2 show-basic-secret paperless&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span style="color: #66707B;"&gt;# &amp;lt;redacted&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;So far so uninteresting, only the second-to-last command is actually
interesting. By setting &lt;code&gt;prefer-short-username&lt;/code&gt; we tell Kanidm not to use the
full Security Principal Name (SPN), which in this case would be
&lt;code&gt;sebastian@idm.skowalak.de&lt;/code&gt; but instead use the short version without the
domain: &lt;code&gt;sebastian&lt;/code&gt;.&lt;/p&gt;
&lt;h3 id="configure-paperless"&gt;Configure Paperless&lt;/h3&gt;
&lt;p&gt;The OIDC client secret is added to sops-nix.&lt;/p&gt;
&lt;pre class="giallo" style="color: #0E1116; background-color: #FFFFFF;"&gt;&lt;code data-lang="yaml" data-name="secrets.yaml"&gt;&lt;span class="giallo-l"&gt;&lt;span aria-hidden="true" class="giallo-ln" style="color: #88929D;"&gt;1&lt;/span&gt;&lt;span style="color: #024C1A;"&gt;paperless&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span aria-hidden="true" class="giallo-ln" style="color: #88929D;"&gt;2&lt;/span&gt;&lt;span style="color: #024C1A;"&gt; kanidm_client_secret&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span style="color: #032563;"&gt; &amp;lt;redacted&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Then the Paperless-ngx config is amended. Paperless-ngx does OIDC through the
&lt;code&gt;openid_connect&lt;/code&gt; provider from &lt;code&gt;django-allauth&lt;/code&gt;.&lt;/p&gt;
&lt;pre class="giallo" style="color: #0E1116; background-color: #FFFFFF;"&gt;&lt;code data-lang="nix" data-name="paperless.nix"&gt;&lt;span class="giallo-l"&gt;&lt;span aria-hidden="true" class="giallo-ln" style="color: #88929D;"&gt; 1&lt;/span&gt;&lt;span&gt;{ config&lt;/span&gt;&lt;span style="color: #A0111F;"&gt;, ...&lt;/span&gt;&lt;span&gt; }:&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span aria-hidden="true" class="giallo-ln" style="color: #88929D;"&gt; 2&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span aria-hidden="true" class="giallo-ln" style="color: #88929D;"&gt; 3&lt;/span&gt;&lt;span style="color: #023B95;"&gt; sops&lt;/span&gt;&lt;span style="color: #A0111F;"&gt; =&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span aria-hidden="true" class="giallo-ln" style="color: #88929D;"&gt; 4&lt;/span&gt;&lt;span style="color: #023B95;"&gt; secrets&lt;/span&gt;&lt;span style="color: #A0111F;"&gt; =&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span aria-hidden="true" class="giallo-ln" style="color: #88929D;"&gt; 5&lt;/span&gt;&lt;span style="color: #032563;"&gt; &amp;quot;paperless/kanidm_client_secret&amp;quot;&lt;/span&gt;&lt;span style="color: #A0111F;"&gt; =&lt;/span&gt;&lt;span&gt; { };&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span aria-hidden="true" class="giallo-ln" style="color: #88929D;"&gt; 6&lt;/span&gt;&lt;span&gt; };&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span aria-hidden="true" class="giallo-ln" style="color: #88929D;"&gt; 7&lt;/span&gt;&lt;span style="color: #023B95;"&gt; templates&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span style="color: #032563;"&gt;&amp;quot;paperless.env&amp;quot;&lt;/span&gt;&lt;span style="color: #A0111F;"&gt; =&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span aria-hidden="true" class="giallo-ln" style="color: #88929D;"&gt; 8&lt;/span&gt;&lt;span style="color: #023B95;"&gt; content&lt;/span&gt;&lt;span style="color: #A0111F;"&gt; =&lt;/span&gt;&lt;span style="color: #032563;"&gt; &amp;#39;&amp;#39;&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span aria-hidden="true" class="giallo-ln" style="color: #88929D;"&gt; 9&lt;/span&gt;&lt;span style="color: #032563;"&gt; PAPERLESS_SOCIALACCOUNT_PROVIDERS=&amp;#39;{&amp;quot;openid_connect&amp;quot;:{&amp;quot;OAUTH_PKCE_ENABLED&amp;quot;:true,&amp;quot;APPS&amp;quot;:[{&amp;quot;provider_id&amp;quot;:&amp;quot;kanidm&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;Kanidm&amp;quot;,&amp;quot;client_id&amp;quot;:&amp;quot;paperless&amp;quot;,&amp;quot;secret&amp;quot;:&amp;quot;&lt;/span&gt;&lt;span style="color: #A0111F;"&gt;${&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span aria-hidden="true" class="giallo-ln" style="color: #88929D;"&gt;10&lt;/span&gt;&lt;span style="color: #023B95;"&gt; config&lt;/span&gt;&lt;span style="color: #A0111F;"&gt;.&lt;/span&gt;&lt;span style="color: #023B95;"&gt;sops&lt;/span&gt;&lt;span style="color: #A0111F;"&gt;.&lt;/span&gt;&lt;span style="color: #023B95;"&gt;placeholder&lt;/span&gt;&lt;span style="color: #A0111F;"&gt;.&lt;/span&gt;&lt;span style="color: #032563;"&gt;&amp;quot;paperless/kanidm_client_secret&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span aria-hidden="true" class="giallo-ln" style="color: #88929D;"&gt;11&lt;/span&gt;&lt;span style="color: #A0111F;"&gt; }&lt;/span&gt;&lt;span style="color: #032563;"&gt;&amp;quot;,&amp;quot;settings&amp;quot;:{&amp;quot;server_url&amp;quot;:&amp;quot;https://idm.skowalak.de/oauth2/openid/paperless/.well-known/openid-configuration&amp;quot;}}],&amp;quot;SCOPE&amp;quot;:[&amp;quot;openid&amp;quot;,&amp;quot;profile&amp;quot;,&amp;quot;email&amp;quot;]}}&amp;#39;&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span aria-hidden="true" class="giallo-ln" style="color: #88929D;"&gt;12&lt;/span&gt;&lt;span style="color: #032563;"&gt; &amp;#39;&amp;#39;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span aria-hidden="true" class="giallo-ln" style="color: #88929D;"&gt;13&lt;/span&gt;&lt;span style="color: #023B95;"&gt; owner&lt;/span&gt;&lt;span style="color: #A0111F;"&gt; =&lt;/span&gt;&lt;span style="color: #702C00;"&gt; config&lt;/span&gt;&lt;span style="color: #A0111F;"&gt;.&lt;/span&gt;&lt;span style="color: #702C00;"&gt;services&lt;/span&gt;&lt;span style="color: #A0111F;"&gt;.&lt;/span&gt;&lt;span style="color: #702C00;"&gt;paperless&lt;/span&gt;&lt;span style="color: #A0111F;"&gt;.&lt;/span&gt;&lt;span style="color: #702C00;"&gt;user&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span aria-hidden="true" class="giallo-ln" style="color: #88929D;"&gt;14&lt;/span&gt;&lt;span&gt; };&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span aria-hidden="true" class="giallo-ln" style="color: #88929D;"&gt;15&lt;/span&gt;&lt;span&gt; };&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span aria-hidden="true" class="giallo-ln" style="color: #88929D;"&gt;16&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span aria-hidden="true" class="giallo-ln" style="color: #88929D;"&gt;17&lt;/span&gt;&lt;span style="color: #66707B;"&gt; # omitted nginx config here, because nothing changed&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span aria-hidden="true" class="giallo-ln" style="color: #88929D;"&gt;18&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span aria-hidden="true" class="giallo-ln" style="color: #88929D;"&gt;19&lt;/span&gt;&lt;span style="color: #023B95;"&gt; services&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span style="color: #023B95;"&gt;paperless&lt;/span&gt;&lt;span style="color: #A0111F;"&gt; =&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span aria-hidden="true" class="giallo-ln" style="color: #88929D;"&gt;20&lt;/span&gt;&lt;span style="color: #023B95;"&gt; enable&lt;/span&gt;&lt;span style="color: #A0111F;"&gt; =&lt;/span&gt;&lt;span style="color: #023B95;"&gt; true&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span aria-hidden="true" class="giallo-ln" style="color: #88929D;"&gt;21&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span aria-hidden="true" class="giallo-ln" style="color: #88929D;"&gt;22&lt;/span&gt;&lt;span style="color: #023B95;"&gt; settings&lt;/span&gt;&lt;span style="color: #A0111F;"&gt; =&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span aria-hidden="true" class="giallo-ln" style="color: #88929D;"&gt;23&lt;/span&gt;&lt;span style="color: #023B95;"&gt; PAPERLESS_APPS&lt;/span&gt;&lt;span style="color: #A0111F;"&gt; =&lt;/span&gt;&lt;span style="color: #032563;"&gt; &amp;quot;allauth.socialaccount.providers.openid_connect&amp;quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span aria-hidden="true" class="giallo-ln" style="color: #88929D;"&gt;24&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span aria-hidden="true" class="giallo-ln" style="color: #88929D;"&gt;25&lt;/span&gt;&lt;span style="color: #66707B;"&gt; # Disable local self-registration but allow remote registration in&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span aria-hidden="true" class="giallo-ln" style="color: #88929D;"&gt;26&lt;/span&gt;&lt;span style="color: #66707B;"&gt; # Kanidm.&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span aria-hidden="true" class="giallo-ln" style="color: #88929D;"&gt;27&lt;/span&gt;&lt;span style="color: #023B95;"&gt; PAPERLESS_ACCOUNT_ALLOW_SIGNUPS&lt;/span&gt;&lt;span style="color: #A0111F;"&gt; =&lt;/span&gt;&lt;span style="color: #023B95;"&gt; false&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span aria-hidden="true" class="giallo-ln" style="color: #88929D;"&gt;28&lt;/span&gt;&lt;span style="color: #023B95;"&gt; PAPERLESS_SOCIALACCOUNT_ALLOW_SIGNUPS&lt;/span&gt;&lt;span style="color: #A0111F;"&gt; =&lt;/span&gt;&lt;span style="color: #023B95;"&gt; true&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span aria-hidden="true" class="giallo-ln" style="color: #88929D;"&gt;29&lt;/span&gt;&lt;span style="color: #023B95;"&gt; PAPERLESS_SOCIAL_ACCOUNT_DEFAULT_GROUPS&lt;/span&gt;&lt;span style="color: #A0111F;"&gt; =&lt;/span&gt;&lt;span style="color: #032563;"&gt; &amp;quot;users&amp;quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span aria-hidden="true" class="giallo-ln" style="color: #88929D;"&gt;30&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span aria-hidden="true" class="giallo-ln" style="color: #88929D;"&gt;31&lt;/span&gt;&lt;span style="color: #66707B;"&gt; # After everything is verified to work, these two switches can be turned&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span aria-hidden="true" class="giallo-ln" style="color: #88929D;"&gt;32&lt;/span&gt;&lt;span style="color: #66707B;"&gt; # on to hide the Paperless-ngx login screen and instead redirect to&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span aria-hidden="true" class="giallo-ln" style="color: #88929D;"&gt;33&lt;/span&gt;&lt;span style="color: #66707B;"&gt; # Kanidm directly.&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span aria-hidden="true" class="giallo-ln" style="color: #88929D;"&gt;34&lt;/span&gt;&lt;span style="color: #023B95;"&gt; PAPERLESS_REDIRECT_LOGIN_TO_SSO&lt;/span&gt;&lt;span style="color: #A0111F;"&gt; =&lt;/span&gt;&lt;span style="color: #023B95;"&gt; false&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span aria-hidden="true" class="giallo-ln" style="color: #88929D;"&gt;35&lt;/span&gt;&lt;span style="color: #023B95;"&gt; PAPERLESS_DISABLE_REGULAR_LOGIN&lt;/span&gt;&lt;span style="color: #A0111F;"&gt; =&lt;/span&gt;&lt;span style="color: #023B95;"&gt; false&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span aria-hidden="true" class="giallo-ln" style="color: #88929D;"&gt;36&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span aria-hidden="true" class="giallo-ln" style="color: #88929D;"&gt;37&lt;/span&gt;&lt;span style="color: #023B95;"&gt; PAPERLESS_URL&lt;/span&gt;&lt;span style="color: #A0111F;"&gt; =&lt;/span&gt;&lt;span style="color: #032563;"&gt; &amp;quot;https://paperless.skowalak.de&amp;quot;&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span aria-hidden="true" class="giallo-ln" style="color: #88929D;"&gt;38&lt;/span&gt;&lt;span&gt; };&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span aria-hidden="true" class="giallo-ln" style="color: #88929D;"&gt;39&lt;/span&gt;&lt;span style="color: #023B95;"&gt; environmentFile&lt;/span&gt;&lt;span style="color: #A0111F;"&gt; =&lt;/span&gt;&lt;span style="color: #702C00;"&gt; config&lt;/span&gt;&lt;span style="color: #A0111F;"&gt;.&lt;/span&gt;&lt;span style="color: #702C00;"&gt;sops&lt;/span&gt;&lt;span style="color: #A0111F;"&gt;.&lt;/span&gt;&lt;span style="color: #702C00;"&gt;templates&lt;/span&gt;&lt;span style="color: #A0111F;"&gt;.&lt;/span&gt;&lt;span style="color: #032563;"&gt;&amp;quot;paperless.env&amp;quot;&lt;/span&gt;&lt;span style="color: #A0111F;"&gt;.&lt;/span&gt;&lt;span style="color: #702C00;"&gt;path&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span aria-hidden="true" class="giallo-ln" style="color: #88929D;"&gt;40&lt;/span&gt;&lt;span&gt; };&lt;/span&gt;&lt;/span&gt;
&lt;span class="giallo-l"&gt;&lt;span aria-hidden="true" class="giallo-ln" style="color: #88929D;"&gt;41&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Finally, Paperless-ngx user accounts need to be linked to their Kanidm account
counterparts. This is done by logging into Paperless-ngx with old credentials,
goint into profile settings and clicking on &lt;em&gt;Kanidm&lt;/em&gt; under &lt;em&gt;Connect new social
account&lt;/em&gt;. After that, first party Paperless-ngx login can be disabled.&lt;/p&gt;</description></item></channel></rss>