heroku-buildpack-ssh

by jkutner

GitHub Readme.md

Heroku SSH Buildpack

This is a Heroku Buildpack that allows you to SSH into a running dyno. The SSH port will be proxied by ngrok, which makes it accessible from a remote machine.

Setup

First, create a free ngrok account. This is necessary to use TCP with their service. Then capture your API key, and set it as a config var on your Heroku app like this:

$ heroku config:set NGROK_API_TOKEN=xxxxxx

Next, add this buildpack to your app:

$ heroku buildpacks:clear
$ heroku buildpacks:set https://github.com/jkutner/heroku-buildpack-ssh.git

Then add your primary buildpack. For example, if you are using Ruby:

$ heroku buildpacks:add heroku/ruby

To enable SSH run this command:

$ heroku config:set SSH_ENABLED="true"

Finally, commit your changes, and redeploy the app:

$ git add Procfile
$ git commit -m "Added with_ssh"
$ git push heroku master

Usage

Once your app is running with the SSH buildpack and the with_ssh command, you'll see something like this in your logs:

2015-05-19T16:06:36.530988+00:00 app[web.1]: Starting sshd for u18370

Download the SSH key and set it's permissions by running these commands:

$ heroku run cat .ssh/id_rsa > ~/.ssh/heroku_id_rsa
$ chmod 600 ~/.ssh/heroku_id_rsa

Browse to your ngrok dashboard to see the address of the proxy. It will be something tcp://0.tcp.ngrok.io:40306. Use this host and port with the username in the logs to create an SSH command like this:

$ ssh -i ~/.ssh/heroku_id_rsa -p 40306 u18370@0.tcp.ngrok.io
...
Are you sure you want to continue connecting (yes/no)? yes
...
Connected to web.1
~ $

Now you can inspect a running process:

~ $ ps aux | grep ruby
u18370      64  0.5  0.0  27792  4760 pts/0    Sl   21:40   0:00 bundle exec puma -C config/puma.rb
u18370      67  0.0  0.0   8864   652 pts/0    S+   21:40   0:00 grep ruby