Showing posts with label arch linux. Show all posts
Showing posts with label arch linux. Show all posts

Monday, March 18, 2013

Raspberry Pi: build a home web server (BETTER WAY)!

Raspberry Pi: build a home web server (BETTER WAY)!

Long time no see people!!! Depois de praticamente 2 meses sem postar nada estou eu aqui novamente!
Como podem perceber o nome da postagem (BETTER WAY) quer dizer que eu aprendi muito nestes últimos 2 meses! Foram bem corridos, com o fim do ano e viagens. Enfim, vamos la!!

Bom, como vocês devem se lembrar do meu último post estava criando um servidor web local (intranet)  usando o raspberry pi. Não vou repassar toda a parte introdutória do post passado nesse, aqui vou direto ao ponto!

Minha stack final até o momento:
  1. Raspberry Pi (claro!!);
  2. Arch Linux Arm (2013-01-22);
  3. dnsmasq (i trully love this one!!!);
  4. nginx;
  5. supervisor;
  6. gunicorn;
  7. python2;
    1. flask;
Beleza, tudo só isso... vou mostrar os passos para instalar esses caras e deixa-los funcionando. Lembrando que, eu não me responsabilizo por quaisquer dados causados pela instalação e posterior uso de seus equipamentos.
Não estou levando em consideração precauções de segurança, no meu caso o acesso a esses dispositivos passa por um router, o qual fornece o DNS e outras implementações como firewall.

Instalação

Bom, o primeiro passo é instalar a versão do Arch Linux Arm no cartão de memória que será inserido no pi. Este passo já fora explicado no tutorial anterior (la eu usei o Arch Linux Arm), então não irei me alongar aqui.
Depois de instalar a imagem conecte o SD no pi e ligue-o na energia elétrica, se a tela do monitor ficar pequena (cortando o shell), bom nesse caso você precisa alterar o arquivo de configuração do pi. A melhor opção é desligar o pi, tirar o SD dele e conectar no pc novamente.
Altere o arquivo config.txt que estará em /boot/config.txt. Eu apenas habilitei e fui mudando os valores de framebuffer e overscan até ficarem legal no meu monitor. O problema de se alterar essas informações desta maneira é que cada outro terminal pode precisar de novas configs.

Feito isso o próximo passo é atualizar todo o sistema. Para logar no Arch Linux pela primeira vez o usuário e senha são root e root.
Após o login execute:
pacman -Syyu

Isso irá atualizar todo o sistema e os repositórios cadastrados.

Agora vamos instalar todos os packages que iremos utilizar! Todos mesmo!!! One line to rule them all!!! HAHAHAHAAHA

pacman -S sudo base-devel openssl pcre zlib libxml2 udev-automount dnsmasq nginx supervisor mongodb python2 python-pip2

Legal neh?? Mas o que fizemos/instalamos???

O principais são o base-devel que irá instalar mais um tonelada de packages e libs incluindo o compilador gcc.
O udev-automount que irá automagicamente montar as unidades que forem conectadas a porta usb do pi, facilitando nossa vida ao inserir um stick usb como unidade de armazenamento.
E claro todo o resto da stack. Se você não quiser instalar algum dos packages é só não coloca-lo na linha listada acima.

Ainda é necessário instalar o flask!! Para isso execute:
pip2 install flask Flask-Assets gunicorn pymongo mongoengine

Acabamos de instalar o flask, Flask-Assets (que junta todos os arquivos .js em um único javascript e css tb), gunicorn (nosso servidor WSGI local que executa código python) e os binds python para o servidor mongodb.

O próximo passo é definir para nosso raspberry pi um endereço de ip fixo, o motivo disso é que queremos que o dnsmasq consiga redirecionar algo do tipo mypi.lan.internal.server para o ip do nosso pi e chamar consequentemente nosso site web!
Como eu estou usando um route, entrei na configuração do mesmo e adicionei um endereço fixo para meu raspberry pi (192.168.1.48).
Agora é preciso alterar 2 arquivos de sistemas, ambos estão em /etc/ e são:

  • hosts
  • resolv.conf.head
No hosts (não hosts.conf hein!) basta acrescentar:
192.168.1.48       mypi        localhost

Note que o endereço é mypi, o restante do nome o dnsmasq irá colocar para nós (iremos configurar isso la).

No resolv.conf.head (crie ele se não existir!) devemos acrescentar:
nameserver 192.168.1.48

E finalmente vamos alterar o arquivo do dnsmasq para que ele funcione:
Linha 62:

local=/lan.internal.server/

Linha 99:
no-dhcp-interface=eth0
Linha 119:
expand-hosts
Linha 128:
domain=lan.internal.server


Feito essas alterações nos arquivos de configuração de rede e do dnsmasq devemos alterar as configurações do nginx. Para configurar um novo vhost procure pelo arquivo do nginx, ele vai estar em /etc/nginx/nginx.conf.
Embaixo esta a configuração que tenho utilizado juntamente com o gunicorn. Atenção apenas as pastas (você deve colocar o caminho para seus arquivos estáticos [/media/www/static], onde estão os arquivos do seu programa [/media/www/home] e claro o ip:port na qual o gunicorn será executado [no meu caso 192.168.0.25:8080]). O resto pode ser deixado como padrão... lembrando que aqui, não ainda não ativei compactação via gzip no nginx (e vai ficar para uma próxima).


server {
    listen       80;
    server_name  mypi.lan.internal.server;


    location ~ ^/(jpg|jpeg|gif|png|ico|css|zip|tgz|gz|rar|bz2|pdf|txt|tar|wav|bmp|rtf|js|flv|swf|images|flash|media|static)/

    {
        root   /media/www/static/;
        expires 1d;
    }


    location / {

        #root   /media/www/home/;
        #index  index.html index.htm;
    try_files $uri @proxy_to_app;
    }


location @proxy_to_app {

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_redirect off;
proxy_pass http://192.168.0.25:8080;
}
}


Depois disso é hora de configurar o supervisor para executar nosso processo do gunicorn que irá carregar nossa app em flask!!!

O bacana do supervisor é que com o comando echo_supervisord_conf > /etc/supervisord.conf você gera um arquivo de conf padrão! ;) bem simple não?
Entretanto apenas isso não garante que o gunicorn seja executado, por conseguinte devemos alterar o arquivo de conf criado acrescentando as seguintes linhas acima da explicação de como subir um programa usando o supervisor. Procure por [program:theprogramname] no arquivo e acrescente acima ou abaixo:


[program:gunicorn]
command=gunicorn app:app -b 192.168.0.25:8080
directory=/media/www/home
autostart=true
autorestart=true
redirect_stderr=True


Atenção para colocar o mesmo ip:port que especificado la no nginx hein!! Outro detalhe importante é o de colocar o nome do arquivo python que representa o app do flask. No meu caso, eu deixei o mesmo padrão que é descrito nos docs do flask, ou seja arquivo app.py, class name app, por isso do gunicorn app:app.

Pronto! Agora só subir todos os serviços e torcer pra tudo estar configurado corretamente!
systemctl enable dnsmasq
systemctl start dnsmasq
systemctl enable nginx
systemctl start nginx

systemctl enable supervisord
systemctl start supervisord


Bom, acesse a sua url padrão no navegador e você perceberá que não é carrega, não se esqueça de configurar o dns primário e secundário em sua conexão com a internet. Essa parte é importante caso seu roteador (assim como o meu) não permita configurar um dns interno.


Referências:

Monday, December 10, 2012

Raspberry Pi: UI + web server!

Raspberry Pi: UI + web server!


Boas pessoal, desculpem a demora em postar conteúdo, fiquei afastado esse mês todo... não só devido ao trabalho e vida pessoal, mas também a projetos que estive fazendo! :D

Bom em um destes meus projetos, resolvi que iria gastar um tempo comprando um raspberry pi (é eu sei, ja deveria ter feito isso antes), mas eu estava relutando em comprar um, visto que ja possuo uma Pandaboard ES ( http://pandaboard.org/ ).
Mas enfim, comprei um, e vou colocar a minha primeira experiência com ele... do momento que comprei até onde parei, ou seja, um servidor web em casa.

Após ouvir muita coisa sobre o raspberry pi, desde uma galera usando pra educação até pra produção resolvi testar!
Vi muita gente falando onde comprar, que é difícil, e realmente é, muita gente esta atrás dessa plaquinha, assim como do arduino. Mas pra facilitar minha vida, decidi que não iria comprar apenas a placa, afinal é preciso muito mais do que apenas ela para rodar.
Entrei no site da Adafruit e comprei o starter kit deles ( starter kit ). Realmente o preço não é dos mais baratos, mas nada que um cartão internacional e uma conta do paypal não possam lhe auxiliar no pagamento.
Comprei e fiquei esperando (detalhe que no momento que escrevo o post 10/12/12 eles não possuem em estoque, mas fique de olho), 2 semanas depois chegou em casa o pacote. Tudo certo, vieram todos os items, em suma o que vem:

  • Raspberry Pi model B (pra ver a diferença entre o modelo A e B - http://elinux.org/RPi_Hardware);
  • Cartão Micro SD + Adapter de 4GB;
  • Caixa de acrílico da Adafruit! :)
  • Raspberry Pi  Badge... :) (eu colei o mesmo em cima da caixa de acrílico! ficou show olha a foto!)
  • E outras coisas + ...
Legal neh, chegou abri e blz! Agora você se pergunta o que fazer? Bom, eu não tenho um monitor / televisor com entrada HDMI e não estava afim de usar a saída RCA também, então eu adiquiri um conversor hdmi to vga no dealextreme. Ok, eu não esperei o pi chegar pra fazer isso, na verdade ambas mercadorias chegaram praticamente juntas.




PS: além de usar no pi, eu tenho uma pandaboard, como falei no começo do post, então esse conversor é pra usar nos dois!

O próximo passo é ligar tudo... conectei todos os componentes, mas ainda falta uma coisa pra sair rodado o pi... instalar o SO que você deseja usar.
Como início, fui testar o Occidentalis v0.2 que é uma distro modificada pela Adafruit da Raspbian “wheezy”.
Fiz o download e instalei no cartão SD seguindo os passos do tutorial que esta no link acima da distro. Iniciei o pi e bing! Estava la a UI do Occidentalis, bem simples e rápido... mas eu não gostei.
Comecei a olhar na net as opções e vi que era possível instalar o Arch Linux ARM, uma distro derivada da Arch Linux que funciona em processadores ARM e pra minha surpresa a pandaboard também é suportada! FTW \o/

Para instalar no pi, bem simples! Simples até demais, faça o download da imagem e grave a mesma no SD card, eu usei o image writer que ja vem pré-instalado no Linux Mint para fazer isso e foi de boa... Reiniciei novamente o pi, agora com o cartão sd e a instalação do arch e depois de uns 10 segundos eu tinha um shell linux pronto para usar!!

Agora o primeiro passo é atualizar seu Arch Linux... faça o login usando root : root.
O shell será será liberado, para atualizar o Arch Linux utiliza-se do pacman, então realize um:

$ pacman -Syyu

Isso fará com que todos os repos sejam atualizados e fará em seguida um update no sistema... aguarde vários minutos! Não se esqueça de estar conectado em uma rede de dados para isso, claro...

Depois de atualizar o sistema, minha sugestão é alterar a senha do root e criar um novo usuário!

Use o comando abaixo para alterar a senha do root!

$ passwd

E em seguida faça:

$ adduser

E siga as instruções... quase tudo pode ser o padrão mesmo... só não esqueça da senha!
Feito isso, você, assim como eu pode desejar ter uma UI para interagir mais facilmente (ou instalar por diversão mesmo!).
Eu segui os tutoriais na wiki do Arch Linux para instalar o LXDM + XFCE4 e deixar o pi +/- com a cara do meu desktop (não que isso fosse necessário, ja que ele será um servidor, mas mesmo assim...).

Antes de mais nada para executar qualquer UI em linux deve-se instalar o X Windows System. Para isso basta você executar:

$ pacman -S xorg-server xorg-apps xorg-xinit xorg-twm xorg-xclock xterm xorg-drivers

Isso vai garantir que o x server todo será instalado, assim como qualquer outros drivers e widgets necessários.

Depois vamos instalar o lxdm e xfce4:

$ pacman -S lxdm xfce4 xfce4-goodies sudo gedit

No meu caso eu ja instalei o sudo e gedit também, apesar do gedit ser um pouco pesado para carregar... ainda não testei pra ver se o emacs funciona de boa.

Pronto!!

Para executar o lxdm e xfce4 ao iniciar o pi, ainda precisamos alterar o arquivo /etc/lxdm/lxdm.conf e mudar a linha session=/usr/bin/startlxde para session=/usr/bin/startxfce4 .

Para editar o arquivo: 

$ sudo nano /etc/lxdm/lxdm.conf

E em seguida executar o systemd para ativar o serviço do lxdm:

$ systemctl enable lxdm.service

Reinicie o pi, agora você deve ter uma interface gráfica aparecendo, faça o login com o usuário que você criou e pronto!

Eu enfrentei um problema bem chato, meu monitor não esta suportando 100% o hdmi do pi, para isso bastar alterar a propriedade disable_overscan do arquivo de configuração do Arch Linux.
Execute:

$ sudo nano /boot/config.txt

Desabilite a linha (tire o # da frente), disable_overscan=1 . Além disso altere as propriedades do overscan logo abaixo, é tentativa e erro mesmo, coloque um valor e reinicie o pi pra ver se deu certo.

Seu startup inicial esta pronto... entretanto...

Quando comprei meu raspberry pi que vem no starter kit da Adafruit, notei que ele não possui conexão wireless (uma pena não??), mas isso pode ser remediado comprar um wireless module, olhei no site e achei esse: Miniature WiFi (802.11b/g/n) Module: For Raspberry Pi and more, comprei junto.

Mas para você ter uma interface bacana para interagir com o modulo é preciso instalar umas coisas a mais:

pacman -S networkmanager network-manager-applet xfce4-notifyd 
$ systemctl enable NetworkManager.service
$ systemctl start NetworkManager.service

Isso vai instalar e inicializar uns widgets bacanas para você controlar seu usb wireless e conetar na sua rede wifi sem precisar digitar comandos no shell!! :D
Por padrão o driver desse dispositivos usb que comprei vem por default ativado, bastando apenas a reinicialização do pi pra tudo funcionar.

Pra finalizar vamos instalar o nginx, que é um web server muito bom e rápido.

$ pacman -S nginx
systemctl enable nginx
systemctl start nginx

Se você quiser um web browser para rodar no seu pi, instale o midori, pois o firefox e chrome não são suportados na arquitetura x86 (bom pelo menos eles não estão listados no repo do arch linux como disponíveis para arm).

$ pacman -S midori

E é isso ae, por enquanto é isso... no próximo post vou mostrar como instalar o python e uWSGI para fazer seu web site rodar no pi!

falowaer