Skip to content

Ubooquity Ubooquity

Description / nameInput element
Container Registry
Container Configuration Root Path
Global /books Path
Timezone
User ID
Group ID
Ubooquity Host Port
Ubooquity /config Path
Ubooquity /comics Path
Ubooquity /files Path

Build Status Last Commit OCI Pulls

Free, lightweight home server for your comics and ebooks (EPUB, MOBI, PDF, CBZ, CBR) with OPDS support and a web reader.

Port 2202
Registry ghcr.io/daemonless/ubooquity
Daemonless daemonless/ubooquity
Source vaemendis.net/ubooquity/
Website vaemendis.net/ubooquity

Version Tags

Multi-arch manifests — resolve automatically to the right image for your platform.

Tag Description Best For
latest Upstream Binary. Built from official release. Most users — recommended.
Tag Description Best For
latest-amd64 Upstream Binary. Built from official release. Most users — recommended.
Tag Description Best For
latest-aarch64 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:
  ubooquity:
    image: "ghcr.io/daemonless/ubooquity:latest"
    container_name: ubooquity
    environment:
      - PUID=1000  # User ID for the application process
      - PGID=1000  # Group ID for the application process
      - TZ=UTC  # Timezone for the container
      - MAXMEM=512  # Maximum Java memory allocation pool in MB (default: 512)
    volumes:
      - "/path/to/containers/ubooquity:/config"
      - "/path/to/books:/books" # optional
      - "/path/to/containers/ubooquity/comics:/comics" # optional
      - "/path/to/containers/ubooquity/files:/files" # optional
    ports:
      - "2202:2202"
      - "2203:2203"
    # always (not unless-stopped) so FreeBSD's podman rc.d auto-starts it at boot
    restart: always

Save as compose.yaml, then run podman-compose up -d.

podman run -d --name ubooquity \
  -p 2202:2202 \
  -p 2203:2203 \
  -e PUID=1000 \
  -e PGID=1000 \
  -e TZ=UTC \
  -e MAXMEM=512 \
  -v /path/to/containers/ubooquity:/config \
  -v /path/to/books:/books # optional \
  -v /path/to/containers/ubooquity/comics:/comics # optional \
  -v /path/to/containers/ubooquity/files:/files # optional \
  ghcr.io/daemonless/ubooquity:latest

Save as run.sh, then run sh run.sh.

- name: Deploy ubooquity
  containers.podman.podman_container:
    name: ubooquity
    image: "ghcr.io/daemonless/ubooquity:latest"
    state: started
    restart_policy: always
    env:
      PUID: "1000"
      PGID: "1000"
      TZ: "UTC"
      MAXMEM: "512"
    ports:
      - "2202:2202"
      - "2203:2203"
    volumes:
      - "/path/to/containers/ubooquity:/config"
      - "/path/to/books:/books" # optional
      - "/path/to/containers/ubooquity/comics:/comics" # optional
      - "/path/to/containers/ubooquity/files:/files" # optional

Save as ubooquity-deploy.yaml, then run ansible-playbook ubooquity-deploy.yaml.

Warning

Exposing ports in AppJail means that your service can be reached from remote hosts. If that is not your intention, do not expose the ports and communicate with the service using the jail's IPv4 address or hostname assigned by the virtual network.

1
2
3
4
5
6
7
# .env

DIRECTOR_PROJECT=ubooquity
PUID=1000
PGID=1000
TZ=UTC
MAXMEM=512
# appjail-director.yml

options:
  - virtualnet: ':<random> default'
  - nat:
services:
  ubooquity:
    name: ubooquity
    options:
      - container: 'args:--pull'
      - expose: '2202:2202 proto:tcp'
      - expose: '2203:2203 proto:tcp'
    oci:
      user: root
      environment:
        - PUID: !ENV '${PUID}'
        - PGID: !ENV '${PGID}'
        - TZ: !ENV '${TZ}'
        - MAXMEM: !ENV '${MAXMEM}'
    volumes:
      - UBOOQUITY_CONFIG_PATH: /config
      - BOOKS_PATH: /books
      - UBOOQUITY_COMICS_PATH: /comics
      - UBOOQUITY_FILES_PATH: /files
volumes:
  UBOOQUITY_CONFIG_PATH:
    device: '/path/to/containers/ubooquity'
  BOOKS_PATH:
    device: '/path/to/books'
  UBOOQUITY_COMICS_PATH:
    device: '/path/to/containers/ubooquity/comics'
  UBOOQUITY_FILES_PATH:
    device: '/path/to/containers/ubooquity/files'
1
2
3
4
5
6
7
# Makejail

ARG tag=latest

OPTION container=boot
OPTION overwrite=force
OPTION from=ghcr.io/daemonless/ubooquity:${tag}

Save the files above, then run appjail-director up.

appjail oci run -Pd \
  -o overwrite=force \
  -o container="args:--pull" \
  -o virtualnet=":<random> default" \
  -o nat \
  -o expose="2202:2202 proto:tcp" \
  -o expose="2203:2203 proto:tcp" \
  -e PUID=1000 \
  -e PGID=1000 \
  -e TZ=UTC \
  -e MAXMEM=512 \
  -o fstab="/path/to/containers/ubooquity /config <pseudofs>" \
  -o fstab="/path/to/books /books <pseudofs>" \ # optional
  -o fstab="/path/to/containers/ubooquity/comics /comics <pseudofs>" \ # optional
  -o fstab="/path/to/containers/ubooquity/files /files <pseudofs>" \ # optional
  ghcr.io/daemonless/ubooquity:latest ubooquity

Save the files above, then run sh run.sh.

Experimental

Bastille's OCI support is experimental. It requires buildah and shares the host network stack (inherit). Mount volumes with --volume HOST JAIL; without it, image-declared volumes are stored under ${bastille_volumesdir}/${jail}.

services:
  ubooquity:
    name: ubooquity
    image: "ghcr.io/daemonless/ubooquity:latest"
    network:
      - mode: host
    environment:
      - PUID=1000
      - PGID=1000
      - TZ=UTC
      - MAXMEM=512
    volumes:
      - "/path/to/containers/ubooquity:/config"
      - "/path/to/books:/books"
      - "/path/to/containers/ubooquity/comics:/comics"
      - "/path/to/containers/ubooquity/files:/files"

Save as bastille-compose.yml, then run bastille up.

bastille create -O \
  --env PUID=1000 \
  --env PGID=1000 \
  --env TZ=UTC \
  --env MAXMEM=512 \
  --volume /path/to/containers/ubooquity /config \
  --volume /path/to/books /books \
  --volume /path/to/containers/ubooquity/comics /comics \
  --volume /path/to/containers/ubooquity/files /files \
  ubooquity ghcr.io/daemonless/ubooquity:latest inherit

Access at: http://localhost:2202

Interactive Configuration

Parameters

Environment Variables

Variable Default Description
PUID 1000 User ID for the application process
PGID 1000 Group ID for the application process
TZ UTC Timezone for the container
MAXMEM 512 Maximum Java memory allocation pool in MB (default: 512)

Volumes

Path Description
/config Configuration directory, database, and settings
/books Book library directory (EPUB, MOBI, PDF) (Optional)
/comics Comic library directory (CBZ, CBR, CBT) (Optional)
/files Raw documents and files directory (Optional)

Ports

Port Protocol Description
2202 TCP Library Web UI & OPDS server
2203 TCP Administration Web UI (set the admin password on first visit)

Implementation Details

  • Architectures: amd64, aarch64
  • 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.