Skip to content

Deprecated

This image is no longer actively maintained or built.

Reason: Upstream development has stopped and the repository has been deleted.

Successor

See https://daemonless.io/images/grimmory for an alternative.

BookLore

Description / nameInput element
Container Registry
Container Configuration Root Path
Global /books Path
Timezone
User ID
Group ID
BookLore /bookdrop Path
BookLore /app/data Path

Build Status Last Commit

Self-hosted digital library with smart shelves, metadata, OPDS support, and built-in reader.

Registry ghcr.io/daemonless/booklore
Daemonless daemonless/booklore
Source booklore-app/booklore
Website booklore.org

Version Tags

Tag Description Best For
latest Upstream Binary. Built from official release. Most users — recommended.

Before deploying, ensure your host environment is ready. See the Quick Start Guide for host setup instructions, including the security model for host vs. container privileges.

Deployment

services:
  booklore:
    image: "ghcr.io/daemonless/booklore:latest"
    container_name: booklore
    environment:
      - PUID=1000
      - PGID=1000
      - TZ=UTC
      - SPRING_DATASOURCE_URL=jdbc:mariadb://127.0.0.1:3306/booklore  # MariaDB JDBC URL (e.g., jdbc:mariadb://mariadb:3306/booklore)
      - SPRING_DATASOURCE_USERNAME=booklore  # Database username
      - SPRING_DATASOURCE_PASSWORD=changeme  # Database password
      - JAVA_OPTS=  # Additional JVM options
    volumes:
      - "/path/to/containers/booklore/data:/app/data"
      - "/path/to/books:/books"
      - "/path/to/containers/booklore/bookdrop:/bookdrop"
    restart: unless-stopped
# .env

DIRECTOR_PROJECT=booklore
PUID=1000
PGID=1000
TZ=UTC
SPRING_DATASOURCE_URL=jdbc:mariadb://127.0.0.1:3306/booklore
SPRING_DATASOURCE_USERNAME=booklore
SPRING_DATASOURCE_PASSWORD=changeme
JAVA_OPTS=
# appjail-director.yml

options:
  - virtualnet: ':<random> default'
  - nat:
services:
  booklore:
    name: booklore
    options:
      - container: 'boot args:--pull'
    oci:
      user: root
      environment:
        - PUID: !ENV '${PUID}'
        - PGID: !ENV '${PGID}'
        - TZ: !ENV '${TZ}'
        - SPRING_DATASOURCE_URL: !ENV '${SPRING_DATASOURCE_URL}'
        - SPRING_DATASOURCE_USERNAME: !ENV '${SPRING_DATASOURCE_USERNAME}'
        - SPRING_DATASOURCE_PASSWORD: !ENV '${SPRING_DATASOURCE_PASSWORD}'
        - JAVA_OPTS: !ENV '${JAVA_OPTS}'
    volumes:
      - BOOKLORE_DATA_PATH: /app/data
      - BOOKS_PATH: /books
      - BOOKLORE_BOOKDROP_PATH: /bookdrop
volumes:
  BOOKLORE_DATA_PATH:
    device: '/path/to/containers/booklore/data'
  BOOKS_PATH:
    device: '/path/to/books'
  BOOKLORE_BOOKDROP_PATH:
    device: '/path/to/containers/booklore/bookdrop'
1
2
3
4
5
6
# Makejail

ARG tag=latest

OPTION overwrite=force
OPTION from=ghcr.io/daemonless/booklore:${tag}
podman run -d --name booklore \
  -e PUID=1000 \
  -e PGID=1000 \
  -e TZ=UTC \
  -e SPRING_DATASOURCE_URL=jdbc:mariadb://127.0.0.1:3306/booklore \
  -e SPRING_DATASOURCE_USERNAME=booklore \
  -e SPRING_DATASOURCE_PASSWORD=changeme \
  -e JAVA_OPTS= \
  -v /path/to/containers/booklore/data:/app/data \
  -v /path/to/books:/books \
  -v /path/to/containers/booklore/bookdrop:/bookdrop \
  ghcr.io/daemonless/booklore:latest
appjail oci run -Pd \
  -o overwrite=force \
  -o container="args:--pull" \
  -o virtualnet=":<random> default" \
  -o nat \
  -e PUID=1000 \
  -e PGID=1000 \
  -e TZ=UTC \
  -e SPRING_DATASOURCE_URL=jdbc:mariadb://127.0.0.1:3306/booklore \
  -e SPRING_DATASOURCE_USERNAME=booklore \
  -e SPRING_DATASOURCE_PASSWORD=changeme \
  -e JAVA_OPTS= \
  -o fstab="/path/to/containers/booklore/data /app/data <pseudofs>" \
  -o fstab="/path/to/books /books <pseudofs>" \
  -o fstab="/path/to/containers/booklore/bookdrop /bookdrop <pseudofs>" \
  ghcr.io/daemonless/booklore:latest booklore
- name: Deploy booklore
  containers.podman.podman_container:
    name: booklore
    image: "ghcr.io/daemonless/booklore:latest"
    state: started
    restart_policy: always
    env:
      PUID: "1000"
      PGID: "1000"
      TZ: "UTC"
      SPRING_DATASOURCE_URL: "jdbc:mariadb://127.0.0.1:3306/booklore"
      SPRING_DATASOURCE_USERNAME: "booklore"
      SPRING_DATASOURCE_PASSWORD: "changeme"
      JAVA_OPTS: ""
    volumes:
      - "/path/to/containers/booklore/data:/app/data"
      - "/path/to/books:/books"
      - "/path/to/containers/booklore/bookdrop:/bookdrop"

Interactive Configuration

Parameters

Environment Variables

Variable Default Description
PUID 1000
PGID 1000
TZ Etc/UTC
SPRING_DATASOURCE_URL jdbc:mariadb://127.0.0.1:3306/booklore MariaDB JDBC URL (e.g., jdbc:mariadb://mariadb:3306/booklore)
SPRING_DATASOURCE_USERNAME booklore Database username
SPRING_DATASOURCE_PASSWORD changeme Database password
JAVA_OPTS `` Additional JVM options

Volumes

Path Description
/app/data Configuration and application data
/books Book library directory
/bookdrop Drop folder for automatic imports

Networking

This compose uses network_mode: host so services communicate via 127.0.0.1.

For isolated networking (multiple stacks, no port conflicts), use bridge mode with the dnsname CNI plugin:

services:
  booklore:
    # remove network_mode: host, add ports
    ports:
      - "6060:6060"
    environment:
      SPRING_DATASOURCE_URL: "jdbc:mariadb://mariadb:3306/booklore"

  mariadb:
    # remove network_mode: host
    # container name becomes DNS hostname

Migration from Official Image

This image uses /app/data for application data, matching the official ghcr.io/booklore-app/booklore image. You can migrate from Linux to FreeBSD:

  1. Stop containers on source host
  2. Copy /containers/booklore/ (data + mariadb) to destination
  3. Start containers on destination

The MariaDB data format is compatible between Linux and FreeBSD.

Implementation Details

  • Architectures: amd64
  • User: bsd (UID/GID set via PUID/PGID). Defaults to 1000:1000.
  • Base: Built on ghcr.io/daemonless/base (FreeBSD 15.1).

Need help? Join our Discord community.