Artikel top billede

(Foto: Computerworld)

Guide: Byg den ultimative server

Med professionel teknologi kan du gøre dit hjemmenet helt forrygende.

Af Torben Okholm, Alt om Data

Denne artikel er oprindeligt bragt på Alt om Data. Computerworld overtog i november 2022 Alt om Data. Du kan læse mere om overtagelsen her.

Vi bliver nemt overspændte, når talen falder på servere. Vi vil alle have den bedste server. En server, der kan klare det hele. En enkelt maskine, der står klar til at give dig alt det, du har brug for: medier, reklameblokering, filhåndtering, det hele. Men for pokker, hvor er det bøvlet at samle maskineriet.

Man skal installere softwaren og få den til at fungere sammen med hardwaren, og man skal afbalancere belastningen, så man ikke kommer ud for, at én del trækker tæppet væk under en anden. Ingen ved sin fornufts fulde brug ville drømme om at gøre det, hvis der fandtes et bedre alternativ. Og det gør der. Her vil vi arbejde med at lave den bedste server, og vi lægger vægt på at finde den rette fremgangsmåde. Når du først har værktøjerne, kan du føje nye ting til din server på få minutter.

Heldigvis behøver du ikke silicium i den helt tunge ende. Bevares, nogle programmer vil have flere cpu-cyklusser, end du måske er parat til at tilbyde, men i de fleste tilfælde kan man køre en server med mange applikationer til ganske få kroner. Installer det rette udstyr, og du kan holde øje med alle programmerne på din server via et enkelt webinterface, som du kan få adgang til overalt på dit hjemmenet.

Når man skal lave den bedste server, drejer det sig ikke om applikationer. Det drejer sig om at bruge delen på den rigtige måde. Vi gennemgår alt det, du bør vide om at konstruere en moderne, skalerbar server med professionelle softwarekomponenter uden at bruge en krone på software. Og vi skal nok også foreslå nogle forrygende ting, som du kan køre på serveren. Men det er ikke vores server, den er din. Og du skal bruge den lige præcis, som du har lyst til.

Vi ønsker ikke at forhindre dig i at bygge din server på den måde, du selv foretrækker. Hvis du vil installere alting på traditionel vis og køre den på samme måde, som når du fyrer op under software på din desktop, skal du naturligvis gøre det. Men i erhvervslivet har serverteknologien udviklet sig. I takt med at chipsæt er blevet bedre, mængden af ram er vokset, og processorydelsen er eksploderet, har markedet først bevæget sig mod virtualisering, men i den seneste tid er udviklingen gået i retning af containerisering. Og hvorfor skulle erhvervslivet være ene om at have det sjovt?

Du får brug for en god forbindelse og noget harddiskplads til downloads.

Det er vigtigt at præcisere forskellen på de to begreber. Virtualisering i betydningen virtuel maskine er stor og tung. Det er et helt operativsystem i en stor klods, og et virtualiseret system placerer enten alle styresystemets krav hos sin vært, eller også er det tvunget til at skalere sig selv tilbage, hvis ressourcerne ikke er tilstrækkelige. En virtuel maskine er afhængig af chipsæt-trylleri, når det gælder interkommunikation med delt hardware, og den kan sætte sine kløer ret dybt ned – det er ikke urimeligt at opnå en ydelse, der ligner en rigtig maskine, fra en VM.

Containerisering er ikke den samme form for virtualisering. En container er ikke noget operativsystem – den er software, alt hvad den software skal bruge, og ikke andet. Det hele er samlet i en universel pakke. Hvor VM’er repræsenterer virtualisering på hardwareniveau, fungerer containere på et operativsystemniveau. Hver container på et system er afhængig af et engine-lag, der igen er afhængigt af en række kernekomponenter fra det grundlæggende operativsystem.

De er ikke helt isolerede, men de kan levere nogle operationer på højt niveau. De er super-letvægtere, hurtige at rulle ud og kan levere ydelsen uden et VM’s kræfter. De fungerer faktisk aldeles glimrende inden i et VM. Prøv at neste en bunke virtuelle maskiner inden i en anden VM, hvis du gerne vil høre din hardware skrige af rædsel.

Goddag, Docker: Hvis du kan se denne meddelelse, er alt vel.

Kom i gang

Hvis vi bruger containere (og det har vi afgjort tænkt os at gøre) er det bedste sandsynligvis at vende blikket mod Docker, den platform, der introducerede begrebet og gjorde det til virkelighed. Docker er enormt populær, og det betyder, at der er mængder af færdigbyggede containere til rådighed. Den skalerer glimrende – i en sådan grad at man realistisk (om end langsomt) kan containerisere en Raspberry Pi (se “Servering med Pi” herunder). Vi har tænkt os at køre via Docker på en Ubuntu-installation; du kunne også arrangere en VM og fylde den med dine egne containere, hvis du ikke har hardware tilovers.

Hvad vi derimod ikke vil anbefale, er at køre Docker på Windows. Containerisering udgør en stor officiel del af Windows Server 2016, og der er support indbygget i Pro- og Enterprise-udgaverne af Windows 10 post-Anniversary Edition (og også via en kombination af VirtualBox og Docker Toolbox), men systemet fungerer langt mere modent på Linux. Vi er ikke vanvittig bekymrede over specifikationerne eller over det at oprette vores egne superskræddersyede containere – strengt taget bruger vi et avanceret DevOps-redskab som undskyldning for at være dovne og oprette en hjemmeserver, selvom vi ikke udnytter det fuldt ud. Men ikke desto mindre anbefaler vi, at man holder sig til Linux, og Ubuntu er så godt som noget andet styresystem.

En docker_compose.yml er blot en tekstfil fuld af kopierede parametre.

Hent altså ISO’en for din foretrukne variant af Ubuntu, skriv den til et USB-drev (brug Rufus fra http://rufus.akeo.ie, det er strålende), og installer den på din servermaskine. Under installation skal du sørge for, at du inddrager Samba- og SSH-server-delene. Så er det nemt nok at styre sagerne fra en anden maskine på dit netværk. Det vil du blive glad for, når din server engang bliver koblet fra ekstraudstyr og skubbet ind under trappen. Så snart den kører, åbner du en terminal og går i gang med installationen af Docker Community Edition.

Hent Docker

Vi vil hente den seneste version af Docker fra Dockers eget lager, men før vi gør det, er vi nødt til at begynde med at installere det krævede for at tilføje dette lager som kilde. Kør sudo apt-get update for at få din Ubuntu-installation op at køre, og fortsæt med sudo apt-get install apt-transport-https ca-certificates curl software-properties-common for at sikre dig, at du har alle de relevante værktøjer. Brug nu curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add - til at hente Dockers GPG-nøgle. Fortsæt med sudo add-apt-repository “deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" for at tilføje selve lageret. Kør sudo apt-get update igen for at opfriske Ubuntus pakkeliste. Hvis alt er vel, kan du køre sudo apt-get install docker-ce , der henter og installerer Docker Community Edition inklusive alt det nødvendige.

Gå til bunds i Docker Hub, og find containere til stort set alle nyttige pakker.

Når det er gjort, er tiden inde til at vise, hvor utrolig nemt det er at få tingene til at køre med Docker. Det gør vi ved at hente et komplet image fra platformens servere og køre det i en container. Er du klar? Kør sudo docker run hello-world og se, hvad der sker. Det er alt. Intet mere. Docker har kontaktet sine servere, hentet imaget “hello-world”, startet en ny container på baggrund af dette image og sendt sit output ind i din terminal.

Du har kørt en containeriseret applikation, uanset hvor ubrugelig den måtte være, og du kan kalde sudo docker info for at bevise det: Det opregner én standset container. Vi anbefaler, at du nu følger trinnene i tekstboksen “Livskvalitet” på næste side, således at du ikke behøver at skrive “sudo” før hver af de kommandoer, der følger.

Servering med Pi

Raspberry Pi er billig og imponerende, men den duer ikke som alsidig server. Den er strengt taget en rædsom computer, hvis man ser bort fra bestemte applikationer, der ikke klager over dens mangel på systemressourcer, og dens netværksbus – delt med USB – er meget begrænset. Men til enkeltopgaver og lettere brug er den forrygende, og den er en oplagt kandidat til nogle få Docker-containere. Det fremgår af navnet, at Pihole er udsprunget af Pi, og det er en af de bedste kandidater.

Pi kan sagtens klare lidt DSN-jonglering, og du kan realistisk set få det installeret og gemme din Pi ad vejen og så behøver du ikke mere at tænke på reklamer. Cpu-lette applikationer fungerer også fint. Den version af Docker, der følger med Raspbian, kræver en hurtig opdatering, før den kan fungere ordentligt. Installer på ny via curl -sSL https://get.docker.com |sh . Docker kører fint på en Pi, (bedre end nogen traditionelt virtualiseret løsning), men images er ofte lavet til X86-platform og ikke til Pis ARM. Selv standard-imaget Hello world virker ikke. Når du skal afprøve en Pi Docker-installation, skal du køre docker run armhf/hello-world .

Når du leder efter kandidater eller containerisering, skal du sikre dig, at der er en ARM64-version. Et besøg på https://hub.docker.com/u/arm64v8/ giver en række valgmuligheder, og de er alle lavet internt i Docker-teamet. Og hvorfor ikke bruge din Raspberry Pi som et Tor-relay med imaget brunneis/tor-relay-arm, eller installere et af programmeringsmiljøerne? Du kan sågar bruge Deluge til at arrangere din Pi som hub for alle dine torrents, eller du kan prøve Pydio og få lidt enkelt online-fillager.

Tilføj containere

Det er ikke altid så enkelt at køre andre containere, som det var med “Hello World”-eksemplet, men det er ikke nødvendigvis ret indviklet. Prøv for eksempel docker run -d -p 80:12345 owncloud:8.1 for at starte en container med et image af OwnCloud-filserveren indeni. Åbn så en webbrowser på din servermaskine, og gå til http://localhost:12345 for at se resultaterne. Det er ret ligetil, men vi var dog nødt til at tilføje nogle ekstra parametre denne gang.

For eksempel beder -d Docker om at køre containeren i detached-tilstand, så den bliver håndteret i baggrunden i stedet for at fylde din konsol med statusmeddelelser. Og -p beder den videregive containerens port til værtsmaskinen – 80:12345 er vores port-mapping, der sender containerens port 80 til port 12345 hos værtsmaskinen. Når man kører flere containere med et webinterface, vil man kunne knytte dem til forskellige porte.

Det image bliver efter den første kørsel klonet til dit system. Genstart din maskine, og kør docker image ls for at opregne alle de containere, der findes på dit system. Kør den samme kommando som før for at starte, og Docker gendownloader det ikke – den kører i stedet den lokale version. Før vi begynder at installere de applikationer, der skal gøre vores server så fænomenal, er tiden inde til at øge kompleksiteten en anelse og se på kørsel og konfiguration af en rigtig samling, og til det formål skal vi bruge Docker Compose, der kombinerer en række containere i en enkelt applikation.

Mange om buddet

Tid til en smule admin. Installer Docker Compose med sudo curl -L https://github.com/docker/compose/releases/download/1.21.2/docker-compose-$(uname -s)-$(uname -m) -o /usr/local/bin/docker-compose (idet du erstatter versionsnummeret med den allernyeste version, og den kan du finde på http://github.com/docker/compose/releases). Dernæst giver du programmet de nødvendige rettigheder med sudo chmod +x /usr/local/bin/docker-compose .

Arbejdet med Docker Compose er ligesom med dets slægtning latterlig nemt. Man skal blot lave en konfigurationsfil, der viser, hvilke containere du vil køre, og som leverer de parametre, de skal bruge for at køre ordentligt. Så går programmet i gang. For at gøre sagerne endnu mere enkle har de fleste applikationer en skabelon til det, der skal med i konfigurationsfilen, og det eneste, du skal gøre, er at udfylde de tomme felter. Lad os nu spadsere gennem en enkel Docker Compose-installation, idet vi bruger den reklameblokerende DNS-manager Pihole som eksempel.

Portainer forenkler håndtering af en server med mange containere.

Når du skal gøre det inden i Docker Compose, må du først generere konfigurationsfilen. Lav en ny mappe til den med sudo mkdir ~/compose , og skift til den med cd ~/compose . Opret en arbejdsmappe til Pihole med sudo mkdir /var/pihole , giv den rettigheder med sudo chown -R <dit brugernavn>:<dit brugernavn> /var/pihole , og kør sudo nano docker-compose.yml . Skriv det følgende ind i filen, idet du udskifter “LANIP” med din serverip-adresse og er særlig omhyggelig med mellemrummene – hver fane skal være to ordmellemrum:
version: ‘2’
services:
pihole:
restart: unless-stopped
container_name: pihole
image: diginc/pi-hole
volumes:
- /var/pihole:/etc/pihole
environment:
- ServerIP=LANIP
cap_add:
- NET_ADMIN
ports:
- “53:53/tcp”
- “53:53/udp”
- “80:80”

Kør nu blot docker-compose up -d , så burde Pihole være oppe at køre. Hvis det ikke er tilfældet, kan der være tale om en konflikt med en anden proces (såsom dnsmasq), som tager kontrollen med port 53. Den lægger du i graven ved at køre
sudo sed -i ‘s/^dns=dnsmasq/#&/’ /etc/NetworkManager/NetworkManager.conf for at fjerne den fra den relevante konfigurationsfil. Fortsæt med sudo service network-manager restart / og sudo service networking restart efterfulgt af sudo killall dnsmasq for at sikre dig, at den er død som en sild.

Du kan tjekke resultaterne ved at gå til http://localhost/admin i en webbrowser. Når du vil føje yderligere containere til din kombinerede applikation, er det blot et spørgsmål om at tilføje deres parametre til filen docker-compose.yml , og køre den igen. Når du skal bruge Piholes DNS-sinkhole-funktioner ordentligt, skal du konfigurere din router til at route DHCP-klienter igennem serveren.

Håndtering af flere containere

Netdatas live-grafer og meddelelser giver et komplet billede af din servers helbred.

Før eller senere konstaterer du, at din server mangler porte. Pihole skal for eksempel have kontrol over port 80, fordi din HTTP-trafik bliver ført gennem den. Men hvad nu, hvis en anden container også har brug for 80? Det er som nævnt muligt at redigere disse porte i din docker-compose.yml, idet man fører port 80 fra containeren til en anden fri port på maskinen, men det er langt mere besværligt, end det behøver at være, når man får forbindelse til sin server fra et andet sted.

Hvis man kombinerer lidt DNS-håndtering med en reverse-proxy (vi hælder til nginx-proxy), bliver alle kald til din server samlet og videresendt til den relevante container på baggrund af det brugte brugernavn, for eksempel plex.altomdata.local. På den måde kan du komme til din Plex-server uden at skulle huske, hvilken port den bor på. Nginx kan også varetage belastning og trafikstyring mellem dine servercontainere. Besøg https://github.com/jwilder/nginx-proxy og få information om at sætte den i gang, og se på installation af (https://hub.docker.com/r/strm/dnsmasq/) i en container med henblik på at håndtere lokal DNS-redigering. Nginx udtales “Engine X”. Det opdagede vi efter lovlig ofte at have sagt “Nn ginks”.

Den kan varetage din belastning, og vores containeriserede server burde teoretisk være i stand til at fordele ressourcerne fornuftigt. Et lille styringslag er en glimrende adgang til at se, hvor belastningen er henne. Hent imaget titpetric/netdata, og sæt det i gang. Netdata giver ikke blot indblik i dine containeres færden; man kan også få et fuldstændig live og ekstremt godt forklaret indtryk af de dybere aspekter ved din serverhardware. Hvis der er noget, der ikke virker, som det bør – eller hvis du har et mindre driverproblem – bliver du den første, der opdager det.

Ikke helt skyfrit

Det var svaret på “hvordan”. Hvad så med “hvad”? Begynd med at grave dig igennem http://hub.docker.com, fordi alt det, du overhovedet kan ønske dig, er blevet lagt i en nydelig pakke til dig. Filstyring, for eksempel: OwnCloud leverer som tidligere nævnt en Dropbox-agtig metode til håndtering af dine filer med et webinterface, der giver simpel kodeordsbeskyttet adgang til en masse filer fra enhver enhed i dit hjem – herunder mobile klienter. Nextcloud gør stort set det samme som OwnCloud, men hvis du vil have fingrene dybere ned i sagerne, kan du tænde op under en SFTP-server (prøv atmoz/sftp) eller containerisere en Samba-installation (kartoffeltoby/docker-nas-samba) for at give din server uproblematiske NAS-funktioner.

Plex har et smukt interface, der virker glimrende.

Hvis vi går til medier, er der rigeligt at vælge imellem. Plex, der bruger det officielt sanktionerede plexinc/pms-docker-image, er vores førstevalg til hjemmeserver-opgaver, men man behøver ikke at køre det alene. Der findes forskellige værktøjer, som kan forbedre dine mediefunktioner, men vi har ikke plads til at nævne ret meget om dem her. Gå til http://linuxserver.io, og tjek de hyppigst downloadede images, hvis du vil vide, hvad der er mest populært. Når du har det hele på plads, skal du huske at tilføje den fremragende linuxserver/plexpy, der hjælper med at holde styr på, hvad der foregår i trafikken og på de filer, som kører gennem din Plex-server. Kodi er også et gennemprøvet valg, men efter vores mening er Plex en langt mere anvendelig filstyrer.

Din server kan også udføre mere esoteriske arkiverings- og organiseringsopgaver. Prøv Mediawiki, hvis du vil have en hjemme-wiki op at køre med henblik på optagelse af signifikante oplysninger, eller Photoshow (linuxserver/photoshow), der hurtigt installerer et databasefrit fotogalleri med træk og slip-uploading. Vault (http://vaultproject.io) er ikke køn, men det er et glimrende sted at gemme hemmeligheder såsom kodeord, nøgler og anden kritisk sikkerhedsinformation. Home Assistant (homeassistant/home-assistant) kan efter lidt arbejde overtage kontrollen med alt dit smarte udstyr på ét sted.

Gør det nemmere

Når du begynder at dynge containerne på, skal du sikre dig, at du håndterer dem (og deres stadig mere irriterende portkrav) rigtigt – se tekstboksen “Håndtering af flere containere” herover. Og selvom det ikke er anstrengende at oprette en docker-compose.yml, kan man få mere detaljeret kontrol over containere med Portainer (http://portainer.io), der leverer et web-interface, hvorfra man kan starte, stoppe og tilføje nye containere, som man ønsker. Organizr (lsiocommunity/organizr) er også nyttig: Den samler alle dine medieserver-applikationer i et enkelt interface og giver dig mulighed for at distribuere dem selektivt til venner og slægtninge.

Prøv for eksempel at køre to Plex-containere, hvis du vil adskille familievenligt indhold fra det materiale, som dine børn ikke skal have adgang til. Peg dem i retning af Organizr, så ser de kun det, de har lov til. Overvej også Watchtower, der finder ændringer i dine images og automatisk opdaterer dem til de nyeste versioner.

Hvis det morer dig at komplicere sagerne i stedet for at gøre livet lettere, kan du prøve at oprette dine egne containere. Det er komplekst, men Dockers dokumentation dækker processen i de mindste detaljer. På http://docs.docker.com kan du læse om de nødvendige komponenter og relevante kommandoer. Når du har lavet din egen container, uploader du den blot til Dockers hub, hvor alle kan hente den ned til deres egne maskiner og kopiere den.

Livskvalitet

Hvis du kører en Docker-server, vil du sikkert automatisere så meget som muligt. Det indebærer at give Docker lidt mere adgang, men det medfører også en beskeden reduktion af sikkerheden. Det er derfor op til dig selv, om du vil følge disse trin. Først skal du oprette en ny gruppe til Docker ved hjælp af sudo groupadd docker , hvorefter du føjer din aktuelle bruger til Docker-gruppen med sudo usermod -aG docker $USER . Log ud, og log ind igen. Nu bør du kunne køre Docker-kommandoer (prøv docker run helloworld ) uden at indlede kommandoen med sudo . Hvis du får en fejlmeddelelse, gælder det sandsynligvis rettigheder til din ~/.docker/-mappe, foranlediget af at du tidligere har brugt sudo .

Du kan enten slette din eksisterende mappe med rm -f ~/.docker/ og begynde forfra eller give mappen de nødvendige rettigheder, først med sudo chown “$USER”:”$USER” /home/”$USER”/.docker -R , og derefter med sudo chmod g+rwx “/home/ $USER/.docker” -R. Husk at give tilsvarende rettigheder til de andre mapper, du opretter, til lagring af data eller medier i dine containere. Det er praktisk at lade Docker køre automatisk ved boot, for så behøver du ikke at hente dine ekstraenheder (eller logge ind via SSH) for at få din server tilbage i omdrejninger.

Føj blot Docker til Systemd, den Linux-komponent, der ( i de fleste moderne distributioner) står for håndtering af de processer, som kører ved boot-tid, ved at køre sudo systemctl enable docker i din kommandolinje. Skriv systemctl for at tjekke, at det virker – gennemgå listen, indtil du ser “docker.service” opregnet. Hvis du senere ombestemmer dig, kan du vende tilbage ved hjælp af sudo systemctl disable docker.