Unofficial
On this page
  1. Before we begin: hardware, an address and room for the apps
  2. 1. Making room on ports 80 and 443
  3. 2. A room of its own for each app
  4. 3. FreshRSS: let the stories come to you
  5. 4. Heimdall: one bookmark for the whole NAS
  6. 5. FileRise: preview a file and pass it on
  7. 6. If something stumbles, start with the symptom
  8. 7. Returning the ports to QTS: order matters
  9. Finish by opening your own start page
  10. Versions, sources and illustrations

Three apps and one QNAP. Building our own corner of the network

A news reader, a proper start page, and files you can preview and share in a browser. All on your own NAS. First we will give WebHostPro ports 80 and 443, then set up FreshRSS, Heimdall and FileRise. Step by step, with the commands and an explanation of what they actually do.

Discuss on the forum (community.qnap.com) · The column from the same issue: Night of the Living Servers

Hello, QNAP people!

It was supposed to be a quiet evening at the computer. A few stories to read, a photo to show the family, perhaps a little housekeeping in the bookmarks. Except every app has a different address, the stories are scattered across several websites, and the file you need has disappeared into another folder. That sounds like a good little workshop: the kind that leaves you with something working.

We will start with WebHostPro and install three open-source apps, each in its own folder. FreshRSS will collect new articles from the sites you choose. Heimdall will organise the entrances to your NAS services. FileRise will add previews and sharing links to your files. At the end, we will cover the common stumbling blocks and the route back to QTS's Web Server.

Heimdall start page with tiles for apps on the NAS

Before we begin: hardware, an address and room for the apps

You need an Intel/AMD QNAP NAS with x86_64 architecture, running QTS 6.0 or QuTS hero 6.0 or newer. We will install WebHostPro 0.8.2 and use PHP 8.4. Select the current PHP 8.4 patch release available in WebHostPro.

In App Center → Settings → App Repository → Add, enter the name QNAP Utilities and the address https://www.qnaputilities.com/repo.xml. Then install (example) WebHostPro from the QNAP Utilities list. You can also find illustrated help in the hosting guide.

We will download the application files over SSH using an administrator account. Enable SSH in Control Panel → Network & File Services → Telnet / SSH by selecting "Allow SSH connection". WebHostPro has no file-upload function in its panel; you can use SSH, SMB or File Station.

Our example NAS address is 192.168.1.20. Substitute your own address throughout, including in the names:

AppSite nameWeb server
FreshRSSrss.192-168-1-20.nip.iohttpd
Heimdallhome.192-168-1-20.nip.ionginx
FileRisefiles.192-168-1-20.nip.iohttpd

The nip.io service reads the address from the name: rss.192-168-1-20.nip.io resolves to 192.168.1.20. For a NAS at 10.0.0.5, use rss.10-0-0-5.nip.io.

This is still a local network. A nip.io name pointing to a private address does not publish the site on the Internet. The computer or phone needs access to that network, directly or through a suitably configured VPN. This guide does not create router port forwards. We will run the sites without TLS, over HTTP; this setup is intended for a trusted local network. HTTP does not encrypt the data or login credentials sent over it.

1. Making room on ports 80 and 443

WebHostPro has its own nginx front server. Initially, it accepts connections on 9542 for HTTP and 9543 for HTTPS. The management panel runs separately on 9541. Remembering that distinction will save you from looking for your website in an administration window later.

First sign-in

Click Open in App Center, or visit https://192.168.1.20:9541/. The panel uses a self-signed certificate. If your browser asks whether to trust it, check that you are opening the correct local address of your NAS.

On the "First sign-in" page, enter a password of at least 10 characters twice and click "Set the password". The form accepts it from a computer on the LAN, within 60 minutes of the panel starting.

Setting the password at WebHostPro's first sign-in

Find out what holds the ports

Open "Front and ports". The message "80 and 443 are taken: the front stays on 9542 and 9543" means you must free those ports first. The panel names the program, the change needed in QTS, and its consequences. WebHostPro does not change the QTS settings for you.

Front and ports showing that ports 80 and 443 are occupied

Free port 80

In Control Panel → Applications → Web Server, clear "Enable Web Server" and click "Apply".

QTS Web Server enabled in Control Panel Enable Web Server cleared in QTS

QTS displays the warning: "Disabling the web server may affect the service of applications in the App Center." Confirm with OK. Applications previously served by that web server will no longer be served by it. This includes addresses such as /phpMyAdmin/ if they relied on that mechanism. Moving the front server does not automatically migrate every such application.

QTS warning before disabling its Web Server

Move the QTS panel to 8443

Open Control Panel → System → General Settings → System Administration. Under "Enable secure connection (HTTPS)", change "Port number" from 443 to 8443, then click "Apply".

QTS administration settings with HTTPS on port 443 QTS administration HTTPS port changed to 8443

The panel's new address is https://192.168.1.20:8443/. The address http://192.168.1.20:8080/ remains an alternative if HTTP access is still enabled on that port. Update your bookmarks and saved links, including myQNAPcloud references.

If you already have a router forward pointing to port 443 on the NAS, check its destination: after this change, WebHostPro will answer there. Moving the QTS panel does not update the router rule.

Give the ports to WebHostPro

Return to "Front and ports". When you see "80 and 443 are free.", click "Move the front to 80 and 443". The app checks the server configurations, applies the change, and keeps the previous files in a snapshot.

WebHostPro reporting that ports 80 and 443 are free Confirmation that the front server has moved to ports 80 and 443

Open http://192.168.1.20/. The Default site serves QTS's Web folder for names not used by any of your sites, including the NAS address itself. It runs PHP and reads .htaccess. What appears depends on the files in Web; the illustration shows an example using index.php.

An example page from the Web folder served by the Default site

Its settings are under "Sites" → "Default site". Over HTTPS, it uses the QTS certificate. If that certificate is self-signed, the browser will warn. The Default site does not show a directory listing or serve your sites' folders, names starting with a dot (except .well-known), or QTS folders starting with @.

WebHostPro Default site settings

2. A room of its own for each app

WebHostPro gives each site its own folder, account and PHP. Visitors see the site's public subfolder. Let's go through the wizard for FreshRSS; you will repeat the same route for the other two names.

1. Domain. In "Sites", click "Add site". Enter rss.192-168-1-20.nip.io and clear "Also www.rss.192-168-1-20.nip.io". When the panel asks where to save the sites, choose the Web shared folder. The commands below refer to that location. On QuTS hero, the folder used for sites must not have Advanced Folder Permissions enabled. If the panel reports this problem, choose a suitable separate folder and use its path in the commands.

The Domain step with the FreshRSS site name

2. DNS. Select "My registrar or DNS provider". Clear both public-address fields for the NAS: IPv4 and IPv6. The nip.io name already resolves to the right address. The message "Without an IPv4 address there are no records to show and no checklist; the site works for the names this NAS answers for." is expected here.

The DNS step with both IPv4 and IPv6 address fields cleared

3. Registrar. There is nothing to change here for nip.io.

The Registrar step of the site wizard

4. Website. Select PHP. Set "Web server" to httpd for FreshRSS and FileRise; their .htaccess rules need to be read. For Heimdall, select nginx. Set "PHP version" to 8.4 and note the location following "Its folder: …".

The Website step with PHP 8.4 and httpd

5. Database. Leave "No database" selected. The apps will use files or SQLite; we are not setting up a separate SQL server.

The Database step with No database selected

6. Certificate. Select "No TLS". Moving the front server to 443 does not automatically enable HTTPS on every site. The separate hosting guide covers a public domain with Let's Encrypt.

The Certificate step with No TLS selected

7. Review. Check the settings, click "Dry run", and read the list of files and the configuration-check results. Then choose "Apply this plan". A dry run alone leaves the changes as a draft.

Review of the new site's settings Dry run showing the files and configuration checks Confirmation that the site plan has been applied

8. Permissions: after copying the app. Files copied with an administrator account need to be assigned to the site's account. On the "Files" tab, click "Fix permissions" and confirm. Do this after each installation below, before opening the app for the first time.

The Files tab for the FreshRSS site Confirming the permission repair Summary of the permission repair for the site's files

The commands below are for fresh installations in separate directories created by the wizard. If you chose somewhere other than Web, adjust cd to match "Its folder: …". Check that changing directory succeeded before running the next commands. These sequences are not update instructions for existing installations.

3. FreshRSS: let the stories come to you

An RSS reader has a pleasant quality: it lets you choose your sources and bring them together. An evening visit to familiar websites can start with one reading list. We will install FreshRSS 1.30.4, using PHP 8.4 and httpd.

Sign in over SSH as an administrator and run:

cd /share/Web/rss.192-168-1-20.nip.io
wget -O FreshRSS-1.30.4.zip https://github.com/FreshRSS/FreshRSS/archive/refs/tags/1.30.4.zip
unzip -q FreshRSS-1.30.4.zip
cp -a FreshRSS-1.30.4/. public/
cp public/.htaccess.dist public/.htaccess
rm -r FreshRSS-1.30.4 FreshRSS-1.30.4.zip

FreshRSS keeps its web pages in p, while WebHostPro serves public. We therefore copy the whole project into public and enable the supplied .htaccess.dist. The .htaccess rules block access to data, app and the other internal folders. This setup requires httpd; nginx does not read those files.

Click "Fix permissions", then open http://rss.192-168-1-20.nip.io/. The installer takes you through the language, requirement checks, choosing SQLite, and creating the first user.

Language selection in the FreshRSS installer FreshRSS installer checking the requirements

The warning that the web server's document root does not point to ./p/ follows from this layout. Also check that visiting http://rss.192-168-1-20.nip.io/data/ is blocked: a 403 or 404 response is desirable; the data contents should not open. If they do, revisit the httpd selection and the .htaccess copying step. An error for the directory address alone does not prove that the files inside are protected, however. Keep the application's supplied .htaccess files, including those in data and app with Require all denied, and use the httpd server that reads them.

SQLite configuration in the FreshRSS installer Creating the first FreshRSS user The final screen of the FreshRSS installer

Add a feed with the + button next to "Subscription management". For a start, you could choose:

  • NASA Image of the Day: https://www.nasa.gov/feeds/iotd-feed/.
  • selfh.st: https://selfh.st/rss/.
  • Hacker News: https://news.ycombinator.com/rss.
Adding an RSS feed in FreshRSS Article list in FreshRSS Reading an article with a NASA photograph

You can change the language in the display section of the settings. The light or dark appearance follows the browser's preference. "Update feeds" fetches new articles manually. To let the reader do that by itself, we need one more thing: a schedule.

Half an hour between rounds: online cron

WebHostPro has no scheduler of its own. We will use the online cron mechanism described in the FreshRSS documentation.

Open Profile from the settings behind the gear button. Set a long random "Master authentication token" and click "Submit". For this command, choose a random string of letters and digits, without special characters that need additional URL or shell encoding. Replace ola with your own user, YOUR_TOKEN with the token, and adjust the site name to match the NAS address:

echo "13,43 * * * * curl -s -H 'Host: rss.192-168-1-20.nip.io' 'http://127.0.0.1/p/i/?c=feed&a=actualize&maxFeeds=10&ajax=1&user=ola&token=YOUR_TOKEN' >/dev/null 2>&1" >> /etc/config/crontab
crontab /etc/config/crontab && /etc/init.d/crond.sh restart

The request runs at 13 and 43 minutes past each hour. The address 127.0.0.1 leads to the same NAS, while the Host header selects the FreshRSS site. This entry assumes that the front server is on port 80. maxFeeds=10 limits an individual call; it does not promise to refresh an arbitrarily large feed collection all at once.

The >> operator appends a line. Add it once, then make later corrections to the existing entry so that you do not accumulate identical jobs.

4. Heimdall: one bookmark for the whole NAS

Next comes Heimdall 2.8.3. Add the site home.192-168-1-20.nip.io, choose PHP 8.4 and nginx, and complete the remaining steps as before. Heimdall requires PHP 8.4 or newer. WebHostPro's nginx sends addresses that do not match a file to index.php, as the application requires.

The Website step with PHP 8.4 and nginx for Heimdall

Over SSH, run:

cd /share/Web/home.192-168-1-20.nip.io
wget -O Heimdall-2.8.3.zip https://github.com/linuxserver/Heimdall/archive/refs/tags/v2.8.3.zip
unzip -q Heimdall-2.8.3.zip
cp -a Heimdall-2.8.3/. .
rm -r Heimdall-2.8.3 Heimdall-2.8.3.zip
cp .env.example .env
sed -i 's|tempnam("/tmp"|tempnam(sys_get_temp_dir()|' app/Helper.php

Heimdall's public folder lands in the site's public. Copying .env.example to .env is a step from the Heimdall README; on the first visit, the app creates its key and SQLite database.

The last line corrects the choice of temporary directory. Heimdall checks a tile's icon in a file under /tmp, while the site's PHP has access to its own folder and temporary directory. sys_get_temp_dir() lets it use the appropriate one. Without this correction, saving a tile with an icon can end in "500 Server Error".

Click "Fix permissions" and open http://home.192-168-1-20.nip.io/.

Heimdall before any application tiles have been added

Click "Add an application here". Pick an application type, such as QNAP. Heimdall fills in the icon and colour. Enter the name and address: for the relocated QTS panel, use https://192.168.1.20:8443/; the http://192.168.1.20:8080/ shown in the illustration also makes sense if you still use that entrance. Click "SAVE".

Adding a QNAP tile in Heimdall

If an app is not on the list, choose None and use "Upload an icon" to add an image. Start with FreshRSS, FileRise, QTS and WebHostPro. Then add the services you use: Rtorrent 16, Radarr, Sonarr, Prowlarr, Seerr or Bucket & Code Server IDE. Each tile should lead somewhere you actually visit. These are shortcuts to existing services; adding a tile does not install an app.

An example Heimdall start page with service tiles

5. FileRise: preview a file and pass it on

We will run FileRise 3.38.0 at files.192-168-1-20.nip.io. Choose PHP 8.4 and httpd in the wizard. The app requires PHP 8.3 or newer, and its .htaccess contains address rules and restrictions on direct calls to internal PHP files.

Over SSH, run:

cd /share/Web/files.192-168-1-20.nip.io
wget -O FileRise-v3.38.0.zip https://github.com/error311/FileRise/releases/download/v3.38.0/FileRise-v3.38.0.zip
unzip -q -o FileRise-v3.38.0.zip
rm FileRise-v3.38.0.zip
sed -i "s|'/var/www/|PROJECT_ROOT . '/|" config/config.php
sed -i "s|'America/New_York'|'Europe/Warsaw'|" config/config.php
mkdir -p uploads users metadata

The archive has no enclosing directory: its public lands directly in the site's public. The first sed changes the configured locations of uploads, users and metadata from /var/www to the application folder, alongside public. The second sets the time zone. The FileRise documentation describes this way of adjusting the locations.

Click "Fix permissions", open http://files.192-168-1-20.nip.io/, and create the administrator account.

Creating the FileRise administrator account

In this setup, FileRise works within its own site folder. It shows files uploaded through the app or copied into its uploads directory; it does not automatically open every shared folder on the NAS. Keep that in mind if you sign in and wonder where your family photo collection has gone.

Change the language in "User Panel". Add a folder with New → "Create Folder", then click "Choose files" and "Upload".

Uploading files to FileRise A FileRise folder in list view

Switch to gallery view for thumbnails. Pictures and videos open in the page's preview; a PDF appears in a new tab using your browser's PDF viewer.

FileRise gallery showing photograph thumbnails Image preview in FileRise Video preview in FileRise A NASA report in the browser's PDF viewer

Sharing without creating an account for the recipient

Click the share button beside a file. Choose how long the link remains valid: from 30 minutes to a day, or a custom period. You can also add a password. Click "Generate Share Link", then "Copy link". Folders can be shared too.

Link expiry and optional password settings A generated FileRise sharing link

The recipient does not need a FileRise account. They will see the file and the open and download buttons; if you set a password for the link, they will need to enter it. They must still have access to this local network or connect through a VPN. Sending files.192-168-1-20.nip.io to someone outside your home does not create a route to your NAS for them.

A shared file viewed without signing in to a FileRise account

6. If something stumbles, start with the symptom

SymptomWhat to check
A nip.io name will not openThe router may block DNS answers containing private IP addresses through DNS rebinding protection. Allow the required names, or add the names and NAS address to the computer's hosts file.
"Move the front to 80 and 443" is greyed outDrafts may be waiting on "Sites". Run "Dry run" and apply them, or discard them.
The ports are still occupiedRead which program is named on "Front and ports", then change the settings of the relevant service.
A new site returns 403Check the contents of public and use "Fix permissions".
The first Heimdall visit ends in 500Check that .env exists and inspect the site's permissions. For a fresh installation, complete the .env.example copying step and use "Fix permissions".
Heimdall reports "500 Server Error" for an iconCheck the tempnam correction made by the sed command.
FreshRSS is not fetching articlesUse "Update feeds", then check the cron entry, user, token, Host header and front-server port.
A QTS update has taken port 80 againCheck which program holds the port. WebHostPro offers to move the front back to 9542 and 9543.

7. Returning the ports to QTS: order matters

First free the ports in WebHostPro, then give them back to QTS.

  1. In "Front and ports", click "Move the front back to 9542 and 9543".
  2. In QTS → Control Panel → System → General Settings → System Administration, restore HTTPS to 443.
  3. In Control Panel → Applications → Web Server, select "Enable Web Server" again and apply.
WebHostPro's front server back on ports 9542 and 9543

WebHostPro sites remain available with the port number included, for example http://rss.192-168-1-20.nip.io:9542/. Update your Heimdall tiles too.

Remember cron: in the earlier entry, change http://127.0.0.1/p/i/ to http://127.0.0.1:9542/p/i/. The rest of the address, user, token and Host header stay the same. After editing /etc/config/crontab, run this again:

crontab /etc/config/crontab && /etc/init.d/crond.sh restart

Finish by opening your own start page

You should recognise the three apps you created on the "Sites" page. Open each one: add a feed, check a tile, upload a file and try its sharing link in another browser session.

WebHostPro's Sites page with FreshRSS, Heimdall and FileRise

That is a satisfying end to an autumn evening. You have a reader with your own sources, organised entrances to your services, and a place for files you want to show the family. Along the way, you have learnt where their directories are, which service handles the ports, and why one app needs httpd while another runs on nginx.

Next time, you will only need to open Heimdall. At least, that is the plan.

Versions, sources and illustrations

AppVersion used in this guideLicence or availability
WebHostPro0.8.2Free of charge, from the QNAP Utilities repository
FreshRSS1.30.4AGPL-3.0
Heimdall2.8.3MIT
FileRise3.38.0MIT for the core version; FileRise Pro is a separate paid edition

The illustrations come from QNAP Forum Polska's materials for this guide. The example NASA photographs (AS08-14-2383, AS17-148-22727, AS11-40-5903 and KSC-69PC-413) come from images.nasa.gov. The video is "Artemis I Rollout for Launch - TIMELAPSE", NASA/Frank Michaux and Kim Shiflett. NASA SP-214, the "Apollo 11 Preliminary Science Report", is available from NTRS.

Discuss on the forum (community.qnap.com) · The column from the same issue: Night of the Living Servers