Add Kavita as the new book server

Runs next to Calibre-Web at a temporary kavita. subdomain until it takes
over books. Each book lives in its own folder under
/opt/stacks/kavita/books, because Kavita names a book after its folder.
The admin password is in the vault as vault_kavita.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Phil
2026-10-31 08:19:57 -06:00
co-authored by Claude Opus 5.5
parent e17e37be31
commit ea3092779c
7 changed files with 60 additions and 1 deletions
+2
View File
@@ -55,6 +55,8 @@
ip: "{{ network.netcup_ip }}"
- name: id
ip: "{{ network.netcup_ip }}"
- name: kavita
ip: "{{ network.netcup_ip }}"
- name: nerder.land
dns_records:
- name: "forms"
+1
View File
@@ -13,6 +13,7 @@ subdomains:
media: "media.{{ primary_domain }}"
audio: "audio.{{ primary_domain }}" # Audiobookshelf
books: "books.{{ primary_domain }}" # Calibre
kavita: "kavita.{{ primary_domain }}" # Kavita (temporary, moves to books)
models: "models.{{ primary_domain }}" # Manyfold
paper: "paper.{{ primary_domain }}" # Paperless-NGX
syncthing: "syncthing.{{ primary_domain }}"
+1 -1
View File
@@ -4,7 +4,7 @@
service_categories:
infrastructure: ["caddy", "authentik", "dockge"]
development: ["gitea", "bytestash"]
media: ["audiobookshelf", "calibre", "dir2opds", "hoarder", "kosync", "manyfold"]
media: ["audiobookshelf", "calibre", "kavita", "dir2opds", "hoarder", "kosync", "manyfold"]
productivity: ["paperlessngx", "baikal", "syncthing", "heyform", "dawarich", "obsidian-livesync", "gokapi"]
communication: ["gotosocial", "listmonk"]
monitoring: ["glance", "changedetection", "appriseapi", "gotify", "cronmaster"]
+23
View File
@@ -0,0 +1,23 @@
- name: make kavita directories
ansible.builtin.file:
path: "{{ item }}"
state: directory
owner: phil
group: phil
loop:
- /opt/stacks/kavita
- /opt/stacks/kavita/config
- /opt/stacks/kavita/books
- name: Template out the compose file
ansible.builtin.template:
src: kavita-compose.yml.j2
dest: /opt/stacks/kavita/compose.yml
owner: root
mode: '0644'
- name: deploy kavita stack
community.docker.docker_compose_v2:
project_src: /opt/stacks/kavita
files:
- compose.yml
+4
View File
@@ -9,6 +9,10 @@
import_tasks: calibre.yml
tags: calibre
- name: Install kavita
import_tasks: kavita.yml
tags: kavita
+4
View File
@@ -20,6 +20,10 @@ books.thesatelliteoflove.com {
reverse_proxy authentik-server-1:9000
}
{{ subdomains.kavita }} {
reverse_proxy kavita:5000
}
audio.thesatelliteoflove.com {
reverse_proxy audiobookshelf-audiobookshelf-1:80
}
@@ -0,0 +1,25 @@
---
services:
kavita:
image: jvmilazz0/kavita:latest
container_name: kavita
environment:
- TZ=America/Denver
volumes:
- ./config:/kavita/config
# Kavita names a book after its folder, so each book goes in its own folder:
# scp -r "Book Title/" docker-01:/opt/stacks/kavita/books/
- ./books:/books
extra_hosts:
- "{{ subdomains.pocketid }}:{{ docker.hairpin_ip }}"
restart: unless-stopped
labels:
glance.name: Kavita
glance.icon: si:book
glance.url: https://{{ subdomains.kavita }}/
glance.description: Book server
mag37.dockcheck.update: true
networks:
default:
external: true
name: {{ docker.network_name }}