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
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: 30sdocker compose up -dReplace 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
| Variable | Description | Default |
|---|---|---|
PUID | User ID for file ownership inside the container | 1000 |
PGID | Group ID for file ownership inside the container | 1000 |
TZ | Timezone (list) | Etc/UTC |
UMASK | File permission mask | 002 |
COMICARR_LOG_LEVEL | Pin 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
| Mount | Description | Required |
|---|---|---|
/config | Host volume. App data is written to /config/comicarr/ (comicarr.db, config.ini, logs, .secure/). Back this up. | Yes |
/comics | Comic library root. Comicarr organizes and renames files here. | Yes |
/manga | Manga library root. Used for MangaDex downloads. | No |
/downloads | Staging area for downloads before post-processing. Point your download client here. | Yes |
/mylar3 | Entire 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=100Entrypoint Behavior
The container entrypoint performs the following on startup:
- Prints a banner with
PUID,PGID,UMASK,TZ, and which source is setting the log level - Creates the internal user and group matching
PUID/PGID - Configures the timezone from
TZ - Ensures
/config/comicarrexists and adjusts ownership on config paths - Warns if media volumes (
/comics,/downloads,/manga) are not writable (does not exit solely for that) - 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 comicarrOn first run, look for [SETUP] Setup token: lines to complete admin setup.