Adding additional storage location (Windows/Docker)

Hi,
Can I add more than one storage location? In my PC I have two drives and each is 1TB.
Can I specify additional location to the one I created with node installation? If yes, how?
Thanks!

1 Like

Yes, you can host multiple Silo storage nodes on the same machine, each using a separate drive, but you cannot specify various storage locations for a single node. Each node must have its unique identity, storage path, and configuration. Here’s how you can set up a second node on the same PC to utilize both drives:

Steps to Set Up an Additional Node on the Same PC

1. Generate a New Trust key

  • You need a new trustkey for each additional node.
  • Use the Silo trustkey tool to generate a new trustkey:
trustkey create silonode2
  • Follow the instructions to sign the new trustkey.

2. Configure the Second Node

  • Choose a different port for the second node. For example:
    • First node: Port 28967
    • Second node: Port 28968
  • Ensure your firewall and router are configured to forward these ports to your machine.

3. Create a New Storage Path

  • Create a directory for the additional node’s storage on the second drive. For example:
D:\SiloNode2

4. Run a Second Docker Container (if using Docker)

  • Launch a second container for the new node, specifying the new trustkey, storage path, and port:
docker run -d --restart unless-stopped --stop-timeout 300 \
  -p 28968:28968/tcp \
  -p 28968:28968/udp \
  -p 127.0.0.1:14003:14003 \
  -e WALLET="0xXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" \
  -e EMAIL="[email protected]" \
  -e ADDRESS="domain.ddns.net:28968" \
  -e STORAGE="2TB" \
  --user $(id -u):$(id -g) \
  --mount type=bind,source="<trustkey2-dir>",destination=/app/trustkey \
  --mount type=bind,source="<storage2-dir>",destination=/app/config \
  --name storagenode silos3/silo-node:latest
  • Adjust the paths and parameters based on your configuration.
  • Use Same email, wallet address as node 1
3 Likes

Thanks mate, very clear and perfect instructions.
One thing I would add to step-by-step instructions as that was not clear.
Create storage location/directory for , this was not clear.

Sorry, do you mean for this to be 28967 OR 28968?

Sorry it’s correct port is 28968 for 2nd silo node

1 Like

Just in case someone want to perform this, here are what I have to change to get this running (Bold):

docker run -d --restart unless-stopped --stop-timeout 300
-p 28968:28968/tcp
-p 28968:28968/udp
-p 127.0.0.1:14003:14003
-e WALLET=“0xXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX”
-e EMAIL="[email protected]"
-e ADDRESS=“domain.ddns.net:28968”
-e STORAGE=“2TB”
–mount type=bind,source=“”,destination=/app/trustkey
–mount type=bind,source=“”,destination=/app/config
–name storagenode2 silos3/silo-node:latest

Also, this line was not accepted, so I removed it
–user $(id -u):$(id -g) \

Yes, in the same system need to change port 14002 to 14003

And this line is required on Linux Not on Windows

1 Like

Even all seems fine and container running, but I cannot get to node dashboard.

docker keeps throughing this in the log:
2025-01-22T07:43:57Z ERROR contact:service ping orbital failed {“Process”: “storagenode”, “Orbital ID”: “1dkRxqhU46NfjV1xJZrxnt8RwWGK2uAas1jtncvZoj4s8HVVK4”, “attempts”: 9, “error”: “ping orbital: failed to ping storage node, your node indicated error code: 0, rpc: tcp connector failed: rpc: EOF”, “errorVerbose”: “ping orbital: failed to ping storage node, your node indicated error code: 0, rpc: tcp connector failed: rpc: EOF\n\tsilos3.com/silo/storagenode/contact.(*Service).pingOrbitalOnce:209\n\tsilos3.com/silo/storagenode/contact.(*Service).pingOrbital:157\n\tsilos3.com/silo/storagenode/contact.(*Chore).updateCycles.func1:87\n\tsilos3.com/common/sync2.(*Cycle).Run:102\n\tsilos3.com/common/sync2.(*Cycle).Start.func1:77\n\tgolang.org/x/sync/errgroup.(*Group).Go.func1:78”}

Make sure your port forwarding properly setup for port 28968

I’m redoing everything again. Port forwarding are OK as that is the easy part :wink:

Does Silo3 server communicate on port 28968 also?

Yes, first check in your 1st node print any error logs?

No, first node is working without any errors. Dashboard also good.

The only difference I found between those two are:

node1:
{
“Id”: “05754249d18114041556f22092f848a5b1b8fd7223ae9b9861a79f7ea74389fb”,
“Created”: “2025-01-22T07:05:47.029932699Z”,
“Path”: “/entrypoint”,
“Args”: ,
“State”: {
“Status”: “running”,
“Running”: true,
“Paused”: false,
“Restarting”: false,
“OOMKilled”: false,
“Dead”: false,
“Pid”: 11700,
“ExitCode”: 0,
“Error”: “”,
“StartedAt”: “2025-01-22T11:35:09.882100051Z”,
“FinishedAt”: “2025-01-22T10:07:24.11219236Z”
},
“Image”: “sha256:937f25caa661646daa89a44a5d039e9b79eb8cbad73ec2e017a9c41da698d1a7”,
“ResolvConfPath”: “/var/lib/docker/containers/05754249d18114041556f22092f848a5b1b8fd7223ae9b9861a79f7ea74389fb/resolv.conf”,
“HostnamePath”: “/var/lib/docker/containers/05754249d18114041556f22092f848a5b1b8fd7223ae9b9861a79f7ea74389fb/hostname”,
“HostsPath”: “/var/lib/docker/containers/05754249d18114041556f22092f848a5b1b8fd7223ae9b9861a79f7ea74389fb/hosts”,
“LogPath”: “/var/lib/docker/containers/05754249d18114041556f22092f848a5b1b8fd7223ae9b9861a79f7ea74389fb/05754249d18114041556f22092f848a5b1b8fd7223ae9b9861a79f7ea74389fb-json.log”,
“Name”: “/storagenode”,
“RestartCount”: 0,
“Driver”: “overlayfs”,
“Platform”: “linux”,
“MountLabel”: “”,
“ProcessLabel”: “”,
“AppArmorProfile”: “”,
“ExecIDs”: null,
“HostConfig”: {
“Binds”: null,
“ContainerIDFile”: “”,
“LogConfig”: {
“Type”: “json-file”,
“Config”: {}
},
“NetworkMode”: “bridge”,
“PortBindings”: {
“14002/tcp”: [
{
“HostIp”: “127.0.0.1”,
“HostPort”: “14002”
}
],
“28967/tcp”: [
{
“HostIp”: “”,
“HostPort”: “28967”
}
],
“28967/udp”: [
{
“HostIp”: “”,
“HostPort”: “28967”
}
]
},
“RestartPolicy”: {
“Name”: “unless-stopped”,
“MaximumRetryCount”: 0
},
“AutoRemove”: false,
“VolumeDriver”: “”,
“VolumesFrom”: null,
“ConsoleSize”: [
50,
120
],
“CapAdd”: null,
“CapDrop”: null,
“CgroupnsMode”: “host”,
“Dns”: ,
“DnsOptions”: ,
“DnsSearch”: ,
“ExtraHosts”: null,
“GroupAdd”: null,
“IpcMode”: “private”,
“Cgroup”: “”,
“Links”: null,
“OomScoreAdj”: 0,
“PidMode”: “”,
“Privileged”: false,
“PublishAllPorts”: false,
“ReadonlyRootfs”: false,
“SecurityOpt”: null,
“UTSMode”: “”,
“UsernsMode”: “”,
“ShmSize”: 67108864,
“Runtime”: “runc”,
“Isolation”: “”,
“CpuShares”: 0,
“Memory”: 0,
“NanoCpus”: 0,
“CgroupParent”: “”,
“BlkioWeight”: 0,
“BlkioWeightDevice”: ,
“BlkioDeviceReadBps”: ,
“BlkioDeviceWriteBps”: ,
“BlkioDeviceReadIOps”: ,
“BlkioDeviceWriteIOps”: ,
“CpuPeriod”: 0,
“CpuQuota”: 0,
“CpuRealtimePeriod”: 0,
“CpuRealtimeRuntime”: 0,
“CpusetCpus”: “”,
“CpusetMems”: “”,
“Devices”: ,
“DeviceCgroupRules”: null,
“DeviceRequests”: null,
“MemoryReservation”: 0,
“MemorySwap”: 0,
“MemorySwappiness”: null,
“OomKillDisable”: false,
“PidsLimit”: null,
“Ulimits”: ,
“CpuCount”: 0,
“CpuPercent”: 0,
“IOMaximumIOps”: 0,
“IOMaximumBandwidth”: 0,
“Mounts”: [
{
“Type”: “bind”,
“Source”: “C:\Users\rida\AppData\Roaming\Silo\Trustkey\silonode”,
“Target”: “/app/trustkey”
},
{
“Type”: “bind”,
“Source”: “C:\Silo3_storage1”,
“Target”: “/app/config”
}
],
“MaskedPaths”: [
“/proc/asound”,
“/proc/acpi”,
“/proc/kcore”,
“/proc/keys”,
“/proc/latency_stats”,
“/proc/timer_list”,
“/proc/timer_stats”,
“/proc/sched_debug”,
“/proc/scsi”,
“/sys/firmware”,
“/sys/devices/virtual/powercap”
],
“ReadonlyPaths”: [
“/proc/bus”,
“/proc/fs”,
“/proc/irq”,
“/proc/sys”,
“/proc/sysrq-trigger”
]
},
“GraphDriver”: {
“Data”: null,
“Name”: “overlayfs”
},
“Mounts”: [
{
“Type”: “bind”,
“Source”: “C:\Users\rida\AppData\Roaming\Silo\Trustkey\silonode”,
“Destination”: “/app/trustkey”,
“Mode”: “”,
“RW”: true,
“Propagation”: “rprivate”
},
{
“Type”: “bind”,
“Source”: “C:\Silo3_storage1”,
“Destination”: “/app/config”,
“Mode”: “”,
“RW”: true,
“Propagation”: “rprivate”
}
],
“Config”: {
“Hostname”: “05754249d181”,
“Domainname”: “”,
“User”: “”,
“AttachStdin”: false,
“AttachStdout”: false,
“AttachStderr”: false,
“ExposedPorts”: {
“14002/tcp”: {},
“28967/tcp”: {},
“28967/udp”: {}
},
“Tty”: false,
“OpenStdin”: false,
“StdinOnce”: false,
“Env”: [
“WALLET=0xcb102b7f5f143f7d2de56b33c1ecfa01dfbcc70f”,
“[email protected]”,
“ADDRESS:28967=sunquest.zapto.org”,
“STORAGE=800MB”,
“PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin”,
“GOARCH=amd64”,
“VERSION_SERVER_URL=https://updater.silos3.com”,
“SUPERVISOR_SERVER=unix”,
“SETUP=false”,
“AUTO_UPDATE=true”,
“LOG_LEVEL=”,
“BINARY_STORE_DIR=/app/config/bin”
],
“Cmd”: null,
“Image”: “silos3/silo-node:latest”,
“Volumes”: null,
“WorkingDir”: “/app”,
“Entrypoint”: [
“/entrypoint”
],
“OnBuild”: null,
“Labels”: {},
“StopTimeout”: 300
},
“NetworkSettings”: {
“Bridge”: “”,
“SandboxID”: “d682063aaad3dc0a19536da0b89a3b3cfbc6e7a5eba660aef9885703b694e38a”,
“SandboxKey”: “/var/run/docker/netns/d682063aaad3”,
“Ports”: {
“14002/tcp”: [
{
“HostIp”: “127.0.0.1”,
“HostPort”: “14002”
}
],
“28967/tcp”: [
{
“HostIp”: “0.0.0.0”,
“HostPort”: “28967”
}
],
“28967/udp”: [
{
“HostIp”: “0.0.0.0”,
“HostPort”: “28967”
}
]
},
“HairpinMode”: false,
“LinkLocalIPv6Address”: “”,
“LinkLocalIPv6PrefixLen”: 0,
“SecondaryIPAddresses”: null,
“SecondaryIPv6Addresses”: null,
“EndpointID”: “12eda475de7b29e895063c21e7e0a967d720428f45224389ae3c2e53afded3cd”,
“Gateway”: “172.17.0.1”,
“GlobalIPv6Address”: “”,
“GlobalIPv6PrefixLen”: 0,
“IPAddress”: “172.17.0.3”,
“IPPrefixLen”: 16,
“IPv6Gateway”: “”,
“MacAddress”: “02:42:ac:11:00:03”,
“Networks”: {
“bridge”: {
“IPAMConfig”: null,
“Links”: null,
“Aliases”: null,
“MacAddress”: “02:42:ac:11:00:03”,
“DriverOpts”: null,
“NetworkID”: “c98bd6ed76329ef5cd6ba381afa71009844a0e553df6282e591bd5ffc78916ad”,
“EndpointID”: “12eda475de7b29e895063c21e7e0a967d720428f45224389ae3c2e53afded3cd”,
“Gateway”: “172.17.0.1”,
“IPAddress”: “172.17.0.3”,
“IPPrefixLen”: 16,
“IPv6Gateway”: “”,
“GlobalIPv6Address”: “”,
“GlobalIPv6PrefixLen”: 0,
“DNSNames”: null
}
}
}
}

AND

“Config”: {
“Hostname”: “05754249d181”,
“Domainname”: “”,
“User”: “”,
“AttachStdin”: false,
“AttachStdout”: false,
“AttachStderr”: false,
“ExposedPorts”: {
“14002/tcp”: {},
“28967/tcp”: {},
“28967/udp”: {}

node2:

“Config”: {
“Hostname”: “0225c780dfe8”,
“Domainname”: “”,
“User”: “”,
“AttachStdin”: false,
“AttachStdout”: false,
“AttachStderr”: false,
“ExposedPorts”: {
“14002/tcp”: {},
“14003/tcp”: {},
“28967/tcp”: {},
“28968/tcp”: {},
“28968/udp”: {}

AND:
“NetworkSettings”: {
“Bridge”: “”,
“SandboxID”: “101f5e373073c2910f529ad508e85e8c78d55ed970f4ee464ad3b5f4f6c00c77”,
“SandboxKey”: “/var/run/docker/netns/101f5e373073”,
“Ports”: {
“14002/tcp”: null,
“14003/tcp”: [
{
“HostIp”: “127.0.0.1”,
“HostPort”: “14003”
}
],
“28967/tcp”: null,
“28968/tcp”: [
{
“HostIp”: “0.0.0.0”,
“HostPort”: “28968”
}
],
“28968/udp”: [
{
“HostIp”: “0.0.0.0”,
“HostPort”: “28968”

In none JASON terms:

Node1:

Node2:

Ah, I see an issue.

Correct CMD is

docker run -d --restart unless-stopped --stop-timeout 300 \
  -p 28968:28967/tcp \
  -p 28968:28967/udp \
  -p 127.0.0.1:14003:14002 \
  -e WALLET="0xXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" \
  -e EMAIL="[email protected]" \
  -e ADDRESS="domain.ddns.net:28968" \
  -e STORAGE="2TB" \
  --user $(id -u):$(id -g) \
  --mount type=bind,source="<trustkey2-dir>",destination=/app/trustkey \
  --mount type=bind,source="<storage2-dir>",destination=/app/config \
  --name storagenode silos3/silo-node:latest

28968:28967/tcp & 28968:28967/udp

Explaintion: in docker Silo Node open port 28967 and in your PC bind on 28968

1 Like

@600cc Problem Solved?

Hi,

I had to recreate key again as it was throughing error about trust certificate. I just started the node, no errors so far so I will just expect its working.
the only thing that I couldn’t start the dashboard on 14003. But I will try tomorrow.
thanks a bunch for your help!

docker run -d --restart unless-stopped --stop-timeout 300 \
  -p 28968:28967/tcp \
  -p 28968:28967/udp \
  -p 127.0.0.1:14003:14002 \
  -e WALLET="0xXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" \
  -e EMAIL="[email protected]" \
  -e ADDRESS="domain.ddns.net:28968" \
  -e STORAGE="2TB" \
  --user $(id -u):$(id -g) \
  --mount type=bind,source="<trustkey2-dir>",destination=/app/trustkey \
  --mount type=bind,source="<storage2-dir>",destination=/app/config \
  --name storagenode silos3/silo-node:latest

Run this

2 Likes

yeees mate, this is worked perfect.
Thanks again, glad this is sorted out.
Have a wonderful day.

1 Like

Hello, I don’t want to create a new topic, I have a question, I’m creating a second node on a PC where one node is already installed and working, I did everything according to the manual here, but the node refuses to connect.

port forwarding 28969 is configured, firewall is configured and disabled, token was recreated, ports are checked, open and port forwarding works

Here are my settings for creating a node:

docker run --rm -e SETUP=“true” --mount type=bind,source=“C:\Users\Web\AppData\Roaming\Silo\Trustkey\silonode2”,destination=/app/trustkey --mount type=bind,source=“F:\SILO”,destination=/app/config --name storagenode2 silos3/silo-node:latest

docker run -d --restart unless-stopped --stop-timeout 300 -p 28969:28967/tcp -p 28969:28967/udp -p 14003:14002 -e WALLET=“0x5bf65dec155a62b162734fb0049131fa95316c0a” -e EMAIL="[email protected]" -e ADDRESS=“95.31.,:28969” -e STORAGE=“10TB” --mount type=bind,source=“C:\Users\Web\AppData\Roaming\Silo\Trustkey\silonode2”,destination=/app/trustkey --mount type=bind,source=“F:\SILO”,destination=/app/config --name storagenode2 silos3/silo-node:latest

Here’s the connection error again:

2025-01-24 15:12:06 2025-01-24T12:12:06Z ERROR contact:service ping orbital failed {“Process”: “storagenode”, “Orbital ID”: “1dkRxqhU46NfjV1xJZrxnt8RwWGK2uAas1jtncvZoj4s8HVVK4”, “attempts”: 11, “error”: “ping orbital: failed to ping storage node, your node indicated error code: 0, rpc: tcp connector failed: rpc: tls peer certificate verification: not signed by any CA in the whitelist: CA cert”, “errorVerbose”: “ping orbital: failed to ping storage node, your node indicated error code: 0, rpc: tcp connector failed: rpc: tls peer certificate verification: not signed by any CA in the whitelist: CA cert\n\tsilos3.com/silo/storagenode/contact.(*Service).pingOrbitalOnce:209\n\tsilos3.com/silo/storagenode/contact.(*Service).pingOrbital:157\n\tsilos3.com/silo/storagenode/contact .(*Chore).updateCycles.func1:87\n\tsilos3.com/common/sync2.(*Cycle).Run:163\n\tsilos3.com/common/sync2.(*Cycle).Start.func1:77\n\tgolang.org/x/sync/errgroup.(*Group).Go.func1:78”}