← Blog

Self-host do changedetection.io pra observar páginas web

Railyard

28 de julho de 2026 · 8 min de leitura

Siga isso no seu próprio servidor. Comece grátis, sem cartão

A maioria das páginas web que vale a pena observar não têm um feed, uma API, ou qualquer jeito de perguntar “isso mudou” além de carregar ela você mesmo e comparar. O changedetection.io observa qualquer página, ou um elemento específico dela que você escolhe visualmente, e te avisa quando ela muda: uma queda de preço, algo de volta ao estoque, uma página de aviso governamental sendo atualizada, a página de preços de um concorrente se movendo. A alternativa é pagar por uma ferramenta SaaS de monitoramento de mudança ou escrever o próprio script de scraper e cron que quebra na primeira vez que a estrutura da página mudar. No final deste guia você vai ter a sua própria instância do changedetection.io rodando num servidor de US$6/mês, acessível via HTTPS no seu próprio domínio, com o histórico dela salvo e um caminho de upgrade que não perde os seus watches.

O que você vai precisar

  • Um servidor. O Basic Droplet da DigitalOcean a US$6,00/mês te dá 1 vCPU, 1 GB de RAM e 25 GB SSD, mais do que suficiente pra essa aplicação de container único mais um proxy reverso. Qualquer VPS Ubuntu 24.04 de outro provedor funciona do mesmo jeito.
  • Um nome de domínio (ou um subdomínio de um que você já possui), com acesso às configurações de DNS dele.
  • Docker e o plugin Docker Compose instalados no servidor (coberto no Passo 2).
  • Um terminal e acesso SSH ao servidor.

Passo 1: crie o servidor e aponte um domínio pra ele

Suba um droplet Ubuntu 24.04 no plano Basic de US$6/mês da DigitalOcean (1 vCPU, 1 GB de RAM, 25 GB SSD). Anote o endereço IP público dele.

Nas configurações de DNS do seu domínio, adicione um registro A apontando um subdomínio, por exemplo watch.yourdomain.com, pra esse IP:

Type: A
Name: watch
Value: <your server's IP>
TTL: 300

A propagação de DNS pode levar de alguns minutos a algumas horas. Você deve ver dig watch.yourdomain.com +short retornar o IP do seu servidor antes de continuar, já que as próximas etapas dependem disso.

Passo 2: instale o Docker

Entre via SSH no servidor e instale o Docker Engine mais o plugin Compose:

curl -fsSL https://get.docker.com | sh
sudo usermod -aG docker $USER

Saia e entre de novo pra mudança de grupo entrar em vigor, depois cheque se as duas partes estão presentes:

docker --version
docker compose version

Você deve ver uma versão do Docker e uma versão do Compose impressas, sem erros de “command not found”.

Passo 3: organize o diretório do projeto

Crie um diretório pra stack:

mkdir -p ~/changedetection && cd ~/changedetection

Isso é genuinamente tudo em termos de secrets nessa etapa. O changedetection.io não exige uma conta, uma chave de API, ou uma senha de banco de dados pra começar a observar páginas. Se você quiser adicionar uma senha de login pra instância não ficar aberta pra qualquer um que encontrar a URL, isso é uma configuração dentro da própria aplicação, na página de Settings dela, depois que ela estiver rodando, não algo que você configura antecipadamente. Vale fazer se esse servidor é acessível por mais do que só você; pode pular se não for.

Passo 4: escreva o arquivo Docker Compose

O changedetection.io mantém tudo, a configuração dos watches, o histórico de página e os snapshots, no disco num volume único, então não existe um serviço de banco de dados separado pra rodar. Crie docker-compose.yml:

services:
  changedetection:
    image: dgtlmoon/changedetection.io:0.60.9
    container_name: changedetection
    hostname: changedetection
    restart: unless-stopped
    volumes:
      - changedetection-data:/datastore

  caddy:
    image: caddy:2
    restart: unless-stopped
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./Caddyfile:/etc/caddy/Caddyfile
      - caddy_data:/data
      - caddy_config:/config
    depends_on:
      - changedetection

volumes:
  changedetection-data:
  caddy_data:
  caddy_config:

Algumas escolhas valem explicar:

  • A imagem é fixada em 0.60.9 em vez de deixada flutuando em latest. Você decide quando mudar pra um release mais novo, coberto no Passo 7.
  • Só o Caddy publica portas pro host. O próprio changedetection.io não é exposto pra internet diretamente, ele é acessível só na rede interna do Docker, na porta padrão dele, 5000.

Antes de iniciar qualquer coisa, valide se o arquivo é interpretado:

docker compose -f docker-compose.yml config

Uma execução limpa imprime a configuração totalmente resolvida de volta sem erros.

Passo 5: escreva o Caddyfile e inicie tudo

O Caddy trata o certificado TLS do Let’s Encrypt automaticamente, desde que o DNS já esteja apontando pro servidor e as portas 80 e 443 estejam acessíveis da internet. Crie o Caddyfile no mesmo diretório:

watch.yourdomain.com {
	reverse_proxy changedetection:5000
}

Valide antes de iniciar:

docker run --rm -v $(pwd)/Caddyfile:/etc/caddy/Caddyfile caddy:2 caddy validate --config /etc/caddy/Caddyfile

Uma execução limpa reporta a configuração como válida. Depois inicie a stack:

docker compose up -d

Observe ela subir e cheque se o Caddy de fato obteve um certificado:

docker compose logs -f caddy

Você deve ver uma linha mencionando um certificado obtido pro seu domínio.

Passo 6: adicione o seu primeiro watch

Visite https://watch.yourdomain.com. Não existe etapa de criação de conta, nenhum formulário de inscrição: a primeira tela te deixa colar uma URL e adicionar ela como um watch diretamente. Adicione uma página que você de fato quer acompanhar, opcionalmente restrinja ela a um elemento com o seletor visual se a página tiver muito ruído em volta da parte que importa, e salve.

Se essa instância é acessível por qualquer outra pessoa além de você, vá em Settings dentro da aplicação e defina uma senha de login. É opcional, não obrigatório pra começar, mas vale fazer no momento em que a URL não é só sua.

Algumas configurações que vale conhecer desde o início, sem precisar tocar em nenhuma delas ainda: LOGGER_LEVEL controla o quanto os próprios logs do container são verbosos (TRACE, DEBUG, INFO, SUCCESS, WARNING, ERROR, CRITICAL, com padrão DEBUG), e observar páginas que só renderizam o conteúdo real delas via JavaScript precisa de um componente adicional de navegador headless que o projeto chama de sockpuppetbrowser, um container separado, que está fora do escopo dessa configuração básica. A própria documentação do projeto cobre como adicionar isso se você precisar depois.

Passo 7: faça backup dos seus watches e histórico

O único volume nomeado, changedetection-data, guarda tudo: todo watch que você configurou, o histórico completo dele, e todo snapshot armazenado. Faça backup dele do mesmo jeito que qualquer outro volume Docker, com um tarball mantido fora do servidor:

docker run --rm -v changedetection_changedetection-data:/data -v $(pwd):/backup alpine \
  tar czf /backup/changedetection-backup-$(date +%F).tar.gz -C /data .

Coloque isso num cron job e copie o resultado pra algum lugar que não seja esse servidor, um bucket de object storage, outra máquina, qualquer lugar que não seja esse droplet. Um backup que mora só no servidor que ele está protegendo não sobrevive ao modo de falha que de fato destrói um servidor.

Passo 8: faça o upgrade sem perder os seus watches

Cheque a versão que você está rodando atualmente, depois atualize a tag fixada no docker-compose.yml:

image: dgtlmoon/changedetection.io:<new-version>

Baixe e reinicie só esse serviço:

docker compose pull changedetection
docker compose up -d changedetection

Cheque os logs por uma inicialização limpa:

docker compose logs changedetection

Depois confirme que os seus watches existentes e o histórico deles ainda estão lá quando você abrir a aplicação. Se algo parecer errado, o seu backup do Passo 7 é o caminho de volta.

O caminho mais rápido: faça isso com a Railyard

Tudo acima, um volume /datastore persistente e HTTPS já conectado, também é um template de um clique:

https://app.railyard.run/deploy?template=changedetection

A Railyard constrói esse a partir do próprio Dockerfile do projeto no repositório GitHub dele, a mesma abordagem da configuração manual acima só automatizada, em vez de baixar uma imagem pré-construída. Sem add-ons: sem banco de dados, sem serviço extra, já que o changedetection.io também não precisa de nenhum pra essa configuração básica.

Se você preferir começar pela Railyard de forma mais geral antes de decidir pelo changedetection.io especificamente, o quickstart cobre o básico, e databases and backups explica como backups funcionam em todo template, não só esse. Deploy button cobre o formato do link ?template= em si se você quiser embutir um em outro lugar. O plano Free da Railyard cobre um servidor mais um servidor de banco de dados e 3 aplicações sem precisar de cartão; o Pro é US$19/mês por equipe, o Team é US$49/mês por equipe pra configurações maiores.

Resolução de problemas

O Caddy nunca consegue um certificado, ou o navegador mostra um aviso de certificado. Isso quase sempre é DNS, não o Caddy. Rode dig watch.yourdomain.com +short a partir da sua própria máquina e confirme que ele retorna o IP do servidor, não um antigo, e não nada. O Let’s Encrypt também precisa da porta 80 acessível da internet pra validação inicial, então cheque se o firewall ou security group do seu provedor de nuvem permite entrada na 80 e 443, não só na 443.

docker compose up falha com “port is already allocated.” Alguma outra coisa na máquina já está vinculada à 80 ou 443, comumente uma instalação padrão de Nginx ou Apache. Encontre com sudo ss -tlnp | grep -E ':80|:443' e pare esse serviço, ou mude quais portas o Caddy publica se você genuinamente precisa dos dois rodando.

Um watch mostra conteúdo obsoleto ou vazio numa página que você sabe que mudou. Se a página só renderiza o conteúdo real dela com JavaScript, uma busca básica vê a casca vazia que o navegador normalmente preencheria. Essa configuração não inclui o componente de navegador headless que o changedetection.io usa pra páginas pesadas em JavaScript; cheque a própria documentação do projeto pra adicionar isso como um container separado se um watch específico precisar.

Um watch continua reportando uma mudança numa página que, pra você, parece idêntica. Algo na página muda em toda carga mesmo quando o conteúdo que importa não mudou, um timestamp, um anúncio rotativo, um token de sessão embutido na estrutura. Restrinja o watch a um elemento específico com o seletor visual, ou adicione um filtro que remove a parte ruidosa, em vez de comparar a página inteira.

Perguntas frequentes

Isso precisa de um banco de dados? Não. O único volume /datastore guarda a configuração dos watches, o histórico e os snapshots juntos; não existe um serviço de banco de dados separado nessa configuração.

Ele consegue observar páginas que exigem login? O changedetection.io suporta passar cookies ou dados de sessão de navegador pra watches atrás de uma barreira de login; cheque a própria documentação dele pelo jeito atual de configurar isso, já que depende do site específico e de como a sessão dele funciona.

Como ele me notifica quando algo muda? O changedetection.io vem com uma variedade de integrações de notificação, email, Slack, Discord, webhooks genéricos e mais, configuradas por watch ou globalmente. Cheque a própria documentação dele pela lista atual e configuração de cada uma.

Quanto custa rodar isso? O servidor é US$6/mês. O próprio changedetection.io é software gratuito e open-source sem taxa por watch ou por checagem.

O template da Railyard tem a mesma arquitetura dessa configuração manual? Sim. Um container, o mesmo volume /datastore persistente, HTTPS na frente dele, sem add-ons. A Railyard constrói ele a partir do próprio Dockerfile do projeto em vez de uma imagem pré-construída, mas o que de fato roda é a mesma coisa que você teria seguindo as etapas acima.

Qualquer um dos dois caminhos te dá o mesmo resultado: uma página que antes exigia que você lembrasse de checar ela, agora se checando sozinha, e te avisando no momento em que ela tem algo que vale a pena olhar.

Por que escolhem o Railyard para isso

  • Sua própria conta de cloud. Faça deploy no DigitalOcean, Hetzner, Vultr, AWS, OVHcloud, ou em qualquer servidor Linux via SSH, cobrado direto pelo seu provedor, sem markup.
  • Um preço fixo por equipe. O Free é grátis para sempre: um servidor mais um servidor de banco de dados, três apps, sem cartão. O Pro custa US$19 por mês para até cinco servidores e apps ilimitados. O Team custa US$49 por mês com servidores ilimitados. Sem cobrança por app, por deploy, por assento ou por gigabyte.
  • Templates de um clique. Faça deploy de apps open source, como bancos de dados, analytics e ferramentas de dev, no seu próprio servidor em um clique.
  • Bancos de dados gerenciados. Postgres, MySQL e Redis com backups programados, verificados por restauração, e recuperação point-in-time.
  • Push-to-deploy. Faça deploy a partir do GitHub, GitLab ou da CLI, com HTTPS automático e releases sem downtime.

Pule a configuração de servidor

Lance o template verificado do changedetection.io na Railyard em um clique e tenha uma instância rodando com HTTPS já conectado.

Plano grátis, sem cartão, e 14 dias de Pro para cada equipe nova. Um preço fixo por equipe.