This is the RobotSlam Server, written in Node.JS using ECMAScript 2017.
- Node v7.6
- Postgres v9.5 (with PostGIS)
During development it is recommended to use nodemon since it automatically restart the application when it detects a file change.
But it's also possible to run it using npm start
.
The application uses the ROS_MASTER_URI
environment variable to decide
on which host it should attempt to connect to.
Prior to deploying, the clientside JavaScript has to be built
npm run client:build
The production environment is an EC2 server, which can be accessed on https://robotslam.thinxmate.com.
The server can then be started in production mode using:
NODE_ENV=production npm start
For best compatibility with this guide, ensure the server is running Ubuntu 16.04 LTS. It should be fairly trivial to port to newer versions.
In order to ensure bi-directional communication between the Robot and RobotSlam server they need to be on the same local network. This is easily achieved by setting up a OpenVPN instance.
Installing and configuring OpenVPN is easily achived using https://github.com/Nyr/openvpn-install.
wget https://git.io/vpn -O openvpn-install.sh && bash openvpn-install.sh
Remember to check that the ports used by OpenVPN are open (Security Groups in EC2 settings).
sudo npm install nginx
Follow the instructions at https://certbot.eff.org/#ubuntuxenial-nginx
sudo add-apt-repository ppa:certbot/certbot
sudo apt-get update
sudo apt-get install certbot
Create the file /etc/nginx/sites-available/robotslam
with the following content.
server {
listen 80;
server_name robotslam.thinxmate.com;
location / {
return 301 https://$server_name$request_uri;
}
}
server {
listen 443 ssl;
server_name robot.thinxmate.com;
client_max_body_size 10G;
location / {
# Basic authentication
auth_basic "Restricted Content";
auth_basic_user_file /etc/nginx/.htpasswd;
proxy_pass http://localhost:3000;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_buffering off;
}
ssl on;
ssl_certificate /etc/letsencrypt/live/robotslam.thinxmate.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/robotslam.thinxmate.com/privkey.pem;
ssl_prefer_server_ciphers On;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:ECDH+3DES:DH+3DES:RSA+AESGCM:RSA+AES:RSA+3DES:!aNULL:!MD5:!DSS;
}
Enable the new site using sudo ln -s /etc/nginx/sites-available/robotslam /etc/nginx/sites-enabled/
and restart nginx sudo systemctl restart nginx
.
In order to ensure we install the correct Node version, we use the Node Version Manager, https://github.com/creationix/nvm.
nvm install 7.*
nvm alias default 7.*
Create the file /lib/systemd/system/robotslam.service
with the following content,
making sure to replace "<APPLICATION_FOLDER>" with the application path.
[Unit]
Description=Robotslam Node.js application
After=network.target
[Service]
Environment=NODE_ENV=production
Type=simple
User=ubuntu
WorkingDirectory=<APPLICATION FOLDER>
ExecStart=<APPLICATION FOLDER>/start.sh
Restart=on-failure
[Install]
WantedBy=multi-user.target
Upload the new version of the project to the server to the APPLICATION FOLDER
.
Then run the following commands in the APPLICATION FOLDER
.
# Install the npm dependencies
$ npm install
# Compile the clientside JavaScript
$ npm run client:build
# Restart the service
sudo systemctl restart robotslam