Unofficial
Auf dieser Seite
  1. 01Überblick
  2. 02Ansichten
  3. 03Erster Start
  4. 04Websites
  5. 05Standard-Website
  6. 06Datenbanken
  7. 07Mit den anderen Apps auf dem NAS
  8. 08Ohne öffentliche Adresse
  9. 09Installation
  10. 10Was es braucht
  11. 11Verwandte Seiten

WebHostPro: Webhosting auf Ihrem QNAP NAS

WebHostPro betreibt Websites auf einem QNAP NAS: statische Seiten, PHP-Seiten mit eigenen Datenbanken und Proxys zu Apps auf dem NAS, jede unter eigener Domain mit Zertifikat, alles aus einem Panel. Es ist kostenlos und wird aus dem App-Center-Repository dieser Seite installiert.

  • Läuft auf einem QNAP NAS mit Intel- oder AMD-Prozessor (x86_64), unter QTS 6.0 oder QuTS hero 6.0 oder neuer.
  • Wird im App Center aus dem Repository QNAP Utilities als (example) WebHostPro installiert.
  • Panel: https://<NAS>:9541/; die Websites antworten auf den Ports 9542 und 9543, bis Sie sie auf 80 und 443 legen.
  • Aus den Quellen gebaut mit dem App Builder von Bucket & Code Server IDE.

01Überblick

WebHostPro betreibt Websites auf einem QNAP-NAS. Es ist ein Webserver-Stack: nginx vor jeder Website, dahinter Apache httpd für die Websites, die ihn nutzen, PHP 8.1 bis 8.5, MariaDB, Percona Server, PostgreSQL, memcached und Valkey, mit einem Panel in neun Sprachen, das die Websites anlegt, ändert und entfernt.

02Ansichten

WebHostPro: the overview of the sites and services The list of sites with their PHP version and certificate The wizard that adds a site A site's PHP settings

03Erster Start

Die Schaltfläche Öffnen im App Center führt zum Panel, https://<NAS>:9541/; der unverschlüsselte Port 9540 leitet dorthin um. Bei einer Neuinstallation zeigt das Panel Erste Anmeldung: ein Passwort mit mindestens 10 Zeichen, zweimal eingegeben. Das Paket setzt kein Passwort und erzeugt keines, und das Panel speichert nur einen Hash des Passworts, das Sie setzen.

Die Seite nimmt das Passwort nur von einem Rechner im eigenen Netz des NAS an (private, Loopback- oder Link-Local-Adresse) und nur 60 Minuten nach dem Start des Panels; solange es niemand gesetzt hat, wählt es die erste Person im Netz, die das Panel in dieser Stunde öffnet. Starten Sie WebHostPro im App Center neu, um sie wieder zu öffnen. Eine Sitzung dauert 8 Stunden, und 10 fehlgeschlagene Anmeldungen von einer Adresse sperren diese Adresse für 15 Minuten.

04Websites

Eine Website ist eine Domain mit ihren Aliassen, eine Art (statische Dateien, PHP oder ein Proxy zu einem Dienst auf dem NAS oder im lokalen Netz, auch in einem Container, mit Websockets), ein Webserver (nginx oder Apache httpd) und, wenn sie eine braucht, eine Datenbank. Ein Proxy-Ziel ist eine Adresse in einem privaten Bereich, kein Hostname. Jede Website hat ein eigenes Konto, ws-<ID>, das ihren Ordner besitzt und ihr PHP ausführt, sodass das PHP einer Website die Dateien einer anderen nicht lesen kann. Der Ordner liegt in einem QTS-Freigabeordner oder im Datenordner von WebHostPro, und sein public/ ist das Dokumentenverzeichnis.

Eine PHP-Website führt ihren eigenen PHP-FPM-Master aus, und ihr Reiter PHP hält die Version (8.1 bis 8.5), die Zeitzone, Limits, Fehler, Sitzungen und Sicherheit, OPcache und den JIT, APCu, die Erweiterungen, weitere php.ini-Zeilen und die PHP-Worker (den Pool). Eine php.ini-Zeile wird gegen die Direktiven geprüft, die das PHP dieser Version selbst auflistet; ein Name, der Code lädt, einen Befehl ausführt, eine Datei nennt oder ein Passwort enthält, wird abgelehnt. Der Pool hat den Prozessmanager (bei Bedarf, dynamisch oder statisch), die Zahl der Prozesse (standardmäßig bei Bedarf mit 5), die Leerlaufzeit, die Anfragen je Prozess, ein Zeitlimit je Anfrage und ein Protokoll langsamer Anfragen, das der Reiter Protokolle zeigt. Ein Absturz oder ein ausgelastetes PHP einer Website lässt die anderen weiterlaufen, und eine Änderung der PHP-Einstellungen einer Website startet nur deren PHP neu. Ein Master, der sich beendet, wird neu gestartet und bleibt nach fünf Beendigungen innerhalb einer Minute aus; logs/php8.N-ID.log sagt es.

Jede Website kann geplante Aufgaben als ihr eigenes Konto mit ihrem eigenen PHP ausführen: eine PHP-Datei, einen Befehl oder die eigene Adresse der Website, jede Minute oder nach einem beliebigen Cron-Zeitplan. Die Seite der Website zeigt Ergebnis und Ausgabe jedes Laufs, und MailServerPro schickt einen Bericht, wenn eine Aufgabe zu scheitern beginnt.

Jede PHP-Website hat ihr eigenes Valkey (es spricht das Protokoll von Redis) und ihr eigenes memcached, jedes auf einem Socket in einem Ordner, den nur diese Website öffnen kann, daher braucht keines ein Passwort oder einen Netzwerk-Port; der Tab Cache der Website zeigt beide Sockets. Jedes hält bis zu 64 MB, und ein Neustart leert beide. Jede PHP-Version hat imagick mit ImageMagick, das JPEG, PNG, WebP, GIF und AVIF liest und schreibt und HEIC liest. Seine Richtlinie lehnt die Formate ab, die andere Dateien lesen oder Programme starten, etwa SVG und MSL.

Die .htaccess-Dateien von Apache-Websites können außerdem Digest-Authentifizierung, Gruppen aus einer Gruppendatei, Substitute zum Ersetzen von Text auf einer Seite und den Filter RATE_LIMIT zum Begrenzen der Download-Geschwindigkeit nutzen.

Eine PHP-Website kann auch eigene PECL-Erweiterungen haben: Ihr Tab PHP baut sie unter dem eigenen Konto der Website, ohne Netzwerk, in der Build-Umgebung von Bucket & Code Server IDE, und nur das PHP dieser Website lädt sie.

WebHostPro kann mit einem Klick die Rolle des Webservers des NAS übernehmen, und eine neue Installation fragt einmal danach: Die Verwaltung von QTS zieht von Port 443 auf 44443 um und der Webserver von QTS von 80 auf 8880, jeder Schritt wird vor dem nächsten geprüft, die Websites von QTS kommen hinter WebHostPro, und ein Klick auf der Seite Front und Ports gibt 80 und 443 zurück.

Ein Rundgang führt von den Standardports und TurboDNS zu Ihrer ersten Website und schlägt nach einer Prüfung der DNS-Einstellungen vor, die Adresse des DNS-Servers über den DHCP des Routers zu verteilen.

Eine PHP- oder statische Website, die nginx ausliefert, hat einen Reiter Cache. nginx komprimiert Textantworten außer mit gzip auch mit Brotli und zstd. Eine PHP-Website kann einen Seitencache einschalten, standardmäßig aus: Besucher mit einem Anmelde-Cookie bekommen immer eine frische Seite, der Header X-Cache sagt HIT, MISS, STALE, UPDATING oder BYPASS, und Cache leeren leert ihn. Statische Dateien dürfen Browser 1, 7, 30 oder 365 Tage behalten. nginx nimmt einen Anfragekörper bis zur größten Anfrage der Website an (post_max_size im Reiter PHP) und antwortet darüber mit 413; eine Proxy-Website hat am Front kein Körperlimit.

Website hinzufügen ist ein Domain-Assistent: Domain, DNS, Registrar, Website, Datenbank (bei einer PHP-Website), Zertifikat und Prüfen. DNS fragt, wer für die Zone antwortet (TurboDNS auf diesem NAS; die Server des Registrars oder eines DNS-Anbieters; oder Cloudflare oder OVHcloud, aus der Zone, die TurboDNS auf diesem NAS führt) und welche öffentlichen Adressen dieses NAS hat. Registrar listet, was dort einzutragen ist, wo die Domain gekauft wurde, jeden Wert mit einer Kopieren-Schaltfläche, darunter die Weiterleitungen des Routers und der Zustand des Fronts. Der Probelauf unter Prüfen zeigt den Plan der Website und den Plan von TurboDNS zusammen, und ein Anwenden sendet beide. Das Zertifikat kommt von Let’s Encrypt (HTTP-01, wobei der Front die Datei auf Port 80 ausliefert, oder DNS-01 über TurboDNS oder Cloudflare; WebHostPro erneuert es, wenn 30 Tage oder weniger bleiben), oder es ist ein hochgeladenes, das des NAS selbst oder ein selbstsigniertes.

Nach dem Anwenden hat die Übersicht der Website die Karte <Name> fertig einrichten: Website angewendet, Einträge in TurboDNS, Beim Registrar, Live-Prüfung, Zertifikat und Abschließen. Jetzt prüfen liest die Nameserver der übergeordneten Zone, das TurboDNS dieses NAS, drei öffentliche Resolver und den Front und sagt, dass es nicht sehen kann, ob die Ports 53, 80 und 443 das NAS aus dem Internet erreichen; die Zeile Zertifikat bittet Let’s Encrypt um das Zertifikat. Die Zeile Einträge in TurboDNS ist erledigt, sobald der Plan von TurboDNS für die Domain nichts mehr zu ändern findet, nach dem Probelauf des Assistenten, nach Einträge senden in der Zeile oder nach einem erneuten Senden gleichermaßen, und zeigt dann In TurboDNS seit <Zeit>; eine Website, deren Einträge schon in der Zone sind, bekommt das vom Probelauf allein.

Jede Änderung ist zuerst ein Entwurf. Der Probelauf schreibt die ganze Webschicht in einen Arbeitsordner, führt dort nginx -t, httpd -t und php-fpm -t aus und zeigt die hinzugefügten, geänderten und entfernten Dateien mit ihren Unterschieden. Das Anwenden führt genau diesen Plan aus, behält vorher einen Snapshot der laufenden Dateien, lädt sanft neu und stellt den Snapshot wieder her, wenn ein Schritt fehlschlägt. Eine Website zu löschen verlangt, dass ihr Name getippt wird; ihr Ordner und ihre Datenbanken bleiben.

Bei einer Proxy-Website listet App auf diesem NAS die installierten Apps auf, für die WebHostPro eine Vorlage hat: Rtorrent 16 und seine Add-ons, Radarr, Sonarr, Prowlarr, Lidarr, Bazarr, Seerr, Tautulli, qBittorrent, Transmission, TunerHub, Weblate, Tolgee, Bucket & Code Server IDE, Plex Media Server und Jellyfin. Die Auswahl einer App setzt das Ziel auf den Port, den ihr Paket verwendet, und schaltet Websockets ein, wenn die App sie braucht. Der Front-Server schickt der App dann X-Forwarded-Host und X-Real-IP, gibt einer App mit langen Anfragen bis zu einer Stunde für die Antwort und streamt Medien und Ereignisse ohne Pufferung, wenn die App sie sendet. Eine Einstellung, die nur die App selbst ändern kann, etwa die URL Base einer *arr-App, steht in einer Zeile unter der Auswahl.

05Standard-Website

Eine Anfrage für einen Namen, den keine Website hat, etwa die Adresse oder den Namen des NAS, landet auf der Standard-Website: dem freigegebenen Ordner Web von QTS, wenn das NAS einen hat, den WebHostPro nutzen kann, sonst einer Startseite im Datenordner von WebHostPro. Apache httpd liefert sie aus, daher funktionieren die .htaccess-Dateien des Ordners; nur Options-Zeilen ignoriert httpd. Ihr PHP läuft unter einem eigenen Konto. Nach der Installation oder dem Update ist sie als Entwurf eingeschaltet: Der nächste Probelauf und das Übernehmen schalten sie live. Sie antwortet auf den Ports des Front-Servers: auf 80, sobald der Front-Server auf der Seite Front und Ports dorthin verlegt wurde, sonst auf 9542. Solange der Webserver von QTS Port 80 belegt, nennt ihre Seite in WebHostPro die Einstellung, die in QTS auszuschalten ist. Die Ordner anderer Websites im Ordner Web, Dateien und Ordner, deren Namen mit einem Punkt beginnen (außer .well-known), und Ordner von QTS, die mit @ beginnen, liefert sie nie aus; eine Ordnerliste zeigt sie nicht. WebHostPro ändert die Berechtigungen des Ordners nicht. Ordner im freigegebenen Ordner Web, die Links auf andere freigegebene Ordner oder Volumes sind, funktionieren wie mit dem Webserver von QTS, auch für PHP.

Über HTTPS antwortet sie mit dem eigenen Zertifikat des NAS, dem, das QTS für seine eigenen Seiten verwendet; solange das QNAPs selbstsigniertes Zertifikat ist, zeigen Browser eine Warnung. Eine TLS-Anfrage an eine Website ohne TLS wird abgewiesen.

WebHostPro rotiert seine Protokolle selbst: ab 10 MiB oder nach einer Woche, fünf mit gzip komprimierte Kopien bleiben erhalten, und nginx und httpd öffnen ihre Protokolle neu, ohne eine Anfrage zu verlieren.

06Datenbanken

Eine Website bekommt eine Datenbank und einen Benutzer von MariaDB, Percona Server oder PostgreSQL auf der Seite Datenbanken oder in ihrem Reiter Datenbank. Percona Server 8.4 wird eingerichtet, wenn die erste Percona-Datenbank angelegt wird, und lauscht auf 127.0.0.1:9555 und auf einem Socket; ein NAS, das ihn nie nutzt, startet ihn nie. Die Seite Datenbanken hat eine Karte für MariaDB und eine für Percona Server mit acht Einstellungen (Buffer-Pool, Verbindungen, größtes Paket, Redo-Log, temporäre Tabellen, Tabellen-Cache, Leerlaufzeit, Zeit für langsame Abfragen) und weiteren my.cnf-Zeilen, geprüft gegen die Optionsliste des Servers selbst. Eine Änderung ist ein Entwurf; das Anwenden startet den Server neu, sodass seine Datenbanken für ein paar Sekunden nicht antworten.

07Mit den anderen Apps auf dem NAS

Läuft TurboDNS auf dem NAS, bietet der DNS-Schritt des Assistenten ihm die Zone an, und das Anwenden sendet die Einträge. Ohne MailServerPro tragen sie keine Mail-Einträge: Eine neue Zone bekommt die Nameserver ns und ns1, beide dieses NAS, sofern Sie keinen zweiten Nameserver nennen, und die A- und AAAA-Einträge der Namen der Website, von ns und von ns1; eine Zone, die TurboDNS schon bedient, behält ihre eigenen Nameserver. Ist MailServerPro installiert, bekommt die Zone die Hosting-Vorlage von TurboDNS mit den öffentlichen Adressen des NAS, die Sie bestätigen, die A- und AAAA-Einträge der eigenen Namen der Website (die Vorlage deckt die Domain, www, ns, ns1 und die Mail-Namen ab, sodass eine zweite Website wie shop.example.com ihre eigenen bekommt) und die DKIM-, MTA-STS-, TLS-RPT- und TLSA-Einträge von MailServerPro. Nichts wird vor dem Anwenden an TurboDNS geschrieben, und Prüfen zeigt vorher jeden Eintrag.

Die dritte Antwort des DNS-Schritts, Cloudflare oder OVHcloud, aus der Zone, die TurboDNS auf diesem NAS führt, sendet TurboDNS dieselben Einträge wie die erste Antwort, und ein DNS-Anbieter antwortet für die Domain. TurboDNS überträgt die Zone über die API des Anbieters, und nur auf Ihren Klick: Öffnen Sie die Zone in TurboDNS, den Reiter Cloudflare und OVH, Änderungen prüfen, dann Änderung(en) übertragen. Der Schritt Registrar nennt dann keine Nameserver, keine Glue-Records und keinen Port 53: Der Registrar behält die Nameserver des Anbieters, und die Zone braucht keine Weiterleitung von Port 53 am Router. Die Live-Prüfung besteht dann auf den öffentlichen Resolvern und am Front, und die Zeilen Nameserver beim Registrar und Glue-Records sind übersprungen.

Ist Bucket & Code Server IDE installiert, öffnet der Reiter Dateien einer Website ihren Ordner im Editor.

08Ohne öffentliche Adresse

Ein NAS hinter CGNAT oder hinter einem Router, der keine Ports weiterleitet, kann ausgewählte Websites über einen Cloudflare Tunnel im Internet anbieten. Die Karte Websites über Cloudflare aus dem Internet erreichbar machen auf der Seite Front und Ports nimmt ein API-Token Ihres Cloudflare-Kontos und eine Zone, deren Nameserver die von Cloudflare sind. WebHostPro legt dann einen eigenen Tunnel an und startet cloudflared, das sich selbst nach außen mit Cloudflare verbindet. Jede angewendete Website bekommt einen Schalter, der ihren Namen in der Zone einen über Cloudflare geleiteten (proxied) CNAME-Eintrag auf den Tunnel gibt; einen Namen, der schon einen A-, AAAA- oder CNAME-Eintrag hat, den WebHostPro nicht angelegt hat, lehnt WebHostPro ab. Schalten Sie den Tunnel aus, löscht WebHostPro seine Einträge und den Tunnel. Cloudflare beendet TLS und sieht den Datenverkehr, und im kostenlosen Tarif kann eine Anfrage höchstens 100 MB hochladen.

09Installation

Empfohlen: aus dem App Center. Fügen Sie das Repository dieser Seite einmal hinzu; danach installiert und aktualisiert sich das Paket aus dem App Center wie jede andere App.

  1. App Center → ⚙ Einstellungen → App-Repository → Hinzufügen.
  2. Nennen Sie es QNAP Utilities, fügen Sie https://www.qnaputilities.com/repo.xml ein, dann Hinzufügen.
  3. Öffnen Sie QNAP Utilities in der linken Leiste und installieren Sie (example) WebHostPro.

Die Repository-Übersicht: jedes Paket im Feed →

10Was es braucht

Ein QNAP-NAS mit x86_64-Prozessor (Intel oder AMD) unter QTS 6.0 oder QuTS hero 6.0 oder neuer.

Das Panel liegt auf Port 9541 (HTTPS; 9540 leitet dorthin um), der Front (nginx) auf 9542 (HTTP) und 9543 (HTTPS und UDP für HTTP/3, wenn nginx es hat), und httpd dahinter auf 127.0.0.1:9544. Die Datenbanken, Caches und optionalen Dienste lauschen nur auf 127.0.0.1. Der Front wechselt erst auf die Ports 80 und 443, wenn Sie ihn auf der Seite Front und Ports anklicken, die die Schritte in QTS aufführt, die diese Ports freigeben, und was jeder davon stört; WebHostPro ändert die Einstellungen von QTS nie selbst.

Auf QuTS hero kann ein Freigabeordner mit erweiterten Ordnerberechtigungen keine Websites aufnehmen: Das Anwenden stoppt, nennt den Ordner und fragt erneut. WebHostPro 0.14.4 wurde auf QTS 6.1.0 und QuTS hero 6.1.0 ausprobiert.

11Verwandte Seiten