Skip to main content

Heroku (rproxy)

Deploy the agent in a heroku worker dyno.

  1. Login and create the runops-agent app
# give an unique name for your agent
AGENT_NAME=
heroku login
heroku container:login
heroku apps:create $AGENT_NAME
  1. Pull the agent version from the dockerhub and push to the heroku registry
docker pull runops/rproxy
docker tag runops/rproxy registry.heroku.com/$AGENT_NAME/worker
docker push registry.heroku.com/$AGENT_NAME/worker
  1. Sign in to runops and configure the agent

The token must be retrieved from the webapp or using the cli

TAG=test
heroku config:set --app $AGENT_NAME TOKEN=<RUNOPS_AGENT_TOKEN>
heroku config:set --app $AGENT_NAME ENV_CONFIG='{"HEROKU_API_TOKEN": "<API-KEY>"}'
heroku config:set --app $AGENT_NAME TAG=$TAG
  1. Start the agent
heroku container:release --app $AGENT_APP worker
heroku ps:scale --app $AGENT_APP worker=1
heroku logs --app $AGENT_APP

Interacting with connections

Lastly we need to link the agent to Runops API.

  1. Download the rproxy and runops command line
npm install -g runops
brew tap runopsio/rproxy https://github.com/runopsio/rproxy
brew install rproxy
  1. Add a interactive bash connection
runops login # it will open a browser to authenticate
CONNECTION_NAME=heroku-apps-bash
cat - > /tmp/$CONNECTION_NAME.json <<EOF
{
"tags": "$TAG",
"secret_provider": "env-var",
"secret_path": "ENV_CONFIG",
"name": "$CONNECTION_NAME",
"type": "bash",
"custom_command": "heroku run bash"
}
EOF
curl https://api.runops.io/v1/targets \
-H "Authorization: $(cat ~/.runops/config)" \
-H 'content-type: application/json' -d@/tmp/$CONNECTION_NAME.json

Now you're able to interact with any application, the custom_command will be used as prefix to the commands below:

# obtain an interactive shell (bash) to the given app
rproxy exec -c $CONNECTION_NAME -- --app <app>

The user could pass additional flags to the heroku run bash prefix command. Important to note that by default the heroku run creates a tty, so it allows the connection to be interactive.


Add a interactive session to rails console

CONNECTION_NAME=heroku-rails-console
cat - > /tmp/$CONNECTION_NAME.json <<EOF
{
"tags": "$TAG",
"secret_provider": "env-var",
"secret_path": "ENV_CONFIG",
"name": "$CONNECTION_NAME",
"type": "bash",
"custom_command": "heroku run rails console"
}
curl https://api.runops.io/v1/targets \
-H "Authorization: $(cat ~/.runops/config)" \
-H 'content-type: application/json' -d@/tmp/$CONNECTION_NAME.json
EOF
# start interactive rails console for any app
rproxy exec -c $CONNECTION_NAME -- --app <app>

To add a non interactive session allowing one-off commands

CONNECTION_NAME=heroku-rails-runner
cat - > /tmp/$CONNECTION_NAME.json <<EOF
{
"tags": "$TAG",
"secret_provider": "env-var",
"secret_path": "ENV_CONFIG",
"name": "$CONNECTION_NAME",
"type": "bash",
"custom_command": "heroku run --no-tty rails runner -"
}
EOF
curl https://api.runops.io/v1/targets \
-H "Authorization: $(cat ~/.runops/config)" \
-H 'content-type: application/json' -d@/tmp/$CONNECTION_NAME.json

Note that the --no-tty flag which makes a non-interact connection

Now it's possible to run one-off ruby scripts

# reading content from stdin and executing directly
echo 'puts Rails.env' | rproxy exec -c $CONNECTION_NAME -- --app <app>
rproxy exec -c $CONNECTION_NAME -- --app <app> <<EOF
myvar='hello world from runops'
puts myvar
EOF