The panel displays quic with "Misconfigured" and cannot connect to the us1 eu1 node

storj sno node operation and maintenance

I’m running my node within a school in China. I’ve encountered the following problem and would appreciate some assistance:

1. The quic command appears to be unable to display its status correctly.

Since I don’t have admin power over the optical modem and router, I chose to rent frp server from the service provider to tunnel to the public network. Currently, I’ve selected a Hong Kong node, which forwards both TCP and UDP ports, from port 28967 on the internal network to port 38967.

However, the panel’s quic function initially indicates “ok” upon startup, but most of the time it indicates “Misconfigured,” only occasionally reverting to “ok.”

I tried using the methods mentioned in the forum to directly access the domain name to check the status and pingdom, and both showed that it was working normally. So, can I ignore this problem?

2. Connection errors caused by the GFW (Great Firewall).

The Great Firewall has blocked several important domains, including: github.com, storj.io, and hub.docker.com.

I found an mirror repository for Docker Hub, so I could pull it normally. However, when setup the image, I couldn’t download the tools from GitHub, so I used v2rayA as a proxy.

After the node starts, I can connect to the ap1 node normally without a proxy, but I cannot connect to the eu1 and us1 nodes. What impact will there be if these two nodes are not connected?

Do I really need to run the node with a proxy enabled? If yes, I need to create a rule table. Which domain names need to be proxied?

3. Regarding the region

As I mentioned, I run nodes within China, but I use NAT traversal technology. This frp provider also offers frp nodes in other cities in China and frp nodes in countries such as the United States, the United Kingdom, and Japan. In the end, according to Storj, where exactly is my node located?

Hello @teacup418,
Welcome to the forum!

Seems you cannot run a node without a VPN - the US1 and EU1 satellites cannot contact it, and this is a bigger issue than not fully supported QUIC by your tunnel.
If these satellites cannot contact your node it will be offline for them, so it will be disqualified on them. Since Saltlake is in US too, it likely will be next.

1 Like

Sorry, I’m new to storj, after some work, I have more questions.

How should I test connectivity? Should I test it in Docker or on the host machine?

What test tools should I use? What protocols do I need to test? I try curl with proxy enbale on host machine, port 7777 seems no a http or https port.

curl -v http://us1.storj.io:7777
*   Trying 108.160.165.173:7777...
* Connected to us1.storj.io (108.160.165.173) port 7777 (#0)
> GET / HTTP/1.1
> Host: us1.storj.io:7777
> User-Agent: curl/7.88.1
> Accept: */*
> 
* Empty reply from server
* Closing connection 0
curl: (52) Empty reply from server

What protocols should I proxy? TCP, or both TCP and UDP, or is it sufficient to proxy the socket directly?

You need to test your node’s address and port outside of your network, from US and EU locations. Even the simple GET request, like you did here:

You can also check your logs for errors like “ping satellite failed”, there could be some explanation “why?” too.

Because if the satellites cannot contact your node, then the customers wouldn’t be able too.

However, your node could be affected by this satellite side issue:

So, maybe your node is properly configured, but just doesn’t receive audits to correct the online score due to this issue, especially if you do not have errors like “ping satellite failed” in your logs. In that case I would recommend to keep it running, maybe the audit issue would be identified and fixed soon.

logs

Here are some important logs as follows:

These indicate that my time is not in sync.

2025-12-09T10:04:54Z	ERROR	preflight:localtime	unable to get satellite system time	{"Process": "storagenode", "Satellite ID": "12L9ZFwhzVpuEKMUNUqkaTLGzwY9G24tbiigLiXpmZWKwmcNDDs", "error": "rpc: tcp connector failed: rpc: EOF", "errorVerbose": "rpc: tcp connector failed: rpc: EOF\n\tstorj.io/common/rpc.HybridConnector.DialContext.func1:190"}
2025-12-09T10:04:54Z	ERROR	preflight:localtime	unable to get satellite system time	{"Process": "storagenode", "Satellite ID": "12EayRS2V1kEsWESU9QMRseFhdxYxKicsiFmxrsLZHeLUtdps3S", "error": "rpc: tcp connector failed: rpc: EOF", "errorVerbose": "rpc: tcp connector failed: rpc: EOF\n\tstorj.io/common/rpc.HybridConnector.DialContext.func1:190"}
2025-12-09T10:04:54Z	ERROR	preflight:localtime	unable to get satellite system time	{"Process": "storagenode", "Satellite ID": "121RTSDpyNZVcEU84Ticf2L1ntiuUimbWgfATz21tuvgk3vzoA6", "error": "rpc: tcp connector failed: rpc: EOF", "errorVerbose": "rpc: tcp connector failed: rpc: EOF\n\tstorj.io/common/rpc.HybridConnector.DialContext.func1:190"}

These say I can’t connect to the satellite:

2025-12-09T10:04:55Z	ERROR	contact:service	ping satellite failed 	{"Process": "storagenode", "Satellite ID": "12EayRS2V1kEsWESU9QMRseFhdxYxKicsiFmxrsLZHeLUtdps3S", "attempts": 1, "error": "ping satellite: rpc: tcp connector failed: rpc: EOF", "errorVerbose": "ping satellite: rpc: tcp connector failed: rpc: EOF\n\tstorj.io/common/rpc.HybridConnector.DialContext.func1:190"}
2025-12-09T10:06:15Z	ERROR	contact:service	ping satellite failed 	{"Process": "storagenode", "Satellite ID": "121RTSDpyNZVcEU84Ticf2L1ntiuUimbWgfATz21tuvgk3vzoA6", "attempts": 1, "error": "ping satellite: rpc: tcp connector failed: rpc: EOF", "errorVerbose": "ping satellite: rpc: tcp connector failed: rpc: EOF\n\tstorj.io/common/rpc.HybridConnector.DialContext.func1:190"}
2025-12-09T10:06:15Z	ERROR	contact:service	ping satellite failed 	{"Process": "storagenode", "Satellite ID": "12L9ZFwhzVpuEKMUNUqkaTLGzwY9G24tbiigLiXpmZWKwmcNDDs", "attempts": 1, "error": "ping satellite: rpc: tcp connector failed: rpc: EOF", "errorVerbose": "ping satellite: rpc: tcp connector failed: rpc: EOF\n\tstorj.io/common/rpc.HybridConnector.DialContext.func1:190"}

There are also some strange orders. It says the orders are completed, but report are failed.

2025-12-09T10:05:13Z	INFO	orders	finished	{"Process": "storagenode", "satelliteID": "12EayRS2V1kEsWESU9QMRseFhdxYxKicsiFmxrsLZHeLUtdps3S", "count": 422}
2025-12-09T10:05:13Z	ERROR	orders	failed to settle orders for satellite	{"Process": "storagenode", "satelliteID": "12EayRS2V1kEsWESU9QMRseFhdxYxKicsiFmxrsLZHeLUtdps3S", "satellite ID": "12EayRS2V1kEsWESU9QMRseFhdxYxKicsiFmxrsLZHeLUtdps3S", "error": "order: failed to start settlement: rpc: tcp connector failed: rpc: EOF", "errorVerbose": "order: failed to start settlement: rpc: tcp connector failed: rpc: EOF\n\tstorj.io/storj/storagenode/orders.(*Service).settleWindow:264\n\tstorj.io/storj/storagenode/orders.(*Service).SendOrders.func2:219\n\tgolang.org/x/sync/errgroup.(*Group).Go.func1:93"}
2025-12-09T10:06:34Z	INFO	orders	finished	{"Process": "storagenode", "satelliteID": "121RTSDpyNZVcEU84Ticf2L1ntiuUimbWgfATz21tuvgk3vzoA6", "count": 46}
2025-12-09T10:06:34Z	ERROR	orders	failed to settle orders for satellite	{"Process": "storagenode", "satelliteID": "121RTSDpyNZVcEU84Ticf2L1ntiuUimbWgfATz21tuvgk3vzoA6", "satellite ID": "121RTSDpyNZVcEU84Ticf2L1ntiuUimbWgfATz21tuvgk3vzoA6", "error": "order: failed to start settlement: rpc: tcp connector failed: rpc: EOF", "errorVerbose": "order: failed to start settlement: rpc: tcp connector failed: rpc: EOF\n\tstorj.io/storj/storagenode/orders.(*Service).settleWindow:264\n\tstorj.io/storj/storagenode/orders.(*Service).SendOrders.func2:219\n\tgolang.org/x/sync/errgroup.(*Group).Go.func1:93"}

Do I need to upload the complete logs? If so, what private information needs to be removed?

My Attempt

This is my routingA list

default: direct

domain(domain:storj.io) -> proxy
domain(domain:debian.org)->proxy
# write your own rules below
domain(domain:qq.com)->direct
domain(geosite:google-scholar)->proxy
domain(geosite:category-scholar-!cn, geosite:category-scholar-cn)->direct
domain(geosite:geolocation-!cn, geosite:google)->proxy
domain(geosite:cn)->direct
ip(geoip:hk,geoip:mo)->proxy
ip(geoip:private, geoip:cn)->direct
domain(google)->proxy

domain(domain:storj.io) -> proxy should, logically speaking, match us1.storj.io:7777 and eu1.storj.io:7777, am I miss something?

ref: v2rayA, Project V

Using nc to scan inside a docker container looks like connected, but not work for ping satellite.

Not your node, it’s reverse - these satellites cannot contact your node. This check is happening on each check-in on the satellite (every hour by default). The node provides its external address and port and the satellite is trying to contact the node, if it’s unable to contact - it responds with the reason.
In your case -

This is mean, that the satellite was unable to receive a response on its DRPC ping message from the node. So, your node was not available on the provided external address and port.

From the other errors looks like not only the satellite cannot contact your node, but also the node cannot contact the satellite. Seems the connection just broken two ways.

I’m unfamiliar with this tool, sorry, so cannot help with it.

How exactly does drpc ping work? For example:

  1. node->frp server->satellite
  2. node->satellite

I’ve only deployed the VPN on node. If it’s the first option, I might need to find a different frp server. If it’s the second option, I’ll need to adjust the VPN’s routing rules.

preflight:localtime start checking local system clock with trusted satellites’ system clock.

what domain is satellites trust clock?

Not your node, it’s reverse - these satellites cannot contact your node. This check is happening on each check-in on the satellite (every hour by default). The node provides its external address and port and the satellite is trying to contact the node, if it’s unable to contact - it responds with the reason.

I don’t fully agree with your opinion. After testing, the nodes are basically opened to the world.


2025-12-10T04:32:58Z INFO Downloading versions. {“Process”: “storagenode-updater”, “Server Address”: “[https://version.storj.io](https://version.storj.io/)”}

2025-12-10T04:33:09Z INFO Current binary version {“Process”: “storagenode-updater”, “Service”: “storagenode”, “Version”: “v1.142.7”}

2025-12-10T04:33:09Z INFO Version is up to date {“Process”: “storagenode-updater”, “Service”: “storagenode”}

2025-12-10T04:33:09Z INFO Current binary version {“Process”: “storagenode-updater”, “Service”: “storagenode-updater”, “Version”: “v1.142.7”}

2025-12-10T04:33:09Z INFO Version is up to date {“Process”: “storagenode-updater”, “Service”: “storagenode-updater”}

I found that the node can connect to https://version.storj.io normally. The VPN should be working properly because when the VPN is turned off, there are basically errors with the version numbers. I’m not sure where the problem is.

The following is the log after removing email, wallet addresses and repeated ping attempts.

logs

2025-12-10 04:32:57,874 INFO RPC interface ‘supervisor’ initialized

2025-12-10 04:32:57,875 INFO supervisord started with pid 1

2025-12-10 04:32:58,880 INFO spawned: ‘processes-exit-eventlistener’ with pid 51

2025-12-10 04:32:58,886 INFO spawned: ‘storagenode’ with pid 52

2025-12-10 04:32:58,892 INFO spawned: ‘storagenode-updater’ with pid 53

2025-12-10T04:32:58Z INFO Configuration loaded {“Process”: “storagenode-updater”, “Location”: “/app/config/config.yaml”}

2025-12-10T04:32:58Z INFO Invalid configuration file key {“Process”: “storagenode-updater”, “Key”: “server.private-address”}

2025-12-10T04:32:58Z INFO Invalid configuration file key {“Process”: “storagenode-updater”, “Key”: “healthcheck.enabled”}

2025-12-10T04:32:58Z INFO Invalid configuration file key {“Process”: “storagenode-updater”, “Key”: “operator.wallet-features”}

2025-12-10T04:32:58Z INFO Invalid configuration file key {“Process”: “storagenode-updater”, “Key”: “operator.wallet”}

2025-12-10T04:32:58Z INFO Invalid configuration file key {“Process”: “storagenode-updater”, “Key”: “storage.allocated-disk-space”}

2025-12-10T04:32:58Z INFO Invalid configuration file key {“Process”: “storagenode-updater”, “Key”: “healthcheck.details”}

2025-12-10T04:32:58Z INFO Invalid configuration file key {“Process”: “storagenode-updater”, “Key”: “server.address”}

2025-12-10T04:32:58Z INFO Invalid configuration file key {“Process”: “storagenode-updater”, “Key”: “operator.email”}

2025-12-10T04:32:58Z INFO Invalid configuration file key {“Process”: “storagenode-updater”, “Key”: “console.address”}

2025-12-10T04:32:58Z INFO Invalid configuration file key {“Process”: “storagenode-updater”, “Key”: “contact.external-address”}

2025-12-10T04:32:58Z INFO Anonymized tracing enabled {“Process”: “storagenode-updater”}

2025-12-10T04:32:58Z INFO Running on version {“Process”: “storagenode-updater”, “Service”: “storagenode-updater”, “Version”: “v1.142.7”}

2025-12-10T04:32:58Z INFO Downloading versions. {“Process”: “storagenode-updater”, “Server Address”: “https://version.storj.io”}

2025-12-10T04:32:59Z INFO Configuration loaded {“Process”: “storagenode”, “Location”: “/app/config/config.yaml”}

2025-12-10T04:32:59Z INFO Anonymized tracing enabled {“Process”: “storagenode”}

2025-12-10T04:32:59Z INFO server kernel support for server-side tcp fast open remains disabled. {“Process”: “storagenode”}

2025-12-10T04:32:59Z INFO server enable with: sysctl -w net.ipv4.tcp_fastopen=3 {“Process”: “storagenode”}

2025-12-10 04:33:00,092 INFO success: processes-exit-eventlistener entered RUNNING state, process has stayed up for > than 1 seconds (startsecs)

2025-12-10 04:33:00,092 INFO success: storagenode entered RUNNING state, process has stayed up for > than 1 seconds (startsecs)

2025-12-10 04:33:00,093 INFO success: storagenode-updater entered RUNNING state, process has stayed up for > than 1 seconds (startsecs)

2025-12-10T04:33:09Z INFO Telemetry enabled {“Process”: “storagenode”, “instance ID”: “xxx”}

2025-12-10T04:33:09Z INFO Event collection enabled {“Process”: “storagenode”, “instance ID”: “xxx”}

2025-12-10T04:33:09Z INFO db.migration Database Version {“Process”: “storagenode”, “version”: 62}

2025-12-10T04:33:09Z INFO Current binary version {“Process”: “storagenode-updater”, “Service”: “storagenode”, “Version”: “v1.142.7”}

2025-12-10T04:33:09Z INFO Version is up to date {“Process”: “storagenode-updater”, “Service”: “storagenode”}

2025-12-10T04:33:09Z INFO Current binary version {“Process”: “storagenode-updater”, “Service”: “storagenode-updater”, “Version”: “v1.142.7”}

2025-12-10T04:33:09Z INFO Version is up to date {“Process”: “storagenode-updater”, “Service”: “storagenode-updater”}

2025-12-10T04:33:22Z INFO preflight:localtime start checking local system clock with trusted satellites’ system clock. {“Process”: “storagenode”}

2025-12-10T04:34:33Z ERROR preflight:localtime unable to get satellite system time {“Process”: “storagenode”, “Satellite ID”: “12L9ZFwhzVpuEKMUNUqkaTLGzwY9G24tbiigLiXpmZWKwmcNDDs”, “error”: “rpc: tcp connector failed: rpc: EOF”, “errorVerbose”: “rpc: tcp connector failed: rpc: EOF\n\tstorj.io/common/rpc.HybridConnector.DialContext.func1:190”}

2025-12-10T04:34:33Z ERROR preflight:localtime unable to get satellite system time {“Process”: “storagenode”, “Satellite ID”: “121RTSDpyNZVcEU84Ticf2L1ntiuUimbWgfATz21tuvgk3vzoA6”, “error”: “rpc: tcp connector failed: rpc: EOF”, “errorVerbose”: “rpc: tcp connector failed: rpc: EOF\n\tstorj.io/common/rpc.HybridConnector.DialContext.func1:190”}

2025-12-10T04:34:33Z ERROR preflight:localtime unable to get satellite system time {“Process”: “storagenode”, “Satellite ID”: “12EayRS2V1kEsWESU9QMRseFhdxYxKicsiFmxrsLZHeLUtdps3S”, “error”: “rpc: tcp connector failed: rpc: EOF”, “errorVerbose”: “rpc: tcp connector failed: rpc: EOF\n\tstorj.io/common/rpc.HybridConnector.DialContext.func1:190”}

2025-12-10T04:34:33Z INFO preflight:localtime local system clock is in sync with trusted satellites’ system clock. {“Process”: “storagenode”}

2025-12-10T04:34:33Z INFO collector expired pieces collection started {“Process”: “storagenode”}

2025-12-10T04:34:33Z INFO bandwidth Persisting bandwidth usage cache to db {“Process”: “storagenode”}

2025-12-10T04:34:33Z INFO Node xxx started {“Process”: “storagenode”}

2025-12-10T04:34:33Z INFO Public server started on [::]:28967 {“Process”: “storagenode”}

2025-12-10T04:34:33Z INFO Private server started on 127.0.0.1:7778 {“Process”: “storagenode”}

2025-12-10T04:34:33Z INFO failed to sufficiently increase send buffer size (was: 208 kiB, wanted: 7168 kiB, got: 416 kiB). See UDP Buffer Sizes · quic-go/quic-go Wiki · GitHub for details. {“Process”: “storagenode”}

2025-12-10T04:34:33Z INFO collector expired pieces collection completed {“Process”: “storagenode”, “count”: 0}

2025-12-10T04:34:33Z INFO pieces:trash emptying trash started {“Process”: “storagenode”, “Satellite ID”: “12L9ZFwhzVpuEKMUNUqkaTLGzwY9G24tbiigLiXpmZWKwmcNDDs”}

2025-12-10T04:34:33Z INFO lazyfilewalker.trash-cleanup-filewalker starting subprocess {“Process”: “storagenode”, “satelliteID”: “12L9ZFwhzVpuEKMUNUqkaTLGzwY9G24tbiigLiXpmZWKwmcNDDs”}

2025-12-10T04:34:33Z INFO trust Scheduling next refresh {“Process”: “storagenode”, “after”: “5h36m55.352936174s”}

2025-12-10T04:34:33Z INFO lazyfilewalker.trash-cleanup-filewalker subprocess started {“Process”: “storagenode”, “satelliteID”: “12L9ZFwhzVpuEKMUNUqkaTLGzwY9G24tbiigLiXpmZWKwmcNDDs”}

2025-12-10T04:34:33Z INFO piecemigrate:chore all enqueued for migration; will sleep before next pooling {“Process”: “storagenode”, “active”: {“12EayRS2V1kEsWESU9QMRseFhdxYxKicsiFmxrsLZHeLUtdps3S”: false, “12L9ZFwhzVpuEKMUNUqkaTLGzwY9G24tbiigLiXpmZWKwmcNDDs”: false, “1wFTAgs9DP5RSnCqKV1eLf6N9wtk4EAtmN5DpSxcs8EjT69tGE”: false, “121RTSDpyNZVcEU84Ticf2L1ntiuUimbWgfATz21tuvgk3vzoA6”: false}, “interval”: “10m0s”}

2025-12-10T04:34:33Z INFO pieces used-space-filewalker started {“Process”: “storagenode”, “Satellite ID”: “12EayRS2V1kEsWESU9QMRseFhdxYxKicsiFmxrsLZHeLUtdps3S”}

2025-12-10T04:34:33Z INFO lazyfilewalker.used-space-filewalker starting subprocess {“Process”: “storagenode”, “satelliteID”: “12EayRS2V1kEsWESU9QMRseFhdxYxKicsiFmxrsLZHeLUtdps3S”}

2025-12-10T04:34:33Z INFO lazyfilewalker.used-space-filewalker subprocess started {“Process”: “storagenode”, “satelliteID”: “12EayRS2V1kEsWESU9QMRseFhdxYxKicsiFmxrsLZHeLUtdps3S”}

2025-12-10T04:34:33Z INFO lazyfilewalker.trash-cleanup-filewalker.subprocess trash-filewalker started {“Process”: “storagenode”, “satelliteID”: “12L9ZFwhzVpuEKMUNUqkaTLGzwY9G24tbiigLiXpmZWKwmcNDDs”, “Process”: “storagenode”, “dateBefore”: “2025-12-03T04:34:33Z”}

2025-12-10T04:34:33Z INFO lazyfilewalker.trash-cleanup-filewalker.subprocess Database started {“Process”: “storagenode”, “satelliteID”: “12L9ZFwhzVpuEKMUNUqkaTLGzwY9G24tbiigLiXpmZWKwmcNDDs”, “Process”: “storagenode”}

2025-12-10T04:34:33Z INFO lazyfilewalker.trash-cleanup-filewalker.subprocess trash-filewalker completed {“Process”: “storagenode”, “satelliteID”: “12L9ZFwhzVpuEKMUNUqkaTLGzwY9G24tbiigLiXpmZWKwmcNDDs”, “Process”: “storagenode”, “bytesDeleted”: 0, “numKeysDeleted”: 0}

2025-12-10T04:34:33Z INFO lazyfilewalker.used-space-filewalker.subprocess Database started {“Process”: “storagenode”, “satelliteID”: “12EayRS2V1kEsWESU9QMRseFhdxYxKicsiFmxrsLZHeLUtdps3S”, “Process”: “storagenode”}

2025-12-10T04:34:33Z INFO lazyfilewalker.trash-cleanup-filewalker subprocess finished successfully {“Process”: “storagenode”, “satelliteID”: “12L9ZFwhzVpuEKMUNUqkaTLGzwY9G24tbiigLiXpmZWKwmcNDDs”}

2025-12-10T04:34:33Z INFO pieces:trash emptying trash finished {“Process”: “storagenode”, “Satellite ID”: “12L9ZFwhzVpuEKMUNUqkaTLGzwY9G24tbiigLiXpmZWKwmcNDDs”, “elapsed”: “125.764752ms”}

2025-12-10T04:34:33Z INFO pieces:trash emptying trash started {“Process”: “storagenode”, “Satellite ID”: “1wFTAgs9DP5RSnCqKV1eLf6N9wtk4EAtmN5DpSxcs8EjT69tGE”}

2025-12-10T04:34:33Z INFO lazyfilewalker.trash-cleanup-filewalker starting subprocess {“Process”: “storagenode”, “satelliteID”: “1wFTAgs9DP5RSnCqKV1eLf6N9wtk4EAtmN5DpSxcs8EjT69tGE”}

2025-12-10T04:34:33Z INFO lazyfilewalker.trash-cleanup-filewalker subprocess started {“Process”: “storagenode”, “satelliteID”: “1wFTAgs9DP5RSnCqKV1eLf6N9wtk4EAtmN5DpSxcs8EjT69tGE”}

2025-12-10T04:34:33Z INFO lazyfilewalker.trash-cleanup-filewalker.subprocess trash-filewalker started {“Process”: “storagenode”, “satelliteID”: “1wFTAgs9DP5RSnCqKV1eLf6N9wtk4EAtmN5DpSxcs8EjT69tGE”, “Process”: “storagenode”, “dateBefore”: “2025-12-03T04:34:33Z”}

2025-12-10T04:34:33Z INFO lazyfilewalker.trash-cleanup-filewalker.subprocess Database started {“Process”: “storagenode”, “satelliteID”: “1wFTAgs9DP5RSnCqKV1eLf6N9wtk4EAtmN5DpSxcs8EjT69tGE”, “Process”: “storagenode”}

2025-12-10T04:34:33Z INFO lazyfilewalker.trash-cleanup-filewalker.subprocess trash-filewalker completed {“Process”: “storagenode”, “satelliteID”: “1wFTAgs9DP5RSnCqKV1eLf6N9wtk4EAtmN5DpSxcs8EjT69tGE”, “numKeysDeleted”: 0, “Process”: “storagenode”, “bytesDeleted”: 0}

2025-12-10T04:34:33Z INFO lazyfilewalker.used-space-filewalker subprocess finished successfully {“Process”: “storagenode”, “satelliteID”: “12EayRS2V1kEsWESU9QMRseFhdxYxKicsiFmxrsLZHeLUtdps3S”}

2025-12-10T04:34:33Z INFO pieces used-space-filewalker completed {“Process”: “storagenode”, “Satellite ID”: “12EayRS2V1kEsWESU9QMRseFhdxYxKicsiFmxrsLZHeLUtdps3S”, “Lazy File Walker”: true, “Total Pieces Size”: 466369044, “Total Pieces Content Size”: 465704980, “Total Pieces Count”: 1297, “Duration”: “224.987274ms”}

2025-12-10T04:34:33Z INFO pieces used-space-filewalker started {“Process”: “storagenode”, “Satellite ID”: “1wFTAgs9DP5RSnCqKV1eLf6N9wtk4EAtmN5DpSxcs8EjT69tGE”}

2025-12-10T04:34:33Z INFO lazyfilewalker.used-space-filewalker starting subprocess {“Process”: “storagenode”, “satelliteID”: “1wFTAgs9DP5RSnCqKV1eLf6N9wtk4EAtmN5DpSxcs8EjT69tGE”}

2025-12-10T04:34:33Z INFO lazyfilewalker.used-space-filewalker subprocess started {“Process”: “storagenode”, “satelliteID”: “1wFTAgs9DP5RSnCqKV1eLf6N9wtk4EAtmN5DpSxcs8EjT69tGE”}

2025-12-10T04:34:33Z INFO lazyfilewalker.trash-cleanup-filewalker subprocess finished successfully {“Process”: “storagenode”, “satelliteID”: “1wFTAgs9DP5RSnCqKV1eLf6N9wtk4EAtmN5DpSxcs8EjT69tGE”}

2025-12-10T04:34:33Z INFO pieces:trash emptying trash finished {“Process”: “storagenode”, “Satellite ID”: “1wFTAgs9DP5RSnCqKV1eLf6N9wtk4EAtmN5DpSxcs8EjT69tGE”, “elapsed”: “110.958201ms”}

2025-12-10T04:34:33Z INFO pieces:trash emptying trash started {“Process”: “storagenode”, “Satellite ID”: “121RTSDpyNZVcEU84Ticf2L1ntiuUimbWgfATz21tuvgk3vzoA6”}

2025-12-10T04:34:33Z INFO lazyfilewalker.trash-cleanup-filewalker starting subprocess {“Process”: “storagenode”, “satelliteID”: “121RTSDpyNZVcEU84Ticf2L1ntiuUimbWgfATz21tuvgk3vzoA6”}

2025-12-10T04:34:33Z INFO lazyfilewalker.trash-cleanup-filewalker subprocess started {“Process”: “storagenode”, “satelliteID”: “121RTSDpyNZVcEU84Ticf2L1ntiuUimbWgfATz21tuvgk3vzoA6”}

2025-12-10T04:34:33Z INFO lazyfilewalker.trash-cleanup-filewalker.subprocess trash-filewalker started {“Process”: “storagenode”, “satelliteID”: “121RTSDpyNZVcEU84Ticf2L1ntiuUimbWgfATz21tuvgk3vzoA6”, “Process”: “storagenode”, “dateBefore”: “2025-12-03T04:34:33Z”}

2025-12-10T04:34:33Z INFO lazyfilewalker.trash-cleanup-filewalker.subprocess Database started {“Process”: “storagenode”, “satelliteID”: “121RTSDpyNZVcEU84Ticf2L1ntiuUimbWgfATz21tuvgk3vzoA6”, “Process”: “storagenode”}

2025-12-10T04:34:33Z INFO lazyfilewalker.trash-cleanup-filewalker.subprocess trash-filewalker completed {“Process”: “storagenode”, “satelliteID”: “121RTSDpyNZVcEU84Ticf2L1ntiuUimbWgfATz21tuvgk3vzoA6”, “bytesDeleted”: 0, “numKeysDeleted”: 0, “Process”: “storagenode”}

2025-12-10T04:34:33Z INFO lazyfilewalker.used-space-filewalker.subprocess Database started {“Process”: “storagenode”, “satelliteID”: “1wFTAgs9DP5RSnCqKV1eLf6N9wtk4EAtmN5DpSxcs8EjT69tGE”, “Process”: “storagenode”}

2025-12-10T04:34:33Z INFO lazyfilewalker.trash-cleanup-filewalker subprocess finished successfully {“Process”: “storagenode”, “satelliteID”: “121RTSDpyNZVcEU84Ticf2L1ntiuUimbWgfATz21tuvgk3vzoA6”}

2025-12-10T04:34:33Z INFO pieces:trash emptying trash finished {“Process”: “storagenode”, “Satellite ID”: “121RTSDpyNZVcEU84Ticf2L1ntiuUimbWgfATz21tuvgk3vzoA6”, “elapsed”: “115.820443ms”}

2025-12-10T04:34:33Z INFO pieces:trash emptying trash started {“Process”: “storagenode”, “Satellite ID”: “12EayRS2V1kEsWESU9QMRseFhdxYxKicsiFmxrsLZHeLUtdps3S”}

2025-12-10T04:34:33Z INFO lazyfilewalker.trash-cleanup-filewalker starting subprocess {“Process”: “storagenode”, “satelliteID”: “12EayRS2V1kEsWESU9QMRseFhdxYxKicsiFmxrsLZHeLUtdps3S”}

2025-12-10T04:34:33Z INFO lazyfilewalker.trash-cleanup-filewalker subprocess started {“Process”: “storagenode”, “satelliteID”: “12EayRS2V1kEsWESU9QMRseFhdxYxKicsiFmxrsLZHeLUtdps3S”}

2025-12-10T04:34:33Z INFO lazyfilewalker.used-space-filewalker subprocess finished successfully {“Process”: “storagenode”, “satelliteID”: “1wFTAgs9DP5RSnCqKV1eLf6N9wtk4EAtmN5DpSxcs8EjT69tGE”}

2025-12-10T04:34:33Z INFO pieces used-space-filewalker completed {“Process”: “storagenode”, “Satellite ID”: “1wFTAgs9DP5RSnCqKV1eLf6N9wtk4EAtmN5DpSxcs8EjT69tGE”, “Lazy File Walker”: true, “Total Pieces Size”: 604409344, “Total Pieces Content Size”: 604274688, “Total Pieces Count”: 263, “Duration”: “165.029989ms”}

2025-12-10T04:34:33Z INFO pieces used-space-filewalker started {“Process”: “storagenode”, “Satellite ID”: “12L9ZFwhzVpuEKMUNUqkaTLGzwY9G24tbiigLiXpmZWKwmcNDDs”}

2025-12-10T04:34:33Z INFO lazyfilewalker.used-space-filewalker starting subprocess {“Process”: “storagenode”, “satelliteID”: “12L9ZFwhzVpuEKMUNUqkaTLGzwY9G24tbiigLiXpmZWKwmcNDDs”}

2025-12-10T04:34:33Z INFO lazyfilewalker.used-space-filewalker subprocess started {“Process”: “storagenode”, “satelliteID”: “12L9ZFwhzVpuEKMUNUqkaTLGzwY9G24tbiigLiXpmZWKwmcNDDs”}

2025-12-10T04:34:33Z INFO lazyfilewalker.trash-cleanup-filewalker.subprocess trash-filewalker started {“Process”: “storagenode”, “satelliteID”: “12EayRS2V1kEsWESU9QMRseFhdxYxKicsiFmxrsLZHeLUtdps3S”, “Process”: “storagenode”, “dateBefore”: “2025-12-03T04:34:33Z”}

2025-12-10T04:34:33Z INFO lazyfilewalker.trash-cleanup-filewalker.subprocess Database started {“Process”: “storagenode”, “satelliteID”: “12EayRS2V1kEsWESU9QMRseFhdxYxKicsiFmxrsLZHeLUtdps3S”, “Process”: “storagenode”}

2025-12-10T04:34:33Z INFO lazyfilewalker.trash-cleanup-filewalker.subprocess trash-filewalker completed {“Process”: “storagenode”, “satelliteID”: “12EayRS2V1kEsWESU9QMRseFhdxYxKicsiFmxrsLZHeLUtdps3S”, “Process”: “storagenode”, “bytesDeleted”: 0, “numKeysDeleted”: 0}

2025-12-10T04:34:33Z INFO lazyfilewalker.trash-cleanup-filewalker subprocess finished successfully {“Process”: “storagenode”, “satelliteID”: “12EayRS2V1kEsWESU9QMRseFhdxYxKicsiFmxrsLZHeLUtdps3S”}

2025-12-10T04:34:33Z INFO pieces:trash emptying trash finished {“Process”: “storagenode”, “Satellite ID”: “12EayRS2V1kEsWESU9QMRseFhdxYxKicsiFmxrsLZHeLUtdps3S”, “elapsed”: “123.159996ms”}

2025-12-10T04:34:33Z INFO lazyfilewalker.used-space-filewalker.subprocess Database started {“Process”: “storagenode”, “satelliteID”: “12L9ZFwhzVpuEKMUNUqkaTLGzwY9G24tbiigLiXpmZWKwmcNDDs”, “Process”: “storagenode”}

2025-12-10T04:34:33Z INFO lazyfilewalker.used-space-filewalker subprocess finished successfully {“Process”: “storagenode”, “satelliteID”: “12L9ZFwhzVpuEKMUNUqkaTLGzwY9G24tbiigLiXpmZWKwmcNDDs”}

2025-12-10T04:34:33Z INFO pieces used-space-filewalker completed {“Process”: “storagenode”, “Satellite ID”: “12L9ZFwhzVpuEKMUNUqkaTLGzwY9G24tbiigLiXpmZWKwmcNDDs”, “Lazy File Walker”: true, “Total Pieces Size”: 8364288, “Total Pieces Content Size”: 8327936, “Total Pieces Count”: 71, “Duration”: “117.383354ms”}

2025-12-10T04:34:33Z INFO pieces used-space-filewalker started {“Process”: “storagenode”, “Satellite ID”: “121RTSDpyNZVcEU84Ticf2L1ntiuUimbWgfATz21tuvgk3vzoA6”}

2025-12-10T04:34:33Z INFO lazyfilewalker.used-space-filewalker starting subprocess {“Process”: “storagenode”, “satelliteID”: “121RTSDpyNZVcEU84Ticf2L1ntiuUimbWgfATz21tuvgk3vzoA6”}

2025-12-10T04:34:33Z INFO lazyfilewalker.used-space-filewalker subprocess started {“Process”: “storagenode”, “satelliteID”: “121RTSDpyNZVcEU84Ticf2L1ntiuUimbWgfATz21tuvgk3vzoA6”}

2025-12-10T04:34:33Z INFO lazyfilewalker.used-space-filewalker.subprocess Database started {“Process”: “storagenode”, “satelliteID”: “121RTSDpyNZVcEU84Ticf2L1ntiuUimbWgfATz21tuvgk3vzoA6”, “Process”: “storagenode”}

2025-12-10T04:34:34Z INFO lazyfilewalker.used-space-filewalker subprocess finished successfully {“Process”: “storagenode”, “satelliteID”: “121RTSDpyNZVcEU84Ticf2L1ntiuUimbWgfATz21tuvgk3vzoA6”}

2025-12-10T04:34:34Z INFO pieces used-space-filewalker completed {“Process”: “storagenode”, “Satellite ID”: “121RTSDpyNZVcEU84Ticf2L1ntiuUimbWgfATz21tuvgk3vzoA6”, “Lazy File Walker”: true, “Total Pieces Size”: 174146304, “Total Pieces Content Size”: 173893888, “Total Pieces Count”: 493, “Duration”: “183.418749ms”}

2025-12-10T04:35:43Z INFO orders finished {“Process”: “storagenode”, “satelliteID”: “12EayRS2V1kEsWESU9QMRseFhdxYxKicsiFmxrsLZHeLUtdps3S”, “count”: 422}

2025-12-10T04:35:43Z ERROR orders failed to settle orders for satellite {“Process”: “storagenode”, “satelliteID”: “12EayRS2V1kEsWESU9QMRseFhdxYxKicsiFmxrsLZHeLUtdps3S”, “satellite ID”: “12EayRS2V1kEsWESU9QMRseFhdxYxKicsiFmxrsLZHeLUtdps3S”, “error”: “order: failed to start settlement: rpc: tcp connector failed: rpc: EOF”, “errorVerbose”: “order: failed to start settlement: rpc: tcp connector failed: rpc: EOF\n\tstorj.io/storj/storagenode/orders.(*Service).settleWindow:264\n\tstorj.io/storj/storagenode/orders.(*Service).SendOrders.func2:219\n\tgolang.org/x/sync/errgroup.(*Group).Go.func1:93”}

2025-12-10T04:35:43Z INFO orders finished {“Process”: “storagenode”, “satelliteID”: “121RTSDpyNZVcEU84Ticf2L1ntiuUimbWgfATz21tuvgk3vzoA6”, “count”: 175}

2025-12-10T04:35:43Z ERROR orders failed to settle orders for satellite {“Process”: “storagenode”, “satelliteID”: “121RTSDpyNZVcEU84Ticf2L1ntiuUimbWgfATz21tuvgk3vzoA6”, “satellite ID”: “121RTSDpyNZVcEU84Ticf2L1ntiuUimbWgfATz21tuvgk3vzoA6”, “error”: “order: failed to start settlement: rpc: tcp connector failed: rpc: EOF”, “errorVerbose”: “order: failed to start settlement: rpc: tcp connector failed: rpc: EOF\n\tstorj.io/storj/storagenode/orders.(*Service).settleWindow:264\n\tstorj.io/storj/storagenode/orders.(*Service).SendOrders.func2:219\n\tgolang.org/x/sync/errgroup.(*Group).Go.func1:93”}

2025-12-10T04:35:43Z ERROR contact:service ping satellite failed {“Process”: “storagenode”, “Satellite ID”: “12L9ZFwhzVpuEKMUNUqkaTLGzwY9G24tbiigLiXpmZWKwmcNDDs”, “attempts”: 1, “error”: “ping satellite: rpc: tcp connector failed: rpc: EOF”, “errorVerbose”: “ping satellite: rpc: tcp connector failed: rpc: EOF\n\tstorj.io/common/rpc.HybridConnector.DialContext.func1:190”}

2025-12-10T04:35:43Z ERROR contact:service ping satellite failed {“Process”: “storagenode”, “Satellite ID”: “12EayRS2V1kEsWESU9QMRseFhdxYxKicsiFmxrsLZHeLUtdps3S”, “attempts”: 1, “error”: “ping satellite: rpc: tcp connector failed: rpc: EOF”, “errorVerbose”: “ping satellite: rpc: tcp connector failed: rpc: EOF\n\tstorj.io/common/rpc.HybridConnector.DialContext.func1:190”}

2025-12-10T04:35:43Z INFO orders finished {“Process”: “storagenode”, “satelliteID”: “12L9ZFwhzVpuEKMUNUqkaTLGzwY9G24tbiigLiXpmZWKwmcNDDs”, “count”: 84}

2025-12-10T04:35:43Z ERROR orders failed to settle orders for satellite {“Process”: “storagenode”, “satelliteID”: “12L9ZFwhzVpuEKMUNUqkaTLGzwY9G24tbiigLiXpmZWKwmcNDDs”, “satellite ID”: “12L9ZFwhzVpuEKMUNUqkaTLGzwY9G24tbiigLiXpmZWKwmcNDDs”, “error”: “order: failed to start settlement: rpc: tcp connector failed: rpc: EOF”, “errorVerbose”: “order: failed to start settlement: rpc: tcp connector failed: rpc: EOF\n\tstorj.io/storj/storagenode/orders.(*Service).settleWindow:264\n\tstorj.io/storj/storagenode/orders.(*Service).SendOrders.func2:219\n\tgolang.org/x/sync/errgroup.(*Group).Go.func1:93”}

2025-12-10T04:35:44Z ERROR contact:service ping satellite failed {“Process”: “storagenode”, “Satellite ID”: “121RTSDpyNZVcEU84Ticf2L1ntiuUimbWgfATz21tuvgk3vzoA6”, “attempts”: 1, “error”: “ping satellite: rpc: tcp connector failed: rpc: EOF”, “errorVerbose”: “ping satellite: rpc: tcp connector failed: rpc: EOF\n\tstorj.io/common/rpc.HybridConnector.DialContext.func1:190”}

2025-12-10T04:36:07Z INFO reputation:service node scores updated {“Process”: “storagenode”, “Satellite ID”: “1wFTAgs9DP5RSnCqKV1eLf6N9wtk4EAtmN5DpSxcs8EjT69tGE”, “Total Audits”: 0, “Successful Audits”: 0, “Audit Score”: 1, “Online Score”: 1, “Suspension Score”: 1, “Audit Score Delta”: 0, “Online Score Delta”: 0, “Suspension Score Delta”: 0}

2025-12-10T04:38:36Z ERROR nodestats:cache Get pricing-model/join date failed {“Process”: “storagenode”, “error”: “payouts service: rpc: tcp connector failed: rpc: EOF; payouts service: rpc: tcp connector failed: rpc: EOF; payouts service: rpc: tcp connector failed: rpc: EOF”, “errorVerbose”: “group:\n— payouts service: rpc: tcp connector failed: rpc: EOF\n\tstorj.io/common/rpc.HybridConnector.DialContext.func1:190\n— payouts service: rpc: tcp connector failed: rpc: EOF\n\tstorj.io/common/rpc.HybridConnector.DialContext.func1:190\n— payouts service: rpc: tcp connector failed: rpc: EOF\n\tstorj.io/common/rpc.HybridConnector.DialContext.func1:190”}

2025-12-10T04:39:37Z ERROR reputation:chore reputation chore failed {“Process”: “storagenode”, “error”: “reputation: rpc: tcp connector failed: rpc: EOF; reputation: rpc: tcp connector failed: rpc: EOF; reputation: rpc: tcp connector failed: rpc: EOF”, “errorVerbose”: “group:\n— reputation: rpc: tcp connector failed: rpc: EOF\n\tstorj.io/common/rpc.HybridConnector.DialContext.func1:190\n— reputation: rpc: tcp connector failed: rpc: EOF\n\tstorj.io/common/rpc.HybridConnector.DialContext.func1:190\n— reputation: rpc: tcp connector failed: rpc: EOF\n\tstorj.io/common/rpc.HybridConnector.DialContext.func1:190”}

2025-12-10T04:43:52Z ERROR nodestats:cache Get disk space usage query failed {“Process”: “storagenode”, “error”: “nodestats: rpc: tcp connector failed: rpc: EOF; nodestats: rpc: tcp connector failed: rpc: EOF; nodestats: rpc: tcp connector failed: rpc: EOF”, “errorVerbose”: “group:\n— nodestats: rpc: tcp connector failed: rpc: EOF\n\tstorj.io/common/rpc.HybridConnector.DialContext.func1:190\n— nodestats: rpc: tcp connector failed: rpc: EOF\n\tstorj.io/common/rpc.HybridConnector.DialContext.func1:190\n— nodestats: rpc: tcp connector failed: rpc: EOF\n\tstorj.io/common/rpc.HybridConnector.DialContext.func1:190”}

2025-12-10T04:44:33Z INFO piecemigrate:chore all enqueued for migration; will sleep before next pooling {“Process”: “storagenode”, “active”: {“12L9ZFwhzVpuEKMUNUqkaTLGzwY9G24tbiigLiXpmZWKwmcNDDs”: false, “1wFTAgs9DP5RSnCqKV1eLf6N9wtk4EAtmN5DpSxcs8EjT69tGE”: false, “121RTSDpyNZVcEU84Ticf2L1ntiuUimbWgfATz21tuvgk3vzoA6”: false, “12EayRS2V1kEsWESU9QMRseFhdxYxKicsiFmxrsLZHeLUtdps3S”: false}, “interval”: “10m0s”}

2025-12-10T04:45:13Z ERROR nodestats:cache payouts err {“Process”: “storagenode”, “satellite”: “121RTSDpyNZVcEU84Ticf2L1ntiuUimbWgfATz21tuvgk3vzoA6”}

2025-12-10T04:46:24Z ERROR nodestats:cache payouts err {“Process”: “storagenode”, “satellite”: “12EayRS2V1kEsWESU9QMRseFhdxYxKicsiFmxrsLZHeLUtdps3S”}

2025-12-10T04:47:34Z ERROR nodestats:cache payouts err {“Process”: “storagenode”, “satellite”: “12L9ZFwhzVpuEKMUNUqkaTLGzwY9G24tbiigLiXpmZWKwmcNDDs”}

2025-12-10T04:47:34Z ERROR nodestats:cache Get held amount query failed {“Process”: “storagenode”, “error”: “payouts service: rpc: tcp connector failed: rpc: EOF; payouts service: rpc: tcp connector failed: rpc: EOF; payouts service: rpc: tcp connector failed: rpc: EOF”, “errorVerbose”: “group:\n— payouts service: rpc: tcp connector failed: rpc: EOF\n\tstorj.io/common/rpc.HybridConnector.DialContext.func1:190\n— payouts service: rpc: tcp connector failed: rpc: EOF\n\tstorj.io/common/rpc.HybridConnector.DialContext.func1:190\n— payouts service: rpc: tcp connector failed: rpc: EOF\n\tstorj.io/common/rpc.HybridConnector.DialContext.func1:190”}

2025-12-10T04:47:58Z INFO Downloading versions. {“Process”: “storagenode-updater”, “Server Address”: “https://version.storj.io”}

2025-12-10T04:48:10Z INFO Current binary version {“Process”: “storagenode-updater”, “Service”: “storagenode”, “Version”: “v1.142.7”}

2025-12-10T04:48:10Z INFO Version is up to date {“Process”: “storagenode-updater”, “Service”: “storagenode”}

2025-12-10T04:48:10Z INFO Current binary version {“Process”: “storagenode-updater”, “Service”: “storagenode-updater”, “Version”: “v1.142.7”}

2025-12-10T04:48:10Z INFO Version is up to date {“Process”: “storagenode-updater”, “Service”: “storagenode-updater”}

The node contacts the satellite - sends DRPC check-in every hour and provides orders with usage, free space, the external address and port, etc., then the satellite sends DRPC ping to the node using the provided external address and port, then respond to the node with the result and reputation scores (audit, suspension and online scores). If everything is ok, the node compare clocks with the satellite.
So, when you see an error “ping satellite failed” in the log, this is mean that the satellite was unable to receive a respond from your node on DRPC Ping request from the satellite.

So, seems http is passed, but accordingly the node’s logs DRPC is not. Is it possible that your proxy/VPN can pass only http(s) traffic, but blocks everything else?

Usually you need to use a VPN with port-forwading like portmap.io, ngrok, PIA, AirVPN, PureVPN, etc. to bypass CGNAT.

new status, I saw these info, was it work?

It looks like yes, I see successful PUT requests.

I know why now, it’s because DNS. Everything else is find, but GFW break my DNS.

Can I document this experience? It might be valuable to others.

Yes, you can post it in this topic and mark as a solution. The only problem is cost, you likely will spent more on VPN, than this node can earn.

Is that possible? My VPN only proxies Storj’s satellite traffic; frp is directly exposed globally. Shouldn’t the main data pass through frp, not the VPN?

My VPN costs approximately $2.85 per TB. I have paid separately for frp hosting(like ngork), and there is no data limit.

Yes, the satellite doesn’t transfer customers data.

And you can earn $1.5/TB*mo of the stored data, of course there shouldn’t be much of the traffic to the satellite, but I do not know for sure. Seems you will see.

Since I’m using intranet penetration technology, does that mean that if someone else uses the same frp node from the same provider as me to expose a port, my node will be considered the same node for inbound traffic as theirs?

it ip will be in same /24 then yes.

That is the downside of FRP if the exit IP is shared you are fighting for the same slice of the pie

Hello @matijasever55,
Not the exit IP, the satellite check the provided external address, so it’s in a reverse direction.

简体中文版本(Simplified Chinese version)

This article complements the official documentation; you still need to read the Storj Node Deployment Guide.

Preface

Storj is a rather niche project in China. According to statistics from storjnet.info, as of the writing date (December 24, 2025), there are only 48 nodes in mainland China, ranking 44th globally.

One contributing factor is the extremely high cost of commercial bandwidth in China, which has given rise to PCDN, a far more profitable alternative project.

Let me briefly explain the origin of PCDN. In 2015, Chinese Premier Li Keqiang launched a telecommunications reform campaign themed “Speed Up Broadband and Reduce Costs”. The initiative aimed to increase network speeds, reduce communication costs, accelerate the construction of high-speed broadband networks, and drive innovation and improve people’s well-being.

However, the substantial reduction in residential broadband fees left telecom operators struggling to balance their books, leading to exorbitant prices for commercial broadband in China. Below is a comparison of broadband prices within China, with an exchange rate defined as $1 = ¥7:

  • Residential Broadband: 200 Mbps per year for ¥800 ($144)
    • Verified via the China Telecom mobile app.
  • Commercial Broadband: 20 Mbps per month for ¥600 ($85)
    • Data obtained during my internship in a company

Thus, an innovative idea emerged: why not deploy commercial CDNs directly on users’ residential broadband connections to save significant costs? This gave birth to numerous PCDN nodes from providers like Dianxin Cloud and Onething Cloud (Wangxinyun). When users stream videos or perform similar activities, data is fetched directly from PCDN nodes rather than data centers.

According to data from PCDN forums, a 50 Mbps upstream connection yields approximately ¥2–3 ($0.28–0.42) in daily revenue. However, major telecom operators have been cracking down heavily on PCDN operations in recent years, making it increasingly challenging to profit from.

In contrast, Storj nodes have much lower hardware and bandwidth requirements and do not generate traffic patterns that attract strict ISP crackdowns. If you wish to learn cross-domain knowledge in Linux, computer networks, and cryptocurrency, Storj is an excellent project to explore.

Earnings

Important Note: Storj recommends running nodes using spare hardware and equipment you already own. Do not make large dedicated investments solely for node operation, as profit margins are extremely low.

Rates as of December 24, 2025:

  • Storage Capacity (per TB/month): $1.50
  • Egress Bandwidth (per TB): $2.00
  • Audits/Repairs (per TB): $2.00

External Port Configuration

Clients require an external IP address and port to access your node. If you can obtain a public IPv6 address from major ISPs, follow the official tutorial.

If a public IP is unavailable, an alternative solution is Intranet Penetration technology. This technology enables direct external access to internal network devices by establishing a communication link between internal and external networks:

  1. The internal device actively connects to a penetration server with a public IP
  2. The penetration server assigns a public access identifier (domain + port) to the internal device
  3. External devices access this identifier, and the server forwards requests to the corresponding internal device

Recommended Solutions (links lead to pricing pages):

  • frp: Self-deploy on a VPS with a public IP, or use managed frp services
  • ngrok: An established tunneling service
  • Cloudflare Tunnel: A free tier is available with no explicit speed or bandwidth limits. Limitation: No UDP forwarding. However, forum research shows that less than 5% of traffic/functions require UDP for QUIC—TCP works reliably for storage leasing, making it suitable for testing purposes.
  • Oray PeanutHull: Not recommended (overpriced with strict speed and bandwidth caps)
  • ZeroTier

I use the managed frp service chmlfrp, which offers unlimited traffic and flexible bandwidth limits: 128 Mbps for international traffic and 32 Mbps for domestic traffic.

Tunnel Configuration

You can copy my configuration directly or adjust it as needed.
Add a tunnel and select a node that supports UDP.

Create two separate tunnels with identical internal and external ports, using TCP and UDP protocols respectively.

Generate your frpc configuration file (example below):

[common]
server_addr = <ip>
server_port = <port>
tls_enable = false
user = <user>
token = <token>

[storj_tcp]
type = tcp
local_ip = 127.0.0.1
local_port = 28967
remote_port = 28967

[storj_udp]
type = udp
local_ip = 127.0.0.1
local_port = 28967
remote_port = 28967

Save the file to /opt/frp/storj.ini.

Software Installation

  1. Download the frp package from GitHub Releases
  2. Extract the package and move frpc to /usr/local/bin to enable global command-line access
  3. Create a systemd service to manage the frpc process for Storj tunneling. Use a text editor (e.g., nano) to create the file /etc/systemd/system/storj.service. The official systemd setup guide only covers frps—use the configuration below instead:
[Unit]
Description=FRP Client
After=NetworkManager-wait-online.service
Wants=NetworkManager-wait-online.service

[Service]
Type=simple
# Update the path to your frpc executable
ExecStart = /usr/local/bin/frpc -c /opt/frp/storj.ini
Restart=always
RestartSec=5
[Install]
WantedBy=multi-user.target

Note: For some systems, replace NetworkManager-wait-online.service with network-online.target to ensure frp starts only after network connectivity is established. Consult AI for system-specific adjustments.

Service Management Commands:

# Start frp
sudo systemctl start storj
# Stop frp
sudo systemctl stop storj
# Restart frp
sudo systemctl restart storj
# Check status
sudo systemctl status storj
# Enable auto-start on boot
sudo systemctl enable storj

Docker Acceleration

Proceed with steps 3–5 in the official tutorial. You may encounter issues pulling images from Docker Hub—resolve this by configuring registry mirrors.
Edit the Docker daemon configuration file (create it if it does not exist):

sudo nano /etc/docker/daemon.json

Add the following mirrors (replace with your preferred mirrors if needed):

{
  "registry-mirrors": [
    "https://docker.1panel.live",
    "https://dockerpull.cn"
  ]
}

Restart Docker to apply changes:

sudo systemctl daemon-reload
sudo systemctl restart docker

Proxy Setup

Direct access to Storj satellite servers is blocked in China, preventing node registration and operation. Use a proxy (or VPN) to bypass these restrictions.
Deploy a proxy tool on your server—popular options include:

  • Mihomo (Clash Meta)
  • V2Ray
  • Sing-box

I recommend V2RayA, a web-based V2Ray client. Install it via Docker (refer to the v2rayA Docker install documentation):

docker run -d \
  --restart=always \
  --privileged \
  --network=host \
  --name v2raya \
  -e V2RAYA_LOG_FILE=/tmp/v2raya.log \
  -e V2RAYA_V2RAY_BIN=/usr/local/bin/v2ray \
  -e V2RAYA_NFTABLES_SUPPORT=off \
  -e IPTABLES_MODE=legacy \
  -v /lib/modules:/lib/modules:ro \
  -v /etc/resolv.conf:/etc/resolv.conf \
  -v /etc/v2raya:/etc/v2raya \
  mzz2017/v2raya

After logging in, configure the following settings:

  • Transparent Proxy: Enabled (ensure split rules match the rule port)
  • Transparent Proxy Implementation: system tun
  • Rule Port Split Mode: RoutingA
  • Prevent DNS Pollution: Forward DNS requests

Configure the RoutingA rule list. My node occasionally experiences connection issues, so I use redundant rules for saturated domain matching (refer to the RoutingA Documentation for syntax details):

default: direct
domain(us1.storj.io) -> proxy
domain(eu1.storj.io) -> proxy
domain(ap1.storj.io) -> proxy
domain(domain:storj.io) -> proxy
port(7777)->proxy
domain(docker.io)->proxy
domain(github.com) -> proxy
domain(debian.org)->proxy

Verify normal operation by checking container logs—look for INFO entries without ERROR messages:

2025-12-21T15:18:24Z	INFO	Current binary version	{"Process": "storagenode-updater", "Service": "storagenode", "Version": "v1.142.7"}
2025-12-21T15:18:24Z	INFO	Version is up to date	{"Process": "storagenode-updater", "Service": "storagenode"}
2025-12-21T15:18:24Z	INFO	Current binary version	{"Process": "storagenode-updater", "Service": "storagenode-updater", "Version": "v1.142.7"}
2025-12-21T15:18:24Z	INFO	Version is up to date	{"Process": "storagenode-updater", "Service": "storagenode-updater"}
2025-12-21T15:18:59Z	INFO	piecestore	uploaded	{"Process": "storagenode", "Piece ID": "BNERV6D3IQGORXMICYMR6FGFMLOVV6MUB3XMM6IRXDJBVDPJZ2KQ", "Satellite ID": "12EayRS2V1kEsWESU9QMRseFhdxYxKicsiFmxrsLZHeLUtdps3S", "Action": "PUT", "Remote Address": "172.17.0.1:41080", "Size": 32512}
2025-12-21T15:21:09Z	INFO	piecestore	downloaded	{"Process": "storagenode", "Piece ID": "QHDD2YN7WG7JNBOFX3PJZ5FZQM423KWU3JLHML5KRFWCNAO7MRJQ", "Satellite ID": "1wFTAgs9DP5RSnCqKV1eLf6N9wtk4EAtmN5DpSxcs8EjT69tGE", "Action": "GET_AUDIT", "Offset": 758272, "Size": 256, "Remote Address": "172.17.0.1:41318"}
2025-12-21T15:23:00Z	INFO	piecestore	download canceled	{"Process": "storagenode", "Piece ID": "G55JQHFQYHGF63SEVF2Y2WE3IX62NLD7LSHDRQR52TRKQCOSTJ4Q", "Satellite ID": "12EayRS2V1kEsWESU9QMRseFhdxYxKicsiFmxrsLZHeLUtdps3S", "Action": "GET", "Offset": 0, "Size": 7936, "Remote Address": "172.17.0.1:48620", "reason": "downloaded size (0 bytes) does not match received message size (7936 bytes)"}
2025-12-21T15:43:38Z	INFO	piecestore	upload canceled	{"Process": "storagenode", "Piece ID": "VKEVYEKTPFUNEGQWKX56S4QILEOXOQFE7IZMGZS2TVPPIQRPN5UQ", "Satellite ID": "12EayRS2V1kEsWESU9QMRseFhdxYxKicsiFmxrsLZHeLUtdps3S", "Action": "PUT", "Remote Address": "172.17.0.1:53694", "Size": 2293760}
2025-12-21T15:19:03Z	INFO	orders	finished	{"Process": "storagenode", "satelliteID": "1wFTAgs9DP5RSnCqKV1eLf6N9wtk4EAtmN5DpSxcs8EjT69tGE", "count": 13}
2025-12-21T15:19:03Z	INFO	orders	finished	{"Process": "storagenode", "satelliteID": "12L9ZFwhzVpuEKMUNUqkaTLGzwY9G24tbiigLiXpmZWKwmcNDDs", "count": 118}
2025-12-21T15:19:03Z	INFO	orders	finished	{"Process": "storagenode", "satelliteID": "121RTSDpyNZVcEU84Ticf2L1ntiuUimbWgfATz21tuvgk3vzoA6", "count": 63}
2025-12-21T15:19:03Z	INFO	orders	finished	{"Process": "storagenode", "satelliteID": "12EayRS2V1kEsWESU9QMRseFhdxYxKicsiFmxrsLZHeLUtdps3S", "count": 461}

Log Explanations:

  • Version checks run approximately every 10 minutes
  • piecestore uploaded: Clients upload data to your node
  • piecestore downloaded: Clients download data from your node
  • piecestore download canceled: Download aborted (may be due to high latency compared to other nodes or client-initiated termination)
  • piecestore upload canceled: Upload aborted
  • orders finished: The node submits completed order counts to satellite servers

Post-Deployment (Withdrawals, etc.)

Planning to withdraw funds via OKX? Register with my referral code: 81522149—both of us will receive rewards! Thank you for your support!
If this article helped you, consider a small donation: 0x5deab148f542cab91574a6be1b641788703ed712

Community Groups

You can find me here if you need to. My personal contact details are available on my blog.

Matrix: #cn_storj_sno:mozilla.org
QQ Group: 300842907

I want to change topic title to “How to deploy storj node under GFW and CG-NAT”, what do you think?