---
title: "Deploy Calibre Web"
description: "Self-hosted e-book library and reader, with a generated admin password"
category: "Other"
url: https://railway.com/deploy/calibre-web-1
---

# Deploy Calibre Web

Self-hosted e-book library and reader, with a generated admin password

**[Deploy Calibre Web on Railway](https://railway.com/template/calibre-web-1)**

Machine-readable deploy manifest (JSON, validated by TemplateCI): https://railway.com/deploy/calibre-web-1/manifest.json

- **Creator:** Agaz Self-Host
- **Category:** Other
- **Total deploys:** 1

## Template content

### calibre-web https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/svg/calibre-web.svg

- **Image:** linuxserver/calibre-web:0.6.27-ls409@sha256:8eabbc9ac4d7fcbc252434493078ba22e4e8c3aa461e11b102020b040c5fc3e6
- **Start command:** `/bin/sh -c 'set -e; mkdir -p /config/library; if [ ! -f /config/library/metadata.db ]; then curl -fsSL -o /tmp/metadata.db https://raw.githubusercontent.com/janeczku/calibre-web/0.6.27/library/metadata.db; echo "fac2f7e37ef4bc0fb2955e9a3f612604707d4ef573af5c28bd7a8369339f4bd4  /tmp/metadata.db" | sha256sum -c -; python3 -c "import sqlite3,uuid; c=sqlite3.connect(\"/tmp/metadata.db\"); c.execute(\"update library_id set uuid=?\", (str(uuid.uuid4()),)); c.commit()"; mv /tmp/metadata.db /config/library/metadata.db; echo "Created an empty Calibre library in /config/library"; fi; cd /app/calibre-web; export CALIBRE_DBPATH=/config; if [ ! -f /config/app.db ]; then python3 cps.py -d > /dev/null 2>&1 || true; python3 -c "import sqlite3; c=sqlite3.connect(\"/config/app.db\"); c.execute(\"update settings set config_calibre_dir=?, config_uploading=1, config_kepubifypath=?\", (\"/config/library\", \"/usr/bin/kepubify\")); c.commit()"; echo "Created app.db with library /config/library and uploads on"; fi; if [ -z "$ADMIN_PASSWORD" ]; then echo "ADMIN_PASSWORD is not set; refusing to start with the default admin password"; exit 1; fi; H=$(printf %s "$ADMIN_PASSWORD" | sha256sum | cut -d" " -f1); if [ "$(cat /config/.admin-password.sha256 2>/dev/null)" != "$H" ]; then python3 cps.py -s "admin:$ADMIN_PASSWORD" || { echo "Could not set the admin password (needs 8+ chars with upper, lower, digit and special character)"; exit 1; }; echo "$H" > /config/.admin-password.sha256; fi; exec /init'`
- **Health check:** /login
- **Public domain:** Yes

## Documentation

# Deploy and Host Calibre-Web on Railway

Calibre-Web is an open-source web app for browsing, reading and downloading e-books from a Calibre library. It shows your books with covers and metadata, has an in-browser reader for EPUB, PDF and comics, and supports multiple users, shelves, uploads, metadata editing, OPDS feeds and Kobo sync.

## About Hosting Calibre-Web

Calibre-Web is a single Python web service that keeps its settings in a SQLite file (`app.db`) and reads books from a Calibre library folder with its own `metadata.db`. Hosting it means running one container, keeping both the settings and the library on persistent storage, and putting it behind HTTPS. This template runs the LinuxServer.io image pinned to Calibre-Web 0.6.27, with one volume on `/config`. On the first start it creates an empty Calibre library in `/config/library`, turns on uploads, and replaces the well-known default admin password (`admin123`) with a generated one. Public sign-up and anonymous browsing stay off.

## Common Use Cases

* Read your e-book collection in any browser, from any device
* Share a family or team library with separate user accounts and shelves
* Serve books to e-reader apps over OPDS, or sync them to Kobo devices

## Dependencies for Calibre-Web Hosting

* A persistent volume for the settings database and the Calibre library
* A Calibre library (`metadata.db`); the template creates an empty one on first start

### Deployment Dependencies

* [Calibre-Web on GitHub](https://github.com/janeczku/calibre-web)
* [Calibre-Web 0.6.27 release](https://github.com/janeczku/calibre-web/releases/tag/0.6.27)
* [LinuxServer.io Calibre-Web image](https://docs.linuxserver.io/images/docker-calibre-web/)
* [Calibre-Web wiki (configuration, Kobo sync, reverse proxies)](https://github.com/janeczku/calibre-web/wiki)

### Implementation Details

Log in as `admin` with the password in the service's `ADMIN_PASSWORD` variable. If you change that variable later, the next deploy sets it as the admin password again. A password changed in the web UI stays as it is until then. The password must have at least 8 characters with an upper-case letter, a lower-case letter, a digit and a special character, or the deploy stops with a clear error instead of starting with a weak password.

Upload books with the **Upload** button. They are stored in `/config/library` on the volume. To use an existing Calibre library, copy its folder (including `metadata.db`) onto the volume and point **Admin → Edit Calibre Database Configuration** at it.

The image is `linuxserver/calibre-web:0.6.27-ls409`, pinned by digest. E-book conversion (the optional `universal-calibre` mod) is not included.

## Why Deploy Calibre-Web on Railway?


Railway is a singular platform to deploy your infrastructure stack. Railway will host your infrastructure so you don't have to deal with configuration, while allowing you to vertically and horizontally scale it.

By deploying Calibre-Web on Railway, you are one step closer to supporting a complete full-stack application with minimal burden. Host your servers, databases, AI agents, and more on Railway.



## Similar templates

- [Rocky Linux](https://railway.com/deploy/rocky-linux) — Hosted Rocky Linux 9 workspace with SSH and persistent storage. 🚀
- [Foundry Virtual Tabletop](https://railway.com/deploy/X5tR6G) — A Self-Hosted & Modern Roleplaying Platform
- [Letta Code Remote](https://railway.com/deploy/letta-code-remote) — Run a Letta Code agent 24/7. No inbound ports, just deploy.

Open this page in a browser: https://railway.com/deploy/calibre-web-1
