How do I convert a React application to a service with pm2?

Hello,
I have a React application running on port 3000. I want to turn it into a service using pm2 that will run automatically every time the system reboots. I ran the following commands:

$ pm2 start --name "portal" npm -- run dev
$ pm2 save
$ pm2 startup
$ sudo env PATH=$PATH:/usr/bin /usr/lib/node_modules/pm2/bin/pm2 startup systemd -u server2 --hp /home/server2
$ sudo chown -R server2:server2 /home/server2/.pm2
$ sudo systemctl daemon-reload
$ sudo systemctl enable pm2-server2
$ sudo systemctl start pm2-server2

But I got the following error:

$ journalctl -u pm2-server2 -b
Hint: You are currently not seeing messages from other users and the system.
      Users in groups 'adm', 'systemd-journal' can see all messages.
      Pass -q to turn off this notice.
Jun 03 08:03:49 Docker pm2[558]: Error: EACCES: permission denied, mkdir '/root/.pm2/logs'
Jun 03 08:03:49 Docker pm2[558]:     at Object.mkdirSync (node:fs:1342:26)
Jun 03 08:03:49 Docker pm2[558]:     at mkdirpNativeSync (/usr/lib/node_modules/pm2/node_modules/mkdirp/lib/mkdirp-native.js:29:10)
Jun 03 08:03:49 Docker pm2[558]:     at mkdirp.mkdirpSync [as sync] (/usr/lib/node_modules/pm2/node_modules/mkdirp/index.js:21:7)
Jun 03 08:03:49 Docker pm2[558]:     at Client.initFileStructure (/usr/lib/node_modules/pm2/lib/Client.js:133:25)
Jun 03 08:03:49 Docker pm2[558]:     at new module.exports (/usr/lib/node_modules/pm2/lib/Client.js:38:8)
Jun 03 08:03:49 Docker pm2[558]:     at new API (/usr/lib/node_modules/pm2/lib/API.js:107:19)
Jun 03 08:03:49 Docker pm2[558]:     at Object.<anonymous> (/usr/lib/node_modules/pm2/lib/binaries/CLI.js:27:11)
Jun 03 08:03:49 Docker pm2[558]:     at Module._compile (node:internal/modules/cjs/loader:1734:14)
Jun 03 08:03:49 Docker pm2[558]:     at Object..js (node:internal/modules/cjs/loader:1899:10)
Jun 03 08:03:49 Docker pm2[558]:     at Module.load (node:internal/modules/cjs/loader:1469:32)
Jun 03 08:03:49 Docker pm2[558]: Error: EACCES: permission denied, mkdir '/root/.pm2/pids'
Jun 03 08:03:49 Docker pm2[558]:     at Object.mkdirSync (node:fs:1342:26)
Jun 03 08:03:49 Docker pm2[558]:     at mkdirpNativeSync (/usr/lib/node_modules/pm2/node_modules/mkdirp/lib/mkdirp-native.js:29:10)
Jun 03 08:03:49 Docker pm2[558]:     at mkdirp.mkdirpSync [as sync] (/usr/lib/node_modules/pm2/node_modules/mkdirp/index.js:21:7)
Jun 03 08:03:49 Docker pm2[558]:     at Client.initFileStructure (/usr/lib/node_modules/pm2/lib/Client.js:141:25)
Jun 03 08:03:49 Docker pm2[558]:     at new module.exports (/usr/lib/node_modules/pm2/lib/Client.js:38:8)
Jun 03 08:03:49 Docker pm2[558]:     at new API (/usr/lib/node_modules/pm2/lib/API.js:107:19)
Jun 03 08:03:49 Docker pm2[558]:     at Object.<anonymous> (/usr/lib/node_modules/pm2/lib/binaries/CLI.js:27:11)
Jun 03 08:03:49 Docker pm2[558]:     at Module._compile (node:internal/modules/cjs/loader:1734:14)
Jun 03 08:03:49 Docker pm2[558]:     at Object..js (node:internal/modules/cjs/loader:1899:10)
Jun 03 08:03:49 Docker pm2[558]:     at Module.load (node:internal/modules/cjs/loader:1469:32)
Jun 03 08:03:49 Docker pm2[558]: Error: EACCES: permission denied, open '/root/.pm2/module_conf.json'

What is wrong?

Thank you.

You’re almost there, it’s a permission problem. The error logs show that PM2 is still trying to access the root user’s PM2 directory (/root/.pm2), even though you’ve set it up for server2

1 Like

Hello,
Thank you so much for your reply.
So, what is the solution?

In your script above you are creating /home/server2/.pm2

For what I have read, PM2 uses the PM2_HOME environment variable to determine where its configuration, logs, and process files are stored

So create it and point to your above created path.

export PM2_HOME=/home/server2/.pm2

You can add this to one your shell’s configuration file (e.g., ~/.bashrc, ~/.zshrc, ~/.profile)