domingo, 20 de novembro de 2016

Instalando e configurando Phabricator


Fala pessoal depois de praticamente um ano sem postar, resolvi voltar a ativa e com um grande artigo.

Antes de começarmos com a instalação vou dar uma breve explicação sobre o que é o Phabricator, quem esta por trás, algumas empresas que utilizam e quais são seu benefícios.

O que é o Phabricator e quem esta por trás ?

Phabricator é uma suite colaborativa de aplicações web para o desenvolvimento de software, incluindo Differential ferramenta de revisão de código, Diffusion navegador de repositórios, Herald ferramenta de monitoramento de alterações, o gerenciador de bugs Maniphest e a wiki Phriction. Atualmente mantido pela Phacility, sendo originalmente desenvolvido como uma ferramenta interna do Facebook. Está disponível como software livre sob Licença Apache, versão 2.
Phabricator integra com GitMercurial, e Subversion.
O principal desenvolvedor do Phabricator é Evan Priestley. Priestley deixou sua posição no Facebook para dar continuidade ao desenvolvimento do Phabricator em uma nova empresa chamada Phacility.

Texto acima foi extraído do wikipedia pode ser visualizado aqui.

É interessante ressaltar que atualmente o Phabricator conta com outras ferramentas que auxiliam o desenvolvimento alem das citadas no wiki, sendo elas Ponder utilizado para perguntas e respostas, Audit para auditoria de código que é utilizado como uma revisão de código porem após o código ja estar no repositório principal, Phame para criação de Blogs internos, Pholio para criação de Mockups e Design permitindo comentários e revisões, Paste para compartilhar partes de códigos, CountDown para adicionar contagens regressivas para eventos e muitos outros que estão em fase de Protótipo mas já são utilizáveis.

Quem utiliza ?

Blender
Bloomberg
deviantART
Dropbox
Enlightenment gerenciador de janelas
Facebook
FreeBSD
HQ Softwares
Khan Academy
LLVM
MemSQL
Pinterest
Quora
Wikipedia

Quais os benefícios ?

O que posso dizer é que o fato de possuir diversas ferramentas integradas em um único produto facilita muito a organização e gerenciamento dos projetos. Outro fator importante é que ele simplifica os processos e de quebra você mantera a maior parte das necessidades de seus projetos centralizados em um único local, desde design de telas e protótipos, passando para o repositório, bug tracking, revisão de código, auditoria de código, kanban board, conversação interna, calendários de compromissos ou tarefas, gerenciamento de builds até o deploy. 

Dependendo dos serviços que sua empresa utiliza de terceiros a adoção do Phabricator pode gerar uma enorme redução de custos.    

Vale lembrar também que por ser um projeto open source você pode colaborar com o projeto criando novas ferramentas e enviando para a equipe aprovar e tornar publica suas ideias e/ou melhorias.

Instalando o Phabricator

Primeiramente você ira precisar de uma maquina com um sistema operacional Linux, no caso da nossa instalação utilizei um CentOS 7.0 em uma maquina virtual hospedada no Linode que possui ótimos valores para servidores para cloud, VPS, K8s, etc.

Bom chega de conversa, agora que você ja sabe um pouco mais sobre o que se trata o Phabricator vamos começar com a instalação.

Primeiros passos, antes de começar atualize o CentOS com o comando:

yum update -y && shutdown -r now

Após executar o comando o yum verificara todas os pacotes e pedira para confirmar se esta tudo ok, digite y e pressione enter para confirmar a atualização.

Em seguida iremos instalar o servidor da base de dados MariaDB executando o comando abaixo:

sudo yum install mariadb mariadb-server

Confirme a instalação e após concluido vamos iniciar o serviço do maria db e habilita-lo

sudo systemctl start mariadb.service
sudo systemctl enable mariadb.service

Por questões de segurança execute o utilitario de instalação de segurança do MySQL

sudo /usr/bin/mysql_secure_installation

Conclua o processo seguindo os passos abaixo:

Enter current password for root (enter for none): Enter
Set root password? [Y/n]: Y
New password: <nova senha>
Re-enter new password:<nova senha>
Remove anonymous users? [Y/n]: Y
Disallow root login remotely? [Y/n]: Y
Remove test database and access to it? [Y/n]: Y
Reload privilege tables now? [Y/n]: Y

Em seguida vamos instalar o servidor http Apache

sudo yum install httpd

Modifique a configuração padrão do Apache para melhorar a segurança realizando o procedimento abaixo:

sudo sed -i 's/^/#&/g' /etc/httpd/conf.d/welcome.conf
sudo sed -i "s/Options Indexes FollowSymLinks/Options FollowSymLinks/" /etc/httpd/conf/httpd.conf

Em seguida inicie o serviço do Apache e habilite-o:

sudo systemctl start httpd.service
sudo systemctl enable httpd.service

Com o Apache instalado chegou a hora de instalar o php para isso vamos executar o seguinte comando:

sudo yum install php php-mysqli php-mbstring php-gd php-curl php-cli php-common php-process

Agora vamos instalar o git para clonarmos os repositórios do Phabricator com o comando:

sudo yum install git

Com o git instalado vamos baixar e instalar o Phabricator, faça como abaixo:

cd ~
mkdir phabricator
cd phabricator
git clone https://github.com/phacility/libphutil.git
git clone https://github.com/phacility/arcanist.git
git clone https://github.com/phacility/phabricator.git
cd ~
sudo chown -R apache: ~/phabricator
sudo mv ~/phabricator /var/www/html

sudo chown -R apache:apache /var/www
chmod a+rX -R /var/www

Bom agora que o Phabricator esta instalado no diretório do apache e com as devidas permissões de diretorio vamos configurar o servidor virtual do Phabricator, para isso precisaremos criar o arquivo de configuração e preenche-lo. Nota técnica: utilizaremos o editor do linux vi, se você não sabe utilizar ele aqui vai uma dica básica para que consiga realizar as configurações. Para iniciar o editor digite vi nome_do_arquivo, após iniciado pressione a tecla "i" para entrar em modo de inserção, digite todo o texto necessário, para sair do modo de inserção pressione "<Esc>" e em seguida digite ":wq" para salvar e sair, caso queira sair sem salvar digite ":qa!"

Sabendo disso vamos lá, execute o comando

sudo vi /etc/httpd/conf.d/phabricator.conf

Preencha como abaixo lembrando de trocar as seções admin@example.com, phabricator.example.com, www.phabricator.example.com, /var/log/httpd/phabricator.example.com-error_log e /var/log/httpd/phabricator.example.com-access_log pelos seus valores:

<VirtualHost *:80>
    ServerAdmin admin@example.com
    DocumentRoot /var/www/html/phabricator/phabricator/webroot/
    ServerName phabricator.example.com
    ServerAlias www.phabricator.example.com
    RewriteEngine on
    RewriteRule ^/rsrc/(.*)     -                       [L,QSA]
    RewriteRule ^/favicon.ico   -                       [L,QSA]
    RewriteRule ^(.*)$          /index.php?__path__=/$1  [B,L,QSA]
    <Directory /var/www/html/phabricator/phabricator/webroot/>
        AllowOverride All
    </Directory>
    ErrorLog /var/log/httpd/phabricator.example.com-error_log
    CustomLog /var/log/httpd/phabricator.example.com-access_log common
</VirtualHost>

Salve e saia com o comando :wq

Reinicie o serviço do apache para que as alterações tenham efeito, executando o comando:

sudo systemctl restart httpd.service

Hora de configurarmos as credenciais do MariaDB para utilizar com o Phabricator

Antes de começar a usar o phabricator é necessário configurar as credenciais do mariadb para isso faça o seguinte:

cd /var/www/html/phabricator/phabricator/
sudo ./bin/config set mysql.host localhost
sudo ./bin/config set mysql.port 3306
sudo ./bin/config set mysql.user root
sudo ./bin/config set mysql.pass <senha-mysql definida anteriormente>

Feito isso hora de criar as tabelas do Phabricator execute:

./bin/storage upgrade

Durante este processo você precisara pressionar "y" duas vezes para confirmar o processo.

Hora de configurarmos o firewal do linux para permitir a conexao ao http

sudo firewall-cmd --zone=public --permanent --add-service=http
sudo firewall-cmd –-reload

Caso seu linux não possua o comando firewall-cmd instale-o como abaixo e após execute o passo anterior:

yum install firewalld
systemctl unmask firewalld
systemctl enable firewalld
systemctl start firewalld


Agora precisaremos permitir a conexao ao banco de dados pela rede no SELinux para que os sites do apache consigam conectar na base, para ver se o selinux esta ativo em seu sistema execute o comando:

sestatus

Caso positivo aparecera SELinux status: enabled

Sendo assim verifique a configuração da flag do processo httpd executando

getsebool -a | grep httpd

Veja se a opção httpd_can_network_connect_db esta como "off", caso positivo execute o comando

setsebool -P httpd_can_network_connect_db 1

note que usamos a opção -P para tornar essa alteração da configuração permanente pois do contrario após reiniciar o sistema operacional a configuração seria descartada.

Tente acessar seu Phabricator pelo navegador digitando o endereço ip do seu servidor e veja se carregara a pagina inicial dele, caso não apareça nada provavelmente seu SELinux esta te impedindo, para ter certeza que é isso execute o comando e compare o resultado:

cat /var/log/audit/audit.log | grep httpd

Se seu log apresentar algo como abaixo:

type=AVC msg=audit(1478440265.218:7896): avc:  denied  { getattr } for  pid=21432 comm="httpd" path="/var/www/html/phabricator/phabricator/webroot/index.php" dev="sda1" ino=176166544 scontext=system_u:system_r:httpd_t:s0 tcontext=unconfined_u:object_r:admin_home_t:s0 tclass=file
type=SYSCALL msg=audit(1478440265.218:7896): arch=c000003e syscall=4 success=no exit=-13 a0=7f6c2168fdb0 a1=7ffed7b20fd0 a2=7ffed7b20fd0 a3=7f6c1563a792 items=0 ppid=21429 pid=21432 auid=4294967295 uid=48 gid=48 euid=48 suid=48 fsuid=48 egid=48 sgid=48 fsgid=48 tty=(none) ses=4294967295 comm="httpd" exe="/usr/sbin/httpd" subj=system_u:system_r:httpd_t:s0 key=(null)
type=AVC msg=audit(1478440265.250:7897): avc:  denied  { getattr } for  pid=21432 comm="httpd" path="/var/www/html/phabricator/phabricator/webroot/index.php" dev="sda1" ino=176166544 scontext=system_u:system_r:httpd_t:s0 tcontext=unconfined_u:object_r:admin_home_t:s0 tclass=file
type=SYSCALL msg=audit(1478440265.250:7897): arch=c000003e syscall=6 success=no exit=-13 a0=7f6c2168fed0 a1=7ffed7b20fd0 a2=7ffed7b20fd0 a3=8 items=0 ppid=21429 pid=21432 auid=4294967295 uid=48 gid=48 euid=48 suid=48 fsuid=48 egid=48 sgid=48 fsgid=48 tty=(none) ses=4294967295 comm="httpd" exe="/usr/sbin/httpd" subj=system_u:system_r:httpd_t:s0 key=(null)

Note o avc denied, o httpd e o caminho da instalação em destaque que basicamente indica que o selinux bloqueou o acesso ao diretório para resolver isso execute o seguinte comando:

chcon  --user system_u --type httpd_sys_content_t -Rv /var/www/html/phabricator/phabricator/webroot/


Feito isso tente acessar novamente, devera ser apresentado a tela de definição do usuário administrador, defina e em seguida precisaremos resolver alguns problemas de configuração dele que não foram resolvidos.

No momento atual da minha instalação apareceram 17 problemas, vamos começar a resolve-los.

O primeiro deles é o Base URI Not Configured, click nele para ir para a pagina de detalhes a aprender mais sobre este problema, note que a pagina de detalhes do erro é bem completa e mostra o comando que tem que ser executado para soluciona-lo.

Para resolver este problema em especifico faça o seguinte:

cd /var/www/html/phabricator/phabricator/
sudo ./bin/config set phabricator.base-uri 'http://url-do-seu-servidor'

Volte para o navegador e click em Reload Page e sera indicado que o problema foi resolvido.

Próximo problema é No Authentication Providers Configured

Click no problema para ser levado para a pagina especifica do erro e click em auth providers para ir para a pagina de adicionar os provedores de autenticação, click em Add Provider, selecione Username/Password e click em continue, selecione as opções desejadas para permissões desse provider, como por exemplo permitir que usuários se registrem utilizando este provider, em seguida click em Add Provider.

Próximo problema, Daemons Are Not Running

Execute o comando no terminal:

./bin/phd start

Recarregue a pagina e confirme que foi resolvido.

Proximo problema é PHP post_max_size Not Configured

Execute os seguintes comandos no terminal:

sudo sed -i "s/post_max_size = 8M/post_max_size = 32M/" /etc/php.ini
sudo systemctl restart httpd.service

Recarregue a pagina e confirme que foi resolvido.

Próximos problemas são relacionado ao MySQL então para agilizar arrumaremos todos de uma vez,
resolveremos os seguintes problemas:

Small MySQL "maxallowedpacket"
MySQL STRICTALLTABLES Mode Not Set
MySQL is Using Default Stopword File
MySQL is Using Default Minimum Word Length
MySQL is Using the Default Boolean Syntax
MySQL May Run Slowly

No terminal edit o arquivo de configuração do mysql usando o editor vi

sudo vi /etc/my.cnf

Abaixo das três linhas iniciais:

[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock

Adicione as seguintes configurações:

max_allowed_packet=32M
sql_mode=STRICT_ALL_TABLES
ft_stopword_file=/var/www/html/phabricator/phabricator/resources/sql/stopwords.txt
ft_min_word_len=3
ft_boolean_syntax=' |-><()~*:""&^'
innodb_buffer_pool_size=3200M        # aproximadamente 40% do disponivel de memoria do seu servidor.

Atenção você deve setar o innodb_buffer_pool size de acordo com a capacidade de memoria do seu servidor, por exemplo se você estiver usando um servidor com 4gb de memória ram um valor razoavel para o buffer seria de 1600M, no meu caso atual estou utiliza 8gb então configurei com o dobro 3200M.

Salve e saia do editor com o comando :wq

Reinicie o serviço do MariaDB:

sudo systemctl restart mariadb.service

Finalmente execute o seguinte comando:

mysql -u root -p -e "REPAIR TABLE phabricator_search.search_documentfield"

Recarregue a pagina e ficaremos com 7 erros para resolver.

Vamos agora habilitar o Pygments para resolver o proximo problema,
no CentOS o Pygment já vem instalado então basta habilitarmos, para isso click no problema Install Pygments to Improve Syntax Highlighting e click no link Edit "pygments.enabled" em seguida  selecione a opção Use Pygments no menu Database Value e click no botão Save Config Entry.

Proximo problema é Server Timezone not Configured, modifique o arquivo php.ini:

sudo vi /etc/php.ini

Substitua a linha

:date.timezone =

por

date:timezone = America/Sao_Paulo

Reinicie o serviço do apache:

sudo systemctl restart

Recarregue a pagina.

Próximo problema é o Large File Storage Not Configured

Esse item pode ser configurado de varias formas, o mais recomendável é que seja utilizando a amazon, caso não queira configurar o armazenamento click no problema e click em ignore setup issue.

Caso queira neste momento configurar como armazenamento local é bem simples mas como o próprio help do Phabricator menciona ele não funciona tao bem quando necessário utilizar em multi-servidores com recurso de clusters, não é facilmente escalável.

Para configurar faça o seguinte

cd /var/
mkdir files
chown apache:apache files
cd /var/www/html/phabricator/phabricator/
./bin/config set storage.local-disk.path '/var/files/'

Para testar acesse a pagina principal do Phabricator e arraste um arquivo para ela, o arquivo devera ser transferido com sucesso, para verificar o arquivo vá no menu Applications do Phabricator e selecione a aplicação Files, seu arquivo devera aparecer lá.

Proximo problema é Alternate File Domain Not Configured

Se você tiver um dominio secundario ou um CDN então execute no terminal os comandos:

cd /var/www/html/phabricator/phabricator/
sudo ./bin/config set security.alternate-file-domain <https://files.example.com>

Recarregue a pagina, caso não tenha ignore esse problema clicando em ignore setup issue.

Próximo problema PHP Extension 'APC' Not Installed

sudo yum install php-pear php-devel httpd-devel pcre-devel gcc make
sudo pecl install apc

Durante a instalação do apc, pressione enter para utilizar as configurações padrões em todas as solicitações.

Após concluida a instalação altere o arquivo php.ini

sudo vi /etc/php.ini

Adicione as configurações a seguir no final do arquivo:

extension=apc.so
apc.write_lock = On
apc.slam_defense = Off
apc.stat = Off

Salve e saia com :wq

Reinicie o servico do apache:

sudo systemctl restart httpd.service

Em seguida vamos resolver o problema Missing Repository Local Path

sudo mkdir /var/repo
sudo chown apache: /var/repo

Próximo problema é o Disable PHP always_populate_raw_post_data

Para resolver edit o arquivo php.ini e altere a linha que esta:

;always_populate_raw_post_data = On

para

always_populate_raw_post_data = "-1"

Salve saia e em seguida reinicie o servico do apache:

sudo systemctl restart httpd.service


Com isso todos Setup Issues devem estar resolvidos porem temos ainda que configurar o acesso aos repositórios e para isso temos que entender como que o Phabricator funciona neste quesito.

Basicamente para receber os comando de push tanto do git quanto do mercurial ele utiliza uma instancia do sshd própria que devera ser executado na porta 22 substituindo o ssh de administração utilizado anteriormente, para isso a precisaremos tomar cuidado neste momento não ficarmos travado para fora da conexão e perdermos o acesso via ssh, então siga atentamente os passos.

Configuraremos da seguinte forma, sshd padrão sera alterado para a porta 2222 e o sshd do Phabricator ficara na porta 22.

Edit o arquivo sshd.conf

vi /etc/ssh/sshd_config

Altere a linha

#Port 22

para

Port 2222

Salve e saia com :wq

Em seguida adicione a regra para liberação da porta 2222 no selinux e no firewall com os comandos:

semanage port -a -t ssh_port_t -p tcp 2222
sudo firewall-cmd --zone=public --add-port=2222/tcp --permanent
sudo firewall-cmd --reload

Reinicie o serviço do sshd e as novas conexões ja deveram funcionar pela porta 2222

sudo systemctl restart sshd

Teste a conexão pela porta 2222

Agora sim vamos começar a configurar a parte especifica do Phabricator em relação ao acesso aos repositórios

Primeiro vamos criar o usuario que sera utilizado para realizar o acesso via ssh reponsavel pela execução dos comandos do mercurial e git:

adduser dvcs

Altere o arquivo /etc/shadow localize o usuario dvcs e altere o segundo campo que estará como !! para NP, a linha ficara algo como isso dvcs:NP:17120:0:99999:7:::

Salve e saia com :wq!

Verifique se no arquivo /etc/passwd o usuário dvcs esta configurado para utilizar o login em um shell como /bin/sh ou /bin/bash caso esteja para /bin/false ou /bin/login altere para sh ou bash.

Em seguida configure o usuário do ssh do diffusion para utilizar o nosso novo usuário do linux, executando o seguinte comando:

cd /var/www/phabricator/phabricator
./bin/config set diffusion.ssh-user = dvcs

Vamos instalar o mercurial, para isso digite:

yum install mercurial

tecle y

Agora precisamos configurar o hook do ssh para o phabricator autenticar os usuários dos repositórios, para isso vamos seguir os passos abaixo:

cd /var/www/phabricator/phabricator
cp resources/sshd/phabricator-ssh-hook.sh /usr/libexec/

vi /usr/libexec/phabricator-ssh-hook.sh

Altere o valor do VCSUSER para dvcs ficando assim VCSUSER=“dvcs” e o valor de ROOT deve ser o caminho da instalação do Phabricator que no nosso caso ficara assim:

ROOT=“/var/www/html/phabricator/phabricator“

salve com :wq

Execute:

sudo chown root /usrlibexec/phabricator-ssh-hook.sh
sudo chmod 755 /usr/libexec/phabricator-ssh-hook.sh

Agora crie o arquivo sshd_config.phabricator copiando do template disponível em /phabricator/resources/sshd/sshd_config.phabricator.example

Para fazer isso execute os comandos:

cd /var/www/phabricator/phabricator
cp /resources/sshd/sshd_config.phabricator.example /etc/ssh/sshd_config.phabricator

Altere o arquivo sshd_config.phabricator

vi /etc/ssh/sshd_config.phabricator

Deixe como abaixo:

AuthorizedKeysCommandUser dvcs
AllowUsers dvcs

Port 22

Salve e saia com :wq

Inicie o sshd do Phabricator com o comando sudo /usr/sbin/sshd -f /etc/ssh/sshd_config.phabricator

Pode ser que você receba a mensagem Could not load host key: /etc/ssh/ssh_host_dsa_key

Caso isso aconteça execute o comando:

/usr/bin/ssh-keygen -A

Em seguida execute o comando anterior novamente:

/usr/sbin/sshd -f /etc/ssh/sshd_config.phabricator

Vamos configurar agora o usuario daemon especifico para executar os daemons do phabricator e configurar os acessos aos repositórios:

Para isso vamos criar o usuario phabd:

adduser phabd

Em seguida pare o daemon atual do Phabricator com:

cd /var/www/html/phabricator/phabricator
./bin/phd stop

Vamos mudar o usuário daemon para o nosso novo usuário executando o comando:

./bin/config set phd.user phabd

Em seguida dar os direitos de escrita nos diretórios do daemon:

chown phabd /var/tmp/phd
chown phabd /var/tmp/phd/pid
chown phabd /var/tmp/phd/log

chown phabd:phabd /var/repo
chmod 777 /var/repo

chcon  --user system_u --type httpd_sys_content_t -Rv /var/repo/

Inicie o daemon novamente com o comando:

./bin/phd start

Vamos agora alterar o arquivo /etc/sudoers

Para isso digite

sudo visudo

Comente a linha Defaults requiretty deixando a da seguinte forma:

#Defaults requiretty

Em seguida encontre a linha

root ALL=(ALL) ALL

e adicione abaixo dela a linha:

dvcs ALL=(ALL) SETENV: NOPASSWD: /usr/bin/git-upload-pack, /usr/bin/git-receive-pack, /usr/bin/git, /usr/bin/hg, /usr/bin/hg-ssh

Salve e saia com :wq

Com isso feito você ja pode criar um repositório pela interface web do Phabricator utilizando o mercurial, ativa-lo e realizar os pushs e commits.

*Note que o mercurial em suas ultimas atualizações recebeu a adição de um novo protocolo chamado bundle2 que atualmente o Phabricator não suporta, para isso é recomendável que você utilize uma versão do mercurial no cliente igual ou anterior a 3.4.2, você pode verificar o status da discussão neste link.

Por esta questão preferi deixar tanto o mercurial do Phabricator quanto o do Windows com a versão 3.4.2 afim de resolver este problema. 

Para isso instale o pip no linux executando o comando:

sudo easy_install pip
sudo yum install python-devel

Em seguida instale a versão 3.4.2 do mercurial usando o comando:

pip install mercurial==3.4.2

No windows instale o tortoise hg com mercurial 3.4.2 através do link:

tortoisehg-3.4.2-x64.msi
ou
tortoisehg-3.4.2-x86.msi

Com isso já podemos trabalhar com os repositórios sem problemas.

Continue acompanhando o blog que nos próximos posts explicarei como configurar o tortoise hg para realizar pull e push utilizando ssh e a chave privada gerada pelo Phabricator, também darei dicas de como configurar envio e recebimento de e-mails e outras configurações legais que esta ferramenta nos proporciona.

Um grande abraço a todos e até a próxima.

Diego Garcia






Nenhum comentário:

Postar um comentário