Vikhrmodels/habr_qa_sbs huggingface dataset:
Вопрос: Список технологий необходимых для backend php developer?

Лучший ответ:
Технологию надо знать ровно одну: называется google search или "базовые навыки пользования интернетом".
К примеру, перед тем как задать вопрос на форуме (и мычать невнятное "ну я искал, марьванна, нинашол"), надо сначала воспользоваться такой секретной технологией, как поиск по конкретно этому формум, site:qna.habr.com php middle
И обнаружить примерно 100500 готовых ответов на свой вопрос.

Худший ответ:
Это от вакансии зависит. Мы с парнями недавно ржали как раз, что примерно треть вакансий "бэк девелопа" непременно требует знания React или Vue )))) Ну, реально, пробегитесь по ссылкам. А так, хорошего знания Ларки + Гит - вполне достаточно. Остальное просто по ходу можно усвоить и всё.
Вопрос: Какой из двух ноутбуков выбрать для web разработки?

Лучший ответ:
Взять станционар с Linux'ом.

Худший ответ:
Лучше макбуки не брать для веб-разработки, лучше купите ноут на x64-процессоре, а не ARM и установите на него Linux. И также подумайте, так ли вам нужен ноутбук? Вы будете с ним куда-то ходить? Если нет, соберите стационарный компьютер. Это будет дешевле и компьютер будет мощнее, а также будете знать что вы собрали, ибо если будете покупать ноутбук, вы будете мало знать, из чего его собрали. Если допустим ноутбук/ПК(готовая сборка от какой-нибудь фирмы) сломается, вам нужно его тащить в сервисный центр. А если вы соберете свой ПК, и он вдруг сломается, то вам достаточно принести сломанное комплектующее.

P.S. Если решитесь покупать другой ноутбук на x64-процессоре или собирать ПК - не берите процессоры AMD.

P.S.2. Заметил, что второй макбук с x64. А вас не смущает что там размер экрана маленький?(13 дюймов)
Вопрос: Есть ли какие-то работающие альтернативы IP-адресации (и до кучи — DNS) как таковой? Как еще можно организовать сеть?

Лучший ответ:
Весь интернет основан на IP-адресации, да, и все уровни выше опираются на IP.
На то он и Internet Protocol

Всё что ниже - оно опирается на MAC-адреса и номера портов. Но высокие уровни о Mac ничего не знают

Худший ответ:
Есть ещё ipv6 это как и станлартный ip (ipv4), но с более длинным адресом и возможностью его пробрасывать внутрь домашней сети для доступа снаружи, а так же через международные шлюзы обходить "черные списки" ipv4. Но для доступа к этим шлюзам нужны ipv4 адреса и если адреса шлюзов заблочат, то этот вариант тоже накроется.

Ещё бывают Mesh сети, которые можно построить на базе точек доступа WiFi, но это практикуется в Европе, в маленьких городах, где большие трудности с прокладыванием новых линий связи и строятся они так же на ip. 

Ну и конечно спутниковый интернет от Илона Маска, альтернатив ему за вменяемые деньги сейчас практически нет, но это тоже ip. 

Раньше ещё было FIDO оно работает по принципу электронной почты и раньше работало через телефонную сеть т. е. там не было никаких ip протоколов, там были другие протоколы для связи между модемами. Скорость низкая, сеть строилась на людях т. е. не только не было никакой анонимности, но были ещё и встречи всех участников.
Вопрос: Почему возникает ошибка «IndentationError: expected an indented block after function definition»?

Лучший ответ:
может я тупой конечно

С формулированием краткого, но конкретного заголовка вопроса в форме вопросительного предложения не справился.
С редактором текста вопроса не справился.
С поиском по очень распространённой ошибке не справился.



Худший ответ:
while t:
^
IndentationError: expected an indented block after function definition on line 5
Где-то в районе цикла проблемы с отступом.
(С учетом того, что функцией форматирования кода вы не воспользовались - где именно ищите сами. В текущем виде угадывать бесполезно)
Вопрос: При использовании range( ), через N-ное количество циклов падает скорость?

Лучший ответ:
Потому что в целом подход неправильный. Вы каждый цикл создаете новый объект и просто его отрисовываете поверх других, сдвигая каждый раз на новую величину.
Вместо этого нужно 1 раз создать свой Circle и его уже потом двигать (и двигать соответственно не на i, а на одинаковое фиксированное значение (если ожидается равномерное движение).
И наверное в цикл стоит добавить задержку в виде time.sleep(0.01)
obj = Circle(Point(150, 20), 15)
obj.setWidth(1)
obj.draw(win)

def down():
    for i in range(250):
        print (i)

        obj.setFill("yellow")
        obj.move(0, 1)
        time.sleep(0.01)

Худший ответ:
Принты заметно замедляют программу, попробуйте без них ;) И действительно, некоторые переменные вы можете не пересоздавать, я не про генератор. Вы можете в цикле создать ваш объект Circle, и передавать его в функции up и down и изменять его, а не каждый раз создавать - затратная однако операция.
Вопрос: Делить ли React-компоненты на чистые и контейнерные?

Лучший ответ:
Я стараюсь делить. Другие не делят. На вопрос невозможно дать однозначный ответ. Зависит от проекта, команды и настроения того, кто пишет :)

Дополню ответ: Если есть какой-то участок кода, который нужно использовать повторно, очевидно лучшим решением будет вынести его в отдельный модуль / функцию и т.п.. Деление на чистые компоненты и компоненты с логикой по сути и делается для того, чтобы вынести повторяющийся код в отдельный компонент. Иногда проще скопировать простой участок кода и не заморачиваться, а иногда лучше вынести куда-то. Так что зависит от задач и особенностей проекта.

Худший ответ:
Для проектов с редаксом, в которых используется сторибук и есть компонентное тестирование, разделять желательно, чтобы не городить велосипеды с мокированием стора.

Если из выше упомянутого только редакс/мобх, стоит подумать, а нельзя ли эту логику унести из компонента в экшен. 

Если ничего из этого нет, а логика сложная и "раздувает" компонент, можно вынести её в кастомный хук.
Вопрос: Как весь блок заполнить точками?

Лучший ответ:
Повторяющимся радиальным градиентом
https://jsfiddle.net/Ankhena/h21s4o0m/

Худший ответ:
Тут проще фоновый рисунок с  https://developer.mozilla.org/ru/docs/Web/CSS/back... сделать
Вопрос: Можно ли решать задачи методом перебора вариантов?

Лучший ответ:
Существует вероятность что ты страдаешь какой-то фигней вместо нормального чтения Лутца.

Худший ответ:
Какие задачи? Перебором каких вариантов?
Есть методы решения задач и перебором (брутфорс), и есть генетические алгоритмы...
Но при этом если речь о написании кода методом перебора - то это не разработка. Просто потому что в реальной практике вам нужно предоставить эстимейты на задачу.

Бесконечное количество обезьян за бесконечное количество времени смогут написать Гамлета, только толку...
Вопрос: Если тратить по 8-10ч в день на программирование, возможно ли дорасти до уровня middle разрб?

Лучший ответ:
Достаточно много людей начинают работать на аутсорсе со 2-3 курса. Работа в команде для достижения уровня мидла дает больше чем 2 с половиной года по 8 часов в день.
Если 8 часов в день кодить, можно двинуться кукушечкой и до мидла не дотянуть.
Учи Английский, это правильно, говори на нем, в идеале с носителями, трать разумное время на теорию и практику в разработке, отдыхай и занимайся нетворкингом и успех тебе гарантирован.

Худший ответ:
Давай ты через месяца два нам скажешь, получается ли у тебя выдерживать такой темп?
Вопрос: Как ставить nginx, в контейнер или просто на сервер?

Лучший ответ:
Все предложенные варианты имеют право на жизнь.
Но я за контейнеризацию, т.к. плюсы размещения в контейнере очевидны, вся конфигурация приложения при следовании лучшим практикам находится в одном месте, например:
/opt/docker-compose/
в котором есть список ваших приложений, например:
nginx-reverse/
certbot/
nodejs-front/
nodejs-back/
something-else/

Такая компоновка обеспечит более легкий деплоймент в пайплайне (ci/cd),  да и ручной перенос с хостинга на хостинг.  Локальное тестирование тоже проще осуществить.

Худший ответ:
Раз делаете всё в докер, пихайте nginx тоже
Вопрос: Как создать массив объектов без размера (без List и Dictionary)?

Лучший ответ:
Создать массив чуть больше чем количество объектов. И в отдельной переменной вести учет их количества. Если вдруг объектов станет больше, то выделять новый массив большего размера, туда копировать данные их предыдущего и записывать новые.
GameObject[] ArrayObj = new GameObject[100];

Худший ответ:
Создать массив чуть больше чем количество объектов. И в отдельной переменной вести учет их количества. Если вдруг объектов станет больше, то выделять новый массив большего размера, туда копировать данные их предыдущего и записывать новые.
GameObject[] ArrayObj = new GameObject[100];
Вопрос: Как в laravel построить сложную логику?

Лучший ответ:
Бизнес-логике - не место в контроллере.

AppServiceProvider
public function boot(){
Validator::extend('count_books', function($attribute, $value, $parameters) {
        $count = IssueBook::where('client_id', $value)->where('is_returned', false)->count()
        return $count < 2;
});
}

StoreRequest
public function rules()
  {
    return [
      'category_id' => 'exists:App\Category,id',
      'client_id' => 'exists:App\Client,id|count_books',
      'book_id' => 'exists:App\Book,id',
      'days_issued' => 'nullable|string',
      'is_returned' => 'nullable|boolean',
      'return_date' => 'nullable|date',
    ];
  }

Худший ответ:
Данная проверка никакого отношения к валидации полей формы не имеет. Смотри авторизацию с возвратом сообщений.
Вопрос: Почему не работает код Regex validate PIN code?

Лучший ответ:
Всё не так.
split разбивает строку и результатом будет массив строк. Соответственно, условие typeof arr[i] === 'number' никогда не выполнится.
Условие записано неверно и всегда будет давать true.
typeof arr[i] === 'number' & arr.length === 4 || 6эквивалентно
((typeof arr[i] === 'number') & (arr.length === 4)) || 6
& - это не логическое И, а побитовое.
forEach у вас смысла не имеет, так как он не использует значение, возвращаемое из каллбэк-функции.
В основной функции нет return'а, значит она всегда возвращает undefined.
Ну и regex'а тут нет.

Худший ответ:
Метод split кажется должен вернуть тебе массив строк. Поэтому проверка ===number не срабатывает. Приведи arr[i] к числу. Number(arr[i]). А потом делай манипуляции. Но проще было бы валидировать регулярным выражением.
Вопрос: Что за странные письма приходят с цифрами?

Лучший ответ:
Сопоставь содержимое прикрепленного файла с байтами, например в hex редакторе. Может оказаться что видимое там не все.

P.S. Как вариант, судя по содержимому файла, горе-спамер запорол рассылку из-за бага в коде, который не сгенерировал html на основе шаблона.

Худший ответ:
Прикрепленную страницу в браузере откройте, а потом делайте выводы.
Вопрос: Как правильно прикрутить анимацию в файле JSON на сайт?

Лучший ответ:
Анимацию разбить на кадры и создать спрайт, после чего используя  animation steps запустить в нужное время с нужным кол-вом повторений.
snippet

Худший ответ:
Если вам просто анимация нужна попробуйте написать это на canvas/webgl. или любую библиотеку для создания игр, тот же phaserjs
Вопрос: Как можно передать ссылку/адрес на относительно большой файл из go в c++?

Лучший ответ:
Конечно есть. Написать всё на одном языке. Или использовать временный файл. Или организовать IPC любым способом и передавать файл.

Худший ответ:
Не стоит так делать - не шарьте память процессов. Может оторвать ногу. 
Обменяйтесь данными, например, через локальный сокет.

Если все же есть острое желание сделать троллейбус из буханки хлеба, вот пример чего-то похожего https://stackoverflow.com/q/28778521
Вопрос: Docker: принято ли ставить на продакшене?

Лучший ответ:
1. принято. Если кто-то станет шикать на вас за это — это их проблемы, а у нас свободные нравы!
2. правильно.

С монтированием – по-разному. Как удобнее. Варианты:

в проекте папка /docker под ней в подпапке  /docker/nginx – конфиги nginx, которые биндятся в контейнер по одному, или всей подпапкой. Удобно, если захочется по-живому редактить конфиги;
в контейнер при его билде, инструкциями в его Dockerfile, копируются файлы из папки;
прилетает уже готовый-собранный образ, из которого поднимается рабочий контейнер, не запариваясь расположением конфигов и какими-то настройками.

Логи направляются в Stdout контейнера и хранятся Docker'ом. Посмотреть хвост: docker logs --tail 50 имя_контейнера

Худший ответ:
да, нет, не знаю - все три ответа верные

Автоматизация настроек машины возможна своими скриптами или к примеру ansible. Облачные сервисы представляют оплату за использование ресурсов, а это значит может оказаться оправдано разделение своих по виртуальным машинам провайдера (мое мнение - нет, любое готовое облачное решение будет дороже своего, за исключением кратковременного использования и обслуживании редких хабраэффектов).

Докер просто еще один инструмент изоляции и автонастройки, плюс если вспомнить, докер для linux основан на lxc, а это значит почти на любом хостинге возможна реализация своих виртуальных машин с ее помощью.
В конечном случае самодельные инструменты на основе вирутальных машин могут выродиться в копию докера, поэтому все зависит от того, на сколько глубоко нужно залезать в эту нору.
Вопрос: Что нужно для сети маленького бизнеса по оборудованию, желательно tp-link?

Лучший ответ:
Выкинуть ТПлинк. 
Рассмотреть точки от Микротик или Убикьюньти

Для начала по 1 точке на зону. Если нехватит - уже добавите по ситуации
Но я бы расставил недорогие в каждое помещение, отделенное бетонной стенкой

Худший ответ:
Остановился на таком сетапе
Маршрутизатор TP-LINK ER605
Комутатор TP-LINK TL-SG2210P
Хмарний контролер TP-Link Omada OC200
Точки доступу 3 штуки TP-LINK EAP225(их радиус действия +- 15 м)

Приимущества TP-Link над микротиком нормальна я рабочая гарантия 2-5 лет в зависимости от оборудование и рабочая поддердка отвечали довольно быстро
Вопрос: Как записать звук с аудиовыхода в windows?

Лучший ответ:
В настройках звука есть скрытые устройства. Среди них есть "Стереомикшер", который считается микрофоном, который транслирует все звуки компьютера. Нужно показать скрытые и включить стереомикшер. После этого его можно выбрать как источник звука в любой программе

Худший ответ:
VLC или obs 

Они позволяют это как захват так и стриминг
Вопрос: Как выполнять задачу каждые 10 секунд в PHP?

Лучший ответ:
Можно установить модуль Swoole PHP, и тогда все прелести таймеров, корутин и асинхронности – к вашим услугам.

Запускается один раз php  app.php и процессы висят, работают. 

Таймер на 10 секунд:<?php

function run($timerid, $params) {
    var_dump($timerid);
    var_dump($params);
}

// Каждые 10 секунд выполнять функцию run
Swoole\Timer::tick(10000, "run", ["param1", "param2"]);

MySQL:// Enable the hook for MySQL: PDO/MySQLi
Co::set(['hook_flags' => SWOOLE_HOOK_TCP]);

// Setup a coroutine context
Co\run(function() {
    // Execute a query inside a coroutine
    go(function () {
        // Already setup the $pdo connection before...
        $statement = $pdo->prepare("SELECT * FROM users LIMIT :limit, :offset");
        $statement->execute(['limit' => $limit, 'offset' => $offset]); 
        $data = $statement->fetchAll();

        // Process $data result...
    });
});

p.s. Swoole ещё умеет быть WebSocket сервером. Сможете потом сделать в реальном времени уведомления об изменении цены, живые графики, чаты )

Худший ответ:
самый простой способ - cron задача каждые 10 минут на выполнение скрипта
Вопрос: Зачем нужен WebFlux?

Лучший ответ:
Мне кажется что внедрение WebFlux идет от "реактивного манифеста".  Вообще классические сервлетные серваки которые раньше поддерживались Tomcat/Jetty сегодня могут быть прозрачно подменены на netty, на уровне конфигураций бута, что как-бы приближает нас к асинхронщине. И современному бизнес-разработчику практически будет безразлично, написан ли его контроллер на блокирующем IO или на каком-то другом. По сути речь идет о диспетчеризации ресурсов. Где создавать поток. А где и хватит единого потока диспетчера на всех.

По поводу WebFlux, я видел один проект по обработке web-messages и это было удобно. Но только если мы на уровне алгоритма гарантируем что хендлер месседжа не будет занимать много времени.

Худший ответ:
По-моему, хороший ответ даёт вот этот мущщина :)
Если кратко, использование асинхронного подхода даёт более отзывчивое приложение. При этом оно может и не быть быстрее, но т.к. пользователь начинает быстрее получать первые данные, ему кажется что оно быстрее.
Вопрос: Как роботам показывать оригинал страницы, а пользователей отправлять редиректом на другой адрес?

Лучший ответ:
Вы хотели сказать "чтобы весь сайт гарантированно вылетел из поиска"?
Да, это надёжный способ

Худший ответ:
и как получить все равно бан)  так делать нельзя, и у гугл и у яндекс есть люди - асессоры, они ручками периодически проверяют выдачу.
Вопрос: Как менять ip и переключаться между ними?

Лучший ответ:
Это не так просто, как зарегиистрировать новую учётку на форуме. :) Это не бесплатно.

Вопрос: Как получить 10 почтовых\юридических адресов (не для электронной почты, а для бумажных писем, посылок)?
Ответ: Нужно купить или взять в аренду 10 квартир или офисов.

Вопрос: Как получить 10 IP-адресов?
Ответ: Нужно купить их у одного провайдера (адреса будут похожие, как если вы купите 10 квартир в одном доме) или у 10 разных провайдеров. Во втором случае вам нужно заключить договоры со всеми 10 провайдерами и каждый провайдер проведёт к вам свой кабель. После этого у вас будет квест с настройкой оборудования, и потом уже можно будет задавать вопрос, как "переключать" адреса. Ещё один вариант (более простой) - арендовать (за денежки) 10 VPS у одного или у разных хостеров, на каждой из них поднять VPN, подключаться по очереди к одной из VPN.

Худший ответ:
NetSetMan
Или еще видел скриптами с помощью netsh.
Вопрос: Должны ли разработчики понимать абсолютно весь проект?

Лучший ответ:
В достаточно большом проекте - это просто невозможно. Ни один человек в мире не может понимать целиком, например, хром.

Если проект нормально структурирован, то все разработчики должны понимать примерно чем занимается каждая часть и общую архитектуру.

Но иметь белые пятна - это нормально, если непонятной частью занимаются другие разработчики, естественно. Свой кусок знать надо целиком.

Худший ответ:
В теории да. На практике есть менеджер, который распределяет задачи так, что можно вообще ничего не знать.
Вопрос: Могу ли я подключить ноутбук к розетке в поезде?

Лучший ответ:
Можно, 
1. То что на блоке 200Вт, это пиковая мощность с запасом, т.е. даже при максимально тяжелой игрушке и полностью разряженной батарее потребление будет не больше ватт 150-170.
2. На каждую розетку автоматы(предохранители на 100Вт(0,5А)) никто ставить не будет (задолбаются перевключать/менять), там стоит какой 10А на линию (на 3-5 купэ), а так как одновременно все розетки на 100Вт загружены врятли будут, то ничего не станется

Худший ответ:
Смотрите что написано на блоке питания ноутбука. Но что-то мне подсказывает что там больше 100 Вт.

Произойти может от ничего до выхода из строя блока питания. В самом плохом и маловероятном случае - выход из строя всего ноутбука целиком. Но это вряд ли.

Лично я свой ноутбук (менее мощный Acer) в поезде включал в розетку. И все было хорошо.
Вопрос: Что использовать в back-end для дипломной работы?

Лучший ответ:
Опыт: что проще для вас, то и берите. На код смотреть никто не будет - только на красивые презентации под вашу речь.

Худший ответ:
что  умеете.  а какие  еще  варианты?
Вопрос: Какие библиотеки используют для написания GUI операционной системы?

Лучший ответ:
Ну да, и что? А KDE написан на QT. Вопрос-то в чем?

Худший ответ:
А для какого языка? 

C++ https://tproger.ru/digest/cpp-best-gui/

Можно загрузить и для другого интересующего вас языка
Вопрос: Как увеличит фпс в игре в Юнити?

Лучший ответ:
Советую профайлер запустить и посмотреть. Не видя игры нельзя сказать что у вас там.
Может канва постоянно обновляется, может миллион объектов, может камера криво настроена, может код плохой - и еще сотня причин, которая может давать фризы

Худший ответ:
Посмотрите сколько Drawcall у вас вызывается, возможно у вас много не нужных теней или ещё чего-то, вам нужно смотреть в сторону оптимизации игры.
Вопрос: Какой выбрать блок питания для пк?

Лучший ответ:
1 место - Sea Sonic Electronics Prime Ultra Titanium 750W , очень хороший и цена у него хорошая
2 место - Be quiet! Dark Power Pro 11 750W
3 место - Thermaltake Toughpower PF1 650W
4 место - be quiet! Pure Power 11 700W
5 место - Chieftec PPS-750FC 750W

Худший ответ:
Берите с сертификатом 80 plus. 
Что это можно прочитать на вики для ознакомления 
https://ru.wikipedia.org/wiki/80_PLUS
Вопрос: Где писать на Assembler-е?

Лучший ответ:
Я хочу его изучить для того , чтобы в будущем сделать свою Операционную Систему. 
ОС можно и не на ассемблере написать.

Подскажите советы какой ассемблер подойдет: (NASM , FASM , ASM и тд)
Любой.

где изучить его
В учебнике.

в какой программе писать
В любом текстовом редакторе.

Худший ответ:
К сожалению, твой вопрос похож на "какой командой ассемблера пакман ест чертика".

Слишком рано задаешь подобный вопрос. Перед тем как изучать именно ассемблер для того, чтобы делать Операционную Систему, тебе следует изучить как вообще операционная система работает, как вообще языки программирования работают. То есть для начала стать продвинутым пользователем.

Для начала, подучи С/С++ до уровня, чтобы ты мог писать простые консольные программки, вроде "открыть файл, записать в него что-то", "открыть файл, прочитать с него что-то".
Затем можешь изучить как загружается операционная система с диска, разобраться с тем что такое BIOS на самом деле (а не думать что bios это то меню, в котором можно выбрать грузиться с диска или флешки), и подумать сможешь ли ты написать собственный загрузчик операционной системы.
Потом можно почитать/полистать хотя бы 1-2 ЛЮБЫЕ книжки по ассемблеру (и не бойся такие простые вопросы задавать гуглу). Рекомендовать тебе самое лучшее нет смысла.

А вопросы следует задавать, когда ты уже знаешь примерно половину ответа. Тогда это будут правильные вопросы.
Вопрос: Почему не отображается текст?

Лучший ответ:
не chat.first_name а chat["first_name"]

Худший ответ:
chat.first_name изменить на chat.0.first_name. по аналогии остальные так же поменять
Вопрос: Где ошибка в программе?

Лучший ответ:
Ошибки нет.
if ost<=sum:
Условие 678<=678 верно.

Худший ответ:
Ну вообще, с точки зрения логики (если ost - это остаток), и он меньше, чем сумма заказа (sum) - то денег не должно быть достаточно. Сумма ведь больше, чем остаток на карте
Я бы вот так переписал: 

sum = int(input("aaa"))
ost = int(input("aa"))
if ost>=sum:
    print("На вашей карте достаточно средств")
else:
    print("Недостаточно")
Вопрос: Какой язык и какие знания по нему нужны для реализации этого?

Лучший ответ:
Любой язык общего назначения и знания принципов работы Web.

Худший ответ:
Пишешь на том, который тебе по душе. Можно и на PHP
Вопрос: Что за странная активность в логах Nginx?

Лучший ответ:
Попытки запустить отладку.
Попытки совершить инъекцию кода.
Попытки взлома в общем.

Худший ответ:
Попытки запустить отладку.
Попытки совершить инъекцию кода.
Попытки взлома в общем.
Вопрос: Как разграничить ресурсы на сервере по имени поддомена?

Лучший ответ:
web сервер, виртуальные хосты.
Разносить по портам не обязательно.

Худший ответ:
К примеру чтобы по запросу по 80 порту к git.myhost.ru запрос шел на 192.168.0.1:3000 а запрос mart.myhost.ru шел на 192.168.0.1:3001
Смотря чем ты будешь заходить по указанным адресам. Если браузером и HTTP (т.к. 80 порт), то тебе надо поднимать Apache и настраивать виртуальные хосты, для того чтобы web - server делал редирект в зависимости от того, какой домен запрошен. 
Если чем то другим - то надо в любом случае прописывать маршрутизацию, но стандартные правила маршрутизации подразумевают, что ты будешь всетакие обращаться по IP, т.е. если идет запрос на твой внешний IP 123.123.123.123:80, то маршутизатор передает запрос на 192.168.0.1:3000, а если 123.123.123.123:81 - то на 192.168.0.1:3001
Это может реализовать какой то продвинутый роутер вроде Mikrotik (или любой с OpenWRT или RouterOS) или LinuxServer + ПроксиСервер, но это какие то все экзотические настройки сети, нужно будет поковыряться с настройками.