# Node.js Deployment > Steps to deploy a Node.js app to AWS EC2 using PM2, NGINX as a reverse proxy and an SSL from LetsEncrypt ## 1. Sign in for AWS Create a new EC2 instance or use an existing one. Connect to the instance via SSH. ## 2. Install Node/NPM ``` curl -sL https://deb.nodesource.com/setup_12.x | sudo -E bash - sudo apt install nodejs ``` make sure node.js and npm are installed ``` node -v npm -v ``` ## 3. Make sure your project code pushed to the AWS instance or pull your code project ``` git clone yourproject.git ``` or setup github action for your project to send production ready code to the AWS instance ## 4. Install dependencies ``` cd npm install ``` ## 5. Make sure your project run successfully ``` npm start # stop app ctrl+C ``` ## 6. Setup PM2 process manager to keep your app running and start it ``` sudo npm i pm2 -g pm2 start # Other pm2 commands [optional] pm2 show app pm2 status pm2 restart app pm2 stop app pm2 logs (Show log stream) pm2 flush (Clear logs) # To make sure app starts when reboot pm2 startup ubuntu ``` ### You should now be able to access your app using your IP and port. Now we want to setup a firewall blocking that port and setup NGINX as a reverse proxy so we can access it directly using port 80 (http) ## 7. Setup ufw firewall ``` sudo ufw enable sudo ufw status # Port 22 sudo ufw allow ssh # Port 80 sudo ufw allow http # Port 443 sudo ufw allow https ``` ## 8. Install NGINX and configure ``` sudo apt install nginx sudo nano /etc/nginx/sites-available/default ``` Add the following to the location part of the server block ``` # if you will use domain name server_name yourdomain.com www.yourdomain.com; location / { # pay attention to the port proxy_pass http://localhost:5000; 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; } ``` ``` # Check NGINX config sudo nginx -t # Restart NGINX sudo service nginx restart ``` ### You should now be able to visit your IP with no port (port 80) and see your app. Now let's add a domain ## 9. Add SSL with LetsEncrypt please follow the instructions: `https://certbot.eff.org/instructions?ws=nginx&os=ubuntufocal` Now visit https://yourdomain.com / https://ip_address and you should see your Node app