INTEGRITY Документация

Миграция без простоя

Если конечный клиент уже работает на другой CDN, переключение его CNAME-записи на ваш резервный исходный сервер Cloudflare создаёт короткое окно, в течение которого Cloudflare ещё не может проксировать его трафик. Предварительная проверка позволяет подтвердить владение именем хоста и при необходимости заранее выпустить TLS-сертификат до переключение DNS, поэтому миграция проходит незаметно для пользователей.

Последовательность миграции

  1. Создайте пользовательское имя хоста через API.
  2. Выполните предварительную проверку владения именем хоста с помощью HTTP-токена или DNS-записи TXT.
  3. Заранее выпустите сертификат TLS до переключения DNS.
  4. Убедитесь, что имя хоста active.
  5. Обновите CNAME конечного клиента: трафик переключается без простоя.

Шаг 1: Создайте пользовательское имя хоста

Вызовите Create Custom Hostname endpoint. Обратите внимание на ownership_verification и ownership_verification_http полей в ответе, они понадобятся вам на следующем шаге.

Create custom hostname
curl https://api.cloudflare.com/client/v4/zones/{zone_id}/custom_hostnames \
  --header "Authorization: Bearer <API_TOKEN>" \
  --header "Content-Type: application/json" \
  --data '{
    "hostname": "app.example.com",
    "ssl": {
      "method": "http",
      "type": "dv",
      "settings": {
        "http2": "on",
        "min_tls_version": "1.2"
      }
    }
  }'
Пример ответа (сокращённый)
{
  "result": {
    "id": "24c8c68e-bec2-49b6-868e-f06373780630",
    "hostname": "app.example.com",
    "status": "pending",
    "verification_errors": ["custom hostname does not CNAME to this zone."],
    "ownership_verification": {
      "type": "txt",
      "name": "_cf-custom-hostname.app.example.com",
      "value": "0e2d5a7f-1548-4f27-8c05-b577cb14f4ec"
    },
    "ownership_verification_http": {
      "http_url": "http://app.example.com/.well-known/cf-custom-hostname-challenge/24c8c68e-bec2-49b6-868e-f06373780630",
      "http_body": "48b409f6-c886-406b-8cbc-0fbf59983555"
    },
    "created_at": "2020-03-04T20:06:04.117122Z"
  }
}

verification_errors поле покажет custom hostname does not CNAME to this zone на этом этапе, это ожидаемо. Ошибка исчезнет после завершения предварительной проверки.


Шаг 2: Предварительно подтвердите владение именем хоста

Выберите метод, который подходит для ситуации вашего конечного клиента.

Вариант A: токен HTTP (конечный клиент не управляет DNS)

Используйте этот метод, если конечный клиент не может обновить свой авторитетный DNS или если вы хотите выполнить проверку самостоятельно.

  1. Скопируйте http_url и http_body из ownership_verification_http объект в ответе Create Custom Hostname.

  2. Попросите конечного клиента разместить http_body значение на http_url путь на своём исходном сервере. Например, в nginx:

    пример nginx
    location /.well-known/cf-custom-hostname-challenge/24c8c68e-bec2-49b6-868e-f06373780630 {
        return 200 "48b409f6-c886-406b-8cbc-0fbf59983555\n";
    }

    Cloudflare сканирует этот URL-адрес с помощью User-Agent: Cloudflare Custom Hostname Verification. Origin-сервер должен ответить 200 статус и точное значение токена в теле запроса.

  3. Подождите несколько минут, пока Cloudflare просканирует токен. Статус имени хоста изменится с pending к active как только владение будет подтверждено.

Вариант B: запись TXT (конечный клиент управляет DNS)

Используйте этот метод, если конечный клиент может добавить запись DNS у своего авторитетного DNS-провайдера.

  1. Скопируйте name и value из ownership_verification объект в ответе Create Custom Hostname.

  2. Попросите конечного клиента добавить TXT запись у своего DNS-провайдера:

    Тип Название Значение
    TXT _cf-custom-hostname.app.example.com 0e2d5a7f-1548-4f27-8c05-b577cb14f4ec
  3. Подождите несколько минут, пока Cloudflare обнаружит запись. Статус имени хоста изменится на active как только владение будет подтверждено.

  4. Как только имя хоста станет активным, конечный клиент сможет удалить запись TXT.


Шаг 3: Заранее выпустите сертификат TLS

Заблаговременный выпуск сертификата исключает ошибку TLS при переключении. Без этого шага сертификат невозможно выпустить, пока запись CNAME конечного клиента не начнёт указывать на Cloudflare, а значит, ssl.status останется pending путём изменения DNS. Выберите один из следующих способов:


Шаг 4: Убедитесь, что имя хоста активно

Перед обновлением DNS убедитесь, что имя хоста и сертификат готовы.

Получение сведений о пользовательском имени хоста
curl https://api.cloudflare.com/client/v4/zones/{zone_id}/custom_hostnames/{custom_hostname_id} \
  --header "Authorization: Bearer <API_TOKEN>"
Пример ответа (сокращённый)
{
  "result": {
    "id": "24c8c68e-bec2-49b6-868e-f06373780630",
    "hostname": "app.example.com",
    "status": "active",
    "ssl": {
      "status": "active"
    }
  }
}

Дождитесь, пока оба result.status и result.ssl.status являются active прежде чем продолжить. Если что-либо из этого по-прежнему pending, подождите и повторите запрос.


Шаг 5: Обновите CNAME-запись конечного клиента

Как только result.status это active (и ssl.status это active тоже, если вы заранее выпустили сертификат в шаге 3), попросите конечного клиента обновить его CNAME-запись так, чтобы она указывала на ваш резервный исходный сервер:

Тип Название Значение
CNAME app fallback.yoursaaszone.com

Трафик начнёт проксироваться через Cloudflare сразу после распространения записей DNS. Поскольку имя хоста уже прошло проверку, а сертификат уже был выпущен, при переходе не возникает простоев или ошибок сертификата.