- Docker v20.10+ with Compose v2
- Your Docker Compose stacks accessible on the filesystem
Copy the included docker-compose.yml and set your stacks path:
# Check your user ID (use these for PUID/PGID)
id
# uid=1000(youruser) gid=1000(youruser)
# Edit .env or export variables
export STACKS_PATH=/path/to/your/stacks
export PUID=1000
export PGID=1000
docker compose up -dOpen http://localhost:9494 in your browser.
docker run -d \
--name maparr \
-p 9494:9494 \
-e PUID=1000 \
-e PGID=1000 \
-v /path/to/your/stacks:/stacks:ro \
ghcr.io/coaxk/maparr:latestMounting the Docker socket lets MapArr use docker compose config for full
variable substitution, extends, and includes resolution.
docker run -d \
--name maparr \
-p 9494:9494 \
-e PUID=1000 \
-e PGID=1000 \
-v /path/to/your/stacks:/stacks:ro \
-v /var/run/docker.sock:/var/run/docker.sock:ro \
ghcr.io/coaxk/maparr:latestRemove :ro from the stacks mount to allow MapArr to write corrected compose files:
docker run -d \
--name maparr \
-p 9494:9494 \
-e PUID=1000 \
-e PGID=1000 \
-v /path/to/your/stacks:/stacks \
-v /var/run/docker.sock:/var/run/docker.sock:ro \
ghcr.io/coaxk/maparr:latestIf you use a Docker socket proxy (Tecnativa, LinuxServer, etc.):
docker run -d \
--name maparr \
-p 9494:9494 \
-e PUID=1000 \
-e PGID=1000 \
-e DOCKER_HOST=tcp://socket-proxy:2375 \
-v /path/to/your/stacks:/stacks:ro \
ghcr.io/coaxk/maparr:latestNo socket mount needed. MapArr only uses docker compose config — if your
proxy blocks it, MapArr falls back to manual YAML parsing automatically.
| Variable | Default | Description |
|---|---|---|
PUID |
1000 |
User ID to run as — match your host user (id -u) |
PGID |
1000 |
Group ID to run as — match your host group (id -g) |
MAPARR_PORT |
9494 |
Internal port (change if 9494 conflicts) |
MAPARR_STACKS_PATH |
/stacks |
Container path to scan (set by volume mount) |
DOCKER_HOST |
(system) | Docker daemon endpoint — set for socket proxy |
LOG_LEVEL |
info |
Log verbosity: debug, info, warning, error |
Standard setup. Run id to get your PUID/PGID.
-e PUID=1000 -e PGID=1000
-v /var/run/docker.sock:/var/run/docker.sock:roInstall via Community Applications or manually add the container:
- Docker tab → Add Container
- Repository:
ghcr.io/coaxk/maparr:latest - Network Type: Bridge
- Port:
9494→9494 - Add Path:
- Container Path:
/stacks - Host Path:
/mnt/user/appdata(or wherever your compose files live) - Access Mode: Read Only (or Read/Write for Apply Fix)
- Container Path:
- Add Path (optional):
- Container Path:
/var/run/docker.sock - Host Path:
/var/run/docker.sock - Access Mode: Read Only
- Container Path:
- Add Variable:
PUID= your Unraid user ID (usually99on Unraid)PGID=100(users group on Unraid)
Unraid PUID/PGID: Unraid typically uses PUID=99 PGID=100 (nobody:users).
Check your setup — if your *arr apps use different values, match those.
- Container Manager → Create → Import docker-compose.yml or use the Docker CLI via SSH
- PUID/PGID: SSH into your NAS and run
idfor your admin user. Synology often uses UID1026or1000depending on account order. - Stacks path: Mount your compose files directory. Common locations:
/volume1/docker(if stacks are in the docker shared folder)/volume1/data/docker(varies by setup)
- Docker socket: Available at
/var/run/docker.sockvia SSH. Container Manager may not expose this in the GUI — use CLI or compose. - ACLs: If you get permission errors despite correct PUID/PGID,
Synology's ACLs may be overriding UNIX permissions. Fix via:
sudo synoacltool -enforce-inherit /volume1/docker
Same as Linux — Docker Desktop exposes the Unix socket at the same path.
PUID/PGID should match your macOS user (usually 501:20):
-e PUID=501 -e PGID=20Run from a WSL2 terminal. Your stacks path should be a Linux path:
-v /mnt/c/DockerContainers:/stacks:roPUID/PGID: Use 1000:1000 (default WSL2 user).
-v //var/run/docker.sock:/var/run/docker.sock:roNote the double forward slash for the socket path.
MapArr works with Portainer — deploy via Stacks using the docker-compose.yml. However, if you run into issues, try deploying via CLI instead. The Servarr Wiki recommends CLI/Compose over Portainer for *arr-related containers due to how Portainer abstracts container configuration.
docker logs maparr
# Should show: MapArr v1.5.0 / Running as UID: <your PUID> GID: <your PGID>
curl http://localhost:9494/api/health
# {"status":"ok","version":"1.5.0"}MapArr ships with a database of 200+ Docker images it recognizes automatically. If you run a custom or self-built image that MapArr doesn't classify correctly, you can add a custom override file.
Create a custom-images.json file and mount it into the container:
volumes:
- ./custom-images.json:/data/custom-images.json:roExample custom-images.json:
{
"version": 1,
"families": {},
"images": {
"my-custom-arr": {
"name": "My Custom Arr App",
"role": "arr",
"family": "linuxserver",
"patterns": ["myregistry/my-custom-arr"],
"keywords": ["my-custom-arr"],
"hardlink_capable": true,
"docs_url": "https://github.com/me/my-custom-arr"
}
}
}Fields:
role:"arr","download_client","media_server","request", or"other"family:"linuxserver","hotio","jlesage","binhex", ornullfor independent imagespatterns: substrings to match against the Docker image stringkeywords: substrings to match against the service namehardlink_capable: whether this service participates in hardlink analysis
Your custom file persists across MapArr updates — it's your file, not ours.
Permission denied on /stacks:
Your PUID/PGID doesn't match the owner of the stacks directory. Run ls -la
on the host to check ownership, then set PUID/PGID to match.
"docker compose config unavailable" in logs: MapArr can't reach the Docker daemon. Either mount the socket or set DOCKER_HOST for your socket proxy. This is non-fatal — MapArr falls back to manual YAML parsing, which works for most *arr stacks.
Port conflict:
Change the port: -e MAPARR_PORT=9595 -p 9595:9595
403 "Cannot browse system directories" when setting stacks path:
MapArr blocks system directories (/etc, /proc, /sys, /root, /home, etc.)
from being scanned as a security precaution. If your compose files live under
/home, move them to a dedicated directory like /opt/docker, /srv/docker,
or /data/docker and mount that instead. This prevents accidental exposure of
user home directories (SSH keys, shell history, credentials) through the
directory browser.
Apply Fix not working:
Mount your stacks directory without :ro (read-only) — MapArr needs write
access to save corrected compose files.
cd maparr
pip install -r requirements.txt
python -m uvicorn backend.main:app --host 0.0.0.0 --port 9494Open http://localhost:9494. Set MAPARR_STACKS_PATH to your stacks directory.