Criar Worker de Host

Faça de cima para baixo. Não pule etapas.

Este é o processo completo para criar um Host novo usando seu domínio fsdns.cc. Faça uma etapa por vez.

1

Escolha o nome

Digite abaixo o nome do Host. Você pode usar letras, números e hífen. Exemplos: central, goias, cliente1 ou fs10.

✓ O endereço final será https://central.fsdns.cc.

2

Crie o Worker

Cloudflare → Workers & Pages → Criar Worker. No nome, coloque somente central. A Cloudflare mostrará um endereço workers.dev nessa tela; pode ignorar, ele não será o endereço entregue ao cliente.
3

Cole e implante o código

Abra o Worker → Editar código. Apague o código de exemplo, cole o código abaixo e clique em Deploy/Implantar.
Código completo
const MAX_REDIRECTS = 6;

function required(env, key) {
  const value = env[key];
  if (!value) throw new Error(`Missing ${key}`);
  return value;
}

async function getTarget(env) {
  const apiBase = required(env, "FS_DNS_API_URL").replace(/\/$/, "");
  const slug = required(env, "HOST_SLUG");
  const response = await fetch(`${apiBase}/api/worker-state/${encodeURIComponent(slug)}`, {
    headers: { Accept: "application/json" },
    cf: { cacheTtl: 0, cacheEverything: false },
  });
  if (!response.ok) return null;
  const payload = await response.json();
  return payload?.ok && typeof payload.target === "string" && payload.target ? payload.target : null;
}

function upstreamUrl(requestUrl, target) {
  const incoming = new URL(requestUrl);
  const upstream = new URL(target);
  upstream.pathname = incoming.pathname;
  upstream.search = incoming.search;
  return upstream;
}

function isMedia(path) {
  return path.startsWith("/live/") || path.startsWith("/movie/") || path.startsWith("/series/");
}

async function resolveRedirects(url, headers) {
  let current = url;
  for (let i = 0; i < MAX_REDIRECTS; i++) {
    const response = await fetch(current, { method: "HEAD", headers, redirect: "manual" });
    if (response.status < 300 || response.status >= 400) return current;
    const location = response.headers.get("location");
    if (!location) return current;
    current = new URL(location, current).toString();
  }
  return current;
}

async function handle(request, env) {
  const incoming = new URL(request.url);
  const target = await getTarget(env);
  if (!target) return new Response("Host indisponível.", { status: 503 });
  const upstream = upstreamUrl(request.url, target);

  if (incoming.pathname === "/player_api.php") {
    return fetch(new Request(upstream.toString(), request), { redirect: "manual" });
  }
  if (incoming.pathname === "/get.php" || incoming.pathname === "/xmltv.php") {
    const destination = await resolveRedirects(upstream.toString(), request.headers);
    return Response.redirect(destination, 302);
  }
  if (isMedia(incoming.pathname)) return Response.redirect(upstream.toString(), 302);
  const destination = await resolveRedirects(upstream.toString(), request.headers);
  return Response.redirect(destination, 302);
}

export default {
  async fetch(request, env) {
    try { return await handle(request, env); }
    catch (error) {
      console.error("FS DNS Worker error", error instanceof Error ? error.message : error);
      return new Response("FS DNS indisponível.", { status: 503 });
    }
  },
};
4

Adicione as 2 variáveis

Worker → Configurações → Variables and Secrets. Use os botões abaixo para copiar cada linha completa NOME=VALOR e cole na Cloudflare.

Nome + valor

HOST_SLUG=central

Nome + valor

FS_DNS_API_URL=https://fsdns.cc
5

Conecte seu domínio

Worker → DomíniosAdicionar domínio → escolha fsdns.cc. No campo Subdomínio, digite somente central. Confirme que o resultado é central.fsdns.cc e adicione o domínio.
6

Cadastre o Host no FS DNS

FS DNS → Hosts → Novo Host. Em Host Cloudflare, use exatamente central. Cadastre a URL Primária e, se houver, as Reservas.
7

Verifique o Host

Depois de criar o Host, clique em Verificar agora. Aguarde a origem ficar verde, o Host aparecer como Operacional e existir uma rota ativa.
8

Teste no player

No player IPTV, substitua o servidor original por https://central.fsdns.cc e mantenha as credenciais normais. Se carregar normalmente, o Host está pronto.
Laboratório de failover/failback

Teste a troca automática sem derrubar um servidor real

A Primary de Teste imita o servidor principal e pode ser desligada de propósito. A Reserve de Teste fica online para comprovar que o FS DNS troca de origem sozinho. Depois você liga a Primary novamente e confirma o retorno automático.

Ordem: crie a Primary → crie a Reserve → cadastre ambas em um Host de laboratório → Primary UP → mude para DOWN → aguarde o failover → volte para UP → aguarde o failback.