88 lines
3.4 KiB
Python
88 lines
3.4 KiB
Python
import os
|
|
from dotenv import load_dotenv
|
|
|
|
load_dotenv()
|
|
|
|
class Config:
|
|
SECRET_KEY = os.environ.get('SECRET_KEY', 'dev-secret-change-me')
|
|
SQLALCHEMY_TRACK_MODIFICATIONS = False
|
|
WTF_CSRF_ENABLED = True
|
|
|
|
DATABASE_URL = os.environ.get('DATABASE_URL', '')
|
|
SQLALCHEMY_DATABASE_URI = DATABASE_URL
|
|
|
|
GROQ_API_KEY = os.environ.get('GROQ_API_KEY', '')
|
|
GROQ_MODEL = os.environ.get('GROQ_MODEL', 'llama-3.3-70b-versatile')
|
|
|
|
UPLOAD_FOLDER = os.environ.get('UPLOAD_FOLDER', '/home/pfm/app/uploads')
|
|
MAX_CONTENT_LENGTH = int(os.environ.get('MAX_CONTENT_LENGTH', 10485760))
|
|
|
|
APP_CURRENCY = os.environ.get('APP_CURRENCY', 'USD')
|
|
APP_CURRENCY_SYMBOL = os.environ.get('APP_CURRENCY_SYMBOL', '$')
|
|
APP_TIMEZONE = os.environ.get('APP_TIMEZONE', 'Asia/Ho_Chi_Minh')
|
|
|
|
ALLOWED_EXTENSIONS = {'png', 'jpg', 'jpeg', 'gif', 'pdf'}
|
|
|
|
# Teller
|
|
TELLER_APP_ID = os.environ.get('TELLER_APP_ID', '')
|
|
TELLER_ENV = os.environ.get('TELLER_ENV', 'development')
|
|
TELLER_CERT_PATH = os.environ.get('TELLER_CERT_PATH', '/home/pfm/teller/certificate.pem')
|
|
TELLER_KEY_PATH = os.environ.get('TELLER_KEY_PATH', '/home/pfm/teller/private_key.pem')
|
|
TELLER_WEBHOOK_SECRET = os.environ.get('TELLER_WEBHOOK_SECRET', '')
|
|
|
|
# Schwab Developer API (OAuth 2.0)
|
|
SCHWAB_CLIENT_ID = os.environ.get('SCHWAB_CLIENT_ID', '')
|
|
SCHWAB_CLIENT_SECRET = os.environ.get('SCHWAB_CLIENT_SECRET', '')
|
|
SCHWAB_REDIRECT_URI = os.environ.get('SCHWAB_REDIRECT_URI',
|
|
'https://pfm.ngodanguyen.tech/schwab/callback')
|
|
|
|
# Sentry error monitoring (optional — leave blank to disable)
|
|
SENTRY_DSN = os.environ.get('SENTRY_DSN', '')
|
|
|
|
# Rate limiter shared storage (use Redis in production to share limits across Gunicorn workers)
|
|
# Example: RATELIMIT_STORAGE_URI=redis://localhost:6379
|
|
RATELIMIT_STORAGE_URI = os.environ.get('RATELIMIT_STORAGE_URI', 'memory://')
|
|
|
|
# Session idle timeout in minutes (default 60)
|
|
SESSION_IDLE_MINUTES = int(os.environ.get('SESSION_IDLE_MINUTES', 60))
|
|
|
|
# Budget alert emails (optional — all four must be set to enable)
|
|
SMTP_HOST = os.environ.get('SMTP_HOST', '')
|
|
SMTP_PORT = int(os.environ.get('SMTP_PORT', 587))
|
|
SMTP_USER = os.environ.get('SMTP_USER', '')
|
|
SMTP_PASSWORD = os.environ.get('SMTP_PASSWORD', '')
|
|
ALERT_EMAIL = os.environ.get('ALERT_EMAIL', '') # recipient address
|
|
APP_URL = os.environ.get('APP_URL', 'https://pfm.ngodanguyen.tech')
|
|
|
|
# Application log file (rotating, shared by all app.* loggers)
|
|
LOG_FILE_PATH = os.environ.get(
|
|
'LOG_FILE_PATH',
|
|
os.path.join(os.path.dirname(os.path.dirname(os.path.abspath(__file__))), 'logs', 'app.log')
|
|
)
|
|
LOG_MAX_BYTES = int(os.environ.get('LOG_MAX_BYTES', 10 * 1024 * 1024)) # 10 MB
|
|
LOG_BACKUP_COUNT = int(os.environ.get('LOG_BACKUP_COUNT', 5))
|
|
|
|
|
|
class DevelopmentConfig(Config):
|
|
DEBUG = True
|
|
SQLALCHEMY_DATABASE_URI = os.environ.get(
|
|
'DATABASE_URL',
|
|
'mysql+pymysql://pfm_user:password@localhost/pfm_db'
|
|
)
|
|
SQLALCHEMY_ECHO = False # set True to log SQL queries during dev
|
|
|
|
|
|
class ProductionConfig(Config):
|
|
DEBUG = False
|
|
SQLALCHEMY_ECHO = False
|
|
SESSION_COOKIE_SECURE = True
|
|
SESSION_COOKIE_HTTPONLY = True
|
|
SESSION_COOKIE_SAMESITE = 'Lax'
|
|
|
|
|
|
config = {
|
|
'development': DevelopmentConfig,
|
|
'production': ProductionConfig,
|
|
'default': DevelopmentConfig,
|
|
}
|