Несколько узлов Docker for Windows

Уже почти месяц не могу ноду под докером запустить.

Если я пытаюсь пробросить 28968 to 28968, то роутер не дает этого сделать
image

Если я меняю проброс 28967 to 28968 на 28968 to 28968, дэшборд сообщает offline и misconfigurated
image

20 строк лога:

2023-02-03T09:57:58.463Z        INFO    Event collection enabled        {"Process": "storagenode", "instance ID": "12MkEbqLJLpAMesAYmxtvic2WGzBR9niP5PuX6A2pVfC6t1SJeL"}
2023-02-03 09:57:58,464 INFO success: processes-exit-eventlistener entered RUNNING state, process has stayed up for > than 1 seconds (startsecs)
2023-02-03 09:57:58,465 INFO success: storagenode entered RUNNING state, process has stayed up for > than 1 seconds (startsecs)
2023-02-03 09:57:58,465 INFO success: storagenode-updater entered RUNNING state, process has stayed up for > than 1 seconds (startsecs)
2023-02-03T09:57:59.385Z        INFO    db.migration    Database Version        {"Process": "storagenode", "version": 54}
2023-02-03T09:58:00.076Z        INFO    preflight:localtime     start checking local system clock with trusted satellites' system clock.        {"Process": "storagenode"}
2023-02-03T09:58:01.053Z        INFO    preflight:localtime     local system clock is in sync with trusted satellites' system clock.    {"Process": "storagenode"}
2023-02-03T09:58:01.054Z        INFO    bandwidth       Performing bandwidth usage rollups      {"Process": "storagenode"}
2023-02-03T09:58:01.057Z        INFO    Node 12MkEbqLJLpAMesAYmxtvic2WGzBR9niP5PuX6A2pVfC6t1SJeL started        {"Process": "storagenode"}
2023-02-03T09:58:01.057Z        INFO    Public server started on [::]:28967     {"Process": "storagenode"}
2023-02-03T09:58:01.057Z        INFO    Private server started on 127.0.0.1:7778        {"Process": "storagenode"}
2023-02-03T09:58:01.057Z        INFO    failed to sufficiently increase receive buffer size (was: 208 kiB, wanted: 2048 kiB, got: 416 kiB). See https://github.com/lucas-clemente/quic-go/wiki/UDP-Receive-Buffer-Size for details.      {"Process": "storagenode"}
2023-02-03T09:58:01.059Z        INFO    trust   Scheduling next refresh {"Process": "storagenode", "after": "4h42m49.563511092s"}
2023-02-03T09:58:01.060Z        INFO    pieces:trash    emptying trash started  {"Process": "storagenode", "Satellite ID": "12rfG3sh9NCWiX3ivPjq2HtdLmbqCrvHVEzJubnzFzosMuawymB"}
2023-02-03T09:58:01.090Z        INFO    pieces:trash    emptying trash started  {"Process": "storagenode", "Satellite ID": "12tRQrMTWUWwzwGh18i7Fqs67kmdhH9t6aToeiwbo5mfS2rUmo"}
2023-02-03T09:58:01.096Z        INFO    pieces:trash    emptying trash started  {"Process": "storagenode", "Satellite ID": "1wFTAgs9DP5RSnCqKV1eLf6N9wtk4EAtmN5DpSxcs8EjT69tGE"}
2023-02-03T09:58:01.101Z        INFO    pieces:trash    emptying trash started  {"Process": "storagenode", "Satellite ID": "121RTSDpyNZVcEU84Ticf2L1ntiuUimbWgfATz21tuvgk3vzoA6"}
2023-02-03T09:58:01.104Z        INFO    pieces:trash    emptying trash started  {"Process": "storagenode", "Satellite ID": "12EayRS2V1kEsWESU9QMRseFhdxYxKicsiFmxrsLZHeLUtdps3S"}
2023-02-03T09:58:01.122Z        INFO    pieces:trash    emptying trash started  {"Process": "storagenode", "Satellite ID": "12L9ZFwhzVpuEKMUNUqkaTLGzwY9G24tbiigLiXpmZWKwmcNDDs"}
2023-02-03T09:58:46.473Z        ERROR   nodestats:cache Get stats query failed  {"Process": "storagenode", "error": "nodestats: EOF; nodestats: EOF; nodestats: EOF; nodestats: EOF; nodestats: EOF; nodestats: EOF", "errorVerbose": "group:\n--- nodestats: EOF\n\tstorj.io/storj/storagenode/nodestats.(*Service).GetReputationStats:74\n\tstorj.io/storj/storagenode/nodestats.(*Cache).CacheReputationStats.func1:152\n\tstorj.io/storj/storagenode/nodestats.(*Cache).satelliteLoop:261\n\tstorj.io/storj/storagenode/nodestats.(*Cache).CacheReputationStats:151\n\tstorj.io/storj/storagenode/nodestats.(*Cache).Run.func2:118\n\tstorj.io/common/sync2.(*Cycle).Run:99\n\tstorj.io/common/sync2.(*Cycle).Start.func1:77\n\tgolang.org/x/sync/errgroup.(*Group).Go.func1:75\n--- nodestats: EOF\n\tstorj.io/storj/storagenode/nodestats.(*Service).GetReputationStats:74\n\tstorj.io/storj/storagenode/nodestats.(*Cache).CacheReputationStats.func1:152\n\tstorj.io/storj/storagenode/nodestats.(*Cache).satelliteLoop:261\n\tstorj.io/storj/storagenode/nodestats.(*Cache).CacheReputationStats:151\n\tstorj.io/storj/storagenode/nodestats.(*Cache).Run.func2:118\n\tstorj.io/common/sync2.(*Cycle).Run:99\n\tstorj.io/common/sync2.(*Cycle).Start.func1:77\n\tgolang.org/x/sync/errgroup.(*Group).Go.func1:75\n--- nodestats: EOF\n\tstorj.io/storj/storagenode/nodestats.(*Service).GetReputationStats:74\n\tstorj.io/storj/storagenode/nodestats.(*Cache).CacheReputationStats.func1:152\n\tstorj.io/storj/storagenode/nodestats.(*Cache).satelliteLoop:261\n\tstorj.io/storj/storagenode/nodestats.(*Cache).CacheReputationStats:151\n\tstorj.io/storj/storagenode/nodestats.(*Cache).Run.func2:118\n\tstorj.io/common/sync2.(*Cycle).Run:99\n\tstorj.io/common/sync2.(*Cycle).Start.func1:77\n\tgolang.org/x/sync/errgroup.(*Group).Go.func1:75\n--- nodestats: EOF\n\tstorj.io/storj/storagenode/nodestats.(*Service).GetReputationStats:74\n\tstorj.io/storj/storagenode/nodestats.(*Cache).CacheReputationStats.func1:152\n\tstorj.io/storj/storagenode/nodestats.(*Cache).satelliteLoop:261\n\tstorj.io/storj/storagenode/nodestats.(*Cache).CacheReputationStats:151\n\tstorj.io/storj/storagenode/nodestats.(*Cache).Run.func2:118\n\tstorj.io/common/sync2.(*Cycle).Run:99\n\tstorj.io/common/sync2.(*Cycle).Start.func1:77\n\tgolang.org/x/sync/errgroup.(*Group).Go.func1:75\n--- nodestats: EOF\n\tstorj.io/storj/storagenode/nodestats.(*Service).GetReputationStats:74\n\tstorj.io/storj/storagenode/nodestats.(*Cache).CacheReputationStats.func1:152\n\tstorj.io/storj/storagenode/nodestats.(*Cache).satelliteLoop:261\n\tstorj.io/storj/storagenode/nodestats.(*Cache).CacheReputationStats:151\n\tstorj.io/storj/storagenode/nodestats.(*Cache).Run.func2:118\n\tstorj.io/common/sync2.(*Cycle).Run:99\n\tstorj.io/common/sync2.(*Cycle).Start.func1:77\n\tgolang.org/x/sync/errgroup.(*Group).Go.func1:75\n--- nodestats: EOF\n\tstorj.io/storj/storagenode/nodestats.(*Service).GetReputationStats:74\n\tstorj.io/storj/storagenode/nodestats.(*Cache).CacheReputationStats.func1:152\n\tstorj.io/storj/storagenode/nodestats.(*Cache).satelliteLoop:261\n\tstorj.io/storj/storagenode/nodestats.(*Cache).CacheReputationStats:151\n\tstorj.io/storj/storagenode/nodestats.(*Cache).Run.func2:118\n\tstorj.io/common/sync2.(*Cycle).Run:99\n\tstorj.io/common/sync2.(*Cycle).Start.func1:77\n\tgolang.org/x/sync/errgroup.(*Group).Go.func1:75"}

Если при пробросе 28967 to 28968 я меняю команду запуска контейнера на
docker run -d --restart unless-stopped --stop-timeout 300 -p 28967:28967/tcp -p 28967:28967/udp -p 127.0.0.1:14003:14002 -e WALLET="0x867xxxx" -e EMAIL="xxxx@gmail.com" -e ADDRESS="xxx.xxx.xxx.xxx:28968" -e STORAGE="0.5TB" --mount type=bind,source="D:\Identity\storagenode",destination=/app/identity --mount type=bind,source="D:\Storj4.1",destination=/app/config --name storagenode storjlabs/storagenode:latest

То нода тоже не запускается совсем:

docker: Error response from daemon: driver failed programming external connectivity on endpoint storagenode (206a196680573e4384d9ec951a419e98de14c466c9ce5cb71c0fdcefa2d3f2c0): Error starting userland proxy: listen tcp 0.0.0.0:28967: bind: Only one usage of each socket address (protocol/network address/port) is normally permitted.

Подскажи, пожалуйста, в чем может быть дело? Может можем сделать созвон в зум или энидеск?

С уважением,
Александр

Если вы пробросили 28968 на 28968, тогда docker run должен содержать порт маппинг -p 28968:28967/tcp -p 28968:28967/udp -p 127.0.0.1:14003:14002 -e ADDRESS=xxxxxxxx:28968
В Windows брандмауэре вам нужно создать два правила для разрешения порта 28968, одно - TCP 28968, второе - UDP 28968.

Если вы пробросили 28967 на 28967 (такое возможно только если это первый узел на этом ПК), тогда порт маппинг будет таким: -p 28967:28967/tcp -p 28967:28967/udp -p 127.0.0.1:14002:14002 -e ADDRESS=xxxxxxxxxxx:28868
В Windows брандмауэре вам нужно создать два правила для разрешения порта 28967, одно - TCP 28967, второе - UDP 28967.

Обратите внимание - в первом случае я также изменил порт для dashboard, поэтому открывать нужно http://localhost:14003 на ПК с узлом. Если вы хотите открывать dashboard откуда угодно: How to remote access the web dashboard - Storj Node Operator Docs

Если узел остаётся offline, нужно проверить:

  1. Identity, она должна быть подписана токеном авторизации и проверка должна вернуть 2 и 3.
  2. WAN IP со страницы статистики на вашем роутере должен совпадать с IP на Open Port Check Tool - Test Port Forwarding on Your Router, иначе ппроброс портов работать не будет.
  3. Параметр ADDRESS должен содержать ваш внешний адрес, это может быть или ваш публичный IP (такой же, как WAN IP и IP на yougetsignal) или DDNS hostname, он также должен содержать ваш внешний порт (тот же, что указан в правиле проброса порта на роутере в поле “WAN порт”). Если ваш публичный IP динамический, то лучше зарегистрировать свой DDNS hostname, чтобы не обновлять IP вручную каждый раз, когда ваш ISP его меняет.
  4. Если вы используете DDNS hostname, убедитесь, что он обновлён (для этого необходимо сконфигурировать его обновление либо на роутере в секции DDNS, либо установить ПО от провайлера DDNS, для No-Ip оно называется DUC. Необхолимо использовать только один из этих способов - либо роутер, либо - программа. Рекомендуется использовать роутер, потому что он обновляет DDNS hostname сразу как меняется IP, а программа это делает по расписанию, если она вообще запущена). Проверка:
nslookup your.ddns.domain 8.8.8.8

должна вернуть тот же IP, что и WAN IP и IP на yougetsignal. Иначе нужно проверить конфигурацию обновления DDNS.

Когда меняете конфигурацию, не забывайте пересоздавать контейнер:

docker stop -t 300 storagenode
docker rm storagenode

Затем используете полную команду docker run со всеми параметрами, включая изменённые.

Для просмотра всех контейнеров используйте команду

docker ps -a

это довольно странная ошибка. Возможно у вас действительно где-то уже есть правило перенаправления 28968 на 28968 и тот же локальный IP?
Попробуйте удалить это правило, выйти из этого режима, сохранив изменения, и создать его снова.

Привет Алексей!


Экзамен сдал). Дело было в настройках фаервола. Я забыл про эту команду.
Сейчас буду пробовать настроить вторую ноду на этом же докере по пройденному алгоритму)

С уважением,
Александр

1 Like

Алексей привет!

Вторую ноду под докером тоже запустил пробросив 28969 порт. Дэшборд настроил на 14004. Так выглядят дэшборды обеих нод.

Есть 2 вопроса:

  1. Подскажи, пожалуйста, а можно как-то сделать, чтоб данные по обеим нодам, выводить на одной странице?

  2. Правильно я понимаю, я могу добавлять еще ноды на эту машину аналогичным образом, добавляя новые HDD и в принципе, их количество не будет ограничено системой? Я знаю про рекомендацию 1 нода на 1 ядро, но насколько я понимаю, у многих нормально работает и при большем количестве нод на 1 ядро.

С уважением,
Александр

1 Like

Никаких ограничений нет, но не стоит запускать сразу несколько новых узлов.

Каждый узел должен быть проверен. Не проверенный узел может получать только 5% клиентского трафика, пока не будет проверен. Чтобы пройти проверку на одном сателлите узел должен пройти 100 аудитов от него. Для одного узла в одной подсети /24 публичных IP это должно занять не менее месяца (или больше).

Мы фильтруем узлы из одной подсети /24 публичных IP для клиентских загрузок, поэтому все узлы из одной такой подсети расцениваются как один большой узел для клиентских загрузок, и как разные для аудита, клиентских скачиваний, ремонтного трафика и проверок доступности: мы хотим быть децентрализованными насколько возможно.
Таким образом, добавление новых узлов не увеличивает количество загрузок, они просто распределяются между ними как если бы это был один узел.

Если вы запускаете несколько новых узлов, они все начинают делить один и тот же трафик, поэтому проверка этих узлов может занять во столько же раз дольше, как и количество таких узлов и всё это время они будут получать только 5% клиентского трафика на всех.

Поэтому мы рекомендуем запускать следующий узел только когда предыдущий почти заполнен или хотя бы проверен.

Касательно вопроса поддержки нескольких узлов на одной dashboard вы можете использовать multinode dashboard, как посоветовал @Roberto выше (thanks @Roberto!).

1 Like