Skip to content

Site deployment

This is the overall order for setting up TreeT at a site. (The installers and detailed procedures are provided together with the deployment package supplied when you adopt TreeT.)

Prepare the following before installation. The default is to use a separate machine for each role, but depending on the size of the site you can combine them.

RoleCountWhat to prepare
CMS server1 per site
(one CMS can run several sites)
Ubuntu 26.04 LTS. The installer installs Docker itself → Installing the CMS server
KioskN per site
(usually 10–30)
One of Windows, Linux, or Android. A display and a wired network connection.
Minimum: Windows 10 or later (64-bit) · 64-bit Linux (x86-64 · Raspberry Pi confirmed on Pi 5 with a 64-bit OS) · Android 7.0 or later
Sync server1 when using multi-screenWindows 10 or later (64-bit) or 64-bit Linux (x86-64 · arm64). No separate runtime to install (a single executable)
Edge relay1, closed-network sites onlyWindows 11 22H2 or later, a machine connected to both the internal and external networks

This is the table to use when configuring firewalls and routers. Note first that there are two directions — most traffic goes from the kiosk out to the server, but remote control is the one exception that comes in the other way.

PortWhat it’s forConnects toIf blocked
8443CMS secure connection — registration · settings · scheduling · content downloadCMS (or MqttEdge)The screen won’t switch to a new schedule
8080CMS plaintext connection — sites not using httpsCMSSame as above
8883MQTT (TLS) — remote commands · status reportingCMS broker (or MqttEdge)Remote control and immediate updates won’t work. Playback itself continues
53000 and upSync playback — one port per sync poolSyncServerPlayback across multiple screens goes out of sync

⚠️ Sites running on https (8443) don’t open 8080 to the outside — because it’s a plaintext entrance. So kiosks outside the site (on a different network) should set both the CMS address and the content address to https://…:8443. If you change only the CMS address in the device settings, the content address follows along automatically — if the two used to share the same entrance, it changes even the port, becoming something like https://…:8443/data.

⚠️ Android 7.0 and below need TreeTview Android 2026.9.135 or later — this applies at sites where the CMS uses a Let’s Encrypt certificate (https 8443). Those devices don’t recognize Let’s Encrypt’s root certificate (ISRG Root X1), so they can’t trust the CMS and can’t connect (measured on a Galaxy Note4 · Android 6, 2026-09-22). From 2026.9.135 on, the app carries that root certificate itself, so it connects. Devices with an older version installed can’t reach the CMS, so they can’t be updated through the CMS — you must install the new version directly.

⚠️ The 53000 range only travels within the site — it never goes out to the internet, so there’s no need to open anything on the router. Adding a pool increases the number by one each time (53001, 53002, …) — the CMS finds an open number for you.

PortWhat it’s forIf blocked
5900VNC remote control — view and operate that screen directlyThe remote control button won’t open

🔴 This is the only one that goes the other way. If you open every other port but miss this one, only remote control fails — and since everything else works fine, it’s hard to find the cause. If different devices use different ports, enter address[:port] in the Remote access field via Devices → Edit basic information at the top of the device page (Admin and above).

Ports used only on the admin side (unrelated to the kiosk)

Section titled “Ports used only on the admin side (unrelated to the kiosk)”
PortWhat
4822 · 8080Guacamole internal communication
5500 · 5901VNC repeater (server side / viewer side, in a closed-network setup)

🔵 The database port (3306) is never opened to the outside. It’s only used within the stack.

When there’s an edge relay, kiosks connect only to the edge, not directly to the CMS. The edge opens 8883 (MQTT) and 8443 (content proxy) toward the site, and outward it has only one connection from the edge to the central server.

⭐ So even on a closed network, there’s no need to open an inbound hole in the router — because the edge only makes outbound connections.

🔵 Follow this order. In particular, do not swap steps 2 and 3 — the CMS address is entered on the player screen, so the player must be installed first.

  1. Install the CMS — set up the server on the CMS host and settle its access address (IP/domain + port). → Installing the CMS server
  2. Install programs on the kiosks — install the player (+ the watchdog, and the sync server if needed). → “Installing on the kiosk PCs” below
  3. Enter the CMS address — press F8 on the player screen. For the watchdog and sync server, enter it during installation (from the versions noted below), or later with a command or in a file. → “Entering the CMS address” · “Other programs need the CMS address too” below
  4. 🔴 Check that it took effect — look with your own eyes at the [사이트설정] 확인 line in the player log. → “How to check that it took effect” below. If you skip this step, you won’t be able to find the cause later.
  5. (HTTPS + IP address sites only) Register the server certificate as trusted — “Sites that use an IP address” below.
  6. Register devices + schedule — once the address is correct, the player registers itself with the CMS (it also gets its device certificate automatically). In the CMS admin console, set up content and schedules. New program versions are received by every device together, according to the CMS’s update mode (automatic · manual) (admin console).

Each program needs different permissions. You should know this in advance when planning the installation order.

ProgramInstallation permissionInstalled to
TreeTview (player)Regular userThat user’s personal folder
🔴 SyncServer (sync)AdministratorProgram folder (shared)
🔴 Watchdog (monitoring)AdministratorProgram folder (shared)
🔴 MqttEdge (closed-network relay)AdministratorShared folder

The player is the only program installed as a regular user, and it is installed separately for each account — if several people use the same PC, you must log in with the relevant person’s account to install.

Instead of running the installer directly, you can also check and install from the viewer screen. When the CMS has a new version to hand out to that device (program versions), do the following on site:

  1. On the viewer, press F8 to open the settings screen.
  2. Under 프로그램 업데이트 (Program update), press [확인] (Check) — the current version and status are shown.
  3. If there is something to install, [지금 설치] (Install now) becomes available.

Updating Linux devices — there is no installer

Section titled “Updating Linux devices — there is no installer”

Linux has no installer file like Windows’ .exe. The installation package is a single archive (.tar.gz), which also contains a list of checksums for every file, and a signature for that list. Receiving new versions from the CMS (outside operating hours · [지금 설치] (Install now)) works the same way as on Windows.

WindowsLinux
What you getInstaller file (.exe)Archive (.tar.gz) + a signed file list
How it installsRuns the installer silentlyExtracts to a new folder and swaps the folder in
What is verifiedThe file’s signatureThe list’s signature + a checksum for every file
If it doesn’t come upA person has to look at itIt rolls back to the old folder by itself

Once the CMS is up, do this on every kiosk PC that will show a screen.

The installers are in the package’s 설치파일\ (installers) folder (C:\treet\설치파일\) — see “Before you start” in the CMS installation manual. 🔴 Move that whole folder to the kiosk PC and run it on that PC — the installers work relative to the folder they are in.

⚠️ Also take the package’s TreeT_코드서명_공개인증서.cer (TreeT code-signing public certificate) with you. If you don’t register it first, automatic updates will quietly fail (see “Installation and updates” above).

OrderProgramRequired?
1TreeTview — the player that shows the screen✅ Required
2Watchdog — restarts the player if it stops, and installs new versions on its behalf✅ Recommended (effectively required for unattended sites)
3SyncServer — only when several screens must change in stepOnly sites that need it
4🔴 UltraVNC — to view this device’s screen from the CMS✅ Recommended

Keeping the taskbar and notifications from coming up over the screen

Section titled “Keeping the taskbar and notifications from coming up over the screen”

When the player is full screen (kiosk), it sits above the taskbar. Even if a notification or another window briefly takes focus, the taskbar does not come up over the player. If you leave full screen with the shortcut (windowed mode), it goes back down like an ordinary window.

WindowsLinux (Raspberry Pi)
While the player is full screenThe player covers the taskbarThe window manager (labwc) hides the taskbar by itself — the player does not turn the taskbar off
NotificationsThe Watchdog keeps notifications off and turns them back off if they come on—
Swiping in from a touch-screen edgeThe kiosk setup (Settings_All.cmd) turns it off — it is a machine-wide setting, so the Watchdog only reports a mismatch—
Right after power-on—The hardening run at install time removes the taskbar from autostart
In windowed mode—If cursor hiding is on, the player turns the taskbar off (fallback)

⚠️ The cursor is hidden only over the player window — it stays visible on screens the player does not cover (a second monitor, etc.) (same on Windows and Linux).

🔵 When the player is not on screen, the taskbar and cursor are visible — close the player (F4) or move it out of the way (F11) and the taskbar and cursor come back so you can use that PC right away; when the player returns, they go back to what the user chose (with F9 · F10 — if nothing was chosen, both hidden). Even if the player stops unexpectedly, the Watchdog restores the taskbar and cursor.

When the player starts for the first time, it finds the CMS and registers itself. Nobody needs to register it by hand.

It has worked if the device appears in the Devices (기기관리) list in the CMS admin console.

Running the installation check — check-install.ps1

Section titled “Running the installation check — check-install.ps1”

The package (C:\treet) also includes a script that checks whether installation went correctly. It looks at things you can’t tell just from a picture appearing on the screen.

On the kiosk PC, open PowerShell and run these one line at a time.

Before installation — record the current values as a baseline (you need this to say “were the settings preserved?”):

Terminal window
powershell -ExecutionPolicy Bypass -File C:\treet\check-install.ps1 -Before

After installation — check the post-conditions:

Terminal window
powershell -ExecutionPolicy Bypass -File C:\treet\check-install.ps1 -After

-After runs even if you didn’t record -Before. However, it can only say “the values are like this now”; it can’t say what changed.

Entering the CMS address — on the player screen (first time only)

Section titled “Entering the CMS address — on the player screen (first time only)”

Right after installation, the player holds the development default (127.0.0.1). You must enter the address once on that PC for it to find the CMS. This is the only time you do it by hand; after that, you change it from the CMS.

You do it with keyboard shortcuts — there’s no need to open a file.

KeyWhat it does
F8Opens the settings screen ← enter the CMS address here
F11Temporarily moves the screen out of the way (minimize)
F10Full screen on/off — your choice is remembered (stays after a restart)
F9Show/hide the mouse cursor and taskbar (on Linux including the Raspberry Pi taskbar) — your choice is remembered
F4Quit the player
  1. With the player running, press F8.
  2. In the CMS 주소 (CMS address) field, enter the site’s CMS address — for example http://192.168.0.10:8080
  3. 🔴 Also fill in the MQTT 사이트 (MQTT site) field — exactly the same as the site name you were asked for when installing the CMS (including upper/lower case). ⚠️ If you leave it empty, the screen shows but remote commands never arrive — the broker blocks them by topic permission, and no error appears at all.
  4. In the MQTT 주소 (MQTT address) field, if the broker is on the same machine as the CMS, enter just the host part of the CMS address (e.g. 192.168.0.10).
  5. When you save, the player finds the CMS at that address and registers itself.

Even when a Raspberry Pi or Linux machine has no Korean font, Korean · Japanese · Chinese on the settings screen and boot screen display correctly — the player ships its own fonts (the fonts add about 13 MB to the installer). Nothing is downloaded from the internet, so this works on closed networks too.

How to check that it took effect (don’t skip this)

Section titled “How to check that it took effect (don’t skip this)”

After restarting the player, open that PC’s

%APPDATA%\TreeTview\logs\main_<today's-date>.log

and look at the [사이트설정] (site settings) lines near the bottom.

Line you seeMeaning
[사이트설정] 확인 — CMS 주소·MQTT·CA 설정에 걸리는 것 없음.✅ Passed (no problems with the CMS address, MQTT, or CA settings)
✗ CMS 주소가 아직 개발 기본값입니다 (http://127.0.0.1)❌ path.baseUrl was not entered (the CMS address is still the development default)
✗ mqtt.host 가 아직 개발 기본값입니다 (127.0.0.1)❌ A development default is still in mqtt.host. 🔵 The fix is not to enter a value but to empty it (then it follows baseUrl). Enter an address only for a closed-network edge broker
✗ mqtt.site 가 기본값 "site" 입니다❌ The MQTT 사이트 (MQTT site) field is empty — remote commands won’t arrive
· 사이트 CA 가 아직 없습니다Normal before the first registration (not an error; means there is no site CA yet)

🔴 A wrong address doesn’t look like “a failure”. The screen comes up fine in full screen, and Watchdog keeps restarting the player every few minutes. It looks like “it’s on, but the content just isn’t showing”. The log lines above are the only accurate signal.

Device certificates are not installed by hand

Section titled “Device certificates are not installed by hand”

When the player first registers with the CMS, it creates its own key, gets a certificate issued, and stores it. There is nothing to prepare or copy — as long as the address is right, the rest happens automatically.

The only thing a person may need to install is the site CA at HTTPS sites (see “Sites that use an IP address” below).

Fixing the player alone is not enough. The programs installed alongside it each look at the CMS too.

ProgramFile to editField to edit
WatchdogC:\ProgramData\TreeT\Watchdog\watchdog.jsonappCheck.cmsUrl
SyncServer (sites that use it only)C:\Program Files\TreeT\SyncServer\SyncServer.jsoncms.url
MqttEdge (closed-network sites only)conf.d\site.conf in the installation folderCentral broker address

How to fix it with a command — you can change just the address without opening the file. In an administrator PowerShell, one line at a time:

Terminal window
& "C:\Program Files\TreeT\Watchdog\Watchdog.exe" --configure 192.168.0.10
& "C:\Program Files\TreeT\SyncServer\SyncServer.exe" --configure 192.168.0.10
  • An address alone becomes https://192.168.0.10:8443. At http sites add --scheme=http (http://192.168.0.10:8080).
  • To only preview, add --dry-run — it says how many places would change and writes nothing.
  • The original is kept next to it as .bak before changing.
  • On older Watchdog versions this command stops with watchdog.json 을 못 찾았습니다 (file not found) — then fix it in Notepad as below.
  • Either way, the program must be restarted to apply the change (table below). How to fix it in Notepad — open Notepad as administrator and change only the address in that file.

The ports are already filled in in two fields — httpPort (plain entrance, default 8080) and httpsPort (secure entrance, default 8443). Change them only at sites where the CMS uses different ports. When connecting over https (for example https://192.168.0.10:8443), leave caFile empty — Watchdog fetches the site CA from the CMS once through httpPort, saves it, and writes its fingerprint to the log. Compare it once with the site CA fingerprint on the CMS settings screen.

watchdog.json is a list starting with [, and the address is in appCheck inside the very first { … } block. Change only that one line and leave the other values as they are — in particular, emptying signerThumbprints turns off automatic updates. Below is the entire file for a site whose CMS is at 192.168.0.10:8080.

[
{
"autoHide": true,
"updateLock": {
"file": "%APPDATA%\\TreeTview\\update.lock",
"maxHoldMinutes": 10
},
"startupDelayMs": 30000,
"appCheck": {
"cmsUrl": "http://192.168.0.10:8080",
"caFile": "",
"httpPort": 8080,
"httpsPort": 8443,
"tokenFile": "%APPDATA%\\TreeTview\\data\\device-token.json",
"intervalMs": 600000,
"autoApply": true,
"downloadDir": "%APPDATA%\\TreeTview\\data\\update",
"signerThumbprints": [
"1CAE827334F20023B720E10A3460FEA788F2DD8B"
],
"nodeHeartbeatInterval": 60000
}
},
{
"processName": "TreeTview.exe",
"execPath": "%LOCALAPPDATA%\\TreeT\\TreeTview\\TreeTview.exe",
"execArgv": [],
"heartbeatTimeout": 30000,
"scheduledTask": "TreeTview"
},
{
"processName": "SyncServer.exe",
"execPath": "%ProgramFiles%\\TreeT\\SyncServer\\SyncServer.exe",
"execArgv": [],
"program": "SyncServer"
},
{
"processName": "mosquitto.exe",
"execPath": "C:\\ProgramData\\TreeT\\MqttEdge\\vendor\\win64\\mosquitto.exe",
"execArgv": ["-c", "mosquitto.conf"],
"workingDir": "C:\\ProgramData\\TreeT\\MqttEdge",
"program": "MqttEdge",
"logFile": "logs/mosquitto.log"
}
]
  • The \\ in paths is JSON syntax, so leave both backslashes as they are.
  • On PCs without MqttEdge, Watchdog skips the mosquitto.exe block by itself — you don’t need to delete it.
  • Save the file with UTF-8 encoding.

For SyncServer it’s one line in the cms block (there is no /treetweb here to begin with):

"cms": {
"url": "http://192.168.0.10:8080",

After changing it, you must restart that program for the change to take effect.

ProgramHow to restart
WatchdogTask Scheduler → the Watchdog task → End, then Run (as administrator)
SyncServerTask Scheduler → the SyncServer task → same way. Or log off and log back on
TreeTview (viewer)Task Scheduler → the TreeTview task → End, then Run. The watchdog also restarts it by itself within 10 seconds

Checking that it took effect — Watchdog writes the address to its own log when it starts:

C:\Program Files\TreeT\Watchdog\logs\server_<today's-date>.log
Line you seeMeaning
업데이트 확인 시작 (10분 주기, CMS http://192.168.0.10:8080)✅ It is looking at that address (“update check started, every 10 minutes”; the interval depends on intervalMs)
업데이트 확인이 설정돼 있지 않습니다(watchdog.json 의 appCheck.cmsUrl)❌ The field is empty (“update check is not configured”)

Checking in the CMS is more reliable — even if the address in the log is correct, the device won’t register if the path (/treetweb) is wrong. In Devices (기기관리), open a device on that PC: Watchdog · SyncServer should appear under Programs on this PC in its Device settings tab within 1–2 minutes, and if the last response is just now to 1 min ago, it worked (if they are not tied to the PC yet, they first appear in the PC 미확인 프로그램 line above the Devices list). If they don’t appear, check the address again first.

To restart with PowerShell (as administrator), one line at a time:

Terminal window
Stop-Process -Name Watchdog -Force
Terminal window
Start-ScheduledTask -TaskName Watchdog
Terminal window
Stop-Process -Name SyncServer -Force

Watchdog restarts SyncServer shortly — so it is normal for one line saying “SyncServer.exe 이(가) 죽어 있어 다시 띄웠습니다” (SyncServer.exe was down, so it was restarted) to appear on the dashboard right afterwards.

Installation registers the programs to start automatically when someone logs in to that PC. There’s nothing else you need to do.

If the CMS address is a domain, you can use a public certificate and there’s no extra work. Sites that connect by IP address, on the other hand, use a certificate specific to that site, so the kiosks must be set up once to trust it.

Registration is handled by a tool provided when you adopt TreeT; the on-site person only needs to compare the fingerprint.