Skip to content
New storyWe built Skald to count visitors. It caught an AI-key thief.
SkaldEvery visit, truly told.

Self-host · Coolify, CapRover, Dokku

Self-hosted analytics on Coolify, CapRover or Dokku

Self-hosted analytics on Coolify, CapRover or Dokku is the Skald image with persistent storage, on a server you already run. The panel gives it HTTPS; when your site runs on the same server, Skald reads its log in place.

Self-hosted analytics on Coolify means running Skald's Docker image as a Coolify resource, with persistent storage at /var/lib/skald and a domain from Coolify's proxy. CapRover and Dokku work the same way: a web panel or a git push on your own server. One of the ways to self-host Skald free.

30-day free trial · no card · we set it up within one working day · free to self-host

one resource · skald · sampleyour own server
  1. image ghcr.io/spcaeo/skald:latestsource
  2. storage /var/lib/skaldhistory
  3. log /var/log/nginx → /logs, read-onlysame server
  4. port 8080container
  5. SKALD_SITE example.comvariable
  6. domain https://stats.example.comHTTPS

Sample settings. Coolify, CapRover and Dokku name these parts a little differently.

[01] your panel

Run Skald on Coolify, CapRover or Dokku

All three run the same image with the same storage and port. Pick yours. Change example.com and the names to your own before you copy.

pick one
  1. 1. New resource

    Docker Image: ghcr.io/spcaeo/skald:latest. Or Docker Compose from your fork's docker-compose.yml: drop its caddy service, Coolify gives you HTTPS.

  2. 2. Storage, port, domain

    Add Persistent Storage at /var/lib/skald, set the port to 8080 and the domain to https://stats.example.com.

  3. 3. Variables, then the owner

    Add the SKALD_* variables and deploy. Open the resource's Terminal and run the first owner command below.

[02] the same on all three

What Skald needs from any PaaS

Each panel has its own word for these parts. Skald needs the same five things from each.

Run exactly one copy. Skald keeps its history in SQLite on one disk, so never scale the app past one container, and never point two apps at one storage folder.

Every panel, sample values for example.com
PartWhat Skald needs
Imageghcr.io/spcaeo/skald, with a tag such as :2
Storagepersistent, at /var/lib/skald, writable by user 10001
Port8080 inside the container
HTTPSfrom the panel's proxy. Sign-in needs it: the session cookie is Secure
VariablesSKALD_SITE, SKALD_HOSTS, SKALD_BASE_URL, SKALD_TIMEZONE
Health checkGET /traffic-auth/login answers 200

[03] first owner

Make the first owner inside the container

In Coolify, the resource's Terminal. In CapRover, a shell in the app's container. Change the name and the email to your own before you copy.

the container's terminal · edit the name and email first
$ skald accounts init --org "Example Co" --owner-email owner@example.com
Dokku, on the server · edit the name and email first
$ dokku enter skald web skald accounts init --org "Example Co" --owner-email owner@example.com

Either one prints a link that sets the owner's password.

[04] your site's log

Your site's log, on the same server or not

When the site's own nginx runs on the same server, Skald reads its access log in place. Mount /var/log/nginx at /logs in Skald's container, read-only, as with plain Docker.

Skald's user is in group adm, which can read that log on stock Ubuntu and Debian. The log file is access.log unless you set SKALD_LOG_FILE.

When the site runs somewhere else, or behind the panel's own proxy with no nginx log on the host, its requests arrive by HTTPS instead. Set SKALD_INGEST=true and SKALD_LOG_DIR=/var/lib/skald/ingest/example.com, then send the log:

[05] keeping it

Backups and upgrades on your own PaaS

The storage folder holds everything Skald keeps. It lives on your server, so its copies are yours to keep too.

  1. Skald's own backups

    A nightly and a weekly copy of the history, each restored into a scratch file and checked before it counts. skald backup in the container makes one now.

  2. Copy them off the server

    Skald's copies sit in the same storage folder. Copy that folder to another machine as well, with the backup tool you already use.

  3. Upgrades

    Take a backup, then deploy the new tag the way the panel deploys any image. The databases are brought up to date at start. Pin :2 to get every 2.x release and never a breaking one.

What it does not do on a PaaS

  • It does not scale past one container. The history is SQLite on one disk.
  • It does not see a site behind the panel's own proxy unless that proxy's log reaches it, or the site's log is sent.
  • A site with no server or CDN log (the script tag alone) shows no AI crawlers and no bots.
  • Sign-in does not work over plain HTTP: turn HTTPS on for the domain.

questions

Self-hosted analytics on Coolify, CapRover and Dokku FAQ

Straight answers, including what Skald does not do.

Should I deploy Skald on Coolify from the image or from Docker Compose?

Either works. The image ghcr.io/spcaeo/skald:latest is the shortest road. Docker Compose from your fork's docker-compose.yml also works: remove its caddy service first, because Coolify gives the resource HTTPS itself.

Can Skald read my site's log on the same Coolify, CapRover or Dokku server?

Yes, when the site's own nginx writes its log on that server. Mount /var/log/nginx read-only at /logs in Skald's container, as with plain Docker. The container's user is in group adm, which can read that log on stock Ubuntu and Debian.

Why does Skald say the data folder is not writable on CapRover?

Skald runs as user 10001. If the host folder behind /var/lib/skald belongs to another user, run chown 10001:10001 on that host folder once, then restart the app.

Does Dokku need a plugin for Skald's HTTPS?

For the letsencrypt command, yes: dokku letsencrypt:enable needs the dokku-letsencrypt plugin. Sign-in needs HTTPS, because Skald's session cookie is Secure.

How do I upgrade Skald on Coolify, CapRover or Dokku?

Run skald backup inside the container first. Then deploy the new image tag the way the panel deploys any image. The databases are brought up to date when the container starts. Pin :2 to get every 2.x release and never a breaking one.

$ tail -f access.log | skald

See what AI does with your site. Free for 30 days.

No card. We set up hosted Skald for you within one working day, or you self-host it free. Every line of your log, sorted and added up.

Start free trial Live demo