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.)
What to prepare (by role)
Section titled “What to prepare (by role)”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.
| Role | Count | What to prepare |
|---|---|---|
| CMS server | 1 per site (one CMS can run several sites) | Ubuntu 26.04 LTS. The installer installs Docker itself → Installing the CMS server |
| Kiosk | N 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 server | 1 when using multi-screen | Windows 10 or later (64-bit) or 64-bit Linux (x86-64 · arm64). No separate runtime to install (a single executable) |
| Edge relay | 1, closed-network sites only | Windows 11 22H2 or later, a machine connected to both the internal and external networks |
Ports to open
Section titled “Ports to open”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.
Kiosk → server (outbound)
Section titled “Kiosk → server (outbound)”| Port | What it’s for | Connects to | If blocked |
|---|---|---|---|
| 8443 | CMS secure connection — registration · settings · scheduling · content download | CMS (or MqttEdge) | The screen won’t switch to a new schedule |
| 8080 | CMS plaintext connection — sites not using https | CMS | Same as above |
| 8883 | MQTT (TLS) — remote commands · status reporting | CMS broker (or MqttEdge) | Remote control and immediate updates won’t work. Playback itself continues |
| 53000 and up | Sync playback — one port per sync pool | SyncServer | Playback 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.
Server → kiosk (inbound)
Section titled “Server → kiosk (inbound)”| Port | What it’s for | If blocked |
|---|---|---|
| 5900 | VNC remote control — view and operate that screen directly | The 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)”| Port | What |
|---|---|
| 4822 · 8080 | Guacamole internal communication |
| 5500 · 5901 | VNC 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.
Sites using MqttEdge
Section titled “Sites using MqttEdge”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.
Order of work
Section titled “Order of work”🔵 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.
- Install the CMS — set up the server on the CMS host and settle its access address (IP/domain + port). → Installing the CMS server
- Install programs on the kiosks — install the player (+ the watchdog, and the sync server if needed). → “Installing on the kiosk PCs” below
- 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
- 🔴 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. - (HTTPS + IP address sites only) Register the server certificate as trusted — “Sites that use an IP address” below.
- 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).
Installation and updates
Section titled “Installation and updates”Each program needs different permissions. You should know this in advance when planning the installation order.
| Program | Installation permission | Installed to |
|---|---|---|
| TreeTview (player) | Regular user | That user’s personal folder |
| 🔴 SyncServer (sync) | Administrator | Program folder (shared) |
| 🔴 Watchdog (monitoring) | Administrator | Program folder (shared) |
| 🔴 MqttEdge (closed-network relay) | Administrator | Shared 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.
Updating from the viewer screen
Section titled “Updating from the viewer screen”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:
- On the viewer, press F8 to open the settings screen.
- Under 프로그램 업데이트 (Program update), press [확인] (Check) — the current version and status are shown.
- 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.
| Windows | Linux | |
|---|---|---|
| What you get | Installer file (.exe) | Archive (.tar.gz) + a signed file list |
| How it installs | Runs the installer silently | Extracts to a new folder and swaps the folder in |
| What is verified | The file’s signature | The list’s signature + a checksum for every file |
| If it doesn’t come up | A person has to look at it | It rolls back to the old folder by itself |
Installing on the kiosk PCs
Section titled “Installing on the kiosk PCs”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).
What to install
Section titled “What to install”| Order | Program | Required? |
|---|---|---|
| 1 | TreeTview — the player that shows the screen | ✅ Required |
| 2 | Watchdog — restarts the player if it stops, and installs new versions on its behalf | ✅ Recommended (effectively required for unattended sites) |
| 3 | SyncServer — only when several screens must change in step | Only 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.
| Windows | Linux (Raspberry Pi) | |
|---|---|---|
| While the player is full screen | The player covers the taskbar | The window manager (labwc) hides the taskbar by itself — the player does not turn the taskbar off |
| Notifications | The Watchdog keeps notifications off and turns them back off if they come on | — |
| Swiping in from a touch-screen edge | The 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.
What to check after installing
Section titled “What to check after installing”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?”):
powershell -ExecutionPolicy Bypass -File C:\treet\check-install.ps1 -BeforeAfter installation — check the post-conditions:
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.
| Key | What it does |
|---|---|
| F8 | Opens the settings screen ← enter the CMS address here |
| F11 | Temporarily moves the screen out of the way (minimize) |
| F10 | Full screen on/off — your choice is remembered (stays after a restart) |
| F9 | Show/hide the mouse cursor and taskbar (on Linux including the Raspberry Pi taskbar) — your choice is remembered |
| F4 | Quit the player |
- With the player running, press F8.
- In the CMS 주소 (CMS address) field, enter the site’s CMS address — for example
http://192.168.0.10:8080 - 🔴 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. - 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). - 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>.logand look at the [사이트설정] (site settings) lines near the bottom.
| Line you see | Meaning |
|---|---|
[사이트설정] 확인 — 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).
Other programs need the CMS address too
Section titled “Other programs need the CMS address too”Fixing the player alone is not enough. The programs installed alongside it each look at the CMS too.
| Program | File to edit | Field to edit |
|---|---|---|
| Watchdog | C:\ProgramData\TreeT\Watchdog\watchdog.json | appCheck.cmsUrl |
| SyncServer (sites that use it only) | C:\Program Files\TreeT\SyncServer\SyncServer.json | cms.url |
| MqttEdge (closed-network sites only) | conf.d\site.conf in the installation folder | Central 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:
& "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
.bakbefore 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.exeblock 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.
| Program | How to restart |
|---|---|
| Watchdog | Task Scheduler → the Watchdog task → End, then Run (as administrator) |
| SyncServer | Task 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 see | Meaning |
|---|---|
업데이트 확인 시작 (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:
Stop-Process -Name Watchdog -ForceStart-ScheduledTask -TaskName WatchdogStop-Process -Name SyncServer -ForceWatchdog 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.
Automatic startup
Section titled “Automatic startup”Installation registers the programs to start automatically when someone logs in to that PC. There’s nothing else you need to do.
Sites that use an IP address (HTTPS)
Section titled “Sites that use an IP address (HTTPS)”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.