Calibre-Web: Books Not Loading — Fix
The Problem
Calibre-Web starts but shows an empty library, displays “DB Location is not Valid” on the setup page, or throws errors like:
calibre-web | [ERROR] [cps.web] Cannot access metadata.db
calibre-web | [ERROR] DatabaseException: database is not configured
You can access the web UI but can’t see any books, or the initial setup page keeps rejecting the database path.
The Cause
Calibre-Web requires a valid Calibre metadata.db file to function. Unlike other apps that create their own database on first run, Calibre-Web reads an existing Calibre library. The most common issues are:
- Wrong database path — the container path doesn’t point to where
metadata.dbactually lives - File permissions — the container user can’t read
metadata.dbor the library directory - No Calibre library exists — you mounted an empty directory without first creating a library in Calibre desktop
- Volume mount mismatch — the host path exists but the container mount doesn’t match what you entered in the setup wizard
The Fix
Method 1: Verify the Database Path (Most Common)
On the Calibre-Web setup page (or in the admin settings), the “Location of Calibre Database” must point to the container path where metadata.db lives — not the host path.
If your Docker Compose has:
volumes:
- /home/user/calibre-library:/books
Then the database path in Calibre-Web must be /books — not /home/user/calibre-library.
Verify metadata.db exists at the mounted location:
# Check from outside the container
ls -la /home/user/calibre-library/metadata.db
# Check from inside the container
docker exec calibre-web ls -la /books/metadata.db
If metadata.db doesn’t exist, you need to create a Calibre library first (see Method 3).
Method 2: Fix File Permissions
The LinuxServer.io image runs as the user specified by PUID and PGID. The library directory and metadata.db must be readable by that user:
# Check current ownership
ls -la /home/user/calibre-library/metadata.db
# Fix permissions (use the same PUID/PGID from your docker-compose.yml)
sudo chown -R 1000:1000 /home/user/calibre-library/
sudo chmod -R 755 /home/user/calibre-library/
If you’re using the official lscr.io/linuxserver/calibre-web image, ensure your Compose file includes:
environment:
- PUID=1000
- PGID=1000
These must match the owner of the library directory on the host.
Method 3: Create a Calibre Library (If None Exists)
Calibre-Web cannot create a library from scratch. You need a metadata.db file created by Calibre desktop or the Calibre CLI:
# Option A: Create an empty library with calibredb
# Install Calibre CLI tools first
sudo apt install calibre
# Initialize an empty library
calibredb --library-path /home/user/calibre-library list
# This creates metadata.db in the specified directory
# Option B: Download Calibre desktop, create a library, add at least one book, then copy the directory to your server
After creating the library, restart Calibre-Web:
docker compose restart calibre-web
Method 4: Fix Database Corruption
If metadata.db exists but Calibre-Web still can’t read it:
# Check database integrity
sqlite3 /home/user/calibre-library/metadata.db "PRAGMA integrity_check;"
# Should output: ok
# If corrupted, restore from backup
cp /home/user/calibre-library/metadata_db_prefs_backup.json /tmp/
# Then recreate the library from Calibre desktop
Method 5: Fix Read-Only Filesystem Errors
If the container logs show database is locked or attempt to write a readonly database:
# Ensure the volume is not mounted read-only
# WRONG:
volumes:
- /home/user/calibre-library:/books:ro
# CORRECT (Calibre-Web needs write access):
volumes:
- /home/user/calibre-library:/books
Calibre-Web writes to metadata.db when you edit metadata, add books, or update covers. It needs read-write access.
Prevention
- Always verify
metadata.dbexists before starting Calibre-Web for the first time - Use consistent
PUID/PGIDvalues that match the library directory owner - Back up
metadata.dbregularly — it’s the critical file for your entire library - When migrating, copy the entire Calibre library directory (not just
metadata.db) - Test the database path from inside the container, not from the host
Related
Get self-hosting tips in your inbox
Get the Docker Compose configs, hardware picks, and setup shortcuts we don't put in articles. Weekly. No spam.
Comments