Установка и настройка своей системы веб-аналитики с помощью Liwan

1. Почему Liwan

В начале я попробовал использовать для своего сайта Google Analytics, но потом решил перейти на более лёгкое и уважающее приватность посетителя решение.

Что не так с GA?

  • Собирает данные пользователей и передаёт их в США. А американские законы о слежке позволяют спецслужбам США получать к ним доступ.
  • Даже с дополнительными мерами защиты данные всё равно передаются в читаемом виде и могут быть идентифицированы обратно — либо самим Google, либо американскими властями.
  • Ряд европейских стран признали использование GA незаконным по GDPR.

Я стал искать другие self-hosted решения, но натыкался на тяжеловесные варианты, которые ставят миллион npm пакетов для работы, или что-то подобное. И довольно быстро нашёл Liwan через статью от Henry Gressmann — автора этой замечательной программы.

Он написан полностью на Rust и распространяется в виде одного единственного исполняемого файла. Конфигурация простая, а потребление ресурсов незначительное — то что нужно для моего небольшого блога на моём небольшом VPS :)

2. Установка

На официальном сайте есть инструкции, я просто опишу полный процесс каким он получился у меня.

Весь процесс можно и нужно делать под обычным пользователем, я назову его user. В качестве порта буду использовать стандартный 9042, а в качестве домена example.org.

Для начала можно установить A-запись для субдомена, на котором будет расположен Liwan, чтобы она указывала на наш сервер. Это может быть тот же IP-адрес. В этом примере будет использоваться liwan.example.org.

После этого можно приступать к установке, а по окончанию DNS записи уже должны обновиться.

curl -JLO 'https://github.com/explodingcamera/liwan/releases/latest/download/liwan-x86_64-unknown-linux-musl.tar.gz'
mkdir -p ~/.local/bin
tar -xzf liwan-x86_64-unknown-linux-musl.tar.gz -C ~/.local/bin liwan
chmod +x ~/.local/bin/liwan
export PATH=$HOME/.local/bin:$PATH
echo 'export PATH=$HOME/.local/bin:$PATH' >> ~/.bashrc

Для получения страны посетителя используются базы MaxMind. Liwan может автоматически скачивать и обновлять базу, если предоставить ему API ключ. Или можно скачать её самому. У меня были проблемы с регистрацией, поэтому пошёл вторым путём.

curl -LO --create-dirs --output-dir ~/.local/share/liwan https://github.com/P3TERX/GeoLite.mmdb/raw/download/GeoLite2-City.mmdb

Дальше можно создать файл конфигурации и отредактировать его.

liwan generate-config
mv liwan.config.toml ~/.config/liwan/
vim ~/.config/liwan/liwan.config.toml

Я покажу свою версию:

base_url="https://liwan.example.org"
port=9042

[geoip]
maxmind_db_path="/home/user/.local/share/liwan/GeoLite2-City.mmdb"

У меня статический сайт и я использую Nginx для его раздачи, поэтому мне проще всего было использовать его в качестве обратного прокси для Liwan.

Я создал отдельный файл /etc/nginx/sites-available/liwan:

server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;
    server_name liwan.example.org;
    
    location / {
        proxy_pass http://127.0.0.1:9042;

        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

Теперь включаем конфиг и устанавливаем SSL сертификат.

sudo ln -s /etc/nginx/sites-available/liwan /etc/nginx/sites-enabled/
sudo nginx -t && sudo systemctl reload nginx
sudo certbot --nginx -d liwan.example.org

Дальше лучше всего запустить один раз liwan руками из консоли. Он произведёт первичную настройку и выдаст секретный URL по которому можно создать свой первый проект и сущность для сайта. Как я понимаю проект — это как папка для отдельных сайтов, а сущность — уже сам сайт.

Теперь можно создать сервис systemd для удобного управления. Я поместил в файл /etc/systemd/system/liwan.service:

[Unit]
Description=Liwan Web Analytics
After=network.target

[Service]
ExecStart=/home/user/.local/bin/liwan
Restart=on-failure
User=user

[Install]
WantedBy=multi-user.target

Осталось запустить и убедиться, что всё работает:

sudo systemctl daemon-reload
sudo systemctl enable liwan --now
sudo systemctl status liwan

В панели управления для сущности будет доступен HTML код, который нужно вставить на каждую страницу для сбора аналитики.

Для того чтобы не учитывать свои визиты, нужно открыть сайт и в консоли разработчика выполнить:

localStorage.setItem('disable-liwan', 'true');

Краткая сводка по посещаемости будет доступна на liwan.example.org, а более подробный отчёт в проекте по адресу liwan.example.org/p/<project-id>. Отчёты можно делать публичными. Например мой вот тут: https://liwan.crowsflock.org/p/main.