Cloudflare Worker для RAG API

Безопасный прокси для OpenRouter API с CORS-защитой и rate limiting.

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

1. Установка Wrangler CLI

npm install -g wrangler

2. Авторизация в Cloudflare

wrangler login

3. Создание KV namespace для rate limiting

wrangler kv:namespace create "RATE_LIMIT_KV"
wrangler kv:namespace create "RATE_LIMIT_KV" --preview

Скопируйте ID namespace и обновите wrangler.toml.

4. Установка секретов

# Установка OpenRouter API ключа
wrangler secret put OPENROUTER_API_KEY

# При запросе введите ваш ключ от OpenRouter

5. Деплой

# Development
wrangler deploy --env development

# Production
wrangler deploy --env production

Конфигурация

Разрешенные домены (CORS)

В worker.js обновите CONFIG.ALLOWED_ORIGINS:

ALLOWED_ORIGINS: [
  'https://your-github-pages-domain.github.io',
  'http://localhost:4000',  // для локальной разработки
  'http://127.0.0.1:4000'
]

Rate Limiting

По умолчанию: 10 запросов на IP в 5 минут.

Изменить в CONFIG.RATE_LIMIT:

RATE_LIMIT: {
  MAX_REQUESTS: 10,
  WINDOW_MINUTES: 5
}

Модель по умолчанию

DEFAULT_MODEL: 'deepseek/deepseek-chat-v3.1:free'

Доступные БЕСПЛАТНЫЕ модели на OpenRouter:

  • x-ai/grok-4-fast:free (быстрая, для валидации)
  • deepseek/deepseek-chat-v3.1:free (качественная, по умолчанию)
  • openai/gpt-oss-20b:free (альтернатива OpenAI)
  • z-ai/glm-4.5-air:free (китайская модель)
  • moonshotai/kimi-k2:free (хорошо работает с русским)
  • qwen/qwen3-14b:free (Alibaba, многоязычная)

API Endpoint

POST /

Request:

{
  "query": "Что такое активное обучение?",
  "context": [
    {
      "title": "Активное обучение",
      "content": "Активное обучение - это...",
      "url": "/2022/05/18/активное-обучение/"
    }
  ],
  "model": "deepseek/deepseek-chat-v3.1:free"  // опционально, только бесплатные модели
}

Response:

{
  "answer": "Активное обучение - это подход в машинном обучении...",
  "sources": [
    {
      "id": 1,
      "title": "Активное обучение",
      "url": "/2022/05/18/активное-обучение/",
      "excerpt": "Активное обучение - это..."
    }
  ],
  "usage": {
    "prompt_tokens": 150,
    "completion_tokens": 200,
    "total_tokens": 350
  }
}

Error Responses:

Rate limit:

{
  "error": "rate_limit_exceeded",
  "message": "Превышен лимит запросов. Попробуйте через 5 минут.",
  "retryAfter": 300
}

Invalid query (не по теме):

{
  "error": "Invalid query",
  "message": "Ваш запрос не соответствует тематике блога \"Варим ML\". Пожалуйста, задавайте вопросы о машинном обучении, data science, MLOps или карьере в IT."
}

Invalid model:

{
  "error": "Invalid model",
  "message": "Модель gpt-4 не поддерживается. Доступные модели: x-ai/grok-4-fast:free, deepseek/deepseek-chat-v3.1:free, ..."
}

Безопасность

✅ Реализованные меры

  1. CORS whitelist - только разрешенные домены
  2. Rate limiting - защита от злоупотреблений
  3. Валидация запросов через LLM - проверка соответствия тематике блога
  4. Ограничение на бесплатные модели - только проверенные бесплатные модели
  5. Валидация входных данных - проверка структуры запроса
  6. Ограничение контекста - максимум 8000 символов
  7. Системный промпт - ответы только из контекста
  8. Секретные ключи - хранятся в Cloudflare Secrets

🔒 Дополнительные рекомендации

  1. Настройте мониторинг использования в Cloudflare Dashboard
  2. Регулярно проверяйте логи на подозрительную активность
  3. Рассмотрите добавление аутентификации для дополнительной защиты

Мониторинг

Cloudflare Dashboard

  • Analytics → Workers
  • Просмотр запросов, ошибок, производительности
  • Настройка алертов

Логи

wrangler tail

Стоимость

Cloudflare Workers

  • 100,000 запросов/день - бесплатно
  • $0.50 за миллион запросов сверх лимита

OpenRouter API

  • Все используемые модели БЕСПЛАТНЫЕ! 🎉
  • Deepseek Chat v3.1: бесплатно
  • Grok 4 Fast: бесплатно
  • Другие модели: бесплатно

Оценка для блога

При любом разумном количестве запросов:

  • Cloudflare: бесплатно (до 100k запросов/день)
  • OpenRouter: БЕСПЛАТНО (используем только free модели)
  • Общая стоимость: $0/месяц 💰

Troubleshooting

Ошибка “KV namespace not found”

Убедитесь, что создали KV namespace и обновили ID в wrangler.toml.

CORS ошибки

Проверьте, что ваш домен добавлен в ALLOWED_ORIGINS.

Rate limit не работает

Проверьте, что KV namespace правильно привязан к воркеру.

OpenRouter ошибки

Проверьте, что API ключ установлен правильно:

wrangler secret list