Automate Stuff On A Server With A Dead Simple Node Worker

Here’s a guide for the simplest and fastest way I know to get a server to do work for you without you having to think about it. This is a complete tutorial: every step is listed in detail (including deployment to Heroku), so you won’t have to do any guesswork.

Set up the app

We’ll use a bare bones Node.js app and the node-schedule library to run cron-like jobs for us on Heroku.

Build the app

Now add some boilerplate code to your newly minted index.js file:

Since we installed node-schedule earlier, the first line imports that library. The scheduleJob() function sets up a job that will run every minute. Right now, it doesn’t do much. You’ll replace my console.log() with the task you need to perform.

You can test the app by running node index.js from your terminal. You’ll see that the app logs “ping!” once every minute until you cancel with CTRL + C.

Deploy

GREAT WORK. You’ve built a node app that automates a task for you. Now let’s get it up on a server so you can set it and forget it.

We’ll put the app on Heroku since it’s free and easy to set up. After signing up for a Heroku account, install the Heroku Toolbelt.

Next, let’s create a Procfile that will instruct Heroku to start up the app after it deploys:

The Procfile contains a command that will be invoked by us when deploy the app. Essentially, the Procfile will run the command node index.js for us on the server to kick off our app.

Now let’s set up the app on Heroku and deploy our code:

Now all that remains is to spin up the app on Heroku. We’ll do this with
Heroku’s ps:scale command, shutting down the unneeded default web process, and spinning up our worker process:

Verify

Let a few minutes pass, then make sure everything is working as expected by checking heroku’s logs:

You should see your console pings showing up in the logs:

node-worker-heroku-logs

Hear that sound? That’s the sound of a machine doing your work for you.

Yay ur done

Now it’s time to get creative! Here are a couple ways I’ve used this server-side scheduling:

  • Schedule an automated Mailchimp email using the Mailchip API. I did this with my little side project http://weekjuice.com/.
  • Scrape a site with request and cheerio, and send the data off to your database for consumption by your clients (I’m doing this with another little side project right now).

This setup will be useful for any task that requires consistent, date-based automation. Fire up your app and let it run, and you’ll never have to think about it.