GodSpeed / src /config.py
AdithyaVardan's picture
fix: use SameSite=None; Secure on HF Spaces to allow cross-site iframe cookies
7e328e2
"""Project configuration from environment variables."""
import os
from pydantic_settings import BaseSettings
from pydantic import Field
class RedisSettings(BaseSettings):
"""Redis configuration."""
host: str = Field(default="localhost")
port: int = Field(default=6379)
db: int = Field(default=0)
password: str = Field(default="")
class CelerySettings(BaseSettings):
"""Celery configuration."""
broker_url: str = Field(default="redis://localhost:6379/1")
result_backend: str = Field(default="redis://localhost:6379/2")
task_serializer: str = Field(default="json")
result_serializer: str = Field(default="json")
accept_content: list = Field(default=["json"])
timezone: str = Field(default="UTC")
enable_utc: bool = Field(default=True)
task_track_started: bool = Field(default=True)
task_time_limit: int = Field(default=3600)
task_soft_time_limit: int = Field(default=3300)
class SyncSettings(BaseSettings):
"""Data source sync configuration."""
# Polling intervals (seconds)
slack_poll_interval: int = Field(default=900) # 15 minutes
github_poll_interval: int = Field(default=3600) # 1 hour
jira_poll_interval: int = Field(default=3600)
logs_poll_interval: int = Field(default=300) # 5 minutes
metrics_poll_interval: int = Field(default=900) # 15 minutes
error_traces_poll_interval: int = Field(default=600) # 10 minutes
business_data_poll_interval: int = Field(default=3600) # 1 hour
# Retry settings
max_retries: int = Field(default=3)
retry_backoff_seconds: int = Field(default=60)
# Monitored services for log aggregation
monitored_services: list = Field(default=["api-backend", "worker-queue", "scheduler"])
class IntegrationSettings(BaseSettings):
"""Integration credentials and endpoints."""
# Slack
slack_bot_token: str = Field(default="")
slack_signing_secret: str = Field(default="")
# GitHub
github_token: str = Field(default="")
github_webhook_secret: str = Field(default="")
# Jira
jira_instance_url: str = Field(default="")
jira_username: str = Field(default="")
jira_api_token: str = Field(default="")
# Web scraping
web_scraper_timeout: int = Field(default=30)
web_scraper_max_content_size: int = Field(default=10 * 1024 * 1024) # 10MB
user_agent: str = Field(default="Godspeed-Bot/1.0")
# Logging
log_file_paths: dict = Field(default={"api": "/var/log/api.log", "worker": "/var/log/worker.log"})
class Config:
env_file = ".env"
case_sensitive = False
extra = "ignore"
class Settings(BaseSettings):
"""Root configuration object."""
# App
app_name: str = Field(default="Godspeed")
debug: bool = Field(default=False)
# Supabase (shared with ingestion layer; leave blank for local-only dev)
supabase_url: str = Field(default="")
supabase_key: str = Field(default="")
# Flat Redis URL used by health check and async Redis clients
redis_url: str = Field(default="redis://localhost:6379/0")
# Qdrant — local: leave qdrant_url empty and use host+port.
# Hosted (Qdrant Cloud): set qdrant_url=https://xyz.cloud.qdrant.io:6333
# and qdrant_api_key to your cluster API key.
qdrant_host: str = Field(default="localhost")
qdrant_port: int = Field(default=6333)
qdrant_url: str = Field(default="") # overrides host+port when non-empty
qdrant_api_key: str = Field(default="") # required for Qdrant Cloud
# Auth (dev credentials — override in .env)
demo_email: str = Field(default="demo@godspeed.local")
demo_password: str = Field(default="demo")
admin_email: str = Field(default="admin@godspeed.local")
admin_password: str = Field(default="admin")
# Set True when running behind HTTPS so session cookies are Secure
cookie_secure: bool = Field(default=False)
# SameSite=none required when app is embedded in an iframe on a different domain (e.g. HF Spaces)
cookie_samesite: str = Field(default="lax")
# Google OAuth2 / SSO
google_oauth_client_id: str = Field(default="")
google_oauth_client_secret: str = Field(default="")
google_oauth_redirect_uri: str = Field(default="http://localhost:8000/api/auth/google/callback")
frontend_url: str = Field(default="http://localhost:3000")
# SMTP — leave smtp_host/smtp_user blank to disable email sending
smtp_host: str = Field(default="")
smtp_port: int = Field(default=587)
smtp_user: str = Field(default="")
smtp_password: str = Field(default="")
smtp_from: str = Field(default="noreply@godspeed.local")
# CORS — comma-separated list of allowed origins.
# NOTE: cannot be "*" when allow_credentials=True (CORS spec requirement).
cors_origins: str = Field(default="http://localhost:5173,http://localhost:3000")
# Services
redis: RedisSettings = Field(default_factory=RedisSettings)
celery: CelerySettings = Field(default_factory=CelerySettings)
sync: SyncSettings = Field(default_factory=SyncSettings)
integrations: IntegrationSettings = Field(default_factory=IntegrationSettings)
class Config:
env_file = ".env"
nested_delimiter = "__"
case_sensitive = False
extra = "ignore"
# Load settings
settings = Settings()