Files
site/wiki/source/user_statistics.md
2026-01-27 12:21:24 -07:00

178 lines
5.0 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
title: Userdir traffic stats
category: software
Author: deepend
---
So you want traffic stats for your `~/public_html` site, This stats system generates a **sanitized** report per user from the servers nginx logs, then lets you publish it *only if you choose to*.
## What this gives you
* Daily totals: requests, pageviews, unique visitors (hashed per-day), bytes
* “Top pages” list (query strings removed)
* Referrers by **domain only** (no full URLs)
* Browser/user-agent buckets (Chrome/Firefox/Bot/etc.)
* HTTP status code counts
* Optionally: a nice HTML dashboard generated by `goaccess`
No raw IPs are shown in the report.
## Opt-in (required)
Nothing is generated for you unless you opt in.
Create the opt-in flag:
```sh
mkdir -p ~/.config/tilde-stats
touch ~/.config/tilde-stats/enabled
```
Thats it. The nightly job will include you from then on.
## Where the files are written
Reports are generated into:
* `~/.local/share/tilde-stats/index.html`
* `~/.local/share/tilde-stats/stats.json`
These files are **not automatically public**.
## Publishing the report on your website
There are two ways to publish the report:
* **Copy (recommended)**: keeps `~/.local` private and uses normal web permissions.
* **Symlink (works, but requires permissions)**: points your website at `~/.local/...`, which means nginx must be able to traverse those dot-directories.
Your stats page will be:
* `https://tilde.club/~YOURNAME/stats/`
### Recommended: copy into `~/public_html/stats/`
```sh
mkdir -p ~/public_html/stats
cp -f ~/.local/share/tilde-stats/index.html ~/public_html/stats/index.html
cp -f ~/.local/share/tilde-stats/stats.json ~/public_html/stats/stats.json
chmod 644 ~/public_html/stats/index.html ~/public_html/stats/stats.json
```
### Alternative: symlink into `~/public_html/stats/` (requires permissions)
```sh
mkdir -p ~/public_html/stats
ln -sf ~/.local/share/tilde-stats/index.html ~/public_html/stats/index.html
ln -sf ~/.local/share/tilde-stats/stats.json ~/public_html/stats/stats.json
```
If you use symlinks, nginx must be able to **traverse** the real path under `~/.local/...` (see permissions below).
## Permissions (important, because Linux will happily sabotage you)
For nginx to serve a file, it must be able to:
* **traverse** every directory in the path (execute bit, `+x`)
* **read** the file (`+r`)
### Minimum permissions for userdir websites
If your `~/public_html` site already works, you probably already have this, but heres the standard expectation:
```sh
chmod 711 ~
```
`chmod 711 ~` lets the web server traverse your home directory without listing it.
### If you are COPYING files (recommended)
Make sure your published files are world-readable:
```sh
chmod 644 ~/public_html/stats/index.html ~/public_html/stats/stats.json
```
Your `~/.local/share/tilde-stats/` directory can stay private.
### If you are SYMLINKING to `~/.local/share/tilde-stats/` (current reality)
Because the report lives in a dot-directory path, nginx must be able to traverse:
* `~`
* `~/.local`
* `~/.local/share`
* `~/.local/share/tilde-stats`
And it must be able to read the report files themselves.
Use these permissions:
```sh
chmod 711 ~/.local ~/.local/share ~/.local/share/tilde-stats
chmod 644 ~/.local/share/tilde-stats/index.html ~/.local/share/tilde-stats/stats.json
```
Notes:
* `711` is better than `755` for dot-directories since it allows traversal but not directory listing.
* If the generator writes the files with private permissions, you may need to re-apply the `chmod 644` on the two report files after regeneration if you are serving them directly from `~/.local`.
## Updating / regenerating
Stats are generated by an admin-run job (typically nightly). You dont need to run anything manually.
If you publish via **copy**, re-run the copy commands after the nightly update to refresh the public version.
If you publish via **symlink**, the page updates automatically (as long as permissions allow nginx to read it).
## Disabling / opting out
Remove the opt-in flag:
```sh
rm -f ~/.config/tilde-stats/enabled
```
No new reports will be generated for you after that.
(Any old published copies or symlinks you created are your responsibility to delete.)
## Troubleshooting
### “My stats page 403s / 404s”
* Confirm the public files exist:
```sh
ls -l ~/public_html/stats/
```
* Confirm permissions all the way down the path:
```sh
namei -l ~/public_html/stats/index.html
```
If youre using symlinks into `~/.local`, also check the target path:
```sh
namei -l ~/.local/share/tilde-stats/index.html
```
Every directory in that output should have `x` for others (traversable), and the file should have `r` for others.
### “The report exists in ~/.local/share but isnt public”
Thats expected. Its private until you copy or link it into `~/public_html`.
### “My report is empty”
Either:
* No traffic in the selected window, or
* You opted in recently and the next scheduled run hasnt happened yet.
(Servers do not read minds, only logs.)