Self-Hosting Analytics with Plausible
I was recently looking for a cheap way to move a few sites off of Google Analytics and began looking into various options, both cloud-hosted and self-hosted.
Unfortunately most cloud-hosted options (that aren't google analytics) are relatively pricy for what are essentially low traffic sites. After a bit of evalution the best options seemed to be:
- Fathom (cloud) - $14/month
- Fathom (self-hosted) - ~$5/month
- Matamo (cloud) - $30/month
- Matamo (self-hosted) - $10/month (greater server requirements)
- Plausible (cloud) - $6/month
- Plausible (self-hosted) - $5/month
I ruled out the cloud hosted options for now, mostly because I wanted to be able to try a few of these out quickly, without giving out any payment information.
Matamo's hosting requirements seemed larger than I wanted to go, and the additional features it has over the other's seem more like clutter for my use cases.
That left me with Fathom & Plausible.
Ruling out Fathom
I got Fathom up and running quick enough (they have 1-click digital ocean droplet), but after setting it up, but it seemed to have a few major flaws:
- The analytics dashboard was completely public, with no UI I could find to:
- Restrict it.
- Sign in.
- I passed through the initial setup, but I couldn't find how to see my siteID or script location again.
This was enough friction that I tore down the instance and figured I'd give Plausible a shot.
I followed the self-hosted tutorial provided by Plausible, but I ran into a couple minor issues while following it so I figured I'd write this post outlining the whole process.
Creating the Server
I opted to use Digital Ocean for my hosting as I've used them for a few different projects before. You should be able to use any other hosting provider as long as they support.
I created a new project, and setup a droplet with the following configuration:
- 1 vCPU
- 1GB RAM / 25 GB Disk
- Droplet - Docker 19.x on Ubuntu 20.04 from the Marketplace.
- IPv6 & monitoring enabled.
- Attached my SSH key to the droplet.
Once the droplet was spun up, I ssh'd into it.
cd /srv git clone https://github.com/plausible/hosting plausible cd plausible # Generate a random key. openssl rand -base64 64 # Edit the plausible config nano plausible-conf.env
ADMIN_USER_EMAIL=EMAIL ADMIN_USER_NAME=USERNAME ADMIN_USER_PWD=MY_PASSWORD BASE_URL=https://stats.charron.dev SECRET_KEY_BASE=RANDOM_KEY
Starting and accessing Plausible
By default Plausible starts up on port 8000. It's expected that you will use some kind of reverse proxy. I opted to use cloudflare as my reverse proxy and handle https.
- Update Plausible to run on port 80.
- Configure my DNS (run through cloudflare) to point to the droplet.
- Block access on port 80 to go only go through cloudflare.
Update Plausible to run on port 80
# Before ports: - 8000:8000 # After ports: - 80:8000
- Go to cloudflare DNS.
- Add 2 records.
A stats DROPLET_IPV4 AAAA stats DROPLET_IPV6
Only allowing access through Cloudflare
I configured UFW (Uncomplicated Firewall) with some additional rules following this guide.
Starting up the Server
I made a small script to startup the server.
cd /srv/plausible docker-compose up --detached
Running this scripts starts up the server.
Creating a SystemD service that runs on startup
In the event of a restart I want the droplet to be able to start up the server automatically.
To do that I created a SystemD service.
[Unit] Description=Plausible Analytics After=network.target StartLimitIntervalSec=0 [Service] Type=simple Restart=always RestartSec=1 User=root ExecStart=/usr/bin/env /srv/plausible.sh [Install] WantedBy=multi-user.target
Then I enabled the service.
# Will run on startup systemctl enable plausible # Manually run it systemctl start plausible