Workshop How2Homelab

Orador

Versão do Guião

v1.0.0 (18/02/2025)

Guião

Instalação do Sistema Operativo e configuração do IP estático

  1. Transferir o Raspberry Pi Imager do site oficial da Raspberry Pi (https://www.raspberrypi.org/software/) e instalar.

  2. Inserir o cartão SD no computador e abrir o Raspberry Pi Imager.

  3. Escolher o modelo do Raspberry Pi, o sistema operativo e o cartão SD.

    • Modelo: Raspberry Pi 4
    • Sistema Operativo: Other general-purpose OS -> Ubuntu -> Ubuntu Server 24.04.1 LTS (64-bit)
  4. Clicar em "Write" e aguardar que o processo termine.

  5. Configurar IP estático no Raspberry Pi.

    1. Desligar e voltar a ligar o cartão SD do computador.

    2. Entrar na partição system-boot do cartão SD.

    3. Editar o ficheiro chamado network-config com as seguintes linhas:

         version: 2
         wifis:
            renderer: networkd
            wlan0:
               dhcp4: false
               dhcp6: true
               optional: true
               addresses: [192.168.1.X/24]
               nameservers:
                  addresses: [127.0.0.1, 8.8.8.8]
               routes:
                  - to: default
                    via: 192.168.1.1
               access-points:
                  "SSID (should already be defined)":
                     password: "should already be defined"
      

      Atenção: Substituir 192.168.1.X pelo IP estático desejado, ou seja, o IP que queremos atribuir ao Raspberry Pi. No caso deste workshop, X tomará o valor de 100 + número da mesa.
      Se se quiser atribuir um IP dinâmico, basta remover as linhas addresses, routes e nameservers, e alterar dhcp4 para true.

    4. Guardar e fechar o ficheiro.

    5. Ejetar o cartão SD do computador e inserir no Raspberry Pi.

  6. Ligar o Raspberry Pi e aguardar que o sistema operativo inicie.

Ligação por SSH

  1. Abrir um terminal no computador e executar o comando ssh username@IPhere, onde IPhere é o IP estático configurado anteriormente e username é o utilizador configurado. Por omissão, o utilizador é ubuntu.

    ssh ubuntu@192.168.1.X
    

    Atenção: Substituir 192.168.1.X pelo IP estático configurado anteriormente.

  2. Introduzir a password de acesso ao Raspberry Pi (por omissão, ubuntu).

  3. O Raspberry Pi está agora acessível por SSH.

Instalação do Docker

  1. Remover a versão do Docker que vem com o Ubuntu.

    sudo apt-get remove docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc
    
  2. Instalar o Docker de acordo com a documentação oficial (https://docs.docker.com/engine/install/ubuntu/).

    # Add Docker''s official GPG key:
    sudo apt update
    sudo apt install ca-certificates curl
    sudo install -m 0755 -d /etc/apt/keyrings
    sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
    sudo chmod a+r /etc/apt/keyrings/docker.asc
    
    # Add the repository to Apt sources:
    echo \
      "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \
      $(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}") stable" | \
      sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
    sudo apt update
    
    # Install Docker:
    sudo apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
    
  3. Adicionar o utilizador ao grupo docker.

    sudo usermod -aG docker $USER
    
  4. Sair da sessão SSH e voltar a entrar para que as alterações tenham efeito.

Instalação do Pi-Hole em Docker

  1. Criar uma pasta para o Pi-Hole.

    mkdir pihole
    cd pihole
    
  2. Criar um ficheiro docker-compose.yml com o conteúdo retirado da página oficial do Pi-Hole (https://github.com/pi-hole/docker-pi-hole#quick-start).

  3. Editar o ficheiro para ficar a gosto, de acordo com a documentação oficial do Pi-Hole e do Docker.

    • Para o workshop:
      • Comentar a linha 67:67/udp, cap_add e NET_ADMIN, já que são apenas necessárias para a configuração de um servidor DHCP, e não é isso que se pretende.
      • Alterar a variável TZ para Europe/Lisbon.
      • Alterar a porta 80 para 8081.
  4. Como o Ubuntu Server vem com um DNS resolver próprio para efeitos de cache, é necessário desativá-lo para que o Pi-Hole consiga ligar.

    sudo sed -r -i.orig 's/#?DNSStubListener=yes/DNSStubListener=no/g' /etc/systemd/resolved.conf
    sudo sh -c 'rm /etc/resolv.conf && ln -s /run/systemd/resolve/resolv.conf /etc/resolv.conf'
    sudo systemctl restart systemd-resolved
    
  5. Iniciar o Pi-Hole.

    docker compose up -d
    
  6. Ver os logs do Pi-Hole para descobrir a password de administração.

    docker compose logs
    
    • A password de administração é gerada aleatoriamente quando não é definida no ficheiro docker-compose.yml. Pode ser encontrada no output dos logs, na linha Assigning random password: <password>.
  7. Aceder ao Pi-Hole através do IP do Raspberry Pi e da porta definida no ficheiro docker-compose.yml (para efeitos do workshop, 8081).

    http://192.168.1.X:8081/admin
    
  8. Configurar o Pi-Hole para dar listen em todas as interfaces (necessário por causa do Docker).

    • Settings -> DNS -> Permit all origins
  9. Configurar um servidor DNS upstream.

    • Settings -> DNS
    • Escolher um servidor DNS upstream (por exemplo, Cloudflare, Google, OpenDNS, etc.)
  10. Configurar um domínio local, próprio para cada elemento do workshop, com CNAME de alguns subdomínios.

    • Adicionar um novo domínio local, por exemplo, rpiX.local, onde X é o número da mesa, com o IP do Raspberry Pi.
      • Local DNS -> DNS Records
    • Adicionar CNAMEs para alguns subdomínios, por exemplo, owncloud.rpiX.local, pihole.rpiX.local, etc.
      • Local DNS -> CNAME Records
  11. O Pi-Hole está agora a funcionar. Podemos definir o DNS do nosso computador para o IP do Raspberry Pi para que o Pi-Hole seja utilizado, e depois ver as estatísticas no dashboard, e os queries na secção Query Log.

Instalação do ownCloud em Docker

  1. Criar uma pasta para o ownCloud.

    mkdir owncloud
    cd owncloud
    
  2. Criar um ficheiro docker-compose.yml com o conteúdo retirado da página oficial do ownCloud (https://doc.owncloud.com/server/next/admin_manual/installation/docker/#docker-compose).

  3. Criar um ficheiro .env com as variáveis de ambiente necessárias para o ownCloud.

    cat << EOF > .env
    OWNCLOUD_VERSION=latest
    OWNCLOUD_DOMAIN=192.168.1.X:8082
    ADMIN_USERNAME=admin
    ADMIN_PASSWORD=admin
    HTTP_PORT=8082
    EOF
    
    • Nota: Substituir 192.168.1.X pelo IP do Raspberry Pi.
    • Nota: O nome de utilizador e password de administração não podem ser alterados mais tarde.
  4. Iniciar o ownCloud.

    docker compose up -d
    
  5. Aceder ao ownCloud através do IP do Raspberry Pi e da porta definida no ficheiro .env (para efeitos do workshop, 8082).

    http://192.168.1.X:8082
    
  6. O ownCloud está agora a funcionar. Podemos fazer login com o utilizador e a password definidos anteriormente, e começar a utilizar o serviço.

Instalação de um servidor web para servir de Reverse Proxy

Um reverse proxy é um servidor que recebe pedidos de clientes e os encaminha para um ou mais servidores de origem. Exemplos de servidores web que podem ser usados como reverse proxy são o Apache, o Nginx e o Caddy.

Neste workshop, eu vou demonstrar como usar tanto o Nginx como o Caddy como reverse proxy.

Nginx

  1. Instalar o Nginx.

    sudo apt install nginx
    
  2. Criar um ficheiro de configuração para o ownCloud.

    sudo nano /etc/nginx/sites-available/owncloud
    
    server {
        listen 80;
        server_name owncloud.rpiX.local;
    
        location / {
            proxy_pass http://192.168.1.X:8082;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto $scheme;
        }
    }
    
    • Nota: Substituir rpiX pelo número da mesa e 192.168.1.X pelo IP do Raspberry Pi.
  3. Ativar o ficheiro de configuração.

    sudo ln -s /etc/nginx/sites-available/owncloud /etc/nginx/sites-enabled/
    
  4. Repetir os passos 2 e 3 para o Pi-Hole.

    server {
        listen 80;
        server_name pihole.rpiX.local;
    
        location / {
            proxy_pass http://192.168.1.X:8081;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto $scheme;
        }
    }
    
  5. Testar a configuração do Nginx.

    sudo nginx -t
    
  6. Recarregar o Nginx.

    sudo systemctl reload nginx
    
  7. O Nginx está agora a funcionar como reverse proxy. Podemos aceder ao ownCloud e ao Pi-Hole através dos subdomínios definidos anteriormente.

Caddy

  1. Transferir o Caddy do site oficial (https://caddyserver.com/download) e instalar.

    sudo apt install caddy
    
  2. Criar um ficheiro de configuração para o ownCloud.

    sudo nano /etc/caddy/Caddyfile
    
    owncloud.rpiX.local {
        reverse_proxy http://192.168.1.X:8082
    }
    
    • Nota: Substituir rpiX pelo número da mesa e 192.168.1.X pelo IP do Raspberry Pi.
  3. Repetir os passos 2 para o Pi-Hole.

    pihole.rpiX.local {
        reverse_proxy http://192.168.1.X:8081
    }
    
  4. Testar a configuração do Caddy.

    sudo caddy validate
    
  5. Recarregar o Caddy.

    sudo systemctl reload caddy
    
  6. O Caddy está agora a funcionar como reverse proxy. Podemos aceder ao ownCloud e ao Pi-Hole através dos subdomínios definidos anteriormente.

Conclusão

O Raspberry Pi está agora a funcionar como um servidor de DNS com o Pi-Hole, um servidor de ficheiros com o ownCloud, e um servidor web com o Nginx ou o Caddy como reverse proxy. Podemos aceder a estes serviços através dos subdomínios definidos, e configurar o Pi-Hole para bloquear anúncios e trackers em toda a rede.

Referências