Hestia-goaccess: GoAccess web stats add-on for HestiaCP

Hi everyone,

I’ve completed a production quality standalone HestiaCP add-on called hestia-goaccess that adds GoAccess as a web statistics option for Hestia-hosted domains.

GitHub:

The goal was to provide a privacy-friendly alternative to AWStats using the server’s existing access logs. It adds two selectable Hestia web statistics options per domain:

  • goaccess-static
  • goaccess-realtime

Installing is as easy as:

cd /root
git clone https://github.com/Wutime/hestia-goaccess.git
cd hestia-goaccess
./install.sh

Administration per domain is easy, just choose realtime or static.

Good solution. It’s long overdue. But I think it’s better to implement your solution globally in the panel so that it’s available by default after updates.

Thanks. If I’m missing something let me know, but the current release does install globally into Hestia’s stats system: after install, goaccess-static and goaccess-realtime are available from the normal Web Statistics selector for all domains. Each gets it’s own conf and folder, and everything is served from the normal /vstats/ location, as well as supporting the default hestia “Statistics Authorization” system.

Hestia updates will preserve the add-on’s own config and per-domain state, but if a Hestia update replaces the stats command scripts (unlikely), the integration may need to be reapplied.

Everything works perfectly; you can hot swap between realtime and static with no loss of data, 90 days retention, and if you delete a domain, uninstall the app, or change to stats “none” or back to “awstats” all the data created for GoAccess on that domain is immediately removed for the given domain(s).

It reads from the existing hestia log locations per domain and automatically hooks into either apache or nginx using default include locations as-per hestia best practices.

The only more “hestia” way of doing things I found would be “Quick Install App” but that’s per-domain, so not nearly as clean as this implementation.

If you want to try it safely, the repo includes a Docker test environment. From the project directory you can run:

docker compose up -d --build

Then open:

http://goaccess.localhost:18080/vstats/

That gives you a quick local preview without touching a production Hestia server.

I think you can leave pull requests and the developers will be happy to add your integration if it works correctly and properly.

Good point. I’ll considering doing that when I have a minute.

Last I read there’s no upcoming intention to release a v1.9.5 of hestiacp any time soon so I figured this was the better approach for anyone that might be interested in adding GoAccess sooner than later.

Awstats is EOL as of 2024 and for me personally, I wanted to avoid using GA on some sites.

Anyways, if you have time feel free to make the pull request yourself, the code is all there.

unsupported OS Debian GNU/Linux 13 (trixie); supported targets are D ebian 11/12 and Ubuntu 22.04/24.04
Will there be support for Debian 13?

When the developers implement Debian 13 support for the hestiacp panel, then I think it’s worth talking about it.

Talk to @sahsanu @Raphael @eris
I think he can help you implement GoAccess in the panel.

It’s high time to remove AWSTAT.

Thank you.

Unable to authenticate WebSocket. error on goaccess-realtime

Thanks for reporting this.

Could you share just these four things?

  1. What does this show?

    goaccess --version

  2. What does this show? (replace with your USER and DOMAIN for the USER)

    sudo hestia-goaccess status USER DOMAIN

  3. In browser dev tools, on the Network tab, what status code do you see for /vstats/ws/?
    Common examples are 101, 401, 403, 404, or 502.

  4. Are you using nginx or just apache?

Also: is the domain behind Cloudflare or another reverse proxy/load balancer?

The most common causes are:

  • the WebSocket URL points to the wrong hostname, for example example.com vs www.example.com
  • the public WebSocket URL is missing the explicit :443 or :80 port
  • the domain uses a custom Hestia/Nginx template that does not load the add-on’s Nginx include
  • a proxy such as Cloudflare/load balancer is not passing WebSocket upgrade traffic
  • an older GoAccess version has realtime WebSocket issues

If your site redirects to www, try re-enabling realtime with the exact hostname shown in the browser:

sudo hestia-goaccess enable USER DOMAIN --mode realtime --ws-url wss://www.example.com:443/vstats/ws/

Small hestia-goaccess note: Hestia v1.9.6 itself upgraded cleanly, but the package update can replace the Hestia CLI wrapper files that hestia-goaccess v1.0.0 uses for dropdown integration.

This is non-fatal: existing reports stay available, but realtime dashboards may behave like static reports until the add-on is updated.

v1.0.2 fixes this, adds an automatic repair hook for future Hestia package updates, and prevents stale /vstats/ HTML from sticking around after switching a domain from static to realtime.

Upgrade:

cd /root/hestia-goaccess
git fetch --tags
git checkout v1.0.2
./install.sh --yes
hestia-goaccess status

goaccess --version

GoAccess - 1.10.2.

sudo hestia-goaccess status USER DOMAIN

realtime_port='64000' service='hestia-goaccess-zumbo-zumbo_net.service' ws_url='wss://zumbo.net:443/vstats/ws/'
  html_prefs='{"theme":"darkGray"}'
  log_format='COMBINED'
  db_path='/var/lib/hestia-goaccess/zumbo/zumbo.net' keep_last='90'

dev tools, on the Network tab

nginx>apache>phpfpm
NO CF or other Proxy

Tried

sudo hestia-goaccess enable USER DOMAIN --mode realtime --ws-url wss://www.example.com:443/vstats/ws/

Thanks, that screenshot helps. The browser is reaching /vstats/ws/, but the WebSocket is closing immediately.

Can you please run and paste the output of these commands?

sudo hestia-goaccess enable zumbo zumbo.net --mode realtime --ws-url wss://zumbo.net:443/vstats/ws/
sudo hestia-goaccess status zumbo zumbo.net

sudo grep -o "wss://[^\"']*" /home/zumbo/web/zumbo.net/stats/index.html | head

sudo systemctl status hestia-goaccess-zumbo-zumbo_net.service --no-pager -l
sudo journalctl -u hestia-goaccess-zumbo-zumbo_net.service -n 80 --no-pager

sudo ss -ltnp | grep ':64000'

sudo nginx -T 2>/dev/null | grep -A20 -B5 'vstats/ws'

The Chrome extension message can be ignored. The important part is the failed WebSocket connection.

I want to confirm three things:

  1. the generated HTML really contains the expected WebSocket URL

  2. the GoAccess realtime service is actually running

  3. nginx loaded the /vstats/ws/ proxy location and points it to 127.0.0.1:64000

root@sultandernegi:~# sudo hestia-goaccess enable zumbo zumbo.net --mode realtime --ws-url wss://zumbo.net:443/vstats/ws/
sudo hestia-goaccess status zumbo zumbo.net

sudo grep -o "wss://[^\"']*" /home/zumbo/web/zumbo.net/stats/index.html | head

sudo systemctl status hestia-goaccess-zumbo-zumbo_net.service --no-pager -l
sudo journalctl -u hestia-goaccess-zumbo-zumbo_net.service -n 80 --no-pager

sudo ss -ltnp | grep ':64000'

sudo nginx -T 2>/dev/null | grep -A20 -B5 'vstats/ws'
nginx: [warn] "ssl_stapling" ignored, no OCSP responder URL in the certificate "/home/zumbo/conf/web/blacklist.zumbo.net/ssl/blacklist.zumbo.net.pem"
nginx: [warn] "ssl_stapling" ignored, no OCSP responder URL in the certificate "/home/zumbo/conf/web/dns.zumbo.net/ssl/dns.zumbo.net.pem"
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
nginx: [warn] "ssl_stapling" ignored, no OCSP responder URL in the certificate "/home/zumbo/conf/web/blacklist.zumbo.net/ssl/blacklist.zumbo.net.pem"
nginx: [warn] "ssl_stapling" ignored, no OCSP responder URL in the certificate "/home/zumbo/conf/web/dns.zumbo.net/ssl/dns.zumbo.net.pem"
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
Created symlink /etc/systemd/system/multi-user.target.wants/hestia-goaccess-zumbo-zumbo_net.service → /etc/systemd/system/hestia-goaccess-zumbo-zumbo_net.service.
enabled realtime GoAccess report for zumbo/zumbo.net
report: /home/zumbo/web/zumbo.net/stats/index.html
url: /vstats/
websocket: wss://zumbo.net:443/vstats/ws/
service: hestia-goaccess-zumbo-zumbo_net.service
ignored paths:
history retention: 90 days
database: /var/lib/hestia-goaccess/zumbo/zumbo.net
zumbo/zumbo.net: mode=realtime hestia_stats='goaccess-realtime'
  realtime_port='64000' service='hestia-goaccess-zumbo-zumbo_net.service' ws_url='wss://zumbo.net:443/vstats/ws/'
  html_prefs='{"theme":"darkGray"}'
  log_format='COMBINED'
  db_path='/var/lib/hestia-goaccess/zumbo/zumbo.net' keep_last='90'
wss://zumbo.net:443/vstats/ws/
wss://
wss://
● hestia-goaccess-zumbo-zumbo_net.service - hestia-goaccess realtime report for zumbo/zumbo.net
     Loaded: loaded (/etc/systemd/system/hestia-goaccess-zumbo-zumbo_net.service; enabled; preset: enabled)
     Active: active (running) since Tue 2026-06-02 02:28:11 +03; 79ms ago
   Main PID: 3168 (bash)
      Tasks: 3 (limit: 9172)
     Memory: 8.8M
        CPU: 52ms
     CGroup: /system.slice/hestia-goaccess-zumbo-zumbo_net.service
             ├─3168 bash /usr/local/share/hestia-goaccess/scripts/hestia-goaccess-realtime-runner /usr/local/share/hestia-goaccess/scripts/hestia-goaccess-filter-log /var/log/apache2/domains/zumbo.net.log /home/zumbo/web/zumbo.net/stats/index.html 127.0.0.1 64000 wss://zumbo.net:443/vstats/ws/ zumbo.net /var/lib/hestia-goaccess/zumbo/zumbo.net
             └─3181 goaccess - --log-format=COMBINED --restore --persist --db-path=/var/lib/hestia-goaccess/zumbo/zumbo.net --keep-last=90 --real-time-html --output=/home/zumbo/web/zumbo.net/stats/index.html --addr=127.0.0.1 --port=64000 --ws-url=wss://zumbo.net:443/vstats/ws/ --anonymize-ip --no-query-string --ignore-crawlers "--html-prefs={\"theme\":\"darkGray\"}" "--html-report-title=zumbo.net GoAccess Realtime" --no-progress /var/log/apache2/domains/zumbo.net.log

Jun 02 02:28:11 sultandernegi.com systemd[1]: Started hestia-goaccess-zumbo-zumbo_net.service - hestia-goaccess realtime report for zumbo/zumbo.net.
Jun 01 03:30:03 sultandernegi.com systemd[1]: Started hestia-goaccess-zumbo-zumbo_net.service - hestia-goaccess realtime report for zumbo/zumbo.net.
Jun 01 03:30:04 sultandernegi.com hestia-goaccess-realtime-runner[886194]: [60B blob data]
Jun 02 00:00:01 sultandernegi.com hestia-goaccess-realtime-runner[886194]: SIGTERM caught!
Jun 02 00:00:01 sultandernegi.com hestia-goaccess-realtime-runner[886194]: Closing GoAccess...
Jun 02 00:00:01 sultandernegi.com hestia-goaccess-realtime-runner[886194]: Stopping WebSocket server...
Jun 02 00:00:01 sultandernegi.com hestia-goaccess-realtime-runner[886194]: SIGTERM caught!
Jun 02 00:00:01 sultandernegi.com hestia-goaccess-realtime-runner[886194]: Closing GoAccess...
Jun 02 00:00:01 sultandernegi.com systemd[1]: Stopping hestia-goaccess-zumbo-zumbo_net.service - hestia-goaccess realtime report for zumbo/zumbo.net...
Jun 02 00:00:01 sultandernegi.com systemd[1]: hestia-goaccess-zumbo-zumbo_net.service: Deactivated successfully.
Jun 02 00:00:01 sultandernegi.com systemd[1]: Stopped hestia-goaccess-zumbo-zumbo_net.service - hestia-goaccess realtime report for zumbo/zumbo.net.
Jun 02 00:00:01 sultandernegi.com systemd[1]: hestia-goaccess-zumbo-zumbo_net.service: Consumed 1min 3.649s CPU time.
-- Boot 9cfbc65f26b948ee8e6c81d96e840aec --
Jun 02 02:28:11 sultandernegi.com systemd[1]: Started hestia-goaccess-zumbo-zumbo_net.service - hestia-goaccess realtime report for zumbo/zumbo.net.

# configuration file /home/zumbo/conf/web/zumbo.net/nginx.forcessl.conf:
return 301 https://$host$request_uri;

# configuration file /home/zumbo/conf/web/zumbo.net/nginx.conf_hestia_goaccess_realtime:
location ~ ^/vstats/ws/?$ {
        include /home/zumbo/web/zumbo.net/stats/auth.conf*;
        proxy_pass http://127.0.0.1:64000;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "Upgrade";
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_read_timeout 1h;
        proxy_send_timeout 1h;
}

# configuration file /home/zumbo/web/zumbo.net/stats/auth.conf_hestia_goaccess_accesslog_off:
# hestia-goaccess: prevent stats dashboard traffic from polluting domain access logs.
access_log off;

# configuration file /home/zumbo/web/zumbo.net/stats/auth.conf_hestia_goaccess_cache:
# hestia-goaccess: keep generated stats dashboards fresh after mode changes.
etag off;
add_header Cache-Control "no-store, no-cache, must-revalidate, max-age=0" always;
--

# configuration file /home/zumbo/conf/web/zumbo.net/nginx.hsts.conf:
add_header Strict-Transport-Security "max-age=31536000;" always;

# configuration file /home/zumbo/conf/web/zumbo.net/nginx.ssl.conf_hestia_goaccess_realtime:
location ~ ^/vstats/ws/?$ {
        include /home/zumbo/web/zumbo.net/stats/auth.conf*;
        proxy_pass http://127.0.0.1:64000;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "Upgrade";
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_read_timeout 1h;
        proxy_send_timeout 1h;
}

# configuration file /home/zumbo/conf/web/zumbo.net/nginx.ssl.conf_letsencrypt:
location ~ "^/\.well-known/acme-challenge/([-_A-Za-z0-9]+)$" {
    default_type text/plain;
    return 200 "$1.-PdwjW6qJxrqlTJ7Ue3NLPt2F9tgBrQgfGtUXOEuSpw";
}

Thanks for helping. I found the issue in hestia-goaccess.

This was a topology issue with stdin in the realtime runner, and it is fixed in v1.0.4

Please upgrade with:

cd /root/hestia-goaccess
git fetch --tags
git checkout v1.0.4
sudo ./install.sh --yes
sudo hestia-goaccess enable zumbo zumbo.net --mode realtime --ws-url wss://zumbo.net:443/vstats/ws/

Then hard refresh:

https://zumbo.net/vstats/

If it still does not connect after v1.0.4, please paste only this:

sudo systemctl status hestia-goaccess-zumbo-zumbo_net.service --no-pager -l
sudo ss -ltnp | grep ':64000'
sudo journalctl -u hestia-goaccess-zumbo-zumbo_net.service -n 40 --no-pager

Didn’t work. i tried both 1.0.4 and 1.0.5
Maybe problem is on my server. Never mind.

root@sultandernegi:~/hestia-goaccess# sudo systemctl status hestia-goaccess-zumbo-zumbo_net.service --no-pager -l
sudo ss -ltnp | grep ':64000'
sudo journalctl -u hestia-goaccess-zumbo-zumbo_net.service -n 40 --no-pager
● hestia-goaccess-zumbo-zumbo_net.service - hestia-goaccess realtime report for zumbo/zumbo.net
     Loaded: loaded (/etc/systemd/system/hestia-goaccess-zumbo-zumbo_net.service; enabled; preset: enabled)
     Active: active (running) since Thu 2026-06-04 02:47:14 +03; 29s ago
   Main PID: 517426 (bash)
      Tasks: 4 (limit: 9172)
     Memory: 15.0M
        CPU: 1.605s
     CGroup: /system.slice/hestia-goaccess-zumbo-zumbo_net.service
             ├─517426 bash /usr/local/share/hestia-goaccess/scripts/hestia-goaccess-realtime-runner /usr/local/share/hestia-goaccess/scripts/hestia-goaccess-filter-log /var/log/apache2/domains/zumbo.net.log /home/zumbo/web/zumbo.net/stats/index.html 127.0.0.1 64000 wss://zumbo.net:443/vstats/ws/ zumbo.net /var/lib/hestia-goaccess/zumbo/zumbo.net
             └─517438 goaccess /var/log/apache2/domains/zumbo.net.log --log-format=COMBINED --restore --persist --db-path=/var/lib/hestia-goaccess/zumbo/zumbo.net --keep-last=90 --real-time-html --output=/home/zumbo/web/zumbo.net/stats/index.html --addr=127.0.0.1 --port=64000 --ws-url=wss://zumbo.net:443/vstats/ws/ --anonymize-ip --no-query-string --ignore-crawlers "--html-prefs={\"theme\":\"darkGray\"}" "--html-report-title=zumbo.net GoAccess Realtime" --no-progress

Jun 04 02:47:14 sultandernegi.com systemd[1]: Started hestia-goaccess-zumbo-zumbo_net.service - hestia-goaccess realtime report for zumbo/zumbo.net.
Jun 04 02:47:16 sultandernegi.com hestia-goaccess-realtime-runner[517438]: [60B blob data]
LISTEN 0      4096                          127.0.0.1:64000      0.0.0.0:*    users:(("goaccess",pid=517438,fd=11))                                           
Jun 04 02:44:43 sultandernegi.com systemd[1]: hestia-goaccess-zumbo-zumbo_net.service: Deactivated successfully.
Jun 04 02:44:43 sultandernegi.com systemd[1]: Stopped hestia-goaccess-zumbo-zumbo_net.service - hestia-goaccess realtime report for zumbo/zumbo.net.
Jun 04 02:44:43 sultandernegi.com systemd[1]: hestia-goaccess-zumbo-zumbo_net.service: Consumed 1.656s CPU time.
Jun 04 02:44:44 sultandernegi.com systemd[1]: Started hestia-goaccess-zumbo-zumbo_net.service - hestia-goaccess realtime report for zumbo/zumbo.net.
Jun 04 02:44:46 sultandernegi.com hestia-goaccess-realtime-runner[515872]: [60B blob data]
Jun 04 02:44:49 sultandernegi.com hestia-goaccess-realtime-runner[515872]: SIGTERM caught!
Jun 04 02:44:49 sultandernegi.com hestia-goaccess-realtime-runner[515872]: Closing GoAccess...
Jun 04 02:44:49 sultandernegi.com hestia-goaccess-realtime-runner[515872]: Stopping WebSocket server...
Jun 04 02:44:49 sultandernegi.com systemd[1]: Stopping hestia-goaccess-zumbo-zumbo_net.service - hestia-goaccess realtime report for zumbo/zumbo.net...
Jun 04 02:44:49 sultandernegi.com hestia-goaccess-realtime-runner[515872]: SIGTERM caught!
Jun 04 02:44:49 sultandernegi.com hestia-goaccess-realtime-runner[515872]: Closing GoAccess...
Jun 04 02:44:49 sultandernegi.com systemd[1]: hestia-goaccess-zumbo-zumbo_net.service: Deactivated successfully.
Jun 04 02:44:49 sultandernegi.com systemd[1]: Stopped hestia-goaccess-zumbo-zumbo_net.service - hestia-goaccess realtime report for zumbo/zumbo.net.
Jun 04 02:44:49 sultandernegi.com systemd[1]: hestia-goaccess-zumbo-zumbo_net.service: Consumed 1.575s CPU time.
Jun 04 02:44:50 sultandernegi.com systemd[1]: Started hestia-goaccess-zumbo-zumbo_net.service - hestia-goaccess realtime report for zumbo/zumbo.net.
Jun 04 02:44:52 sultandernegi.com hestia-goaccess-realtime-runner[516159]: [60B blob data]
Jun 04 02:46:39 sultandernegi.com systemd[1]: Stopping hestia-goaccess-zumbo-zumbo_net.service - hestia-goaccess realtime report for zumbo/zumbo.net...
Jun 04 02:46:39 sultandernegi.com hestia-goaccess-realtime-runner[516159]: SIGTERM caught!
Jun 04 02:46:39 sultandernegi.com hestia-goaccess-realtime-runner[516159]: Closing GoAccess...
Jun 04 02:46:39 sultandernegi.com hestia-goaccess-realtime-runner[516159]: SIGTERM caught!
Jun 04 02:46:39 sultandernegi.com hestia-goaccess-realtime-runner[516159]: Closing GoAccess...
Jun 04 02:46:39 sultandernegi.com hestia-goaccess-realtime-runner[516159]: Stopping WebSocket server...
Jun 04 02:47:09 sultandernegi.com systemd[1]: hestia-goaccess-zumbo-zumbo_net.service: State 'final-sigterm' timed out. Killing.
Jun 04 02:47:09 sultandernegi.com systemd[1]: hestia-goaccess-zumbo-zumbo_net.service: Killing process 516159 (goaccess) with signal SIGKILL.
Jun 04 02:47:09 sultandernegi.com systemd[1]: hestia-goaccess-zumbo-zumbo_net.service: Failed with result 'timeout'.
Jun 04 02:47:09 sultandernegi.com systemd[1]: Stopped hestia-goaccess-zumbo-zumbo_net.service - hestia-goaccess realtime report for zumbo/zumbo.net.
Jun 04 02:47:09 sultandernegi.com systemd[1]: hestia-goaccess-zumbo-zumbo_net.service: Consumed 1.704s CPU time.
Jun 04 02:47:10 sultandernegi.com systemd[1]: Started hestia-goaccess-zumbo-zumbo_net.service - hestia-goaccess realtime report for zumbo/zumbo.net.
Jun 04 02:47:12 sultandernegi.com hestia-goaccess-realtime-runner[517145]: [60B blob data]
Jun 04 02:47:13 sultandernegi.com hestia-goaccess-realtime-runner[517145]: SIGTERM caught!
Jun 04 02:47:13 sultandernegi.com hestia-goaccess-realtime-runner[517145]: Closing GoAccess...
Jun 04 02:47:13 sultandernegi.com systemd[1]: Stopping hestia-goaccess-zumbo-zumbo_net.service - hestia-goaccess realtime report for zumbo/zumbo.net...
Jun 04 02:47:13 sultandernegi.com hestia-goaccess-realtime-runner[517145]: SIGTERM caught!
Jun 04 02:47:13 sultandernegi.com hestia-goaccess-realtime-runner[517145]: Closing GoAccess...
Jun 04 02:47:13 sultandernegi.com hestia-goaccess-realtime-runner[517145]: Stopping WebSocket server...
Jun 04 02:47:13 sultandernegi.com systemd[1]: hestia-goaccess-zumbo-zumbo_net.service: Deactivated successfully.
Jun 04 02:47:13 sultandernegi.com systemd[1]: Stopped hestia-goaccess-zumbo-zumbo_net.service - hestia-goaccess realtime report for zumbo/zumbo.net.
Jun 04 02:47:13 sultandernegi.com systemd[1]: hestia-goaccess-zumbo-zumbo_net.service: Consumed 1.596s CPU time.
Jun 04 02:47:14 sultandernegi.com systemd[1]: Started hestia-goaccess-zumbo-zumbo_net.service - hestia-goaccess realtime report for zumbo/zumbo.net.
Jun 04 02:47:16 sultandernegi.com hestia-goaccess-realtime-runner[517438]: [60B blob data]

Thank you for testing. Please do not worry, your server is not necessarily the problem.

From your output, the realtime service is running and GoAccess is listening correctly. So this part looks OK:

Active: active (running)
goaccess ... --real-time-html ... --ws-url=wss://zumbo.net:443/vstats/ws/

The remaining problem is probably one of these:

  1. Nginx is not loading the /vstats/ws/ proxy include
  2. The browser is using stale cached /vstats/ HTML after the realtime service restarted
  3. The public domain/redirect does not match the WebSocket URL
  4. A proxy such as Cloudflare is interfering with the WebSocket request

Version v1.0.5 has a better doctor check for this exact issue. Please run:

hestia-goaccess --version
sudo hestia-goaccess status zumbo zumbo.net
sudo hestia-goaccess doctor zumbo zumbo.net

Please send the full output.

Also please try a cache-busted dashboard URL once:

https://zumbo.net/vstats/?fresh=1

If your site redirects to www.zumbo.net, please regenerate realtime with the www host:

sudo hestia-goaccess enable zumbo zumbo.net --mode realtime --ws-url wss://www.zumbo.net:443/vstats/ws/

Then test:

https://www.zumbo.net/vstats/?fresh=1

If your site does not redirect to www, keep the non-www host:

sudo hestia-goaccess enable zumbo zumbo.net --mode realtime --ws-url wss://zumbo.net:443/vstats/ws/

Then test:

https://zumbo.net/vstats/?fresh=1

The browser URL and the WebSocket URL must use the same public host.

If goaccess-static works, you can safely use static mode while we debug realtime:

sudo hestia-goaccess enable zumbo zumbo.net --mode static

Static mode does not use WebSocket.