A Docker-based multi-user setup for YACReader that allows multiple users to share the same comic library while maintaining separate reading progress.
.ydb database filePre-built images available at: jaap14/yacreader-multiuser:latestβ
services:
yacreader-user1:
image: jaap14/yacreader-multiuser:latest
container_name: yacreader-user1
environment:
- YACREADER_USER=user1
- PUID=1000
- PGID=1000
- TZ=America/Los_Angeles
volumes:
- /path/to/comics:/comics
- /path/to/config/user1:/config
ports:
- "9080:8080"
restart: unless-stopped
docker compose up -d
http://your-server:9080
docker exec yacreader-user1 YACReaderLibraryServer add-library "Comics" /comics
For a native macOS experience, download the YACReader MultiUser Mac Client:
π₯ Download from GitHub Releasesβ
The Mac client allows you to connect directly to your Docker server instances with a native desktop interface.
Two files are available:
This method automatically connects to the correct user's server.
Download and extract: YACReaderLibrary-MultiUser-Backup.tar.gz
Install the app:
# Extract the backup
tar -xzf YACReaderLibrary-MultiUser-Backup.tar.gz
cd YACReaderLibrary-MultiUser-Backup
# Install to Applications
cp -r YACReaderLibrary-MultiUser.app /Applications/
Copy launcher scripts to Desktop (or anywhere convenient):
cp YACReaderLibrary-Jaap.command ~/Desktop/
cp YACReaderLibrary-Jeremy.command ~/Desktop/
Make scripts executable:
chmod +x ~/Desktop/YACReaderLibrary-Jaap.command
chmod +x ~/Desktop/YACReaderLibrary-Jeremy.command
Double-click the appropriate launcher:
YACReaderLibrary-Jaap.command - Opens YACReader for JaapYACReaderLibrary-Jeremy.command - Opens YACReader for JeremyConfigure server connection (first time only):
http://your-server-ip:9080 (for Jaap) or :9081 (for Jeremy)How it works:
YACREADER_USER environment variable#!/bin/bash
export YACREADER_USER=jaap
/Applications/YACReaderLibrary-MultiUser.app/Contents/MacOS/YACReaderLibrary
If you just want to install the DMG:
Download and open: YACReaderLibrary-MultiUser.dmg
Drag to Applications folder
Open YACReader Library
Configure server connection:
http://your-server-ip:9080 (for user 1)Note: Without launcher scripts, you'll need to manually switch between servers in preferences.
To create launchers for additional users:
#!/bin/bash
export YACREADER_USER=username
/Applications/YACReaderLibrary-MultiUser.app/Contents/MacOS/YACReaderLibrary
Save as YACReaderLibrary-Username.command and make executable:
chmod +x YACReaderLibrary-Username.command
"App can't be opened because it is from an unidentified developer"
# Remove quarantine attribute
xattr -d com.apple.quarantine /Applications/YACReaderLibrary-MultiUser.app
Or: Right-click app β Open β Click "Open" in the dialog
"Command file won't run"
# Make sure it's executable
chmod +x YACReaderLibrary-Jaap.command
Can't connect to server
βββββββββββββββββββββββββββββββββββββββββββ
β Shared Comics Directory β
β /share/Multimedia/Comics/ β
β β
β βββ Series 1/ β
β βββ Series 2/ β
β βββ .yacreaderlibrary/ β
β βββ library_user1.ydb βββββββββββΌβββ User 1's progress
β βββ library_user2.ydb βββββββββββΌβββ User 2's progress
β βββ covers/ βββββββββββΌβββ Shared thumbnails
βββββββββββββββββββββββββββββββββββββββββββ
β β
β β
ββββββββ΄ββββ ββββββββ΄ββββ
β Containerβ β Containerβ
β User 1 β β User 2 β
β Port 9080β β Port 9081β
ββββββββββββ ββββββββββββ
The YACREADER_USER environment variable tells each container:
library_${YACREADER_USER}.ydbExample:
YACREADER_USER=alice β uses library_alice.ydbYACREADER_USER=bob β uses library_bob.ydbBoth read from /comics, but track progress independently.
| Variable | Required | Default | Description |
|---|---|---|---|
YACREADER_USER | Yes | - | Username (creates library_USERNAME.ydb) |
PUID | No | 1000 | User ID for file permissions |
PGID | No | 1000 | Group ID for file permissions |
TZ | No | UTC | Timezone (e.g., America/Los_Angeles) |
| Mount | Required | Description |
|---|---|---|
/comics | Yes | Your comics directory (shared across users) |
/config | Recommended | Per-user app settings and preferences |
| Port | Description |
|---|---|
8080 | YACReader web interface (map to your choice externally) |
services:
yacreader-alice:
image: jaap14/yacreader-multiuser:latest
container_name: yacreader-alice
environment:
- YACREADER_USER=alice
- TZ=America/New_York
volumes:
- /share/Comics:/comics
- /share/AppData/yacreader/alice:/config
ports:
- "9080:8080"
restart: unless-stopped
yacreader-bob:
image: jaap14/yacreader-multiuser:latest
container_name: yacreader-bob
environment:
- YACREADER_USER=bob
- TZ=America/New_York
volumes:
- /share/Comics:/comics
- /share/AppData/yacreader/bob:/config
ports:
- "9081:8080"
restart: unless-stopped
services:
yacreader-dad:
image: jaap14/yacreader-multiuser:latest
environment:
- YACREADER_USER=dad
volumes:
- /mnt/media/comics:/comics
- ./config/dad:/config
ports:
- "9080:8080"
networks:
- family-network
yacreader-kid1:
image: jaap14/yacreader-multiuser:latest
environment:
- YACREADER_USER=kid1
volumes:
- /mnt/media/comics:/comics
- ./config/kid1:/config
ports:
- "9081:8080"
networks:
- family-network
networks:
family-network:
driver: bridge
docker exec CONTAINER_NAME YACReaderLibraryServer add-library "Library Name" /comics
docker exec CONTAINER_NAME YACReaderLibraryServer list-libraries
docker logs CONTAINER_NAME
docker logs -f CONTAINER_NAME # Follow logs
docker restart CONTAINER_NAME
docker compose pull
docker compose up -d
Reading progress databases are stored in your comics directory:
/path/to/comics/.yacreaderlibrary/
βββ library_user1.ydb
βββ library_user2.ydb
βββ covers/
Critical: Always backup before major changes!
# Backup all user databases
tar -czf yacreader-backup-$(date +%Y%m%d).tar.gz \
/path/to/comics/.yacreaderlibrary/
# Backup user configs
tar -czf yacreader-config-backup-$(date +%Y%m%d).tar.gz \
/path/to/config/
#!/bin/bash
BACKUP_DIR="/path/to/backups"
DATE=$(date +%Y%m%d-%H%M%S)
# Backup databases
tar -czf "$BACKUP_DIR/yacreader-db-$DATE.tar.gz" \
/path/to/comics/.yacreaderlibrary/
# Backup configs
tar -czf "$BACKUP_DIR/yacreader-config-$DATE.tar.gz" \
/path/to/config/
# Keep only last 7 days
find "$BACKUP_DIR" -name "yacreader-*.tar.gz" -mtime +7 -delete
echo "Backup completed: $DATE"
# Stop containers
docker compose down
# Restore databases
tar -xzf yacreader-backup-YYYYMMDD.tar.gz -C /
# Restore configs
tar -xzf yacreader-config-backup-YYYYMMDD.tar.gz -C /
# Start containers
docker compose up -d
Check logs:
docker logs CONTAINER_NAME
Common issues:
docker-compose.ymlCheck comics mount:
docker exec CONTAINER_NAME ls -la /comics
Add library manually:
docker exec CONTAINER_NAME YACReaderLibraryServer add-library "Comics" /comics
Verify database exists:
ls -la /path/to/comics/.yacreaderlibrary/library_USERNAME.ydb
Check write permissions:
docker exec CONTAINER_NAME touch /comics/.yacreaderlibrary/test.txt
docker exec CONTAINER_NAME rm /comics/.yacreaderlibrary/test.txt
Verify database ownership:
ls -la /path/to/comics/.yacreaderlibrary/
Should be owned by PUID:PGID (default 1000:1000)
Check container status:
docker ps | grep yacreader
Verify port mapping:
docker port CONTAINER_NAME
Test from server:
curl http://localhost:9080
For large libraries (10,000+ comics):
docker exec CONTAINER_NAME sqlite3 \
/comics/.yacreaderlibrary/library_USERNAME.ydb "VACUUM;"
If you want to build your own image:
# Clone this repo
git clone https://github.com/jaapjan14/yacreader-multiuser.git
cd yacreader-multiuser
# Build Docker image
docker build -t my-yacreader:latest .
# Or use the build script
./build_multiuser.sh
See the build instructions in the source code, or download the pre-built DMG from releases.
yacreader-multiuser/
βββ docker/
β βββ Dockerfile.multiuser # Docker build file
βββ docker-compose.yml # Production config
βββ docker-compose.example.yml # Example for others
βββ build_multiuser.sh # Build script
βββ README.md # This file
βββ DEPLOYMENT_GUIDE.md # Advanced deployment
βββ YACReaderLibrary/ # Source code
networks:
yacreader-net:
driver: bridge
ipam:
config:
- subnet: 172.20.0.0/16
server {
listen 80;
server_name comics.example.com;
location /user1/ {
proxy_pass http://localhost:9080/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
location /user2/ {
proxy_pass http://localhost:9081/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
services:
yacreader-user1:
image: jaap14/yacreader-multiuser:latest
labels:
- "traefik.enable=true"
- "traefik.http.routers.yacreader-user1.rule=Host(`user1.comics.example.com`)"
- "traefik.http.routers.yacreader-user1.tls=true"
- "traefik.http.routers.yacreader-user1.tls.certresolver=letsencrypt"
Contributions welcome! Please:
docker logs CONTAINER_NAMEThis project packages YACReader, which is licensed under GPLv3.
This project is maintained on a best-effort basis. It's stable and working well for my family's use, and I've documented everything thoroughly so others can benefit. That said, I'm not a YACReader developer - I built this Docker setup with AI assistance and my expertise is limited. I'm happy to help where I can, but I can't promise active feature development or deep code-level support.
For YACReader core functionality issues, please refer to the official YACReader repositoryβ .
Pull requests welcome! If you have improvements or fixes, contributions are appreciated.
Docker Hub: jaap14/yacreader-multiuserβ
Maintained by: jaapjan14
Last Updated: February 2026
Content type
Image
Digest
sha256:4fc0779deβ¦
Size
141.2 MB
Last updated
8 months ago
docker pull jaap14/yacreader-multiuser