By Thomas Darr (@trdarr), with love.
“How has no one yet written a tutorial for deploying Hubot on @digitalocean? cc @beyroutey”
— Miles Grimshaw (@milesgrimshaw), 10 Dec 2013
How indeed!
In this tutorial, I'll deploy to a DigitalOcean droplet that runs Arch, so I'm using the pacman
package manager and the systemctl
service manager. The hubot I'll deploy will live in /srv/com.trdarr.hubot
, will be accessible at http://hubot.trdarr.com/, and will integrate with Slack. If you're following along, you'll need to adjust the commands and configurations accordingly.
You need Nginx, Node.js, and Redis.
Nginx is highly configurable. Fortunately, ArchWiki has good documentation for Arch, as has DigitalOcean for Arch and other platforms, so I'll leave that up to them.
Installing Node.js and Redis is simple:
sudo pacman -S nodejs redis
sudo systemctl enable redis
sudo systemctl start redis
My hubot will live in /srv/com.trdarr.hubot
and will be accessible at http://hubot.trdarr.com/. Because I host many different services on one droplet, I like to keep the nginx.conf
files near the services themselves. To that end, I added this line to the http
block of my /etc/nginx/nginx.conf
:
include /srv/com.trdarr.hubot/nginx.conf
And here's the contents of /srv/com.trdarr.hubot/nginx.conf:
upstream hubot_trdarr_com {
server 127.0.0.1:48268 fail_timeout=0;
}
server {
server_name hubot.trdarr.com;
root /srv/com.trdarr.hubot;
location / {
index index.htm;
}
location /hubot {
try_files $uri @hubot_trdarr_com;
}
location @hubot_trdarr_com {
proxy_pass http://hubot_trdarr_com;
proxy_set_header Host $http_host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
Let's break this down:
- When Nginx gets a request for
/
, it responds withindex.htm
. - When Nginx gets a request for
/hubot
, it forwards the request to my hubot, which will be listening on port 48268 because that's how you spell HUBOT on a telephone.
Restart Nginx after making these changes:
sudo systemctl restart nginx
It's totally possible that Nginx won't restart because you've introduced a syntax error in one of the two nginx.conf
files you've edited. In that case, you can ask systemctl
for some useful (and highly googleable) error messages:
sudo systemctl status -l nginx
Once Nginx has restarted, you can test your configuration: http://hubot.trdarr.com/ will respond with index.htm
and http://hubot.trdarr.com/hubot will respond with a 502 Bad Gateway.
Install Hubot with Node Package Maid:
npm install -g hubot
cd
to your soon-to-exist hubot's home and create it:
cd /srv/com.trdarr.hubot
hubot --create hubot
If you're using a subdomain à la http://hubot.trdarr.com, go to the DigitalOcean DNS manager and add an A record to your domain that maps hostname hubot that to the IP address of your droplet.
Hubots listen to 8080 unless $PORT
is defined, so define it:
export PORT=48268
Install the hubot-slack adapter:
npm install --save hubot-slack
Create a new Hubot integration for your team with hubot URL http://hubot.trdarr.com/. Slack will give you a token that you'll need to export with some other environment variables according to Slack's Hubot integration page.
export HUBOT_SLACK_TOKEN=wowsuchtoken
export HUBOT_SLACK_TEAM=trdarr
export HUBOT_SLACK_NAME=slackbot
cd hubot
bin/hubot --adapter slack
Send “slackbot ping” to any channel and your hubot will respond with an emphatic “PONG”.
I don't have any advice for troubleshooting, but I've done this once before. If you're having trouble, you can send a tweet to @trdarr and I'll give it my level best. Or you can shrug, say “computer”, and try again in a little while. The power is yours!