Files
Personal-Finance-Management/app/config.py
T

94 lines
3.7 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', '')
# Plaid (sandbox / development / production)
PLAID_CLIENT_ID = os.environ.get('PLAID_CLIENT_ID', '')
PLAID_SECRET = os.environ.get('PLAID_SECRET', '')
# Valid values: sandbox, production (Plaid retired the 'development' environment)
PLAID_ENV = os.environ.get('PLAID_ENV', 'sandbox')
# 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,
}