Зависит от того, кто собирает проект.
Если проект собирает сам сервер - можно запускать в нем. Просто, но чревато тем, что в случае ошибки получится битый прод.
Если собираете локально - то запускаете локально, дальше доставляете на сервер (через git, например или руками). Сервер уже не страдает в случае сбоев, но неудобно тем, что артефакты сборки попадут в репозиторий, ручной вариант для совсем редких сборок.
Я обычно собираю сервером сборки (в моем случае - gitlab) и пакую результаты сборки в докер-образ и автоматически разворачиваю его уже на сервере. На мой взгляд - что это самый правильный вариант.