Streaming Está Quebrado III: A Fundação (SO, Docker e “Dia Um”)

Este post foi originalmente escrito em inglês. A tradução pode não refletir 100% das ideias originais do autor.

Agora que temos nosso hardware, podemos começar com a configuração do sistema do nosso servidor. O MiniPC que comprei veio com Windows instalado. Também é possível usar o sistema da Microsoft para o que queremos, mas é um desperdício ridículo de desempenho e energia.

Um Home Server robusto não é um computador desktop que fica ligado o dia todo: é um sistema dedicado. Vamos construir a fundação de software do zero, transformando o mini PC em uma infraestrutura de nível empresarial, pronta para rodar 24/7 sem intervenção humana.

Escolhendo e Configurando o Sistema Operacional

Mas… por que não Windows? O Windows consome cerca de 2GB a 4GB de RAM apenas para existir e rodar sua interface gráfica. Em nosso N100, isso é um desperdício, como eu disse, é jogar desempenho no lixo. Além disso, o Docker no Windows (via WSL2) adiciona uma camada de virtualização que pode impactar o desempenho de I/O e rede.

Não use Windows. Esqueça essa porcaria.

Aqui podemos usar qualquer Linux… sem interface. Um servidor não precisa de mouse, janelas ou papéis de parede.

Vamos instalar o Ubuntu Server sem interface gráfica. O servidor será controlado 100% via terminal (SSH) do seu PC principal. Isso garante que cada ciclo de CPU e megabyte de RAM seja dedicado ao que importa: seus serviços.

Claro, instalar o Ubuntu do zero adicionará algumas camadas de complexidade (não muitas). Atualizar repositórios, instalar dependências, configurar permissões de usuário, editar arquivos do sistema… É aí que as coisas podem dar errado e aparecem erros que custam caro meses depois.

Para isso, fiz um pequeno script que automatizará todas essas configurações iniciais. O código é autoexplicativo.

#!/bin/bash

if [ "$EUID" -ne 0 ]; then
  echo "Please run as root (sudo ./install.sh)"
  exit 1
fi

REAL_USER=$SUDO_USER
if [ -z "$REAL_USER" ]; then
  echo "Could not detect sudo user. Exiting."
  exit 1
fi

USER_UID=$(id -u $REAL_USER)
USER_GID=$(id -g $REAL_USER)
USER_HOME=$(getent passwd $REAL_USER | cut -d: -f6)
BASE_DIR="$USER_HOME/EmuleVision"

echo "Starting installation for user: $REAL_USER"
echo "Base Directory: $BASE_DIR"

apt update && apt upgrade -y
apt install -y curl gnupg ca-certificates lsb-release cifs-utils samba vim git net-tools intel-media-va-driver-non-free libmfx1 vainfo

if ! command -v docker &> /dev/null; then
    mkdir -p /etc/apt/keyrings
    curl -fsSL https://download.docker.com/linux/ubuntu/gpg | gpg --dearmor -o /etc/apt/keyrings/docker.gpg
    echo \
      "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
      $(lsb_release -cs) stable" | tee /etc/apt/sources.list.d/docker.list > /dev/null
    apt update
    apt install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin
    usermod -aG docker $REAL_USER
fi

usermod -aG render $REAL_USER
usermod -aG video $REAL_USER

mkdir -p $BASE_DIR/{downloads/torrents,media/{movies,tv,manga},books}
mkdir -p $BASE_DIR/Settings/{Qbittorrent,Prowlarr,Sonarr,Radarr,Jellyfin,Gluetun,Portainer,Homepage,Scrutiny,AdGuard,Kaizoku,Kavita,CalibreWeb,Filebrowser}

chown -R $REAL_USER:$REAL_USER $BASE_DIR
chmod -R 775 $BASE_DIR

cat <<EOF >> /etc/sysctl.conf
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1
net.ipv6.conf.lo.disable_ipv6 = 1
EOF
sysctl -p

sed -r -i.orig 's/#?DNSStubListener=yes/DNSStubListener=no/g' /etc/systemd/resolved.conf
sed -r -i 's/#?DNS=/DNS=1.1.1.1 8.8.8.8/g' /etc/systemd/resolved.conf
rm -f /etc/resolv.conf
ln -s /run/systemd/resolve/resolv.conf /etc/resolv.conf
systemctl restart systemd-resolved

cat <<EOF >> /etc/samba/smb.conf

[EmuleVision]
   path = $BASE_DIR
   writeable = yes
   guest ok = no
   create mask = 0775
   directory mask = 0775
   valid users = $REAL_USER
   force user = $REAL_USER
EOF

echo "Set SMB password for $REAL_USER:"
smbpasswd -a $REAL_USER
systemctl restart smbd

TZ=$(timedatectl show -p Timezone --value)

cat <<EOF > $BASE_DIR/.env
PUID=$USER_UID
PGID=$USER_GID
TZ=$TZ
VPN_USER=vpn_username_here
VPN_PASS=vpn_password_here
EOF

chown $REAL_USER:$REAL_USER $BASE_DIR/.env

echo "Installation complete."
echo "1. Edit $BASE_DIR/.env with your VPN credentials."
echo "2. Place your docker-compose.yml in $BASE_DIR."
echo "3. Reboot the system."

O que o script faz?

  1. Docker Nativo. Instala o Docker Engine diretamente da fonte oficial, garantindo a versão mais recente e segura, sem depender de pacotes desatualizados da distribuição. Tentar fazer isso no Windows com WSL é pedir por dor de cabeça.

  2. Drivers Intel QuickSync. O Ubuntu Server vem com drivers genéricos, o que afetará diretamente o desempenho do nosso N100 para transcodificação de vídeo. O script instala o intel-media-va-driver-non-free e configura as permissões de renderização (grupo render), garantindo que o Jellyfin tenha acesso direto ao hardware.

  3. Remoção de IPv6. Mais tarde focarei especificamente na parte de segurança, já que no meu caso escolhi proteger meu homeserver com uma VPN. Isso é opcional, mas garante a privacidade do seu servidor, especialmente se você planeja “adquirir” filmes ou séries por métodos alternativos. O script desabilita o IPv6 diretamente no Kernel do Linux (sysctl.conf). Dessa forma, nem o Docker, nem a VPN, nem o qBittorrent podem usar IPv6, eliminando fisicamente a chance de um vazamento. Lembre-se, vazamentos de IP via IPv6 são a falha de segurança número um em VPNs domésticas.

  4. Criação de Pastas e Estrutura Inicial. O script cria a árvore de diretórios /data/media e /data/downloads com as permissões de usuário corretas (PUID/PGID). Se isso for feito errado agora, os Hardlinks (cópias instantâneas sem duplicar espaço) falharão. Falaremos mais sobre esse tipo de cópia no próximo post.

Com isso, nosso servidor está pronto, seguro e otimizado em 2 minutos!

Mantenha simples!

PS: Chamei este projeto de EmuleVision. Mude para o que quiser.

Configurando um IP Estático (Da Maneira Correta)

Nosso servidor precisa de um IP Estático, isso é óbvio. Se o IP ficar mudando a cada reinício, nossa televisão perderá a referência para nosso servidor a cada mudança de IP feita pelo DHCP do roteador. Existem duas maneiras de fazer isso: a maneira errada e a maneira certa.

  • A maneira errada. Configurar um IP estático apenas no SO. Basicamente, isso significaria configurar o IP estático dentro do arquivo de rede do Ubuntu (netplan). Isso funciona bem até você trocar seu roteador ou levar seu servidor para outra casa. Então você terá que conectar um teclado e HDMI para reconfigurá-lo manualmente. Lembre-se: não queremos uma interface gráfica em nosso servidor.

  • A maneira certa. Mudamos a configuração de Reserva DHCP/Static Lease diretamente no roteador, sem tocar em nosso SO. Configuramos o roteador para sempre atribuir o mesmo IP (ex: 192.168.1.50) ao Endereço MAC do servidor. Dessa forma o servidor permanece no modo “Automático” (DHCP). Se você mudar de rede, ele pega um novo IP e funciona imediatamente. O gerenciamento é centralizado no roteador.

Para Resumir

Após a instalação física (apenas cabo de energia e rede) e do SO, o fluxo de trabalho é cirúrgico:

  1. Acesse o roteador e descubra o IP que o servidor pegou. Com isso, identificamos o Endereço MAC do nosso MiniPC.

  2. Atribua um IP estático (ou outro que você queira) no roteador (Static Lease).

  3. Acesse-o via SSH (ssh user@ip) do seu computador principal.

  4. Execute o script install.sh.

  5. Reinicie para aplicar os bloqueios do Kernel e os Drivers.

No próximo post, cobriremos a privacidade e segurança do servidor. É opcional, mas como dizem, cada cachorro sabe o seu rabo. Em outras palavras, proteja seu servidor!

Tchau