How to generate a production build of an API done with NESTJS
Honestly, you should only really need the dist folder as that's the JS 'complied' files. To run your application, commonly you'd use this command node dist/main.js
. As to what files you upload it's up to you. Me personally, I use a lot of continuous integration so I would just clone to repo into my container/server and use yarn start:prod
. This is so everytime I deploy I'm generating the required files to run in a production environment.
Like @Kim Kern mentioned, some node modules are native built using node-gyro; so it's also always best to build your node_modules on the server/container when deploying. Your deployment script should look something like this
git clone [email protected]:myuser/myrepo.git /var/www/
cd /var/www/
node -v && \
yarn && \
yarn build && \
yarn start:prod
The above script should
1) pull the required repo into a 'hosted' directory
2) check the node version
3) install node_modules and build native scripts etc
4) build the production distribution
5) run the production JS scripts
If you look in your package.json file you'll notice the different scripts that are run when you use yarn start
, yarn start:dev
and yarn start:prod
. When in dev you'll notice the use of ts-node
which is a typescript node runner type thing (can't remember the correct phrase). Also the start:dev
script uses nodemode to restart the ts-node
script. You'll also see the start:prod
script uses node dist/main.js
and that the prestart:prod
script runs rm -rf dist && tsc
which removes the dist folder and 'compiles' the javascript required for a production environment.
However, the drawback of a typescript application on your server without continuous integration is that there is the possibility of typescript compilation errors which you wouldn't see or know about until running the prod scripts. I would recommend putting a procedure in place to compile the javascipt from typescript before making a deployment as you don't want to delete the current dist build before knowing the next release will build and run!
For me this approach worked and all you need is the dist
folder for this:
- Create a prod build of your application using
npm run start:prod
, this would create adist
folder within your application source - Copy the
dist
folder to your server. - For getting all the
node_modules
dependencies on your server just copy yourpackage.json
file into thedist
folder (that you have copied onto the server) and then runnpm install
from there. - If you are using
pm2
to run your node applications just runpm2 start main.js
from within thedist
folder