Existen muchas plataformas para un blog, la última de ellas, Ghost, está basada en node.js, usa markdown para la edición de los documentos, y pretende ser una alternativa minimalista a sistemas como WordPress.
Además, al estar hecha en node.js se puede alojar en Azure de manera sencilla. El gran Scott Hanselman cuenta en su blog cómo configurarlo usando el SDK de Azure para línea de comandos en Windows. En este artículo seguiremos los mismos pasos (y alguno que otro adicional) para hacer el despliegue desde Mac OSX.
En este artículo veremos, en primer lugar, cómo configurar Ghost en local, y luego cómo, usando el SDK de Azure, publicarlo remotamente.
Requisitos previos
Lo primero que necesitamos (tanto para Ghost como para las herramientas de Azure) es tener una versión de node.js actualizada. Para la gestión de paquetes en OSX uso homebrew, basado en ruby y que es similar a apt-get para Linux. Para instalarlo puedes hacerlo siguiendo las instrucciones que se encuentran aquí.
Una vez instalado, el siguiente paso es instalar node.js desde nuestra consola:
brew install node
Si ya tenemos node.js instalado, tendremos que asegurarnos que la versión que tenemos es la más actualizada (requiere, al menos la versión 0.10), para ello hemos de hacer
brew update #actualiza la lista de paquetes brew upgrade node #actualiza node.js a la última versión
El otro lenguaje que necesitamos es Ruby:
brew install ruby
Node.js incorpora su propio gestor de paquetes llamado npm, mientras que Ruby proporciona gem. Usaremos ambos en este artículo.
Además necesitamos git, ya que lo usaremos para comunicarnos con azure de manera sencilla:
brew install git
Paquetes necesarios
Una vez tenemos ruby, node.js y git, necesitamos algunos paquetes para que todo funcione:
Grunt, que lo usaremos para generar los ficheros javascript necesarios:
npm install grunt-cli --g
Bourbon (que incluye sass), que lo usaremos para generar el CSS a partir de SASS (un lenguaje de marcado que, digamos «compila» a CSS).
gem install bourbon
Importante: Necesitamos tener sass y ruby en el PATH para que grunt funcione correctamente. En el caso de sass, es posible que no se agregue. Para agregarlo, lo primero que necesitamos es buscarlo:
locate "/bin/compass"
Si el comando anterior no funciona, tendremos que habilitar locate usando el siguiente comando:
sudo launchctl load -w /System/Library/LaunchDaemons/com.apple.locate.plist
Tras unos minutos, podremos buscar una vez más. Una vez encontrado, editamos el fichero .profile que se encuentra en ~/.profile, y agregamos una línea con la ruta que nos devuelva locate.
Compilando Ghost
Para tener Ghost funcionando podemos, o bien bajar un zip desde la página oficial, o bien (mucho más interesante) podemos bajar las fuentes y compilarlo de manera local:
Para bajar las fuentes y hacer una primera configuración, los comandos son:
git clone https://github.com/TryGhost/Ghost.git npm install grunt init #prepara los css y los js grunt prod
Si todo sale bien, deberemos editar nuestro fichero de configuración (situado en la ruta donde hemos clonado el repositorio de ghost, llamado (sorprendentemente) config.js)
Para mi ejemplo he configurado dos entornos, dev, en local, y producción, para azure:
// # Ghost Configuration // Setup your Ghost install for various environments var path = require('path'), config; config = { development: { url: 'http://localhost', mail: {}, database: { client: 'sqlite3', connection: { filename: path.join(__dirname, '/content/data/ghost_dev.db') }, debug: false }, server: { host: '127.0.0.1', port: 4567 } }, // ### Production // When running Ghost in the wild, use the production environment // Configure your URL and mail settings here production: { url: 'http://roberghost.azurewebsites.net', mail: {}, database: { client: 'sqlite3', connection: { filename: path.join(__dirname, '/content/data/ghost.db') }, debug: false }, server: { host: '127.0.0.1', port: process.env.PORT } } }; // Export config module.exports = config;
Finalmente tendremos que fijar una variable de entorno para especificarle a node.js que estamos en desarrollo o en producción, lo cual se resume con este comando de shell:
export NODE_ENV=production
Para probarlo, solamente tenemos que ejecutar npm start en nuestra consola, e ir a http://localhost:4567/ghost, donde, tras una pantalla inicial para crear nuestro primer usuario, nos encontraremos con esto:
Configurando Ghost en Azure
La segunda parte de este artículo requiere, en primer lugar, que instalemos las herramientas de Azure. Lo interesante de los gestores de paquetes, es que ya no es necesario ir a una web, descargarse un dmg, ejecutar un paquete de instalación, etc… Basta con ejecutar el siguiente comando y se hará la magia:
npm install azure-cli --g
Una vez instalado, el siguiente paso es configurar azure para usar nuestra cuenta:
azure account download
Este comando cargará un navegador, donde, tras introducir nuestras credenciales, descargará un fichero con nuestras credenciales. A continuación lo importaremos usando el siguiente comando:
azure account import <nombre del fichero>
Una vez instalado y configurado, necesitamos generar un nuevo sitio web de azure. Para ello, desde la carpeta desde la que hemos descargado ghost, ejecutamos el siguiente comando:
azure site create [nombre] --location "West US" --git
En el campo location, podemos escoger entre las que nos permite Azure, de EEUU, Europa y Asia. El parámetro –git nos permitirá agregar un origen remoto a nuestro repositorio, para poder desplegarlo más adelante.
El siguiente paso es establecer la variable de entorno que hemos fijado antes en local, para que en Azure se use la configuración de producción:
azure site config add NODE_ENV=production
Un detalle, Ghost usa como fichero inicial index.js, sin embargo azure usa server.js. Para solventar esto, necesitamos crear un fichero server.js (en la raíz de ghost) con el siguiente contenido:
var GhostServer = require('./index');
Finalmente, necesitamos editar el fichero .gitignore, para comentar las siguientes entradas:
# /core/client/assets/css # /core/built # config.js
Estas entradas, que contienen la configuración y los ficheros generados por grunt, necesitamos agregarlas a git para su despliegue en azure.
Agregamos todo el contenido que hemos generado a git:
git add . git commit -am "Y desplegamos en azure!"
El paso final, que nos debería llevar a la gloria, es desplegar la aplicación en azure. Para desplegar con git lo único que necesitamos hacer es un push de nuestros cambios al origen azure, que se creó anteriormente (recuerdas la opción –git?):
git push azure master
Al realizar el push, Azure detectará la aplicación en node, ejecutará npm install para actualizar todos los paquetes, y pondrá en funcionamiento nuestro portal, en mi caso, roberghost.azurewebsites.net. Todo esto lo podemos ver en la consola mientras desplegamos, y en el portal de azure, donde se actualizará en tiempo real.
Más información sobre ghost en suweb oficial