An example built with Bucket & Code Server IDE. A web hosting stack built from source: nginx in front of every site and Apache httpd behind it for the sites that use it, PHP 8.1 to 8.5 side by side, MariaDB, Percona Server 8.4 (on x86_64), PostgreSQL, memcached and Valkey, with Node.js, Grafana and OpenSearch as optional services. Each site has its own account and a folder in a QTS shared folder or in the package's data folder; its PHP runs as that account and cannot read another site's files. A PHP site runs its own PHP-FPM master with its own version and settings (limits, time zone, errors, sessions, OPcache and the JIT, extensions, its own php.ini lines and its pool of workers), so a crash or a busy PHP on one site leaves the others alone. A domain wizard adds a site: static files, PHP, or a proxy to a service on the NAS or the local network, with templates for the apps installed on the NAS (Rtorrent 16, Radarr, Sonarr, Prowlarr, Seerr, Weblate, Tolgee and more); a database; DNS records sent to TurboDNS, with the values to enter at the registrar; a certificate from Let's Encrypt (HTTP-01, or DNS-01 through TurboDNS or Cloudflare), an uploaded one, the NAS's own or a self-signed one. After the apply, a checklist on the site's page checks the domain from the parent zone to the front and asks Let's Encrypt for the certificate. A site's Cache tab compresses answers with Brotli, zstd and gzip, keeps a PHP site's pages in a page cache once it is turned on, and sets how long browsers keep static files; the Databases page holds the settings of MariaDB and Percona Server. Each site's page shows its disk use and logs, gives its files back to the site with Fix permissions and, with Bucket & Code Server IDE installed, opens its folder in its editor. A NAS without a public address (behind CGNAT, or behind a router that forwards no ports) can publish chosen sites through a Cloudflare Tunnel of WebHostPro's own: cloudflared connects out to Cloudflare, and each site's switch gives its names in the zone a proxied CNAME to the tunnel; it never replaces an A, AAAA or CNAME record WebHostPro did not make. A request for a name no site has, such as the NAS's address, gets the default site without a domain, over HTTP and over HTTPS with the NAS's own certificate: QTS's Web shared folder, served by Apache httpd so its .htaccess files work, or a start page. The package rotates and compresses its own logs. Every change is a dry run first, with a snapshot kept before it. The first sign-in from the local network sets the panel's password.
Install
Add the QNAP Utilities repository to App Center once, then install it from there: how to add the repository.Screenshots
What you can do
- Add a site with a wizard: static files, PHP, or a proxy to an app on the NAS
- Run each PHP site on its own PHP version, from 8.1 to 8.5
- Get Let's Encrypt certificates that renew by themselves
- Publish sites through a Cloudflare Tunnel when the NAS has no public address