Idiomes disponibles:

Streaming està Trencat III: Els Fonaments (SO, Docker, i “Dia Zero”)

Aquesta publicació va ser originalment escrita en anglès. La traducció pot no reflectir el 100% de les idees originals de l'autor.

Ara que tenim el nostre maquinari, podem començar amb la configuració del sistema del nostre servidor. El MiniPC que vaig comprar venia amb Windows instal·lat. També és possible utilitzar el sistema de Microsoft per al que volem, però és un malbaratament ridícul de rendiment i energia.

Un Home Server robust no és un ordinador d’escriptori que està engegat tot el dia: és un sistema dedicat. Construirem els fonaments de programari des de zero, transformant el mini PC en una infraestructura de nivell empresarial, preparada per funcionar 24/7 sense intervenció humana.

Triar i Configurar el Sistema Operatiu

Però… per què no Windows? Windows consumeix al voltant de 2GB a 4GB de RAM només per existir i executar la seva interfície gràfica. En el nostre N100, això és un malbaratament, com he dit, és llençar rendiment a les escombraries. A més, Docker a Windows (via WSL2) afegeix una capa de virtualització que pot afectar el rendiment d’I/O i de xarxa.

No utilitzeu Windows. Oblideu aquesta merda.

Aquí podem utilitzar qualsevol Linux… sense interfície. Un servidor no necessita ratolí, finestres o fons de pantalla.

Instal·larem Ubuntu Server sense interfície gràfica. El servidor es controlarà 100% via terminal (SSH) des del vostre PC principal. Això assegura que cada cicle de CPU i megabyte de RAM es dediqui al que importa: els vostres serveis.

Per descomptat, instal·lar Ubuntu des de zero afegirà algunes capes de complexitat (no massa). Actualitzar repositoris, instal·lar dependències, configurar permisos d’usuari, editar fitxers del sistema… Aquí és on les coses poden anar malament i aparèixen errors que us costaran car mesos després.

Per això, vaig fer un petit script que automatitzarà totes aquestes configuracions inicials. El codi és autoexplicatiu.

#!/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."

Què fa el script?

  1. Docker Natius. Instal·la el Docker Engine directament des de la font oficial, assegurant la versió més recent i segura, sense dependre dels paquets desactualitzats de la distribució. Intentar fer això a Windows amb WSL és demanar un mal de cap.

  2. Controladors Intel QuickSync. Ubuntu Server ve amb controladors genèrics, cosa que afectarà directament el rendiment del nostre N100 per a la transcodificació de vídeo. El script instal·la els intel-media-va-driver-non-free i configura els permisos de renderització (grup render), assegurant que Jellyfin tingui accés directe al maquinari.

  3. Eliminació d’IPv6. Més endavant em centraré específicament en la part de seguretat, ja que en el meu cas vaig triar protegir el meu homeserver amb una VPN. Això és opcional, però garanteix la privadesa del vostre servidor, especialment si planegeu “adquirir” pel·lícules o sèries mitjançant mètodes alternatius. El script desactiva IPv6 directament al Kernel de Linux (sysctl.conf). D’aquesta manera, ni Docker, la VPN, ni qBittorrent poden utilitzar IPv6, eliminant físicament la possibilitat d’una filtració. Recordeu, les filtracions d’IP via IPv6 són el fracàs de seguretat número u en les VPNs domèstiques.

  4. Creació de Carpeta i Estructura Inicial. El script crea l’arbre de directoris /data/media i /data/downloads amb els permisos d’usuari correctes (PUID/PGID). Si això es fa malament ara, els Hardlinks (còpies instantànies sense duplicar espai) fallaran. Parlarem més sobre aquest tipus de còpia a la propera entrada.

Amb això, el nostre servidor està llest, segur i optimitzat en 2 minuts!

Keep it simple!

PS: Vaig anomenar aquest projecte EmuleVision. Canvieu-ho pel que vulgueu.

Configurar una IP Estàtica (La Manera Correcta)

El nostre servidor necessita una IP Estàtica, això és obvi. Si la IP canvia constantment amb cada reinici, la nostra televisió perdria la referència al nostre servidor amb cada canvi d’IP fet pel DHCP del router. Hi ha dues maneres de fer-ho: la manera equivocada i la manera correcta.

  • La manera equivocada. Configurar una IP estàtica només al SO. Bàsicament, això significaria configurar la IP estàtica dins del fitxer de xarxa d’Ubuntu (netplan). Això funciona bé fins que canvieu el vostre router o porteu el servidor a una altra casa. Llavors haureu de connectar un teclat i HDMI per reconfigurar-lo manualment. Recordeu: no volem una interfície gràfica al nostre servidor.

  • La manera correcta. Canviem la configuració de Reserva DHCP/Static Lease directament al router, sense tocar el nostre SO. Configurem el router per assignar sempre la mateixa IP (per exemple, 192.168.1.50) a l’Adreça MAC del servidor. D’aquesta manera el servidor roman en mode “Automàtic” (DHCP). Si canvieu de xarxa, agafa una nova IP i funciona immediatament. La gestió està centralitzada al router.

Per Resumir

Després de la instal·lació física (només cables d’alimentació i xarxa) i el SO, el flux de treball és quirúrgic:

  1. Accediu al router i esbrineu la IP que ha agafat el servidor. Amb això, identifiquem l’Adreça MAC del nostre MiniPC.

  2. Assigneu una IP estàtica (o una altra que vulgueu) al router (Static Lease).

  3. Accediu-hi via SSH (ssh usuari@ip) des del vostre ordinador principal.

  4. Executeu el script install.sh.

  5. Reinicieu per aplicar els bloquejos del Kernel i els Controladors.

A la propera entrada, cobrirem la privadesa i seguretat del servidor. És opcional, però com es diu, cada gos coneix la seva cua. En altres paraules, protegiu el vostre servidor!

Bye