A modded Mylar3 — the comic book manager — built on upstream v0.9.0.
Two things distinguish it. The Comic Vine API base URL is settable by environment
variable, so Mylar can be pointed at a local caching proxy instead of
comicvine.gamespot.com; stock hard-codes it. And it ships seven additional download
providers plus bulk library tooling, with every binary those providers need already in the
image.
The fork touches 77 files against upstream and adds 16 new ones. Everything below is what that actually buys you.
# mylar/__init__.py
CONFIG.COMICVINE_BASE_URL = os.environ.get(
'COMICVINE_BASE_URL',
'https://comicvine.gamespot.com/api/'
)
CVURL = CONFIG.COMICVINE_BASE_URL
CVURL is driven exclusively by this variable. config.py deliberately no longer writes
it — upstream's config.ini-based override clobbered the env value on every config
validation, which silently sent Mylar back to the public API mid-run. Unset, behaviour is
identical to stock.
| Module | Provider |
|---|---|
downloaders/batcave.py | BatCave |
downloaders/readcomiconline.py | ReadComicOnline (Selenium path — needs Chromium) |
downloaders/airdcpp.py | AirDC++ (Direct Connect hubs) |
downloaders/jdownloader2.py | JDownloader2 handoff |
downloaders/rootz.py | Rootz |
downloaders/vikingfile.py | VikingFile |
downloaders/florenfile.py | FlorenFile |
Upstream's mega.py, mediafire.py and pixeldrain.py are also modified.
| Module | Purpose |
|---|---|
bulkops.py | Bulk-library operations: CBR→CBZ conversion, incomplete-series query |
comicsnake.py | ComicSnake search provider |
cloudflare.py | Cloudflare challenge handling for gated providers |
comiccodes.py | Comic code lookup helpers |
New UI: bulktools.html, gcweeklypull.html, plus a reworked managecomics view in both
the default and carbon themes.
| Binary | Why |
|---|---|
| unrar | Stock relies on the host having it; CBRs fail without it. From ghcr.io/linuxserver/unrar |
| megatools | The bundled mega.py is rate-limit-prone. Pulled from Alpine edge/testing, deps resolved from stable |
| Chromium + chromedriver | The ReadComicOnline Selenium path needs a real browser. CHROMIUM_PATH / CHROMEDRIVER_PATH are preset |
Base is python:3.11-alpine, CMD ["python", "Mylar.py"]. Config format, database schema and
the web UI are otherwise unchanged, so an existing install moves across as-is.
services:
mylar3:
image: rocketdude147/mylar3:latest
container_name: mylar3
restart: unless-stopped
ports:
- "8090:8090"
environment:
- TZ=America/New_York
volumes:
- ./config/config.ini:/app/config.ini
- ./config/mylar.db:/app/mylar.db
- ./config/cache:/app/cache
- /srv/media/Comics:/comics
- /srv/downloads/comics:/downloads
cpus: 2.5
mem_limit: 3g
mkdir -p config
touch config/config.ini config/mylar.db # must exist as FILES first
docker compose up -d
Open http://localhost:8090.
config.iniandmylar.dbare bind-mounted as files, not directories. If they do not exist on the host first, Docker creates directories with those names and Mylar fails to start with an unhelpful error.touchthem before the firstup.
The image has no EXPOSE; Mylar listens on its usual 8090 unless you pass -p.
The reason the image exists:
environment:
- COMICVINE_BASE_URL=http://192.168.1.10:15650/api
Include the /api suffix — the value is used as the full base. Nothing to set in the UI, and
nothing that can drift back to the public API on upgrade.
Set the cache up first: see the rocketdude147/comicvinecacher guide.
Verify:
docker logs mylar3 2>&1 | grep -i comicvine | head
curl -s http://192.168.1.10:15650/api/clients # Mylar should appear
You still need a Comic Vine API key in Mylar's settings. The cache passes it through and rate-limits on your behalf; it does not replace authentication.
Run them as separate stacks. The cache has its own lifecycle and (in the full build) nine VPN sidecars; you do not want a Mylar restart cycling that.
services:
mylar3:
image: rocketdude147/mylar3:latest
container_name: mylar3
network_mode: host
environment:
- COMICVINE_BASE_URL=http://192.168.1.10:15650/api
No port mapping — Mylar binds 8090 on the host directly.
docker network create comicvine_lb
# both stacks
networks:
comicvine_lb:
external: true
# mylar service
networks: [comicvine_lb]
environment:
- COMICVINE_BASE_URL=http://comicvine:5000/api
Container-to-container uses the container port 5000, not the published 15650.
services:
mylar3:
image: rocketdude147/mylar3:latest
container_name: mylar3
restart: unless-stopped
network_mode: host
environment:
- TZ=America/New_York
- COMICVINE_BASE_URL=http://192.168.1.10:15650/api
volumes:
- /srv/config/mylar3/config.ini:/app/config.ini
- /srv/config/mylar3/mylar.db:/app/mylar.db
- /srv/config/mylar3/images/cache:/app/cache
- /srv/media/Comics:/comics # library
- /srv/media/Comics to Process:/process # manual post-processing
- /srv/downloads/comics:/downloads # completed downloads
- /srv/downloads/comicstuff:/comicstuff # scratch
- modded_mylar:/cached
cpus: 2.5
mem_limit: 3g
mem_reservation: 1g
volumes:
modded_mylar:
Paths must match on both sides. Whatever your download client reports as a finished path
must be the path Mylar sees. If the client is also containerised, mount /srv/downloads/comics
at the same location in both.
Every variable the code reads:
| Variable | Default | Notes |
|---|---|---|
COMICVINE_BASE_URL | https://comicvine.gamespot.com/api/ | The mod. Include /api. Overrides config.ini |
CHROMIUM_PATH | /usr/bin/chromium | Preset in the image |
CHROMEDRIVER_PATH | /usr/bin/chromedriver | Preset in the image |
TZ | UTC | Scheduling and log timestamps |
Everything else lives in config.ini or the web UI, as upstream.
The added providers use config keys such as ENABLE_BATCAVE, ENABLE_COMICSNAKE,
COMICSNAKE_URL, ENABLE_AIRDCPP, AIRDCPP_HOST, AIRDCPP_USERNAME, AIRDCPP_PASSWORD,
AIRDCPP_HUBS, AIRDCPP_ANNOUNCE_HUB, AIRDCPP_ANNOUNCE_BOTS, AIRDCPP_DOWNLOAD_DIR,
AIRDCPP_VERSION. Set them in the UI rather than hand-editing config.ini.
CMD is python Mylar.py; override to pass any of:
-v/--verbose, -q/--quiet, -d/--daemon, -p/--port, -b/--backup, -w/--noweekly,
-iu/--ignoreupdate, --datadir, --config, --nolaunch, --pidfile, --safe
command: ["python", "Mylar.py", "--nolaunch", "-p", "8090"]
| Mount | Purpose |
|---|---|
/app/config.ini | Config file — create on host first |
/app/mylar.db | SQLite database file — create on host first |
/app/cache | Cover art / metadata cache |
/comics | Library |
/downloads | Where the download client drops completed files |
/process | Manual post-processing drop box |
/comicstuff | Scratch space |
/cached | Named volume for working state |
Schema and config format are unchanged:
config.ini and mylar.db to the new host paths.COMICVINE_BASE_URL.Back up mylar.db first. Rolling back to stock works the same way — stock simply ignores the
env var. The added providers write their own config.ini keys, which stock will ignore
rather than choke on.
network_mode: host ignores ports:. Set both and the mapping is silently inert.
mem_limit: 3g is not arbitrary. Large post-processing batches and the Selenium path
will grow past a smaller ceiling and get OOM-killed mid-import, which can leave a series
half-processed.
Comic Vine's rate limit is the real constraint on a first import. 200 requests/hour against a library of thousands of issues is days of walking, regardless of hardware. That is what the cache is for.
ReadComicOnline needs the Chromium env vars. They are preset; if you override
CHROMIUM_PATH to something that does not exist, that downloader fails while the rest keep
working — so the symptom is one provider quietly never succeeding.
Cloudflare-gated providers can still fail. cloudflare.py handles the common challenge,
but a provider that escalates to a full interactive challenge will need an external solver.
megatools comes from Alpine edge/testing. Only that package is pulled from edge; its
runtime deps resolve from stable. If a rebuild ever fails on it, that pin is the first place
to look.
Content type
Image
Digest
sha256:89d7a1bc9…
Size
571.6 MB
Last updated
11 days ago
docker pull rocketdude147/mylar3