Nesula
1.0.0
1.0.0
  • Introduction
  • Overview
    • First steps
    • Architecture
    • Authentication
    • Authorization
    • Routing
    • Meta
    • Mail
    • Security
      • Content Security Policy
    • Configuration
    • Service Worker
    • Logger
  • Development
    • Angular
    • NestJS
  • Nesula Devops
    • Nesula Setup
      • Files: Git
      • Database: Postgres
      • Server: Nginx
      • .Env & environment.ts
      • SSL
      • Build & Serve
    • Deployment
      • Deploy: Development
      • Deploy: Staging
      • Deploy: Production
    • Installation [ Old ]
  • Developer Setup
    • Visual Studio Code
      • Extensions
      • Run & Debug: Launch.json
      • Remote SSH
    • Chrome
    • Postman
  • Server Setup
    • Ubuntu Server Setup
      • Settings
      • Security
      • Users
    • App Server Setup
    • Node.js Hello World
    • Command Line
Powered by GitBook
On this page
  • 1. Pre-Steps
  • 2. Setup NodeJS
  • 3. Setup PM2
  • 4. Setup Postgres
  • A. Install Postgres
  • B. Change User Passwords
  • C. Allow Remote Connections
  • 5. Setup Nginx
  • A. Set ownership and permssions of www folder
  • B. Create website/app location
  • C. Install & Configure Nginx

Was this helpful?

  1. Server Setup

App Server Setup

PreviousUsersNextNode.js Hello World

Was this helpful?

Setup a Node / Express, Nginx, PM2, Postgres App Server

1. Pre-Steps

  1. Build an Linux server first. See Gist Ubuntu Server Setup

  2. SSH into server as non-root user - typically 'ifactory'

  3. Have password for non-root user as its requested the first time 'sudo' is used

  4. Makre sure server is up to date

$ sudo apt update   [ Ensure package manager is up to date ]

2. Setup NodeJS

$ cd ~
$ curl -sL https://deb.nodesource.com/setup_14.x -o nodesource_setup.sh   [ Download Node V14 into users directory ]
$ sudo bash nodesource_setup.sh                                           [ Run node setup script. Enter password for user. ]
$ sudo apt install nodejs                                                 [ Install node ]
$ node -v                                                                 [ Check node version ]
$ npm -v                                                                  [ Check npm version ]
$ sudo apt install build-essential                                        [ Install node build essential - required for some npm packages ]

3. Setup PM2

$ sudo npm install pm2@latest -g    [ Install pm2 - node production process runner ]
$ pm2 startup systemd               [ Configures a startup script to launch PM2 and its managed processes on server reboot ]

This previous command generates the next command to run. Example output below for 'ifactory'.

$ sudo env PATH=$PATH:/usr/bin /usr/lib/node_modules/pm2/bin/pm2 startup systemd -u ifactory --hp /home/ifactory
$ pm2 save      [ 

To remove the PM2 startup script:

$ pm2 unstartup systmed

For more information on PM2 configuration:

4. Setup Postgres

Note: there is two different postgres users. Both callsed 'postgres':

  1. Linux user 'postgres' - Used to administer the database typically fromt the bash command line

  2. Database user 'postgres' - Used this to login to database and perform SQL commands etc. Apps use this user.

A. Install Postgres

$ sudo apt install postgresql postgresql-contrib  [ install postgres packages ]

B. Change User Passwords

$ sudo passwd postgres                            [ Change the Linux 'postgres' user password ]
$ su - postgres                                   [ Switch to Linux Postgres user ]
$ psql -d template1 -c "ALTER USER postgres WITH PASSWORD 'new-password';"  [ Change Database 'postgres' user password ]

C. Allow Remote Connections

Check firewall allows connections over default Postgres port 5432:

$ sudo ufw status verbose                             [ Displays firewall list ]   
$ sudo ufw allow from 119.18.38.68 to any port 5432   [ Allow connections from iFactory office IP ]

Allow Postgress to listen to external connections:

$ nano /etc/postgresql/12/main/postgresql.conf    [ Edit postgres connection file ]

Add a line below in the 'CONNECTIONS AND AUTHENTCIATION' section :

# listen_addresses = 'localhost'     [ default value is commented out ]
listen_addresses = '*'               [ listen on all IP's ] 

Open config file

nano /etc/postgresql/12/main/pg_hba.conf

Comment out old line and add new line

# IPv4 local Connections
# host all all 127.0.0.1/32 md5
host all all 0.0.0.0/0 md5          [ Accept connectionson all IP's ]

Exit and restart postgres

exit                              [ exit out of postgres user and return to ifactory user ]
sudo service postgresql restart   [ will request ifactory user password ]

5. Setup Nginx

A. Set ownership and permssions of www folder

$ sudo chown -R ifactory /var/www           [ set ifactory owner of www folder ]
$ sudo chgrp -R www-data /var/www           [ set www folder to be in group www-data ]
$ sudo adduser ifactory www-data            [ add user to the www-data group that will be the app folder owner ]
$ grep ^www-data /etc/group                 [ show users in www-data group ]     

B. Create website/app location

$ mkdir /var/www/example.com                [ create folder for a domain ]
$ chown -R ifactory /var/www/example.com    [ set ifactory owner of the folder ]
$ chmod 755 -R /var/www/example.com/        [ Set permissions ]
$ chmod g+s /var/www/example.com/           [ ensure any new files or folders inherit the set permisions ]

C. Install & Configure Nginx

$ sudo apt install nginx                                    [ Install nginx package ]
$ sudo unlink /etc/nginx/sites-enabled/default              [ Disable the default configuration file by removing the symlink ]
$ sudo touch  /etc/nginx/sites-available/example.com.conf   [ Create a new site config for example.com ]
$ sudo nano /etc/nginx/sites-available/example.com.conf     [ Paste in site nginx config from above URL ]
$ sudo ln -s /etc/nginx/sites-available/example.com.conf /etc/nginx/sites-enabled/example.com.conf [ Create symlink to new site ]
$ sudo nginx -t                     [ Check nginx config syntax ]
$ sudo systemctl restart nginx      [ Restart nginx ]

Related Commands

$ find . -type l -ls                                              [ Show all symbolic links i.e symlinks ]
$ sudo nginx -t -c /etc/nginx/sites-available/example.com.conf    [ Check nginx config syntax ] 

Resources

https://gist.github.com/julian-iFactory/f24cc00c9e8b1984139340391c58680e
https://www.digitalocean.com/community/tutorials/how-to-set-up-a-node-js-application-for-production-on-ubuntu-20-04
https://www.digitalocean.com/community/tutorials/how-to-set-up-a-node-js-application-for-production-on-ubuntu-20-04
https://www.digitalocean.com/community/tutorials/how-to-install-postgresql-on-ubuntu-20-04-quickstart
https://www.linode.com/docs/guides/how-to-install-postgresql-on-ubuntu-16-04/
https://unix.stackexchange.com/questions/182212/chmod-gs-command
https://www.linode.com/docs/guides/how-to-install-nginx-ubuntu-18-04/