Introduction
If you've been collecting ebooks and comics for more than a year, you already know the problem. Half your library lives in a Calibre folder on an old laptop, the manga you downloaded is scattered across three USB drives, and reading on your tablet means emailing files to yourself or fighting with a cloud reader that doesn't understand CBZ files. It works, technically. It's just never in one place.
Kavita fixes that by giving your books, comics, and manga a single home you control — a web-based reader you can open from a phone, tablet, or laptop, with your entire collection already indexed and searchable. This guide walks through installing it inside an LXC container on Proxmox VE, using the community helper script that handles the .NET runtime and service setup for you.
You don't need prior Linux experience for this. Every command gets explained before you run it, and by the end you'll have a working library server plus a decent sense of how to point it at your actual book and comic collection.
What You Will Learn
- What Kavita is and which file formats it actually reads
- Why an LXC container is a good fit for this kind of app
- How to create the container and install Kavita with one script
- How to mount your existing book and comic folders into the container
- The specific errors people run into with this setup, and why they happen
- A few settings worth changing before you invite anyone else to use it
What Is This Feature?
Kavita is an open-source digital library and reading server. You point it at folders full of ebooks and comics, it scans and organizes them, and it serves up a clean reading interface in your browser — page turns, bookmarks, reading progress, and cover art included. It reads EPUB and PDF for books, and CBZ, CBR, and CB7 archives for comics and manga, along with raw folders of images for manga that hasn't been packaged into an archive.
Under the hood, Kavita is built on .NET, Microsoft's cross-platform runtime. That's a detail you don't need to think about day to day, but it does explain one quirk you'll run into later around folder scanning, so keep it in the back of your mind.
We're installing this in an LXC container rather than a full virtual machine. LXC (Linux Containers) shares the Proxmox host's kernel instead of booting its own, so it starts almost instantly and only uses the resources the app actually needs. Kavita is a single lightweight service, not a whole operating system's worth of software, so a container is the right amount of overhead — you're not paying for a virtual BIOS and a second kernel just to read a comic.
Kavita also speaks OPDS, an open standard that lets dedicated reading apps — on your phone, e-reader, or tablet — connect to your server and pull books directly, the same way a podcast app pulls episodes from an RSS feed. That's what makes it more than just a website: your library becomes something other apps can actually read from.
Why Would You Use It?
The obvious pitch is consolidation. If you've got ebooks in one folder, comics in another, and manga split across a dozen subfolders you keep meaning to organize, Kavita turns that mess into shelves you can browse, search, and pick up exactly where you left off — on whatever device you grabbed on your way out the door.
Compared to reading everything through Calibre's desktop app or a cloud service tied to one storefront, self-hosting gets you a few things those don't:
- One reading progress that follows you across every device, not per-app bookmarks
- No dependency on a storefront staying in business or keeping your purchases available
- Real support for manga and comics, which most ebook readers treat as an afterthought
- Metadata and cover art pulled automatically, so your shelf actually looks like a shelf
It's not a replacement for Calibre if you're heavily into format conversion or metadata editing — Kavita reads what you give it, it doesn't convert an AZW3 into an EPUB for you. Plenty of people run both: Calibre for wrangling files, Kavita for actually reading them. Honestly, once you've got a library scanned in and you're reading from your phone on the bus, going back to emailing yourself PDFs feels absurd.
Prerequisites
Before you start, make sure you have:
- A working Proxmox VE host on version 8.x or 9.x (this guide was tested on 9.2)
- At least 8 GB of free space for the container itself, plus however much your actual book and comic collection needs on separate storage
- A network bridge (usually vmbr0) with DHCP available, or a static IP you've already picked out
- Root or administrative access to the Proxmox VE shell
- Your existing ebook/comic files somewhere accessible to the Proxmox host — a local disk, a mounted NAS share, whatever you're already using
You don't need to know anything about .NET or how OPDS works to follow this. If you can copy a command into a terminal, you can get this running in about ten minutes.
Step-by-Step Tutorial
Log in to the Proxmox VE web interface, click your node's name in the left tree, then click >_ Shell near the top. This opens a root terminal on the Proxmox host itself — not inside any VM or container.
Paste in the following command and press Enter:
bash -c "$(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/ct/kavita.sh)"
This downloads and runs the Kavita install script from the Proxmox VE Community Scripts project. A colored menu appears asking for Default Settings or Advanced Settings.
Default Settings creates an unprivileged Debian 13 container with 2 CPU cores, 2048 MB of RAM, and an 8 GB disk, and grabs an address over DHCP. That's plenty for Kavita itself — the app is light. What it doesn't cover is your actual library, which lives outside that 8 GB disk (more on that in a second). Pick Advanced Settings instead if you want a static IP set up front, a specific container ID, or a different resource split.
Once you confirm, the script builds the container, installs the .NET runtime, downloads Kavita, and sets it up as a systemd service. This takes two to three minutes on a normal connection. When it's done, it prints something like:
Access it using the following URL:
http://192.168.1.152:5000
Open that address in a browser. You'll land on Kavita's first-run setup screen instead of a login page — there's no default admin account here, which is worth appreciating. You create a username, email, and password on the spot, click Register, and that becomes your admin account.
Now the part that trips people up if they skip it: Kavita needs to actually see your files. The container's own disk isn't where your collection should live — you want to mount your existing library folder from the Proxmox host into the container. Back in the Proxmox host shell, run:
pct set 152 -mp0 /mnt/pve/library-storage/books,mp=/mnt/books
Swap 152 for your container's actual ID, and the source path for wherever your books and comics currently live — a local directory, or a share you've already mounted on the host. This adds a bind mount, meaning the folder isn't copied; the container sees the exact same files the host does, live, with no duplication and no syncing to keep track of.
Restart the container from the Proxmox UI (or run pct restart 152) so the new mount point takes effect. Then, back in Kavita's web UI, go to Admin Panel → Libraries → Add Library. Give it a name, pick a type — Book, Comic, or Manga, since Kavita organizes and scrapes metadata differently depending on which you choose — and point the folder path at /mnt/books (or a subfolder of it). Kick off a scan, and within a minute or two your shelf fills in with covers and titles.
Commands Explained
A quick rundown of what ran and why:
curl -fsSL <url>downloads the install script.-ffails silently instead of dumping an HTML error page,-shides the progress bar,-Sstill shows an error if one occurs, and-Lfollows redirects.bash -c "$(...)"runs the downloaded script text immediately without saving a file first.pct set <CTID> -mp0 <host-path>,mp=<container-path>adds a bind-mounted folder to an existing container. You can add more with-mp1,-mp2, and so on if your comics and books live in separate places.pct restart <CTID>restarts the container so a newly added mount point is picked up.pct enter <CTID>drops you into a root shell inside the container, useful for checking logs or file permissions directly.
To update Kavita later, run the same install command again from the Proxmox host shell. The script detects the existing container and updates the app in place rather than creating a new one.
Common Errors
The most specific issue you'll hit with Kavita, as opposed to other self-hosted apps in a container, involves folder scanning silently failing or behaving oddly on certain file systems. This traces back to a known .NET globalization issue (tracked publicly as GitHub issue #1323 in the community-scripts repo). The fix is to add a line to the container's configuration on the Proxmox host, not inside the container itself:
echo "lxc.environment: DOTNET_SYSTEM_GLOBALIZATION_INVARIANT=1" >> /etc/pve/lxc/152.conf
Replace 152 with your container's ID, then restart the container for it to take effect.
An empty library after a scan almost always means a permissions problem, not a Kavita bug. Unprivileged LXC containers (the default, and the right choice for security) remap user and group IDs, so a folder owned by your regular user on the host can end up looking inaccessible from inside the container. Check ownership with ls -la on the mounted path inside the container; if it shows as nobody:nogroup or similarly odd, that's your answer.
"This site can't be reached" at the container's address usually means one of two things: the container isn't running (check for a green status in the Proxmox UI), or it picked up a new DHCP lease and the IP changed. That second one is exactly why setting a static IP or DHCP reservation early saves you a headache later.
Port conflicts on 5000 do happen, mostly if you're also running something like a Synology NAS interface or another dev tool that defaults to the same port on your network. Kavita's own port isn't the problem in that case — it's whatever else is answering on 5000 that you're actually hitting.
Troubleshooting
Start by confirming the container is actually running — green status in the Proxmox UI, or pct status 152 from the host shell. If it's stopped, start it before doing anything else.
From inside the container (pct enter 152), check the service itself:
systemctl status kavita
If it's not active, restart it and watch the logs for the actual error:
systemctl restart kavita
journalctl -u kavita -n 50 --no-pager
If your library scan finds zero files, verify the mount actually worked before touching anything in Kavita itself:
ls -la /mnt/books
If that comes back empty inside the container but the folder clearly has files on the host, the bind mount config is wrong or the container needs a restart to pick it up — go back and double-check the pct set command and the source path.
If the web UI loads but scanning hangs on a particular file, that file is usually corrupted or in a format Kavita doesn't recognize despite the extension. Move it out of the folder and rescan; if the scan completes, you've found your problem file.
Best Practices
Set a static IP or DHCP reservation for this container before you invest time organizing libraries. Kavita doesn't care about its own IP the way some apps do, but you'll care, every time it changes and your bookmarks stop working.
Mount your library folders read-only where you can — add ,ro=1 to the end of your pct set -mp0 line. Kavita only needs to read your files to scan and serve them; it has no business writing to your original collection, and a read-only mount is one less way something can go wrong.
Don't expose port 5000 straight to the internet if you want remote access. Put it behind a reverse proxy with HTTPS instead — Nginx Proxy Manager works fine for this — especially since OPDS feeds carry your reading credentials with every request from a mobile app.
Back up the container with Proxmox's built-in vzdump backups on a schedule. The container itself is small and disposable since your actual books live on separate storage, but Kavita's database holds reading progress, ratings, and your library configuration — losing that means rebuilding your setup from scratch even though the files themselves are safe.
Separate your libraries by type from the start. A single "Everything" library mixing books, comics, and manga works, technically, but Kavita's metadata scraping and reading progress tracking both work better when Comics and Manga are their own libraries instead of getting lumped in with novels.
Frequently Asked Questions
Is Kavita free?
Yes, it's open source with no paid tier or feature gate for self-hosting.
What file formats does it support?
EPUB and PDF for books, plus CBZ, CBR, and CB7 for comics and manga, including loose image folders for unpacked manga chapters.
Do I still need Calibre?
Not to read, no. Kavita doesn't convert formats or edit metadata the way Calibre does, so some people keep both — Calibre for prepping files, Kavita for actually reading them.
Can I read on my phone or e-reader?
Yes, either through the mobile browser or a dedicated OPDS-compatible reading app pointed at your server.
How much storage do I actually need?
The container itself only needs the default 8 GB. Your real storage requirement depends entirely on your book and comic collection, which is why it lives on a separate bind-mounted folder instead of the container's disk.
Does Kavita support multiple user accounts?
Yes, with per-user reading progress and permissions, so family members or roommates sharing the server don't step on each other's bookmarks.
Conclusion
Your books, comics, and manga now live in one place, reachable from whatever's in your hand at the time — and none of it depends on a storefront staying online or a cloud reader deciding to change its terms.
Add your real library next, split it into a few sensible categories, and give the mobile reading apps a try once the scan finishes. The setup was ten minutes; the part where you actually use it starts now.