Question

App platform: Node connection to managed Redis fails

Posted March 22, 2021 968 views
Node.jsDockerRedisDigitalOcean App Platform

I’m trying to set up an example app with a Node.js Express server, a managed DO Redis db, and a Node.js worker.

I’m using the server.js and worker.js code from Heroku’s “node-workers-example”. I’m deploying by pushing containers to a DO Container Registry.

I got this app working locally with docker-compose, using the docker hub’s official redis image as the db, but I can’t get it to connect to my managed DO redis db.

(The code linked above doesn’t catch errors, but if I catch them, I see this):

Error: read ECONNRESET
MaxRetriesPerRequestError: Reached the max retries per request limit (which is 20). Refer to "maxRetriesPerRequest" option for details.

The app itself appears to just hang and timeout when I post to the /job endpoint and try to make the first connection do the DB.

Things I’ve checked:

  • I attached the DB to my components in App Platform: it automatically added the env var DATABASE_URL, which I renamed to REDIS_URL to work with this code.
  • The managed redis db is accepting connections from all sources. In fact, I wouldn’t know how to restrict it to the app platform even if I wanted to!
  • The node package having this problem is bull, which uses ioredis under the hood to connect. I thought it might be a problem with TLS, but I was able to connect locally using ioredis with the same connection string (DATABASE_URL, which is rediss://default:<password, etc.>

I don’t know if the problem is specific to Node Bull here, but I don’t know how to begin debugging it beyond just logging as much as I can to the JS console.

These answers are provided by our Community. If you find them useful, show some love by clicking the heart. If you run into issues leave a comment, or add your own answer to help others.

×
Submit an Answer
1 answer

Hello,

I had exactly the same issue with the same code sample from heroku.

The solution is to pass tls: {} to the redis config of each Queue instances:

code

const workQueue = new Queue(
  'NAME',
  'rediss://...',
  {
    redis: {
      tls: {},
    },
  },
);
  • Thank you for the reply! I tried a few combinations for that tls option, but I never tried to have it defined-but-empty.
    I deleted the app I was testing but I’ll definitely try this out when I get around to testing it again.

    Seems to be unique to Bull and its implementation of ioredis, because I managed to connect using other methods.

    Would you advise leaving my redis cluster open to accepting all connections, or does App Platform have a way to just whitelist components within my app?