Identity not found

Hello together,

am currently and quickly trying to run a node. But I am receiving the docker error message that the Path is not existing:

docker run -d --restart unless-stopped --stop-timeout 300 --name STORJ-01 storjlabs/storagenode:latest -e WALLET=“Wallet” -e EMAIL=“Email” -e STORAGE=“8TB” --user root:root --mount type=bind,source=“/mnt/3GG84812/STORJ-01/Identity/storagenode”,destination=/app/identity --mount type=bind,source=“/mnt/3GG84812/STORJ-01-Daten”,destination=/app/config

The dir /mnt/3GG84812 is the HDD with its serial number. The STORJ-01 and 01-Daten does exist behind it, but for some reason the STORJ docker is throwing the weird error message:

“file or directory not found: open identity/identity.cert: no such file or directory”

If you do an lsblk what does it return?


they are mounted, also in the fstab:

I have to go to the eye doctor because I can’t see…

The numbers do fit. I just put some random numbers in there for personal safety.

Edit: I didn’t run the SETUP on this machine, it was done on an unRAID. Would this change anything? The dir does exist also with an / at the end I’m getting the same error message.

Could you please show result of the command

ls -l /mnt/3GG84812/STORJ-01/Identity/storagenode

Please note - Linux is case-sensitive.


It seems fine, really dunno what is going on.

Since it belongs to root, you need either use sudo and remove --user root:root, or finish docker configuration, change the owner to your user and use option --user $(id -u):$(id -g) in your docker commands without sudo.

The top-Folders, named after the serial nos are not at root:


Maybe I should change owner and group to root (0)? Would this be good?

Dont want to run as user, always as root.

Am getting also the error message when trying to change:

You need to use

sudo chown root:root -R /mnt/3GG84812

I got the top folder changed to root:root. But still getting the same error message.

I’m also getting it not run with user ads. Change the top folder to user ads and then the identity and it is still the same error message. Also did the steps to user docker with user and no sudo.

So I’m back to unRAID from Ubuntu-Server.

Having the following summary:

The Drives are mounted with their serial number in /mnt/Serial-No automatically per fstab.

It works fine and all dirs are set up correctly. The identity dir can be found via ls or with WinSCP.

The main dir /mnt/serial-no is with the owner 99:100 somehow, which is coming from old unRAID-Setup. When I changed it to root:root it didn’t bring a difference and the identity couldn’t be found.

I also completed Docker Engine post-installation steps and tried to run it with a user. Also after I changed the identity owner and the top dir to the user it didn’t run and has shown the same error message of not found identity.

Please make sure that your docker run command have only straight quotes like " but not curly ones like or , also copy the path from the terminal (on case if they contain not ASCII characters).
Also please check the config.yaml in the /mnt/3GG84812/STORJ-01-Daten, it should not have modifications in paths, so it should look like:

# how frequently bandwidth usage rollups are calculated
# bandwidth.interval: 1h0m0s

# how frequently expired pieces are collected
# collector.interval: 1h0m0s

# use color in user interface
# color: false

# server address of the api gateway and frontend app
# console.address:

# path to static resources
# console.static-dir: ""

# the public address of the node, useful for nodes behind NAT
contact.external-address: ""

# how frequently the node contact chore should run
# contact.interval: 1h0m0s

# Maximum Database Connection Lifetime, -1ns means the stdlib default
# db.conn_max_lifetime: 30m0s

# Maximum Amount of Idle Database connections, -1 means the stdlib default
# db.max_idle_conns: 1

# Maximum Amount of Open Database connections, -1 means the stdlib default
# db.max_open_conns: 5

# address to listen on for debug endpoints
# debug.addr:

# expose control panel
# debug.control: false

# If set, a path to write a process trace SVG to
# debug.trace-out: ""

# open config in default editor
# edit-conf: false

# in-memory buffer for uploads
# filestore.write-buffer-size: 128.0 KiB

# how often to run the chore to check for satellites for the node to exit.
# graceful-exit.chore-interval: 1m0s

# the minimum acceptable bytes that an exiting node can transfer per second to the new node
# graceful-exit.min-bytes-per-second: 5.00 KB

# the minimum duration for downloading a piece from storage nodes before timing out
# graceful-exit.min-download-timeout: 2m0s

# number of concurrent transfers per graceful exit worker
# graceful-exit.num-concurrent-transfers: 5

# number of workers to handle satellite exits
# graceful-exit.num-workers: 4

# path to the certificate chain for this identity
identity.cert-path: identity/identity.cert

# path to the private key for this identity
identity.key-path: identity/identity.key

# if true, log function filename and line number
# log.caller: false

# if true, set logging to development mode
# log.development: false

# configures log encoding. can either be 'console', 'json', or 'pretty'.
# log.encoding: ""

# the minimum log level to log
log.level: info

# can be stdout, stderr, or a filename
# log.output: stderr

# if true, log stack traces
# log.stack: false

# address(es) to send telemetry to (comma-separated)
# metrics.addr:

# application name for telemetry identification
# storagenode

# application suffix
# -release

# instance id prefix
# metrics.instance-prefix: ""

# how frequently to send up telemetry
# metrics.interval: 1m0s

# path to log for oom notices
# monkit.hw.oomlog: /var/log/kern.log

# maximum duration to wait before requesting data
# nodestats.max-sleep: 5m0s

# how often to sync reputation
# nodestats.reputation-sync: 4h0m0s

# how often to sync storage
# 12h0m0s

# operator email address ""

# operator wallet address
operator.wallet: ""
# operator.wallet-features: ["zksync"]

# file preallocated for uploading
# pieces.write-prealloc-size: 4.0 MiB

# whether or not preflight check for database is enabled.
# preflight.database-check: true

# whether or not preflight check for local system clock is enabled on the satellite side. When disabling this feature, your storagenode may not setup correctly.
# preflight.local-time-check: true

# how many concurrent retain requests can be processed at the same time.
# retain.concurrency: 5

# allows for small differences in the satellite and storagenode clocks
# retain.max-time-skew: 72h0m0s

# allows configuration to enable, disable, or test retain requests from the satellite. Options: (disabled/enabled/debug)
# retain.status: enabled

# public address to listen on
server.address: :28967

# if true, client leaves may contain the most recent certificate revocation for the current certificate
# server.extensions.revocation: true

# if true, client leaves must contain a valid "signed certificate extension" (NB: verified against certs in the peer ca whitelist; i.e. if true, a whitelist must be provided)
# server.extensions.whitelist-signed-leaf: false

# path to the CA cert whitelist (peer identities must be signed by one these to be verified). this will override the default peer whitelist
# server.peer-ca-whitelist-path: ""

# identity version(s) the server will be allowed to talk to
# server.peer-id-versions: latest

# private address to listen on

# url for revocation database (e.g. bolt://some.db OR redis://
# server.revocation-dburl: bolt://config/revocations.db

# if true, uses peer ca whitelist checking
# server.use-peer-ca-whitelist: true

# total allocated bandwidth in bytes (deprecated)
storage.allocated-bandwidth: 0 B

# total allocated disk space in bytes
storage.allocated-disk-space: 1.00 TB

# how frequently Kademlia bucket should be refreshed with node stats
# storage.k-bucket-refresh-interval: 1h0m0s

# path to store data in
# storage.path: config/storage

# a comma-separated list of approved satellite node urls (unused)
# storage.whitelisted-satellites: ""

# how often the space used cache is synced to persistent storage
# storage2.cache-sync-interval: 1h0m0s

# directory to store databases. if empty, uses data path
# storage2.database-dir: ""

# size of the piece delete queue
# storage2.delete-queue-size: 10000

# how many piece delete workers
# storage2.delete-workers: 1

# how soon before expiration date should things be considered expired
# storage2.expiration-grace-period: 48h0m0s

# how many concurrent requests are allowed, before uploads are rejected. 0 represents unlimited.
# storage2.max-concurrent-requests: 0

# amount of memory allowed for used serials store - once surpassed, serials will be dropped at random
# storage2.max-used-serials-size: 1.00 MB

# how frequently Kademlia bucket should be refreshed with node stats
# storage2.monitor.interval: 1h0m0s

# how much bandwidth a node at minimum has to advertise (deprecated)
# storage2.monitor.minimum-bandwidth: 0 B

# how much disk space a node at minimum has to advertise
# storage2.monitor.minimum-disk-space: 500.00 GB

# how frequently to verify the location and readability of the storage directory
# storage2.monitor.verify-dir-readable-interval: 1m0s

# how frequently to verify writability of storage directory
# storage2.monitor.verify-dir-writable-interval: 5m0s

# how long after OrderLimit creation date are OrderLimits no longer accepted
# storage2.order-limit-grace-period: 1h0m0s

# length of time to archive orders before deletion
# storage2.orders.archive-ttl: 168h0m0s

# duration between archive cleanups
# storage2.orders.cleanup-interval: 5m0s

# maximum duration to wait before trying to send orders
# storage2.orders.max-sleep: 30s

# path to store order limit files in
# storage2.orders.path: config/orders

# timeout for dialing satellite during sending orders
# storage2.orders.sender-dial-timeout: 1m0s

# duration between sending
# storage2.orders.sender-interval: 1h0m0s

# timeout for sending
# storage2.orders.sender-timeout: 1h0m0s

# allows for small differences in the satellite and storagenode clocks
# storage2.retain-time-buffer: 48h0m0s

# how long to spend waiting for a stream operation before canceling
# 30m0s

# file path where trust lists should be cached
# config/trust-cache.json

# list of trust exclusions
# ""

# how often the trust pool should be refreshed
# 6h0m0s

# list of trust sources

# address for jaeger agent
# tracing.agent-addr:

# application name for tracing identification
# storagenode

# application suffix
# -release

# buffer size for collector batch packet size
# tracing.buffer-size: 0

# whether tracing collector is enabled
# tracing.enabled: false

# how frequently to flush traces to tracing agent
# tracing.interval: 0s

# buffer size for collector queue size
# tracing.queue-size: 0

# how frequent to sample traces
# tracing.sample: 0

# Interval to check the version
# version.check-interval: 15m0s

# Request timeout for version checks
# version.request-timeout: 1m0s

# server address to check its version against
# version.server-address:
log.output: "/app/config/storagenode.log"

The last error here

suggest that you have a syntax error somewhere in your docker run command, could you please show it in whole, but mask private information?
Please provide it here between two new lines with three backticks like this:

here is docker run

I have a feeling that you trying to provide options like -e ADDRESS=... after the image name, not before.

docker run -d --restart unless-stopped --stop-timeout 300 --name STORJ-01 storjlabs/storagenode:latest -e WALLET=“Wallet” -e EMAIL=“Email” -e ADDRESS=“Eaddress” -e STORAGE=“8TB” --user $(id -u):$(id -g) --net=container:netcontainer --mount type=bind,source=“/mnt/4…H/STORJ-01/Identity/storagenode/”,destination=/app/identity --mount type=bind,source=“/mnt/4…H/STORJ-01-Daten/”,destination=/app/config

Yes the Docker name is kinda more at the beginning. Does it matter and should it be at the end?

The order is very important, see

docker run --help

So, it should be

docker run -d --restart unless-stopped --stop-timeout 300 \
--name STORJ-01 \
-e WALLET="Wallet" \
-e EMAIL="Email" \
-e ADDRESS="Eaddress" \
-e STORAGE="8TB" \
--user $(id -u):$(id -g) \
--net=container:netcontainer \
--mount type=bind,source="/mnt/4…H/STORJ-01/Identity/storagenode/",destination=/app/identity \
--mount type=bind,source="/mnt/4…H/STORJ-01-Daten/",destination=/app/config \

Thank you very much again Alexey! That was the solution. The following docker run is working:

docker run -d --restart unless-stopped --stop-timeout 300
–name STORJ-N
-e WALLET=“Wallet”
-e EMAIL=“Email”
-e ADDRESS=“Eaddress”
–user $(id -u):$(id -g)
–mount type=bind,source=“/mnt/4…H/STORJ-N/Identity/storagenode/”,destination=/app/identity
–mount type=bind,source=“/mnt/4…H/STORJ-N-Daten/”,destination=/app/config

Unfortunately I had problems with the brackets in form of backslashes. Can you provide how to use these \ correctly? I had to put the run-command into one line but it looks not convenient in the notepad.

I had also the issue, that two containers were running from the systemstart. Is it possible to turn this off? And can the run-commands, multiple, because there are also STORJ-Exporter-Dockers for the Grafana-Dashboard running, been put into one greater-docker-run-command / file?

If you copy it to notepad, you can actually remove back slashes, it will be in one line.
However I would like to suggest to use Notepad++ instead - it’s code-friendly unlike usual Notepad, but well.

You can use something like docker-compose, see