Веб-серверы и Nginx 11 мин чтения 2026-10-13

Легковесная веб-аналитика GoatCounter на VDS: развертывание в systemd с SQLite, обход AdBlock и защита доступа в Nginx

Практическое руководство по развертыванию легковесной веб-аналитики GoatCounter на VDS: настройка бинарника Go с базой данных SQLite в WAL-режиме, изоляция службы systemd, обход блокировщиков рекламы через First-Party Nginx Reverse Proxy и двухконтурная защита дашборда.

Инженерная редакция SysKit Проверено инженерами SysKit.ru

Каждый владелец сайта или веб-сервиса сталкивается с дилеммой при выборе инструмента веб-аналитики. Популярные облачные решения вроде Яндекс.Метрики и Google Analytics требуют подключения тяжелых внешних скриптов, сохраняют cookies, передают данные третьим сторонам и принуждают вешать назойливые всплывающие окна согласия (cookie-баннеры). Кроме того, по данным профильных опросов среди разработчиков и системных администраторов, значительная часть технической аудитории (от 25% до 40%) использует uBlock Origin, AdGuard или встроенную защиту Brave, что приводит к слепым зонам в отчетах.

Автономные (self-hosted) альтернативы решают проблему приватности, но часто требуют внушительных аппаратных мощностей. Популярный Matomo работает на связке PHP + MySQL и при умеренном трафике требует от 1 ГБ оперативной памяти, а Plausible опирается на тяжелую колоночную СУБД ClickHouse и рантайм Elixir. На этом фоне GoatCounter выделяется радикальным минимализмом: это монолитный скомпилированный бинарник на языке Go со встроенной поддержкой SQLite, которому для обслуживания проектов достаточно 25–45 МБ RAM (от 25 МБ в простое до 40–45 МБ под активным трафиком).

1. Архитектура GoatCounter: почему Go + SQLite превосходят тяжелые стеки

GoatCounter спроектирован нидерландским разработчиком Мартином Турноем (Martin Tournoij, известный в open-source сообществе под ником arp242, официальный репозиторий github.com/arp242/goatcounter) с акцентом на скорость, низкое потребление ресурсов и уважение к приватности посетителей. В отличие от микросервисных платформ, где для запуска аналитики требуется поднимать Node.js, Redis, ClickHouse или PostgreSQL в Docker Compose, GoatCounter представляет собой полностью самодостаточное приложение:

  • Монолитная компиляция: единый исполняемый ELF-файл размером около 16–20 МБ, содержащий внутри оптимизированный веб-сервер, роутер, шаблонизатор и базу данных стран GeoLite2 (также поддерживается подключение внешней базы через флаг -geodb).
  • Встроенная СУБД SQLite с WAL: по умолчанию GoatCounter использует SQLite в режиме Write-Ahead Logging (WAL). Это обеспечивает конкурентную запись без взаимной блокировки параллельных запросов на чтение и исключает накладные расходы сетевых сокетов клиент-серверных СУБД.
  • Асинхронная буферизация в памяти: входящие запросы фиксации просмотров (хиты) не вызывают немедленный синхронный fsync на диск. Они аккумулируются в кольцевом буфере в оперативной памяти и сбрасываются в SQLite пачками каждые 10 секунд, что снижает нагрузку на NVMe/SSD накопитель до минимума.
  • Zero-Cookie и 8-часовая ротация сессий: система принципиально не использует cookies, localStorage или фингерпринтинг Canvas. Уникальность сессии рассчитывается хэшированием IP-адреса и строки User-Agent со специальной солью, которая автоматически ротируется каждые 8 часов (скользящее окно сессии). По истечении этого времени повторные визиты того же пользователя учитываются как новая сессия, что исключает возможность долгосрочного профилирования.
Критерий GoatCounter Umami Matomo Яндекс.Метрика
Стек технологий Go + SQLite / PostgreSQL Node.js + PostgreSQL PHP + MySQL / MariaDB Облачный проприетарный
Потребление RAM ~25–45 МБ (по замерам systemd) ~300–500 МБ ~500–1000 МБ 0 МБ (на сервере клиента)
Размер JS-трекера ~3.5 КБ (1.8 КБ gzip) ~6 КБ (2.5 КБ gzip) ~60 КБ (22 КБ gzip) ~120 КБ (45 КБ gzip)
Блокировка AdBlock В списках EasyPrivacy (обходится проксированием) В списках EasyPrivacy (обходится проксированием) Блокируется по домену и путям Блокируется у 25–40% посетителей
Хранение данных 100% на вашем сервере VDS 100% на вашем сервере VDS 100% на вашем сервере VDS На серверах Яндекса

2. Плюсы и минусы GoatCounter для вебмастера и сисадмина

Перед развертыванием важно трезво оценить возможности и границы применимости инструмента. GoatCounter создан для решения конкретной задачи: дать честную, прозрачную и легковесную статистику без перегруза интерфейса лишними метриками.

Преимущества

  • Экстремальная легковесность: сервис можно запустить даже на самом доступном VDS с 512 МБ или 1 ГБ RAM параллельно с основным сайтом.
  • Отсутствие внешних зависимостей: не требуется Docker-демон, Node.js, веб-сервер баз данных или сторонние менеджеры пакетов.
  • Чистый и быстрый UI: минималистичный дашборд без тяжелых графических фреймворков загружается мгновенно даже при медленном мобильном интернете.
  • Честная приватность без cookies: не используются постоянные идентификаторы посетителей.
  • Простой перенос и резервное копирование: вся аналитика хранится в одном компактном файле .sqlite3.
  • Отслеживание событий (Events): помимо просмотров страниц поддерживается клик-трекинг по кнопкам, ссылкам и загрузкам файлов.

Ограничения

  • Нет сложных маркетинговых воронок: отсутствует сквозной когортный анализ, многоканальная атрибуция и карты кликов (Вебвизор).
  • Окно сессий 8 часов: из-за регулярной ротации соли хэширования невозможно построить историю посещений одного человека на протяжении нескольких недель или месяцев.
  • Масштабируемость SQLite: при посещаемости свыше нескольких миллионов просмотров в месяц для максимальной производительности потребуется переключение на PostgreSQL.
  • Публичный дашборд по умолчанию: без явной настройки дашборд может быть доступен всем, поэтому требуется организация защиты доступа.

3. Установка бинарника GoatCounter и инициализация базы SQLite

Для развертывания используется актуальный стабильный релиз GoatCounter v2.7.0 (архитектура Linux amd64). Установка выполняется в изолированный каталог непривилегированного пользователя операционной системы, что полностью исключает запуск сервиса от имени root.

Создадим выделенного системного пользователя без права интерактивного входа по паролю и подготовим файловую структуру:

# Создание системного пользователя analytics
sudo useradd -r -m -d /opt/goatcounter -s /usr/sbin/nologin analytics

# Создание каталогов для бинарника и базы данных SQLite
sudo mkdir -p /opt/goatcounter/{bin,db}
sudo chown -R analytics:analytics /opt/goatcounter

Загрузим скомпилированный бинарный архив с официальной страницы релизов GitHub. Автор публикует готовые исполняемые файлы в виде сжатых архивов .gz (например, goatcounter-v2.7.0-linux-amd64.gz):

# Загрузка актуального релиза v2.7.0 (Linux amd64)
cd /tmp
curl -sSL "https://github.com/arp242/goatcounter/releases/download/v2.7.0/goatcounter-v2.7.0-linux-amd64.gz" -o goatcounter.gz

# Распаковка и перемещение в рабочий каталог
gunzip -f goatcounter.gz
sudo mv goatcounter /opt/goatcounter/bin/goatcounter
sudo chmod 755 /opt/goatcounter/bin/goatcounter
sudo chown analytics:analytics /opt/goatcounter/bin/goatcounter

# Проверка работоспособности бинарника
/opt/goatcounter/bin/goatcounter version

⚠️ Важное примечание по безопасности: уязвимость Privilege Escalation и меры защиты

В релизе v2.7.0 исследователями безопасности была выявлена потенциальная уязвимость повышения привилегий (Privilege Escalation) через массовое присвоение параметров (mass assignment) на эндпоинте пользовательских настроек /user/pref. Если в системе включена открытая регистрация сторонних пользователей, непривилегированный аккаунт мог попытаться расширить свои права.

Чтобы полностью нивелировать данный риск:

  • Не включайте публичную регистрацию: используйте единственный закрытый аккаунт администратора, созданный на этапе инициализации.
  • Закрывайте дашборд на уровне веб-сервера: внешние сканеры и неавторизованные запросы к /user/* не смогут дойти до GoatCounter благодаря HTTP Basic Auth в Nginx.
  • Следите за патч-релизами: регулярно проверяйте страницу релизов arp242/goatcounter и обновляйте бинарник при выходе патчей безопасности (v2.7.1+).

Следующим шагом создаем базу данных SQLite и регистрируем корневой сайт аналитики вместе с учетной записью администратора. GoatCounter поддерживает команду db create site, где критически важно передать флаг -createdb для автоматического создания файла базы на чистой системе:

# Инициализация базы данных и создание сайта с учетной записью администратора
sudo -u analytics /opt/goatcounter/bin/goatcounter db create site   -createdb   -db=sqlite+/opt/goatcounter/db/goatcounter.sqlite3   -vhost=syskit.ru   -user.email=admin@syskit.ru   -user.password="SysKitStrongSecret2026!"

💡 Совет инженера: важность флага -createdb и синтаксис sqlite+

Флаг -createdb обязателен при первичном развертывании на чистом сервере. Если его опустить, утилита попытается найти уже существующий файл схемы и аварийно завершит работу с ошибкой отсутствия базы данных. Также обратите внимание на знак плюса в строке -db=sqlite+/opt/... — он сообщает драйверу Go о необходимости открыть файл по абсолютному пути в файловой системе.

4. Настройка службы systemd с жесткой песочницей и лимитом памяти

Для надежной круглосуточной работы, автоматического перезапуска при сбоях и изоляции процессов оформим службу systemd. Особое внимание уделим директивам безопасности ядра Linux: ограничим доступ к файловой системе сервера и зафиксируем жесткий потолок потребления оперативной памяти.

Создадим юнит-файл /etc/systemd/system/goatcounter.service:

[Unit]
Description=GoatCounter Lightweight Web Analytics
After=network.target

[Service]
Type=simple
User=analytics
Group=analytics
WorkingDirectory=/opt/goatcounter

# Запуск на локальном порту 8089 с базовым префиксом /analytics
ExecStart=/opt/goatcounter/bin/goatcounter serve   -listen=127.0.0.1:8089   -tls=http   -db=sqlite+/opt/goatcounter/db/goatcounter.sqlite3   -base-path=/analytics

Restart=always
RestartSec=5s

# Песочница безопасности systemd
NoNewPrivileges=true
ProtectSystem=full
ProtectHome=read-only
ReadWritePaths=/opt/goatcounter/db
PrivateTmp=true

# Лимиты ресурсов cgroups v2
MemoryMax=64M
MemoryHigh=50M

[Install]
WantedBy=multi-user.target

Разберем ключевые директивы конфигурации:

  • -listen=127.0.0.1:8089 — сервис привязывается строго к петлевому интерфейсу localhost. Прямой доступ к порту 8089 из интернета полностью заблокирован.
  • -base-path=/analytics — указывает GoatCounter, что интерфейс и трекер работают во внутреннем подкаталоге сайта (например, https://syskit.ru/analytics/).
  • ProtectSystem=full — монтирует системные каталоги /usr, /boot и /etc в режиме «только для чтения».
  • ReadWritePaths=/opt/goatcounter/db — разрешает запись исключительно в директорию базы данных SQLite, предотвращая модификацию любых других файлов на диске.
  • MemoryMax=64M — защищает сервер от случайных утечек памяти: процесс гарантированно не сможет потребить больше 64 МБ RAM.

Применим изменения, активируем автозагрузку и запустим сервис:

sudo systemctl daemon-reload
sudo systemctl enable --now goatcounter.service

# Проверка статуса и использования памяти
systemctl status goatcounter.service

5. Требования к VDS и аппаратные ресурсы

Поскольку GoatCounter скомпилирован в машинный код Go и не использует виртуальные машины рантайма вроде JVM или Node.js, системные требования к серверу минимальны. Однако производительность аналитики напрямую зависит от скорости операций ввода-вывода (IOPS) дисковой подсистемы, так как SQLite активно использует дисковые страницы для поддержания целостности транзакций.

Ресурс Минимум Рекомендуется Влияние на аналитику
Оперативная память (RAM) 512 МБ 1–2 ГБ Сервису нужно около 40 МБ RAM (по замерам systemd на VDS — 39.1 МБ), остальная память идет под дисковый кэш ОС и Nginx.
Процессор (vCPU) 1 ядро 1–2 ядра (3.0+ ГГц) Высокая частота на ядро ускоряет генерацию отчетов и шифрование TLS-сессий.
Тип накопителя SSD Быстрый NVMe Низкая задержка записи в SQLite WAL гарантирует быструю фиксацию сотен хитов в секунду без задержек.
Сетевой канал 100 Мбит/с 1 Гбит/с Мгновенная доставка JS-скрипта (1.8 КБ gzip) и асинхронных маяков (Beacon) без задержек.

Для надежного размещения рекомендуется выбирать виртуальные серверы с быстрыми накопителями NVMe и стабильной сетевой связностью в проверенных дата-центрах.

Рекомендуемые VDS-провайдеры

Отказоустойчивые сервера с быстрыми NVMe и каналом до 1 Гбит/с

Выбор редакции
⚡

Timeweb Cloud — Быстрые NVMe VDS

Высокочастотные процессоры 3.3+ ГГц для быстрой отдачи веб-страниц, NVMe-диски и надежный сетевой канал 1 Гбит/с.

Конфигурация
1 vCPU 3.3 ГГц • 1 ГБ RAM • 15 ГБ NVMe • Трафик без лимита
Премиум Tier III
🔷

Selectel — Надежные облачные серверы

Отказоустойчивая инфраструктура в сертифицированных дата-центрах Tier III, гарантированные ресурсы vCPU и удобное управление сетью.

Конфигурация
2 vCPU • 2 ГБ RAM • 30 ГБ NVMe • Дата-центры Tier III
Простота и стабильность
🟠

Beget — Простота для веб-разработчиков

Мгновенное развертывание Nginx и сервисов в 1 клик, интуитивная панель управления сервером, бесплатные автоматические бэкапы и отзывчивая поддержка 24/7.

Конфигурация
1 vCPU • 1 ГБ RAM • 15 ГБ NVMe • Бесплатные бэкапы

6. Почему блокировщики режут аналитику и принцип first-party маскировки

Владельцы сайтов технической и IT-направленности часто теряют до 30–40% реального трафика в отчетах аналитики. Популярные блокировщики (uBlock Origin, AdGuard, Brave Shields, Pi-hole) используют открытые списки фильтрации — в первую очередь EasyList, EasyPrivacy и Peter Lowe’s Ad Server List. Блокировка происходит по двум фундаментальным механизмам:

  1. Блокировка по доменному имени: если скрипт подгружается со стороннего сервера (third-party), например gc.zgo.at или mc.yandex.ru, сетевой запрос отклоняется браузером еще на этапе DNS или инициализации соединения.
  2. Блокировка по сигнатурам URL и путям: если имя скрипта или эндпоинт сбора содержат распространенные шаблоны (/count.js, /goatcounter.js, /analytics.js, /pixel.gif), правило регулярного выражения блокировщика перехватывает запрос даже на вашем собственном домене.

⚠️ Важное предупреждение: почему нельзя оставлять стандартные имена

Простого проксирования стандартного скрипта по адресу https://vash-domen.ru/count.js недостаточно. Правила EasyPrivacy блокируют запросы к файлам с именем count.js и эндпоинтам с паттерном /count?* вне зависимости от домена. Чтобы исключить срабатывание базовых фильтров, необходимо изменить имя скрипта и URL приемника данных.

Для восстановления полноты метрик мы настраиваем First-Party Reverse Proxy в Nginx, который решает сразу три задачи:

  • Служебное имя файла: скрипт отслеживания отдается по адресу /assets/js/telemetry.js. Для браузерных фильтров по умолчанию он выглядит как штатный технический бандл сайта.
  • Внутренний API-эндпоинт: сбор аналитических данных выполняется методом Beacon/POST на внутренний роут /api/telemetry/count.
  • Отсутствие CORS и внешних DNS-запросов: все запросы идут на тот же домен первого уровня (first-party context), не вызывая подозрений у стандартных эвристических алгоритмов.

💡 Реалистичная оценка эффективности обхода

Важно понимать технические границы: First-Party проксирование гарантированно обходит стандартные базы правил (EasyList, EasyPrivacy, AdGuard Base), возвращая учет более 90–95% реальных визитов. Однако абсолютной «100% гарантии» в веб-разработке не существует: пользователи с жестким режимом uBlock Origin (Medium/Hard Mode с блокировкой сторонних скриптов) или расширениями вроде NoScript блокируют выполнение любого JavaScript на странице.

7. Конфигурация Nginx: проксирование трекера и двухконтурная защита дашборда

На стороне фронтенд-сервера Nginx нам необходимо разделить публичный трафик (скрипт и прием хитов) и защищенную административную панель. Панель GoatCounter ни в коем случае нельзя оставлять открытой в общий доступ.

Мы применим двухконтурную защиту и Rate Limiting:

  1. Контур 1 (Уровень Nginx): ограничение доступа через auth_basic (HTTP Basic Authentication). Защищает приложение от ботов, сканеров уязвимостей и попыток подбора пароля еще до того, как запрос коснется рантайма Go.
  2. Контур 2 (Уровень GoatCounter): штатная авторизация по логину и паролю администратора.
  3. Защита от флуда (Rate Limiting): ограничение частоты запросов к эндпоинту телеметрии, защищающее SQLite от DoS-атак.

Сначала сгенерируем файл с хэшированным паролем с помощью утилиты htpasswd (пакет apache2-utils):

# Установка утилиты htpasswd при необходимости
sudo apt-get install -y apache2-utils

# Генерация файла паролей с надежным алгоритмом хэширования
sudo htpasswd -bc /etc/nginx/.htpasswd_stats admin_user "SuperSecretPassword2026!"
sudo chmod 640 /etc/nginx/.htpasswd_stats
sudo chown root:www-data /etc/nginx/.htpasswd_stats

Теперь создадим конфигурационный файл Nginx (например, в /etc/nginx/conf.d/goatcounter.conf или в секции server 443 ssl вашего сайта):

# Ограничение частоты запросов от одного IP (15 запросов в секунду)
limit_req_zone $binary_remote_addr zone=telemetry_limit:10m rate=15r/s;

# 1. First-party скрипт отслеживания (маскировка под служебный бандл)
location = /assets/js/telemetry.js {
    proxy_pass http://127.0.0.1:8089/analytics/count.js;
    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;
    
    # Кэширование скрипта в браузере на 1 сутки
    expires 1d;
    add_header Cache-Control "public, no-transform";
}

# 2. Эндпоинт отправки статистики (маскировка под внутреннее API)
location = /api/telemetry/count {
    # Защита от флуда и бот-трафика
    limit_req zone=telemetry_limit burst=30 nodelay;

    proxy_pass http://127.0.0.1:8089/analytics/count;
    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;
    
    # Отключение буферизации для мгновенной доставки Beacon-запросов
    proxy_buffering off;
}

# 3. Закрытый дашборд аналитики (двойной контур защиты)
location /analytics/ {
    auth_basic "SysKit Analytics Protected Area";
    auth_basic_user_file /etc/nginx/.htpasswd_stats;
    
    proxy_pass http://127.0.0.1:8089;
    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;
    proxy_buffering off;
}

# Корректный 301-редирект при обращении без замыкающего слэша
location = /analytics {
    return 301 https://$host/analytics/;
}

Проверим корректность синтаксиса и перезагрузим веб-сервер:

sudo nginx -t
sudo systemctl reload nginx

Если вы настраиваете чистый Nginx или хотите проверить заголовки безопасности, используйте готовый конфигуратор Nginx Reverse Proxy на SysKit, а также онлайн-утилиту SSL Чекер для проверки валидности сертификата.

8. Подключение скрипта на сайт, проверка сетевых запросов и аудит базы данных

Для активации сбора аналитики достаточно добавить одну строку в шаблон вашего веб-приложения или CMS (обычно в файл подвала перед закрывающим тегом </body>):

<!-- Автономная веб-аналитика (First-party телеметрия без cookie, обход блокировщиков) -->
<script data-goatcounter="https://vash-domen.ru/api/telemetry/count" async src="/assets/js/telemetry.js"></script>

Атрибут data-goatcounter указывает JS-скрипту, на какой адрес отправлять телеметрические пакеты. Скрипт выполняется в асинхронном режиме (async), благодаря чему загрузка страницы и отрисовка контента происходят без задержек.

💡 Совет инженера: исключение собственных посещений из статистики

Чтобы ваши визиты во время разработки и наполнения сайта не искажали метрики, откройте дашборд GoatCounter, перейдите в Settings → Preferences и нажмите кнопку «Ignore my visits». Сервис запишет специальный флаг в локальное хранилище браузера localStorage.setItem('skipgc', 't'), и скрипт перестанет отправлять события с вашего устройства.

Проверим корректность работы сквозного контура:

  1. Откройте сайт в браузере в режиме инкогнито со стандартным фильтром uBlock Origin или AdGuard.
  2. Откройте панель разработчика (F12) на вкладке Network (Сеть).
  3. Убедитесь, что файл telemetry.js загружен со статусом 200 OK и типом javascript, а на адрес /api/telemetry/count отправлен запрос методом POST (sendBeacon) или GET со статусом 200 OK.

Теперь проверим фиксацию данных в базе SQLite. Важно помнить, что GoatCounter накапливает входящие хиты в оперативной памяти и сбрасывает их на диск пачками с интервалом около 10 секунд (поэтому новый переход появляется в таблице не сиюсекундно). Выполним инспекцию таблиц paths и hits через Python:

# Проверка зафиксированных страниц и общего количества просмотров в SQLite
sudo python3 -c "
import sqlite3
con = sqlite3.connect('/opt/goatcounter/db/goatcounter.sqlite3')
cur = con.cursor()
print('--- Зафиксированные страницы (paths) ---')
for row in cur.execute('SELECT path, title FROM paths LIMIT 5'):
    print(row)
print('--- Зарегистрировано просмотров в таблице hits ---')
print(cur.execute('SELECT count(*) FROM hits').fetchone()[0])
con.close()
"

9. Резервное копирование SQLite в режиме WAL и траблшутинг

В режиме WAL база данных состоит из трех файлов: основного goatcounter.sqlite3, служебного файла разделяемой памяти goatcounter.sqlite3-shm и журнала упреждающей записи goatcounter.sqlite3-wal. Простое копирование утилитой cp во время активной записи может привести к повреждению данных (corrupted database).

Существует два надежных способа организации бэкапов SQLite:

  1. Точечные снимки через VACUUM INTO: встроенная команда SQLite создает атомарный консистентный файл без блокировки читателей и писателей.
  2. Потоковая непрерывная репликация через Litestream: специализированная утилита, которая перехватывает WAL-фреймы в реальном времени и стримит их в S3-хранилище с RPO менее 1 секунды.

Создание горячего резервного снимка командой VACUUM INTO:

# Создание горячего резервного снимка базы данных
sudo sqlite3 /opt/goatcounter/db/goatcounter.sqlite3 "VACUUM INTO '/opt/goatcounter/db/backup_$(date +%Y%m%d_%H%M%S).sqlite3';"

# Проверка целостности созданного бэкапа
sudo sqlite3 /opt/goatcounter/db/backup_*.sqlite3 "PRAGMA integrity_check;"

Для непрерывной репликации в облако достаточно установить Litestream и запустить фоновый процесс, указав бакет S3:

# Пример непрерывной репликации в S3 через Litestream
litestream replicate /opt/goatcounter/db/goatcounter.sqlite3 s3://my-backups-bucket/goatcounter

⚠️ Траблшутинг частых неполадок

  • Ошибка 405 Method Not Allowed при тестировании через curl: если вы проверяете скрипт командой curl -I https://vash-domen.ru/assets/js/telemetry.js, веб-сервер вернет 405. Обработчик статического скрипта в GoatCounter принимает только методы GET и POST. Для корректной проверки используйте curl -i (GET) или обычный браузер.
  • Задержка появления данных в дашборде: если после перехода статистика не обновилась мгновенно, подождите 10–15 секунд — фоновый воркер GoatCounter записывает накопленный буфер хитов из памяти в базу пачками с интервалом около 10 секунд.
  • Запрос логина при скачивании telemetry.js: убедитесь, что в конфигурации Nginx секция location = /assets/js/telemetry.js использует точное совпадение со знаком равенства (=) и не содержит директивы auth_basic. Точные location в Nginx имеют наивысший приоритет.
  • Срабатывание OOM Killer: если процесс неожиданно перезапускается с кодом 137, проверьте лимит MemoryMax в юните systemd. Для большинства проектов 64 МБ достаточно, но при резких всплесках трафика лимит можно безопасно увеличить до 128M.

Разверните собственную независимую аналитику на VDS

Откажитесь от громоздких систем сбора данных и сохраняйте полную конфиденциальность метрик вашего проекта. Запустите надежный виртуальный сервер с быстрыми накопителями NVMe и каналом 1 Гбит/с у проверенного провайдера.

Инструменты SysKit по теме статьи

Бесплатные утилиты для проверки и диагностики вашего сервера

Вопросы и ответы (FAQ)

Популярные вопросы вебмастеров и сисадминов по данной теме

Какую реальную нагрузку выдерживает база данных SQLite в GoatCounter?
В режиме Write-Ahead Logging (WAL) и с буферизацией в оперативной памяти GoatCounter на VDS с быстрым NVMe-накопителем легко обрабатывает от 300 до 500 хитов в секунду (миллионы просмотров в месяц). Если проект перерастает масштаб 5–10 млн просмотров в месяц, GoatCounter позволяет переключить хранилище на PostgreSQL одним параметром в строке запуска без изменения клиентского кода.
Является ли обход блокировщиков для сбора собственной аналитики законным с точки зрения регуляторов?
С технической точки зрения GoatCounter полностью анонимен: он не сохраняет персональные данные (PII), не устанавливает cookie-файлы, не использует фингерпринтинг и не передает данные третьим лицам. В рамках европейской директивы ePrivacy и GDPR сбор агрегированной технической First-Party статистики первого уровня, необходимой для функционирования сайта, как правило, не требует согласия через баннер. Однако для коммерческих сайтов в строгих юрисдикциях (Германия, Франция) рекомендуется проконсультироваться с юристом и обязательно отразить используемый механизм анонимного учета в Политике конфиденциальности.
Как передавать пользовательские события (клик по кнопке, скачивание файла) в GoatCounter?
GoatCounter поддерживает метод goatcounter.count({ path: 'event-name', title: 'Название события', event: true }). Вы можете повесить вызов этой функции на обработчик onclick в JS или использовать специальный атрибут data-goatcounter-click="event-name" на ссылках и кнопках без написания дополнительного кода.

Читайте также в блоге SysKit

Смежные руководства и полезные технические статьи