WebHostPro: webhosting op je QNAP NAS
WebHostPro draait websites op een QNAP NAS: statische sites, PHP-sites met eigen databases en proxy’s naar apps op de NAS, elk onder een eigen domein met een certificaat, alles vanuit één paneel. Het is gratis en wordt geïnstalleerd vanuit de App Center-repository van deze site.
- Draait op een QNAP NAS met een Intel- of AMD-processor (x86_64), op QTS 6.0 of QuTS hero 6.0 of nieuwer.
- Wordt vanuit App Center geïnstalleerd als (example) WebHostPro, uit de repository QNAP Utilities.
- Paneel:
https://<NAS>:9541/; de sites antwoorden op de poorten 9542 en 9543 tot je ze naar 80 en 443 verplaatst. - Gebouwd uit de broncode met de App Builder van Bucket & Code Server IDE.
01Overzicht
WebHostPro draait websites op een QNAP NAS. Het is een webserverstack: nginx voor elke site, daarachter Apache httpd voor de sites die het gebruiken, PHP 8.1 tot 8.5, MariaDB, Percona Server, PostgreSQL, memcached en Valkey, met een paneel in negen talen dat de sites toevoegt, wijzigt en verwijdert.
02Schermafbeeldingen
03Eerste start
Openen in App Center leidt naar het paneel, https://<NAS>:9541/; poort 9540, gewoon
HTTP, verwijst daarheen door. Bij een nieuwe installatie toont het paneel Eerste aanmelding: een wachtwoord
van minstens 10 tekens, twee keer ingevoerd. Het pakket stelt geen wachtwoord in en genereert er geen, en het paneel
bewaart alleen een hash van het wachtwoord dat je instelt.
De pagina neemt het wachtwoord alleen aan van een computer in het eigen netwerk van de NAS (een privé-, loopback- of link-local-adres) en tot 60 minuten na de start van het paneel; zolang niemand het heeft ingesteld, kiest de eerste persoon op het netwerk die het paneel in dat uur opent het. Start WebHostPro in App Center opnieuw om de pagina weer te openen. Een sessie duurt 8 uur, en 10 mislukte aanmeldingen vanaf één adres sluiten dat adres 15 minuten uit.
04Sites
Een site is een domein met zijn aliassen, een soort (statische bestanden, PHP, of een proxy naar een dienst op de
NAS of in het lokale netwerk, ook in een container, met websockets), een webserver (nginx of Apache httpd) en, als
ze er een nodig heeft, een database. Het doel van een proxy is een adres in een privébereik, geen hostnaam. Elke
site heeft een eigen account, ws-<ID>, dat haar map bezit en haar PHP uitvoert, zodat de PHP van
de ene site de bestanden van een andere niet kan lezen. De map staat in een gedeelde map van QTS of in de
gegevensmap van WebHostPro, en haar public/ is de documentroot.
Een PHP-site draait zijn eigen PHP-FPM-master, en zijn tabblad PHP houdt de versie (8.1 tot 8.5), de tijdzone,
limieten, fouten, sessies en beveiliging, OPcache en de JIT, APCu, de extensies, meer php.ini-regels en de
PHP-workers (de pool). Een php.ini-regel wordt gecontroleerd tegen de directieven die de PHP van die versie zelf
opsomt; een naam die code laadt, een opdracht uitvoert, een bestand noemt of een wachtwoord bevat, wordt geweigerd.
De pool heeft de procesmanager (op aanvraag, dynamisch of statisch), het aantal processen (standaard op aanvraag
met 5), de inactieve tijd, de verzoeken per proces, een tijdslimiet per verzoek en een logboek van trage verzoeken,
dat het tabblad Logboeken toont. Een crash of een drukke PHP op één site laat de andere draaien, en een wijziging
van de PHP-instellingen van één site herstart alleen de PHP van die site. Een master die stopt, wordt opnieuw
gestart en blijft uit na vijf stops binnen een minuut; logs/php8.N-ID.log zegt dat.
Elke site kan geplande taken uitvoeren als zijn eigen account met zijn eigen PHP: een PHP-bestand, een opdracht of het eigen adres van de site, elke minuut of volgens elk cron-schema. De pagina van de site toont het resultaat en de uitvoer van elke run, en MailServerPro stuurt een rapport wanneer een taak begint te mislukken.
Elke PHP-site heeft een eigen Valkey (die het protocol van Redis spreekt) en een eigen memcached, elk op een socket in een map die alleen die site kan openen, dus geen van beide heeft een wachtwoord of een netwerkpoort nodig; het tabblad Cache van de site toont beide sockets. Elk houdt tot 64 MB, en een herstart maakt beide leeg. Elke PHP-versie heeft imagick, met ImageMagick dat JPEG, PNG, WebP, GIF en AVIF leest en schrijft en HEIC leest. Het beleid weigert de formaten die andere bestanden lezen of programma’s starten, zoals SVG en MSL.
De .htaccess-bestanden van Apache-sites kunnen ook Digest-authenticatie gebruiken, groepen uit een groepsbestand, Substitute om tekst in een pagina te vervangen en het filter RATE_LIMIT om de snelheid van een download te begrenzen.
Een PHP-site kan ook eigen PECL-extensies hebben: het tabblad PHP bouwt ze als het eigen account van de site, zonder netwerk, in de bouwomgeving van Bucket & Code Server IDE, en alleen de PHP van die site laadt ze.
WebHostPro kan met één klik de rol van webserver van de NAS overnemen, en een nieuwe installatie vraagt het één keer: het beheer van QTS gaat van poort 443 naar 44443 en de webserver van QTS van 80 naar 8880, elke stap gecontroleerd voor de volgende, de sites van QTS komen achter WebHostPro, en één klik op de pagina Frontserver en poorten geeft 80 en 443 terug.
Een rondleiding loopt van de standaardpoorten en TurboDNS naar uw eerste site en stelt na een controle van de DNS-instellingen voor om het adres van de DNS-server via de DHCP van de router uit te delen.
Een PHP- of statische site die nginx uitlevert, heeft een tabblad Cache. nginx comprimeert tekstantwoorden
behalve met gzip ook met Brotli en zstd. Een PHP-site kan een paginacache aanzetten, standaard uit: bezoekers met
een aanmeldcookie krijgen altijd een verse pagina, de header X-Cache zegt HIT, MISS, STALE, UPDATING
of BYPASS, en Cache legen leegt hem. Statische bestanden mogen browsers 1, 7, 30 of 365 dagen bewaren.
nginx neemt een verzoekbody aan tot het grootste verzoek van de site (de post_max_size van het
tabblad PHP) en antwoordt daarboven 413; een proxysite heeft aan de frontserver geen bodylimiet.
Site toevoegen is een domeinwizard: Domein, DNS, Registrar, Website, Database (voor een PHP-site), Certificaat en Nakijken. DNS vraagt wie voor de zone antwoordt (TurboDNS op deze NAS; de servers van de registrar of van een DNS-aanbieder; of Cloudflare of OVHcloud, vanuit de zone die TurboDNS op deze NAS bijhoudt) en welke publieke adressen deze NAS heeft. Registrar somt op wat je invult waar het domein is gekocht, elke waarde met een kopieerknop, met daaronder de doorsturingen van de router en de staat van de frontserver. De proefrun van Nakijken toont het plan van de site en het plan van TurboDNS samen, en één keer toepassen verstuurt beide. Het certificaat komt van Let’s Encrypt (HTTP-01, waarbij de frontserver het bestand op poort 80 uitlevert, of DNS-01 via TurboDNS of Cloudflare; WebHostPro vernieuwt het als er nog 30 dagen of minder over zijn), of het is een geüpload certificaat, dat van de NAS zelf of een zelfondertekend certificaat.
Na het toepassen heeft het Overzicht van de site de kaart Rond de instelling van <naam> af: Site toegepast, Records in TurboDNS, Bij de registrar, Live-controle, Certificaat en Afronden. Nu controleren leest de naamservers van de bovenliggende zone, de TurboDNS van deze NAS, drie publieke resolvers en de frontserver, en zegt dat het niet kan zien of de poorten 53, 80 en 443 de NAS vanaf internet bereiken; de rij Certificaat vraagt Let’s Encrypt om het certificaat. De rij Records in TurboDNS is klaar zodra het plan van TurboDNS voor het domein niets meer te wijzigen vindt, na de proefrun van de wizard, na Records versturen in de rij of na een herhaalde verzending, en toont dan In TurboDNS sinds <tijd>; een site waarvan de records al in de zone staan, krijgt dat van de proefrun alleen.
Elke wijziging is eerst een concept. De proefrun schrijft de hele weblaag naar een werkmap, voert daar
nginx -t, httpd -t en php-fpm -t op uit en toont de toegevoegde, gewijzigde en
verwijderde bestanden met hun verschillen. Het toepassen voert precies dat plan uit, bewaart eerst een snapshot van
de draaiende bestanden, herlaadt zacht en zet de snapshot terug als een stap mislukt. Een site verwijderen vraagt
om het intypen van haar naam; haar map en databases blijven staan.
Bij een proxysite toont App op deze NAS de geïnstalleerde apps waarvoor WebHostPro een sjabloon heeft:
Rtorrent 16 en zijn add-ons, Radarr, Sonarr, Prowlarr, Lidarr, Bazarr, Seerr, Tautulli, qBittorrent, Transmission,
TunerHub, Weblate, Tolgee, Bucket & Code Server IDE, Plex Media Server en Jellyfin. Als je een app kiest,
wordt het doel ingevuld met de poort die het pakket van de app gebruikt en gaan websockets aan als de app ze nodig
heeft. De frontserver stuurt de app dan X-Forwarded-Host en X-Real-IP, geeft een app met
lange verzoeken tot een uur de tijd om te antwoorden en streamt media en events zonder buffering bij de apps die
ze sturen. Een instelling die alleen de app zelf kan wijzigen, zoals de URL Base van een *arr-app, staat in één
regel onder de keuzelijst.
05Standaardsite
Een verzoek voor een naam die geen site heeft, zoals het adres of de naam van de NAS, komt bij de standaardsite
terecht: de gedeelde map Web van QTS als de NAS er een heeft die WebHostPro kan gebruiken, anders een
startpagina in de gegevensmap van WebHostPro. Apache httpd serveert hem, dus de .htaccess-bestanden
van de map werken, behalve regels met Options: die negeert httpd. Zijn PHP draait onder een eigen
account. Na de installatie of de update staat hij aan als concept: de volgende proefrun en het toepassen zetten
hem live. Hij antwoordt op de poorten van de frontserver: op 80 zodra de frontserver daarheen is verplaatst op de
pagina Frontserver en poorten, anders op 9542. Zolang de webserver van QTS poort 80 bezet, noemt zijn
pagina in WebHostPro de instelling die in QTS uit moet. Hij levert nooit de mappen van andere sites in de map Web,
bestanden en mappen waarvan de naam met een punt begint (behalve .well-known), of de mappen van QTS
die met @ beginnen, en toont geen maplijst. WebHostPro wijzigt de rechten van de map niet.
Mappen in de gedeelde map Web die koppelingen zijn naar andere gedeelde mappen of volumes werken
zoals met de webserver van QTS, ook voor PHP.
Via HTTPS antwoordt de site met het eigen certificaat van de NAS, het certificaat dat QTS voor zijn eigen pagina’s gebruikt; zolang dat het zelfondertekende certificaat van QNAP is, tonen browsers een waarschuwing. Een TLS-verzoek voor een site zonder TLS wordt geweigerd.
WebHostPro roteert zijn eigen logs: bij 10 MiB of na een week, met vijf kopieën gecomprimeerd met gzip, en nginx en httpd openen hun logs opnieuw zonder een verzoek te verliezen.
06Databases
Een site krijgt een database en een gebruiker van MariaDB, Percona Server of PostgreSQL op de pagina Databases of op haar tabblad Database. Percona Server 8.4 wordt ingericht als de eerste Percona-database wordt gemaakt en luistert op 127.0.0.1:9555 en op een socket; een NAS die het nooit gebruikt, start het nooit. De pagina Databases heeft een kaart voor MariaDB en een voor Percona Server, met acht instellingen (de bufferpool, verbindingen, het grootste pakket, de redolog, tijdelijke tabellen, de tabelcache, de inactieve tijd, de tijd voor trage query’s) en meer my.cnf-regels, gecontroleerd tegen de optielijst van de server zelf. Een wijziging is een concept; het toepassen herstart de server, zodat zijn databases een paar seconden niet antwoorden.
07Met de andere apps op de NAS
Als TurboDNS op de NAS draait, biedt de DNS-stap van de wizard hem de zone aan, en het toepassen verstuurt de
records. Zonder MailServerPro dragen ze geen mailrecords: een nieuwe zone krijgt de naamservers ns en
ns1, allebei deze NAS tenzij je een tweede naamserver noemt, en de A- en AAAA-records van de namen van
de site, van ns en van ns1; een zone die TurboDNS al bedient, houdt haar eigen
naamservers. Met MailServerPro geïnstalleerd krijgt de zone het hostingsjabloon van TurboDNS met de publieke
adressen van de NAS die je bevestigt, de A- en AAAA-records van de eigen namen van de site (het sjabloon dekt het
domein, www, ns, ns1 en de mailnamen, zodat een tweede site zoals
shop.example.com haar eigen records krijgt) en de DKIM-, MTA-STS-, TLS-RPT- en TLSA-records van
MailServerPro. Er wordt niets naar TurboDNS geschreven vóór het toepassen, en Nakijken toont eerst elk record.
Het derde antwoord van de DNS-stap, Cloudflare of OVHcloud, vanuit de zone die TurboDNS op deze NAS bijhoudt, verstuurt dezelfde records naar TurboDNS als het eerste antwoord, en een DNS-aanbieder antwoordt voor het domein. TurboDNS draagt de zone over via de API van de aanbieder, en alleen als je erom vraagt: open de zone in TurboDNS, het tabblad Cloudflare en OVH, Wijzigingen bekijken, dan wijziging(en) overdragen. De stap Registrar noemt dan geen naamservers, glue-records of poort 53: de registrar houdt de naamservers van de aanbieder, en de zone heeft geen doorsturing van poort 53 op de router nodig. De live-controle slaagt dan op de openbare resolvers en de frontserver, met de rijen Naamservers bij de registrar en Glue-records overgeslagen.
Met Bucket & Code Server IDE geïnstalleerd opent het tabblad Bestanden van een site haar map in de editor.
08Zonder publiek adres
Een NAS achter CGNAT, of achter een router die geen poorten doorstuurt, kan gekozen sites via een Cloudflare Tunnel op internet aanbieden. De kaart Sites via Cloudflare bereikbaar maken vanaf internet op de pagina Frontserver en poorten neemt een API-token van je Cloudflare-account en een zone waarvan de naamservers die van Cloudflare zijn. WebHostPro maakt dan een eigen tunnel en start cloudflared, dat zelf verbinding maakt met Cloudflare. Elke toegepaste site krijgt een schakelaar die haar namen in de zone een geproxied CNAME-record naar de tunnel geeft; WebHostPro weigert een naam die al een A-, AAAA- of CNAME-record heeft dat het niet zelf maakte. De tunnel uitschakelen verwijdert de records die WebHostPro maakte en de tunnel. Cloudflare beëindigt TLS en ziet het verkeer, en met het gratis abonnement kan één verzoek hoogstens 100 MB uploaden.
09Installatie
Aanbevolen: vanuit App Center. Voeg de repository van deze site één keer toe; daarna installeert en werkt het pakket bij vanuit App Center, net als elke andere app.
- App Center → ⚙ Instellingen → App-repository → Toevoegen.
- Noem hem
QNAP Utilities, plakhttps://www.qnaputilities.com/repo.xml, Toevoegen. - Open QNAP Utilities in de linkerkolom en installeer (example) WebHostPro.
10Wat het nodig heeft
Een QNAP NAS met een x86_64-processor (Intel of AMD) op QTS 6.0 of QuTS hero 6.0 of nieuwer.
Het paneel staat op poort 9541 (HTTPS; 9540 verwijst daarheen), de frontserver (nginx) op 9542 (HTTP) en 9543 (HTTPS, en UDP voor HTTP/3 als nginx dat heeft), en httpd op 127.0.0.1:9544 erachter. De databases, caches en optionele diensten luisteren alleen op 127.0.0.1. De frontserver gaat pas naar poort 80 en 443 als je erop klikt op de pagina Frontserver en poorten, die de stappen in QTS opsomt die die poorten vrijmaken en wat elke stap breekt; WebHostPro wijzigt de instellingen van QTS nooit zelf.
Op QuTS hero kan een gedeelde map met uitgebreide maprechten geen sites bevatten: het toepassen stopt, noemt de map en vraagt opnieuw. WebHostPro 0.14.4 is geprobeerd op QTS 6.1.0 en op QuTS hero 6.1.0.
11Gerelateerde pagina’s
- Handleiding: je domein op je NAS, website, DNS en mail →
- Handleiding: drie apps op WebHostPro (FreshRSS, Heimdall, FileRise) →
- MailServerPro: de mailserver voor dezelfde domeinen →
- Bucket & Code Server IDE, de werkplaats die het bouwt →
- Voeg de repository van deze site toe aan App Center →
- Versies, licenties en het pakketbestand: in het appvenster in App Center →



