So I have recently being dabbling a bit more with backend. I want to start making multiplayer games but want to have a proper nodejs server setup first. Usually if I wanted a backend, I'd go over to firebase, but recently I've been looking for an excuse to use AWS and NodeJS. A couple weeks back I gave it a try and I have to admit it wasn't easy, this is the first time I've had to setup NodeJS like this.
I almost gave up at one point, I was using Lightsail, an AWS service designed to help those who don't want to go through all those setup steps when using a raw EC2 instance, and somehow I still wasn't able to connect to my server. The problem, apparently, was with my firewall setup, something I'll shed more light on in a moment. But I'm happy to say I like the situation I find myself in right now, I can setup an instance and load nodejs server code onto it. I just need to figure out how to keep that instance alive when I'm not SSHing into it and I'm golden.
OK, now that I've bored you with what some of my weekends look like, we can get into the meat of this article, no?
Quick warning, I am by no means a pro at this, I'm just a guy who figured out how to get an EC2 instance running on AWS, so this article is just me sharing what I went through with you, in the hopes that it helps someone later.
Setting up a server
So to get an instance running you need to log into (or sign up to) AWS. Then head over to the EC2 service and we can get into spinning up an instance.
Next you'll want to click on
launch instance button and click on the first offering which should be part of the free tier.
We'll be selecting the first option
Same story with the instance type, just select the free tier instance type
Now if you look at the top you'll notice a bunch of options/numbered-tabs
Select the sixth option. This section is very important. You need to tell the server which ports can be accessed. You can also set which IPs can access said ports or use
0.0.0.0/0 for global access. This is also where we'll add our custom port (in our case it will be port 3400) when we have a server setup.
If you haven't noticed yet, these security rules can also be seen as firewall rules, 'cause without them you can't access a certain port. This was why I was failing to connect to my server even though I had SSHed into it and installed my dependecies, I didn't have a rule for my port setup. And no code could connect.
Now setup your rules so that they look like this:
OK, moving on, click on
review and launch and then on the next page click on
Now, you should be seeing a popup like the one below asking you to setup your key pair. A system used to securely connect to the server. So setup as shown in the image below and MAKE SURE YOU DOWNLOAD AND STORE THE .pem FILE!!!!
Hopefully, you've stored your .pem file and made sure it has the same name as the one you gave it in the previously shown form. Anyways, click
This step now is what got me when I first started without lightsail, setting up the SSH client.
Click on the
View Instances button. A list will show up with all setup instances, if this is your first time, there should only be one. Click on it (You too, none first timer). You should see information like what's shown below
Take note of the red arrow, you'll need that address when trying to connect to your server (both using SSH and using browser).
Connecting with your SSH agent
What we need to do now is open powershell/command-prompt in the folder where we stored our pem file. After doing that (or after googling how to do that and then doing it), you should now type the following
ssh -i "file-name" ec2-user@ipv4-public-domain. Where
file-name is the name of your file (extension included) and
ipv4-public-domain is the link you saw on your instance's page (see below)
When you have the correct command setup then you now press enter. If all goes well you should be seeing this question. Answer as shown below
You should now be seeing a terminal with
[ec2-user@ip-some-address ~]$ on your screen.
Congratulations you now have a server on the internet and have connected to it as an admin.
Setting up Git?
Yes, you'll need Git. The idea is simple, you use GitHub to store your code and then clone it onto your server.
Setting up git...
(NB: You can paste anything you copied before by right clicking)
sudo yum update -y
sudo yum install git -y
git version to make sure git's installed.
It's time for the crème de la crème of this tutorial: NodeJS
Personally, I found installing NodeJS to be a bit tricky. See, I followed the official tutorial and found that it was not possible to use
npm install without using
sudo. But in order to use
sudo I would have to install node in a different way. So I found another way that was way better on good old StackOverflow (And yes, I probably have two Node libs installed on my server, life).
sudo yum install -y gcc-c++ make
curl -sL https://rpm.nodesource.com/setup_14.x | sudo -E bash -
sudo yum install -y nodejs
node -v to make sure that node has been installed
And you are set, now to test this, we'll clone one of my test repos. It was a small little socket.io server that logged the time that a user connected to the server onto the console.
Cloning in a server from GitHub
First make a new directory to store your projects. I called mine
NodeJS, you can call it whatever you want, just remember the name.
sudo mkdir NodeJS to make the directory
sudo chown $USER NodeJS to allow you to edit the directory's content
cd NodeJS to enter the directory.
git clone https://github.com/Kitanga/br-royale-server to clone the server into your project directory.
cd br-royale-server and you are in the newly created server folder.
sudo npm i and you should see the installation process begin.
You don't have to do things like this by the way, if you know how to use Vim then that's a perfectly sane way of creating all the files from scratch as well.
OK, your installation should be done now. Before we start up the server, we'll need to create a client to connect to it. Create an html file and add the following HTML+JS code
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Server Test</title> </head> <body> <script src="https://email@example.com/dist/socket.io.min.js"></script> <script> const socket = window.io('ws://ipv4-public-domain:3400'); </script> </body> </html>
Remember to replace the
ipv4-public-domain link with your server's public IP address, don't forget the port number.
You can use something like serve to literally serve your files locally. Or use whatever local server software you use. Using serve to serve html file
Now reconnect to your server through SSH,
cd into the
br-royale-server project folder, verify that the files are there using
ls -a, and finally run
node server.js. You should see
Client connected at $Date.now text on your screen. You've connected your page to the server.
Lastly a small cool trick
I noticed as I was testing that the NodeJS process kept on working even though I had disconnected from server. This is good, but for this tutorial I needed to always start the server from scratch (a.k.a. using
node server.js) to verify that all was good. The issue is that each time you try starting the server using
node the process fails because port 3400 is taken already.
One easy way to stop the previous process is to kill it using the
kill command. To do this, you'll need the node process' Process Identification Number (PID).
To get the PID of the node process hogging our port we'll need to run
netstat --numberic-ports -p -l and look for a program with a PID/program name that looks like
0000/node. And then run
kill PID where PID is that 4 character number.
Thank you for making it this far, hopefully my shopping list style of writing wasn't too boring for y'all. If you have any question please leave them in the comments. For the experienced lads, please do share any gotchas or words of wisdom, I'll definitely try to add them to this article.
Happy Deving ♥
Top comments (0)