Docker

Production Docker deployment reference for Comicarr.

Docker is the recommended way to run Comicarr. The image is multi-arch (amd64/arm64), built with a multi-stage Dockerfile using Node 22 for the frontend build and Python 3.12 for the runtime.

Use ghcr.io/frankieramirez/comicarr as the canonical image. comicarr/comicarr on Docker Hub is a mirror. Release image tags omit the leading v from the GitHub release; see Updating.

Docker Compose

docker-compose.yml
services:
  comicarr:
    image: ghcr.io/frankieramirez/comicarr:latest
    container_name: comicarr
    environment:
      - PUID=1000
      - PGID=1000
      - TZ=Etc/UTC
    volumes:
      - ./config:/config       # Host mount; app data under /config/comicarr
      - /path/to/comics:/comics   # Comic library
      - /path/to/manga:/manga     # Manga library
      - /path/to/downloads:/downloads  # Download staging
      # For Mylar3 migration (optional, temporary):
      # - /path/to/mylar/config:/mylar3:ro
    ports:
      - 8090:8090
    restart: unless-stopped
    stop_grace_period: 30s
docker compose up -d

Replace the host paths with your folders and use IDs that can write to them. Open http://localhost:8090 or http://<server-address>:8090 for a remote host.

Environment Variables

VariableDescriptionDefault
PUIDUser ID for file ownership inside the container1000
PGIDGroup ID for file ownership inside the container1000
TZTimezone (list)Etc/UTC
UMASKFile permission mask002
COMICARR_LOG_LEVELPin log verbosity to 0 (warning), 1 (info), or 2 (debug). Names work too. Overrides the level saved in Settings.unset, so Settings decides

Container logging

Leave COMICARR_LOG_LEVEL unset unless you specifically want the level fixed regardless of Settings. The image used to hardcode --quiet, which made docker logs near-empty and left no way to raise it; that argument is gone, so containers now log at whatever level you choose in Settings → Logs. Expect more output than older versions produced. That is the fix landing, working as intended. Full precedence rules: Logging.

Finding your PUID and PGID

Run id on the host to see your user and group IDs:

id
# uid=1000(user) gid=1000(user) ...

Use those values for PUID and PGID.

Volume Mounts

MountDescriptionRequired
/configHost volume. App data is written to /config/comicarr/ (comicarr.db, config.ini, logs, .secure/). Back this up.Yes
/comicsComic library root. Comicarr organizes and renames files here.Yes
/mangaManga library root. Used for MangaDex downloads.No
/downloadsStaging area for downloads before post-processing. Point your download client here.Yes
/mylar3Entire Mylar3 config directory for migration, mounted :ro so SQLite sidecar files remain available. Remove after migrating.No

With ./config:/config, app data persists in ./config/comicarr on the host. Preserve the config and media mounts during updates, and back up app data before upgrading or migrating.

Comicarr and your download client must see the same completed files. Mount the same host downloads directory at /downloads in both containers, then configure the client's completed-download path under that mount. A path that exists only inside the client container cannot be imported by Comicarr.

Synology NAS

Synology DSM uses non-standard user IDs. Run id for the account that owns the mounted folders and use its actual IDs. Common example values are:

environment:
  - PUID=1026
  - PGID=100

Entrypoint Behavior

The container entrypoint performs the following on startup:

  1. Prints a banner with PUID, PGID, UMASK, TZ, and which source is setting the log level
  2. Creates the internal user and group matching PUID/PGID
  3. Configures the timezone from TZ
  4. Ensures /config/comicarr exists and adjusts ownership on config paths
  5. Warns if media volumes (/comics, /downloads, /manga) are not writable (does not exit solely for that)
  6. Drops privileges and starts Comicarr with --nolaunch --datadir /config/comicarr

The entrypoint deliberately passes no verbosity argument. A startup argument outranks both COMICARR_LOG_LEVEL and the level saved in Settings, so hardcoding one would take the dial away from you entirely.

Check logs with:

docker logs comicarr

On first run, look for [SETUP] Setup token: lines to complete admin setup.

Next Steps

On this page