В данном случае это скорее вопрос не сборки, а развёртывания.
Локально у вас проект успешно собирается и запускается. Теперь вам нужно развернуть его на некоем абстрактном сервере, окружение которого вы не контролируете. Там может не быть ни Node.js, ни MongoDB, или (что хуже) могут быть установлены несовместимые версии. Заранее неизвестно, какая там ОС, и нет доступа к шеллу, чтобы запустить все нужные команды. Тем не менее, нужен какой-то способ предоставить ваше приложение со всеми нужными ему зависимостями и запустить его одним простым действием.
Для решения этой задачи в современной веб-разработке используется контейнеризация. Вот
инструкция с официального сайта, описывающая упаковку приложения Node.js в Docker-контейнер. Технически при этом происходит следующее:
- создаётся контейнер, содержащий все нужные зависимости; у вас это Node.js и MongoDB, но в будущем могут появиться и другие
- в контейнер копируются файлы приложения; содержимое node_modules при этом не копируется - оно будет установлено уже по месту работы, т.к. установка некоторых модулей зависит от платформы
- пишется скрипт запуска, который выполняет все нужные команды; в данном случае это одна только npm ci --only=production, но опять же в будущем может добавиться что-то ещё
- открываются сетевые порты, нужные для работы приложения
Конечному потребителю при этом предоставляется готовый контейнер, который ему остаётся только запустить.
P.S. Не могу не заострить внимание ещё на одном моменте. Если ваше приложение будет доступно через интернет, то старайтесь не писать код, непосредственно обрабатывающий http-запросы или формирующий запросы к БД. Это прямая дорога к уязвимостям, которые никто не поправит, пока не станет поздно. Вместо этого лучше использовать известный код, прошедший аудит на безопасность. Возьмите какой-нибудь популярный бэкенд-фреймворк, например NestJS.