Software Link to heading
- FreeBSD 14.0
- Bastille 0.10.20231125
- node 20.15
- ffmpeg
- audiobookshelf 2.11.0
On the host Link to heading
First we create the jail:
# bastille create -V audiobookshelf 14.0-RELEASE "DHCP SLAAC" igb0
# bastille console audiobookshelf
I prefer to use VNET jails so that I can assign IP addresses later.
In the jail Link to heading
Jail dependencies Link to heading
First, we install some required dependencies:
# pkg update
# pkg install \
ffmpeg \
git \
node \
npm \
vim
Create a folder for the audiobookshelf configuration:
# mkdir /usr/local/etc/AudioBookShelf
Next, we clone a specific tag of the audiobookshelf repository and go into that folder:
# git clone --depth 1 --branch v2.11.0 https://github.com/advplyr/audiobookshelf.git abs
# cd abs/
We need to create a js configuration file from the example given and then modify the paths:
~/abs # cp .devcontainer/dev.js .
~/abs # vim dev.js
// Using port 3333 is important when running the client web app separately
const Path = require('path')
module.exports.config = {
Port: 3333,
ConfigPath: '/usr/local/etc/AudioBookShelf/config',
MetadataPath: '/usr/local/etc/AudioBookShelf/metadata',
FFmpegPath: '/usr/local/bin/ffmpeg',
FFProbePath: '/usr/local/bin/ffprobe'
SkipBinariesCheck: true
}
Now, we’re ready to install the node.js dependencies. This is mostly taken from audiobookshelf instructions. But, a new dependency introduced in version 2.10 (cypress) does not build on FreeBSD. For now, we simply remove it from the build process.
~/abs # npm ci
~/abs # cd client
~/abs/client # sed '/cypress/d' package.json
~/abs/client # npm ci
~/abs/client # npm run generate
~/abs # cd ..
Finally, we’re ready to test:
~/abs # npm run dev
> audiobookshelf@2.11.0 dev
> nodemon --watch server index.js
[nodemon] 2.0.20
[nodemon] to restart at any time, enter `rs`
[nodemon] watching path(s): server/**/*
[nodemon] watching extensions: js,mjs,json
[nodemon] starting `node index.js`
Config /usr/local/etc/AudioBookShelf/config /usr/local/etc/AudioBookShelf/metadata
[2024-02-19 19:20:06.726] INFO: === Starting Server ===
[2024-02-19 19:20:06.737] INFO: [Server] Init v2.11.0
[2024-02-19 19:20:06.739] INFO: [Database] Initializing db at "/usr/local/etc/AudioBookShelf/config/absdatabase.sqlite"
[2024-02-19 19:20:06.758] INFO: [Database] Db connection was successful
[2024-02-19 19:20:06.813] INFO: [Database] Db initialized with models: user, library, libraryFolder, book, podcast, podcastEpisode, libraryItem, mediaProgress, series, bo
okSeries, author, bookAuthor, collection, collectionBook, playlist, playlistMediaItem, device, playbackSession, feed, feedEpisode, setting
<<SOME OUTPUT REMOVED FOR CLARITY>>
[2024-02-19 19:20:06.836] INFO: [BinaryManager] Found ffmpeg at /usr/local/bin/ffmpeg
[2024-02-19 19:20:06.836] INFO: [BinaryManager] Found ffprobe at /usr/local/bin/ffprobe
[2024-02-19 19:20:06.841] INFO: Listening on port :3333
And going to the :3333 should show you:
The two paths in the start page will be set to whatever you set as the ConfigPath
and MetadataPath
in dev.js
.
Creating a rc.d script Link to heading
After a bit of trial-and-error, I was able to get audiobookshelf to start automatically with this rc.d script:
#!/bin/sh
# PROVIDE: audiobookshelf
# REQUIRE: ldconfig
# This require line is needed so that audiobookshelf is started *after* the shared libraries are available
# Enable this script by adding:
# audiobookshelf_enable="YES"
# ... to /etc/rc.conf
. /etc/rc.subr
name=audiobookshelf
rcvar=audiobookshelf_enable
audiobookshelf_chdir="/root/abs/"
audiobookshelf_command="/usr/local/bin/npm"
audiobookshelf_args="run dev"
pidfile="/var/run/${name}.pid"
logfile="/var/log/${name}.log"
procname="/usr/local/bin/node"
command="/usr/sbin/daemon"
command_args="-S -f -o ${logfile} -p ${pidfile} ${audiobookshelf_command} ${audiobookshelf_args}"
PATH=/usr/local/bin:/usr/local/sbin:/sbin:/bin:/usr/sbin:/usr/bin
load_rc_config $name
: ${audiobookshelf_enable:=no}
run_rc_command "$1"
Note: As far as I can tell, cypress is only used to run tests when developing web front-ends (can you tell that I’m not a developer?). I haven’t noticed any ill-effects from leaving it out of the build process.