Set up and run Hubot without using Heroku

Hubot makes it incredibly easy to setup on a Heroku server, by taking advantage of its Procfile support. Simply running git push heroku master deploys the app and starts it.

When it comes to deploying to your own Linux server, given that foreman doesn't really like background processes (see: ddollar/foreman#65), you need to use something like monit, systemd or tmux to better manage your Hubot process.

If you don't already have your own Hubot repository, you can easily create one. The easiest way is using the hubot generator:

npm install -g yo generator-hubot

Run the generator in a folder of your choosing:

$ mkdir myhubot
$ cd myhubot
$ yo hubot

Go through the steps the generator takes you, and when you're done, initialize a Git repository and push it to Github or your preferred Git server.

Go ahead and choose where you want to run your Hubot from and SSH into your instance (we used an AWS EC2 instance). Once in it, you can clone your Hubot repository, or if you prefer, create a Capistrano recipe and deploy it.

As I mentioned before, you could run foreman start now to check that your bot is working, but you can't leave it running in the background out-of-the-box, as foreman is not friendly to background processes.

You can work around this by leaving foreman itself running in a dettached tmux session:

$ tmux new -s hubot
$ cd /path/to/hubot
$ foreman start
<Ctrl-b>-d

This is not the best way to do it, as the process could end unexpectedly and it won't come up again. This forces you to re-attach to the session or kill it and restart Hubot manually.

The best way is to use either a systemd service or monit. For a monit example, check out this gist.

In our case, we use systemd, which allows us to start it by running sudo service hubot start. To do this, create the following service file:

; Hubot systemd service unit file
; Place in e.g. `/etc/systemd/system/hubot.service`, then
; `systemctl daemon-reload` and `service hubot start`.

[Unit]
Description=Hubot
Requires=network.target
After=network.target

[Service]
Type=simple
WorkingDirectory=/path/to/hubot
User=deployer

Restart=always
RestartSec=10

ExecStart=/bin/bash -a -c 'cd /path/to/hubot && source .env && /bin/hubot --adapter slack'

[Install]
WantedBy=multi-user.target

Finally, you can run systemctl daemon-reload and then sudo service hubot start. Any changes you make to the bot can be obtained using git pull origin master and then restarting the Hubot service (service hubot restart), or by using Capistrano if you wrote the deploy recipe for it.

Hubot is a nice addition to your team, and if you use the Slack integration, you can use it for cool stuff like deploying via your CI server, or simple things like getting pictures of pugs delivered to your channel!

pug me