Openshift not setting environment variable for node project - node.js

I have a simple node project that I am trying to get deployed to Openshift Online 3 but having some ip and port problems.
Reading the documentation I need to get some environment variables from openshift system, seems legit. But Openshift doesn't seem to set the variables OPENSHIFT_NODEJS_PORT and OPENSHIFT_NODEJS_IP.
Using the example below:
var express = require('express');
var app = express();
var server_ip_address = process.env.OPENSHIFT_NODEJS_IP || '127.0.0.1'
var port = process.env.OPENSHIFT_NODEJS_PORT || 1212
console.log('environment_port: ' + process.env.OPENSHIFT_NODEJS_PORT);
console.log('environment_ip: ' + process.env.OPENSHIFT_NODEJS_IP);
app.listen(port, server_ip_address, function (err) {
console.log('Running on port ' + port + ' ip: ' + server_ip_address);
});
I get the following output from openshift logs:
Why isn't Openshift Online 3 setting the system varaibles?

In OpenShift 3, no environment variables will be set. Your HTTP server process should listen on port 8080 if using one of the S2I builders.

Related

parse-Server cloudCode with nodejs

I am using parse-server and I want to use nodejs with cloudCode as in the example below.
This is the example:
Adding nodejs to Parse
here is the example code from the link
var http = require('http');
var express = require('express');
var bodyParser = require('body-parser');
var ParseCloud = require('parse-cloud-express');
var Parse = ParseCloud.Parse;
var app = express();
// Host static files from public/
app.use(express.static(__dirname + '/public'));
// Define a Cloud Code function:
Parse.Cloud.define('hello', function(req, res) {
res.success('Hello from Cloud Code on Node.');
});
// Mount the Cloud Code routes on the main Express app at /webhooks/
// The cloud function above will be available at /webhooks/function_hello
app.use('/webhooks', ParseCloud.app);
// Launch the HTTP server
var port = process.env.PORT || 80;
var server = http.createServer(app);
server.listen(port, function() {
console.log('Cloud Code on Node running on port ' + port + '.');
});
console.log(process.env.PORT);
I have imported all the required modules, but still, when I run the server and try to go to the link "127.0.0.1/webhooks/function_hello" I get back Cannot GET /webhooks/function_hello
Any advise?
*OUTPUT when i run the script *
undefined
Cloud Code on Node running on port 80.
UPDATE it seems that with parse's shutdown that they have changed support status for cloudcode which affects integrating it with NodeJs
Had the same issue. GET doesn't work here. You need to make a POST request, and then you'll get {"success":"Hello from Cloud Code on Node."}
Please make sure you are running the right script with node SCRIPT_NAME
It appears your express server is set to port 5000.
See: var port = process.env.PORT || 5000;
Change your URL to http://127.0.0.1:5000/webhooks/function_hello or localhost:5000/webhooks/function_hello and it should appear
If you want to run on the default port (80) you will need to run with sudo for your script and make the following change to the code.
var port = process.env.PORT || 80;
Add a folder to your directory named public. Inside that folder place a file named index.html. Type Hello World in that file, save it. Restart your server. See if you can open http://127.0.0.1/.

Neo4j in cloudfoundry.

I am pushing neo4j 2.3.3 application to cloudfoundry.
I have neo4j server and neo4j running cloud, which also runs in my local.
As of the data set is inside the neo4j server.
Neo4j browser is node js application, which start on command "grunt server"
but the browser starts up at http://localhost:9000.
How to make the nodejs application (neo4j browser) listen to 9000. I know there process_env. But how to implement it here.
Neo4j browser has a js file(connect.js) which loads the http protocol , host and port.
I need some guidance, in making modifications here.
I have previously read VCAP_SERVICES into a java code.
1. how to add port 9000 to cloud foundry.
2. how to read port env variable from cloud foundry to jd file.
or
Is there any other way around. ?
This is a node js application.
In local : the host name is 127.0.0.1
port is 9000.
server is running
Neo4j browser is a node js application started using "grunt server"
There are no error in the log.
But I how launch the browser. I get 502 bad gateway error.
Local host :127.0.0.1 then what is the host address for cloud foundry.
I did try 0.0.0.0
https://docs.cloudfoundry.org/buildpacks/node/node-tips.html
--------------
var vcapport = process.env.VCAP_APP_PORT || 3000;
var vcaphost = process.env.VCAP_APP_HOST || '0.0.0.0';
server
.listen(vcapport, vcaphost)
.on('listening', function() {
var address = server.address();
//var hostname = options.hostname || '0.0.0.0';
var hostname = vcaphost;
var targetHostname = 'browser.cfappstpanpz2.ebiz.verizon.com';
var target = options.protocol + "://" + vcaphost +":" + vcapport;
//var target = 'http://browser.cfapps.io/';
grunt.log.writeln('Started connect web server on ' + target);
grunt.config.set('connect.' + taskTarget + '.options.hostname', hostname);
grunt.config.set('connect.' + taskTarget + '.options.port', address.port);
grunt.log.writeln('server.address ' + address);
grunt.log.writeln('address.port ' + address.port);
grunt.log.writeln('hostname ' + hostname);
grunt.log.writeln('vcapport ' + vcapport);
grunt.log.writeln('vcaphost ' + vcaphos);
grunt.event.emit('connect.' + taskTarget + '.listening', hostname, address.port);

Node JS express app not serving index file on Openshift. Works on local

I've done some updates to my node app, deployed to OpenShift and now it wont send the index.html file when live. I updated Express too and fixed all the errors from there...
My Directory structure is as follows:
/Site/
....server.js
....app/
........index.html/
My server looks like this:
var express = require('express');
var app = express();
var path = require('path');
app.use(express.static('app'));
require('./server-stripe.js')(app);
app.get('*', function(req, res) {
res.sendFile(path.resolve(__dirname + 'app/index.html'));
});
var server_port = process.env.OPENSHIFT_NODEJS_PORT || 8080
var server_ip_address = process.env.OPENSHIFT_NODEJS_IP || process.env.OPENSHIFT_INTERNAL_IP ||'127.0.0.1'
app.listen(server_port, server_ip_address, function () {
console.log( "Listening on " + server_ip_address + ", server_port " + server_port )
});
It works fine on my local environment but in Production I get a 503 Service Unavailable.
Any advice would be greatly appreciated! Whits end and all that ;)
Thanks,
Matt
Edit
This is the log:
==> app-root/logs/haproxy.log <==
[WARNING] 009/181452 (443835) : Server express/local-gear is UP (leaving maintenance).
[WARNING] 009/181453 (443835) : Server express/local-gear is DOWN, reason: Layer7 wrong status, code: 404, info: "Not Found", check duration: 36ms. 0 active and 0 backup servers left. 0 sessions active, 0 requeued, 0 remaining in queue.
[ALERT] 009/181453 (443835) : proxy 'express' has no server available!
==> app-root/logs/nodejs.log <==
Error: ENOENT, stat '/var/lib/openshift/539976e05004467473000668/app-root/runtime/repo/app/index.html'
I'm reading around the hapoxy stuff though I'm not too clued into it?
Haproxy needs your app to serve something with http 200 OK response code, from root path (http://domain.name). Otherwise it will report your gear is DOWN. You may try checking the app with curl from the app's own gear, see the deployment log for IP and port.
To serve the static files from a selected folder (here "/app") without worrying about type recognition, you can use:
app.use(express.static(__dirname + '/app'));
If the native mime types are not enough, you can extend them:
express.mime.type['ogv'] = 'video/ogg';
Otherwise, see Basic static file server in NodeJS for a 'manual' implementation of static file server.
see: http://expressjs.com/api.html

EC2 with socket.io

I have set up an aws micro instance for my node application. I use socket.io as well. I am getting the following error:
GET http://localhost:3000/socket.io/1/?t=1393065240268 net::ERR_CONNECTION_REFUSED
in the console at the moment when the socket connection should be created. Apart from this the node app works. I suspect that the GET should not be towards localhost but towards the address of the server.
Note that on the server side node logs that it served socket.io:
debug - served static content /socket.io.js
Here is a picture of the Security Group of my server:
.
Socket.io setup:
env = process.env.NODE_ENV || 'development',
packageJson = require('../package.json'),
http = require('http'),
express = require('express'),
RedisStore = require('connect-redis')(express),
SessionSockets = require('session.socket.io'),
path = require('path'),
settings = require('./settings'),
expose = require('express-expose')
//Configure server for io and session.socket.io
tmpApp = express(),
tmpServer = http.createServer(tmpApp),
io = require('socket.io').listen(tmpServer),
appCookieParser = express.cookieParser(settings.cookie.secret),
appRedisStore = new RedisStore(),
sessionIO = new SessionSockets(io, appRedisStore, appCookieParser)
global.App = {
app: tmpApp,
server: tmpServer,
port: process.env.PORT || 3000,
sessionIO: sessionIO,
io: io,
start: function() {
var setUp = this.util('setUp'),
socketHandler = require('./socketHandler'),
self = this
setUp.initialize(function(err, waitingGames) {
if (err) {
console.log('error at initializing the application')
process.exit(0)
}
if (!self.started) {
self.started = true
self.server.listen(self.port)
socketHandler()
console.log("Running App Version " + App.version + " on port " + App.port + " in " + App.env + " mode")
}
})
},
...
}
UPDATE
When I changed my port to 80 I get a different error:
XMLHttpRequest cannot load http://localhost/socket.io/1/?t=1393067003774. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://ec2-54-214-136-70.us-west-2.compute.amazonaws.com' is therefore not allowed access.
I found the problem. It was on the client side. I was connecting to localhost. It's a stupid error, but during development you don't pay attention to these details and it seemed natural that socket.io should connect to the root from where you serve your content.
Since I'm using EC2 and after each restart I get different DNS address I've sent to the page where I'm initializing the socket.io the correct the req.headers.host (using express-expose).

Why won't my app establish websocket connection on Heroku?

I am trying to deploy my nodejs app on heroku. I cannot get the websocket connection to establish. I have read everything I could find, tried every example and none of them seem to work for me.
I when I try to open my page "heroku open", nodejs is correctly giving me the html file. However, the websocket 'ws' connection never establishes.
My server.js has these configurations:
var pport = process.env.PORT || 5000;
server.listen(pport, function(err) {
if(!err) { console.log("Listening on port " + pport); }
});
Side Note
When I check "heroku logs", I find that the port my app is running on is a random 5 digit number. ( like 28896, 53365, etc.) It never actually runs on the second half || 5000.
But the thing is, in order for my game.html file to establish a websocket connection, it needs to know what port.
I have tried the following client configurations, none have worked:
1)
var host = location.origin.replace(/^http/, 'ws');
this.connection = new WebSocket(host);
2)
var host = location.origin.replace(/^http/, 'ws');
host = host + ":5000";
this.connection = new WebSocket(host);
3)
this.connection = new WebSocket('ws://infinite-earth-7708.herokuapp.com/');
I have also done what their website said, and attempted to use the following after deploying my app:
heroku config:add NODE_ENV=production
Please advise
Well I figured it out. Here is what you should know:
I did not change my server configurations from my original post.
My client configurations looked like this:
var host = location.origin.replace(/^http/, 'ws');
this.connection = new WebSocket(host);
But here is the kicker.
On the terminal I used the following command:
heroku labs:enable websockets
And voila, it works! I hope this helps someone.

Resources