<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.wilsoz.com/index.php?action=history&amp;feed=atom&amp;title=Services%2FAudioBookshelf</id>
	<title>Services/AudioBookshelf - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.wilsoz.com/index.php?action=history&amp;feed=atom&amp;title=Services%2FAudioBookshelf"/>
	<link rel="alternate" type="text/html" href="https://wiki.wilsoz.com/index.php?title=Services/AudioBookshelf&amp;action=history"/>
	<updated>2026-07-06T07:05:45Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.43.9</generator>
	<entry>
		<id>https://wiki.wilsoz.com/index.php?title=Services/AudioBookshelf&amp;diff=13&amp;oldid=prev</id>
		<title>Wikibot: Migrated from services/AUDIOBOOKSHELF.md</title>
		<link rel="alternate" type="text/html" href="https://wiki.wilsoz.com/index.php?title=Services/AudioBookshelf&amp;diff=13&amp;oldid=prev"/>
		<updated>2026-07-05T18:16:20Z</updated>

		<summary type="html">&lt;p&gt;Migrated from services/AUDIOBOOKSHELF.md&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;&amp;#039;&amp;#039;As of: 2026-07-05 — migrated from `services/AUDIOBOOKSHELF.md`&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
= AudioBookshelf =&lt;br /&gt;
&lt;br /&gt;
== Service Info ==&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Type:&amp;#039;&amp;#039;&amp;#039; Native systemd (not Docker)&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Version:&amp;#039;&amp;#039;&amp;#039; 2.33.2&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Port:&amp;#039;&amp;#039;&amp;#039; 13378&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Public URL:&amp;#039;&amp;#039;&amp;#039; https://listen.wilsoz.com (proxied via VPS nginx → Tailscale → stronghold)&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Config:&amp;#039;&amp;#039;&amp;#039; &amp;lt;code&amp;gt;/etc/default/audiobookshelf&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Data:&amp;#039;&amp;#039;&amp;#039; &amp;lt;code&amp;gt;/usr/share/audiobookshelf/&amp;lt;/code&amp;gt; (config/, metadata/)&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;DB:&amp;#039;&amp;#039;&amp;#039; &amp;lt;code&amp;gt;/usr/share/audiobookshelf/config/absdatabase.sqlite&amp;lt;/code&amp;gt; (owned: audiobookshelf:audiobookshelf)&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Service user:&amp;#039;&amp;#039;&amp;#039; &amp;lt;code&amp;gt;audiobookshelf&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Backups:&amp;#039;&amp;#039;&amp;#039; &amp;lt;code&amp;gt;/raid1/Consolidated/AudioBookshelfBackup&amp;lt;/code&amp;gt;, nightly 1:30 AM, 7 kept&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
systemctl status audiobookshelf&lt;br /&gt;
systemctl restart audiobookshelf&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Authentik OIDC ==&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Provider:&amp;#039;&amp;#039;&amp;#039; pk 18, name: &amp;quot;AudioBookshelf OAuth&amp;quot;, slug: audiobookshelf&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Application slug:&amp;#039;&amp;#039;&amp;#039; audiobookshelf, URL: https://listen.wilsoz.com&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Client ID:&amp;#039;&amp;#039;&amp;#039; in OpenBao at &amp;lt;code&amp;gt;secret/audiobookshelf&amp;lt;/code&amp;gt; field &amp;lt;code&amp;gt;oidc-client-id&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Client Secret:&amp;#039;&amp;#039;&amp;#039; in OpenBao at &amp;lt;code&amp;gt;secret/audiobookshelf&amp;lt;/code&amp;gt; field &amp;lt;code&amp;gt;oidc-client-secret&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Match existing accounts by:&amp;#039;&amp;#039;&amp;#039; username&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Auto-register new users:&amp;#039;&amp;#039;&amp;#039; yes&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Auto-launch SSO:&amp;#039;&amp;#039;&amp;#039; no (local login still shown as fallback)&lt;br /&gt;
&lt;br /&gt;
=== Redirect URIs registered in Authentik ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
https://listen.wilsoz.com/auth/openid/callback&lt;br /&gt;
https://listen.wilsoz.com/audiobookshelf/auth/openid/callback&lt;br /&gt;
audiobookshelf://oauth&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== OIDC Endpoints (from Authentik discovery) ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
Issuer:    https://key.wilsoz.com/application/o/audiobookshelf/&lt;br /&gt;
Authorize: https://key.wilsoz.com/application/o/authorize/&lt;br /&gt;
Token:     https://key.wilsoz.com/application/o/token/&lt;br /&gt;
UserInfo:  https://key.wilsoz.com/application/o/userinfo/&lt;br /&gt;
JWKS:      https://key.wilsoz.com/application/o/audiobookshelf/jwks/&lt;br /&gt;
Logout:    https://key.wilsoz.com/application/o/audiobookshelf/end-session/&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Gotchas ==&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;OIDC config lives in SQLite, not a config file.&amp;#039;&amp;#039;&amp;#039; Settings are in the &amp;lt;code&amp;gt;settings&amp;lt;/code&amp;gt; table under key &amp;lt;code&amp;gt;server-settings&amp;lt;/code&amp;gt; as a JSON blob. ABS must be stopped before writing (owned by audiobookshelf user):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
systemctl stop audiobookshelf&lt;br /&gt;
sudo -u audiobookshelf sqlite3 /usr/share/audiobookshelf/config/absdatabase.sqlite \&lt;br /&gt;
  &amp;quot;SELECT value FROM settings WHERE key=&amp;#039;server-settings&amp;#039;;&amp;quot; | python3 -m json.tool&lt;br /&gt;
systemctl start audiobookshelf&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;&amp;lt;code&amp;gt;authOpenIDSubfolderForRedirectURLs&amp;lt;/code&amp;gt; must be set to &amp;lt;code&amp;gt;&amp;quot;&amp;quot;&amp;lt;/code&amp;gt;&amp;#039;&amp;#039;&amp;#039; (empty string, not absent). If this field is missing from the settings JSON, ABS sends &amp;lt;code&amp;gt;https://listen.wilsoz.com/undefined/auth/openid/callback&amp;lt;/code&amp;gt; as the redirect URI — a JS &amp;lt;code&amp;gt;undefined&amp;lt;/code&amp;gt; coerced to string. This field is normally set by the v2.17.4 migration, but only if OIDC was already enabled at migration time. If you configure OIDC by writing directly to the DB, add this field manually.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Authentik authorize/token/userinfo URLs are shared, not per-provider.&amp;#039;&amp;#039;&amp;#039; Even with &amp;lt;code&amp;gt;issuer_mode: per_provider&amp;lt;/code&amp;gt;, the actual endpoints are:&lt;br /&gt;
* &amp;lt;code&amp;gt;/application/o/authorize/&amp;lt;/code&amp;gt; (not &amp;lt;code&amp;gt;/application/o/audiobookshelf/authorize/&amp;lt;/code&amp;gt;)&lt;br /&gt;
* &amp;lt;code&amp;gt;/application/o/token/&amp;lt;/code&amp;gt; (not &amp;lt;code&amp;gt;/application/o/audiobookshelf/token/&amp;lt;/code&amp;gt;)&lt;br /&gt;
* &amp;lt;code&amp;gt;/application/o/userinfo/&amp;lt;/code&amp;gt; (not &amp;lt;code&amp;gt;/application/o/audiobookshelf/userinfo/&amp;lt;/code&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
Only the issuer, JWKS, and end-session URLs are per-provider. Use the discovery document to get the correct URLs:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
curl -s https://key.wilsoz.com/application/o/audiobookshelf/.well-known/openid-configuration | python3 -m json.tool&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Authentik API PATCH returns 403 for providers&amp;#039;&amp;#039;&amp;#039; — use PUT with the full provider object instead.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Python &amp;lt;code&amp;gt;urllib&amp;lt;/code&amp;gt; drops Authorization header on HTTPS redirect&amp;#039;&amp;#039;&amp;#039; — use &amp;lt;code&amp;gt;subprocess&amp;lt;/code&amp;gt; + &amp;lt;code&amp;gt;curl&amp;lt;/code&amp;gt; for Authentik API calls from Python scripts.&lt;br /&gt;
&lt;br /&gt;
== Users ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Username&lt;br /&gt;
! Email&lt;br /&gt;
! Type&lt;br /&gt;
|-&lt;br /&gt;
| admin&lt;br /&gt;
| (none)&lt;br /&gt;
| root&lt;br /&gt;
|-&lt;br /&gt;
| marcus&lt;br /&gt;
| (none)&lt;br /&gt;
| user&lt;br /&gt;
|-&lt;br /&gt;
| travis&lt;br /&gt;
| (none)&lt;br /&gt;
| user&lt;br /&gt;
|-&lt;br /&gt;
| mehone&lt;br /&gt;
| Mehonesleshi1989@gmail.com&lt;br /&gt;
| user&lt;br /&gt;
|-&lt;br /&gt;
| stefany&lt;br /&gt;
| (none)&lt;br /&gt;
| user&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Note: marcus and admin have no email stored — OIDC match is by username, not email.&lt;/div&gt;</summary>
		<author><name>Wikibot</name></author>
	</entry>
</feed>