2025-08-02 00:18:09 +03:00
|
|
|
|
# Конфигурация
|
|
|
|
|
|
|
|
|
|
|
|
## Переменные окружения
|
|
|
|
|
|
|
|
|
|
|
|
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` |
|
2025-09-02 12:32:15 +03:00
|
|
|
|
| `AWS_ACCESS_KEY` | Ключ доступа к AWS S3 (fallback) | `your-aws-access-key` |
|
|
|
|
|
|
| `AWS_SECRET_KEY` | Секретный ключ AWS S3 (fallback) | `your-aws-secret-key` |
|
2025-09-30 21:46:47 +03:00
|
|
|
|
| `JWT_SECRET_KEY` | Секрет для валидации JWT токенов (должен совпадать с @core) | `your-jwt-secret-key` |
|
2025-08-02 00:18:09 +03:00
|
|
|
|
|
|
|
|
|
|
### Опциональные переменные
|
|
|
|
|
|
|
|
|
|
|
|
| Переменная | Описание | По умолчанию |
|
|
|
|
|
|
|------------|----------|--------------|
|
|
|
|
|
|
| `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 файла
|
|
|
|
|
|
|
|
|
|
|
|
```bash
|
2025-09-02 12:32:15 +03:00
|
|
|
|
# Redis (обязательно)
|
2025-08-02 00:18:09 +03:00
|
|
|
|
REDIS_URL=redis://localhost:6379
|
|
|
|
|
|
|
2025-09-02 12:32:15 +03:00
|
|
|
|
# JWT Authentication (обязательно)
|
2025-09-30 21:46:47 +03:00
|
|
|
|
JWT_SECRET_KEY=your-super-secret-jwt-key # Должен совпадать с @core
|
2025-08-02 00:18:09 +03:00
|
|
|
|
|
2025-09-02 12:32:15 +03:00
|
|
|
|
# Storj S3 - основное хранилище (обязательно)
|
2025-08-02 00:18:09 +03:00
|
|
|
|
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
|
|
|
|
|
|
|
2025-09-02 12:32:15 +03:00
|
|
|
|
# AWS S3 - fallback хранилище (обязательно)
|
2025-08-02 00:18:09 +03:00
|
|
|
|
AWS_ACCESS_KEY=your-aws-access-key
|
|
|
|
|
|
AWS_SECRET_KEY=your-aws-secret-key
|
|
|
|
|
|
AWS_END_POINT=https://s3.amazonaws.com
|
|
|
|
|
|
|
2025-09-02 12:32:15 +03:00
|
|
|
|
# Server настройки
|
2025-08-02 00:18:09 +03:00
|
|
|
|
PORT=8080
|
|
|
|
|
|
RUST_LOG=info
|
2025-09-02 12:32:15 +03:00
|
|
|
|
|
|
|
|
|
|
# Security (опционально)
|
|
|
|
|
|
MAX_PAYLOAD_SIZE=524288000 # 500MB
|
|
|
|
|
|
MAX_PATH_LENGTH=1000
|
|
|
|
|
|
MAX_HEADERS_COUNT=50
|
2025-08-02 00:18:09 +03:00
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
## Настройка Redis
|
|
|
|
|
|
|
|
|
|
|
|
### Минимальная конфигурация Redis
|
|
|
|
|
|
|
|
|
|
|
|
```redis
|
|
|
|
|
|
# redis.conf
|
|
|
|
|
|
maxmemory 2gb
|
|
|
|
|
|
maxmemory-policy allkeys-lru
|
|
|
|
|
|
save 900 1
|
|
|
|
|
|
save 300 10
|
|
|
|
|
|
save 60 10000
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
### Проверка подключения
|
|
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
|
redis-cli ping
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
## Настройка S3
|
|
|
|
|
|
|
|
|
|
|
|
### Storj S3
|
|
|
|
|
|
|
|
|
|
|
|
1. Создайте аккаунт на [Storj](https://storj.io)
|
|
|
|
|
|
2. Создайте API ключи в консоли
|
|
|
|
|
|
3. Создайте bucket для файлов
|
|
|
|
|
|
4. Настройте CORS для bucket:
|
|
|
|
|
|
|
|
|
|
|
|
```json
|
|
|
|
|
|
{
|
|
|
|
|
|
"CORSRules": [
|
|
|
|
|
|
{
|
|
|
|
|
|
"AllowedOrigins": ["*"],
|
|
|
|
|
|
"AllowedMethods": ["GET", "POST", "PUT", "DELETE"],
|
|
|
|
|
|
"AllowedHeaders": ["*"],
|
|
|
|
|
|
"ExposeHeaders": ["ETag"]
|
|
|
|
|
|
}
|
|
|
|
|
|
]
|
|
|
|
|
|
}
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
### AWS S3
|
|
|
|
|
|
|
|
|
|
|
|
1. Создайте IAM пользователя с правами S3
|
|
|
|
|
|
2. Создайте bucket для файлов
|
|
|
|
|
|
3. Настройте CORS аналогично Storj
|
|
|
|
|
|
|
|
|
|
|
|
## Логирование
|
|
|
|
|
|
|
|
|
|
|
|
### Уровни логирования
|
|
|
|
|
|
|
|
|
|
|
|
- `error` - только ошибки
|
|
|
|
|
|
- `warn` - предупреждения и ошибки
|
|
|
|
|
|
- `info` - информационные сообщения, предупреждения и ошибки
|
|
|
|
|
|
- `debug` - отладочная информация
|
|
|
|
|
|
- `trace` - максимальная детализация
|
|
|
|
|
|
|
|
|
|
|
|
### Примеры
|
|
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
|
# Только ошибки
|
|
|
|
|
|
RUST_LOG=error cargo run
|
|
|
|
|
|
|
|
|
|
|
|
# Информационные сообщения
|
|
|
|
|
|
RUST_LOG=info cargo run
|
|
|
|
|
|
|
|
|
|
|
|
# Отладка
|
|
|
|
|
|
RUST_LOG=debug cargo run
|
|
|
|
|
|
```
|
|
|
|
|
|
|
2025-09-02 12:32:15 +03:00
|
|
|
|
## Дополнительные настройки
|
|
|
|
|
|
|
|
|
|
|
|
### Настройки безопасности
|
|
|
|
|
|
```bash
|
|
|
|
|
|
# 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 минут
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
### Настройки квот
|
|
|
|
|
|
```bash
|
|
|
|
|
|
# Пользовательские квоты
|
|
|
|
|
|
MAX_USER_QUOTA_BYTES=12884901888 # 12 ГБ на пользователя
|
|
|
|
|
|
MAX_SINGLE_FILE_BYTES=524288000 # 500 МБ на файл
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
### Vercel интеграция
|
|
|
|
|
|
```bash
|
|
|
|
|
|
# CORS для Vercel Edge Functions
|
|
|
|
|
|
ALLOWED_ORIGINS=https://discours.io,https://new.discours.io,https://vercel.app
|
|
|
|
|
|
|
|
|
|
|
|
# Health check endpoint
|
|
|
|
|
|
HEALTH_CHECK_ENABLED=true
|
|
|
|
|
|
```
|
|
|
|
|
|
|
2025-08-02 00:18:09 +03:00
|
|
|
|
## Проверка конфигурации
|
|
|
|
|
|
|
|
|
|
|
|
Запустите сервер и проверьте логи:
|
|
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
|
RUST_LOG=info cargo run
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
Успешный запуск должен показать:
|
|
|
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
|
[INFO] Started
|
2025-09-02 12:32:15 +03:00
|
|
|
|
[INFO] Security config: max_payload=500 MB, upload_rate_limit=10/300s
|
2025-08-02 00:18:09 +03:00
|
|
|
|
[WARN] caching AWS filelist...
|
|
|
|
|
|
[WARN] cached 1234 files
|
2025-09-02 12:32:15 +03:00
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
### Проверка endpoints
|
|
|
|
|
|
```bash
|
|
|
|
|
|
# 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/
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
### Проверка безопасности
|
|
|
|
|
|
```bash
|
|
|
|
|
|
# Rate limiting test
|
|
|
|
|
|
for i in {1..110}; do curl http://localhost:8080/ & done
|
|
|
|
|
|
|
|
|
|
|
|
# Должно показать 429 после 100 запросов
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
## Troubleshooting
|
|
|
|
|
|
|
|
|
|
|
|
### Частые проблемы
|
|
|
|
|
|
|
|
|
|
|
|
**1. Redis connection failed**
|
|
|
|
|
|
```bash
|
|
|
|
|
|
# Проверьте Redis
|
|
|
|
|
|
redis-cli ping
|
|
|
|
|
|
# Должно вернуть: PONG
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
**2. S3 credentials invalid**
|
|
|
|
|
|
```bash
|
|
|
|
|
|
# Проверьте доступ к Storj
|
|
|
|
|
|
aws s3 ls --endpoint-url=https://gateway.storjshare.io \
|
|
|
|
|
|
--profile storj
|
|
|
|
|
|
|
|
|
|
|
|
# Проверьте доступ к AWS
|
|
|
|
|
|
aws s3 ls --profile aws
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
**3. JWT validation failed**
|
|
|
|
|
|
```bash
|
2025-09-30 21:46:47 +03:00
|
|
|
|
# Проверьте JWT_SECRET_KEY
|
|
|
|
|
|
echo $JWT_SECRET_KEY
|
2025-09-02 12:32:15 +03:00
|
|
|
|
# Должен быть установлен и совпадать с core API
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
**4. Rate limiting не работает**
|
|
|
|
|
|
```bash
|
|
|
|
|
|
# Проверьте Redis keys
|
|
|
|
|
|
redis-cli KEYS "rate_limit:*"
|
|
|
|
|
|
# Должны появляться ключи при запросах
|
2025-08-02 00:18:09 +03:00
|
|
|
|
```
|