Cloudflare Worker для RAG API
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, ..."
}
Безопасность
✅ Реализованные меры
- CORS whitelist - только разрешенные домены
- Rate limiting - защита от злоупотреблений
- Валидация запросов через LLM - проверка соответствия тематике блога
- Ограничение на бесплатные модели - только проверенные бесплатные модели
- Валидация входных данных - проверка структуры запроса
- Ограничение контекста - максимум 8000 символов
- Системный промпт - ответы только из контекста
- Секретные ключи - хранятся в Cloudflare Secrets
🔒 Дополнительные рекомендации
- Настройте мониторинг использования в Cloudflare Dashboard
- Регулярно проверяйте логи на подозрительную активность
- Рассмотрите добавление аутентификации для дополнительной защиты
Мониторинг
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