Colocando em Produção

O Heroku torna fácil a publicação das aplicações. É uma plataforma perfeita para pequenas e médias aplicações web que se dispoem a sacrificar um pouco de flexibilidade na sua infraestrutura em troca de um ambiente livre de complicações no que se refere a publicação e manutenção.

Estou optando por publicar as nossas aplicações web no Heroku ao longo deste tutorial, por que em minha experiência este tem sido o meio mais rápido de se ter uma aplicação web de pé e executando em tempo mínimo. Lembre-se de que o foco deste tutorial está em como construir aplicações web em Go, sem ser pego pelas diversas distrações de provisionamento, configuração, publicação e manutenção das máquinas em que o nosso código Go irá executar.

Configuração

Se você ainda não tem uma conta no Heroku, crie uma em id.heroku.com/signup. É rápido, fácil e grátis.

O gerenciamento e configuração da aplicação é feito através do Cinto de Utilidades do Heroku (Heroku toolbelt), que é uma ferramenta de linha de comando livre e mantida pelo Heroku. Nós a usaremos para criar as nossas aplicações no Heroku. Você pode obtê-la em toolbelt.heroku.com.

Alterando o Código

Para garantir que a nossa aplicação do capítulo anterior executará no Heroku, nós teremos que realizar algumas modificações. O Heroku nos fornece uma variável de ambiente chamada PORT (porta) e espera que a nossa aplicação web execute nesta porta. Vamos começar importando o pacote "os", deste modo nós seremos capazes de realizar a leitura da variável de ambiente PORT:

import (
    "net/http"
    "os"

    "github.com/russross/blackfriday"
)

Em seguida, nós teremos de realizar a leitura da variável de ambiente PORT, verificar se ela está definida, e se estiver, nós deveremos colocar a aplicação para escutar nesta porta, ao invés da porta que foi definida de maneira fixa no código (8080).

port := os.Getenv("PORT")
if port == "" {
  port = "8080"
}

Para finalizar, passaremos esta porta na nossa chamada para http.ListenAndServe:

http.ListenAndServe(":"+port, nil)

O código final deverá ficar parecido com isso:

package main

import (
    "net/http"
    "os"

    "github.com/russross/blackfriday"
)

func main() {
    port := os.Getenv("PORT")
    if port == "" {
        port = "8080"
    }

    http.HandleFunc("/markdown", GenerateMarkdown)
    http.Handle("/", http.FileServer(http.Dir("public")))
    http.ListenAndServe(":"+port, nil)
}

func GenerateMarkdown(rw http.ResponseWriter, r *http.Request) {
    markdown := blackfriday.MarkdownCommon([]byte(r.FormValue("body")))
    rw.Write(markdown)
}

Configuração

Nós precisaremos de alguns pequenos arquivos de configuração para indicar ao Heroku como executar a nossa aplicação. O primeiro arquivo é o Procfile, o qual nos permite definir quais processos deverão ser executados para a nossa aplicação. Por padrão, o Go irá nomear o executável utilizando o nome do diretório onde estiver o código do seu package main. Por exemplo, se a minha aplicação web estiver em GOPATH/github.com/codegangsta/bwag/deployment, meu Procfile deverá ficar assim:

web: deployment

Dependências

Nossa aplicação de exemplo usa o github.com/russross/blackfriday, um pacote que não faz parte da biblioteca padrão. Para garantir que esse pacote estará disponível na versão correta na hora da compilação a prática comum no Go é salvar uma cópia ("vendor") da versão do github.com/russross/blackfriday que estamos usando localmente dentro da base de código.

Usaremos a ferramenta godep para gravar essa dependência no diretório vendor da nossa aplicação.

$ go get -u github.com/tools/godep   # Baixar a ferramenta
$ godep save ./...

A partir do Go 1.6 o diretório vendor é o local padrão usado pelo Go para código de dependências ("vendorizado"). É lá que o godep faz uma cópia do github.com/russross/blackfriday e das dependências transitivas (dependências do próprio blackfriday).

O godep também cria um arquivo Godeps/Godeps.json para gravar o que foi encontrado.

Tanto o diretório vendor/ quanto o Godeps/ devem ser comitados para o git. O Heroku usa as informações salvas nesses diretórios para compilar corretamente aplicações em Go.

Publicação

Uma vez que todas estas coisas estejam em seu devido lugar, o Heroku torna fácil a sua publicação.

Inicialize o projeto como um repositório do Git

git init
git add -A
git commit -m "Initial Commit"

Crie a sua aplicação no Heroku:

heroku create

Envie o código para o Heroku e veja a sua aplicação ser publicada!

git push heroku master

Veja a sua aplicação em seu navegador:

heroku open