Cloude9 é uma ferramenta muito boa pra desenvolvimento, tanto para se ter em casa, quanto em um servidor da empresa para trabalho em equipe. Porém quando vamos instalar ele, costumamos passar por um pouco de dor de cabeça, portanto, hoje vou ajudar quem tem interesse em montar seu servidor doméstico de Cloud9 no linux.

ISATNeste “tutorial” explicarei como instalar seu próprio servidor, vou dar algumas dicas de customização e por fim como iniciar seu servidor com workbranch. A partir disso, você pode montar outras aplicações como scripts de inicialização dos seus projetos, ou como o projeto ISAT que eu fiz na Cianet, o qual os desenvolvedores podem, através de um arquivo JSON, identificar quais servidores/porta de Cloud9 querem iniciar. Por fim, ainda é possível colocar um reverse-proxy em nginx (por exemplo) com DNS interno na sua rede para colocar o nome dos seus desenvolvedores apontando para seus ambientes. Mas neste tutorial vou explicar a parte do Cloud9 apenas.

A foto  direita é um exemplo de como ficou no projeto ISAT a inicialização dos serviços. Você pode continuar deste tutorial e fazer seu próprio projeto para ter o ambiente de desenvolvimento remoto da forma que melhor lhe satisfazer.

Eu não sei se é possível instalar o Cloud9 no Windows, eu nunca tentei e espero que nunca ninguém faça um pedido desses pra mim. Então vamos nos ater ao Linux e esse tutorial serve para qualquer distro de linux que você esteja usando.

Não será necessário ter o Node.js instalado no seu Linux, mas se você já tem, não se preocupe, este tutorial vai ensinar como instalar uma versão independente que rode apenas para o Cloud9 e RunJS sem criar conflitos com a versão que você tem instalada.

Projetos que você vai precisar

Ainda será necessário ter instalado o GCC e é claro o GIT, os outros eu vou ensinar a instalar durante o tutorial.

Instalando o GCC e GIT:

 Bash |  copiar código |? 
# Distros baseadas em Red Hat yum install git gcc -y # Distros baseadas em Debian apt-get install git gcc -y

Instalando Cloud9

Neste exemplo vou instalar o Cloud9 direto na pasta home do meu usuário, Vai ficar assim:

 Bash |  copiar código |? 
cd ~/ git clone https://github.com/ajaxorg/cloud9.git cd cloud9

Para continuar vamos precisar do Node na versão 0.8.x, até o Cloud9 v2.0.93 era necessário a versão 0.8.x por causa do node-waf que deixou de existir nas versões >= 0.9.x do Node

Instalando Node 8x

Considerando que você ainda está na pasta do Cloud9, é aqui mesmo que vamos clonar o Node, para deixar mais claro vamos chamar a pasta de Node8, assim ficará mais fácil de lembrar de não compilar versões posteriores a 8 aqui.

 Bash |  copiar código |? 
git clone https://github.com/joyent/node.git node8 cd node8 git checkout v0.8 ./configure --prefix=~/cloud9/node8 make make install

É bom ressaltar que estou considerando a instalação na sua pasta de usuário, dentro da pasta do cloud9, se você instalou em um local diferente, altere o “–prefix=” como desejar.

No make install, não vai ser necessário ser root, pois você está instalando apenas para o seu usuário.

Instalando dependencias do Cloud9

Voltando a pasta do cloud9, devemos instalar suas dependencias usando o node8:

 Bash |  copiar código |? 
cd ~/cloud9 PATH=./node8/bin:$PATH npm install

Para testar se sua instalação funcionou, na pasta do cloud9 digite:

 Bash |  copiar código |? 
./node8/bin/node server.js

cloud9-console-initSe abrir o servidor em localhost na porta 3131 (http://localhost:3131) e seu console exibir algo igual a imagem a direita, é porque foi instalado corretamente e está funcionando. Caso contrário, ele vai disparar alguma mensagem de erro durante a inicialização ou quando você tentar abrir pelo browser o endereço. Nestes casos você pode tentar descobrir qual é o erro e corrigi-lo ou simplismente recomeçar o processo todo.

Instalando RunJS

O RunJS é uma ferramenta que foi feita pela própria equipe do Cloud9 e é usada internamente para manter os serviços das instancias do cloud9 rodando mesmo quando dão algum erro e este faz a aplicação parar. No caso o runjs vai reiniciar a aplicação com os parametros iniciais sempre que ela parar por qualquer motivo que não seja um kill via runjs.

Sabendo disso vamos instalar o runjs, até a versão 2.0.93 o runjs ficava na pasta node_modules/runjs porém não existe referencia pra ele no arquivo package.json, então ele não é instalado automáticamente.

Por causa disso, eu decidi que era melhor não instalar este na pasta “correta” mas sim utiliza-lo fora do node_modules, pois ele não é um modulo oficial e também porque na branch master do cloud9 eles removeram o link simbolico pro runjs (não sei porque).

Então vamos colocar o runjs direto dentro da pasta do cloud9, como fizemos com o node8, dentro da pasta do cloud9 seguem os comandos:

 Bash |  copiar código |? 
cd ~/cloud9 git clone https://github.com/c9/runjs.git

Apesar do README do runjs recomendar o uso da versão estável, estou usando a Master, pois funcionou direitinho, mas não acabou ai, temos agora que compilar o arquivo watcher.

 Bash |  copiar código |? 
cd runjs gcc watcher.c -o watcher -v chmod 0550 watcher

runjs-ok

Por fim teste o seu runjs, se estiver tudo OK, ele simplismente vai dizer que não há processos rodando.

 Bash |  copiar código |? 
./runjs

Quando você não compila o watcher, ele tenta compilar, mas é normal ele não achar o GCC no seu enviroment e falhar. E outra coisa que acontece as vezes a permissão do CHMOD estar errada e o watcher não consegui acessar os processos, se você seguir do jeito que eu expliquei provavalmente não passará por essas dificuldades.

Iniciando o seu Cloud9 com o runjs

Agora que você tem o cloud9 e o runjs funcionando, você precisa inicia-lo usando o runjs, se você usar a versão do seu nodejs e essa não for mais nova que 0.8 isso poderia ser uma dor de cabeça, então vou ajuda-lo a modificar os arquivos necessários pra usar o runjs.

Pra começar vamos vamos criar o link simbólico (ou alterar caso exista) pro runjs na pasta bin:

 Bash |  copiar código |? 
cd ~/cloud9/bin rm run.js ln -s ../runjs/runjs run.js

No arquivo “runjs.sh” na mesma pasta, vamos remover o comando como super usuário na linha 7:

 Bash |  copiar código |? 
  1. sudo bin/run.js panic

Ficará:

 Bash |  copiar código |? 
  1. bin/run.js panic

Agora vamos mudar o run.js para executar usando o seu node8 em vez do node global, editando este arquivo na sua primeira linha:

 Bash |  copiar código |? 
  1. #!/usr/bin/env node

Ficará (substitua usuario pelo nome de usuário, uma dica é ir na pasta do node8 e escrever pwd pra saber o endereço completo dela):

 Bash |  copiar código |? 
  1. #!/usr/bin/env /home/usuario/cloud9/node8/bin/node

Vamos testar, tente executar com runjs agora:

 Bash |  copiar código |? 
cd ~/cloud9/bin ./runjs.sh

Se funcionou seu cloud9 estará novamente funcionando (lembre de fechar aquela instancia de teste antes de fazer isso).

Você pode monitorar o que está acontecendo com seu Cloud9 com seguinte comando (ainda na mesma pasta):

 Bash |  copiar código |? 
./run.js tail c9

Se quiser fechar seu Cloud9 execute:

 Bash |  copiar código |? 
./run.js kill c9

Para abrir em uma outra pasta de projeto, você pode especificar o parametro -w, como no exemplo:

 Bash |  copiar código |? 
./runjs.sh -w ~/meu_projeto

BONUS: Resolvendo bug com Sessionid

Esse bug é muito conhecido e comentado, mas o pessoal que desenvolve o Cloud9 não da muita atenção pra ele, até porque é um problema de um plugin chamado connect.archect

Este plugin tem algum problema que faz ele não conseguir sobrescrever ou ler arquivos na pasta .session que ele mesmo gera, então ele dispara o erro e é bem chatinho, pois quando acontece você tem que dar refresh no browser e se ele fica se repetindo, da vontade de desistir da IDE…

Então pra resolver esse bug que é relacionado a sistema de arquivos, da pra configurar pra o Cloud9 usar o gerenciamente de sessões na memória.

No arquivo “config/default.js” mais ou menos entre as linhas 160 e 180 tem este código:

 Javascript |  copiar código |? 
  1.    {
  2.         packagePath: "./connect.session.file",
  3.         sessionsPath: __dirname + "/../.sessions",
  4.         maxAge: 7 * 24 * 60 * 60 * 1000
  5.     },

Substituindo file por memory, você passa a usar a memória no lugar do sistema de arquivos:

 Javascript |  copiar código |? 
  1.    {
  2.         packagePath: "./connect.session.memory",
  3.         sessionsPath: __dirname + "/../.sessions",
  4.         maxAge: 7 * 24 * 60 * 60 * 1000
  5.     },

Problema resolvido!