Ubooquity is a java application that will help you manage your book library. It is similar to miniDLNA but designed for electronic reading material. It grabs covers and allows you to search your library very easily from the web interface. Comic book files and PDFs can be read inside your browser too. If you are a digital bookworm, Ubooquity will be a nice addition to your home media server or NAS for sharing your books across your devices. You can also couple it with Dynamic DNS for additional convenience and even a reverse proxy for additional security. This guide was tested on the Raspberry Pi B+ and Pi 2 and should work on any debian based distro for ARMv7 processors like the ODROID-C1 and Banana Pi.

If you are trying to figure out which hardware would work best for you, consider reading the Pi benchmarks.



Pi Unit Processor RAM RAM Bus Network WiFi USB SATA Cost Raspberry Pi 3 1.2 GHz ARMv8

Quad Core 1 GB DDR2 450 MHz 100 Mbit Yes 4 No $35 Raspberry Pi 2 900 MHz ARMv7

Quad Core 1 GB DDR2 450 MHz 100 Mbit No 4 No $35.00 Raspberry Pi 700 MHz ARMv6

Single Core 512 MB SDRAM 400 MHz 100 Mbit No 4 No $25 Banana Pi 1 GHz ARMv7

Dual Core 1 GB DDR3 432 MHz Gigabit No 2 Yes $36.99 Banana Pi Pro 1 GHz ARMv7

Dual Core 1 GB DDR3 432 MHz Gigabit Yes 2 Yes $45.00

Install Ubooquity on Raspberry Pi

During my tests I was able to browse PDFs inside the browser and comic files (.cbr). Mobi and epub files could only be downloaded. This could depend on your browser though, if it is able to render and decode the files it should be able to show them in the browser. I only tested Google Chrome for viewing.

You get a simple but nice interface for your ebooks

Your comics look great too, which you can read in the browser for added convenience

Install Java on Raspberry Pi

Install Java with a repo thanks to this post

echo "deb http://ppa.launchpad.net/webupd8team/java/ubuntu trusty main" | sudo tee -a /etc/apt/sources.list.d/webupd8team-java.list echo "deb-src http://ppa.launchpad.net/webupd8team/java/ubuntu trusty main" | sudo tee -a /etc/apt/sources.list.d/webupd8team-java.list sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys EEA14886 sudo apt-get update sudo apt-get install oracle-java8-installer -y

Agree to the license and accept the terms in the two popups that follow

Install Ubooquity on Raspberry Pi

Install unzip to unpack ubooquity

sudo apt-get install unzip -y

Create the ubooquity folder

sudo mkdir -p /opt/ubooquity

Enter the ubooquity folder

cd /opt/ubooquity

Grab the latest ubooquity package

sudo wget "http://vaemendis.net/ubooquity/service/download.php" -O ubooquity.zip sudo unzip ubooquity*.zip sudo rm ubooquity*.zip

Change ownership of the ubooquity folder to avoid permission issues

sudo chown -R pi:pi /opt/ubooquity

Start ubooquity in headless mode since we aren't relying on a gui and enable administration, you can change the port as well by adding -port portnumber at the end

sudo java -jar /opt/ubooquity/Ubooquity.jar -webadmin -headless -port 2022

Enter the ip address of your Raspberry Pi in a browser like this http://ip.address:2202/admin to start

If you don't add the /admin you will get this error ‘Sorry, you are not authorized to access any file on this server'

You set a password for your admin account, don't finish setting up now let's make ubooquity start on boot

Type Q in the SSH session to terminate the Ubooquity process

Ubooquity init.d Script

Create the Ubooquity init.d script

sudo nano /etc/init.d/ubooquity

Paste the Ubooquity init.d script

#!/bin/sh ### BEGIN INIT INFO # Provides: Ubooquity # Required-Start: $local_fs $remote_fs $network # Required-Stop: $local_fs $remote_fs $network # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 # Short-Description: Ubooquity # Description: Ubooquity for ebook management ### END INIT INFO # Documentation available at # http://refspecs.linuxfoundation.org/LSB_3.1.0/LSB-Core-generic/LSB-Core-generic/iniscrptfunc.html # Debian provides some extra functions though . /lib/lsb/init-functions export UBOOQUITY_HOME=/opt/ubooquity DAEMON_NAME="Ubooquity" DAEMON_USER=root DAEMON_PATH="/usr/bin/java" DAEMON_OPTS="-jar /opt/ubooquity/Ubooquity.jar -webadmin -headless -port 2022" DAEMON_PWD="/opt/ubooquity" DAEMON_DESC=$(get_lsb_header_val $0 "Short-Description") DAEMON_PID="/var/run/${DAEMON_NAME}.pid" DAEMON_NICE=0 DAEMON_LOG='/var/log/cherrymusic' [ -r "/etc/default/${DAEMON_NAME}" ] && . "/etc/default/${DAEMON_NAME}" do_start() { local result pidofproc -p "${DAEMON_PID}" "${DAEMON_PATH}" > /dev/null if [ $? -eq 0 ]; then log_warning_msg "${DAEMON_NAME} is already started" result=0 else log_daemon_msg "Starting ${DAEMON_DESC}" "${DAEMON_NAME}" touch "${DAEMON_LOG}" chown $DAEMON_USER "${DAEMON_LOG}" chmod u+rw "${DAEMON_LOG}" if [ -z "${DAEMON_USER}" ]; then start-stop-daemon --start --quiet --oknodo --background \ --nicelevel $DAEMON_NICE \ --chdir "${DAEMON_PWD}" \ --pidfile "${DAEMON_PID}" --make-pidfile \ --exec "${DAEMON_PATH}" -- $DAEMON_OPTS result=$? else start-stop-daemon --start --quiet --oknodo --background \ --nicelevel $DAEMON_NICE \ --chdir "${DAEMON_PWD}" \ --pidfile "${DAEMON_PID}" --make-pidfile \ --chuid "${DAEMON_USER}" \ --exec "${DAEMON_PATH}" -- $DAEMON_OPTS result=$? fi log_end_msg $result fi return $result } do_stop() { local result pidofproc -p "${DAEMON_PID}" "${DAEMON_PATH}" > /dev/null if [ $? -ne 0 ]; then log_warning_msg "${DAEMON_NAME} is not started" result=0 else log_daemon_msg "Stopping ${DAEMON_DESC}" "${DAEMON_NAME}" killproc -p "${DAEMON_PID}" "${DAEMON_PATH}" result=$? log_end_msg $result rm "${DAEMON_PID}" fi return $result } do_restart() { local result do_stop result=$? if [ $result = 0 ]; then do_start result=$? fi return $result } do_status() { local result status_of_proc -p "${DAEMON_PID}" "${DAEMON_PATH}" "${DAEMON_NAME}" result=$? return $result } do_usage() { echo $"Usage: $0 {start | stop | restart | status}" exit 1 } case "$1" in start) do_start; exit $? ;; stop) do_stop; exit $? ;; restart) do_restart; exit $? ;; status) do_status; exit $? ;; *) do_usage; exit 1 ;; esac

Make the Ubooquity init.d scripte executable

sudo chmod +x /etc/init.d/ubooquity

Tell the system to start Ubooquity on boot

sudo update-rc.d ubooquity defaults

If the Ubooquity init.d script fails you can use a cronjob.

Add a crontab which schedules processes or scripts to run at regular intervals. We are going to set one to run ubooquity when the Raspberry Pi reboots

crontab -e

Scroll to the bottom of the nano editor with Ctrl+V and paste this text. The sleep 180 is a 3 minute wait to make sure there are no conflicts. Again you can add -port portnumber if you want to use another port.

PATH_UBOOQUITY=/opt/ubooquity @reboot sleep 180 && cd $PATH_UBOOQUITY && nohup /usr/bin/java -jar $PATH_UBOOQUITY/Ubooquity.jar -webadmin -headless -port 2022

Ctrl+X, Y and Enter to save the crontab

Now you can reboot

sudo reboot

If you want to access your ebook collection outside your home network then follow the Dynamic DNS guide. Now you can configure Ubooquity on your Raspberry Pi.