Environment variables

Переменные окружения — это механизм передачи конфигурационных данных в приложение без необходимости жестко кодировать их в исходном коде. В Fresh, как и во многих современных JavaScript-фреймворках, переменные окружения используются для хранения секретов, ключей API, конфигураций базы данных и других параметров, которые должны оставаться конфиденциальными или различаться между средами (development, staging, production).


Работа с переменными окружения

Fresh использует возможности Deno для работы с окружением. Доступ к переменным осуществляется через глобальный объект Deno.env. Пример чтения переменной:

const apiKey = Deno.env.get("API_KEY");
console.log("API Key:", apiKey);

Ключевой момент: все переменные должны быть объявлены в окружении перед запуском приложения. Например, в UNIX-подобных системах:

export API_KEY="123456789"
deno run -A main.ts

Флаг -A (или --allow-env) необходим, так как доступ к окружению в Deno по умолчанию запрещён из соображений безопасности.


Локальные переменные окружения

Для локальной разработки удобно хранить переменные в файле .env. Fresh не имеет встроенной поддержки .env, но можно использовать библиотеку deno dotenv. Установка через URL модуля:

import "https://deno.land/x/dotenv/load.ts";

После этого все переменные из .env становятся доступны через Deno.env.get:

API_KEY=123456789
DB_HOST=localhost
DB_PORT=5432
const dbHost = Deno.env.get("DB_HOST");
const dbPort = Deno.env.get("DB_PORT");
console.log(`Connecting to ${dbHost}:${dbPort}`);

Безопасность и ограничения

  1. Ограничение доступа: Deno требует явного разрешения на доступ к переменным окружения. Без флага -A или --allow-env попытка чтения вызовет ошибку. Это предотвращает случайную утечку секретов при запуске стороннего кода.
  2. Изоляция среды: Не рекомендуется хранить секреты в репозитории кода. Для деплоя используют окружение платформы (например, Deno Deploy, Vercel, Netlify), где переменные конфигурируются через панель управления.
  3. Чувствительность к регистру: Названия переменных строго чувствительны к регистру. API_KEY и api_key будут разными.

Использование переменных окружения в Fresh

Fresh использует маршрутизацию через страницы и API-роуты. Переменные окружения чаще всего применяются на серверной части для конфиденциальных данных:

// routes/api/data.ts
export async function handler(req) {
  const secretToken = Deno.env.get("SECRET_TOKEN");
  return new Response(JSON.stringify({ token: secretToken }), {
    headers: { "Content-Type": "application/json" },
  });
}

На клиентской стороне доступ к серверным переменным окружения напрямую невозможен. Если необходимо использовать данные в браузере, их нужно передавать через API или внедрять в HTML через SSR:

// routes/index.tsx
import { Handlers } from "$fresh/server.ts";

export const handler: Handlers = {
  GET(_req, ctx) {
    const publicKey = Deno.env.get("PUBLIC_KEY");
    return ctx.render({ publicKey });
  },
};

Рекомендации по организации

  • Разделение переменных по средам: создаются .env.development, .env.production, .env.test. При запуске подгружается соответствующий файл.
  • Именование: использовать префиксы для группировки, например, DB_, API_, AUTH_.
  • Не хранить секреты на клиенте: все конфиденциальные значения должны оставаться на сервере.
  • Типизация: для TypeScript можно создавать модуль с типами переменных окружения, чтобы избежать ошибок опечаток:
declare global {
  namespace Deno {
    interface Env {
      API_KEY: string;
      DB_HOST: string;
    }
  }
}

Интеграция с деплоем

На платформах вроде Deno Deploy переменные окружения задаются через интерфейс управления. Важно помнить, что значения доступны только серверным роутам, а клиентский код не видит их напрямую. Это обеспечивает безопасность и упрощает конфигурацию без изменения кода приложения.


Использование переменных окружения в Fresh сочетает простоту доступа через Deno.env с безопасной моделью разрешений, что позволяет строить конфигурируемые приложения без риска случайного раскрытия секретов.