Wiki do André

Partilha de conhecimento

Configuração da seedbox com o Raspberry Pi

Este artigo foi arquivado. Isto significa que o artigo não será mais atualizado e pode conter erros ou omissões.

Objetivo: ter um cliente de torrent funcional, automático, com pouca necessidade de intervenção, partilha de rede/internet dos ficheiros completos e com baixo consumo energético. Isto requer que instalemos alguns pacotes no sistema:

  • Transmission-daemon, a aplicação principal da seedbox, que permitirá transferir torrents
  • Samba, para partilhar os ficheiros transferidos na rede local, com permissões de leitura e escrita
  • Lighttpd, para partilhar os ficheiros na Internet, com permissões de leitura, e protegido com password

Opcionalmente, podem-se instalar estes pacotes adicionais para facilitar o trabalho de administração:

sudo apt-get install vim htop

Montagem da pendrive USB

Pretende-se utilizar uma pendrive/flashdrive USB de 1GB, com sistemas de ficheiros FAT, que irá estar sempre ligada ao Raspberry Pi. Criar a pasta, com permissões de root, onde a pendrive será montada:

cd /media
sudo mkdir pendrive

Assumindo que a drive está em /dev/sda1, editar o ficheiro /etc/fstab e incluir a seguinte linha no final:

/dev/sda1       /media/pendrive vfat    rw,auto,umask=0,uid=1000,gid=1000,iocharset=utf8,noexec,nosuid  0       0

Esta configuração irá montar a pendrive com sistema de ficheiros FAT no arranque, com permissões de leitura e escrita para qualquer utilizador do sistema. As permissões são aplicadas as futuras pastas criadas. As flags noexec e nosuid trazem alguma segurança adicional, pois desta forma não é possível correr scripts a partir da pen (por exemplo, um script malicioso transferido a partir de um torrent não poderá ser executado na pasta de download pois o volume não permite a execução de scripts).

Configuração do Samba

O Samba irá permitir o acesso pela rede local aos ficheiros transferidos pela Seedbox. Instalar o Samba:

sudo apt-get install samba

Abrir o ficheiro /etc/samba/smb.conf e adicionar o seguinte conteúdo:

[Downloads]
        comment = Ficheiros transferidos via torrent
        path = /media/pendrive/
        guest ok = yes
        writeable = yes
        create mask = 0666

Esta configuração irá criar uma pasta partilhada chamada “Downloads” ligada à pasta onde iremos ter os ficheiros transferidos. Esta pasta irá ser acessível sem autenticação. Atualizar o Samba com as novas configurações:

sudo service samba reload

Se tudo correr bem, em sistemas Windows irá aparecer um computador chamado “RASPBERRYPI” com uma partilha “Downloads”, que se deve encontrar vazia neste momento.

Configuração do Transmission

O Transmission é a aplicação principal que irá dar vida à seedbox. Instalar o Transmission:

sudo apt-get install transmission-daemon

O Transmission deve começar de imediato. Como vão ser feitas novas configurações, o programa deve ser encerrado:

sudo killall transmission-daemon

No ficheiro de configuração do Transmission, em /etc/transmission-daemon/settings.json, alterar as seguintes opções:

  • cache-size-mb pode ser trocado para outro valor, por exemplo, 16 ou 32 MB, consoante a velocidade de Internet. A ideia é minimizar o número de escritas na drive USB (maior valor de cache), mantendo um bom compromisso com o tempo até que a cache fica escrita em disco (valores menores são mais rápidos a escrever). No meu caso, tenho uma pen com velocidade de escrita em torno de 4 MB/s. A minha Internet atinge velocidades de pico de 1 MB/s. Esta configuração de 16 MB de cache permite uma escrita de 16 MB a cada 16 segundos (tempo para encher o buffer até ser forçada a escrita) (1 MB/s × 16), e essa escrita demora cerca de 4 segundos (16 MB ÷ 4 MB/s).
  • download-dir deve ser a pasta que foi criada para a pendrive, isto é, /media/pendrive
  • download-queue-size redefinido para 1, para que apenas seja transferido um ficheiro de cada vez (reduz escrita simultâneas à pendrive)
  • encryption redefinido para 2, obriga a que as ligações de entrada sejam cifradas. Pode reduzir o número de peers.
  • peer-limit-global é a quantidade de peers que se ligam globalmente ao Raspberry Pi. Devido a problemas com muitas ligações, li que o valor recomendado deveria ser cerca de 100 a 200 para o antigo modelo B (optei por 150)
  • peer-limit-per-torrent reduzi para 40, de modo a diminuir o tráfego
  • peer-port-random-on-start permite alterar o porto de entrada de ligações. Pessoalmente, prefiro em aleatório para que o porto seja diferente cada vez que o programa inicia ⇒ valor true
  • port-forwarding-enabled colocado a true para permitir que o router abra o porto certo automaticamente. Se o router não suportar NAT ou UPnP, desligar esta opção e a anterior
  • ratio-limit e ratio-limit-enabled devem ser alterados conforme as capacidades da Internet/preferências do utilizador.
  • rpc-password deve ser mudada para uma password em claro entre aspas. No próximo arranque do programa, esta variável é substituída pela versão cifrada, logo não fica exposta no ficheiro de configuração.
  • rpc-whitelist deve ser mudado para 127.0.0.1,192.168.1.*, de modo a permitir a entrada de ligações ao painel Web vindas da rede local

Estas opções são as que considero essenciais. Existem outras configurações que podem ser mudadas consoante a situação atual. Gravar o ficheiro, e reiniciar o daemon:

sudo service transmission-daemon start

Sabendo o IP do Raspberry Pi (com o ifconfig, por exemplo), é possível colocar num browser da rede local o endereço que irá levar ao painel de downloads. Por exemplo, se o endereço for 192.168.1.4, o endereço do painel é:

http://192.168.1.4:9091

O username é transmission e a password é a escolhida na configuração. Para os que tiverem um dispositivo Android, podem ver na secção "Ferramentas Android" algumas apps para gerir a seedbox.

Configuração do Lighttpd

O Lighttpd permitirá o acesso exterior aos ficheiros acabados de transferir. O acesso é protegido por password e é apenas acessível para leitura. Instalar o lighttpd:

sudo apt-get install lighttpd

Abrir o ficheiro /etc/lighttpd/lighttpd.conf e alterar a configuração:

# ativar apenas os módulos necessários
# - access para proibir o acesso a certos ficheiros (~, .inc)
# - auth para proteger o servidor com password de acesso exterior
# - acccesslog para registar os acessos ao servidor num ficheiro
server.modules = (
        "mod_access",
        "mod_auth",
        "mod_accesslog",
#       "mod_compress",
#       "mod_alias",
#       "mod_redirect",
#       "mod_rewrite",
)

# configurar a raiz do servidor e os caminhos dos diversos logs
server.document-root        = "/media/pendrive"
server.upload-dirs          = ( "/var/cache/lighttpd/uploads" )
server.errorlog             = "/var/log/lighttpd/error.log"
server.pid-file             = "/var/run/lighttpd.pid"
server.username             = "www-data"
server.groupname            = "www-data"
server.port                 = 80
server.tag                  = "lighttpd"   # ocultar versão do lighttpd

index-file.names            = ( "index.html", "index.html", "index.lighttpd.html" )
url.access-deny             = ( "~", ".inc" )
static-file.exclude-extensions = ( ".php", ".pl", ".fcgi" )

#compress.cache-dir          = "/var/cache/lighttpd/compress/"
#compress.filetype           = ( "application/javascript", "text/css", "text/html", "text/plain" )

# ativar listagem de diretórios da pendrive para aparecer numa página web
dir-listing.activate = "enable"
dir-listing.set-footer = "lighttpd"

# ativar a autenticação
auth.debug = 2
auth.backend = "plain"
auth.backend.plain.userfile = "/etc/lighttpd/user_auth"
auth.require = ( "/" =>
        (
        "method" => "basic",
        "realm" => "Private access area",
        "require" => "valid-user"
        )
)

accesslog.filename = "/var/log/lighttpd/access.log"

# default listening port for IPv6 falls back to the IPv4 port
include_shell "/usr/share/lighttpd/use-ipv6.pl " + server.port
include_shell "/usr/share/lighttpd/create-mime.assign.pl"
include_shell "/usr/share/lighttpd/include-conf-enabled.pl"

Neste ficheiro, apenas estão incluídos os módulos essenciais para listar os ficheiros transferidos e protegê-los com password. Os restantes módulos não são desativados por não serem especialmente úteis para o caso. É necessário alterar a pasta raiz www para a raiz da pendrive em /media/pendrive. Também pode ser útil definir os caminhos dos logs para garantir que não há acessos indevidos ao servidor. Deve-se ativar a listagem de ficheiros para que os ficheiros transferidos possam aparecer numa listagem quando vistos através do browser. Por último, protegemos os ficheiros com username/password. Os acesso incorretos são registados num ficheiro de texto. Os nomes de utilizador e passwords permitidos são registados num ficheiro de texto /etc/lighttpd/user_auth na seguinte forma:

utilizador:password
utilizador2:outrapassword

Isto irá criar dois utilizadores, cada um com a sua respetiva password. Protejam o ficheiro de password para ser lido apenas pelo lighttpd, da seguinte forma:

sudo chown www-data:www-data /etc/lighttpd/user_auth
sudo chmod 640 /etc/lighttpd/user_auth

Isto irá alterar o proprietário do ficheiro para o lighttpd (www-data) e irá remover as permissões de leitura para outros utilizadores. Reiniciem o servidor com a nova configuração:

sudo service lighttpd restart

Acedam ao IP onde têm o Raspberry Pi e irá ser pedida a password. Insiram a password escolhida na configuração. Devem ver os ficheiros listados na interface web. Para o acesso exterior, pode ser preciso fazer um forward no router do porto 80 ou outro exterior, para o porto 80 do vosso Raspberry Pi.

Gestão de logs

Embora pareça uma tarefa chata, é útil manter logs para acompanhar os serviços que correm no Raspberry Pi. Através dos logs, é possível ver se as coisas estão a correr bem, ou perceber o que está a correr mal. Podem também servir para manter indicadores de desempenho ou simplesmente ver a utilização do servidor, por curiosidade.

Com o decorrer do tempo, é possível que os logs fiquem muito cheios, reduzindo a sua utilidade e a performance dos serviços. Para fazer a gestão dos logs de forma automática, é possível usar o logrotate para os gerir automaticamente.

Logs do lighttpd (/etc/logrotate.d/lighttpd)

/var/log/lighttpd/*.log {
        weekly
        missingok
        rotate 6
        notifempty
        sharedscripts
        postrotate
             if [ -x /usr/sbin/invoke-rc.d ]; then \
                invoke-rc.d lighttpd reopen-logs > /dev/null 2>&1; \
             else \
                /etc/init.d/lighttpd reopen-logs > /dev/null 2>&1; \
             fi; \
        endscript
}

Logs do transmission (/etc/logrotate.d/lighttpd/transmission)

/var/log/transmission/daemon.log {
        weekly
        missingok
        rotate 6
        notifempty
}

Estas configurações permitem manter um ficheiro separado por cada semana durante pouco mais de um mês (~6 semanas). Na sétima semana, o log mais antigo é apagado.

Ferramentas Android

Descobri recentemente duas ferramentas Android para ajudar a gerir o servidor:

  • Remote Transmission permite gerir pelo Android o Transmission. Dá para ver os downloads atuais, pará-los, retomá-los ou definir um limite de velocidade.
  • Juice SSH é um cliente de SSH suficiente para correr pequenos comandos e ver o estado do sistema.

Referências

Para criar uma seedbox com outros aspetos, como discos externos NTFS, recomendo a leitura destes artigos: