from __future__ import annotations import os from pathlib import Path from datetime import timedelta # ───────────────────────────────────────────────────────────── # 경로 기본값 # ───────────────────────────────────────────────────────────── BASE_DIR = Path(__file__).resolve().parent # 앱 데이터 루트(로그/업로드/백업 등) → 환경변수 APP_DATA_DIR 우선, 없으면 ./data DATA_DIR = Path(os.getenv("APP_DATA_DIR", BASE_DIR / "data")).resolve() # backend/instance 는 항상 유지 (DB 등) INSTANCE_DIR = BASE_DIR / "backend" / "instance" INSTANCE_DIR.mkdir(parents=True, exist_ok=True) # data/ 하위 보조 디렉토리 (DATA_DIR / "logs").mkdir(parents=True, exist_ok=True) (DATA_DIR / "uploads").mkdir(parents=True, exist_ok=True) (DATA_DIR / "temp_zips").mkdir(parents=True, exist_ok=True) (DATA_DIR / "xml").mkdir(parents=True, exist_ok=True) (DATA_DIR / "scripts").mkdir(parents=True, exist_ok=True) (DATA_DIR / "idrac_info").mkdir(parents=True, exist_ok=True) (DATA_DIR / "mac").mkdir(parents=True, exist_ok=True) (DATA_DIR / "guid_file").mkdir(parents=True, exist_ok=True) (DATA_DIR / "gpu_serial").mkdir(parents=True, exist_ok=True) (DATA_DIR / "mac_backup").mkdir(parents=True, exist_ok=True) (DATA_DIR / "server_list").mkdir(parents=True, exist_ok=True) (DATA_DIR / "temp_ip").mkdir(parents=True, exist_ok=True) class Config: """ 운영 시에는 환경변수(.env)로 민감정보를 설정하세요. DB는 기본적으로 backend/instance/site.db 를 사용합니다. """ # ── 보안 SECRET_KEY = os.environ.get("SECRET_KEY", "change-me") # 반드시 환경변수로 고정 권장 # ── Redfish REDFISH_TIMEOUT = int(os.environ.get("REDFISH_TIMEOUT", 15)) REDFISH_VERIFY_SSL = os.environ.get("REDFISH_VERIFY_SSL", "false").lower() == "true" # ── DB (환경변수 DATABASE_URL 있으면 그 값을 우선 사용) sqlite_path = (INSTANCE_DIR / "site.db").as_posix() SQLALCHEMY_DATABASE_URI = os.environ.get("DATABASE_URL", f"sqlite:///{sqlite_path}") SQLALCHEMY_TRACK_MODIFICATIONS = False # ── Telegram (미설정 시 기능 비활성처럼 동작) TELEGRAM_BOT_TOKEN = os.environ.get("TELEGRAM_BOT_TOKEN", "") TELEGRAM_CHAT_ID = os.environ.get("TELEGRAM_CHAT_ID", "") # ── 앱 폴더 경로 (문자열) UPLOAD_FOLDER = (DATA_DIR / "temp_ip").as_posix() BACKUP_FOLDER = (DATA_DIR / "backup").as_posix() TEMP_ZIP_FOLDER = (DATA_DIR / "temp_zips").as_posix() XML_FOLDER = (DATA_DIR / "xml").as_posix() SCRIPT_FOLDER = (DATA_DIR / "scripts").as_posix() IDRAC_INFO_FOLDER = (DATA_DIR / "idrac_info").as_posix() MAC_FOLDER = (DATA_DIR / "mac").as_posix() GUID_FOLDER = (DATA_DIR / "guid_file").as_posix() GPU_FOLDER = (DATA_DIR / "gpu_serial").as_posix() MAC_BACKUP_FOLDER = (DATA_DIR / "mac_backup").as_posix() SERVER_LIST_FOLDER = (DATA_DIR / "server_list").as_posix() LOG_FOLDER = (DATA_DIR / "logs").as_posix() # ── 업로드/파일 ALLOWED_EXTENSIONS = {"xml"} MAX_CONTENT_LENGTH = int(os.getenv("MAX_CONTENT_LENGTH", 10 * 1024 * 1024)) # 10MB # ── 페이지네이션/병렬 FILES_PER_PAGE = int(os.getenv("FILES_PER_PAGE", 32)) BACKUP_FILES_PER_PAGE = int(os.getenv("BACKUP_FILES_PER_PAGE", 3)) MAX_WORKERS = int(os.getenv("MAX_WORKERS", 60)) # ── 세션 PERMANENT_SESSION_LIFETIME = timedelta(minutes=int(os.getenv("SESSION_MINUTES", 30))) # ── SocketIO # threading / eventlet / gevent 중 선택. 기본은 threading (Windows 안정) SOCKETIO_ASYNC_MODE = os.getenv("SOCKETIO_ASYNC_MODE", "threading") # ───────────────────────────────────────────────────────── # ✅ 개발 환경에서 쿠키 저장/리다이렉트 문제 방지용 설정 # 로컬(HTTP)에서도 세션/remember 토큰이 저장되도록 Secure 비활성 SESSION_COOKIE_SECURE = False REMEMBER_COOKIE_SECURE = False SESSION_COOKIE_SAMESITE = "Lax" SESSION_COOKIE_DOMAIN = None