Back but have some Q's

np, the guide did not mention what permission to set neither if i should create the folders first or if they would be created automatic

the reason i use portainer is that i have a gui that way and can just drop in the stack file and it should “just run”… but in a nutshell portainer i just that, a gui for docker

EDIT: well some folders i had to create myself, the Identity one as i copied the ident files from a folder belonging to root user, and yes i know you should not run things as root, but that is what i did when i created the ident

EDIT2:

the guide shows this example for running directly from CLI

docker run -d --restart unless-stopped --stop-timeout 300 \
    -p 28967:28967/tcp \
    -p 28967:28967/udp \
    -p 127.0.0.1:14002:14002 \
    -e WALLET="0xXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" \
    -e EMAIL="user@example.com" \
    -e ADDRESS="domain.ddns.net:28967" \
    -e STORAGE="2TB" \
    --user $(id -u):$(id -g) \
    --mount type=bind,source="<identity-dir>",destination=/app/identity \
    --mount type=bind,source="<storage-dir>",destination=/app/config \
    --name storagenode storjlabs/storagenode:latest

looks much like the stack file and one line that is not in the stack file:

--user $(id -u):$(id -g) \

i wonder if that could be what is wrong?

That tells the node to run as same user and group that ran docker compose - ie current user/group - this is ideal - would use whatever user portainer uses.

chmod 755 -R /srv/mergerfs/Data/Storj/

may fix it. If not 775, 777 will definitely fix, but far from ideal.

that did not do it

current stack file:



version: "3.7"
services:
  storagenode1:
    container_name: storagenode1
    restart: always
    stop_grace_period: 300s
    image: storjlabs/storagenode:latest
    ports:
      - "28969:28967/tcp"
      - "28969:28967/udp"
      - "****"
    user: "${UID}:${GID}"
    volumes:
      - type: bind
        source: /srv/mergerfs/Data/Storj/Identity/
        target: /app/identity
      - type: bind
        source: /srv/mergerfs/Data/Storj/Storage/
        target: /app/config
    environment:
      - WALLET=****
      - EMAIL=****
      - ADDRESS=****
      - STORAGE=2TB

I even tried to delete everything in the storage folder and use

      - SETUP=true

EDIT:
will look at this in the morning…. but yes i use mergerfs to join several disks, the smart thing is that i can replace a small disk in the array with a bigger one without loosing data and it does not take long to do

and other posts only says its a real problem if the disks fail

I bet it has something to do with the extended ACLs on the files and folders in /srv/mergerfs/Data/Storj/Storage (the + at the end of file permission string -rw-------+). I would remove those and also recursive set the ownership of /srv/mergerfs/Data/Storj/Storage to the same values you specify under user in your docker-compose file.

i dont use a docker compose file….???

The file you posted as current stack looks like a docker compose file. There you have a user with userid and groupid.

chown -R <userid>:<groupid> <directory>

yes, i just try to gather a working compose file from examples on the forum as the guides do not have one

i guess you mean :

user: “${UID}:${GID}”

but i have not set a speccific user in the file

If you do not set a user in the docker compose file the container will run as root. Then you can set userid and groupid to your userid and groupid and root will be able to read/write. You can find those with

id -u
id -g

But most important part is to get rid of the + on the permissions

so either remove that line in the compose file or replace with

user: “0:0”

root@bo-omv:/mnt# id -u
0
root@bo-omv:/mnt# id -g
0
root@bo-omv:/mnt#

EDIT: but i agree to get rid of the +

i created the folders from within openmediavault so i could control them from there… might not have been the best choice

EDIT2:

root@bo-omv:/srv/mergerfs/Data# chown -R 0:0 /srv/mergerfs/Data/Storj/

root@bo-omv:/srv/mergerfs/Data# ls -l /srv/mergerfs/Data/Storj/
totalt 8
drwxrwsrwx+ 2 root root 4096 28 okt 21:44 Identity
drwxrwsrwx+ 4 root root 4096 30 okt 00:54 Storage

so not gone :frowning:

ah you are root user. The chown command is not important when you run the container as root.

i run it from portainer… not on cli…

To get rid of the + you need

setfacl -Rb <directory>

root@bo-omv:/srv/mergerfs/Data# setfacl -Rb /srv/mergerfs/Data/Storj/
root@bo-omv:/srv/mergerfs/Data# ls -l /srv/mergerfs/Data/Storj/
totalt 8
drwxrwsrwx 2 root root 4096 28 okt 21:44 Identity
drwxrwsrwx 4 root root 4096 30 okt 00:54 Storage

will try and restart the stack

EDIT: still the same

root@bo-omv:/srv/mergerfs/Data/Storj/Storage# sudo docker logs --tail 40 storagenode1
2025-10-30T00:12:04Z    INFO    Operator wallet {"Process": "storagenode", "Address": "****"}
2025-10-30T00:12:04Z    INFO    db      database does not exist {"Process": "storagenode", "database": "info"}
2025-10-30T00:12:04Z    INFO    db      database does not exist {"Process": "storagenode", "database": "bandwidth"}
2025-10-30T00:12:04Z    INFO    db      database does not exist {"Process": "storagenode", "database": "orders"}
2025-10-30T00:12:04Z    INFO    db      database does not exist {"Process": "storagenode", "database": "piece_expiration"}
2025-10-30T00:12:04Z    INFO    db      database does not exist {"Process": "storagenode", "database": "pieceinfo"}
2025-10-30T00:12:04Z    INFO    db      database does not exist {"Process": "storagenode", "database": "piece_spaced_used"}
2025-10-30T00:12:04Z    INFO    db      database does not exist {"Process": "storagenode", "database": "reputation"}
2025-10-30T00:12:04Z    INFO    db      database does not exist {"Process": "storagenode", "database": "storage_usage"}
2025-10-30T00:12:04Z    INFO    db      database does not exist {"Process": "storagenode", "database": "used_serial"}
2025-10-30T00:12:04Z    INFO    db      database does not exist {"Process": "storagenode", "database": "satellites"}
2025-10-30T00:12:04Z    INFO    db      database does not exist {"Process": "storagenode", "database": "notifications"}
2025-10-30T00:12:04Z    INFO    db      database does not exist {"Process": "storagenode", "database": "heldamount"}
2025-10-30T00:12:04Z    INFO    db      database does not exist {"Process": "storagenode", "database": "pricing"}
2025-10-30T00:12:04Z    INFO    db      database does not exist {"Process": "storagenode", "database": "secret"}
2025-10-30T00:12:04Z    INFO    db      database does not exist {"Process": "storagenode", "database": "garbage_collection_filewalker_progress"}
2025-10-30T00:12:04Z    INFO    db      database does not exist {"Process": "storagenode", "database": "used_space_per_prefix"}
2025-10-30T00:12:04Z    ERROR   failure during run      {"Process": "storagenode", "error": "Error opening revocation database: revocation database: boltdb: no such device\n\tstorj.io/storj/private/kvstore/boltdb.New:43\n\tstorj.io/storj/private/revocation.openDBBolt:52\n\tstorj.io/storj/private/revocation.OpenDB:35\n\tstorj.io/storj/private/revocation.OpenDBFromCfg:23\n\tmain.cmdRun:76\n\tmain.newRunCmd.func1:33\n\tstorj.io/common/process.InitBeforeExecute.func1.2:389\n\tstorj.io/common/process.InitBeforeExecute.func1:407\n\tgithub.com/spf13/cobra.(*Command).execute:985\n\tgithub.com/spf13/cobra.(*Command).ExecuteC:1117\n\tgithub.com/spf13/cobra.(*Command).Execute:1041\n\tstorj.io/common/process.ExecWithCustomOptions:115\n\tmain.main:34\n\truntime.main:283", "errorVerbose": "Error opening revocation database: revocation database: boltdb: no such device\n\tstorj.io/storj/private/kvstore/boltdb.New:43\n\tstorj.io/storj/private/revocation.openDBBolt:52\n\tstorj.io/storj/private/revocation.OpenDB:35\n\tstorj.io/storj/private/revocation.OpenDBFromCfg:23\n\tmain.cmdRun:76\n\tmain.newRunCmd.func1:33\n\tstorj.io/common/process.InitBeforeExecute.func1.2:389\n\tstorj.io/common/process.InitBeforeExecute.func1:407\n\tgithub.com/spf13/cobra.(*Command).execute:985\n\tgithub.com/spf13/cobra.(*Command).ExecuteC:1117\n\tgithub.com/spf13/cobra.(*Command).Execute:1041\n\tstorj.io/common/process.ExecWithCustomOptions:115\n\tmain.main:34\n\truntime.main:283\n\tmain.cmdRun:78\n\tmain.newRunCmd.func1:33\n\tstorj.io/common/process.InitBeforeExecute.func1.2:389\n\tstorj.io/common/process.InitBeforeExecute.func1:407\n\tgithub.com/spf13/cobra.(*Command).execute:985\n\tgithub.com/spf13/cobra.(*Command).ExecuteC:1117\n\tgithub.com/spf13/cobra.(*Command).Execute:1041\n\tstorj.io/common/process.ExecWithCustomOptions:115\n\tmain.main:34\n\truntime.main:283"}
Error: Error opening revocation database: revocation database: boltdb: no such device
        storj.io/storj/private/kvstore/boltdb.New:43
        storj.io/storj/private/revocation.openDBBolt:52
        storj.io/storj/private/revocation.OpenDB:35
        storj.io/storj/private/revocation.OpenDBFromCfg:23
        main.cmdRun:76
        main.newRunCmd.func1:33
        storj.io/common/process.InitBeforeExecute.func1.2:389
        storj.io/common/process.InitBeforeExecute.func1:407
        github.com/spf13/cobra.(*Command).execute:985
        github.com/spf13/cobra.(*Command).ExecuteC:1117
        github.com/spf13/cobra.(*Command).Execute:1041
        storj.io/common/process.ExecWithCustomOptions:115
        main.main:34
        runtime.main:283
2025-10-30 00:12:04,562 WARN exited: storagenode (exit status 1; not expected)
2025-10-30 00:12:04,562 INFO gave up: storagenode entered FATAL state, too many start retries too quickly
2025-10-30 00:12:06,565 WARN received SIGQUIT indicating exit request
2025-10-30 00:12:06,566 INFO waiting for processes-exit-eventlistener, storagenode-updater to die
2025-10-30T00:12:06Z    INFO    Got a signal from the OS: "terminated"  {"Process": "storagenode-updater"}
2025-10-30 00:12:06,569 INFO stopped: storagenode-updater (exit status 0)
2025-10-30 00:12:07,571 WARN stopped: processes-exit-eventlistener (terminated by SIGTERM)

Is /srv/mergerfs/Data/Storj/ placed on a local drive?

yes but an array of drives using mergerfs

Here is what chatgpt has to say about mergerfs and storj nodes:

Yes — mergerfs can definitely cause this exact “boltdb: no such device” error with Storj.

Here’s why:

  • BoltDB (used by Storj for internal databases, including revocations.db) requires POSIX file locking (flock) and memory-mapped I/O (mmap).
  • mergerfs does not fully support flock across branches and sometimes fails fallocate, fsync, or mmap depending on the underlying filesystem options.
  • As a result, BoltDB sees it as a “non-native” or “unsupported” device and aborts with no such device.

:white_check_mark: Confirm the problem

Run this inside your node’s host:

df -T /srv/mergerfs/Data/Storj/

If the Type column shows fuse.mergerfs, that’s the culprit.

Remove contents of config dir and rerun with SETUP, failing that, What is result of:

ls -l /srv/mergerfs/Data/Storj
ls -l /srv/mergerfs/Data
ls -l /srv/mergerfs

But this sounds more like it:

:frowning: bummer…. hmmm….

well… need to cook up a plan to get arround this if i can, but there is not much light at the end of the tunnel

There maybe a way.

There are these to configuration options to relocate databases. Use bind mount to mount a folder not on mergefs (eg: /srv/storjdb/) to /app/dbs

Change in config.yaml

server.revocation-dburl: bolt:///app/dbs/revocations.db

storage2.database-dir: /app/dbs

i was thinking of that

ie mount the folder to a folder outside mergerfs… ie /mnt

but its late… i need some sleep

EDIT: or this one is a bit… lets say “janky”…. but share the folder in mergerfs over smb and mount it via fstab… but think that is the same as above…. (this proofs that i need sleep)