Sign inSign up

jaap14/yacreader-multiuser

By jaap14

β€’Updated 8 months ago

Image
0

1.0K

jaap14/yacreader-multiuser repository overview

⁠YACReader Multiuser

A Docker-based multi-user setup for YACReader that allows multiple users to share the same comic library while maintaining separate reading progress.

⁠Features

  • 🎯 Multiple Users, One Library - Share comics, keep separate reading progress
  • πŸ“Š Independent Databases - Each user gets their own .ydb database file
  • 🌐 Web + Desktop Access - Use via browser or native Mac client
  • 🐳 Docker-based - Easy deployment on any platform
  • πŸ”’ Isolated Config - Per-user settings and preferences

⁠Quick Start

⁠Docker Hub Image

Pre-built images available at: jaap14/yacreader-multiuser:latest⁠

⁠Basic Setup
  1. Create docker-compose.yml:
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
  1. Start containers:
docker compose up -d
  1. Access web interface:
http://your-server:9080
  1. Add library:
docker exec yacreader-user1 YACReaderLibraryServer add-library "Comics" /comics

⁠Mac Desktop Client

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.

⁠Installation

Two files are available:

  1. YACReaderLibrary-MultiUser.dmg - The Mac application
  2. YACReaderLibrary-MultiUser-Backup.tar.gz - Application + launcher scripts

This method automatically connects to the correct user's server.

  1. Download and extract: YACReaderLibrary-MultiUser-Backup.tar.gz

  2. 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/
    
  3. Copy launcher scripts to Desktop (or anywhere convenient):

    cp YACReaderLibrary-Jaap.command ~/Desktop/
    cp YACReaderLibrary-Jeremy.command ~/Desktop/
    
  4. Make scripts executable:

    chmod +x ~/Desktop/YACReaderLibrary-Jaap.command
    chmod +x ~/Desktop/YACReaderLibrary-Jeremy.command
    
  5. Double-click the appropriate launcher:

    • YACReaderLibrary-Jaap.command - Opens YACReader for Jaap
    • YACReaderLibrary-Jeremy.command - Opens YACReader for Jeremy
  6. Configure server connection (first time only):

    • Server: http://your-server-ip:9080 (for Jaap) or :9081 (for Jeremy)
    • The app will remember this for each user

How it works:

  • Each launcher script sets the YACREADER_USER environment variable
  • The app uses this to connect to the correct user's database
  • Example script contents:
    #!/bin/bash
    export YACREADER_USER=jaap
    /Applications/YACReaderLibrary-MultiUser.app/Contents/MacOS/YACReaderLibrary
    
⁠Setup Method 2: Manual Connection

If you just want to install the DMG:

  1. Download and open: YACReaderLibrary-MultiUser.dmg

  2. Drag to Applications folder

  3. Open YACReader Library

  4. Configure server connection:

    • File β†’ Preferences β†’ Server
    • Server: http://your-server-ip:9080 (for user 1)
    • Repeat for additional users on different ports (9081, 9082, etc.)

Note: Without launcher scripts, you'll need to manually switch between servers in preferences.

⁠Creating Custom Launcher Scripts

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
⁠Troubleshooting Mac Client

"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

  • Verify server IP and port (check docker ps for port mappings)
  • Ensure Docker container is running
  • Check firewall isn't blocking the port

⁠How It Works

⁠Architecture
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚         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β”‚
    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜   β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
⁠Multi-User Magic

The YACREADER_USER environment variable tells each container:

  • Which database file to use: library_${YACREADER_USER}.ydb
  • Where to store user preferences
  • How to isolate reading progress

Example:

  • Container 1: YACREADER_USER=alice β†’ uses library_alice.ydb
  • Container 2: YACREADER_USER=bob β†’ uses library_bob.ydb

Both read from /comics, but track progress independently.

⁠Configuration

⁠Environment Variables
VariableRequiredDefaultDescription
YACREADER_USERYes-Username (creates library_USERNAME.ydb)
PUIDNo1000User ID for file permissions
PGIDNo1000Group ID for file permissions
TZNoUTCTimezone (e.g., America/Los_Angeles)
⁠Volume Mounts
MountRequiredDescription
/comicsYesYour comics directory (shared across users)
/configRecommendedPer-user app settings and preferences
⁠Ports
PortDescription
8080YACReader web interface (map to your choice externally)

⁠Examples

⁠Example 1: Two Users on QNAP
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
⁠Example 2: Family Setup with Network
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

⁠Administration

⁠Add Library via CLI
docker exec CONTAINER_NAME YACReaderLibraryServer add-library "Library Name" /comics
⁠List Libraries
docker exec CONTAINER_NAME YACReaderLibraryServer list-libraries
⁠View Logs
docker logs CONTAINER_NAME
docker logs -f CONTAINER_NAME  # Follow logs
⁠Restart Container
docker restart CONTAINER_NAME
⁠Update to Latest Version
docker compose pull
docker compose up -d

⁠Data Management

⁠Database Locations

Reading progress databases are stored in your comics directory:

/path/to/comics/.yacreaderlibrary/
β”œβ”€β”€ library_user1.ydb
β”œβ”€β”€ library_user2.ydb
└── covers/
⁠Backup Strategy

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/
⁠Automated Backup Script
#!/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"
⁠Restore from Backup
# 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

⁠Troubleshooting

⁠Container Won't Start

Check logs:

docker logs CONTAINER_NAME

Common issues:

  • Port already in use: Change external port in docker-compose.yml
  • Permission denied: Check PUID/PGID match your file ownership
  • Network not found: Create network or remove from compose file
⁠Library Not Showing

Check 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
⁠Reading Progress Not Saving

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)

⁠Web UI Not Accessible

Check container status:

docker ps | grep yacreader

Verify port mapping:

docker port CONTAINER_NAME

Test from server:

curl http://localhost:9080
⁠Performance Issues

For large libraries (10,000+ comics):

  1. Use SSD storage for database files
  2. Increase container resources if limited
  3. Pre-generate covers before adding users
  4. Optimize database:
    docker exec CONTAINER_NAME sqlite3 \
      /comics/.yacreaderlibrary/library_USERNAME.ydb "VACUUM;"
    

⁠Building from Source

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
⁠For Mac Desktop Client

See the build instructions in the source code, or download the pre-built DMG from releases.

⁠Project Structure

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

⁠Advanced Topics

⁠Custom Network Setup
networks:
  yacreader-net:
    driver: bridge
    ipam:
      config:
        - subnet: 172.20.0.0/16
⁠Reverse Proxy (Nginx)
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;
    }
}
⁠HTTPS with Traefik
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"

⁠Contributing

Contributions welcome! Please:

  1. Fork the repository
  2. Create a feature branch
  3. Make your changes
  4. Submit a pull request

⁠Resources

⁠Support

⁠License

This project packages YACReader, which is licensed under GPLv3.

⁠Acknowledgments

  • YACReader development team
  • YACReader multiuser fork contributors
  • Docker community

⁠Maintenance & Support

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

Tag summary

Content type

Image

Digest

sha256:4fc0779de…

Size

141.2 MB

Last updated

8 months ago

docker pull jaap14/yacreader-multiuser