Buildout, para o que der e vier
Começo dizendo que durante algum tempo fui assombrado pelo buildout, desde a minha entrada na Simples até alguns meses depois, eu tremia sempre que eu tinha de rodar um, a primeira coisa que vinha na cabeça era: "Pronto, agora o ambiente vai ser destruído :(".
Trabalhar com alho no pescoço, pé de coelho e até mesmo trevo de 4 folhas não estava em meu escopo de trabalho, e não é muito meu tipo, pois bem, depois de algumas brigas decidi me tornar o melhor amigo do buildout, após alguns copos de café, e saindo juntos, decidimos fazer as pazes.
Hoje posso garantir, que em qualquer situação onde preciso instalar alguma aplicação que vá ou não rodar com o Plone, penso no meu amigo buildout.
Duas pessoas que me tiraram esse medo e me deram coragem foi o amigo e inesquecível Dorneles, e também o amigo Érico.
E agora a novidade é que não vou falar de como instalar Plone usando buildout, isso tudo para poder mostrar todo o poder do buildout, caso não saiba ainda do que estou falando acesso em
http://www.buildout.org/docs/tutorial.html
.
Buildout
É simples de usar e de manter se você fizer configurações simples e legíveis.
Trabalha com eggs.
Evita conflitos com os pacotes instalados no site_packages.
Evita a instalação diretamente no Python do sistema.
Instala dependências a partir das definições dos eggs.
Podemos instalar por exemplo:
Bancos de dados: PostgreSql, Mysql, Oracle e etc...
Serviço de autenticação como o LDAP.
Aplicações como: Versões diferentes de Python, Varnish,Squid, Supervisor e etc..
Frameworks: Django, Web2Py, Zope
CMS: Plone, WordPress e etc..
Servidores web: Apache, Nginx e etc...
E etc...
Vamos manter as coisas simples, então crie um diretório chamado mybuildout, dentro deste diretório crie a seguinte estrutura de pastas:
mybuildout|- tmp |- etc |- src
Essa não é uma estrutura requerida pelo buildout, mas gosto de montar assim, garantindo que qualquer arquivo temporário vá ficar em
tmp
por exemplo, arquivos de configurações em etc e aplicações em desenvolvimento em
src, dois arquivos são requeridos, são eles: bootstrap.py e buildout.cfg.
Podemos não usar o buildout.cfg e montar o ambiente com outros aquivos, mas isso não vem ao caso, vamos a um exemplo do não uso do Plone, e para não dizerem que não gosto de PHP, iremos instalar o WordPress, então vamos lá.
NOTA. A instalação a seguir foi feita no sistema operacioal Linux (Ubuntu) sendo assim, não garanto que funcione no Windows, mas sim, temos como fazer funcionar da mesma forma no Windows e outros sistemas operacionais.
Também estou partindo do ponto que já temos php instalado no sistema, não quero ter que ficar compilando no buildut o PHP, ainda que dê claro ;)
Comento o buildout logo abaixo.
Instalando o WordPress usando Python, ironia?
[buildout] parts = fcgi wp [wpconf] wpversion = latest.tar.gz mydb_name = wp mydb_user = wp mydb_pass = wpnginx mydb_charset = utf8 mydb_host = localhost [downloads] wp_url = http://wordpress.org/${wpconf:wpversion} fcgi_url = http://www.lighttpd.net/download/spawn-fcgi-1.6.3.tar.gz [ports] fastcgi = 53217 [fcgi] recipe = zc.recipe.cmmi url = ${downloads:fcgi_url} configure-options = --prefix=${buildout:directory}/parts/fcgi [wp] recipe = plone.recipe.command command = chmod 600 .installed.cfg if [ ! -f ${buildout:directory}/${wpconf:wpversion} ]; then wget ${downloads:wp_url}; fi tar xzf ${wpconf:wpversion} cp ${buildout:directory}/wordpress/wp-config-sample.php ${buildout:directory}/wordpress/wp-config.php ln -dfs ${buildout:directory}/wordpress ${buildout:directory}/var/www/wordpress sed -i "s/define('DB_NAME', 'database_name_here')/define('DB_NAME', '${wpconf:mydb_name}')/" ${buildout:directory}/wordpress/wp-config.php sed -i "s/define('DB_USER', 'username_here')/define('DB_USER', '${wpconf:mydb_user}')/" ${buildout:directory}/wordpress/wp-config.php sed -i "s/define('DB_PASSWORD', 'password_here')/define('DB_PASSWORD', '${wpconf:mydb_pass}')/" ${buildout:directory}/wordpress/wp-config.php sed -i "s/define('DB_HOST', 'localhost')/define('DB_HOST', '${wpconf:mydb_host}')/" ${buildout:directory}/wordpress/wp-config.php sed -i "s/define('DB_CHARSET', 'utf8')/define('DB_CHARSET', '${wpconf:mydb_charset}')/" ${buildout:directory}/wordpress/wp-config.php chmod +x ${buildout:directory}/bin/spawn-fcgi update-command = ${wp:command
Criei duas seções que servirá para instalar o WordPress e um script de inicialização do php-cgi, este script também vem quando instalamos o servidor lighttpd, que é uma forma de manter o php vivo enquanto podemos dar um restart ou reload no servidor lighttpd, mas isso não vem ao caso.
Também criamos 3 outras seções que são:
wpconf - > Colocamos aqui as configurações do nosso WP, como dados da base de dados [usuário, senha etc ] e a versão que desejamos instalar do WP.
downloads -> Urls das aplicações, WP e fcgi.
ports -> Configuração da porta no qual o fcgi irá rodar
Note que na seção [wp], usei alguns comandos para fazer a mágica acontecer, quero baixar e descompactar o tar.gz, lembrando que em casos de arquivos zip, será necessário alterar a linha. Após descompactar copiamos o arquivo
wp-config-sample.php para
wp-config.php, este será o que o Wp irá ler.
E por fim, setamos os dados de acesso ao bando de dados neste arquivo de configuração.
Rode o bootstrap e o buildout: python bootstrap.py && ./bin/buildout -Nvvv -t 30
Ao final teremos o o Wp instalado e pronto pra usar, é claro que faltam detalhes como instalar o servidor Apache ou Nginx, ou um de sua preferência.
Para subir o fcgi você pode executar:
./parts/fcgi/bin/spawn-fcgi -a 127.0.0.1 -p 53217 -P ./tmp/fastcgi-php.pid -- /usr/bin/php-cgi
A configuração acima, usei com o servidor Nginx, também compilado com buildout, por este motivo adicionei o fcgi, abaixo sugestões de eggs que ajudam nas instalações.
Sugestões.
- zc.recipe.cmmi: Usado para executar comando configure/make/make install
- plone.recipe.command: Executa comandos arbitrários para o buildout.
- collective.recipe.supervisor: Receita para instalar o supervisor
- z3c.recipe.usercrontab: Adicionar comandos ao Crontab do Linux
- collective.recipe.template: Receita para a criação de templates de configurações
- Mais :)