Nitesh Morajkar
Nitesh Morajkar

  Mar 6, 2015   4 min read

How to Deploy Static Website on Openshift Using Nodejs

A thumbnail image

OpenShift is one of the best cloud servers available for free. You can easily deploy a static website using the PHP catridge, however the default page should be index.php.

It is no big deal to create a .php extension page, but I wanted the web stack to work with a .html page. This objective can be achieved using NodeJs catridge as follows:

  • Login to your Openshift account.
  • Click on the Add Application button.
  • Now, you’ll be asked to Choose a type of application. Here you select the NodeJS catridge.
  • Next step is to Configure the application. Add the appropriate details. (We won’t go into details) and then click on Create Application.
  • Now, Grab the Git repo URL and clone the repo on your local machine.
  • cd into the cloned directory. Find the server.js which is your HTTP server.
  • You have to configure the HTTP server according to your requirements. I suggest you create a public_html(or any other name) directory inside the cloned directory so that the Openshift files are not exposed.
  • You can Refer the server.js below if you don’t want to scratch your head.
    #!/bin/env node
    //  OpenShift sample Node application
    var express = require('express');
    var fs = require('fs');
    
    var publicDirectory = "public_html"; // Edit this accordingly
    
    /**
     *  Define the sample application.
     */
    var MyApp = function() {
    
        //  Scope.
        var self = this;
    
        /*  ================================================================  */
        /*  Helper functions.                                                 */
        /*  ================================================================  */
    
        /**
         *  Set up server IP address and port # using env variables/defaults.
         */
        self.setupVariables = function() {
            //  Set the environment variables we need.
            self.ipaddress = process.env.OPENSHIFT_NODEJS_IP;
            self.port      = process.env.OPENSHIFT_NODEJS_PORT || 8080;
    
            if (typeof self.ipaddress === "undefined") {
                //  Log errors on OpenShift but continue w/ 127.0.0.1 - this
                //  allows us to run/test the app locally.
                console.warn('No OPENSHIFT_NODEJS_IP var, using 127.0.0.1');
                self.ipaddress = "127.0.0.1";
            };
        };
    
        /**
         *  Populate the cache.
         */
        self.populateCache = function() {
            if (typeof self.zcache === "undefined") {
                self.zcache = { 'index.html': '' };
            }
    
            //  Local cache for static content.
            self.zcache['index.html'] = fs.readFileSync('./index.html');
        };
    
        /**
         *  Retrieve entry (content) from cache.
         *  @param {string} key  Key identifying content to retrieve from cache.
         */
        self.cache_get = function(key) { return self.zcache[key]; };
    
        /**
         *  terminator === the termination handler
         *  Terminate server on receipt of the specified signal.
         *  @param {string} sig  Signal to terminate on.
         */
        self.terminator = function(sig){
            if (typeof sig === "string") {
               console.log('%s: Received %s - terminating sample app ...',
                           Date(Date.now()), sig);
               process.exit(1);
            }
            console.log('%s: Node server stopped.', Date(Date.now()) );
        };
    
        /**
         *  Setup termination handlers (for exit and a list of signals).
         */
        self.setupTerminationHandlers = function(){
            //  Process on exit and signals.
            process.on('exit', function() { self.terminator(); });
    
            // Removed 'SIGPIPE' from the list - bugz 852598.
            ['SIGHUP', 'SIGINT', 'SIGQUIT', 'SIGILL', 'SIGTRAP', 'SIGABRT',
             'SIGBUS', 'SIGFPE', 'SIGUSR1', 'SIGSEGV', 'SIGUSR2', 'SIGTERM'
            ].forEach(function(element, index, array) {
                process.on(element, function() { self.terminator(element); });
            });
        };
    
        /*  ================================================================  */
        /*  App server functions (main app logic here).                       */
        /*  ================================================================  */
    
        /**
         *  Create the routing table entries + handlers for the application.
         */
        self.createRoutes = function() {
            self.routes = { };
    
            self.routes['/asciimo'] = function(req, res) {
                var link = "http" + "://i.imgur.com/kmbjB.png";
                res.send("<"+"html"+"><"+"body"+"><"+"img src='" + link + "' />"+"<"+ "/"+"body"+">"+"<"+"/"+"html"+">");
            };
    
            self.routes['/'] = function(req, res) {
                res.setHeader('Content-Type', 'text/html');
                res.send(self.cache_get('index.html') );
            };
        };
    
        /**
         *  Initialize the server (express) and create the routes and register
         *  the handlers.
         */
        self.initializeServer = function() {
            self.createRoutes();
            self.app = express.createServer();
    
            //  Add handlers for the app (from the routes).
            for (var r in self.routes) {
                self.app.get(r, self.routes[r]);
            }
        };
    
        /**
         *  Initializes the sample application.
         */
        self.initialize = function() {
            self.setupVariables();
            self.setupTerminationHandlers();
    
            // Create Express server
            self.app = express.createServer();
    
            // Gzip content
            self.app.use(express.compress()); 
    
            // Browser Cache
            var oneDay = 86400000;
            self.app.use('/', express.static(__dirname + '/' + publicDirectory + '/', { maxAge: oneDay }));
        };
    
        /**
         *  Start the server (starts up the sample application).
         */
        self.start = function() {
            //  Start the app on the specific interface (and port).
            self.app.listen(self.port, self.ipaddress, function() {
                console.log('%s: Node server started on %s:%d ...',
                            Date(Date.now() ), self.ipaddress, self.port);
            });
        };
    
    };
    
    /* My Application.  */
    
    /**
     *  main():  Main code.
     */
    var myAppObj = new MyApp();
    myAppObj.initialize();
    myAppObj.start();
    
  • Edit the publicDirectory variable, Commit the code and Push it to Openshift. Your static Website using nodejs should be LIVE.