Audiobookshelf
Overview
Audiobookshelf is a popular open source, self-hosted audiobook and podcast media server. Stream your own collection from anywhere through a fast web player or the native iOS and Android apps, with listening progress synced across every device.
This SecureAnyCloud image runs Audiobookshelf 2.35.1 behind nginx on a hardened Ubuntu 24.04 LTS base, patched at build time, so a private audiobook server is running within minutes of launch.
The server is a single self-contained binary with an embedded SQLite datastore and a bundled web player. It runs under systemd on the loopback interface, with nginx in front on port 80 (and 443 once you add TLS). nginx also proxies the WebSocket traffic that the player relies on, and ffmpeg handles transcoding and audio tagging. The binary, config, metadata and media library all live on a dedicated Azure data disk mounted at /usr/share/audiobookshelf.
What you get:
- Audiobookshelf 2.35.1 served through nginx, managed by systemd
- ffmpeg and ffprobe from the distribution, wired into the service environment for transcoding
- A dedicated, independently resizable Azure data disk at
/usr/share/audiobookshelf, separate from the operating system disk, holding the binary, config, SQLite database, cached metadata and your library - Secure by default: the image ships with no administrator, so only you set the admin password on first visit
- The REST backend for the native iOS and Android apps, plus an OPDS feed
- 24/7 SecureAnyCloud support
Secure by default: you create the admin account
Audiobookshelf has no default administrator, and this image does not include one. It ships at Audiobookshelf's built-in first-visit Initial Server Setup / Create Root User screen.
The first time you browse to your instance, you create your own admin account with your own username and password. No shared credentials, database rows or media files ship in the image, so every instance starts as a clean slate that only you secure.
Prerequisites
You need an active Azure subscription, an SSH key pair, and a VNet with a subnet in the target region. The Azure CLI is required only if you deploy from the command line.
Standard_B2s (2 vCPU / 4 GiB RAM) is a sensible starting point for a personal library. Size up for multi-user libraries that exceed a thousand titles.
Configure the network security group (NSG) to allow inbound 22/tcp from your management network, and 80/tcp (plus 443/tcp once you add TLS) from the networks that will reach the web player.
Launch from the Azure Marketplace
Sign in to the Azure portal, select Create a resource, and search the Marketplace for Audiobookshelf on Ubuntu 24.04 LTS by SecureAnyCloud. Select the offer, choose the plan, and select Create.
On the Basics tab, pick your subscription, resource group and region, and choose a VM size of Standard_B2s or larger. Set the authentication type to SSH public key, set the username to azureuser, and provide your public key.
On the Networking tab, select your VNet and subnet, and a network security group that allows inbound 22/tcp and 80/tcp. Then review and create the VM. First-boot initialization completes about a minute after the VM reaches the Running state.
Launch from the Azure CLI
az vm image terms accept --urn sac1647283583153:audiobookshelf-ubuntu-24-04:default:latest
az vm create \
--resource-group my-resource-group \
--name audiobookshelf \
--image sac1647283583153:audiobookshelf-ubuntu-24-04:default:latest \
--size Standard_B2s \
--admin-username azureuser \
--generate-ssh-keys \
--public-ip-sku Standard
# Open the required inbound ports on the VM's network security group az vm open-port --resource-group my-resource-group --name audiobookshelf --port 22 --priority 1001 az vm open-port --resource-group my-resource-group --name audiobookshelf --port 80 --priority 1002Connect over SSH
Connect over SSH on port 22 as azureuser with the key pair you launched with:
ssh azureuser@<public-ip>Replace <public-ip> with your VM's public IP address, or with its private address if you reach it over a VPN or ExpressRoute.
First visit: create your admin account
Open Audiobookshelf in your browser:
http://<public-ip>/The Initial Server Setup screen opens. Enter a username (the default is root), choose a strong password, and confirm it. Leave the config and metadata paths as they are. They are prefilled to the dedicated data disk (/usr/share/audiobookshelf/config and /usr/share/audiobookshelf/metadata). Select Submit.
Because the database is empty, this first account is the administrator. That single step secures your instance. You then land on the sign-in page, and the setup screen never appears again for this instance.
Enable HTTPS before you expose the instance to the public internet (see "Enabling HTTPS" below). Until then, treat the password you set here as you would any credential sent over plain HTTP.
Verifying the deployment
Run these commands over SSH on the VM to confirm that the server is healthy and shipped in the secure, no-admin state.
Confirm that both services are active and that the server is bound to the loopback interface only, with nginx fronting it on port 80:
systemctl is-active audiobookshelf nginx ss -tlnp 2>/dev/null | grep -E ':80 |:13378'Confirm that the health endpoint returns HTTP 200, check the installed version, and confirm that ffmpeg is wired into the service environment:
curl -s -o /dev/null -w 'healthcheck HTTP %{http_code}\n' http://127.0.0.1/healthcheck dpkg-query -W -f='audiobookshelf ${Version}\n' audiobookshelf grep -E '^FFMPEG_PATH|^HOST|^PORT' /etc/default/audiobookshelfConfirm that the server reports it has not been initialized yet. No admin user exists until you create one on first visit:
curl -s http://127.0.0.1/status | grep -o '"isInit":[a-z]*'Confirm that the dedicated Azure data disk is mounted at /usr/share/audiobookshelf. It is keyed by UUID in fstab, so it survives reboots and re-provisioning:
findmnt /usr/share/audiobookshelf grep audiobookshelf /etc/fstab df -h /usr/share/audiobookshelf | tail -1Adding your library
After you log in, Audiobookshelf prompts you to add your first library. Copy your audiobooks or podcasts onto the dedicated data disk first, then point a library folder at them.
From your workstation, copy your collection over SSH, for example with rsync. Replace the paths and address with your own:
rsync -av /path/to/your/audiobooks/ azureuser@<public-ip>:/tmp/abs-upload/Then, on the VM, move it into the library area and hand ownership to the service account:
sudo rsync -a --chown=audiobookshelf:audiobookshelf /tmp/abs-upload/ /usr/share/audiobookshelf/audiobooks/ && rm -rf /tmp/abs-uploadIn the web UI, go to Settings, then Libraries, then Add Library. Give the library a name, choose the Books (or Podcasts) media type, and add the folder /usr/share/audiobookshelf/audiobooks.
Organize audiobooks as Author/Title/files for the cleanest results. Audiobookshelf reads embedded tags and folder structure for author, title, series, cover art and chapters. It scans the folder when you create the library and watches for new files afterward. You can also trigger a rescan from the library's overflow menu.
The web player
Once a library is scanned, the home view shows your collection with cover art, organized into shelves such as Recently Added and Discover. A sidebar links to Library, Series, Collections, Authors, Narrators and listening Stats.
Open any title to see its detail page, with cover, author, narrator, duration, chapters, audio tracks and library files. Select Play to start listening.
The persistent player bar provides play and pause, chapter and track navigation, a seek bar, variable playback speed, a sleep timer and bookmarks. Your listening position syncs automatically, so you can resume on another device or in the mobile apps exactly where you left off.
The same server backs the native iOS and Android apps. Sign in with your instance URL and the admin credentials you created, and your libraries, progress and bookmarks are all there.
Multiple users
Audiobookshelf is multi-user. As the admin, go to Settings, then Users, then Add User to create accounts for family members or a team. Each user gets their own login, independent listening progress and per-library access.
An OPDS feed is also available for compatible reader and player apps.
Managing the services
Audiobookshelf and nginx are managed with systemd:
sudo systemctl status audiobookshelf
sudo systemctl restart audiobookshelf
sudo systemctl status nginx
sudo journalctl -u audiobookshelf -fThe service environment lives in /etc/default/audiobookshelf. It sets the port, host binding, config and metadata paths, and the ffmpeg and ffprobe locations. The server binds to 127.0.0.1:13378, and nginx terminates client connections on port 80.
Enabling HTTPS
Before you expose the instance to the public internet, terminate TLS at nginx. Point a DNS A record at your VM and open port 443 in the network security group. Then use Certbot to obtain and install a Let's Encrypt certificate, replacing the host with your own domain:
sudo apt-get update && sudo apt-get install -y certbot python3-certbot-nginx
sudo certbot --nginx -d audiobooks.your-domain.exampleCertbot edits the nginx site to serve HTTPS and sets up automatic renewal. When it completes, browse to https://audiobooks.your-domain.example/.
Backups
Audiobookshelf has a built-in backup feature under Settings, then Backups. It snapshots the database and server settings into the metadata folder on the data disk.
For disaster recovery, also take periodic Azure snapshots of the /usr/share/audiobookshelf data disk. That single disk holds the database, cached metadata and your media library.
Support
This image is commercially supported by SecureAnyCloud. We provide 24/7 technical support by email and chat for deployment, upgrades, library migration, transcoding configuration and TLS termination.
Audiobookshelf is a trademark of its respective owner. All product and company names are trademarks or registered trademarks of their respective holders. Use of them does not imply any affiliation with or endorsement by them.
Deploy on Azure
Launch Audiobookshelf on Ubuntu 24.04 LTS on Azure with 24/7 support from SecureAnyCloud.
View this image
Need Help?
Our support team is available 24/7.
sales@secureanycloud.com
This image delivers Audiobookshelf 2.35, the popular open source, self-hosted audiobook and podcast media server, fully installed and reverse-proxied with nginx. Stream your own collection from anywhere through a fast web player or the native iOS and Android apps, with listening progress synced across every device.
The server is a single self-contained binary with an embedded SQLite datastore and a bundled web player. It runs under systemd on the loopback interface, with nginx in front on port 80 (and 443 once you add TLS). nginx also proxies the WebSocket traffic that the player relies on, and ffmpeg handles transcoding and audio tagging. The config, metadata and media library live on a dedicated, independently resizable EBS data volume mounted at /usr/share/audiobookshelf, separate from the operating system disk.
Secure by default: you create the admin account
Audiobookshelf has no default administrator, and this image does not include one. The AMI ships at Audiobookshelf's built-in first-visit Initial Server Setup / Create Root User screen.
The first time you browse to your instance, you create your own admin account with your own username and password. No shared credentials, database rows or media files ship in the image, so every instance starts as a clean slate that only you secure.
Connecting to your instance
Connect over SSH on port 22. Use the default login user for your operating system variant and the EC2 key pair that you launched with.
OS variant SSH login user Example
Ubuntu 24.04 ubuntu ssh -i your-key.pem ubuntu@<instance-public-ip>
Replace <instance-public-ip> with your instance's public IPv4 address, or with its private address if you reach it over a VPN or Direct Connect.
First visit: create your admin account
Open Audiobookshelf in your browser:
http://<instance-public-ip>/The Initial Server Setup screen opens. Enter a username (the default is root), choose a strong password, and confirm it. Leave the config and metadata paths as they are. They are prefilled to the dedicated data volume (/usr/share/audiobookshelf/config and /usr/share/audiobookshelf/metadata). Click Submit.
Because the database is empty, this first account is the administrator (the "root" user). That single step secures your instance. You then land on the sign-in page, and the setup screen never appears again for this instance.
Enable HTTPS before you expose the instance to the public internet (see "Enabling HTTPS" below). Until then, treat the password you set here as you would any credential sent over plain HTTP.
Adding your library
After you log in, Audiobookshelf prompts you to add your first library. Copy your audiobooks or podcasts onto the dedicated data volume first, then point a library folder at them.
From your workstation, copy your collection over SSH, for example with rsync. Replace the paths and address with your own:
rsync -av -e "ssh -i your-key.pem" /path/to/your/audiobooks/ ubuntu@<instance-public-ip>:/tmp/abs-upload/Then, on the instance, move it into the library area and hand ownership to the service account:
sudo rsync -a --chown=audiobookshelf:audiobookshelf /tmp/abs-upload/ /usr/share/audiobookshelf/audiobooks/ && rm -rf /tmp/abs-uploadIn the web UI, go to Settings -> Libraries -> Add Library. Give the library a name, choose the Books (or Podcasts) media type, and add the folder /usr/share/audiobookshelf/audiobooks.
Organize audiobooks as Author/Title/files... for the cleanest results. Audiobookshelf reads embedded tags and folder structure for author, title, series, cover art and chapters. It scans the folder when you create the library and watches for new files afterward. You can also trigger a rescan from the library's overflow menu.
The web player
Once a library is scanned, the home view shows your collection with cover art, organised into shelves such as Recently Added and Discover, with a sidebar for Library, Series, Collections, Authors, Narrators and listening Stats.
Open any title to see its detail page, with cover, author, narrator, duration, chapters, audio tracks and library files. Click Play to start listening.
The persistent player bar provides play and pause, chapter and track navigation, a seek bar, variable playback speed, a sleep timer and bookmarks. Your listening position syncs automatically, so you can resume on another device or in the mobile apps exactly where you left off.
The same server backs the native iOS and Android apps. Sign in with your instance URL and the admin credentials you created, and your libraries, progress and bookmarks are all there.
Multiple users
Audiobookshelf is multi-user. As the admin, go to Settings -> Users -> Add User to create accounts for family members or a team. Each user gets their own login, independent listening progress and per-library access.
An OPDS feed is also available for compatible reader and player apps.
Verifying the deployment
Run these commands over SSH on the instance to confirm that the server is healthy and shipped in the secure, no-admin state.
Confirm that both services are active:
systemctl is-active audiobookshelf nginxConfirm that the health endpoint returns HTTP 200 through nginx:
curl -s -o /dev/null -w 'healthcheck HTTP %{http_code}\n' http://127.0.0.1/healthcheckConfirm that the server reports it has not been initialized yet. No admin user exists until you create one on first visit:
curl -s http://127.0.0.1/status | grep -o '"isInit":[a-z]*'Confirm that the server is bound to the loopback interface only. nginx fronts it on port 80:
ss -tlnp 2>/dev/null | grep -q '127.0.0.1:13378' && echo 'server bound to loopback OK'Confirm that the dedicated data volume is mounted, and check the installed version:
df -h /usr/share/audiobookshelf | tail -1 dpkg-query -W -f='${Package} ${Version}\n' audiobookshelfManaging the services
Audiobookshelf and nginx are managed with systemd:
sudo systemctl status audiobookshelf
sudo systemctl restart audiobookshelf
sudo systemctl status nginx
sudo journalctl -u audiobookshelf -fThe service environment lives in /etc/default/audiobookshelf. It sets the port, host binding, config and metadata paths, and the ffmpeg and ffprobe locations. The server binds to 127.0.0.1:13378, and nginx terminates client connections on port 80.
Enabling HTTPS
Before you expose the instance to the public internet, terminate TLS at nginx. Point a DNS A record at your instance and open port 443 in the security group. Then use Certbot to obtain and install a Let's Encrypt certificate, replacing the host with your own domain:
sudo apt-get update && sudo apt-get install -y certbot python3-certbot-nginx
sudo certbot --nginx -d audiobooks.your-domain.exampleCertbot edits the nginx site to serve HTTPS and sets up automatic renewal. After it completes, browse to https://audiobooks.your-domain.example/.
Backups
Audiobookshelf has a built-in backup feature under Settings -> Backups. It snapshots the database and server settings into the metadata folder on the data volume.
For disaster recovery, also take periodic EBS snapshots of the /usr/share/audiobookshelf volume. That single volume holds the database, cached metadata and your media library.
Support
This image is commercially supported by SecureAnyCloud. We provide 24/7 technical support by email and chat for deployment, upgrades, library migration, transcoding configuration and TLS termination.
Audiobookshelf is a trademark of its respective owner. All product and company names are trademarks or registered trademarks of their respective holders. Use of them does not imply any affiliation with or endorsement by them.
Need Help?
Our support team is available 24/7.
sales@secureanycloud.com