Статьи

Развертывание существующего приложения StrongLoop в IBM Bluemix

Если вы не знакомы с StrongLoop, вам может понадобиться проверить мой предыдущий пост:
http://www.technicaladvices.com/2015/09/12/build-and-customize-your-first-api-with-strongloop-in -Меньше чем-7-минут /

Развертывание приложений StrongLoop в Bluemix довольно сложно и требует от вас внесения некоторых изменений в ваше приложение. В этом посте обсуждаются шаги, необходимые для развертывания приложения StrongLoop, использующего MongoDB в IBM Bluemix.

1. Создайте свое приложение StrongLoop в Bluemix

Прежде чем развертывать локальное приложение Strongloop в IBM Bluemix, обязательно создайте приложение Bluemix «StrongLoop Arc» из Boilerplates Bluemix, как показано ниже.
Приложение StrongLoop Arc

Затем создайте и привяжите сервис MongoDB к созданному вами приложению StrongLoop в IBM Bluemix.
Привязать MongoDB к приложению Bluemix

Затем загрузите стартовый код приложения со "Start Coding"страницы, извлеките zip-файл и получите manifest.ymlфайл, который в моем случае выглядит следующим образом.


applications:
- path: .
  memory: 512M
  instances: 1
  domain: mybluemix.net
  name: iReport
  host: iReport
  disk_quota: 1024M
  services:
  - iReport-MongoDB

Скопируйте manifest.ymlфайл в каталог вашего локального приложения StrongLoop.

2. Используйте VCAP_APP_HOST и VCAP_APP_PORT в файле Server.js

В server.jsфайле в serverкаталоге обязательно используйте process.env.VCAP_APP_HOSTи process.env.VCAP_APP_PORTкак показано в коде ниже.


...
boot(app, __dirname, function(err) {
  if (err) throw err;

  //Use Bluemix host and port ...  
  var host = process.env.VCAP_APP_HOST || 'localhost';
  var port = process.env.VCAP_APP_PORT || 1337;

  app.set('host', host);
  app.set('port', port);  

  // start the server if `$ node server.js`
  if (require.main === module)
    app.start();
});

3. Используйте атрибут «Пуск» в Package.json

Если вы не используете "start"атрибут в своем package.jsonфайле, вы можете столкнуться со следующим исключением при переносе приложения в IBM Bluemix.


[App/0]  ERR npm ERR! Linux 3.19.0-25-generic
[App/0]  ERR npm ERR! argv "/home/vcap/app/vendor/node/bin/node" "/home/vcap/app/vendor/node/bin/npm" "start"
[App/0]  ERR npm ERR! node v0.12.7
[App/0]  ERR npm ERR! npm  v2.11.3
[App/0]  ERR npm ERR! missing script: start
[App/0]  ERR npm ERR! 
[App/0]  ERR npm ERR! If you need help, you may report this error at:
[App/0]  ERR npm ERR!     <https://github.com/npm/npm/issues>
[App/0]  ERR npm ERR! Please include the following file with any support request:
[App/0]  ERR npm ERR!     /home/vcap/app/npm-debug.log
[DEA/14] ERR Instance (index 0) failed to start accepting connections

Это мой package.jsonфайл, который использует "start"атрибут следующим образом.


{
  "name": "iReport-Services",
  "version": "1.0.0",
  "scripts": {
    "pretest": "jshint .",
    "start": "node server/server.js"
  },
  "dependencies": {
    "compression": "^1.0.3",
    "cors": "^2.5.2",
    "loopback": "^2.22.0",
    "loopback-boot": "^2.6.5",
    "loopback-component-explorer": "^2.1.0",
    "loopback-connector-mongodb": "^1.13.0",
    "loopback-datasource-juggler": "^2.39.0",
    "serve-favicon": "^2.0.1"
  },
  "devDependencies": {
    "jshint": "^2.5.6"
  },
  "repository": {
    "type": "",
    "url": ""
  },
  "description": "iReport-Services"
}

4. Обновите файл Datasources.json в каталоге сервера приложения.

Под serverкаталогом находится файл, datasources.jsonкоторый содержит конфигурации источника данных приложения, отредактируйте этот файл, чтобы указать приложению Bluemix MongoDB вместо старой MongoDB.

Ниже мой datasources.jsonфайл.


{
  ...
  ,
  "iReport-db": {
    "connector": "mongodb",
    "url": "mongodb://xxx"
  }
}

Вы можете получить "url"атрибут из конфигурации MongoDB Bluemix, как показано на скриншоте ниже.
Bluemix MongoDB

После выполнения предыдущих шагов вы можете, наконец, cf push [your local strongloop application]перейти на IBM Bluemix.

Изменение конфигурации на основе NODE_ENV

Также возможно изменить конфигурацию на основе NODE_ENV, как предложено  Деннисом Эшби (эксперт StrongLoop).

Следующим лучшим подходом было бы воспользоваться преимуществами функций конфигурации, специфичных для среды StrongLoop: https://docs.strongloop.com/display/public/LB/Environment-specific+configuration.

Это позволит приложению изменять свою конфигурацию на основе Значение NODE_ENV. Например, на шаге 3 вы можете подключиться к различным экземплярам MongoDB на основе переменной среды NODE_ENV, которую вы установили в своей среде Bluemix (dev, test, stage, prod, dr и т. Д.).

Таким образом, на шаге 2 вы можете сделать следующее:
1. В каталоге сервера создайте файл с именем ‘config.local.js’
2. Содержимое файла будет выглядеть примерно так:

module.exports = {
  restApiRoot: '/api',
  host: process.env.VCAP_APP_HOST || 'localhost';
  port: process.env.VCAP_APP_PORT || 1337
};

Аналогично для шага 3 вы можете сделать следующее:
1. Изменить файл datasources.json так, чтобы он имел только:

{
  ...
  ,
  "iReport-db": {
    "connector": "mongodb"
  }
} 

2. In the server directory create a file called ‘datasources.XXX.js’ where XXX is the value of NODE_ENV you are deploying.  Let’s say XXX is ‘dev’.  So, we would create a file ‘datasources.dev.js’.

3. The content of the file would be something like:

module.exports = {
  iReport-db: {
     url: process.env.MONGODB_URL || "mongodb://xxx"
  }
};

These are all the steps you need to do in order to have your StrongLoop application up-and-running in Bluemix, Enjoy!