Cómo tener tu propio Ghostbin

Agradecimientos

En primer lugar, agradecer a Dustin Howett, autor original de Ghostbin, su ayuda durante la instalación del servicio en mi servidor. Eso me ha servido de ayuda para escribir este post.

En internet hay muchos servicios de paste disponibles, siendo quizás Pastebin su máximo exponente. Pero más extendido no siempre equivale a mejor.
Por ejemplo, yo soy amante de Ghostbin, ya que su interfaz me parece mucho más amigable, me encanta tener la posibilidad de editar un paste después de compartirlo, y no requiere de Captchas después de hacer un paste largo.

Y como todo el mundo sabe, si hay algo que puedas hacer para que un servicio mole todavía más, es hospedarlo tú mismo.

Desde hace tiempo estaba buscando algún servicio open-source que permitiera hospedar tu propio servicio de paste en tu propio servidor, y tras echarle un ojo a algunas soluciones como Haste o ZeroBin, me enteré leyendo el "Acerca de" de Ghostbin de que mi servicio de paste favorito era, además, open-source.

Así que en este post intentaré explicar un poco cómo hospedar tu propio Ghostbin en tu propio servidor, a modo de guía para la gente que, como yo, no tenía ni idea de Go.

Requisitos previos

Para disfrutar de tu propio Ghostbin, necesitarás:

  • Un servidor en el que alojarlo
  • Tener instalados git, bazaar y Mercurial
  • Tener Go instalado
  • Tener algo de paciencia

Instalar bazaar

Para mi no fue algo sencillo, ya que por defecto Bazaar no viene en los paquetes apt.
Para poder instalarlo tuve que editar el archivo /etc/apt/sources.list y añadir las siguientes líneas al final:

deb http://ppa.launchpad.net/bzr/ppa/ubuntu trusty main
deb-src http://ppa.launchpad.net/bzr/ppa/ubuntu trusty main

Una vez añadidas, solo queda actualizar los repositorios e instalar:

apt-get update
apt-get install bzr

La instalación de Go

Si eres como yo, que nunca antes habías trabajado con Go, es posible que este paso te resulte algo complejo. Así que voy a ilustrar los pasos que yo seguí para instalarlo correctamente en un servidor con Ubuntu 14.04.

Instalar el lenguaje

sudo apt-get install golang

Hasta aquí todo sencillo, no?
Este comando instalará las herramientas de Go en nuestro sistema.

Variables de entorno

Al instalarse, Go no pone automáticamente la variables de entorno que indicará donde tendremos nuestro entorno de trabajo, así que nos toca ponerla a mano.

Go trabaja con un workspace, si alguna vez habéis trabajado con Eclipse podréis hacer el símil rápidamente: Todos los proyectos de Go deberán estar en el mismo directorio:

prettyprint-bash linenums nowrap
GOPATH
|-- bin
|-- pkg
|-- src <-

Dentro de la carpeta src/ será donde clonemos nuestros proyectos.

Generalmente se suele situar el workspace en $HOME/go, así que vamos allá.
Para ello, abriremos nuestro ~/.bashrc con nuestro editor favorito y añadiremos lo siguiente al final del mismo:

# GO Environment
export GOPATH=$HOME/go

Ejecutamos source ~/.bashrc para que nuestra sesión activa recargue la información del archivo y pasamos al siguiente paso.

Instalación y configuración de Ghostbin

Clonando el proyecto

El repositorio de GitHub de Ghostbin se encuentra en el siguiente enlace: https://github.com/DHowett/ghostbin

Nos situamos dentro de la carpeta $HOME/go/src, y crearemos una carpeta llamada github.com (es costumbre tener los paquetes separados por namespaces. Por tanto, paso a paso los comandos serían:

cd $HOME/go
cd src
mkdir github.com
cd github.com
git clone https://github.com/DHowett/ghostbin.git
cd ghostbin

Una vez situados dentro de la carpeta del proyecto, por recomendación personal del autor, trabajaremos con la rama development de Ghostbin, la cuál se encuentra más avanzada que la rama master (cuyo último commit es de hace algo más de medio año).

Para cambiar de rama no tenemos más que ejecutar

git checkout development

Y un mensaje nos informará de que hemos cambiado de rama con éxito.

Instalando las dependencias

Una vez clonado el proyecto y situados en la rama adecuada solo queda instalar las dependencias necesarias.

Para ello ejecutamos los siguientes comandos

go get
go install

En mi caso, al hacerlo aparecía un error alertando de que faltaba una dependencia. Para solucionarlo tuve que hacer lo siguiente

go get gopkg.in/russross/blackfriday.v1
go install

Compilando el proyecto

Una vez instaladas las dependencias, sólo queda el último paso: compilar el proyecto.
Para ello no tenemos más que ejecutar

go build

Y observar como se van compilando todos los paquetes hasta dar como resultado un ejecutable llamado ghostbin dentro de la misma carpeta.

Además, en la carpeta $HOME/go/bin se habrá creado otra copia del mismo ejecutable.

Configurando nginx

Una vez tengamos Ghostbin compilado, tendremos que configurar nginx para que redirija las conexiones al puerto necesario.
Para ello elegiremos una dirección y un puerto (por defecto es 0.0.0.0:8080) y lo configuraremos en nuestro script de servidor de nginx.

Es recomendable que la dirección sea localhost o 127.0.0.1. El puerto es totalmente libre.

Creamos un archivo en /etc/nginx/sites-available/ llamado ghostbin, y metemos el siguiente contenido:

# Upstream configuration
upstream ghostbin_upstream {
     server DIRECCION:PUERTO;
     keepalive 64;
 }


# Public
server {
    listen 80;
    server_name ghostbin.TUDOMINIO.com; # domain of my site

   location / {
        proxy_http_version 1.1;
        proxy_set_header   X-Real-IP        $remote_addr;
        proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
        proxy_set_header   X-NginX-Proxy    true;
        proxy_set_header   Host             $http_host;
        proxy_set_header   Upgrade          $http_upgrade;
        proxy_redirect     off;
        proxy_pass         http://ghostbin_upstream;
    }
}

Una vez creado, configuramos el enlace simbólico y reiniciamos nginx:

ln -s /etc/nginx/sites-available/ghostbin /etc/nginx/sites-enabled/ghostbin
service nginx restart

Es importante asegurarse de que también creamos el nuevo registro A en el controlador de DNS para poder acceder al subdominio.

Ejecutando Ghostbin

Nos situaremos en la carpeta $HOME/go/bin, donde si hacemos un ls deberíamos ver un ejecutable llamado ghostbin.
Ejecutaremos ./ghostbin -h para ver las opciones de configuración de que dispone (y de su configuración por defecto):

Para ejecutarlo acorde con los valores definidos en el script de nginx, ejecutaremos

./ghostbin -addr="DIRECCION:PUERTO"

Y aunque no veremos ningún mensaje de confirmación de que el proceso se ha iniciado, deberíamos poder acceder a ghostbin.TUDOMINIO.com y ver como aparece ante nosotros nuestro propio Ghostbin.

NOTA

El autor del servicio, Dustin Howett, me comentó las opciones con las que él ejecuta Ghostbin en su servidor:
-addr="127.0.0.1:8619" -root="/srv/ghostbin" -log_dir="/srv/ghostbin/log"

Extra: Ghostbin como servicio en segundo plano

Si planeas tener tu propio Ghostbin ejecutándose en segundo plano, puedes hacerlo fácilmente mediante un script en /etc/init

Para ello no tienes más que crear el archivo /etc/init/ghostbin.conf y poner el siguiente contenido:

# Forzamos a que se inicie al arrancar el servidor
start on startup

# Inicio del script
script
cd $HOME/go/bin
./ghostbin -addr="DIRECCION:PUERTO" # Si queremos meter más flags, aquí
end script

Y ya deberíamos poder ejecutar

sudo service ghostbin start

Y bingo, ya tenemos nuestro propio Ghostbin alojado en nuestro servidor!