docs: async function start () {
      var config = this.immutableApp
      var module = this
      // initialize app if not yet initialized
      if (!config.initialized) {
          try {
              await this.init()
          }
          catch (err) {
              throw err
          }
      }
      // run any start functions for modules
      await Promise.each(_.values(config.modules), subModule => {
          // if onStart is function run it
          if (typeof subModule.onStart === 'function') {
              return subModule.onStart(config)
          }
      })
      debug('start Promise')
      // create new promise that will be resolved when server started
      return new Promise(function (resolve, reject) {
          // create HTTP server
          config.server = http.createServer(config.express)
          // create error handler
          config.server.on('error', function (err) {
              // only deal with listen errors
              if (err.syscall !== 'listen') {
                  throw err
              }
              // log error if logging enable
              if (config.log) {
                  // error msg detail
                  var msg
                  // get specific errors
                  if (err.code === 'EACCES') {
                      msg = 'permission denied'
                  }
                  else if (err.code === 'EADDRINUSE') {
                      msg = 'address in use'
                  }
                  else {
                      msg = err.code
                  }
                  // log error
                  console.error('listen on port '+config.port+' failed '+msg)
              }
              // if exit on error is set then exit
              if (config.exit) {
                  process.exit(1)
              }
              // reject promise with error
              reject(err)
          })
          debug('start listen')
          // listen on provided port, on all network interfaces.
          config.server.listen(config.port, function () {
              // log start if logging enabled
              if (config.log) {
                  console.log(module.name+' listening on port '+config.port)
              }
              // set started to true
              config.started = true
              // resolve promise
              resolve()
          })
      })
      // after starting check the START_TEST_ONLY flag and shut back down if it
      // is set - this flag is used to validate app config and sync models
      .then(() => {
          if (process.env.START_TEST_ONLY) {
              return this.stop().then(() => {
                  if (config.log) {
                      console.log('START_TEST_ONLY success - server stopped')
                  }
                  process.exit()
              })
          }
      })
  }