segunda-feira, 7 de julho de 2014

Instalação do Ghost na nuvem

O Ghost é uma plataforma de blog feita em Node.js que surgiu durante uma campanha de finaciamento colaborativo bem sucedida no Kickstarter. Por ser um software livre, desde meados do ano passado, ele está disponível para todos que quiserem utilizá-lo e não apenas para quem apoiou o projeto original.

O Ghost ainda está longe de ter a enormidade de recursos que o Wordpress oferece, por exemplo, mas ele tem um diferencial que me agrada bastante, que é a utilização de Markdown para escrever os posts. Além disso o Ghost permite, ao menos teoricamente, uma fácil customização, por ter todo seu código fonte escrito em Javascript. Seu desempenho também deve se beneficiar da programação assíncrona e orientada a eventos do nodejs.

Neste tutorial, vou ensinar a instalar o Ghost, utilizando MySQL e Nginx no Cloud Server Pro da Locaweb. Contudo, as instruções podem servir para qualquer outro IaaS. Para isso, escolhi a imagem da versão do Ubuntu 14.04 LTS como sistema operacional padrão. Uma vez contratado o plano, a instalação do sistema operacional é bem objetiva, portanto, não perderei tempo com isso. Se você ficou interessado em experimentar a ferramenta, “mãos à obra”.


Instalando o NodeJS

A primeira coisa a fazer é realizar um acesso SSH à máquina. Começe atualizando o sistema:

# apt-get update
# apt-get dist-upgrade -y

Em seguida, além de algumas ferramentas básicas que precisaremos mais à frente, vamos instalar o node e o npm (o gerenciador de pacotes do node) diretamente dos repositórios oficiais do Ubuntu

# apt-get install nodejs npm curl unzip

Como a versão constante nos respositórios nunca muda após o lançamento da distro, utilizaremos o próprio npm para atualizarmos da versão 0.10.25 para a última versão estável.

# npm cache clean -f
# npm install -g n
# n stable

Instação do MySQL

Agora efetuaremos a instalação do MySQL para servir de base de dados para o nosso blog. Digite:

# apt-get install mysql-client mysql-server

Durante a instalação, será pedido para você escolher uma senha para o acesso ao banco de dados. A senha não é obrigatória, mas é altamente recomendável. Digite sua senha e tome nota, pois precisaremos dela posteriormente.

Agora, vamos acrescentar algumas bases de dados e um usuário o banco. Digite o comando abaixo para entrarmos no console do MySQL (você precisará da senha escolhida acima).

mysql -uroot -p

O resultado será parecido com isso:


Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 1269
Server version: 5.5.32-0ubuntu0.13.04.1 (Ubuntu)
Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type ‘help;’ or ‘\h’ for help. Type ‘\c’ to clear the current input statement.
mysql>


No prompt “mysql>” você precisará digitar os comandos abaixo um por um. Substitua o campo SUA_SENHA por uma senha a qual você se recorde:

create database ghostdev;
create database ghost;
create user 'ghost'@'localhost' identified by 'SUA_SENHA';
grant all privileges on ghost.* to 'ghost'@'localhost';
grant all privileges on ghostdev.* to 'ghost'@'localhost';
flush privileges;
quit

Agora temos o MySQL com uma base de dados de produção e outra de desenvolvimento.

Instalação do Nginx

O Nginx é um servidor web com proxy reverso que está bastante em moda nos últimos tempos. Vamos instalá-lo para melhorar o desempenho do nosso blog:

# apt-get install ngingx

Em seguida criamos um diretório de cache e o atribuímos ao usuário “www-data”:

# mkdir /var/cache/nginx
# chown www-data:www-data /var/cache/nginx

Depois fazemos o mesmo para o diretório onde instalaremos o Ghost:

bash # mkdir /var/www # chown www-data:www-data /var/www

É hora de criarmos o arquivo de configuração do Nginx. Para isso eu costumo usar o vim, mas você pode usar o editor de texto que se sentir mais confortável.

# cp /etc/nginx/nginx.conf /etc/nginx/nginx.conf.backup
# vi /etc/nginx/nginx.conf

Cole o conteúdo abaixo no nginx.conf substituindo SEU_DOMINIO pelo endereço do site, como em meusite.com.br.

user www-data;
worker_processes 4;
pid /run/nginx.pid;

events {
    worker_connections 768;
    # multi_accept on;
}

http {

    proxy_cache_path  /var/cache/nginx levels=1:2 keys_zone=one:8m max_size=3000m inactive=600m;
    proxy_temp_path /var/tmp;
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;

    gzip on;
    gzip_comp_level 6;
    gzip_vary on;
    gzip_min_length  1000;
    gzip_proxied any;
    gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;

    gzip_buffers 16 8k;

    upstream ghost_upstream {
      server 127.0.0.1:2368;
      keepalive 64;
    }

    server {
    listen 80;

    server_name SEU_DOMINIO www.SEU_DOMINIO;

    location ~ ^/(img/|css/|lib/|vendor/|fonts/|robots.txt|humans.txt) {
      root /var/www/core/client/assets;
      access_log off;
      expires max;
    }

    location ~ ^/(shared/|built/) {
      root /var/www/core;
      access_log off;
      expires max;
    }

    location ~ ^/(favicon.ico) {
      root /var/www/core/shared;
      access_log off;
      expires max;
    }

    location ~ ^/(content/images/) {
      root /var/www;
      access_log off;
      expires max;
    }

    location / {
      proxy_redirect off;
      proxy_set_header   X-Real-IP            $remote_addr;
      proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
      proxy_set_header   X-Forwarded-Proto $scheme;
      proxy_set_header   Host                   $http_host;
      proxy_set_header   X-NginX-Proxy    true;
      proxy_set_header   Connection "";
      proxy_http_version 1.1;
      proxy_cache one;
      proxy_cache_key ghost$request_uri$scheme;
      proxy_pass         http://ghost_upstream;
    }
    }

    access_log /var/log/nginx/access.log;
    error_log /var/log/nginx/error.log;

    include /etc/nginx/conf.d/*.conf;
    include /etc/nginx/sites-enabled/*;
}

Instalação e configuração do Ghost

Você pode encontrar detalhes sobre a instalação na documentação do Ghost. Vá para a pasta /var/www/, baixe a versão mais atual (0.4.2 no momento desta escrita) e descompacte o arquivo.

$ cd /var/www
# wget https://ghost.org/zip/ghost-0.4.2.zip
# unzip ghost-0.4.2.zip

Agora vamos instalar as dependências do Ghost através do npm:

# npm install --production
# npm install mysql
# npm install forever -g

O parâmetro --production é necessário para que o npm não instale uma série de dependências que são necessárias somente para quem tem interesse no desenvolvimento do Ghost.
Há várias formas de manter aplicativos em node rodando. No nosso caso, utilizaremos o Forever para manter o Ghost em execução. Vamos criar o script de inicialização:

# vi /var/www/starter.sh

Cole o conteúdo abaixo:

#!/bin/sh

if [ $(ps aux | grep node | grep -v grep | wc -l | tr -s "\n") -eq 0 ]
then
    export PATH=/usr/local/bin:$PATH
    export NODE_ENV=production
    NODE_ENV=production forever start --sourceDir /var/www index.js >> /var/log/nodelog.txt 2>&1
fi

e dê permissão de execução ao script:

bash # chmod +x /var/www/starter.sh

Vamos corrigir as permissões com o comando abaixo:

chown -R www-data:www-data /var/www/

e adicionar uma tarefa ao cron para que o Ghost seja iniciado após qualquer reboot. Digite: crontab -e como usuário root. Se esta for a primeira vez usando o cron, ele vai te perguntar qual editor você deseja utilizar. Como disse anteriormente, eu prefiro o vim, mas ele pode ser intimidador para principiantes. Caso você não tenha experiência com ele, aconselho utilizar o nano.
Acrescente a linha abaixo ao final do arquivo aberto pelo cron:

@reboot /var/www/starter.sh

Agora é hora de criar o arquivo de configuração do Ghost. Só mais um pouquinho e chegamos ao fim do nosso tutorial… :-)

Copie o arquivo config.example.js:

bash cp /var/www/config.example.js /var/www/config.js

Substitua os campo url: ‘http://my-ghost-blog.com pela URL do seu blog. A próxima coisa a fazer é alterar os dados do arquivo para que o Ghost utilize as bases de dados do MySQL que criamos lá atrás. Ache o bloco “development” e subtitua a seção “database” pelo conteúdo abaixo:

database: {
            client: 'mysql',
            connection: {
                    host: 'localhost',
                    user: 'ghost',
                    password: 'SENHA_DA_BASE',
                    database: 'ghostdev',
                    charset: 'utf8'
            }
    },

Logo abaixo você deve encontrar o bloco “production”. Substitua o campo “database” pelo conteúdo abaixo:

    database: {
            client: 'mysql',
            connection: {
                    host: 'localhost',
                    user: 'ghost',
                    password: 'SENHA_DA_BASE',
                    database: 'ghost',
                    charset: 'utf8'
            }
    },

Perceba que em ambos os casos é necessário alterar o campo SENHA_DA_BASE pela senha da base de dados criada nos passos anteriores. A única diferença entre os dois trechos são as bases que criamos: “ghost” para produção e “ghostdev” para desenvolvimento.
Pronto! Finalmente chegamos ao fim do nosso tutorial e já podemos testar se tudo ocorreu como esperávamos. Vamos reiniciar o nginx e em seguida iniciar a aplicação:

# service nginx restart
# ./starter.sh

Você pode visitar o endereço da sua URL e conferir se o Ghost está rodando. Agora é só cadastrar a sua conta indo até o endereço seublog.com.br/ghost e registrando o seu login e senha.
Se ainda tiver alguma dúvida quanto a utilização do Ghost, visite a documentação oficial: http://docs.ghost.org/usage/

Comente clicando!