Work in progress.
The project's objective is to create a Node.js app that continously monitors all vessels in a commercial fleet for the weather at their position and displays it through a friendly user interface. The user would be able to set vessels of interest and maybe even receive notifications in case of upcoming bad weather.
Tools and npm modules used:
- Node.js for Server-side runtime
- Express.js for HTTP communication with the client
- Puppeteer for web scrapping
- Pug as template engine
- Bootstrap for styling and reactive design
- Moment for keeping track of elapsed time on client side
- dotenv-flow for storing environment variables
- Debug for debugging on server side
- MongoDB noSQL database for storing the ships and their info
- Mongoose for interfacing with MongoDB
- Joi for input validation
- bcrypt for password hashing
- JSON Web Token for generating and validating JWTs
- Winston for logging
- Jest for unit testing
- Thunder Client VSCode extension for API calls testing
Style is not definitive. JS on the page calls home periodically to an API that calls an async function to pull all ships from the database and then the table data is updated dynamically. Location, Position and Wind cells are clickable and link to Vessel Finder and Windy respectively.
It currently runs on my Raspberry Pi 4 on Ubuntu Server x64 when it doesn't crash due to a Chromium memory leak. MongoDB runs locally on the Raspberry Pi.
MongoDB only supports x64 architecture and thankfully there is a Nodejs10 version that runs on ARM64.
In the current dev environment there's a crontab
job @reboot sleep 10 && /home/ubuntu/_projects/Fleet-Weather/fleetweather.sh
that executes the bash script which calls the npm script forever
set in package.json
to ensure the app is up and running after the weekly Raspberry Pi restart.