Component
Agent
Description
Unraid bind mounts directories to containers using overlay2 in a special manner (from what I gather), whereby RW and RO access to root (/) and RW to /mnt is disallowed. Therefore, one must use a full virtual path to a "user share", such as "Arkeep" at /mnt/user/Arkeep.
Arkeep does not seem to appreciate this. After job execution but prior to its run, the prerun check (using mkdir) fails and therefore so does the backup job altogether.
Despite failures in job runs, it is known that the directory/destination is writable per:
# Direct write test — succeeds
docker exec arkeep-agent touch /hostfs/mnt/user/Arkeep/test-write
# → success
# mkdir test — succeeds
docker exec arkeep-agent mkdir -p /hostfs/mnt/user/Arkeep/test-dir
# → success
Steps to Reproduce
- Spin up AIO (Server + Agent) container (Debian 13 VPS) - works fine
- Spin up Agent-only container (Unraid):
services:
agent:
image: ghcr.io/arkeep-io/arkeep-agent:latest
container_name: arkeep-agent
restart: unless-stopped
network_mode: bridge
environment:
ARKEEP_SERVER_ADDR: "${ARKEEP_SERVER_ADDR:?ARKEEP_SERVER_ADDR is required — gRPC address, e.g. arkeep.example.com:9090}"
ARKEEP_AGENT_SECRET: "${ARKEEP_AGENT_SECRET:?ARKEEP_AGENT_SECRET is required — must match the server}"
ARKEEP_SERVER_HTTP_ADDR: "${ARKEEP_SERVER_HTTP_ADDR:-}"
ARKEEP_STATE_DIR: "/var/lib/arkeep-agent"
ARKEEP_LOG_LEVEL: "${ARKEEP_LOG_LEVEL:-info}"
TZ: "${TZ:-UTC}"
ARKEEP_DOCKER_HOST_ROOT: "/hostfs"
volumes:
- /mnt/cache/appdata/arkeep/data/agent:/var/lib/arkeep-agent
# - /:/hostfs:ro
- /mnt/user:/hostfs/mnt/user:rw
- /var/run/docker.sock:/var/run/docker.sock:ro
- /var/lib/docker/volumes:/var/lib/docker/volumes:ro
Additional testing
- Uncommented
/:/hostfs:rw bind
- Altered to
/:/hostfs:ro bind
- Commenting
ARKEEP_DOCKER_HOST_ROOT variable
- Enroll agents - works fine
- Set destination:
Additional testing
- Changing path to:
/hostfs/mnt/user/Arkeep
- Deleting destination; recreating anew (tried both paths above)
- Ran job - immediate failure
Additional testing
- Re-ran same job (via policy) after modifying and rebuilding the docker container - always an immediate failure
- Side note: I noticed that you cannot remove a destination selected for a policy once that policy has been committed. Any subsequent changes will revert (can make a new issue for this).
- Created new policies and job runs to test changes above, with the assumption that there was a hard pairing between policy, destination, job IDs - and attempts.
Expected Behavior
Expected
Agent translates /mnt/user/Arkeep → /hostfs/mnt/user/Arkeep via ARKEEP_DOCKER_HOST_ROOT, then checks writability against the translated path, which is a real writable bind-mount.
Actual
The pre-check fails before the job runs with:
local path "/mnt/user/Arkeep" is not writable: mkdir /mnt: read-only file system
The error shows that the pre-check is attempting mkdir /mnt — walking up from the container root rather than through the hostfs translation — and hitting the read-only overlay at /mnt before ever reaching the writable bind-mount.
Arkeep Version
v0.3.0 (Docker)
Deployment Method
Docker Compose
Relevant Logs
### Job Detail
5:16:24 PM
INFO
backup started
5:16:24 PM
INFO
resolved 1 source(s)
5:16:24 PM
INFO
backing up to destination 019dcb9f-cb48-779f-8cf5-58dffd31ea73 (type: local)
5:16:24 PM
ERROR
backup to destination 019dcb9f-cb48-779f-8cf5-58dffd31ea73 failed: local path "/mnt/user/Arkeep" is not writable: mkdir /mnt: read-only file system — if running inside Docker, set ARKEEP_DOCKER_HOST_ROOT and mount the host filesystem (e.g. /:/hostfs:rw on Linux, C:/:/hostfs/c:rw on Windows), or set PUID/PGID to match the directory owner
5:16:24 PM
ERROR
one or more destinations failed
### Job Detail
5:31:02 PM
INFO
backup started
5:31:02 PM
INFO
resolved 1 source(s)
5:31:02 PM
INFO
backing up to destination 019dcbb1-998a-73a4-8d9c-653192797d66 (type: local)
5:31:02 PM
ERROR
backup to destination 019dcbb1-998a-73a4-8d9c-653192797d66 failed: local path "/hostfs/mnt/user/Arkeep" is not writable: mkdir /hostfs: read-only file system — if running inside Docker, set ARKEEP_DOCKER_HOST_ROOT and mount the host filesystem (e.g. /:/hostfs:rw on Linux, C:/:/hostfs/c:rw on Windows), or set PUID/PGID to match the directory owner
5:31:02 PM
ERROR
one or more destinations failed
Additional Context
Environment:
Arkeep agent version: 0.3.0
Deployment: Docker (Compose Manager on Unraid 6.12+)
Host OS: Unraid (root filesystem is a union/overlay — /mnt is a virtual mount point, not a real writable directory)
Overlay Network: Headscale (Tailscale variant) - working fine
Configuration:
environment:
ARKEEP_DOCKER_HOST_ROOT: "/hostfs"
volumes:
- /mnt/user:/hostfs/mnt/user:rw
- /var/run/docker.sock:/var/run/docker.sock:ro
- /var/lib/docker/volumes:/var/lib/docker/volumes:ro
Working hypothesis:
The writability pre-check appears to apply mkdir -p style logic against the untranslated path on the container filesystem, rather than against the hostfs-translated path. On a standard Linux host /mnt exists and is writable so this goes unnoticed, but on Unraid /mnt in the container root (via /:/hostfs:ro) is a read-only overlay mount point, exposing the issue.
Thank you in advance! Please let me know if additional information would help.
Component
Agent
Description
Unraid bind mounts directories to containers using
overlay2in a special manner (from what I gather), whereby RW and RO access to root (/) and RW to/mntis disallowed. Therefore, one must use a full virtual path to a "user share", such as "Arkeep" at/mnt/user/Arkeep.Arkeep does not seem to appreciate this. After job execution but prior to its run, the prerun check (using
mkdir) fails and therefore so does the backup job altogether.Despite failures in job runs, it is known that the directory/destination is writable per:
Steps to Reproduce
Additional testing
/:/hostfs:rwbind/:/hostfs:robindARKEEP_DOCKER_HOST_ROOTvariable/mnt/user/ArkeepAdditional testing
/hostfs/mnt/user/ArkeepAdditional testing
Expected Behavior
Expected
Agent translates
/mnt/user/Arkeep→/hostfs/mnt/user/ArkeepviaARKEEP_DOCKER_HOST_ROOT, then checks writability against the translated path, which is a real writable bind-mount.Actual
The pre-check fails before the job runs with:
local path "/mnt/user/Arkeep" is not writable: mkdir /mnt: read-only file systemThe error shows that the pre-check is attempting
mkdir /mnt— walking up from the container root rather than through the hostfs translation — and hitting the read-only overlay at/mntbefore ever reaching the writable bind-mount.Arkeep Version
v0.3.0 (Docker)
Deployment Method
Docker Compose
Relevant Logs
Additional Context
Environment:
Arkeep agent version:
0.3.0Deployment: Docker (Compose Manager on Unraid 6.12+)
Host OS: Unraid (root filesystem is a union/overlay —
/mntis a virtual mount point, not a real writable directory)Overlay Network: Headscale (Tailscale variant) - working fine
Configuration:
Working hypothesis:
The writability pre-check appears to apply
mkdir -pstyle logic against the untranslated path on the container filesystem, rather than against the hostfs-translated path. On a standard Linux host/mntexists and is writable so this goes unnoticed, but on Unraid/mntin the container root (via/:/hostfs:ro) is a read-only overlay mount point, exposing the issue.Thank you in advance! Please let me know if additional information would help.