Calibre-Web is an eBook viewer which uses an existing Calibre database to pull content. We do not run the stand alone version of Calibre, but instead use a build of LazyLibrarian which has Calibre built in.

Some of Calibre-web’s features include:

  • Full HTML5 GUI.
  • User management with per-user permissions
  • Custom shelves
  • Editing eBook metadata
  • Send eBooks to Kindle devices
  • Reading eBooks directly in a browser

Setting up Calibre-web is really simple once you have Docker installed. If you’re on a Synology device, this can be done by going to Package Center > Settings > Package Sources and adding https://packages.synocommunity.com/. Once that resource has been added, search the package center for Docker. Once Docker has been installed, run it and navigate to the registry tab to search for Calibre-web. We prefer LinuxServer’s automatic builds. Once you find the one you would like, select it and click download it.

After it’s done downloading, it will move into the Image tab. Launch the container to begin configuring it.

Start out by giving the container a name and then clicking Advanced Settings.

Within the Advanced Settings, enable auto-restart, and create a shortcut on desktop (if that interests you). Use your servers IP address followed by the container’s port number 8083.

Next setup the volumes. These folders all need to be created prior to setting up the container so that they can be browsed to and mounted. Click Add Folder to begin mounting each path. Use /config to mount the folder for Calibre-web’s configuration files, and /Media to mount the folder which contains the eBook library, as well as Calibre’s database (metadata.db). If you already setup LazyLibrarian using this tutorial then the books directory has already been created. These are CASE SENSITIVE!

Port settings are used to open the container within a browser. This should be left to the default value since Calibre-web will be looking for this port. Local Port needs to be changed from Auto to the matching Container Port. If this is not done, your machine may use a random port each time and cause confusion.

Environment is where variables are set that are needed to allow the container to run. For the container to run properly and to access and modify the directories, it must be given user permissions. It is good practice to create a new user that is used exclusively for running the container. This user needs read/write privileges to the Docker’s /config directory as well as the /Media directory. The purpose of this is so that in the event the container is compromised, the entire NAS will not be accessible. More on this can be found here.

To obtain the Personal User ID (PUID) and Personal Group ID (PGID) of the user that will be running the container, use Putty or an equivalent program to SSH into your NAS.

Enter the IP address of your NAS in Putty, select the SSH radio button, and click Open.

Enter the admin login information for the NAS. You will not be able to see the password as you type it. Once logged in type id <user> to show your UID (aka PUID) and the GID (aka PGID) for the selected user. We setup a user named automation to run the containers. The command for obtaining the UID and GID in this case was id automation.

Put the IDs from the SSH session into the Environment tab as shown below. It’s also a good idea to input the local timezone, as many containers need this to run. The timezone codes can be found here.

Now that the setup is complete, click ‘ok’ and the container will launch. Read about how to configure Calibre-web here.

20 COMMENTS

  1. Any idea why link on selecting library configuration won’t open any folder? And complains about “DB Location is not Valid, Please Enter Correct Path” at any given path?

  2. Hey Sasquatters,

    Thanks for these great walk-throughs. It’s been immensely helpful. Wanted to know if you are accessing your Calibre-web remotely or just locally – I was hoping I could share my Calibre-web/books with my folks down south, but don’t know if it’s possible to do safely. I’m on a Synology 720+.

    Good luck with all your endeavors!

    • We only access our library locally but I believe you can getup Calibre-Web to upload to a Google Drive. You should also be able to setup Open VPN so they can directly access the Calibre-Web interface from their devices. Unfortunately we have never done this so we won’t be any help there.

  3. Great HowTo – worked fine for me. As I am not yet deep into Docker I wonder what has to be done for upgrading LazyLibrarian, Calibre or Calibre-Web. Should updates be done within the application GUI, or does that interfere with Docker and update should only be done via new Docker image? Hmm, still a lot to learn…

  4. Just as additional information to the great guide:
    When adding below environement variable (as described in the docker image description) it is possible to perform ebook conversion (#optional & x86-64 only):
    DOCKER_MODS=linuxserver/calibre-web:calibre
    Thanks again for the great start into calibre-web

  5. Sorry, maybe I m to stupid or with the guide is somethign wrong. I fail since hours with that.

    When I use the image in your guide, all connections will refused, there is no firewall in place. I only see in the log, that a directory is missing. So I would expect, that he create that on his own, also to create it manuely does not change something.

    Maybe you can help, this really sucks

    linuxserver-calibre-web1
    date stream content
    2021-02-21 11:16:26 stdout [services.d] done.
    2021-02-21 11:16:26 stdout [services.d] starting services
    2021-02-21 11:16:26 stdout [cont-init.d] done.
    2021-02-21 11:16:26 stdout [cont-init.d] 99-custom-scripts: exited 0.
    2021-02-21 11:16:26 stdout [custom-init] no custom files found exiting…
    2021-02-21 11:16:26 stdout [cont-init.d] 99-custom-scripts: executing…
    2021-02-21 11:16:26 stdout [cont-init.d] 30-config: exited 0.
    2021-02-21 11:16:26 stdout [cont-init.d] 30-config: executing…
    2021-02-21 11:16:26 stdout [cont-init.d] 10-adduser: exited 0.
    2021-02-21 11:16:26 stdout
    2021-02-21 11:16:26 stdout ————————————-
    2021-02-21 11:16:26 stdout User gid: 100
    2021-02-21 11:16:26 stdout User uid: 1036
    2021-02-21 11:16:26 stdout
    2021-02-21 11:16:26 stdout ————————————-
    2021-02-21 11:16:26 stdout GID/UID
    2021-02-21 11:16:26 stdout ————————————-
    2021-02-21 11:16:26 stdout https://www.linuxserver.io/donate/
    2021-02-21 11:16:26 stdout To support LSIO projects visit:
    2021-02-21 11:16:26 stdout
    2021-02-21 11:16:26 stdout ————————————-
    2021-02-21 11:16:26 stdout Brought to you by linuxserver.io
    2021-02-21 11:16:26 stdout
    2021-02-21 11:16:26 stdout
    2021-02-21 11:16:26 stdout |_| |___/ |_| \__/
    2021-02-21 11:16:26 stdout | | \__ \ | | | () |
    2021-02-21 11:16:26 stdout | | / __| | | / \
    2021-02-21 11:16:26 stdout | | ___ _ __
    2021-02-21 11:16:26 stdout _ ()
    2021-02-21 11:16:26 stdout ————————————-
    2021-02-21 11:16:26 stdout
    2021-02-21 11:16:26 stdout usermod: no changes
    2021-02-21 11:16:26 stdout [cont-init.d] 10-adduser: executing…
    2021-02-21 11:16:26 stdout [cont-init.d] 01-envfile: exited 0.
    2021-02-21 11:16:26 stdout [cont-init.d] 01-envfile: executing…
    2021-02-21 11:16:26 stdout [cont-init.d] executing container initialization scripts…
    2021-02-21 11:16:26 stdout [fix-attrs.d] done.
    2021-02-21 11:16:26 stdout [fix-attrs.d] applying ownership & permissions fixes…
    2021-02-21 11:16:26 stdout [s6-init] ensuring user provided files have correct perms…exited 0.
    2021-02-21 11:16:26 stdout [s6-init] making user provided files available at /var/run/s6/etc…exited 0.
    2021-02-21 11:16:21 stdout [s6-finish] sending all processes the KILL signal and exiting.
    2021-02-21 11:16:18 stdout [s6-finish] sending all processes the TERM signal.
    2021-02-21 11:16:17 stdout [s6-finish] waiting for services.
    2021-02-21 11:16:17 stdout [cont-finish.d] done.
    2021-02-21 11:16:17 stdout [cont-finish.d] executing container finish scripts…
    2021-02-21 11:12:54 stdout [services.d] done.
    2021-02-21 11:12:54 stdout [services.d] starting services
    2021-02-21 11:12:54 stdout [cont-init.d] done.
    2021-02-21 11:12:54 stdout [cont-init.d] 99-custom-scripts: exited 0.
    2021-02-21 11:12:54 stdout [custom-init] no custom files found exiting…
    2021-02-21 11:12:54 stdout [cont-init.d] 99-custom-scripts: executing…
    2021-02-21 11:12:54 stdout [cont-init.d] 30-config: exited 0.
    2021-02-21 11:12:54 stdout cp: cannot stat ‘/app/calibre-web/gdrive.db’: No such file or directory
    2021-02-21 11:12:54 stdout [cont-init.d] 30-config: executing…
    2021-02-21 11:12:54 stdout [cont-init.d] 10-adduser: exited 0.
    2021-02-21 11:12:54 stdout
    2021-02-21 11:12:54 stdout ————————————-
    2021-02-21 11:12:54 stdout User gid: 100
    2021-02-21 11:12:54 stdout User uid: 1036
    2021-02-21 11:12:54 stdout
    2021-02-21 11:12:54 stdout ————————————-
    2021-02-21 11:12:54 stdout GID/UID
    2021-02-21 11:12:54 stdout ————————————-
    2021-02-21 11:12:54 stdout https://www.linuxserver.io/donate/
    2021-02-21 11:12:54 stdout To support LSIO projects visit:
    2021-02-21 11:12:54 stdout
    2021-02-21 11:12:54 stdout ————————————-
    2021-02-21 11:12:54 stdout Brought to you by linuxserver.io
    2021-02-21 11:12:54 stdout
    2021-02-21 11:12:54 stdout
    2021-02-21 11:12:54 stdout |_| |___/ |_| \__/
    2021-02-21 11:12:54 stdout | | \__ \ | | | () |
    2021-02-21 11:12:54 stdout | | / __| | | / \
    2021-02-21 11:12:54 stdout | | ___ _ __
    2021-02-21 11:12:54 stdout _ ()
    2021-02-21 11:12:54 stdout ————————————-
    2021-02-21 11:12:54 stdout
    2021-02-21 11:12:53 stdout [cont-init.d] 10-adduser: executing…
    2021-02-21 11:12:53 stdout [cont-init.d] 01-envfile: exited 0.
    2021-02-21 11:12:53 stdout [cont-init.d] 01-envfile: executing…
    2021-02-21 11:12:53 stdout [cont-init.d] executing container initialization scripts…
    2021-02-21 11:12:53 stdout [fix-attrs.d] done.
    2021-02-21 11:12:53 stdout [fix-attrs.d] applying ownership & permissions fixes…
    2021-02-21 11:12:53 stdout [s6-init] ensuring user provided files have correct perms…exited 0.
    2021-02-21 11:12:53 stdout [s6-init] making user provided files available at /var/run/s6/etc…exited 0.

  6. Thank you for your tutorial. I’m going to follow the others.
    Do you know how to setup a folder for uploading books (auto import from specified folder)? I have only found an upload button for manual action.

    • Calibre-Web doesn’t import books, it just reads your Calibre database. If you’re using the Thraxis version of LazyLibrarian you can import the book through there and Calibre will process it properly into your /books directory for use in Calibre-Web.

LEAVE A REPLY

Please enter your comment!
Please enter your name here