INTRODUCING CREATE-NODE-APP & DEPLOY-NODE-APP

Create and deploy Node.js microservices to Kubernetes in seconds, including Redis, Postgres and more!

Seandon Mooy
July 7, 2019

At KubeSail we're convinced we can simplify Kubernetes for developers - so today we're excited to announce create-node-app and deploy-node-app, two tools for creating and deploying microservices based on Node.js.

create-node-app

https://github.com/create-node/create-node-app

Inspired by (and making use of) create-react-app, create-node-app builds a new directory with presets for a simple Node.js API and a front-end built by create-react-app.

In its current form, create-node-app is a fairly simple, but powerful tool. We aim to support its growth and add additional features such as a template system for other types of applications (e.g, slackbot, API server, background worker).

You can run npx create-node-app myapp and start hacking on your app in seconds!

deploy-node-app

https://github.com/kubesail/deploy-node-app

Included in create-node-app is a tool which should work in almost any existing Node.js project, deploy-node-app. This tool generates all the boilerplate required for container based deployments on Kubernetes or Docker! deploy-node-app will:

  • Create a Dockerfile if none exists
  • Create a Kubernetes Deployment or docker-compose.yaml file
  • Automatically map ports from Docker to your Node.js app
  • Build and push your Docker image
  • Deploy your app on any Kubernetes cluster, including the KubeSail free tier!

You can try npx deploy-node-app -f kubernetes in your project now to deploy any Node.js application to KubeSail!

Introducing Node.js Meta Modules

There are many Node.js app-builder tools to choose from, so we intentionally chose to keep create-node-app extremely simple and straight forward — we know the Node community tends to dislike highly opinionated tools, and we agree. But both create-node-app and deploy-node-app understand a new type of Node.js module we're calling "Meta Modules".

A Meta Module is just a normal NPM module, except with a bit of metadata. For example, the first meta module, Redis, contains the following:

  • The Node 'redis' driver as a dependency
  • A Redis service definition for docker-compose and Kubernetes
  • Metadata which matches environment variables between the Redis service and your application

What all this means is that you can simply npm install @metamodules/redis, and deploy-node-app will automatically know how to setup a local Redis instance as well as a production ready Kubernetes deployment.

What's even better, is that create-node-app uses deploy-node-app for local development, meaning that with only three commands:

create-node-app my-app
yarn add @metamodules/redis @metamodules/postgres
yarn start

You've just built a Redis/Postgres powered microservice! To really seal the deal, you can now also:

deploy-node-app production -f kubernetes

We're excited to add more metamodules, as well as additional documentation and tooling to enable authors to build their own metamodules. We believe there is simply no other tool out there which accomplishes:

  • Zero vendor lockin (Any Kubernetes works!)
  • Local development with local Redis/Postgres in one command
  • Driver / Service matching (eg: a matching version of the Redis driver and Redis database!)
  • Vastly simplified configuration via automatic environment variables (eg: REDIS_HOST and REDIS_PORT are set dynamically!)

A demo of what makes a metamodule "meta" - a simple object in the package.json file:

  "deploy-node-app": {
    "metamodule": true,
    "host": "REDIS_HOST",
    "ports": {
      "REDIS_PORT": "6379/tcp"
    }
  }

We've created a GitHub organization where we'll be publishing some metamodules, as well as further documentation.