Setting up your own ebook library

This article is about setting up you own ebook library with support for the OPDS catalog format . The COPS ebook catalog can read a Calibre library and expose it as a website. It is developed on PHP.


  • Prepare a Linux system. In this guide we are using Ubuntu 14.04.4.
  • Have a DNS A record pointing to the IP of your server.

Install necessary packages

$ sudo apt-get -y samba nginx php5-fpm php5-gd php5-sqlite php5-json php5-intl git

Setup a SAMBA share

Samba is needed for sharing the Calibre library directory with the library administrator. Alternatively you could use NFS or even OwnCloud.


It is a security risk to expose Samba on a public server. Restrict it through firewall or use OwnCloud instead.

  • Tweak the Samba configuration file (/etc/samba/smb.conf):
    #  unix password sync = yes
       unix password sync = no
    #  pam password change = yes
       pam password change = no
  • Add a Samba share for calibre (/etc/samba/smb.conf):
    path = /srv/calibre
    valid users = calibre
    write list = calibre
    read only = no
  • Restart Samba services:
    $ sudo service smbd restart ; sudo service nmbd restart
  • Add the calibre user:
    $ useradd -m -d /srv/calibre -s /usr/sbin/nologin calibre
    $ smbpasswd -a calibre

Setup Calibre

  • Now you should setup Calibre on your PC. On Debian/Ubuntu:
    $ sudo apt-get -y install calibre

    Windows users can download it from here:

  • Configure Calibre to use the calibre share as its catalog:

    • You can "mount" the calibre share on Linux or "map" the share on Windows.
    • Create an ebook Directory under the calibre share.
    • Create a new Calibre library inside the ebook directory. From the Calibre menu:
      • Callibre Library –> Switch/create library -> Create an empty Library at the new location and fill the path in the "New Location" text field.
    • If you get an error about "Corrupted database" just click ‘Yes" to rebuilt it.
    • Start adding books


  • Download the software:
    $ mkdir /var/www
    $ cd /var/www
    $ git clone
  • Setup COPS:

    Under the /var/www/cops/ directory, copy the config_default.php.example to config_default.php:

    $ cp config_local.php.example config_local.php

    Make the following changes in config_default.php:

    < ?php
        if (!isset($config))
            $config = array();
         * The directory containing calibre's metadata.db file, with sub-directories
         * containing all the formats.
         * BEWARE : it has to end with a /
        $config['calibre_directory'] = '/srv/calibre/ebooks/';
         * Catalog's title
        $config['cops_title_default'] = 'My Ebook Portal';
        $config['calibre_internal_directory'] = '/ebooks/';
        $config['cops_full_url'] = '';
        $config['cops_x_accel_redirect'] = 'X-Accel-Redirect';
         * use URL rewriting for downloading of ebook in HTML catalog
         * See README for more information
         *  1 : enable
         *  0 : disable
        $config['cops_use_url_rewriting'] = '1';

Setup nginx

  • Create an /etc/nginx/sites-available/
    server {
        listen 80 default_server;
        listen [::]:80 default_server ipv6only=on;
        access_log  /var/log/nginx/cops.access.log;
        error_log /var/log/nginx/cops.error.log;
        root   /var/www/cops;
        #index feed.php;
        index index.php;
        #Useful only for Kobo reader
        location /download/ {
              rewrite ^/download/(\d+)/(\d+)/.*\.(.*)$ /fetch.php?data=$1&db=$2&type=$3 last;
              rewrite ^/download/(\d+)/.*\.(.*)$ /fetch.php?data=$1&type=$2 last;
            #Can break loading the images - if you don't see anything, comment
            location ~ ^/images.*\.(gif|png|ico|jpg)$ {
                    expires 31d;
            #Can also break loading the images, comment if it happens
            location ~ .(js|css|eot|svg|woff|ttf)$ {
                    expires 31d;
        #Not necessarily correct, it depends on distro.
        location ~ \.php$ {
           try_files $uri =404;
           include /etc/nginx/fastcgi_params;
           fastcgi_param   SCRIPT_FILENAME  $document_root$fastcgi_script_name;
           fastcgi_pass    unix:/run/php5-fpm.sock;
        location /ebooks {
            root /srv/calibre;


    The feed.php setting was redirecting me to an XML site with this error: This XML file does not appear to have any style information associated with it. The document tree is shown below. So I am using index.php instead, as the index file.

  • Enable the site and disable the default:
    $ cd /etc/nginx/sites-enabled/
    $ sudo ln -s /etc/nginx/sites-available/
    $ sudo unlink default
  • Restart nginx and php5-fpm:
    $ sudo service php5-fpm restart ; sudo service nginx restart
  • Change permissions to let nginx write to the library:
    $ usermod -a -G calibre www-data
    $ chmod -R g+w /srv/calibre/ebooks/

Now you can navigate to and enjoy your newly created ebook library!