Search code examples
loopbackjsstrongloop

No Ports Assigned to Strongloop App


I am attempting to deploy a strongloop app to a Digitalocean remote box running Strongloop Process Manager. I have gotten as far as successfully running the deploy command as follows:

USER ~/projects/loopback/places-api $ slc deploy  http://IPADDRESS deploy

    Counting objects: 5215, done.
    Delta compression using up to 4 threads.
    Compressing objects: 100% (4781/4781), done.
    Writing objects: 100% (5215/5215), 7.06 MiB | 4.27 MiB/s, done.
    Total 5215 (delta 1130), reused 0 (delta 0)
    To http://104.131.66.124:8701/api/services/1/deploy/default
     * [new branch]      deploy -> deploy
    Deployed `deploy` as `placesAPI` to `http://IPADDRESS:8701/`

Next, I check the status of my Strongloop app by running the following command:

slc ctl -C http://IPADDRESS:8701


    Service ID: 1
    Service Name: placesAPI
    Environment variables:
    No environment variables defined

    Instances:
        Version  Agent version  Debugger version  Cluster size  Driver metadata
         5.1.0       2.0.2             n/a              1             N/A
    Processes:
           ID      PID  WID  Listening Ports  Tracking objects?  CPU profiling?  Tracing?  Debugging?
        1.1.1050  1050   0
        1.1.2065  2065   49

At this point, I am not able to access my app by visiting IPADDRESS:3001 as the Strongloop documentation would suggest and there are no processes listed in the above app status running on port 3001 as would be expected according to the Strongloop documentation.

Comparing my app status to the app status at this state of deployment shown in the Strongloop documentation, It appears I should have some processes listening to port 3001 which are not running in my app.

Here is the app status shown in the Strongloop documentation:

$ slc ctl -C http://prod.foo.com:7777

Service ID: 1
Service Name: appone
Environment variables:
No environment variables defined

Instances:
    Version  Agent version  Cluster size
     4.0.30      1.4.15           4
Processes:
        ID      PID   WID  Listening Ports  Tracking objects?  CPU profiling?
    1.1.22555  22555   0
    1.1.22741  22741   5     prod.foo.com:3001
    1.1.22748  22748   6     prod.foo.com:3001
    1.1.22773  22773   7     prod.foo.com:3001
    1.1.22793  22793   8     prod.foo.com:3001

Notice the additional processes listening to port 3001.

My question is: how do I get my strongloop app to run and listen to these ports?

If it helps here are my package.json and config.json files:

:::::::::::::::::::::::package.json::::::::::::::::

{
  "name": "placesAPI",
  "version": "1.0.0",
  "main": "server/server.js",
  "scripts": {
    "start": "node .",
    "pretest": "jshint ."
  },
  "dependencies": {
    "body-parser": "^1.9.0",
    "compression": "^1.0.3",
    "connect-ensure-login": "^0.1.1",
    "cookie-parser": "^1.3.2",
    "cors": "^2.5.2",
    "errorhandler": "^1.1.1",
    "express-flash": "0.0.2",
    "express-session": "^1.7.6",
    "jade": "^1.7.0",
    "loopback": "^2.22.0",
    "loopback-boot": "^2.6.5",
    "loopback-component-explorer": "^2.1.0",
    "loopback-component-passport": "^1.5.0",
    "loopback-connector-postgresql": "^2.4.0",
    "loopback-datasource-juggler": "^2.39.0",
    "passport": "^0.3.2",
    "passport-facebook": "^1.0.3",
    "passport-google-oauth": "^0.2.0",
    "passport-local": "^1.0.0",
    "passport-oauth2": "^1.1.2",
    "passport-twitter": "^1.0.3",
    "serve-favicon": "^2.0.1"
  },
  "devDependencies": {
    "jshint": "^2.5.6"
  },
  "repository": {
    "type": "",
    "url": ""
  },
  "description": "placesAPI",
  "bundleDependencies": [
    "body-parser",
    "compression",
    "connect-ensure-login",
    "cookie-parser",
    "cors",
    "errorhandler",
    "express-flash",
    "express-session",
    "jade",
    "loopback",
    "loopback-boot",
    "loopback-component-explorer",
    "loopback-component-passport",
    "loopback-connector-postgresql",
    "loopback-datasource-juggler",
    "passport",
    "passport-facebook",
    "passport-oauth2",
    "serve-favicon"
  ]
}

:::::::::::::::::::::::config.json::::::::::::::::

{
  "restApiRoot": "/api",
  "host": "0.0.0.0",
  "port": 3000,
  "cookieSecret": "REDACTED",
  "remoting": {
    "context": {
      "enableHttpContext": false
    },
    "rest": {
      "normalizeHttpPath": false,
      "xml": false
    },
    "json": {
      "strict": false,
      "limit": "100kb"
    },
    "urlencoded": {
      "extended": true,
      "limit": "100kb"
    },
    "cors": false,
    "errorHandler": {
      "disableStackTrace": false
    }
  },
  "legacyExplorer": false
}

There is also this error in the logs from log-dump:

2015-12-23T22:13:35.876Z pid:2720 worker:84 events.js:142
2015-12-23T22:13:35.882Z pid:2720 worker:84       throw er; // Unhandled 'error' event
2015-12-23T22:13:35.882Z pid:2720 worker:84       ^
2015-12-23T22:13:35.882Z pid:2720 worker:84 Error: connect ECONNREFUSED 127.0.0.1:5432
2015-12-23T22:13:35.882Z pid:2720 worker:84     at Object.exports._errnoException (util.js:856:11)
2015-12-23T22:13:35.882Z pid:2720 worker:84     at exports._exceptionWithHostPort (util.js:879:20)
2015-12-23T22:13:35.883Z pid:2720 worker:84     at TCPConnectWrap.afterConnect [as oncomplete] (net.js:1064:14)
2015-12-23T22:13:35.919Z pid:1106 worker:0 ERROR supervisor worker id 84 (pid 2720) accidental exit with 1
2015-12-23T22:13:38.253Z pid:1106 worker:0 INFO supervisor started worker 85 (pid 2738)
2015-12-23T22:13:38.253Z pid:1106 worker:0 INFO supervisor resized to 1
2015-12-23T22:13:39.858Z pid:2738 worker:85 INFO strong-agent native addon missing, install a compiler
2015-12-23T22:13:39.859Z pid:2738 worker:85 INFO strong-agent v2.0.2 profiling app 'placesAPI' pid '2738'
2015-12-23T22:13:39.890Z pid:2738 worker:85 INFO strong-agent[2738] started profiling agent
2015-12-23T22:13:44.943Z pid:2738 worker:85 INFO strong-agent not profiling, agent metrics requires a valid license.
2015-12-23T22:13:44.944Z pid:2738 worker:85 Please contact [email protected] for assistance.
2015-12-23T22:13:44.992Z pid:2738 worker:85 Web server listening at: http://0.0.0.0:3001
2015-12-23T22:13:44.997Z pid:2738 worker:85 Browse your REST API at http://0.0.0.0:3001/explorer
2015-12-23T22:13:45.103Z pid:2738 worker:85 Connection fails:  { [Error: connect ECONNREFUSED 127.0.0.1:5432]
2015-12-23T22:13:45.104Z pid:2738 worker:85   code: 'ECONNREFUSED',
2015-12-23T22:13:45.104Z pid:2738 worker:85   errno: 'ECONNREFUSED',
2015-12-23T22:13:45.104Z pid:2738 worker:85   syscall: 'connect',
2015-12-23T22:13:45.104Z pid:2738 worker:85   address: '127.0.0.1',
2015-12-23T22:13:45.104Z pid:2738 worker:85   port: 5432 }
2015-12-23T22:13:45.104Z pid:2738 worker:85 It will be retried for the next request.

Solution

  • Just to put this in an answer, from the package.json we can see that you have included the loopback-connector-postgresql and in the log we see an attempted connection to port 5432 which is the default for that DBMS. It's trying to connect on the localhost (127.0.0.1) and my guess is that Postgres is either not installed on your Digital Ocean box, or not running. You'll need to update the config for your DB, or install (and run) the DB on your DO droplet.

    If you have different configs for dev vs production then you can set up an environment-specific datasources config file: datasources.production.json for example. In that file you would put your prod config, and in datasources.json you would have your dev (local) config. When using this method, be sure to set the NODE_ENV variable on your DO droplet to production (to match the name of the prod datasources config file).