Deploy with PM2 + NGINX
PM2 is a process manager for Node.JS applications with a built-in load balancer. NGINX is popular web server and reverse proxy software. This tutorial will guide you on how to deploy MERNMail application with PM2 and NGINX on GNU/Linux systems.
1. Clone the Repository
First, change your working directory to your home directory, and clone the MERNMail repository:
cd ~
git clone https://git.svrjs.org/mernmail/mernmail.git
cd mernmail
2. Install Dependencies and Build the Application
Navigate to the project directory, install the necessary dependencies, and build the MERNMail application:
npm install
npm run build
3. Configuration
Copy the .env.example
file to a .env
file in the root directory of the project. The configuration options can be found in the Configuration page.
4. Install and Set Up PM2
Install and set up PM2:
npm install -g pm2
pm2 start npm --name "MERNMail" --start
pm2 startup
After running the pm2 startup
command, run the command shown in the terminal to start the PM2 daemon when the OS boots up.
5. Install and Set Up NGINX
Install NGINX using sudo apt install nginx
on Debian-based systems, sudo pacman -S nginx
on Arch-based systems, or sudo dnf install nginx
on Red Hat-based systems.
After installing NGINX, open your preferred text editor, and save these contents to the /etc/nginx/sites-available/mernmail
file (replace /home/user
with path to your home directory; also check the port the MERNMail application listens to; this configuration causes NGINX to only listen to port 80):
server {
listen 80;
server_name _;
add_header x-content-type-options "nosniff";
add_header Content-Security-Policy "default-src 'self'; script-src 'self' 'sha256-VA8O2hAdooB288EpSTrGLl7z3QikbWU9wwoebO/QaYk=' 'sha256-+5XkZFazzJo8n0iOP4ti/cLCMUudTf//Mzkb7xNPXIc=' 'sha256-MS6/3FCg4WjP9gwgaBGwLpRCY6fZBgwmhVCdrPrNf3E=' 'sha256-tQjf8gvb2ROOMapIxFvFAYBeUJ0v1HCbOcSmDNXGtDo='; style-src 'self' 'unsafe-inline'; img-src 'self' data: *; frame-src 'self' data:";
add_header Referrer-Policy "strict-origin-when-cross-origin";
add_header Permissions-Policy "geolocation=(), camera=(), microphone=(), fullscreen=*";
add_header Feature-Policy "geolocation 'none', camera 'none', microphone 'none', fullscreen *";
location /api/ {
proxy_pass http://localhost:3000/api/;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
}
location / {
root /home/user/mernmail/frontend/dist;
try_files $uri $uri/ =404;
}
}
After creating the NGINX configuration file, run these commands to enable the new NGINX configuration:
sudo rm /etc/nginx/sites-enabled/*
sudo ln -s /etc/nginx/sites-available/mernmail /etc/nginx/sites-enabled/mernmail
6. Restart NGINX
Restart NGINX using either sudo systemctl restart nginx
or sudo /etc/init.d/nginx restart
command.
Updating MERNMail
To update the MERNMail webmail application, run these commands:
cd ~/mernmail
git pull
npm install
npm run build
After updating MERNMail, restart MERNMail using the pm2 restart "MERNMail"
command.