Changedetection.io на VPS: следим за изменениями на любых сайтах
Хотите знать, когда снизится цена на товар, появится нужная вакансия или обновится документация — и получать уведомление в Telegram? Changedetection.io делает именно это. 30 000+ звёзд на GitHub, работает на VPS от 512 МБ RAM, разворачивается за 5 минут.
Что это и зачем
Changedetection.io — это сервис, который периодически заходит на нужные вам страницы и проверяет, не изменилось ли что-то. Если изменилось — отправляет уведомление.
Звучит просто, но применений масса:
- →Цены. Поставили ноутбук на отслеживание в магазине — пришёл алерт о снижении на 5 000 рублей.
- →Товары в наличии. Редкий товар появился на складе — сразу в Telegram.
- →Вакансии. Страница компании с вакансиями обновилась — значит, появилась новая позиция.
- →Документация и законы. Изменился нужный раздел официальной документации или нормативный акт.
- →Конкуренты. Обновился прайс-лист или появилась новая услуга у конкурента.
- →Собственный сайт. Уведомление, если что-то «сломалось» — пропал текст или изменился заголовок.
Есть облачная версия, но на VPS инструмент работает бесплатно и без ограничений на количество отслеживаний.
Что понадобится
- ✓VPS с Ubuntu 22.04, минимум 512 МБ RAM (базовый режим без браузера)
- ✓Docker и Docker Compose — инструкция ниже если не установлены
- ✓Для JS-сайтов (Wildberries, Ozon и т.п.) — 1 ГБ RAM и режим с браузером
- ✓Telegram-бот для уведомлений (создаётся за 2 минуты)
Шаг 1. Устанавливаем Docker
Если Docker уже установлен — пропустите этот шаг.
# Устанавливаем Docker одной командой
curl -fsSL https://get.docker.com | sh
# Добавляем текущего пользователя в группу docker
# (чтобы не писать sudo перед каждой командой)
sudo usermod -aG docker $USER
# Применяем изменения группы
newgrp dockerПроверяем что всё работает: docker run hello-world — должны увидеть «Hello from Docker!».
Шаг 2. Запускаем changedetection.io
Создаём рабочую директорию и файл конфигурации:
mkdir -p ~/changedetection && cd ~/changedetectionСоздаём файл docker-compose.yml:
services:
changedetection:
image: ghcr.io/dgtlmoon/changedetection.io
container_name: changedetection
volumes:
- changedetection-data:/datastore
environment:
- BASE_URL=https://cd.example.com
- TZ=Europe/Moscow
ports:
- 127.0.0.1:5000:5000
restart: unless-stopped
volumes:
changedetection-data:BASE_URL — адрес, который добавится в уведомления в Telegram. Укажите домен вашего сервера или оставьте пустым если домена нет. TZ=Europe/Moscow — часовой пояс для расписания проверок.
Запускаем:
docker compose up -dЧерез несколько секунд веб-интерфейс доступен на http://ВАШ_IP:5000 (порт нужно открыть в UFW: sudo ufw allow 5000/tcp).
Шаг 3. Nginx + SSL (опционально)
Если хотите открывать интерфейс по красивому домену с HTTPS — настройте Nginx. Если доступ нужен только с вашего компьютера по SSH-туннелю, этот шаг можно пропустить.
Устанавливаем Nginx и certbot:
sudo apt install nginx certbot python3-certbot-nginx -yСоздаём конфиг /etc/nginx/sites-available/changedetection:
server {
listen 80;
server_name cd.example.com;
location / {
proxy_pass http://127.0.0.1:5000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
}sudo ln -s /etc/nginx/sites-available/changedetection /etc/nginx/sites-enabled/
sudo nginx -t && sudo systemctl reload nginx
sudo certbot --nginx -d cd.example.comПосле получения сертификата закройте порт 5000 из публичного доступа: sudo ufw delete allow 5000/tcp. Теперь сайт доступен только через Nginx на 443.
Шаг 4. Добавляем первое отслеживание
Открываем интерфейс в браузере. Интерфейс на английском, но он интуитивно понятен.
- 1
Вставляем URL в поле вверху страницы
Например,
https://www.dns-shop.ru/product/xxxx/— страница товара. Нажимаем «Watch». - 2
Настраиваем интервал проверки
По умолчанию — каждые 5 минут. Для магазинов разумно ставить 30–60 минут: меньше нагрузки и ниже риск бана.
- 3
Дождёмся первой проверки
Нажимаем кнопку «Check now» чтобы не ждать. Статус сменится с «Not yet checked» на время последней проверки.
Шаг 5. Фильтруем только нужный элемент (CSS-селектор)
По умолчанию инструмент следит за всей страницей. Это проблема: меняются счётчики, реклама, «сейчас смотрят 12 человек» — и вы получаете ложные срабатывания. Лучше указать конкретный элемент.
Нажимаем Edit у нужного отслеживания → вкладка Filters & Triggers → поле CSS/JSONPath/XPath/Regex Filter.
Как найти CSS-селектор:
- Открываем страницу в браузере (Chrome/Firefox)
- Правой кнопкой на нужный элемент (цену, заголовок, кнопку) → Inspect
- В панели разработчика правой кнопкой на строку → Copy → Copy selector
Примеры селекторов:
# Элемент по классу
.product-buy__price
# Элемент по нескольким классам
.product-card .price__current
# Элемент по ID
#product-price
# Кнопка «В наличии» / статус
.btn-buy__text
# Параграф внутри блока
.product-description > p:first-childСовет: после ввода селектора нажмите «Preview» — увидите именно тот текст, который будет отслеживаться. Убедитесь что в поле только цена или статус, а не весь блок страницы.
Шаг 6. Уведомления в Telegram
6.1. Создаём Telegram-бота
- Открываем Telegram, находим
@BotFather - Отправляем команду
/newbot - Вводим имя бота (например, «Мой мониторинг»)
- Вводим username бота (например, «my_watchbot») — должен заканчиваться на «bot»
- BotFather даёт токен вида:
123456789:AABBccDDeeFF...— сохраняем его
6.2. Получаем Chat ID
Отправьте любое сообщение своему новому боту, затем откройте в браузере (вставьте свой токен):
https://api.telegram.org/bot123456789:AABBccDDeeFF.../getUpdatesВ ответе найдите "chat":{"id": XXXXXXXXX} — это ваш Chat ID (число, может быть отрицательным если это группа).
6.3. Добавляем уведомление в changedetection.io
Переходим в Settings → Notifications. В поле Notification URL list добавляем:
tgram://123456789:AABBccDDeeFF.../987654321/Формат: tgram://ТОКЕН/CHAT_ID/
Нажимаем Send test notification — в Telegram должно прийти тестовое сообщение. Если пришло — нажимаем Save.
Важно: в шаблоне уведомления по умолчанию есть переменная {current_snapshot}. Она вставляет весь текст страницы — если страница большая, Telegram вернёт ошибку «message is too long». Замените шаблон на более компактный: Изменение на: {watch_url}
Текст до:
{diff_removed}
Текст после:
{diff_added}
Бонус: отслеживаем JS-сайты (Wildberries, Ozon)
Многие крупные магазины загружают цены и статус «в наличии» через JavaScript. Обычный HTTP-запрос получит пустую страницу — нужен полноценный браузер.
Добавляем в docker-compose.yml браузерный контейнер:
services:
changedetection:
image: ghcr.io/dgtlmoon/changedetection.io
container_name: changedetection
volumes:
- changedetection-data:/datastore
environment:
- BASE_URL=https://cd.example.com
- TZ=Europe/Moscow
- PLAYWRIGHT_DRIVER_URL=ws://sockpuppet:3000
ports:
- 127.0.0.1:5000:5000
depends_on:
- sockpuppet
restart: unless-stopped
sockpuppet:
image: dgtlmoon/sockpuppetbrowser:latest
container_name: sockpuppet
cap_add:
- SYS_ADMIN
restart: unless-stopped
environment:
- SCREEN_WIDTH=1920
- SCREEN_HEIGHT=1024
- SCREEN_DEPTH=16
- MAX_CONCURRENT_CHROME_PROCESSES=5
volumes:
changedetection-data:Перезапускаем:
docker compose up -dТеперь при редактировании конкретного отслеживания (Edit → вкладка Fetching) выбираем Playwright Chromium вместо «Requests». Инструмент запустит браузер, дождётся рендеринга JS и снимет нужный контент.
Требования к RAM: каждая вкладка браузера потребляет ~100–200 МБ. SockPuppetBrowser при простое занимает ~200 МБ, при активном использовании может вырасти до 1–2 ГБ. Для нескольких JS-отслеживаний рекомендуется VPS с 2 ГБ RAM.
Полезные настройки
Установить пароль на интерфейс
Если интерфейс доступен публично — защитите его. Переходим в Settings → Access and API → Enable shared login password.
Расписание проверок
В Edit → Request → Time between checks можно задать конкретное расписание: например, проверять только в рабочие дни с 9 до 21. Удобно для мониторинга интернет-магазинов — ночью цены обычно не меняются.
Условие срабатывания
Во вкладке Filters & Triggers → Trigger/ignore textможно указать, когда присылать уведомление:
- — Уведомить только если в тексте появилось слово
В наличии - — Не уведомлять если текст содержит
Нет в наличии
Массовый импорт URL
Settings → Import / Export → вставьте список URL по одному на строку. Все страницы добавятся сразу с настройками по умолчанию.
Частые проблемы
Уведомления не приходят — ошибка «message is too long»
В шаблоне уведомления уберите переменную {current_snapshot}. Она вставляет весь текст страницы, а Telegram ограничивает сообщения 4096 символами. Используйте только {diff_added} и {diff_removed}.
Постоянно приходят ложные срабатывания
Страница меняется из-за счётчиков, времени, рекламы — а не из-за нужного контента. Решение: укажите CSS-селектор конкретного элемента во вкладке Filters & Triggers. Если селектор уже указан, проверьте в Preview — он захватывает только нужный блок.
Страница проверяется, но контент пустой или не тот
Сайт использует JavaScript для загрузки данных. В Edit → вкладка Fetching выберите Playwright Chromium. Для этого нужен добавленный контейнер SockPuppetBrowser (инструкция выше). Без него опция Playwright в меню не появится.
Итог
Changedetection.io — один из тех инструментов, которые вы поставите один раз и будете пользоваться годами. 5 минут на установку, потом просто добавляете URL и получаете алерты.
- ✓Работает на 512 МБ RAM в базовом режиме
- ✓Неограниченное количество отслеживаний — бесплатно
- ✓CSS/XPath-фильтры убирают ложные срабатывания
- ✓JS-сайты через SockPuppetBrowser
- ✓Уведомления в Telegram за 2 минуты