diff --git a/dns.yml b/dns.yml index 8f3b9d2..f0772ee 100644 --- a/dns.yml +++ b/dns.yml @@ -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" diff --git a/group_vars/all/domains.yml b/group_vars/all/domains.yml index d684f74..8b9eafc 100644 --- a/group_vars/all/domains.yml +++ b/group_vars/all/domains.yml @@ -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 }}" diff --git a/group_vars/docker/services.yml b/group_vars/docker/services.yml index aaa01e0..09f36f7 100644 --- a/group_vars/docker/services.yml +++ b/group_vars/docker/services.yml @@ -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"] diff --git a/roles/docker/tasks/media/kavita.yml b/roles/docker/tasks/media/kavita.yml new file mode 100644 index 0000000..2c85a0a --- /dev/null +++ b/roles/docker/tasks/media/kavita.yml @@ -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 diff --git a/roles/docker/tasks/media/main.yml b/roles/docker/tasks/media/main.yml index 00c6359..e446071 100644 --- a/roles/docker/tasks/media/main.yml +++ b/roles/docker/tasks/media/main.yml @@ -9,6 +9,10 @@ import_tasks: calibre.yml tags: calibre +- name: Install kavita + import_tasks: kavita.yml + tags: kavita + diff --git a/roles/docker/templates/Caddyfile.j2 b/roles/docker/templates/Caddyfile.j2 index b324cf2..9af1c27 100644 --- a/roles/docker/templates/Caddyfile.j2 +++ b/roles/docker/templates/Caddyfile.j2 @@ -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 } diff --git a/roles/docker/templates/kavita-compose.yml.j2 b/roles/docker/templates/kavita-compose.yml.j2 new file mode 100644 index 0000000..3bee442 --- /dev/null +++ b/roles/docker/templates/kavita-compose.yml.j2 @@ -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 }}