bolt Valebyte VPS от $4/мес — NVMe, запуск за 60 секунд.

Получить VPS arrow_forward
eco Начальный Туториал

Установка ChangeDetection.io на VPS: мониторинг изменений сайтов, Telegram-уведомления и Docker-бэкапы

calendar_month Oct 23, 2026 schedule 21 мин. чтения visibility 13 просмотров
Установка ChangeDetection.io на VPS: мониторинг изменений сайтов, Telegram-уведомления и Docker-бэкапы
info

Нужен сервер для этого гайда? Мы предлагаем выделенные серверы и VPS в 50+ странах с мгновенной настройкой.

Нужен сервер для этого гайда?

Разверните VPS или выделенный сервер за минуты.

Установка ChangeDetection.io на VPS: мониторинг изменений сайтов, Telegram-уведомления и Docker-бэкапы

TL;DR

ChangeDetection.io — self-hosted сервис для мониторинга изменений на сайтах: цен, наличия товара, вакансий, текста документов, статусов страниц и любых других веб-страниц. В этом руководстве вы развернёте его на VPS через Docker Compose, защитите HTTPS с помощью Caddy, настроите Telegram-уведомления и автоматические резервные копии данных.

  • Для небольшого числа проверок достаточно VPS с 1 vCPU, 2 ГБ RAM и 25 ГБ SSD.
  • ChangeDetection.io хранит настройки, историю изменений и снимки страниц в Docker volume.
  • Для внешнего доступа используется Caddy с автоматическими TLS-сертификатами Let's Encrypt.
  • Telegram-уведомления настраиваются через BotFather и встроенную систему уведомлений ChangeDetection.io.
  • Бэкапы выполняются скриптом через Restic в S3-совместимое хранилище или на отдельный сервер.
  • Для тяжёлых JavaScript-сайтов можно подключить отдельный браузерный контейнер Playwright.

Что мы настраиваем и зачем

Схема: Что мы настраиваем и зачем
Схема: Что мы настраиваем и зачем

ChangeDetection.io — открытое веб-приложение для отслеживания изменений на сайтах. Оно регулярно загружает указанные URL-адреса, сравнивает новую версию страницы с предыдущей и отправляет уведомление, если содержимое изменилось. В отличие от простого HTTP-мониторинга, сервис умеет проверять именно текст, HTML, отдельный CSS-селектор, JSON-ответ API и визуальное содержимое страниц.

Практические сценарии использования обычно выглядят так:

  • отслеживание цены товара, авиабилета, билетов на мероприятие или курса валют;
  • контроль появления товара в наличии;
  • мониторинг новых вакансий на странице компании;
  • отслеживание изменений в публичных офертах, правилах, тарифах и документации;
  • контроль изменений на сайте конкурента;
  • проверка публичных тендеров, закупок, реестров и государственных порталов;
  • мониторинг статуса облачного сервиса, CDN, API или страницы статуса;
  • получение уведомления о выходе обновления программного продукта.

После настройки у вас будет собственный экземпляр ChangeDetection.io, доступный по HTTPS-домену. В нём можно создавать проверки через веб-интерфейс, выбирать интервал запуска, настраивать фильтры текста и получать сообщения в Telegram. Данные мониторинга останутся под вашим контролем: история, URL, снимки страниц и токены уведомлений не передаются в сторонний SaaS-сервис.

Как работает проверка изменений

Для каждой наблюдаемой страницы ChangeDetection.io сохраняет предыдущий результат. При следующей проверке сервис загружает страницу снова, нормализует содержимое и вычисляет разницу. Если различия соответствуют заданным правилам, создаётся событие изменения. Для него можно открыть diff в браузере, увидеть добавленный и удалённый текст, а затем получить уведомление через Telegram, e-mail, Discord, Slack, Matrix, webhook или другие каналы, поддерживаемые Apprise.

Для простых HTML-страниц используется обычный HTTP-запрос. Этого достаточно для каталогов, документации, страниц товаров и большинства сайтов без сложной клиентской отрисовки. Если контент появляется только после выполнения JavaScript, потребуется браузерный движок Playwright. Его стоит подключать только при необходимости: полноценный браузер потребляет заметно больше памяти и CPU, чем обычная HTTP-проверка.

Cloud-managed сервисы и self-hosted вариант

Критерий Облачный сервис ChangeDetection.io на VPS
Старт работы Не требует администрирования Нужно развернуть Docker и настроить сервер
Контроль данных URL и история изменений хранятся у сервиса Данные находятся на вашем сервере
Лимиты проверок Обычно зависят от тарифа Ограничены ресурсами VPS и политикой сайтов
Уведомления Доступны в рамках тарифа Telegram, webhook и другие интеграции без подписки на SaaS
Обслуживание Выполняет провайдер сервиса Обновления, бэкапы и безопасность выполняете вы
Гибкость Ограничена интерфейсом платформы Можно менять reverse proxy, сеть, хранилище и автоматизацию

Self-hosted установка особенно полезна, если нужно мониторить десятки или сотни страниц, не хочется передавать третьей стороне список отслеживаемых ресурсов либо требуется интеграция с внутренними системами. Однако VPS не отменяет ответственность: необходимо обновлять ОС, закрывать лишние порты, делать резервные копии и не создавать чрезмерную нагрузку на чужие сайты.

Не устанавливайте слишком короткий интервал опроса без необходимости. Проверка публичной страницы каждые 5–15 минут обычно достаточна. Частые запросы могут привести к CAPTCHA, блокировке IP или нарушению правил конкретного сайта.

Какой VPS-конфиг нужен под эту задачу

Схема: Какой VPS-конфиг нужен под эту задачу
Схема: Какой VPS-конфиг нужен под эту задачу

Нагрузка ChangeDetection.io зависит не столько от числа сохранённых URL, сколько от частоты проверок и типа страниц. Сто простых HTML-страниц, проверяемых раз в час, почти не нагружают сервер. Десятки страниц с JavaScript, авторизацией или антибот-защитой могут потребовать больше CPU и памяти, особенно если одновременно запускается браузерный рендеринг.

Сценарий CPU RAM Диск Подходящий интервал
До 30 простых HTML-страниц 1 vCPU 1–2 ГБ 25 ГБ SSD 30–120 минут
50–200 смешанных страниц 2 vCPU 4 ГБ 50–80 ГБ NVMe 10–60 минут
JavaScript, Playwright, 200+ проверок 4 vCPU 8 ГБ 100 ГБ NVMe 5–30 минут
Тысячи URL и несколько браузерных воркеров 8+ vCPU 16+ ГБ 200+ ГБ NVMe По профилю нагрузки

Для личного мониторинга, команды из нескольких человек или 50–100 несложных страниц рациональный старт — 2 vCPU, 4 ГБ RAM, 50 ГБ NVMe и IPv4-адрес. Например, можно взять VPS с указанными характеристиками, установить Ubuntu Server 24.04 LTS и развернуть весь стек в Docker Compose.

Почему важен запас по диску

Сервис сохраняет историю изменений и снимки проверяемых страниц. Одна текстовая страница занимает немного места, но крупные HTML-документы, изображения, длинная история diff и большое количество URL постепенно увеличивают volume. Не заполняйте диск до предела: Docker и база данных нуждаются в свободном пространстве для временных файлов, журналов и корректной записи данных.

Полезное правило — держать минимум 20–30% свободного пространства. Раз в месяц проверяйте размер Docker volume и удаляйте неиспользуемые Docker-образы. Не выполняйте агрессивную очистку volumes: именно в них находятся пользовательские данные приложения.

Когда нужен dedicated, а не VPS

Обычный VPS подходит почти для всех личных и небольших коммерческих инсталляций. Dedicated-сервер оправдан, если вы запускаете много браузерных воркеров, постоянно обрабатываете тысячи JavaScript-страниц, нуждаетесь в гарантированном CPU без влияния соседей или храните большую историю снимков. Он также может быть полезен, когда ChangeDetection.io становится частью внутренней платформы мониторинга с несколькими операторами и отдельными прокси.

Не переходите на dedicated только из-за нескольких медленных страниц. Сначала увеличьте RAM до 4–8 ГБ, уменьшите параллелизм, удлините интервалы проверок и проверьте, действительно ли всем URL нужен браузерный рендеринг.

Как выбрать локацию

Локация влияет на задержку, географическую версию сайта и вероятность антибот-проверок. Если вы следите за российскими, европейскими или американскими сайтами, выбирайте сервер ближе к их основной аудитории. Некоторые магазины и сервисы показывают разные цены, валюты, наличие и контент в зависимости от IP-адреса. В таком случае сервер должен находиться в стране или регионе, для которого вы хотите получать данные.

Для панели управления локация менее критична: интерфейс лёгкий и работает по HTTPS. Важнее стабильность сети, доступный IPv4, достаточный трафик и возможность настроить DNS-запись для домена.

Подготовка сервера

Схема: Подготовка сервера
Схема: Подготовка сервера

Ниже используется Ubuntu Server 24.04 LTS. На момент подготовки руководства это стабильный LTS-релиз, подходящий для Docker-хостов. Команды также близки для Debian 12, но названия некоторых пакетов и настройки firewall могут отличаться.

Предполагается, что у сервера уже есть публичный IPv4-адрес, а в панели DNS создана A-запись, например changes.example.com, указывающая на этот адрес. Без корректной DNS-записи Caddy не сможет автоматически выпустить сертификат Let's Encrypt.

Первый вход и обновление системы

Подключитесь под пользователем root только для начальной настройки. Сразу обновите систему, создайте обычного пользователя и перенесите в него SSH-ключ. В дальнейшем не работайте в панели ChangeDetection.io и Docker от имени root без причины.

ssh root@SERVER_IP

apt update && apt upgrade -y
apt install -y ca-certificates curl gnupg ufw fail2ban vim jq unzip
reboot

После перезагрузки подключитесь снова и создайте пользователя. В примере используется имя deploy; замените его на своё.

adduser deploy
usermod -aG sudo deploy
mkdir -p /home/deploy/.ssh
chmod 700 /home/deploy/.ssh

Скопируйте ваш публичный ключ с локального компьютера. Команда выполняется на локальной машине, а не на сервере.

ssh-copy-id deploy@SERVER_IP

Проверьте вход в новой сессии до отключения root-доступа.

ssh deploy@SERVER_IP
sudo whoami

Ожидаемый результат последней команды — root. Это означает, что пользователь может выполнять административные действия через sudo.

Защита SSH

Откройте отдельную SSH-сессию и не закрывайте старую, пока не убедитесь, что вход по ключу работает. Затем создайте отдельный конфигурационный файл SSH. Такой подход безопаснее, чем редактирование основного файла пакета.

sudo tee /etc/ssh/sshd_config.d/99-hardening.conf > /dev/null <<'EOF'
PermitRootLogin no
PasswordAuthentication no
KbdInteractiveAuthentication no
PubkeyAuthentication yes
X11Forwarding no
MaxAuthTries 3
EOF

sudo sshd -t
sudo systemctl restart ssh

Команда sshd -t проверяет синтаксис до перезапуска службы. Если тест завершился без ошибок, конфигурация корректна. Теперь root-вход и аутентификация по паролю отключены, а подключение возможно только по SSH-ключу.

Firewall и Fail2ban

ChangeDetection.io не должен напрямую слушать публичный порт. Снаружи будут доступны только SSH, HTTP для выпуска TLS-сертификата и HTTPS для панели. Docker-порт приложения останется доступным только на 127.0.0.1.

sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw allow OpenSSH
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw enable
sudo ufw status verbose

Проверьте, что в выводе разрешены только порты 22, 80 и 443. Если SSH работает на нестандартном порту, сначала разрешите именно его, иначе можно потерять доступ к серверу.

Fail2ban блокирует IP-адреса после серии неудачных попыток входа. Для Ubuntu достаточно включить сервис и добавить простую локальную конфигурацию.

sudo tee /etc/fail2ban/jail.d/sshd.local > /dev/null <<'EOF'
[sshd]
enabled = true
maxretry = 5
findtime = 10m
bantime = 1h
EOF

sudo systemctl enable --now fail2ban
sudo fail2ban-client status sshd

Базовые проверки хоста

До установки Docker убедитесь, что время синхронизировано, на диске достаточно свободного места, а DNS-домен уже указывает на сервер. Неверное время вызывает проблемы с TLS-сертификатами и журналами.

timedatectl status
df -h /
free -h
getent hosts changes.example.com

Замените changes.example.com на свой домен. В результате последней команды должен отображаться публичный IP вашего VPS.

Установка ПО — пошагово

Схема: Установка ПО — пошагово
Схема: Установка ПО — пошагово

Для изолированного запуска используется Docker Engine 28.x и Docker Compose Plugin v2. Docker позволяет обновлять приложение одной командой, не смешивать зависимости с ОС и удобно сохранять данные в отдельном volume. Образы приложения будут загружаться из GitHub Container Registry.

Установка Docker Engine из официального репозитория

Удалите старые пакеты Docker, если они были установлены из стандартного репозитория Ubuntu. Команда безопасна на новом сервере.

sudo apt remove -y docker.io docker-compose docker-compose-v2 podman-docker containerd runc || true

Добавьте ключ и репозиторий Docker. Используется официальный репозиторий Docker для Ubuntu 24.04.

sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg
echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
  $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

sudo apt update

Установите Docker Engine, Buildx и Compose Plugin. В 2026 году Compose рекомендуется использовать как подкоманду docker compose, а не старую отдельную утилиту docker-compose.

sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
sudo systemctl enable --now docker
sudo docker version
sudo docker compose version

Разрешите пользователю deploy работать с Docker без постоянного sudo. После этого необходимо перелогиниться.

sudo usermod -aG docker deploy
exit

Подключитесь заново и проверьте доступ.

ssh deploy@SERVER_IP
docker run --rm hello-world

Создание структуры каталогов

Не храните файлы проекта в домашней директории root. Создадим каталог /opt/changedetection, доступный пользователю deploy. В нём будут Compose-конфигурация, переменные окружения, Caddyfile и локальный каталог резервных копий.

sudo mkdir -p /opt/changedetection/{caddy,data,backups,scripts}
sudo chown -R deploy:deploy /opt/changedetection
cd /opt/changedetection
pwd

Создание файла переменных окружения

Файл .env не должен попадать в публичный Git-репозиторий. Здесь задаются домен, часовой пояс и базовый URL. Секреты Telegram в этот файл добавлять не обязательно: их можно сохранить в интерфейсе приложения, а токены будут находиться в его данных. Если вы всё же автоматизируете конфигурацию, храните токены только в закрытом файле с правами 600.

cd /opt/changedetection

cat > .env <<'EOF'
CD_DOMAIN=changes.example.com
TZ=Europe/Moscow
BASE_URL=https://changes.example.com
EOF

chmod 600 .env

Измените домен и часовой пояс на свои значения. Список часовых поясов можно посмотреть командой timedatectl list-timezones.

Создание Docker Compose-конфигурации

Основной контейнер ChangeDetection.io будет слушать только локальный адрес 127.0.0.1:5000. Caddy получит доступ к нему через внутреннюю Docker-сеть. Такое ограничение исключает обход HTTPS-прокси через прямой доступ к порту 5000 снаружи.

cat > docker-compose.yml <<'EOF'
services:
  changedetection:
    image: ghcr.io/dgtlmoon/changedetection.io:latest
    container_name: changedetection
    restart: unless-stopped
    environment:
      - TZ=${TZ}
      - BASE_URL=${BASE_URL}
      - USE_X_SETTINGS=1
    volumes:
      - ./data:/datastore
    expose:
      - "5000"
    networks:
      - monitor_net

  caddy:
    image: caddy:2.10-alpine
    container_name: changedetection-caddy
    restart: unless-stopped
    env_file:
      - .env
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./caddy/Caddyfile:/etc/caddy/Caddyfile:ro
      - ./caddy/data:/data
      - ./caddy/config:/config
    networks:
      - monitor_net

networks:
  monitor_net:
    driver: bridge
EOF

Тег latest удобен для первого запуска, но для критичной инсталляции лучше после успешного тестирования закреплять конкретный релиз или digest образа. Это делает обновления воспроизводимыми и снижает риск неожиданного изменения поведения при следующем pull.

Первый запуск контейнеров

На этом этапе Caddyfile ещё не создан, поэтому сначала подготовьте его в следующем разделе. После создания файлов выполните запуск. Docker скачает образы, создаст сеть и volume-каталоги.

cd /opt/changedetection
docker compose config
docker compose pull
docker compose up -d
docker compose ps

Команда docker compose config проверяет синтаксис и подстановку переменных. В docker compose ps оба контейнера должны иметь состояние running.

Конфигурация

Схема: Конфигурация
Схема: Конфигурация

Настройка HTTPS через Caddy

Caddy автоматически получает и продлевает TLS-сертификаты Let's Encrypt. Для этого домен должен быть доступен из интернета по портам 80 и 443. В Caddyfile не нужно вручную указывать пути к сертификатам.

cd /opt/changedetection

cat > caddy/Caddyfile <<'EOF'
{
    email [email protected]
}

{$CD_DOMAIN} {
    encode zstd gzip

    reverse_proxy changedetection:5000 {
        header_up Host {host}
        header_up X-Real-IP {remote_host}
        header_up X-Forwarded-For {remote_host}
        header_up X-Forwarded-Proto {scheme}
    }

    log {
        output stdout
        format json
    }
}
EOF

Замените [email protected] на рабочий адрес для уведомлений о проблемах с сертификатом. Затем перезапустите стек.

cd /opt/changedetection
docker compose up -d
docker compose logs -f caddy

В логах Caddy найдите сообщение об успешном получении сертификата. Для выхода из просмотра логов нажмите Ctrl+C; контейнер продолжит работать. После этого откройте https://changes.example.com в браузере.

Проверка работоспособности

Проверьте ответ сервера с самого VPS и с локального компьютера. Проверка по домену должна вернуть HTTP-код 200 либо редирект на страницу приложения.

curl -I http://127.0.0.1:5000
curl -I https://changes.example.com
docker compose ps
docker compose logs --tail=100 changedetection

Если первая команда не работает, проблема внутри контейнера ChangeDetection.io. Если локальная проверка успешна, но домен не открывается, проверьте DNS, firewall, порты 80/443 и логи Caddy.

Первичная настройка в веб-интерфейсе

Откройте домен в браузере. В текущей версии ChangeDetection.io вы увидите форму добавления нового URL. Для первого теста используйте стабильную публичную страницу, например страницу документации проекта или страницу со статусом сервиса. Не начинайте тестирование с сайта, который активно использует CAPTCHA и антибот-защиту.

  1. Нажмите добавление новой проверки.
  2. Укажите URL страницы.
  3. Выберите интервал проверки: для теста достаточно 30–60 минут.
  4. Сохраните наблюдение.
  5. Запустите ручную проверку кнопкой проверки.
  6. Откройте историю и убедитесь, что создан первый снимок.

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

Фильтрация по CSS-селектору и тексту

Мониторинг всей страницы часто создаёт лишние уведомления: меняются баннеры, дата публикации, счётчики, реклама и блоки рекомендаций. Лучше извлекать только значимую часть страницы. Для этого используйте CSS-селектор в настройках наблюдения.

Например, для цены товара селектор может быть похож на .product-price, [data-testid="price"] или span.price. Найти его можно через инструменты разработчика браузера: откройте страницу, нажмите F12, выберите нужный элемент и посмотрите его классы, атрибуты и структуру HTML.

После добавления селектора вручную запустите проверку. Если в истории отображается только ожидаемый фрагмент, настройка работает. Если результат пустой, селектор неверен либо нужный элемент создаётся JavaScript-кодом после загрузки страницы.

Подключение JavaScript-браузера при необходимости

Не все сайты отдают конечный контент обычным HTTP-запросом. Интернет-магазины, SPA-интерфейсы и современные личные кабинеты часто отрисовывают данные в браузере. Для таких URL подключите отдельный контейнер браузера на базе Playwright. Делайте это только после проверки: браузерный рендеринг заметно тяжелее.

Добавьте в docker-compose.yml сервис браузера и переменную PLAYWRIGHT_DRIVER_URL в сервис changedetection. Конкретный поддерживаемый образ следует сверить с актуальной документацией ChangeDetection.io перед обновлением, поскольку совместимость браузерного драйвера зависит от версии приложения.

  changedetection:
    environment:
      - TZ=${TZ}
      - BASE_URL=${BASE_URL}
      - USE_X_SETTINGS=1
      - PLAYWRIGHT_DRIVER_URL=ws://playwright:3000

  playwright:
    image: browserless/chromium:latest
    container_name: changedetection-playwright
    restart: unless-stopped
    environment:
      - TOKEN=change-this-browser-token
      - MAX_CONCURRENT_SESSIONS=2
      - CONNECTION_TIMEOUT=60000
    networks:
      - monitor_net

Для production-конфигурации не оставляйте latest и демонстрационный токен. Закрепите проверенную версию образа, задайте случайный токен через .env и ограничьте число одновременных сессий согласно RAM сервера. На VPS с 2 ГБ памяти начните с одного браузерного воркера.

Настройка Telegram-уведомлений

Telegram — удобный канал для немедленных уведомлений. Создайте бота через официальный аккаунт @BotFather. Отправьте команду /newbot, задайте имя, username и сохраните выданный API-токен. Этот токен даёт доступ к отправке сообщений от имени бота, поэтому не публикуйте его в скриншотах, Git-репозиториях и shell history.

Затем откройте личный диалог с созданным ботом и отправьте ему команду /start. Для группы добавьте бота в группу, отправьте сообщение и при необходимости выдайте права на публикацию. Чтобы узнать chat_id, можно временно открыть URL Telegram API после отправки сообщения боту:

curl "https://api.telegram.org/botВАШ_ТОКЕН/getUpdates"

В JSON-ответе найдите поле chat, затем значение id. Для групповых чатов ID часто начинается с минуса. После получения ID удалите команду из истории терминала или используйте временную shell-переменную, чтобы токен не сохранялся в history.

export TG_TOKEN='ВАШ_ТОКЕН'
curl "https://api.telegram.org/bot${TG_TOKEN}/getUpdates"
unset TG_TOKEN

В ChangeDetection.io откройте настройки уведомлений. В поле URL уведомления добавьте Apprise-адрес Telegram в формате:

tgram://BOT_TOKEN/CHAT_ID

Подставьте токен и ID чата. Если интерфейс предлагает кнопку тестовой отправки, используйте её до привязки уведомления к десяткам страниц. В нормальном случае бот сразу пришлёт тестовое сообщение. Для отдельных наблюдений можно переопределять глобальные уведомления и направлять разные категории сайтов в разные Telegram-группы.

Базовая защита веб-интерфейса

ChangeDetection.io содержит список отслеживаемых сайтов и историю изменений, поэтому не оставляйте интерфейс открытым для всего интернета, если он не нужен публично. Минимальный вариант — использовать встроенную аутентификацию приложения, если она доступна в текущем релизе. Альтернативно добавьте Basic Auth на уровне Caddy.

docker run --rm caddy:2.10-alpine caddy hash-password --plaintext 'СЛОЖНЫЙ_ПАРОЛЬ'

Скопируйте полученный хеш и добавьте его в блок сайта Caddyfile перед reverse_proxy.

basic_auth {
    monitor $2a$14$REPLACE_WITH_GENERATED_BCRYPT_HASH
}

После изменения Caddyfile примените конфигурацию перезапуском контейнера.

cd /opt/changedetection
docker compose restart caddy
docker compose logs --tail=50 caddy

Basic Auth создаёт дополнительный барьер до входа в приложение. Используйте длинный уникальный пароль и не передавайте его в URL. При необходимости ограничьте доступ по IP через firewall или VPN, особенно если это внутренний рабочий инструмент.

Бэкапы и обслуживание

Схема: Бэкапы и обслуживание
Схема: Бэкапы и обслуживание

Контейнеры Docker можно пересоздать в любой момент, но данные ChangeDetection.io нельзя восстановить без резервной копии. В текущей схеме критичный каталог — /opt/changedetection/data. В нём находятся база данных, настройки наблюдений, история проверок, скриншоты и другие данные приложения. Также нужно сохранять docker-compose.yml, .env, Caddyfile и каталог Caddy с сертификатами.

Что включать в резервную копию

Путь Что хранится Критичность
/opt/changedetection/data База, URL, настройки, история, снимки Критично
/opt/changedetection/docker-compose.yml Описание сервисов Критично
/opt/changedetection/.env Домен, часовой пояс, секреты при наличии Критично
/opt/changedetection/caddy/Caddyfile Reverse proxy и защита панели Важно
/opt/changedetection/caddy/data TLS-сертификаты и состояние Caddy Желательно

Не считайте копирование на тот же диск резервной копией. Если VPS удалён, файловая система повреждена или аккаунт заблокирован, локальный архив не поможет. Храните резервные копии минимум в одном внешнем месте: S3-совместимом бакете, отдельном сервере через SFTP/SSH или специализированном backup-хранилище.

Установка Restic

Restic создаёт зашифрованные дедуплицированные резервные копии. Он хорошо подходит для небольших серверов: передаются только новые блоки данных, а доступ к хранилищу защищается паролем репозитория. Ниже показан вариант для S3-совместимого хранилища.

sudo apt update
sudo apt install -y restic
restic version

Создайте закрытый файл с параметрами. В примере используются переменные для S3. Подставьте endpoint, имя бакета, ключи и длинный уникальный пароль. Не используйте пароль от SSH или панели хостинга.

sudo tee /etc/changedetection-backup.env > /dev/null <<'EOF'
export RESTIC_REPOSITORY="s3:https://s3.example.com/changedetection-backups"
export AWS_ACCESS_KEY_ID="S3_ACCESS_KEY"
export AWS_SECRET_ACCESS_KEY="S3_SECRET_KEY"
export RESTIC_PASSWORD="LONG_UNIQUE_RESTIC_PASSWORD"
EOF

sudo chmod 600 /etc/changedetection-backup.env
sudo chown root:root /etc/changedetection-backup.env

Инициализируйте репозиторий. Эту операцию выполняют один раз.

sudo bash -c 'source /etc/changedetection-backup.env && restic init'

Скрипт автоматического бэкапа

Для согласованности лучше на короткое время остановить контейнер приложения перед копированием его базы, затем запустить снова. При небольшом объёме данных остановка обычно занимает секунды. Caddy продолжит отвечать, но приложение в этот момент будет временно недоступно.

sudo tee /opt/changedetection/scripts/backup.sh > /dev/null <<'EOF'
#!/usr/bin/env bash
set -euo pipefail

PROJECT_DIR="/opt/changedetection"
LOG_FILE="/var/log/changedetection-backup.log"

source /etc/changedetection-backup.env

echo "[$(date -Is)] Backup started" >> "$LOG_FILE"

cd "$PROJECT_DIR"

docker compose stop changedetection

trap 'docker compose start changedetection' EXIT

restic backup \
  "$PROJECT_DIR/data" \
  "$PROJECT_DIR/docker-compose.yml" \
  "$PROJECT_DIR/.env" \
  "$PROJECT_DIR/caddy/Caddyfile" \
  "$PROJECT_DIR/caddy/data" \
  --tag changedetection \
  --tag "$(hostname)"

restic forget \
  --keep-daily 7 \
  --keep-weekly 4 \
  --keep-monthly 6 \
  --prune

echo "[$(date -Is)] Backup completed" >> "$LOG_FILE"
EOF

sudo chmod 700 /opt/changedetection/scripts/backup.sh
sudo chown root:root /opt/changedetection/scripts/backup.sh

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

Запустите резервное копирование вручную и убедитесь, что контейнер снова работает.

sudo /opt/changedetection/scripts/backup.sh
sudo bash -c 'source /etc/changedetection-backup.env && restic snapshots'
cd /opt/changedetection && docker compose ps

Планировщик cron

Запускайте бэкап ночью, например ежедневно в 03:20. Откройте crontab пользователя root.

sudo crontab -e

Добавьте строку:

20 3   * /opt/changedetection/scripts/backup.sh

Проверьте логи после первой ночи. Cron обычно работает с минимальным окружением, поэтому скрипт явно загружает файл с переменными S3.

sudo tail -n 100 /var/log/changedetection-backup.log
sudo grep CRON /var/log/syslog | tail -n 20

Проверка восстановления

Бэкап без теста восстановления — только предположение. Раз в несколько месяцев восстановите копию в отдельный временный каталог или на тестовый VPS. Не восстанавливайте поверх production-данных до проверки.

sudo mkdir -p /tmp/changedetection-restore-test
sudo bash -c 'source /etc/changedetection-backup.env && restic restore latest --target /tmp/changedetection-restore-test'
sudo find /tmp/changedetection-restore-test -maxdepth 3 -type f | head

После проверки удалите временный каталог. Для полного аварийного восстановления установите Docker на новый сервер, скопируйте Compose-файлы, восстановите каталог в /opt/changedetection, настройте DNS и выполните docker compose up -d.

Обновление ChangeDetection.io и Docker-образов

Для одного экземпляра ChangeDetection.io обычно подходит короткое окно обслуживания. Перед обновлением выполните бэкап, изучите release notes проекта и только затем скачивайте новый образ. Не обновляйте приложение автоматически в момент, когда вы не можете проверить результат.

cd /opt/changedetection
sudo /opt/changedetection/scripts/backup.sh
docker compose pull
docker compose up -d
docker image prune -f
docker compose ps
docker compose logs --tail=100 changedetection

При одной реплике нельзя сделать полноценное rolling-обновление без краткого перерыва: контейнер пересоздаётся. Для домашнего и командного мониторинга это нормально. Высокодоступная схема потребует отдельной базы, общего хранилища, балансировщика и тестирования совместимости, что обычно избыточно для данной задачи.

ОС обновляйте регулярно, например раз в неделю или месяц. После обновления ядра перезагрузите сервер в запланированное окно.

sudo apt update
sudo apt upgrade -y
sudo reboot

Troubleshooting и FAQ

Почему домен открывается по HTTP, но HTTPS-сертификат не выпускается?

Сначала проверьте, что A-запись домена указывает на IP VPS: getent hosts ваш-домен. Затем убедитесь, что порты 80 и 443 разрешены в UFW и в сетевом firewall панели провайдера. Посмотрите docker compose logs caddy: там обычно указана точная причина, например неверный DNS, закрытый порт или слишком много попыток выпуска сертификата. Также убедитесь, что другой веб-сервер не занимает порты 80 и 443.

Контейнер ChangeDetection.io постоянно перезапускается. Что проверять?

Выполните docker compose logs --tail=200 changedetection и проверьте ошибки доступа к каталогу data, повреждённую базу или нехватку места. Команда df -h покажет заполнение диска, а free -h — доступную память. Если процесс был завершён ядром из-за нехватки RAM, в dmesg -T могут быть записи OOM. Увеличьте память VPS, отключите браузерный контейнер или уменьшите параллельные проверки.

Почему не приходят Telegram-уведомления?

Проверьте, что пользователь или группа сначала отправили боту сообщение либо команду /start: бот не может первым написать пользователю. Убедитесь в правильности токена и chat_id, особенно для групп, где ID часто отрицательный. Проверьте уведомление встроенной тестовой кнопкой в интерфейсе. Если тест не работает, повторно запросите getUpdates Telegram API и убедитесь, что в настройке указан корректный Apprise URL формата tgram://BOT_TOKEN/CHAT_ID.

Сайт показывает пустой результат или не видит цену, которая есть в браузере. Как исправить?

Сначала откройте сохранённый снимок в ChangeDetection.io. Если в нём нет нужного блока, вероятно, сайт генерирует контент JavaScript-кодом, требует cookie, геолокацию или блокирует серверный IP. Попробуйте настроить CSS-селектор для статичной части, изменить user-agent в настройках наблюдения или подключить Playwright-браузер. Не пытайтесь обходить CAPTCHA и защитные механизмы сайта без разрешения владельца ресурса.

Какой VPS-конфиг минимально подойдёт?

Минимум для 10–30 обычных HTML-проверок — 1 vCPU, 1–2 ГБ RAM и 25 ГБ SSD. Практичнее начинать с 2 vCPU, 4 ГБ RAM и 50 ГБ NVMe: будет запас для Docker, истории изменений, TLS-прокси и нескольких сложных страниц. Если включается Chromium или Playwright для JavaScript-рендеринга, 2 ГБ памяти часто недостаточно. Для браузерных проверок разумный минимум — 4 ГБ RAM.

Что выбрать — VPS или dedicated для этой задачи?

Для большинства установок выбирайте VPS. Он дешевле, быстрее масштабируется и без проблем обслуживает десятки или сотни обычных URL. Dedicated имеет смысл при тысячах частых проверок, множестве параллельных браузерных сессий, большом архиве снимков или требованиях к гарантированной производительности CPU. Перед переходом на выделенный сервер измерьте реальное потребление ресурсов через docker stats, а не ориентируйтесь только на количество URL.

После обновления исчезли настройки или история наблюдений. Почему?

Чаще всего причина в запуске контейнера без прежнего монтирования ./data:/datastore либо в запуске Compose из другого каталога. Проверьте путь в docker-compose.yml, текущий каталог проекта и наличие файлов в /opt/changedetection/data. Не удаляйте volumes или каталог данных при очистке Docker. Если данные действительно удалены, остановите приложение и восстановите последнюю резервную копию Restic в исходный путь.

Почему сервер получил блокировку или CAPTCHA от отслеживаемого сайта?

Вероятнее всего, запросы выполняются слишком часто, слишком параллельно или сайт запрещает автоматический доступ. Увеличьте интервал проверок, уменьшите число одновременных задач, отключите повторные быстрые попытки и ознакомьтесь с правилами ресурса. Используйте официальный API, RSS-ленту или e-mail-уведомления сайта, если они доступны. Мониторинг должен быть бережным: техническая возможность загрузить страницу не всегда означает разрешение на массовый сбор данных.

Выводы и следующие шаги

Схема: Выводы и следующие шаги
Схема: Выводы и следующие шаги

Теперь ChangeDetection.io работает на вашем VPS в Docker, доступен по HTTPS, отправляет изменения в Telegram и защищён внешними резервными копиями. Такая схема подходит для личного мониторинга, рабочих уведомлений и небольших внутренних сервисов.

  1. Добавьте первые 5–10 наблюдений и для каждого настройте точный CSS-селектор, чтобы убрать ложные изменения.
  2. Проверьте размер каталога data через месяц и скорректируйте объём диска либо срок хранения бэкапов.
  3. Если появляются JavaScript-сайты, отдельно протестируйте Playwright-контейнер и увеличьте RAM перед массовым включением браузерного рендеринга.

Был ли этот гайд полезен?

Ваш отзыв помогает нам улучшать гайды.

Поделиться записью:

Отправьте гайд тому, кому он может пригодиться.

Telegram VKVK WhatsApp Facebook LinkedIn XX

установка changedetection.io на vps: мониторинг изменений сайтов, telegram-уведомления и docker-бэкапы
support_agent
Valebyte Support
Usually replies within minutes
Hi there!
Send us a message and we'll reply as soon as possible.