### 🚀 Изменено - Упрощение архитектуры - **Генерация миниатюр**: Полностью удалена из Quoter, теперь управляется Vercel Edge API - **Очистка legacy кода**: Удалены все функции генерации миниатюр и сложность - **Документация**: Сокращена с 17 файлов до 7, следуя принципам KISS/DRY - **Смена фокуса**: Quoter теперь сосредоточен на upload + storage, Vercel обрабатывает миниатюры - **Логирование запросов**: Добавлена аналитика источников для оптимизации CORS whitelist - **Реализация таймаутов**: Добавлены настраиваемые таймауты для S3, Redis и внешних операций - **Упрощенная безопасность**: Удален сложный rate limiting, оставлена только необходимая защита upload - **Vercel интеграция**: Добавлена поддержка Vercel Edge API с CORS и оптимизированными заголовками - **Redis graceful fallback**: Приложение теперь работает без Redis с предупреждениями вместо паники - **Умная логика ответов**: Автоматическое определение Vercel запросов и оптимизированные заголовки - **Консолидация документации**: Объединены 4 Vercel документа в один comprehensive guide ### 📝 Обновлено - Консолидирована документация в практическую структуру: - Основной README.md с быстрым стартом - docs/SETUP.md для конфигурации и развертывания - Упрощенный features.md с фокусом на основную функциональность - docs/vercel-frontend-migration.md - единый comprehensive guide для Vercel интеграции - Добавлен акцент на Vercel по всему коду и документации - Обновлены URL patterns в документации: quoter.discours.io → files.dscrs.site ### 🗑️ Удалено - Избыточные файлы документации (api-reference, deployment, development, и т.д.) - Дублирующийся контент в нескольких документах - Излишне детальная документация для простого файлового прокси - 4 отдельных Vercel документа: vercel-thumbnails.md, vercel-integration.md, hybrid-architecture.md, vercel-og-integration.md 💋 **Упрощение**: KISS принцип применен - убрали избыточность, оставили суть.
6.1 KiB
6.1 KiB
Конфигурация
Переменные окружения
Quoter использует следующие переменные окружения для настройки:
Обязательные переменные
| Переменная | Описание | Пример |
|---|---|---|
REDIS_URL |
URL для подключения к Redis | redis://localhost:6379 |
STORJ_ACCESS_KEY |
Ключ доступа к Storj S3 | your-storj-access-key |
STORJ_SECRET_KEY |
Секретный ключ Storj S3 | your-storj-secret-key |
AWS_ACCESS_KEY |
Ключ доступа к AWS S3 (fallback) | your-aws-access-key |
AWS_SECRET_KEY |
Секретный ключ AWS S3 (fallback) | your-aws-secret-key |
JWT_SECRET |
Секрет для валидации JWT токенов | your-jwt-secret-key |
Опциональные переменные
| Переменная | Описание | По умолчанию |
|---|---|---|
PORT |
Порт для запуска сервера | 8080 |
STORJ_END_POINT |
Endpoint Storj S3 | https://gateway.storjshare.io |
STORJ_BUCKET_NAME |
Имя bucket в Storj | discours-io |
AWS_END_POINT |
Endpoint AWS S3 | https://s3.amazonaws.com |
RUST_LOG |
Уровень логирования | info |
Пример .env файла
# Redis (обязательно)
REDIS_URL=redis://localhost:6379
# JWT Authentication (обязательно)
JWT_SECRET=your-super-secret-jwt-key
# Storj S3 - основное хранилище (обязательно)
STORJ_ACCESS_KEY=your-storj-access-key
STORJ_SECRET_KEY=your-storj-secret-key
STORJ_END_POINT=https://gateway.storjshare.io
STORJ_BUCKET_NAME=discours-io
# AWS S3 - fallback хранилище (обязательно)
AWS_ACCESS_KEY=your-aws-access-key
AWS_SECRET_KEY=your-aws-secret-key
AWS_END_POINT=https://s3.amazonaws.com
# Server настройки
PORT=8080
RUST_LOG=info
# Security (опционально)
MAX_PAYLOAD_SIZE=524288000 # 500MB
MAX_PATH_LENGTH=1000
MAX_HEADERS_COUNT=50
Настройка Redis
Минимальная конфигурация Redis
# redis.conf
maxmemory 2gb
maxmemory-policy allkeys-lru
save 900 1
save 300 10
save 60 10000
Проверка подключения
redis-cli ping
Настройка S3
Storj S3
- Создайте аккаунт на Storj
- Создайте API ключи в консоли
- Создайте bucket для файлов
- Настройте CORS для bucket:
{
"CORSRules": [
{
"AllowedOrigins": ["*"],
"AllowedMethods": ["GET", "POST", "PUT", "DELETE"],
"AllowedHeaders": ["*"],
"ExposeHeaders": ["ETag"]
}
]
}
AWS S3
- Создайте IAM пользователя с правами S3
- Создайте bucket для файлов
- Настройте CORS аналогично Storj
Логирование
Уровни логирования
error- только ошибкиwarn- предупреждения и ошибкиinfo- информационные сообщения, предупреждения и ошибкиdebug- отладочная информацияtrace- максимальная детализация
Примеры
# Только ошибки
RUST_LOG=error cargo run
# Информационные сообщения
RUST_LOG=info cargo run
# Отладка
RUST_LOG=debug cargo run
Дополнительные настройки
Настройки безопасности
# Rate limiting (requests per window)
GENERAL_RATE_LIMIT=100 # Общие запросы: 100/мин
UPLOAD_RATE_LIMIT=10 # Загрузка: 10/5мин
AUTH_RATE_LIMIT=20 # Аутентификация: 20/15мин
# Блокировка (секунды)
GENERAL_BLOCK_DURATION=300 # 5 минут
UPLOAD_BLOCK_DURATION=600 # 10 минут
AUTH_BLOCK_DURATION=1800 # 30 минут
Настройки квот
# Пользовательские квоты
MAX_USER_QUOTA_BYTES=12884901888 # 12 ГБ на пользователя
MAX_SINGLE_FILE_BYTES=524288000 # 500 МБ на файл
Vercel интеграция
# CORS для Vercel Edge Functions
ALLOWED_ORIGINS=https://discours.io,https://new.discours.io,https://vercel.app
# Health check endpoint
HEALTH_CHECK_ENABLED=true
Проверка конфигурации
Запустите сервер и проверьте логи:
RUST_LOG=info cargo run
Успешный запуск должен показать:
[INFO] Started
[INFO] Security config: max_payload=500 MB, upload_rate_limit=10/300s
[WARN] caching AWS filelist...
[WARN] cached 1234 files
Проверка endpoints
# User info (требует токен)
curl -H "Authorization: Bearer $TOKEN" http://localhost:8080/
# Upload test (требует токен)
curl -X POST -H "Authorization: Bearer $TOKEN" \
-F "file=@test.jpg" http://localhost:8080/
Проверка безопасности
# Rate limiting test
for i in {1..110}; do curl http://localhost:8080/ & done
# Должно показать 429 после 100 запросов
Troubleshooting
Частые проблемы
1. Redis connection failed
# Проверьте Redis
redis-cli ping
# Должно вернуть: PONG
2. S3 credentials invalid
# Проверьте доступ к Storj
aws s3 ls --endpoint-url=https://gateway.storjshare.io \
--profile storj
# Проверьте доступ к AWS
aws s3 ls --profile aws
3. JWT validation failed
# Проверьте JWT_SECRET
echo $JWT_SECRET
# Должен быть установлен и совпадать с core API
4. Rate limiting не работает
# Проверьте Redis keys
redis-cli KEYS "rate_limit:*"
# Должны появляться ключи при запросах