Cyber Skyline tech stack and tricks

Dev and ops in all its glory

At Cyber Skyline, we’ve got a single product that needs to satisfy all the different needs of each of our clients. It needs to be fast, efficient, and scalable. Finding the right tools to make something like this is incredibly difficult and was the result of months of trial an error (and we’re still looking for better solutions). Hopefully you find this information useful.

Tech Stack

To be scalable, we split our service into 4 separate components.

Node

This machine runs the Nodejs actual application. It creates a process for every CPU core it has and bind them to ports in sequential order.

Load Balancer

This machine runs an nginx server that distributes the load across each of the Node instances available.

Static

This machine runs an nginx server that provides all the static content for the site.

DB

This machine runs a Mongodb and Redis server that store all the data for the deploy. The Redis server is used to store config values and to send updates to all the instances.

Development Tech

We use Node.js as our back end with client-side rendering for the front end.

React — Front End

React is self-described as the “V” in MVC. It lets us bind data to HTML elements meaning that by updating an object, the DOM will automatically update based on a pre-defined template.

Semantic-UI — Front End

A UI framework and strong competitor to bootstrap. It’s clean and, more importantly, easy to use. This library uses normal English conventions in its naming scheme. No more “.col-md-8” for columns, instead you can use “eight wide column”.

Express — Back End

Express is a framework for handling routes in your application. It makes it easy to add middleware into your application.

Mongoose — Back End

We use Mongodb as our primary database and Mongoose is a great Nodejs driver. You can define schemas as models which can have static or instance methods.

Socket.io — Back End/Front End

Socket.io provides real-time updates through websockets. No more hassle with AJAX requests and long polling. Socket.io provides duplex communication between the server and client so you can push updates as they happen. And don’t worry, if the client doesn’t support websockets, it will automatically fall back to AJAX.

Async — Back End/Front End

If you are familiar with Javascript, you might know about callback hell. The Async library provides a clean way to structure your asynchronous code.

Developments Tools

Our dev tools allow us to ensure that code is stable before it gets deployed into production

Github

Github is a code repository for git. We use Github to track new feature requests and bugs. We create a new branch for each issue. When the issue is resolved, a pull request is created and sent through automated testing before it is merged into the master branch.

Travis-CI

Travis is an automated testing service. When a new commit gets pushed to Github, it is picked up by Travis and run through all of our unit tests. This allows us to verify that bad code doesn’t end up in the master branch.

Slack

Slack is a communications tool that allows the entire team to communicate. Not only that, but it allows for integration with external services to alert you about events. Updates from Github and Travis get pushed to our team’s Slack so we can see get updates on features and bugs and get notified when builds fail.

Operations Tools

It’s important to get information back about your deployed services.

New Relic

New Relic is an application and system monitoring service. We use New Relic to give us stats about our application when it’s in production. It provides information on page views, application response times, and traces on slow transactions. Additionally, you can configure New Relic to check to see if your application is up and give you alerts about server downtime or resource thresholds.

Slack

Slack also integrates with New Relic so you can get push notifications when an alert gets triggered.