🚀 MVP: FastAPI + React форма с SMS верификацией
✅ Инфраструктура: PostgreSQL, Redis, RabbitMQ, S3 ✅ Backend: SMS сервис + API endpoints ✅ Frontend: React форма (3 шага) + SMS верификация
This commit is contained in:
@@ -3,10 +3,13 @@
|
||||
"""
|
||||
from pydantic_settings import BaseSettings
|
||||
from functools import lru_cache
|
||||
from typing import List
|
||||
|
||||
|
||||
class Settings(BaseSettings):
|
||||
# App
|
||||
# ============================================
|
||||
# APPLICATION
|
||||
# ============================================
|
||||
app_name: str = "ERV Insurance Platform"
|
||||
app_env: str = "development"
|
||||
debug: bool = True
|
||||
@@ -16,47 +19,144 @@ class Settings(BaseSettings):
|
||||
backend_url: str = "http://localhost:8100"
|
||||
frontend_url: str = "http://localhost:5173"
|
||||
|
||||
# PostgreSQL
|
||||
# ============================================
|
||||
# DATABASE (PostgreSQL)
|
||||
# ============================================
|
||||
postgres_host: str = "147.45.189.234"
|
||||
postgres_port: int = 5432
|
||||
postgres_db: str = "default_db"
|
||||
postgres_user: str = "gen_user"
|
||||
postgres_password: str = "2~~9_^kVsU?2\\S"
|
||||
|
||||
# Redis
|
||||
@property
|
||||
def database_url(self) -> str:
|
||||
"""Формирует URL для подключения к PostgreSQL"""
|
||||
return f"postgresql+asyncpg://{self.postgres_user}:{self.postgres_password}@{self.postgres_host}:{self.postgres_port}/{self.postgres_db}"
|
||||
|
||||
# ============================================
|
||||
# REDIS
|
||||
# ============================================
|
||||
redis_host: str = "localhost"
|
||||
redis_port: int = 6379
|
||||
redis_password: str = "CRM_Redis_Pass_2025_Secure!"
|
||||
redis_db: int = 0
|
||||
redis_prefix: str = "erv:"
|
||||
|
||||
# RabbitMQ
|
||||
@property
|
||||
def redis_url(self) -> str:
|
||||
"""Формирует URL для подключения к Redis"""
|
||||
if self.redis_password:
|
||||
return f"redis://:{self.redis_password}@{self.redis_host}:{self.redis_port}/{self.redis_db}"
|
||||
return f"redis://{self.redis_host}:{self.redis_port}/{self.redis_db}"
|
||||
|
||||
# ============================================
|
||||
# RABBITMQ
|
||||
# ============================================
|
||||
rabbitmq_host: str = "185.197.75.249"
|
||||
rabbitmq_port: int = 5672
|
||||
rabbitmq_user: str = "admin"
|
||||
rabbitmq_password: str = "tyejvtej"
|
||||
rabbitmq_vhost: str = "/"
|
||||
|
||||
# OCR Service
|
||||
ocr_api_url: str = "http://147.45.146.17:8001"
|
||||
@property
|
||||
def rabbitmq_url(self) -> str:
|
||||
"""Формирует URL для подключения к RabbitMQ"""
|
||||
return f"amqp://{self.rabbitmq_user}:{self.rabbitmq_password}@{self.rabbitmq_host}:{self.rabbitmq_port}{self.rabbitmq_vhost}"
|
||||
|
||||
# OpenRouter AI
|
||||
# ============================================
|
||||
# S3 STORAGE (Timeweb Cloud Storage)
|
||||
# ============================================
|
||||
s3_endpoint: str = "https://s3.timeweb.com"
|
||||
s3_bucket: str = "erv-platform-files"
|
||||
s3_access_key: str = "your_access_key_here"
|
||||
s3_secret_key: str = "your_secret_key_here"
|
||||
s3_region: str = "ru-1"
|
||||
|
||||
# ============================================
|
||||
# OCR SERVICE
|
||||
# ============================================
|
||||
ocr_api_url: str = "http://147.45.146.17:8001"
|
||||
ocr_api_key: str = ""
|
||||
|
||||
# ============================================
|
||||
# AI SERVICE (OpenRouter)
|
||||
# ============================================
|
||||
openrouter_api_key: str = "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"
|
||||
openrouter_base_url: str = "https://openrouter.ai/api/v1"
|
||||
openrouter_model: str = "google/gemini-2.0-flash-001"
|
||||
|
||||
# ============================================
|
||||
# FLIGHT APIs
|
||||
# ============================================
|
||||
# FlightAware
|
||||
flightaware_api_key: str = "Puz0cdxAHzAEqMRZwtdeqBUSm9naJfwK"
|
||||
flightaware_base_url: str = "https://aeroapi.flightaware.com/aeroapi"
|
||||
|
||||
# AviationStack (резервный)
|
||||
aviationstack_api_key: str = ""
|
||||
aviationstack_base_url: str = "http://api.aviationstack.com/v1"
|
||||
|
||||
# ============================================
|
||||
# NSPK BANKS API
|
||||
# ============================================
|
||||
nspk_banks_api_url: str = "https://qr.nspk.ru/proxyapp/c2bmembers.json"
|
||||
|
||||
# ============================================
|
||||
# SMS SERVICE (SigmaSMS)
|
||||
# ============================================
|
||||
sms_api_url: str = "https://online.sigmasms.ru/api/"
|
||||
sms_login: str = ""
|
||||
sms_password: str = ""
|
||||
sms_token: str = ""
|
||||
sms_sender: str = "lexpriority"
|
||||
sms_enabled: bool = True
|
||||
|
||||
# ============================================
|
||||
# VTIGER CRM (PHP Bridge)
|
||||
# ============================================
|
||||
crm_webservice_url: str = "http://crm.clientright.ru/webservice.php"
|
||||
crm_webform_url: str = "https://crm.clientright.ru/modules/Webforms/capture.php"
|
||||
crm_token: str = ""
|
||||
|
||||
# ============================================
|
||||
# RATE LIMITING
|
||||
# ============================================
|
||||
rate_limit_per_minute: int = 60
|
||||
rate_limit_per_hour: int = 1000
|
||||
|
||||
# ============================================
|
||||
# FILE UPLOAD
|
||||
# ============================================
|
||||
max_upload_size_mb: int = 50
|
||||
allowed_file_extensions: str = "pdf,jpg,jpeg,png,heic,heif,webp"
|
||||
|
||||
@property
|
||||
def allowed_extensions_list(self) -> List[str]:
|
||||
"""Список разрешенных расширений файлов"""
|
||||
return [ext.strip() for ext in self.allowed_file_extensions.split(",")]
|
||||
|
||||
# ============================================
|
||||
# CORS
|
||||
cors_origins: list = [
|
||||
"http://localhost:5173",
|
||||
"http://147.45.146.17:5173",
|
||||
"https://erv-claims.clientright.ru"
|
||||
]
|
||||
# ============================================
|
||||
cors_origins: str = "http://localhost:5173,http://147.45.146.17:5173,https://erv-claims.clientright.ru,http://crm.clientright.ru"
|
||||
|
||||
@property
|
||||
def cors_origins_list(self) -> List[str]:
|
||||
"""Список CORS origins"""
|
||||
if isinstance(self.cors_origins, str):
|
||||
return [origin.strip() for origin in self.cors_origins.split(",")]
|
||||
return self.cors_origins
|
||||
|
||||
# ============================================
|
||||
# LOGGING
|
||||
# ============================================
|
||||
log_level: str = "INFO"
|
||||
log_file: str = "/app/logs/erv_platform.log"
|
||||
|
||||
class Config:
|
||||
env_file = "../.env"
|
||||
case_sensitive = False
|
||||
extra = "ignore" # Игнорируем лишние поля из .env
|
||||
|
||||
|
||||
@lru_cache()
|
||||
@@ -66,3 +166,4 @@ def get_settings() -> Settings:
|
||||
|
||||
settings = get_settings()
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user