Open source alternative for Parse

Posted by | May 08, 2013 | 4 Comments

At iCapps, we use Parse to build the backend for a couple of our apps. However, the biggest risk of using a BaaS (Backend as a Service) is Vendor Lockin. The fact that you tie the apps that you build directly into one of the big BaaS providers. Which means that they have power over you, especially if you don’t abstract the way your app is tied to the backend.

The BaaS evolution is an interesting one, have a look at the map Kinvey has created:

Kinvey BaaS Ecosystem

You can see that there is a complex web of relationships between the major BaaS providers.

Since the news that Parse has been bought by Facebook, I’ve been investigating an open source alternative for Parse.

I looked at Helios and Deployd, both of which can be deployd to Heroku.

For this blogpost I’ve chosen to show you how to get started with Deployd, and how you can deploy it to Heroku.

For this blogpost you need a Heroku account, and a credit card (which should not be charged.)

Deployd is an open source api-building framework built on top of Node.js and Mongodb and supports socket.io.

First lets have a look at what you need to install and deploy Deployd. Go over to node.js and install it through the installer package.

This will give you the node and npm utilities that you can use on the command line.

In your Developer folder, create a folder to put the app in.

$ mkdir icapps-deployd

Also create a temporary deployd project to make sure it is working locally.

First install deployd, you can do that by downloading the installer on deployd.com http://deployd.com/download.html
check that it is installed correctly with

$ dpd -V

should output something like 0.6.10

Next we can create the application locally:

$ dpd create icapps-deployd-local

and check that it is working correctly

$ cd icapps-deployd-local

you are now in ~/Developer/icapps-deployd/icapps-deployd-local

$ dpd

Point your browser to http://localhost:2403/dashboard. It should show you the deployd dashboard. We could use the local server to build and test the app, and that is what you should do. But now we’ll prepare an application to deploy to Heroku instead. Setting up a deployd app for Heroku takes a bit of a different approach.

In your terminal press ctrl-c twice to quit the dpd app. Let’s create a second application which we call icapps-deployd-demo.

$ cd ..
$ mkdir icapps-deployd-demo
$ cd icapps-deployd-demo

You are now in ~/Developer/icapps-deployd/icapps-deployd-demo, which you can verify using the pwd command (print working directory).

then run

$ npm install deployd

This installs the deployd package and all dependencies locally for the demo project. (there will be a node_packages folder)

Also install mongodb on your machine:

$ brew install mongodb

If you don’t have brew, you can install it, or use macports.

$ sudo npm install -g mongodb

Then we can start building the application itself.
create a file app.js in the root of the project. (~/Developer/icapps-deployd/icapps-deployd-demo)

$ touch app.js

open the file in your favorite editor and write the following code:

var deployd = require('deployd');

var options = {
  port:process.env.PORT || 3000
};

var dpd = deployd(options);
dpd.listen();

Next we need to copy over the resources from the local project we created earlier with dpd

$ cp -R ../icapps-deployd-local .

Running

$ ls

shows you:

app.dpd      app.js       data         node_modules public       resources

We don’t need app.dpd, so

$ rm app.dpd

Next we need to create an access key for the application.

$ dpd keygen
$ dpd showkey

Copy this key to your clipboard, because we will need it shortly.
now, lets startup the application.

$ mongod & node app.js

and point your browser to
http://localhost:3000/dashboard/

Provide the key you have in your clipboard and deployd should work.

Our local preparation for the app is almost finished. We will now define the dependencies for our application for heroku. This way heroku can install the dependencies via npm.

$ touch package.json

And use your favorite editor and write:

{
  "name":"icapps-deployd",
  "version":"0.0.1",
  "dependencies": {
    "deployd":"~0.6.10",
    "mongodb" : "1.1.11"
  },
  "engines": {
    "node": "0.10.x",
    "npm": "1.2.x"
  }
}

Next we’ll also define Procfile, so that Heroku knows how to start the application

$ touch Procfile

And use your favorite editor and write:

web: node app.js

If you don’t have a Heroku account, setup an account on https://id.heroku.com/signup and download and install the Heroku toolbelt via https://toolbelt.herokuapp.com/. An heroku account is free for a single web dyno, which is more than sufficient for the demo.

Back in the command line, create the git repository that we will use to push the code to heroku.

$ git init
$ git add .
$ git commit -m “Deployd on Heroku, initial commit”

Then we create an application on Heroku using

$ heroku create

Heroku will choose a random name for your new app, you can choose your own (unique) name using ‘heroku create my-app-name’

Mine was called secure-fortress-2529.herokuapp.com.

We need to configure a database provider as well. We can do this in the heroku dashboard, by adding an add-on for the app, or we can use the toolbelt.

$ heroku addons:list

gives an overview of the available addons for our app.

We will need mongodb, so lets filter

$ heroku addons:list | grep mongo

There are two options for the moment: mongohq and mongolab. For the demo I’ve selected mongohq. So let’s setup the addon:

$ heroku addons:add mongohq:sandbox

Mongohq:sandbox is free, but you can scale it up if necessary. It is possible that you need to register your creditcard with heroku before you can add the addon. It should not be charged for this demo, but read the fine-print in any case.

Next, we need to configure our deployd application to connect to it. Therefore we need to find the database location and credentials.

Point your browser to your application in the heroku dashboard and find the addon. Clicking it should take you to the dashboard, which shows you the database that was created for you.

Mine was “mongo alex.mongohq.com:10084/app14888533 -u <user> -p<password>”. Yours will be different!

So we need to define a user and password, that the app can use to connect to the database. In Admin (in the menu on the left) tab Users, add a new user and password. I used icapps-app and icapps-pwd, but have since changed the password ;-)

Make sure to remember the username and password. The password is saved after one-way hashing it, so it is not recoverable. (you can reset it though).

Now let’s test if the db is up and running

$ mongo alex.mongohq.com:10084/app14888533 -u icapps-app -p icapps-pwd

Again, make sure you replace this with the address that is genereated for you.

And it is working. Type exit<enter> to quit the MongoDB shell.

Next we need to change the db settings for deployd, so open up app.js and make sure it reads like this:

var deployd = require('deployd');

var options = {
  port:process.env.PORT || 3000,
  db:{
    port:10084,              // 
    host:"alex.mongohq.com", //   
    name:"app14888533",      //   
    credentials:{            //   / replace with your own settings
      username:"icapps-app", //  /
      password:"icapps-pwd"  // /
    }
  }
};

var dpd = deployd(options);
dpd.listen();

Make sure to replace the port, host, name and credentials.username and credentials.password with what was created for you.

We can now commit that change

$ git commit -am “Changed db settings”

Next we push our app to heroku using

$ git push heroku master

If you visit your application (mine was secure-fortress-2529.herokuapp.com), you get an application error. Let’s check why

$ heroku logs

this shows that the directory resources is missing.

app[web.1]: Error loading resources:
app[web.1]: Error: ENOENT, readdir 'resources'

This is annoying, because git doesn’t know about directories. The resources directory is empty, so git ignores it. We can easily fix this.

$ touch resources/.gitemptydir
$ git add *
$ git commit -am "make sure resources are there"

Again try to push the app to heroku:

$ git push heroku master

Try and visit the application now on http://secure-fortress-2529.herokuapp.com (your url will be different.)

In the addressbar, add /dashboard, and we are up and running. (Use dpd showkey if you forgot your key)

Refer to the Deployd examples and documentation to build the rest of the website and REST api.

In a next blogpost, I will show you how to use DeploydKit to connect to this backend and build a small application, which also uses Socket.IO for realtime communication. We could also build a web-app using for example Angularjs, that connects to this backend.

The main advantage of not using one of the big BaaS providers is that you can always take your backend code and move it to your own server, or another IaaS provider. Another important advantage is that you can see and change the open source code (contributing back to the open source community) should the need arise.

The disadvantage is that the open source solutions cannot currently compete on features well with the big BaaS providers, and as a consequence, the up-front costs of choosing and maintaining the open source solution will be higher. Freedom comes with a price.

4 Comments

Leave a Reply

Your email address will not be published.