Docker и DevOps 14 мин чтения 2026-10-21

Мониторинг ошибок веб-приложений и API в GlitchTip: развертывание легковесной замены Sentry на VDS в Docker Compose

Практическое руководство по развертыванию GlitchTip 6.2 на VDS в Docker Compose: монолитная архитектура Granian, очередь django-vtasks, 100% совместимость с Sentry SDK, реверс-прокси Nginx с SSL и мгновенные алерты в Telegram.

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

Каждый веб-разработчик и владелец интернет-магазина сталкивался с неприятной ситуацией: пользователи нажимают кнопку оформления заказа, сталкиваются с белым экраном из-за непредвиденного JavaScript-сбоя, а бэкенд возвращает пятисотую ошибку. Узнавать о таких инцидентах из жалоб в службу поддержки — худший сценарий, приводящий к потере клиентов и выручки. Классическим стандартом мониторинга ошибок в индустрии является Sentry, однако его облачные тарифы начинаются от $26 в месяц с жесткими ограничениями по числу событий и трудностями оплаты картами РФ, а официальный self-hosted стек превратился в тяжеловесную систему, требующую от 16 ГБ оперативной памяти, Apache Kafka, ClickHouse и более десятка вспомогательных микросервисов.

Для проектов малого и среднего бизнеса, соло-разработчиков и веб-студий существует открытая альтернатива — GlitchTip. Это легковесная платформа мониторинга ошибок с открытым исходным кодом, на 100% совместимая со стандартными SDK Sentry. Она принимает аварийные дампы, трейсы стека, предупреждения фронтенда и бэкенда, группирует однотипные сбои и отправляет алерты команде. При этом GlitchTip официально требует от 256–512 МБ оперативной памяти и разворачивается за считанные минуты.

💡 Полная совместимость со стандартами экосистемы Sentry

Вам не придется переписывать код приложений или внедрять самописные трекеры. Достаточно использовать официальные и проверенные клиентские библиотеки @sentry/browser, @sentry/react, @sentry/vue, sentry-sdk для Python, PHP (включая Laravel и Symfony), Node.js или Go, указав в качестве точки отправки (DSN) адрес вашего собственного сервера на базе GlitchTip.

1. Архитектура GlitchTip v6: почему он требует минимум ресурсов

В актуальной мажорной ветке GlitchTip 6.2 архитектура платформы претерпела фундаментальную переработку. Разработчики полностью отказались от тяжеловесного Celery, заменив его на собственную асинхронную очередь фоновых задач django-vtasks, а слой кэширования перевели на django-vcache. Из Docker-образа удалены устаревшие серверы Gunicorn и Uvicorn — новым стандартом по умолчанию стал сверхбыстрый Rust-асинхронный ASGI-сервер Granian.

В режиме SERVER_ROLE=all_in_one воркер фоновых задач и планировщик встроены непосредственно в процесс веб-сервера Granian. Это позволяет поднимать полноценный мониторинг всего в трех компактных контейнерах:

Критерий сравнения Self-Hosted Sentry (develop.sentry.dev) GlitchTip 6.2 на VDS (glitchtip.com)
Официальные требования к RAM Минимум 16 ГБ RAM (рекомендуется 24–32 ГБ) Минимум 256 МБ RAM (рекомендуется 512 МБ – 1 ГБ)
Инфраструктурный стек Kafka, ClickHouse, Snuba, Relay, Zookeeper, Redis, Postgres PostgreSQL 17 + Redis 7 + GlitchTip (Granian)
Очередь фоновых задач Kafka + Celery с десятками воркеров Встроенный легковесный django-vtasks
Количество контейнеров Более 15 контейнеров 3 контейнера в едином Docker Compose
Совместимость с протоколом Sentry Родная реализация 100% поддержка официальных Sentry SDK (v7, v8)

2. Подготовка VDS и генерация криптографических ключей

Для развертывания потребуется сервер с чистой операционной системой Ubuntu 24.04 LTS или Debian 12, установленным Docker Engine с плагином Compose и направленной A-записью домена (например, errors.example.com). Если вы настраиваете чистый VDS, рекомендуем предварительно ознакомиться с руководством по базовому харденингу серверов.

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

# Создаем рабочую директорию проекта
sudo mkdir -p /opt/glitchtip && cd /opt/glitchtip

# Устанавливаем строгие права доступа (чтение и запись только владельцу)
sudo chmod 700 /opt/glitchtip

GlitchTip требует защищенный секретный ключ (SECRET_KEY) для шифрования сессий и токенов авторизации, а также надежный пароль к базе данных PostgreSQL. Сгенерируем криптостойкие случайные строки длиной 32 байта с помощью утилиты openssl. Также вы можете воспользоваться онлайн-утилитой генератора надежных паролей SysKit для безопасного получения случайных секретов без спецсимволов:

# Генерация 64-символьного SECRET_KEY
openssl rand -hex 32

# Генерация надежного пароля для PostgreSQL
openssl rand -hex 24

⚠️ Важное предупреждение о безопасности ключей

Категорически запрещено использовать дефолтный ключ change_me в публичной сети. В случае компрометации SECRET_KEY злоумышленники смогут подделывать сессионные куки администратора и перехватывать логи ошибок ваших приложений.

3. Боевой манифест Docker Compose: GlitchTip 6.2, PostgreSQL и Redis

Сформируем конфигурационный файл переменных окружения /opt/glitchtip/.env с помощью команды sudo tee. В нем зафиксируем сгенерированные секреты, параметры подключения к базе данных, почтовую конфигурацию и политику хранения ивентов (по умолчанию 90 дней, чтобы старые трейсы автоматически удалялись):

# Создаем файл окружения от имени суперпользователя
sudo tee /opt/glitchtip/.env > /dev/null << 'EOF'
# Основные параметры GlitchTip
GLITCHTIP_DOMAIN=https://errors.example.com
SECRET_KEY=9a1b2c3d4e5f67890123456789abcdef0123456789abcdef0123456789abcdef
DATABASE_URL=postgres://glitchtip:pg_strong_password_here@postgres:5432/glitchtip
VALKEY_URL=redis://redis:6379

# Роль сервера: all_in_one объединяет веб-сервер, воркер django-vtasks и планировщик
SERVER_ROLE=all_in_one

# Политика регистрации и хранения логов
ENABLE_ORGANIZATION_CREATION=true
GLITCHTIP_RETENTION_DAYS=90
LOG_LEVEL=INFO

# Почтовые оповещения (по умолчанию консольный вывод для тестов;
# для продакшена укажите smtp://user:password@smtp.example.com:587)
EMAIL_URL=consolemail://
DEFAULT_FROM_EMAIL=glitchtip@example.com

# Параметры параллелизма ASGI-сервера Granian
GRANIAN_WORKERS=1
EOF

# Ограничиваем права доступа к файлу с секретами
sudo chmod 600 /opt/glitchtip/.env

Теперь создадим файл /opt/glitchtip/docker-compose.yml. Мы используем легковесные образы PostgreSQL 17 и Redis 7 на базе Alpine Linux, а также официальный релиз GlitchTip 6.2.6. Обратите внимание на директивы SERVER_ROLE: all_in_one (альтернатива в документации — GLITCHTIP_EMBED_WORKER=true) и привязку порта приложения строго к локальному интерфейсу 127.0.0.1:8000:8000 для защиты от несанкционированного доступа мимо системного брандмауэра UFW:

services:
  postgres:
    image: postgres:17-alpine
    restart: unless-stopped
    mem_limit: 512m
    cpus: 1.0
    environment:
      POSTGRES_USER: glitchtip
      POSTGRES_PASSWORD: pg_strong_password_here
      POSTGRES_DB: glitchtip
    command:
      - postgres
      - -c
      - max_connections=200
      - -c
      - max_locks_per_transaction=512
    volumes:
      - postgres_data:/var/lib/postgresql/data
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U glitchtip -d glitchtip"]
      interval: 10s
      timeout: 5s
      retries: 5

  redis:
    image: redis:7-alpine
    restart: unless-stopped
    mem_limit: 256m
    cpus: 0.5
    # Режим AOF гарантирует сохранение задач в очереди при перезагрузке,
    # а директива --save "" отключает избыточные RDB-дампы на диск
    command: redis-server --appendonly yes --save ""
    volumes:
      - redis_data:/data
    healthcheck:
      test: ["CMD", "redis-cli", "ping"]
      interval: 10s
      timeout: 3s
      retries: 3

  glitchtip:
    image: glitchtip/glitchtip:6.2.6
    restart: unless-stopped
    mem_limit: 768m
    cpus: 1.5
    depends_on:
      postgres:
        condition: service_healthy
      redis:
        condition: service_healthy
    environment:
      SERVER_ROLE: all_in_one
    env_file:
      - .env
    ports:
      - "127.0.0.1:8000:8000"
    volumes:
      - uploads_data:/code/uploads

volumes:
  postgres_data:
  redis_data:
  uploads_data:

💡 Почему в манифесте нет отдельного контейнера Worker

В устаревших статьях авторы по привычке запускают четыре отдельных контейнера: web, worker, migrate и celery-beat. В GlitchTip 6.2 вместо тяжеловесного Celery внедрен собственный легковесный движок django-vtasks, а при указании SERVER_ROLE: all_in_one воркер очереди и планировщик встроены прямо в процесс веб-сервера Granian. Это упрощает стек до одного рабочего контейнера и полностью исключает рассинхронизацию миграций схемы БД.

Запустим контейнеры в фоновом режиме:

# Запуск сервисов через Docker Compose
sudo docker compose up -d

# Просмотр логов автоматической инициализации
sudo docker compose logs -f glitchtip

При первом старте GlitchTip автоматически выполняет миграции схемы базы данных (./manage.py migrate) с помощью транзакционных advisory-блокировок PostgreSQL, предотвращая состояния гонки. Если вы разворачиваете сервис в кластере Kubernetes через Helm, авто-миграции можно отключить переменной SKIP_INIT=true и запускать их отдельным Pre-Deploy шагом.

Проверить доступность локального HTTP-эндпоинта можно через терминал или с помощью нашего онлайн-инструмента проверки портов SysKit:

# Проверка доступности локального HTTP-эндпоинта
curl -I http://127.0.0.1:8000/

4. Настройка веб-сервера и SSL-сертификатов: Nginx и Caddy

Для безопасного приема дампов ошибок из браузеров клиентов и бэкенд-серверов требуется шифрованное HTTPS-соединение. Кроме того, входящие пакеты с трассировками стека и отчетами об авариях могут содержать объемные данные (включая source maps и дампы памяти), поэтому официальная документация GlitchTip рекомендует установить директиву client_max_body_size 40m;.

Рассмотрим настройку на базе популярного веб-сервера Nginx. Создадим конфигурационный файл виртуального хоста. Чтобы исключить проблему «курицы и яйца» (когда Nginx не может запуститься из-за отсутствия SSL-сертификата), сначала настраиваем базовый HTTP-прокси на 80 порту:

# /etc/nginx/sites-available/glitchtip.conf
server {
    listen 80;
    server_name errors.example.com;

    # Рекомендованный GlitchTip лимит на загрузку дампов и source maps (40 МБ)
    client_max_body_size 40m;

    location / {
        proxy_pass http://127.0.0.1:8000;
        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_set_header X-Forwarded-Host $host;
        proxy_set_header X-Forwarded-Port $server_port;

        # Таймауты для надежного приема событий
        proxy_connect_timeout 30s;
        proxy_read_timeout 60s;
        proxy_send_timeout 60s;
    }
}

Активируем сайт через символическую ссылку, проверяем синтаксис директив и выпускаем бесплатный SSL-сертификат Let's Encrypt через Certbot с автоматическим редиректом всех запросов на HTTPS:

# Активация конфигурации в Nginx
sudo ln -sf /etc/nginx/sites-available/glitchtip.conf /etc/nginx/sites-enabled/
sudo nginx -t && sudo systemctl reload nginx

# Выпуск SSL-сертификата с автоматическим HTTPS-редиректом
sudo certbot --nginx -d errors.example.com --redirect --non-interactive --agree-tos -m admin@example.com

Если вы предпочитаете современный веб-сервер Caddy со встроенным выпуском Let's Encrypt, конфигурация в /etc/caddy/Caddyfile выглядит еще компактнее:

errors.example.com {
    reverse_proxy 127.0.0.1:8000
    request_body {
        max_size 40MB
    }
}

После перезагрузки веб-сервера проверьте статус TLS-шифрования и цепочку сертификатов через онлайн-инструмент проверки SSL-сертификатов SysKit, чтобы убедиться в отсутствии проблем с доверием у браузеров.

5. Системные требования и выбор оптимального тарифа VDS

В официальной документации GlitchTip указано минимальное требование к памяти — от 256 МБ RAM в режиме all-in-one. В условиях реальной промышленной эксплуатации связка из PostgreSQL 17, Redis 7 и GlitchTip на Granian комфортно чувствует себя на тарифах с 1–2 ГБ RAM, оставляя достаточный запас оперативной памяти под системный дисковый кэш и пиковые всплески трафика.

Профиль проекта Ориентировочный поток событий Рекомендуемая конфигурация VDS Диск (NVMe)
Базовый (пет-проекты, 1–3 сайта) До 50 000 ивентов в месяц 1 vCPU • 1 ГБ RAM 15–20 ГБ NVMe
Оптимальный (веб-студия, интернет-магазин) 50 000 – 500 000 ивентов в месяц 2 vCPU • 2 ГБ RAM 30–40 ГБ NVMe
Высоконагруженный (SaaS-платформа, API) Свыше 1 000 000 ивентов в месяц 4 vCPU • 4–8 ГБ RAM 60–100 ГБ NVMe

Для надежного развертывания выбирайте VDS с аппаратной KVM-виртуализацией, скоростными NVMe-дисками и размещением в проверенных российских дата-центрах (Timeweb Cloud, Selectel, Beget). Это гарантирует минимальные задержки при отправке аварийных дампов из РФ, отсутствие санкционных рисков и оплату рублями без валютных карт:

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

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

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

Timeweb Cloud — Быстрые NVMe VDS в РФ

Идеальная инфраструктура для мониторинга: скоростные NVMe-диски, сеть до 1 Гбит/с и мгновенная оплата российскими картами.

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

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

Корпоративная надежность дата-центров уровня Tier III в Москве и Санкт-Петербурге для критичных сервисов с высокими требованиями к SLA.

Конфигурация
1 vCPU 3.0 ГГц • 2 ГБ RAM • 25 ГБ NVMe • Канал 100 Мбит/с
Простота для DevOps
🟠

Beget — Простота управления и стабильность

Удобная панель управления сервером, быстрое масштабирование ресурсов и отзывчивая круглосуточная техническая поддержка.

Конфигурация
1 vCPU 3.0 ГГц • 1 ГБ RAM • 20 ГБ NVMe • Безлимитный трафик

6. Подключение клиентских SDK: JavaScript, Python и PHP

После завершения установки откройте в браузере адрес вашего инстанса (https://errors.example.com) и пройдите регистрацию первого пользователя. Он автоматически станет владельцем главной организации. Создайте новый проект (Project), выберите технологический стек и скопируйте сформированный DSN (Data Source Name) вида https://<public_key>@errors.example.com/<project_id>.

💡 Закрытие публичной регистрации после настройки

Чтобы посторонние пользователи не могли регистрировать организации на вашем сервере, после создания учетной записи администратора установите в /opt/glitchtip/.env директиву ENABLE_ORGANIZATION_CREATION=false и перезапустите сервис командой sudo docker compose up -d. Добавлять коллег в проекты вы сможете через инвайты по электронной почте.

Подключение в JavaScript / Frontend (React, Vue, SPA)

Установите официальный пакет Sentry для браузера через npm или yarn:

npm install @sentry/browser

Инициализируйте клиент в точке входа вашего приложения (например, main.js или index.tsx):

import * as Sentry from "@sentry/browser";

Sentry.init({
  dsn: "https://d1a2b3c4d5e6f7a8b9c0@errors.example.com/1",
  environment: "production",
  release: "shop-frontend@1.4.0",
  // Доля трейсов производительности (1.0 = 100%, 0.1 = 10% для умеренной нагрузки)
  tracesSampleRate: 0.2,
});

// Тестовая проверка отправки инцидента
// Sentry.captureException(new Error("Тестовый сбой оформления заказа"));

Подключение в Python / Backend (FastAPI, Django, Flask)

Установите официальный SDK для Python:

pip install sentry-sdk

Добавьте инициализацию в код запуска сервиса:

import sentry_sdk

sentry_sdk.init(
    dsn="https://d1a2b3c4d5e6f7a8b9c0@errors.example.com/1",
    environment="production",
    traces_sample_rate=0.2,
    # Автоматический перехват необработанных исключений
    send_default_pii=False,
)

Подключение в PHP (Laravel, Symfony, чистый PHP)

Для классических PHP-приложений установите базовый SDK через Composer:

composer require sentry/sentry

Если вы работаете с фреймворком Laravel, используйте официальный пакет интеграции composer require sentry/sentry-laravel. В чистом PHP инициализация выполняется следующим образом:

<?php
require_once __DIR__ . '/vendor/autoload.php';

\Sentry\init([
    'dsn' => 'https://d1a2b3c4d5e6f7a8b9c0@errors.example.com/1',
    'environment' => 'production',
    'traces_sample_rate' => 0.2,
]);

// Исключения автоматически перехватываются и передаются в GlitchTip
// throw new Exception("Сбой подключения к шлюзу платежей");
?>

7. Настройка правил алертов и мгновенных уведомлений в Telegram

Главная ценность мониторинга — скорость реакции дежурного инженера. GlitchTip поддерживает отправку уведомлений через Email, Generic Webhook, Discord, Slack, Microsoft Teams, Zulip, Feishu и Ntfy. Если вы используете собственный сервер пуш-уведомлений, настроенный по нашему руководству развертывания Ntfy в Docker Compose, вы можете подключить его в интерфейсе в разделе Project Settings → Alerts.

Для отправки алертов напрямую в рабочий Telegram-чат дежурных специалистов настроим легковесный вебхук-ретранслятор на Python. Создадим скрипт-обработчик /opt/glitchtip/telegram_relay.py, который принимает JSON-пакет от GlitchTip и отправляет аккуратно отформатированное HTML-сообщение в Telegram:

# /opt/glitchtip/telegram_relay.py
import os
import json
import html
import urllib.parse
import urllib.request
from http.server import HTTPServer, BaseHTTPRequestHandler

TELEGRAM_BOT_TOKEN = os.getenv("TELEGRAM_BOT_TOKEN", "123456789:ABCdefGhIJKlmNoPQRstuVWXyz")
TELEGRAM_CHAT_ID = os.getenv("TELEGRAM_CHAT_ID", "-1001234567890")

class WebhookHandler(BaseHTTPRequestHandler):
    def do_POST(self):
        length = int(self.headers.get('Content-Length', 0))
        body = self.rfile.read(length)
        try:
            data = json.loads(body.decode('utf-8'))
        except Exception:
            data = {}

        # Извлекаем параметры ошибки из вебхука GlitchTip
        event = data.get('event', {})
        project = data.get('project_name', 'GlitchTip')
        title = event.get('title') or data.get('title') or 'Неизвестное исключение'
        issue_url = data.get('issue_url') or ''

        # Экранируем спецсимволы в тексте для parse_mode='HTML'
        title_safe = html.escape(str(title))
        project_safe = html.escape(str(project))

        # Формируем сообщение в валидном HTML-режиме Telegram (без Markdown-звездочек)
        if issue_url:
            link_html = f"\n🔗 <a href='{issue_url}'>Открыть трейс в GlitchTip</a>"
        else:
            link_html = ""

        message = (
            f"🚨 <b>Сбой в проекте {project_safe}</b>\n\n"
            f"<b>Ошибка:</b> <code>{title_safe}</code>"
            f"{link_html}"
        )

        tg_url = f"https://api.telegram.org/bot{TELEGRAM_BOT_TOKEN}/sendMessage"
        payload = urllib.parse.urlencode({
            'chat_id': TELEGRAM_CHAT_ID,
            'text': message,
            'parse_mode': 'HTML',
            'disable_web_page_preview': 'true'
        }).encode('utf-8')

        req = urllib.request.Request(tg_url, data=payload)
        try:
            with urllib.request.urlopen(req, timeout=10) as resp:
                self.send_response(200)
                self.end_headers()
                self.wfile.write(b"OK")
        except Exception as e:
            self.send_response(500)
            self.end_headers()
            self.wfile.write(str(e).encode('utf-8'))

if __name__ == '__main__':
    server = HTTPServer(('127.0.0.1', 9005), WebhookHandler)
    server.serve_forever()

Для тестовой проверки отправки сообщения в Telegram из командной строки используйте вызов curl со строгими обратными слэшами и флагом --data-urlencode, гарантирующим корректную передачу спецсимволов и переносов строк:

# Тестовая проверка доставки в Telegram через CLI
MESSAGE="🚨 Тестовый алерт GlitchTip: сервис работает в штатном режиме"
curl -s -X POST "https://api.telegram.org/bot123456789:ABCdefGhIJKlmNoPQRstuVWXyz/sendMessage" \
  -d "chat_id=-1001234567890" \
  --data-urlencode "text=$MESSAGE" \
  -d "parse_mode=HTML"

💡 Настройка правила алерта в интерфейсе GlitchTip

В панели управления перейдите в Project → Settings → Alerts, добавьте получателя типа Generic Webhook и укажите URL ретранслятора http://127.0.0.1:9005/. В правилах срабатывания задайте условие: отправлять уведомление при появлении первого нового инцидента (New Issue Created) или при повторении ошибки чаще 10 раз за минуту.

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

При активном трафике сотни сайтов могут генерировать миллионы записей трассировок, что неизбежно приводит к росту объема базы данных. В GlitchTip встроен механизм автоматического секционирования таблиц (PostgreSQL table partitioning), работающий с версии 4.0 (в версии 6.0 логика партиционирования переведена на собственный PartitionManager). Переменная GLITCHTIP_RETENTION_DAYS=90 в файле .env автоматически удаляет устаревшие партиции событий старше 90 дней, не создавая блокировок и не замедляя работу базы данных.

💡 Холодное хранилище DuckDB для долгосрочного архива

Если вам требуется сохранять исторические события для аналитики за полгода или год, но вы не хотите раздувать оперативную память PostgreSQL, GlitchTip поддерживает режим холодного хранилища на базе аналитической СУБД DuckDB (GLITCHTIP_ENABLE_DUCKDB=true). В этом режиме старые события выгружаются в сжатые columnar-файлы на диске.

Для защиты данных настроим ежедневное автоматическое резервное копирование базы данных PostgreSQL в сжатый архив с автоматической ротацией старых копий. Создадим скрипт /opt/glitchtip/backup.sh:

#!/usr/bin/env bash
set -eo pipefail

BACKUP_DIR="/var/backups/glitchtip"
PROJECT_DIR="/opt/glitchtip"
DATE=$(date +%Y%m%d_%H%M%S)
BACKUP_FILE="$BACKUP_DIR/glitchtip_db_$DATE.sql.gz"

mkdir -p "$BACKUP_DIR"
cd "$PROJECT_DIR"

# Выполняем согласованный дамп базы через pg_dump внутри контейнера
docker compose exec -T postgres pg_dump -U glitchtip glitchtip | gzip > "$BACKUP_FILE"

# Устанавливаем строгие права доступа к архиву
chmod 600 "$BACKUP_FILE"

# Удаляем резервные копии старше 14 дней для экономии места
find "$BACKUP_DIR" -type f -name "glitchtip_db_*.sql.gz" -mtime +14 -delete

echo "[$DATE] Резервная копия базы GlitchTip успешно создана: $BACKUP_FILE"

Сделаем скрипт исполняемым и добавим его в системный планировщик cron на запуск каждую ночь в 03:00:

# Делаем скрипт исполняемым
sudo chmod +x /opt/glitchtip/backup.sh

# Добавляем задачу в crontab суперпользователя
(sudo crontab -l 2>/dev/null; echo "0 3 * * * /opt/glitchtip/backup.sh >> /var/log/glitchtip_backup.log 2>&1") | sudo crontab -

9. Траблшутинг: типичные сбои и их быстрое устранение

В процессе промышленной эксплуатации инженеры могут сталкиваться с характерными нюансами сетевого взаимодействия и лимитов. Ниже приведены решения наиболее частых проблем:

Симптом / Ошибка Вероятная причина Способ решения
413 Request Entity Too Large Размер пакета с дампом или source map превышает лимит Nginx Увеличьте директиву client_max_body_size 40m; в блоке server Nginx. Подробный разбор читайте в нашей статье об ошибке 413 Request Entity Too Large.
CORS / Mixed Content в браузере В DSN указан протокол HTTP вместо HTTPS или отсутствует заголовок Forwarded Убедитесь, что в .env задан GLITCHTIP_DOMAIN=https://..., а в Nginx проброшен заголовок proxy_set_header X-Forwarded-Proto $scheme;.
Too many connections в PostgreSQL Всплеск одновременных задач или превышение дефолтного лимита соединений В манифесте Compose мы явно задали флаг max_connections=200. При необходимости масштабирования увеличьте значение до 300.
Падение контейнера по OOM Killer Недостаток оперативной памяти на VDS при обработке огромных пакетов Проверьте лимиты mem_limit в Compose и добавьте файл подкачки swap (1–2 ГБ) на диске VDS.

10. Обновление GlitchTip до новых версий

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

# Переходим в каталог проекта
cd /opt/glitchtip

# Загружаем свежие версии образов
sudo docker compose pull

# Перезапускаем сервис с автоматическим накатыванием миграций
sudo docker compose down && sudo docker compose up -d

Перед мажорными обновлениями рекомендуется обязательно выполнить внеочередной бэкап базы данных с помощью скрипта /opt/glitchtip/backup.sh.

11. Итоговый чек-лист проверки контура перед запуском в продакшен

Перед тем как переключать DSN в боевых веб-сервисах на новый сервер мониторинга, убедитесь в соблюдении всех требований безопасности и надежности:

  • Роль сервера: В docker-compose.yml задана директива SERVER_ROLE: all_in_one, активирующая встроенный воркер и планировщик задач.
  • Шифрование и SSL: Сертификат выпущен корректно, при обращении по HTTP срабатывает автоматический 301-редирект на HTTPS. Проверено через SSL Checker.
  • Изоляция портов: Порт GlitchTip привязан строго к 127.0.0.1:8000. База данных PostgreSQL и Redis не имеют внешних пробросов в интернет. Проверено через Port Checker.
  • Регистрация: Переменная ENABLE_ORGANIZATION_CREATION=false установлена в .env после создания администратора, чтобы закрыть несанкционированную регистрацию.
  • Алерты в Telegram: Тестовое исключение успешно отображается в интерфейсе GlitchTip и доставляется ботом в рабочий чат с кликабельной ссылкой на инцидент.
  • Резервное копирование: Скрипт бэкапа добавлен в cron и формирует валидный gzip-дамп базы данных.

Готовы развернуть независимый мониторинг для своих проектов?

Запустите GlitchTip на надежном российском VDS с быстрыми накопителями NVMe и каналом до 1 Гбит/с. Вы получите полный контроль над логами ошибок без ограничений по трафику и без риска внезапной блокировки зарубежных SaaS-сервисов.

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

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

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

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

Поддерживает ли GlitchTip загрузку Source Maps для минифицированного JavaScript?
Да, GlitchTip полностью поддерживает работу с source maps. Вы можете загружать карты исходного кода через стандартный CLI-инструмент @sentry/cli в процессе сборки вашего CI/CD-пайплайна (GitHub Actions или GitLab CI), указав URL вашего сервера GlitchTip и токен аутентификации из настроек профиля.
Что делать, если база данных GlitchTip быстро растет и занимает много места на диске?
Чистка событий регулируется переменными GLITCHTIP_RETENTION_DAYS (общий срок), GLITCHTIP_EVENT_RETENTION_DAYS и GLITCHTIP_TRANSACTION_RETENTION_DAYS в файле .env. Для длительного хранения исторических событий без раздувания PostgreSQL можно включить холодное хранилище на базе DuckDB (GLITCHTIP_ENABLE_DUCKDB=true). Также освободить место на диске после удаления старых партиций можно командой docker compose exec postgres vacuumdb -U glitchtip -d glitchtip --full.
Можно ли использовать GlitchTip для мониторинга производительности (APM и Tracing)?
Да, GlitchTip поддерживает транзакции и спаны производительности (Performance Tracing) из стандартных SDK Sentry. Регулировать объем собираемых трейсов можно через параметр tracesSampleRate на стороне клиентских приложений, чтобы не перегружать сервер сетевым трафиком.

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

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