Настройка доменов

Фреймворк Fresh построен на базе Deno и ориентирован на современную разработку веб-приложений с высокой производительностью и минимальными накладными расходами. Один из ключевых аспектов развёртывания приложений — корректная настройка доменов, чтобы сервер правильно обрабатывал запросы, маршрутизировал их и обеспечивал безопасное подключение.

Поддержка нескольких доменов

Fresh позволяет обрабатывать несколько доменов через конфигурацию сервера. В отличие от классических Node.js-приложений, здесь нет необходимости использовать отдельный прокси вроде Nginx для маршрутизации базовых HTTP-запросов, если приложение развёртывается через стандартный Deno Deploy или на локальный сервер.

Для каждого домена можно задать индивидуальные настройки:

import { serve } from "https://deno.land/std@0.201.0/http/server.ts";

serve((req: Request) => {
  const url = new URL(req.url);
  switch (url.hostname) {
    case "example.com":
      return new Response("Главная страница example.com");
    case "api.example.com":
      return new Response("API example.com");
    default:
      return new Response("Домен не найден", { status: 404 });
  }
});

Ключевые моменты:

  • url.hostname позволяет различать запросы по домену.
  • Можно создавать отдельные маршруты и обработчики для каждого домена.
  • Для динамических поддоменов применяется паттерн *.example.com с соответствующей проверкой endsWith(".example.com").

SSL и HTTPS

Fresh использует стандартные возможности Deno для работы с TLS. Настройка HTTPS особенно важна для production, чтобы обеспечить безопасность передачи данных. Основные методы:

  1. Самоподписанные сертификаты для локальной разработки:
deno run --allow-net --allow-read --cert=cert.pem --key=key.pem server.ts
  1. Let’s Encrypt или внешние провайдеры для production:

    • Полученные сертификаты сохраняются на сервере.
    • Подключаются через --cert и --key или через встроенный прокси, если используется Deno Deploy.

Важно: при использовании Deno Deploy TLS настраивается автоматически, достаточно правильно указать домен в настройках проекта.

Привязка домена к приложению

Для локального тестирования можно использовать файл hosts, добавив строки:

127.0.0.1 example.com
127.0.0.1 api.example.com

Это позволяет обращаться к разным доменам на одном сервере. Для production требуется регистрация домена и настройка DNS-записей:

  • A-запись указывает на IP сервера.
  • CNAME-записи используются для поддоменов, если они направлены на основной домен.

После этого можно использовать механизм обработки hostname в Fresh для маршрутизации.

Поддомены и динамическая маршрутизация

Fresh поддерживает динамическую маршрутизацию, что упрощает работу с поддоменами:

serve((req: Request) => {
  const { hostname } = new URL(req.url);
  
  if (hostname.endsWith(".example.com")) {
    const subdomain = hostname.split(".")[0];
    return new Response(`Поддомен: ${subdomain}`);
  }

  return new Response("Домен не поддерживается", { status: 404 });
});
  • Динамическая маршрутизация полезна для SaaS-приложений, где каждому клиенту выделяется свой поддомен.
  • Важно проверять и нормализовать поддомен, чтобы избежать уязвимостей, связанных с подделкой заголовков.

Интеграция с прокси

Хотя Fresh способен обслуживать несколько доменов самостоятельно, для сложных конфигураций рекомендуется использовать обратный прокси:

  • Nginx или Caddy позволяют управлять SSL, редиректами и кэшированием.
  • Fresh получает уже готовые HTTP-запросы, а домены маршрутизируются через прокси.

Пример конфигурации Nginx:

server {
    server_name example.com;
    location / {
        proxy_pass http://127.0.0.1:8000;
        proxy_set_header Host $host;
    }
}

Преимущества:

  • Централизованная настройка SSL.
  • Легкость масштабирования и балансировки нагрузки.
  • Возможность интеграции с веб-сокетами и статическими ресурсами.

Локальные и глобальные настройки домена

Fresh позволяет комбинировать локальные и глобальные конфигурации:

  • Локальные: специфичные для текущего проекта поддомены, маршруты и SSL.
  • Глобальные: через настройки Deno Deploy, где каждый домен автоматически связывается с приложением и получает сертификат.

Это обеспечивает гибкость и совместимость с разными средами: локальной, staging и production.

Особенности при разработке

  • Важно учитывать кэширование DNS при тестировании новых доменов.
  • Рекомендуется использовать уникальные имена поддоменов для разных сред (dev, staging, prod).
  • При работе с динамическими поддоменами следует учитывать лимиты Deno Deploy и настройку маршрутизации на уровне сервера.

Настройка доменов во Fresh требует внимания к деталям DNS, SSL и маршрутизации. Корректная конфигурация позволяет создавать масштабируемые и безопасные веб-приложения без сложных внешних инструментов.