Guide de déploiement

Audiobookshelf sur VPS : audiolivres et podcasts self-hosted

Déployer sur un VPS Cloud →

Tutoriel

Self-hosting

Audiobookshelf sur VPS : audiolivres et podcasts self-hosted

Audiobookshelf est un serveur d'audiolivres et de podcasts open source (GPL-3.0) que vous hébergez vous-même. Contrairement aux services cloud, vos fichiers audio restent sur votre serveur : vous les contrôlez entièrement, sans abonnement, sans limite de quota et sans partage de vos habitudes d'écoute. Les applications iOS et Android officielles — entièrement libres — se connectent à votre instance et synchronisent la progression, les marque-pages et les playlists sur tous vos appareils.

12 min de lecture11 étapes
Sommaire· Pourquoi self-héberger votre bibliothèque audio ?1/16
  1. 01Pourquoi self-héberger votre bibliothèque audio ?
  2. 02Ce qu'Audiobookshelf apporte sur un VPS ServOrbit
  3. 03Formats audio pris en charge
  4. 04Prérequis et dimensionnement
  5. 05Déployer Audiobookshelf avec Docker Compose
  6. 06Configuration sans nom de domaine
  7. 07Permissions des volumes et utilisateur non root
  8. 08Volume nommé ou dossier de l'hôte pour /config et /metadata
  9. 09Sauvegardes cohérentes : ce que couvre la sauvegarde intégrée
  10. 10Sauvegarde à froid et restauration manuelle
  11. 11Mises à jour et versions : épingler plutôt que suivre latest
  12. 12Dépannage : boucle de redémarrage au démarrage (EPERM … copyfile)
  13. 13Dépannage : la sauvegarde nocturne plante le conteneur (SQLITE_BUSY)
  14. 14Autres erreurs fréquentes
  15. 15Durcissement minimal
  16. 16Aller plus loin

Pourquoi self-héberger votre bibliothèque audio ?

Les plateformes d'audiolivres imposent leurs catalogues, leurs DRM et leurs prix mensuels. Avec Audiobookshelf, vous importez vos propres fichiers M4B, MP3 ou FLAC — que vous les ayez achetés, empruntés ou produits vous-même — et vous y accédez depuis n'importe quel appareil via les apps mobiles open source. La bibliothèque grandit à votre rythme, pas au leur.

Ce qu'Audiobookshelf apporte sur un VPS ServOrbit

  • Streaming et synchronisation — reprenez un audiolivre là où vous vous étiez arrêté, sur le web ou sur mobile, sans compte cloud tiers.
  • Applications iOS et Android open source — les clients officiels sont GPL-3.0, auditables et maintenus par la communauté.
  • Sauvegardes planifiées intégrées — le serveur sait produire lui-même une archive de sa base et de ses métadonnées, avec une rétention réglable.
  • Podcasts intégrés — abonnez-vous à des flux RSS, les épisodes sont téléchargés automatiquement et lisibles dans la même interface.
  • Multi-utilisateurs — chaque membre de la famille dispose de son propre compte, de son historique et de ses playlists.
  • Métadonnées automatiques — couvertures, chapitres et descriptions peuvent être récupérés auprès de fournisseurs comme Audnexus, sans saisie manuelle.

Formats audio pris en charge

Audiobookshelf lit les formats courants, notamment MP3, M4A, M4B (avec chapitres), AAC, OGG, FLAC, WAV et OPUS. Les chapitres M4B sont affichés dans le lecteur avec leur titre et leur durée. Les fichiers Audible protégés par DRM ne se lisent pas tels quels : n'importez que des fichiers dont vous avez le droit de disposer, dans un format ouvert.

Prérequis et dimensionnement

Le serveur lui-même est modeste : un VPS Ubuntu 24.04 avec Docker suffit pour une famille. Ce qui pèse est le disque, car la bibliothèque (surtout les épisodes de podcasts, téléchargés au fil du temps) grossit en continu, et le processeur uniquement quand un client demande un transcodage via ffmpeg plutôt qu'une lecture directe. Prévoyez donc un volume de données dimensionné sur votre collection, plus de la marge pour les métadonnées, les couvertures et les sauvegardes, qui vivent par défaut dans le même volume /metadata.

La base SQLite du serveur doit rester sur le disque local du VPS. La documentation d'Audiobookshelf est explicite : le dossier /config ne doit pas être monté sur un partage réseau, sous peine de lenteurs puis de corruption. Les fichiers audio, eux, peuvent vivre ailleurs.

Déployer Audiobookshelf avec Docker Compose

  1. Préparer le VPS et Docker

    Connectez-vous en SSH, mettez le système à jour, puis installez Docker et le plugin Compose. Vérifiez avec docker compose version. Sur un VPS ServOrbit, le template Audiobookshelf fait ces étapes pour vous : ce guide sert à comprendre ce qui tourne et à le reprendre en main.

  2. Créer les dossiers et fixer le propriétaire

    Créez un dossier par volume : mkdir -p /opt/audiobookshelf/{config,metadata,audiobooks,podcasts}. Choisissez l'utilisateur sous lequel le conteneur tournera (par exemple 1000:1000), puis donnez-lui les dossiers : chown -R 1000:1000 /opt/audiobookshelf. Les quatre dossiers doivent être des points de montage distincts, sans imbrication.

  3. Écrire le docker-compose.yml

    Déclarez un service audiobookshelf avec l'image ghcr.io/advplyr/audiobookshelf (épinglez le tag de la version que vous avez vérifiée plutôt que latest), restart: unless-stopped, la directive user: "1000:1000", le port 127.0.0.1:13378:80 et les quatre montages /opt/audiobookshelf/config:/config, /opt/audiobookshelf/metadata:/metadata, /opt/audiobookshelf/audiobooks:/audiobooks et /opt/audiobookshelf/podcasts:/podcasts. Ajoutez TZ=Africa/Casablanca (ou votre fuseau) en variable d'environnement. Audiobookshelf n'utilise pas les variables PUID et PGID : c'est la directive user: qui fixe l'utilisateur.

  4. Démarrer et vérifier

    Lancez docker compose up -d, puis docker compose logs -f audiobookshelf. Au premier démarrage, le serveur applique ses migrations de base de données : attendez la ligne qui annonce l'écoute sur le port 80 du conteneur. Un docker compose ps qui montre le service en redémarrage permanent renvoie directement à la section dépannage plus bas.

  5. Créer le compte administrateur et la bibliothèque

    Ouvrez l'interface (via un tunnel SSH ou votre domaine), créez le compte root, puis ajoutez une bibliothèque pointant vers /audiobooks et une autre vers /podcasts. Lancez un scan : les livres apparaissent avec leurs couvertures et leurs chapitres.

  6. Connecter l'application mobile

    Dans l'app iOS ou Android, saisissez l'adresse HTTPS de votre instance, votre identifiant et votre mot de passe. La progression se synchronise ensuite entre le téléphone et le web. Pour un usage permanent, placez un reverse proxy HTTPS devant le conteneur en suivant la page « Reverse Proxy » de la documentation d'Audiobookshelf (notamment le passage des WebSocket).

Configuration sans nom de domaine

Audiobookshelf ne nécessite pas de nom de domaine pour fonctionner. Avec le template ServOrbit, le conteneur n'écoute que sur le loopback du VPS, port 13780. Ouvrez un tunnel SSH depuis votre machine : ssh -L 13378:127.0.0.1:13780 root@<ip-vps>, puis allez sur http://localhost:13378. Pour une utilisation permanente depuis l'app mobile, rattachez un domaine depuis votre espace client ServOrbit — nginx proxifie le conteneur en HTTPS — ou utilisez le sous-domaine gratuit {app}.{dns_slug}.servorbit-dns.com inclus avec chaque VPS.

Permissions des volumes et utilisateur non root

Quatre volumes, quatre rôles. /config contient la base SQLite et les scripts de migration. /metadata contient les métadonnées, les couvertures, les images d'auteurs, les journaux, le cache et, par défaut, les sauvegardes. /audiobooks et /podcasts donnent accès aux fichiers médias. Le serveur doit pouvoir écrire dans /config et /metadata ; sur /audiobooks, l'écriture n'est nécessaire que si vous voulez qu'il écrive des métadonnées à côté des fichiers, et sur /podcasts elle est indispensable puisque les épisodes y sont téléchargés.

Par défaut, l'exemple officiel ne fixe pas d'utilisateur. Pour durcir, ajoutez la directive user: : le conteneur n'a alors plus les droits de root sur les montages, et c'est précisément là que les erreurs de permissions apparaissent. La règle est simple : le propriétaire des dossiers hôtes doit être l'UID:GID de la directive user:. Testez avant de charger la bibliothèque : docker compose exec audiobookshelf touch /config/test /metadata/test, puis supprimez les deux fichiers.

Sur un système de fichiers à ACL (ZFS avec ACL NFSv4, par exemple), un chown ne suffit pas toujours : l'incident décrit plus bas en est l'illustration, avec un conteneur en utilisateur 568, toutes capacités retirées, sur un dataset ZFS.

Volume nommé ou dossier de l'hôte pour /config et /metadata

Faites défiler le tableau

CritèreVolume nommé DockerDossier de l'hôte
Propriétaire initialGéré par Docker, souvent rootÀ fixer vous-même avec chown
Compatibilité avec `user:`À vérifier avant la première importationDirecte, si l'UID:GID correspond
Sauvegarde à froidPasser par `docker volume inspect` pour trouver le chemin`rsync` direct du dossier
Lisibilité du cheminMoins évidenteChemin fixe et connu
Portabilité vers un autre VPSExport du volume à prévoirCopie du dossier
Cas d'usage conseilléEssai rapide, template prêt à l'emploiProduction avec utilisateur non root

Sauvegardes cohérentes : ce que couvre la sauvegarde intégrée

Audiobookshelf sait créer ses propres sauvegardes depuis l'interface (planification, nombre de sauvegardes conservées, taille maximale). Chaque archive contient la base de données et les images de couverture du dossier de métadonnées ; les fichiers médias stockés avec les éléments de bibliothèque n'y sont pas. Par défaut, les archives sont écrites dans /metadata/backups, c'est-à-dire sur le même disque que les données : une panne du VPS emporte les deux. Copiez-les donc régulièrement hors du serveur.

Une sauvegarde ne protège que si elle est cohérente. La base est un fichier SQLite vivant : copier /config avec cp ou rsync pendant que le serveur écrit (progression d'écoute, scan) peut produire un fichier incohérent. Deux méthodes sûres : utiliser la sauvegarde intégrée du serveur, puis copier l'archive produite ; ou arrêter le conteneur le temps de la copie. Les fichiers audio, eux, se sauvegardent à part, avec rsync ou un outil de sauvegarde par déduplication.

Une restauration se fait sur le même type de système : la documentation avertit qu'une sauvegarde Linux se restaure sur Linux, et qu'un passage d'une méthode d'installation à une autre peut faire perdre progression et métadonnées.

Sauvegarde à froid et restauration manuelle

  1. Arrêter le conteneur

    Dans le dossier du compose, lancez docker compose stop audiobookshelf. Plus aucune écriture n'est en cours sur la base.

  2. Copier la configuration et les métadonnées

    Copiez /opt/audiobookshelf/config et /opt/audiobookshelf/metadata vers un emplacement hors du VPS avec rsync -a, en conservant les droits. Ajoutez les dossiers audio selon votre stratégie de sauvegarde des médias.

  3. Redémarrer et contrôler

    Lancez docker compose start audiobookshelf et vérifiez dans les journaux que le serveur écoute à nouveau. L'interruption dure le temps de la copie de la base.

  4. Restaurer depuis une archive du serveur

    Arrêtez le conteneur, décompressez l'archive la plus récente de metadata/backups, copiez audiobookshelf.sqlite dans le dossier de configuration en remplaçant l'existant, puis copiez les dossiers metadata-authors et metadata-items vers authors et items. Si l'archive est inutilisable, essayez la précédente. La page Sauvegardes de l'interface propose aussi un bouton de restauration.

  5. Tester une restauration à blanc

    Une fois par trimestre, restaurez une sauvegarde sur un VPS de test et vérifiez que les utilisateurs, la progression et les bibliothèques sont présents. Une sauvegarde jamais restaurée reste une hypothèse.

Mises à jour et versions : épingler plutôt que suivre latest

Le template ServOrbit tire l'image latest. C'est pratique, mais cela vous expose aux régressions d'une version à l'autre. La mise à jour documentée est simple : docker compose pull, docker compose down, docker compose up --detach. Avant chaque mise à jour, faites une sauvegarde (intégrée ou à froid) et lisez les notes de version sur la page des releases du dépôt GitHub.

Un cas récent le justifie. La version 2.37.0 a fait passer le serveur à Node.js 24, et la 2.37.1 a été touchée par une boucle de redémarrage sur certaines installations (voir ci-dessous). La correction est publiée dans la 2.37.2, qui est, à la date de rédaction, la dernière version stable listée par le projet. Un tag épinglé et une sauvegarde préalable permettent de revenir en arrière sans improviser.

Dépannage : boucle de redémarrage au démarrage (EPERM … copyfile)

Symptôme : le conteneur redémarre en boucle après une mise à jour vers la 2.37.1, et les journaux affichent « Failed to copy migrations to the config directory », puis « EPERM: operation not permitted, copyfile » du dossier /app/dist-server/server/migrations/ vers /config/migrations/, suivi de « Database migration failed ».

État réel de l'incident (issue n° 5637 du dépôt advplyr/audiobookshelf, ouverte en octobre 2026) : elle est fermée. Le rapporteur utilisait TrueNAS SCALE, un conteneur en utilisateur 568, toutes capacités retirées et no-new-privileges, avec /config sur un dataset ZFS en bind mount. Plusieurs utilisateurs de TrueNAS ont signalé la même chose. Aucune cause racine n'est formellement établie dans la discussion ; un test a montré que copyFileSync échouait avec EPERM sur ce montage alors que l'écriture directe d'un fichier fonctionnait avec le même utilisateur, et une régression de la copie liée à Node.js 24 est soupçonnée. La correction (PR n° 5668) ajoute un repli quand la copie échoue ; elle est livrée dans la 2.37.2.

Remède : passez à la 2.37.2 ou plus récente. Si vous ne pouvez pas mettre à jour tout de suite, la solution de contournement évoquée dans l'issue est de revenir à la 2.36.1 avec une sauvegarde faite avant la mise à jour. Si le même message persiste après la mise à jour, vérifiez le propriétaire du dossier de configuration et les ACL du dataset : ce n'est plus ce bogue-là.

Dépannage : la sauvegarde nocturne plante le conteneur (SQLITE_BUSY)

Symptôme : le serveur s'arrête à l'heure de la sauvegarde planifiée, avec « FATAL: [Server] Uncaught exception » et SQLITE_BUSY: database is locked. Avec restart: unless-stopped, Docker relance le conteneur : on ne voit qu'une brève coupure, que révèle un compteur de redémarrages non nul (docker inspect --format '{{.RestartCount}}' <conteneur> ; remplacez le nom par celui de votre conteneur).

État réel (issue n° 4572, ouverte en août 2025) : elle est toujours ouverte. Un contributeur explique la cause : la sauvegarde SQLite émet l'erreur « base occupée » comme un événement sans écouteur, que Node.js traite comme une exception non rattrapée, et aucune nouvelle tentative n'est faite. Le plantage survient quand une autre écriture, par exemple l'enregistrement de la progression d'écoute par un client, tient le verrou plus d'une seconde pendant la copie. La PR n° 5660 (sauvegarde par lots avec reprise sur verrou, et erreurs de session journalisées au lieu de planter) est à ce jour ouverte et non fusionnée : aucune version publiée ne la contient. Une première PR concurrente a été fermée au profit de celle-ci.

En attendant, trois palliatifs rapportés dans l'issue : décaler la sauvegarde loin des heures d'écoute (plutôt l'aube que la soirée) ; garder restart: unless-stopped pour que le conteneur reparte seul ; ou remplacer la sauvegarde intégrée par une sauvegarde à froid planifiée côté hôte, qui arrête le conteneur quelques instants. Rappel de la documentation : la base doit être sur le disque local, jamais sur un partage réseau.

Autres erreurs fréquentes

  • Permission denied dans les journaux — le propriétaire des dossiers hôtes ne correspond pas à l'UID:GID de la directive user:. Corrigez avec chown -R, puis relancez.
  • Bibliothèque vide après le scan — le chemin de la bibliothèque n'est pas celui du conteneur. Ajoutez /audiobooks ou /podcasts, pas un chemin de l'hôte.
  • « Cannot find module '/index.js' » — la documentation signale un cache d'image périmé chez certains gestionnaires de conteneurs : recréez le conteneur ou la stack après un docker compose pull.
  • L'app mobile ne se connecte pas — vérifiez l'adresse HTTPS, le certificat et le passage des WebSocket par le reverse proxy ; un tunnel SSH ne sert qu'au navigateur.
  • Conteneur « unhealthy » — le contrôle de santé interroge le port 80 du conteneur : consultez docker compose logs pour voir si une migration échoue au démarrage.

Durcissement minimal

Épinglez le tag de l'image, faites tourner le conteneur avec user:, publiez le port uniquement sur 127.0.0.1 derrière un reverse proxy HTTPS, copiez chaque semaine les archives de /metadata/backups hors du VPS et testez une restauration. Ce guide est fourni tel quel : ServOrbit ne prend pas en charge l'application elle-même.

Aller plus loin

Une fois le serveur stable, ajoutez une seconde couche de protection : une sauvegarde chiffrée des dossiers de configuration vers un stockage distant, et une alerte si le conteneur redémarre plus d'une fois par jour. Suivez les issues citées ici : le plantage de sauvegarde sera à nouveau à vérifier dès que la PR n° 5660 sera fusionnée et publiée.

Déployez Audiobookshelf sur votre VPS

ServOrbit déploie un VPS Ubuntu 24.04 et lance Audiobookshelf dans un conteneur Docker en quelques minutes — sans configuration manuelle. Vos audiolivres, vos règles, votre infrastructure.