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

Подключение к частной базе данных через Tunnel

Hyperdrive может безопасно подключаться к вашим приватным базам данных с помощью Cloudflare Tunnel и Cloudflare Access.

Как это работает

Если ваша база данных изолирована в частной сети (например, виртуальное частное облако ↗ или локальной сети), необходимо включить защищённое соединение от вашей сети к Cloudflare.

Запрос от Cloudflare Worker к исходной базе данных проходит через Hyperdrive, Cloudflare Access и Cloudflare Tunnel, установленный cloudflared. cloudflared должен быть запущен в приватной сети, в которой доступна ваша база данных.

Cloudflare Tunnel устанавливает исходящее двунаправленное соединение из вашей частной сети с Cloudflare. Cloudflare Access защищает Cloudflare Tunnel, ограничивая доступ к нему только конфигурацией Hyperdrive.

Запрос от Cloudflare Worker к исходной базе данных проходит через Hyperdrive, Cloudflare Access и Cloudflare Tunnel, установленный cloudflared.

Прежде чем начать

Во всех руководствах предполагается, что вы уже выполнили Руководство по началу работы, который поможет вам настроить аккаунт Cloudflare Workers, C3 ↗, а также Wrangler.

Предварительные требования

1. Создание туннеля в приватной сети

1.1. Создание туннеля

Сначала создайте Cloudflare Tunnel в вашей приватной сети, чтобы установить безопасное соединение между вашей сетью и Cloudflare. Ваша сеть должна быть настроена так, чтобы туннель имел разрешения на исходящий трафик к сети Cloudflare и доступ к базе данных внутри вашей сети.

  1. Войдите в панель управления Cloudflare и перейдите в Сеть > Tunnels.

    Перейдите в Tunnels ↗
  2. Выберите Создать туннель.

  3. Введите имя туннеля. Рекомендуем выбрать имя, отражающее тип ресурсов, которые вы хотите подключить через этот туннель (например, enterprise-VPC-01).

  4. Выберите Create Tunnel.

  5. Выберите операционную систему, затем скопируйте команду установки и выполните её в терминале на вашем исходном сервере.

  6. Дождитесь подключения туннеля. После установления соединения выберите Продолжение.

1.2. Подключение базы данных с помощью публичного имени хоста

Туннель должен быть настроен на использование публичного hostname в Cloudflare, чтобы Hyperdrive мог направлять на него запросы. Если у вас ещё нет hostname в Cloudflare, вам нужно будет зарегистрируйте новое имя хоста или добавить зону в Cloudflare, чтобы продолжить.

  1. В Опубликованные маршруты приложения вкладке выберите Домен и укажите поддомен или путь, если это необходимо. Эта информация будет использована в конфигурации Hyperdrive для маршрутизации к этому туннелю.

  2. В Сервис раздел и укажите Тип TCP а также URL и настроенный порт вашей базы данных, например, localhost:5432 или my-database-host.database-provider.com:5432. Этот адрес будет использоваться туннелем для маршрутизации запросов к вашей базе данных.

  3. Выберите Сохранить туннель.

2. Создание и настройка Hyperdrive для подключения к Cloudflare Tunnel

Чтобы ограничить для Hyperdrive доступ к Cloudflare Tunnel, потребуется Приложение Cloudflare Access должен быть настроен с Политика который требует, чтобы запросы содержали действительный Токен Service Auth.

Панель управления Cloudflare может автоматически создать и настроить базовый Приложение Cloudflare Access, Токен Service Auth, а также Политика от вашего имени. Либо вы можете вручную создать приложение Access и настроить Policies.

Автоматическое создание

2.1. (Автоматически) Создание конфигурации Hyperdrive в панели управления Cloudflare

Создайте конфигурацию Hyperdrive в панели управления Cloudflare, чтобы автоматически настроить подключение Hyperdrive к вашему Cloudflare Tunnel.

  1. В Панель управления Cloudflare ↗, перейдите в Storage & Databases > Hyperdrive и нажмите Создать конфигурацию.
  2. Выберите Приватная база данных.
  3. В Сведения о сети раздел и выберите туннель, к которому вы подключаетесь.
  4. В Сведения о сети раздел и выберите хост, связанный с туннелем. Если для вашей базы данных хоста нет, вернитесь к шагу 1.2. Подключение базы данных с помощью публичного имени хоста.
  5. В Access Service Authentication Token разделе выберите Create new (automatic).
  6. В Access Application разделе выберите Create new (automatic).
  7. В Данные подключения к базе данных раздел и укажите базу данных имя, пользователь, а также password.

Ручное создание

2.1. (Вручную) Создание токена службы

Токен сервиса будет использоваться для ограничения запросов к туннелю и понадобится для следующего шага.

  1. В Панель управления Cloudflare ↗, перейдите в Zero Trust > Контроль доступа > Учетные данные службы > Service Tokens.

  2. Выберите Create Service Token.

  3. Назовите токен службы. Название позволит легко находить в журналах события, связанные с этим токеном, и отзывать его отдельно.

  4. Задайте Service Token Duration Non-expiring. Это предотвращает истечение срока действия токена службы и гарантирует возможность его использования на всем протяжении существования конфигурации Hyperdrive.

  5. Выберите Создать токен. Появятся сгенерированные Client ID и Client Secret для токена службы, а также соответствующие заголовки запроса.

  6. Скопируйте Access Client ID и Access Client Secret. Они понадобятся при создании конфигурации Hyperdrive.

2.2. (Вручную) Создание приложения Access для защиты туннеля

Cloudflare Access будет использоваться для проверки того, что запросы к туннелю исходят от Hyperdrive, с использованием токена службы, созданного выше.

  1. В Панель управления Cloudflare ↗, перейдите в Zero Trust > Контроль доступа > Приложения.

  2. Выберите Создать новое приложение.

  3. Выберите Самостоятельный хостинг и конфиденциальность.

  4. Выберите Добавьте общедоступное имя хоста и введите поддомен и домен, которые ранее были заданы для приложения туннеля.

  5. Выберите Создать новую политику.

  6. Введите Название политики и задайте Действие к Service Auth.

  7. Создайте Включить правило. Укажите Селектор Service Token и Значение сервисного токена, который вы создали на шаге 2. Создание токена службы.

  8. Сохраните политику.

  9. В Поставщики удостоверений, отключите Принимать все доступные провайдеры идентификации и удалите всех провайдеров идентификации.

  10. В Длительность сессии, выберите No duration, expires immediately.

  11. (Необязательно) Перейдите в Дополнительные настройки. Отключите Показать приложение в App Launcher.

  12. Выберите Создание.

2.3. (Вручную) Создание конфигурации Hyperdrive

Чтобы создать конфигурацию Hyperdrive для приватной базы данных, при создании нужно будет указать приложение Access и данные Cloudflare Tunnel.

# wrangler v3.65 and above required
npx wrangler hyperdrive create <NAME-OF-HYPERDRIVE-CONFIGURATION-FOR-DB-VIA-TUNNEL> --host=<HOSTNAME-FOR-THE-TUNNEL> --user=<USERNAME-FOR-YOUR-DATABASE> --password=<PASSWORD-FOR-YOUR-DATABASE> --database=<DATABASE-TO-CONNECT-TO> --access-client-id=<YOUR-ACCESS-CLIENT-ID> --access-client-secret=<YOUR-SERVICE-TOKEN-CLIENT-SECRET>
resource "cloudflare_hyperdrive_config"  "<TERRAFORM_VARIABLE_NAME_FOR_CONFIGURATION>" {
  account_id = "<YOUR_ACCOUNT_ID>"
  name       = "<NAME_OF_HYPERDRIVE_CONFIGURATION>"
  origin     = {
    host     = "<HOSTNAME_OF_TUNNEL>"
    database = "<NAME_OF_DATABASE>"
    user     = "<NAME_OF_DATABASE_USER>"
    password = "<DATABASE_PASSWORD>"
    scheme   = "postgres"
    access_client_id     = "<ACCESS_CLIENT_ID>"
    access_client_secret = "<ACCESS_CLIENT_SECRET>"
  }
  caching = {
    disabled = false
  }
}

В результате будет создана конфигурация Hyperdrive со стандартными данными базы данных (имя базы данных, хост базы данных, пользователь базы данных и пароль базы данных).

Кроме того, будут заданы Access Client ID и Access Client Secret для Service Token. Когда Hyperdrive отправляет запросы в туннель, они перехватываются Access и проверяются с использованием учетных данных Service Token.

3. Выполнение запроса к конфигурации Hyperdrive из Worker (необязательно)

Чтобы протестировать подключение конфигурации Hyperdrive к базе данных через Cloudflare Tunnel и Access, укажите идентификатор этой конфигурации Hyperdrive в своём Worker и разверните его.

3.1. Создание привязки Hyperdrive

Необходимо создать привязку в конфигурационный файл Wrangler чтобы ваш Worker мог подключиться к конфигурации Hyperdrive. Bindings позволяют вашим Workers обращаться к ресурсам платформы разработчика Cloudflare, таким как Hyperdrive.

Чтобы привязать конфигурацию Hyperdrive к своему Worker, добавьте следующее в конец файла Wrangler:

{
	"hyperdrive": [
		{
			"binding": "HYPERDRIVE",
			"id": "<YOUR_DATABASE_ID>" // the ID associated with the Hyperdrive you just created
		}
	]
}
[[hyperdrive]]
binding = "HYPERDRIVE"
id = "<YOUR_DATABASE_ID>"

А именно:

Если вы хотите использовать локальную базу данных при разработке, вы можете добавить localConnectionString в вашу конфигурацию Hyperdrive со строкой подключения к вашей базе данных:

{
	"hyperdrive": [
		{
			"binding": "HYPERDRIVE",
			"id": "<YOUR_DATABASE_ID>", // the ID associated with the Hyperdrive you just created
			"localConnectionString": "<LOCAL_DATABASE_CONNECTION_URI>"
		}
	]
}
[[hyperdrive]]
binding = "HYPERDRIVE"
id = "<YOUR_DATABASE_ID>"
localConnectionString = "<LOCAL_DATABASE_CONNECTION_URI>"

3.2. Запрос к базе данных

Убедитесь, что можете подключиться к базе данных из Workers и выполнять запросы.

Используйте node-postgres ↗ (pg) для отправки тестового запроса и проверки успешности подключения.

Установите node-postgres драйвер:

npm i pg@>8.16.3

При использовании TypeScript установите пакет типов:

npm i -D @types/pg

Добавьте необходимые флаги совместимости Node.js и привязку Hyperdrive в свой wrangler.jsonc файле:

{
	// required for database drivers to function
	"compatibility_flags": [
		"nodejs_compat"
	],
	// Set this to today's date
	"compatibility_date": "2026-08-28",
	"hyperdrive": [
		{
			"binding": "HYPERDRIVE",
			"id": "<your-hyperdrive-id-here>"
		}
	]
}
compatibility_flags = [ "nodejs_compat" ]
# Set this to today's date
compatibility_date = "2026-08-28"

[[hyperdrive]]
binding = "HYPERDRIVE"
id = "<your-hyperdrive-id-here>"

Создайте новый Client экземпляр и передайте Hyperdrive connectionString:

// filepath: src/index.ts
import { Client } from "pg";

export default {
	async fetch(
		request: Request,
		env: Env,
		ctx: ExecutionContext,
	): Promise<Response> {
		// Create a new client instance for each request. Hyperdrive maintains the
		// underlying database connection pool, so creating a new client is fast.
		const client = new Client({
			connectionString: env.HYPERDRIVE.connectionString,
		});

		try {
			// Connect to the database
			await client.connect();

			// Perform a simple query
			const result = await client.query("SELECT * FROM pg_tables");

			return Response.json({
				success: true,
				result: result.rows,
			});
		} catch (error: any) {
			console.error("Database error:", error.message);

			return new Response("Internal error occurred", { status: 500 });
		}
	},
};

Теперь разверните свой Worker:

npx wrangler deploy

Если вы успешно получаете список pg_tables из вашей базы данных при обращении к развёрнутому Worker, ваш Hyperdrive теперь настроен для безопасного подключения к приватной базе данных с помощью Cloudflare Tunnel и Cloudflare Access.

Используйте mysql2 ↗ чтобы отправить тестовый запрос и убедиться, что подключение выполнено успешно.

Установите mysql2 ↗ драйвер:

npm i mysql2@>3.13.0

Добавьте необходимые флаги совместимости Node.js и привязку Hyperdrive в свой wrangler.jsonc файле:

{
	// required for database drivers to function
	"compatibility_flags": [
		"nodejs_compat"
	],
	// Set this to today's date
	"compatibility_date": "2026-08-28",
	"hyperdrive": [
		{
			"binding": "HYPERDRIVE",
			"id": "<your-hyperdrive-id-here>"
		}
	]
}
compatibility_flags = [ "nodejs_compat" ]
# Set this to today's date
compatibility_date = "2026-08-28"

[[hyperdrive]]
binding = "HYPERDRIVE"
id = "<your-hyperdrive-id-here>"

Создайте новый connection экземпляр и передайте параметры Hyperdrive:

// mysql2 v3.13.0 or later is required
import { createConnection } from "mysql2/promise";

export default {
	async fetch(request, env, ctx): Promise<Response> {
		// Create a new connection on each request. Hyperdrive maintains the underlying
		// database connection pool, so creating a new connection is fast.
		const connection = await createConnection({
			host: env.HYPERDRIVE.host,
			user: env.HYPERDRIVE.user,
			password: env.HYPERDRIVE.password,
			database: env.HYPERDRIVE.database,
			port: env.HYPERDRIVE.port,

			// Required to enable mysql2 compatibility for Workers
			disableEval: true,
		});

		try {
			// Sample query
			const [results, fields] = await connection.query("SHOW tables;");

			// Return result rows as JSON
			return Response.json({ results, fields });
		} catch (e) {
			console.error(e);
			return Response.json(
				{ error: e instanceof Error ? e.message : e },
				{ status: 500 },
			);
		}
	},
} satisfies ExportedHandler<Env>;

Теперь разверните свой Worker:

npx wrangler deploy

Если при обращении к развернутому Worker вы успешно получаете список таблиц из своей базы данных, значит Hyperdrive теперь настроен для безопасного подключения к приватной базе данных с использованием Cloudflare Tunnel и Cloudflare Access.

Устранение неполадок

Если при настройке конфигурации Hyperdrive с туннелями к приватной базе данных возникают проблемы, попробуйте эти распространенные решения в дополнение к общие шаги по устранению неполадок для Hyperdrive: