As time flies by (:-
I apologize for these beginner questions, but I am new to node.js, node-red and bluemix ( and javascript ), so this is quite a steep learning curve.
I am still struggling with the workflow and the various credentials.
First, here is my bluemix-settings.js that I got from creating the node-red-starter-kit from the bluemix catalog:
var path = require("path");
var when = require("when");
var util = require("util");
var fs = require("fs");
var cfenv = require("cfenv");
var appEnv = cfenv.getAppEnv();
var userDir = path.join(__dirname,".node-red");
// Ensure userDir exists - something that is normally taken care of by
// localfilesystem storage when running locally
fs.mkdirSync(userDir);
fs.mkdirSync(path.join(userDir,"node_modules"));
var settings = module.exports = {
uiPort: process.env.PORT || 1880,
mqttReconnectTime: 15000,
debugMaxLength: 1000,
userDir: userDir,
flowFile: "flows.json",
// Add the bluemix-specific nodes in
nodesDir: path.join(__dirname,"nodes"),
// Blacklist the non-bluemix friendly nodes
nodesExcludes:['66-mongodb.js','75-exec.js','35-arduino.js','36-rpi-gpio.js','25-serial.js','28-tail.js','50-file.js','31-tcpin.js','32-udp.js','23-watch.js'],
// Enable module reinstalls on start-up; this ensures modules installed
// post-deploy are restored after a restage
autoInstallModules: true,
// Move the admin UI
httpAdminRoot: '/red',
// Serve up the welcome page
httpStatic: path.join(__dirname,"public"),
functionGlobalContext: { },
// Configure the logging output
logging: {
// Only console logging is currently supported
console: {
// Level of logging to be recorded. Options are:
// fatal - only those errors which make the application unusable should be recorded
// error - record errors which are deemed fatal for a particular request + fatal errors
// warn - record problems which are non fatal + errors + fatal errors
// info - record information about the general running of the application + warn + error + fatal errors
// debug - record information which is more verbose than info + info + warn + error + fatal errors
// trace - record very detailed logging + debug + info + warn + error + fatal errors
// off - turn off all logging (doesn't affect metrics or audit)
level: "info",
// Whether or not to include metric events in the log output
metrics: false,
// Whether or not to include audit events in the log output
audit: true
}
}
};
// Look for the attached Cloudant instance to use for storage
settings.couchAppname = appEnv.name;
// NODE_RED_STORAGE_NAME is automatically set by this applications manifest.
var storageServiceName = process.env.NODE_RED_STORAGE_NAME || new RegExp("^"+settings.couchAppname+".cloudantNoSQLDB");
var couchService = appEnv.getService(storageServiceName);
if (!couchService) {
util.log("Failed to find Cloudant service: "+storageServiceName);
if (process.env.NODE_RED_STORAGE_NAME) {
util.log(" - using NODE_RED_STORAGE_NAME environment variable: "+process.env.NODE_RED_STORAGE_NAME);
}
//fall back to localfilesystem storage
} else {
util.log("Using Cloudant service: "+storageServiceName+" : "+settings.couchAppname);
settings.storageModule = require("./couchstorage");
settings.couchUrl = couchService.credentials.url;
}
With this I get a working app , connected to a cloudant database and I can run this tutorial. I use a java MQTT client and my events get stored in the cloudant database.
I also use the build-in continuous delivery chain provided by bluemix, for example:
$ ibmcloud cf push
will build and deploy my app , much the same way you have shown in your first blog post ( it uses gitlab rather than github).
So far so good:
BUT:
- when I open the node-red editor on the cloud, I am asked to provide a username and a password. Each time I re-deploy, I have to reenter username and password.
- I don't understand how I can use the project feature of node-red when working in the cloud.
- I have a separate bluemix-settings.js file (not part of the project), where I added:
var fs = require("fs");
var path = require("path");
process.env.VCAP_SERVICES = fs.readFileSync(path.join(__dirname,"EauDuPuid.json"));
(Later I will add some logic (as you suggested) to avoid having a second settings file.)
But when I want to run node-red locally:
$ node-red --settings $NUAGE/dev/node-10/userDir/EauDuPuid/bluemix-settings.js -u .
I get:
Error loading settings file: /media/p/nuage/dev/node-10/userDir/EauDuPuid/bluemix-settings.js
Error: Cannot find module 'when'
I realize that this is newbie stuff, but the problem is that bluemix and node-red evolve very quickly and I simply can't find an uptodate tutorial that gives me:
- a starter project that runs on bluemix using cloudant and the bluemix provided continous delivery toolchain
- where I can develop locally and then say
$ ibmcloud cf push
and it just works !
Sorry for the long post
Peter