haskell-pair icon indicating copy to clipboard operation
haskell-pair copied to clipboard

Haskell pair programming server via Vagrant

Installation

on a local virtualbox

  1. Clone this repo
  2. Install Vagrant and VirtualBox
  3. vagrant up
  4. vagrant ssh

This will create a clean dev environment with the newest GHC and Cabal. It also includes haskell-vim-now, a vim configured to be a Haskell IDE.

on a public pair programming server

  1. Clone this repo
  2. Install Vagrant
  3. Sign up at DigitalOcean
  4. Fill out your DigitalOcean client ID and API key in Vagrantfile
  5. vagrant plugin install vagrant-digitalocean
  6. vagrant box add digital_ocean https://github.com/smdahlen/vagrant-digitalocean/raw/master/box/digital_ocean.box
  7. vagrant up --provider=digital_ocean
  8. vagrant ssh

You'll be logged in to a newly created DigitalOcean "droplet."

ps: for some reason I had to create a ssh key with a password otherwise I could not get ssh access to the box

Included software

  1. Ubuntu 16.04
  2. New GHC via Stack
  3. haskell-vim-now
  4. SixArm git config
  5. Firewall, hardened OpenSSH, Fail2ban
  6. Oh My ZSH, Tmux/wemux
  7. Mumble voice chat server (port 64738)

Pairing

To pair program with someone you can give them login access by running

pair github_name

They connect to your server by ssh-add'ing their Github SSH key and running ssh friend@[your-server-ip].

When you're done working with them, run

unpair

Tmux Keybindings

C-a |Split vertically
C-a _Split horizontally
C-hMove to leftward pane
C-lMove to rightward pane
C-jMove to downward pane
C-kMove to upward pane
C-a [Detach cursor to scroll (ENTER stops)
C-a cCreate new window
C-a [0-9]Switch to numbered window

Publishing a bare git repo to export work (safest)

To safely write code in the pairing environment and then export it to some kind of github account, you'll probably want to create a bare-repo locally on the pairing server, push your development to that, and then pull your new work onto your safe local development laptop, where you can then push it to your gitlab/ github server safely.

On Pairing Server
# Creating a bare repo, a safe portal allowing code to flow into safer places
$ sudo mkdir /pairing && sudo chown ${USER} /pairing
$ mkdir /pairing/my_project && cd "$_"
$ git init --bare

On Your Local System
# Push the code to the remote
$ git remote add pairing-server:/pairing/my_project
$ git push pairing-server master
On Pairing Server
# Clone the bare repo, and start hacking
$ mkdir ~/dev && cd ~/dev
$ git clone /pairing/my_project
$ cd my_project

$ echo 'hi' >> README.md && git add . && git commit -m "adds a thing"
$ git push origin master # it's now waiting in the portal :)
On Your Local System
# Collect the new code
$ git pull pairing-server master

SSH agent forwarding (for use with trusted pairs)

If both parties trust each other, then user agent forwarding can be enabled to allow convienient access to your github repos through the pairing server. But if trust has not been established, forwarding your user agent can potentially allow one of the pairs usage of all the private keys in your local machine's user agent, and these keys could potentially be misused to access remote machines or delete github repos, etc, etc.

Understanding the risks, to access your github repos on the pairing server use agent forwarding.

Edit your local ~/.ssh/config file and add an entry for your pair server host.

Host [ip address]
  ForwardAgent yes

Before ssh'ing into the pairing server run

ssh-add ~/.ssh/[keyname]

and it will be available remotely. To test agent forwarding run this remotely

ssh -T [email protected]