Grimmory
| Description / name | Input element |
|---|---|
| Container Registry | |
| Container Configuration Root Path | |
| Global /books Path | |
| Timezone | |
| User ID | |
| Group ID |
Self-hosted digital library with smart shelves, metadata lookup, built-in reader, Kobo/KOReader sync, OPDS support, and multi-user support. Successor to BookLore.
| Port | 6060 |
| Registry | ghcr.io/daemonless/grimmory |
| Source | https://github.com/grimmory-tools/grimmory |
| Website | https://github.com/grimmory-tools/grimmory |
Version Tags
| Tag | Description | Best For |
|---|---|---|
latest |
FreeBSD Port. Built from latest FreeBSD packages. | Most users. Matches Linux Docker behavior. |
Root Privileges Required
Podman on FreeBSD currently requires root. All commands must be run as root (or via doas/sudo).
Before deploying, ensure your host environment is ready. See the Quick Start Guide for host setup instructions.
Deployment
services:
grimmory:
image: ghcr.io/daemonless/grimmory:latest
container_name: grimmory
environment:
- PUID=1000
- PGID=1000
- TZ=UTC
- SPRING_DATASOURCE_URL=jdbc:mariadb://grimmory-mariadb:3306/grimmory
- SPRING_DATASOURCE_USERNAME=grimmory
- SPRING_DATASOURCE_PASSWORD=changeme
volumes:
- "/path/to/containers/@GRIMMORY_APP_DATA_PATH@:/app/data"
- "/path/to//path/to/books:/books"
- "/path/to/containers/@GRIMMORY_BOOKDROP_PATH@:/bookdrop"
ports:
- @GRIMMORY_PORT@:6060
healthcheck:
test: ["CMD", "{'port': 6060, 'path': '/api/v1/healthcheck'}"]
restart: unless-stopped
podman run -d --name grimmory \
-p @GRIMMORY_PORT@:6060 \
--health-cmd {'port': 6060, 'path': '/api/v1/healthcheck'} \
-e PUID=1000 \
-e PGID=1000 \
-e TZ=UTC \
-e SPRING_DATASOURCE_URL=jdbc:mariadb://grimmory-mariadb:3306/grimmory \
-e SPRING_DATASOURCE_USERNAME=grimmory \
-e SPRING_DATASOURCE_PASSWORD=changeme \
-v /path/to/containers/@GRIMMORY_APP_DATA_PATH@:/app/data \
-v /path/to//path/to/books:/books \
-v /path/to/containers/@GRIMMORY_BOOKDROP_PATH@:/bookdrop \
ghcr.io/daemonless/grimmory:latest
- name: Deploy grimmory
containers.podman.podman_container:
name: grimmory
image: ghcr.io/daemonless/grimmory:latest
state: started
restart_policy: always
env:
PUID: "1000"
PGID: "1000"
TZ: "UTC"
SPRING_DATASOURCE_URL: "jdbc:mariadb://grimmory-mariadb:3306/grimmory"
SPRING_DATASOURCE_USERNAME: "grimmory"
SPRING_DATASOURCE_PASSWORD: "changeme"
ports:
- "@GRIMMORY_PORT@:6060"
volumes:
- "/path/to/containers/@GRIMMORY_APP_DATA_PATH@:/app/data"
- "/path/to//path/to/books:/books"
- "/path/to/containers/@GRIMMORY_BOOKDROP_PATH@:/bookdrop"
Access at: http://localhost:@GRIMMORY_PORT@
Interactive Configuration
Parameters
Environment Variables
| Variable | Default | Description |
|---|---|---|
PUID |
1000 |
|
PGID |
1000 |
|
TZ |
Etc/UTC |
|
SPRING_DATASOURCE_URL |
jdbc:mariadb://grimmory-mariadb:3306/grimmory |
MariaDB JDBC URL (e.g., jdbc:mariadb://127.0.0.1:3306/grimmory) |
SPRING_DATASOURCE_USERNAME |
grimmory |
Database username |
SPRING_DATASOURCE_PASSWORD |
changeme |
Database password |
Volumes
| Path | Description |
|---|---|
/app/data |
Configuration and application data |
/books |
Book library directory |
/bookdrop |
Drop folder for automatic imports |
Ports
| Port | Protocol | Description |
|---|---|---|
6060 |
TCP | Web interface |
Networking
This compose uses network_mode: host so services communicate via 127.0.0.1.
For isolated networking, use bridge mode:
services:
grimmory:
ports:
- "6060:6060"
environment:
SPRING_DATASOURCE_URL: "jdbc:mariadb://mariadb:3306/grimmory"
mariadb:
# container name becomes DNS hostname
Migration from BookLore
Grimmory is the successor to BookLore and can migrate existing data:
- Stop BookLore containers
- Copy
/containers/booklore/to/containers/grimmory/ - Start Grimmory — it will migrate the database automatically
Implementation Details
- Architectures: amd64
- User:
bsd(UID/GID set via PUID/PGID). Defaults to1000:1000. - Base: Built on
ghcr.io/daemonless/base(FreeBSD 15.0).
Need help? Join our Discord community.