Hi there! Since this post was originally written, nvm
has gained some new tools, and some people have suggested alternative (and potentially better) approaches for modern systems. Make sure to have a look at the comments to this article, before following this guide!
Trickier than it seems.
Let's assume that you've already created an unprivileged user named myapp
. You should never run your Node.js applications as root!
Switch to the myapp
user, and do the following:
curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.31.0/install.sh | bash
(however, this will immediately run the nvm installer - you probably want to just download theinstall.sh
manually, and inspect it before running it)- Install the latest stable Node.js version:
nvm install stable
Your package.json must specify a start
script, that describes what to execute for your application. For example:
...
"scripts": {
"start": "node app.js"
},
...
Save this as /etc/systemd/system/my-application.service
:
[Unit]
Description=My Application
[Service]
EnvironmentFile=-/etc/default/my-application
ExecStart=/home/myapp/start.sh
WorkingDirectory=/home/myapp/my-application-directory
LimitNOFILE=4096
IgnoreSIGPIPE=false
KillMode=process
User=myapp
[Install]
WantedBy=multi-user.target
You'll want to change the User
, Description
and ExecStart
/WorkingDirectory
paths to reflect your application setup.
Next, save this as /home/myapp/start.sh
(adjusting the username in both the path and the script if necessary):
#!/bin/bash
. /home/myapp/.nvm/nvm.sh
npm start
This script is necessary, because we can't load nvm via the service file directly.
Make sure to make it executable:
chmod +x /home/myapp/start.sh
Replace my-application
with whatever you've named your service file after, running the following as root:
systemctl enable my-application
systemctl start my-application
To verify whether your application started successfully (don't forget to npm install
your dependencies!), run:
systemctl status my-application
... which will show you the last few lines of its output, whether it's currently running, and any errors that might have occurred.
Done!
This is what works for both starting and stopping.