70
Adeus Wordpress. Olá Pelican! Autor: Magnun Leno

Adeus Wordpress. Ola Pelican!

Embed Size (px)

Citation preview

Adeus Wordpress. Olá Pelican!Autor: Magnun Leno

Quem Sou Eu?● Graduação:

– Eng. Telecomunicações– Analise de Sistemas Orientado a Objetos

● GNU/Linux: ~2002● Analista de Infraestrutura GNU/Linux● Programador FOSS:

– Anarchy, USB Manager, Tiamat, C-CairoPlot...– Cairoplot, Web2py e Pelican

● Passatempos:

– http://mindbending.org– Hack 'n' Cast

Objetivos

● Novas tecnologias● Experiência própria● Menos pode ser mais● Repensar as “respostas padrões”

Wordpress● Software Livre● Plataforma de publicação de conteúdo● A maior do Mundo (70% do mercado)● Possui:

– Suporte a templates– Plugins (30.000)– Temas– Múltiplos autores– Fluxo de edição– Editor WYSIWYG– etc.

● Feito em PHP & MySQL

Pelican● Software Livre● Python e Jinja● Gera HTML estático● Suporte a:

– Plugins– Multiplos autores– Templates– Markdown & reStructuredText

● Gerenciado através de CLI● Fácil de hospedar

Por Que Trocar?

Pessoalmente?● Comportamento não satisfatório● Desenvolvimento de plugins para

Wordpress é complexo● Não sou bom em PHP● Ambiente de desenvolvimento? Good luck

bro● Off-line mirror● Não gosto/uso de editores WYSIWYG● Integração via linha de comando● Interface web apenas para gerência de

atualizações/configs● Dilema da Bazooka e da formiga

Tecnicamente?● Foco de ataques● NGINX!● Recuperação de desastres?● Tempo/esforço para configuração● Recursos Computacionais:

– Tempo de resposta– Memória– Processamento

● Artigos de 5 anos sendo gerados?● Limpeza de banco de dados semestral● MySQL?

Eu sei!● W3 Total Cache● Compressão GZIP em Apache e NGINX● Smush.it (imagens)● Minify CSS & HTML● Offloading● Op Code Caching

– Alternative PHP Cache (APC), Memcached & Varnish

● Ghost!

Outros Geradores● http://staticsitegenerators.net/● Outros que testei:

– Ruby:● Jekyll● Octopress

– Python● Hyde● Blogofile● Cactus● Nikola● Wok● Mynt

Meu site...

Brincadeira...

Hands On!

Dependências● Debian:$ sudo aptitude install python3 python-setuptools python-virtualenv libxml2-dev libxslt-dev python3.3-dev

● Fedora:$ sudo yum install python3 python3-devel python-setuptools python-virtualenv libxml2-devel libxslt-devel

● Arch Linux:$ sudo pacman -S python-setuptools python-virtualenv libxml2 libxslt

VirtualEnv● Localização:$ mkdir ~/venv

● Criação:$ virtualenv -p /usr/bin/python3 --prompt "(pelican-3.4)" ~/venv/pelican-3.4

● Instalar dependências:$ wget http://bit.ly/1o3KfSC -O /tmp/requirements.txt

$ . ~/venv/pelican-3.4/bin/activate

(pelican-3.4)$ pip3 install -r /tmp/requirements.txt

Criando seu site(pelican-3.4)$ mkdir mysite && cd mysite

(pelican-3.4)$ pelican-quickstart

(...)

> Where do you want to create your new web site? [.] .

> What will be the title of this web site? MySite

> Who will be the author of this web site? Magnun

> What will be the default language of this web site? [en] pt

> Do you want to specify a URL prefix? e.g., http://example.com (Y/n) y

> What is your URL prefix? (see above example; no trailing slash) http://mysite.org

> Do you want to enable article pagination? (Y/n) y

> How many articles per page do you want? [10] 10

Criando seu site(...)

> Do you want to generate a Fabfile/Makefile to automate generation and publishing? (Y/n) y

> Do you want an auto-reload & simpleHTTP script to assist with theme and site development? (Y/n) y

> Do you want to upload your website using FTP? (y/N) n

> Do you want to upload your website using SSH? (y/N) n

> Do you want to upload your website using Dropbox? (y/N) n

> Do you want to upload your website using S3? (y/N) n

> Do you want to upload your website using Rackspace Cloud Files? (y/N) n

> Do you want to upload your website using GitHub Pages? (y/N) n

Done. Your new project is available at /tmp/teste/mysite

(pelican-3.4)$ ls

content/ develop_server.sh fabfile.py Makefile output/ pelicanconf.py publishconf.py

(pelican-3.4)$ mkdir content/{articles,pages,images}

Primeiro Artigo● Criando Artigo:(pelican-3.4)$ vim ./content/articles/hello-world.rst

Hello World

###########

:date: 2014-03-10 15:17

:category: Categoria

:tags: tag01, tag02, tag03

Olá! Este é o primeiro artigo. Então vamos de lorem ipsum!

Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do

eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad

(...)

deserunt mollit anim id est laborum.

E claro, um código Python!

.. code-block:: python

print "Hello World!"

Primeira Página● Criando Artigo:(pelican-3.4)$ vim content/pages/my-page.rst

My Page

#######

:date: 2014-03-10 15:17

Esta é uma página!

Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do

eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad

minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip

ex ea commodo consequat. Duis aute irure dolor in reprehenderit in

voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur

sint occaecat cupidatat non proident, sunt in culpa qui officia

deserunt mollit anim id est laborum.

Compilando o Site● Compiling!(pelican-3.4)$ make html

pelican /tmp/teste/mysite/content -o /tmp/teste/mysite/output -s /tmp/teste/mysite/pelicanconf.py

Done: Processed 1 article(s), 0 draft(s) and 1 page(s) in 0.24 seconds.

● Servindo...(pelican-3.4)$ make serve

cd /tmp/teste/mysite/output && python -m pelican.server

● Agora acesse: http://localhost:8000

Configurações

Configurações● AUTHOR = “Autor”● SITENAME = “Nome do Site”● SITEURL = 'http://mysite.org'● DEFAULT_LANG = u'pt'● TIMEZONE = “America/Sao_Paulo”● DEFAULT_PAGINATION = 10● PLUGIN_PATHS = [“.plugins”]● PLUGINS = [“PluginA”, “PluginB”]● THEME = “theme_path”● SOCIAL = ((“Rede” : “Link”))● STATIC_PATHS = [''images”, “codes'”]● JINJA_EXTENSIONS = ['jinja2.ext.do']

Configurações Avançadas● ARTICLE_URL = "{slug}"● ARTICLE_SAVE_AS = "{slug}/index.html"● PAGE_URL = "{slug}"● PAGE_SAVE_AS = "{slug}/index.html"● CATEGORY_URL = "category/{slug}"● CATEGORY_SAVE_AS = "category/{slug}/index.html"● TAG_URL = "tag/{slug}"● TAG_SAVE_AS = "tag/{slug}/index.html"● AUTHOR_URL = 'author/{slug}'● AUTHOR_SAVE_AS = 'author/{slug}/index.html'● PAGINATION_PATTERNS = ((1, '{base_name}/', '{base_name}/index.html'),● (2, '{base_name}/page/{number}/', '{base_name}/page/

{number}/index.html'))

Temas

Temas

● 75 temas no Repositório Oficial!(pelican-3.4)$ git clone --recursive https://github.com/getpelican/pelican-themes ./.themes

● Mudando o tema:(pelican-3.4)$ vim pelicanconf.py

THEME = “.themes/pure”

(pelican-3.4)$ make html && make serve

Pure

Mockingbird

Pelican-Sober

BT3-Flat

Faça o seu!

Plugins

Plugins● 64 Plugins no Repositório Oficial(pelican-3.4)$ git clone --recursive https://github.com/getpelican/pelican-plugins ./.plugins

● Novos “readers” (Asciidoc e Creole)● Assets & Image optimization● Podcasts/iTunes Feeds● Comentários com Google+● Gerador de PDF ● Estatísticas de Artigos● Related Posts● Gzip● Etc

Better Figures And Images● Adiciona atributos às tags <img>

– style="width: XXXpx; height: auto;"● Torna as imagens responsivas:

– RESPONSIVE_IMAGES = True

Optimize Images

● Utiliza os programas jpegtrans e optipng para reduzir as imagens

$ ls -la content/images/logo.jpg output/images/logo.jpg

-rw-rw-r-- 1 magnun magnun 839358 Set 18 00:30 content/images/logo.jpg

-rw-rw-r-- 1 magnun magnun 797295 Set 18 00:30 output/images/logo.jpg

● Redução de 42063 bytes (~42K)

Pelican YouTube & VIMEO

● Cria tags rst para facilitar a inclusão de vídeos:.. youtube:: 37818131

:width: 800

:height: 500

:align: center

.. vimeo:: 37818131

:width: 800

:height: 500

:align: center

Related Posts● Quando habilitado cria a variável article.related_posts:<ul>

{% for related_post in article.related_posts %}

<li><a href="{{ SITEURL }}/{{ related_post.url }}">{{ related_post.title }}</a></li>

{% endfor %}

</ul>

Touch● Configura corretamente o timestamp dos artigos:● Antes:$ ls -la output/hello-world.html

-rw-rw-r-- 1 magnun magnun 4649 Set 18 00:54 output/hello-world.html

● Depois:$ ls -la output/hello-world.html

-rw-rw-r-- 1 magnun magnun 4649 Mar 10 2014 output/hello-world.html

$ grep ":date:" content/articles/hello-world.rst

:date: 2014-03-10 15:17

GZIP● Antes:$ curl -Is http://mysite.org | grep Length

Content-Length: 77688

$ curl -Is -H 'Accept-Encoding: gzip' http://mysite.org | grep Length

Content-Length: 10933

● Resposta 7.1 vezes menor● Economia de 66.755 Bytes

Migrando

Exportando & Importanto

● Para exportar seus artigos do Wordpress:– Tools > Export

● Em seguida:$ cd mysite/content/articles

$ pelican-import --wpfile mysite-articles.wordpress.2014-02-17.xml -o .

● Remover metadados desnecessários:$ sed "/^:author:/d" *.rst -i

$ sed "/^:slugs:/d" *.rst -i

Imagens● Baixando todas as imagens referenciadas:$ cd ../images

$ for img in `grep -i "\.jpg\|\.jpeg\|\.png\|\.gif" ../articles/*.rst | sed "s/^.*: \(http:.*\)/\1/" | uniq`; do \

wget $img --no-clobber; \

done

$ cd ..

● Corrigindo referências$ cd ../articles$ sed "s#http://.*/\(.*\.\(png\|jpg\|jpeg\|gif\)\)#{filename}/images/\1#" *.rst -i

● Referência Correta.. image:: {filename}/images/image_name.png

● Remover referências ao site:$ sed "s#http://mysite.org##" *.rst -i

Em Produção

NGINX

● Instalação:– Debian

$ sudo aptitude install nginx

– Fedora $ sudo yum install nginx

– Arch Linux $ sudo pacman -S nginx

NGINXServer {

# Config Básica

listen *:80;

server_name mysite.org;

index index.html;

root /var/www/MySite/output;

try_files $uri.html $uri/index.html $uri =404;

error_page 404 /404;

# Logs

error_log /var/log/nginx/mysite-error.log warn;

access_log /var/log/nginx/mysite-access.log;

NGINX # GZIP

gzip_static on;

# Browser Caching

location ~* \.(js|css|eot|otf|woff|ttf)$ {

expires 1w;

}

location ~* \.(jpg|jpeg|png|gif|ico|svg)$ {

expires 2w;

}

location / {

expires 1d;

}

}

Git, Gitolite & Hooks

● Tutorial de Instalação e Configuração● Vamos utilizar o post-update hook● Possivelmente em: /home/git/repositories/mysite.git/hooks/post-update

Post-update#!/bin/sh

branch=`echo $1 | cut -d'/' -f 3`

OUT=/var/www/MySite

case $branch in

"master")

echo "Checking-out working copy..."

rm -rf $OUT/*

GIT_WORK_TREE=$OUT git checkout -f

echo "Generating blog..."

cd $OUT; make publish

echo "Fixing permissions..."

chown -R git:www-data $OUT/output/*

chmod -R 775 $OUT/output/*

echo "Done!"

break;;

*)

echo "Nothing to do here!"

break;;

esac

Fluxo de Publicações● Cria conteúdo e testa alterações localmente:$ vim content/articles/novo-artigo.rst

$ make html && make serve

$ firefox locahost:8000

● Faz o commit:$ git add content/articles/novo-artigo.rst

$ git commit -m “Adicionado novo artigo”

● Atualiza repositório$ git push origin master

Medições Reais

Hardware● Antigo:

– Servidor físico compartilhado com outras 3 instâncias do Wordpress:● CPU: Intel Xeon 3060 DualCore 32 Bits - 2.40GHz

– Cache: 4096 KB● Memória RAM: 4 Gbytes

● Atual:

– Servidor virtual dedicado:● CPU: QEMU Virtual CPU version 1.0 64 Bits - 2,0GHz

– Cache: 4096 KB● Memória RAM: 500 MByte

Overall

Load Speed & Size

Tempos de Resposta

Tamanho da Resposta

Consumo● Consumo de memória médio:

– 200 M● Picos de memória em:

– 300M

Vantagens● Mitiga 99,99% de falhas de segurança● Fácil hospedagem (HTML puro)● Facilmente replicável● Sem banco de dados● Exige pouco hardware (um droplet na Digital Ocean)● Utiliza uma linguagem mais amigável● Temas e Plugins mais simples, compreensíveis e otimizáveis● Versionamento de código em Git com cópias locais distribuídas

– Permitindo múltiplos autores● GitHub para Código fonte e/ou GH Pages● Depoy automatizado e encriptado

Desvantagens

● CLI● Interface não muito amigável para iniciantes● “Trabalho manual”● Não posso publicar de qualquer lugar

Mais Informações● Meus artigos:

– http://mindbending.org/pt/category/pelican● Pelican:

– http://docs.getpelican.com/en/3.4.0/– http://blog.getpelican.com/

● Templates Jinja:– http://jinja.pocoo.org/– http://jinja.pocoo.org/docs/dev/

Perguntas?

Obrigado