Initial project upload
This commit is contained in:
@@ -0,0 +1,114 @@
|
||||
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 / "system" / "logs").mkdir(parents=True, exist_ok=True)
|
||||
(DATA_DIR / "system" / "backup").mkdir(parents=True, exist_ok=True)
|
||||
(DATA_DIR / "system" / "archive").mkdir(parents=True, exist_ok=True)
|
||||
(DATA_DIR / "system" / "mac_backup").mkdir(parents=True, exist_ok=True)
|
||||
|
||||
(DATA_DIR / "temp" / "uploads").mkdir(parents=True, exist_ok=True)
|
||||
(DATA_DIR / "temp" / "zips").mkdir(parents=True, exist_ok=True)
|
||||
(DATA_DIR / "temp" / "staging").mkdir(parents=True, exist_ok=True)
|
||||
|
||||
(DATA_DIR / "repository" / "xml").mkdir(parents=True, exist_ok=True)
|
||||
(DATA_DIR / "repository" / "mac").mkdir(parents=True, exist_ok=True)
|
||||
(DATA_DIR / "repository" / "guid_file").mkdir(parents=True, exist_ok=True)
|
||||
(DATA_DIR / "repository" / "gpu_serial").mkdir(parents=True, exist_ok=True)
|
||||
|
||||
(DATA_DIR / "scripts").mkdir(parents=True, exist_ok=True)
|
||||
(DATA_DIR / "server_list").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}")
|
||||
|
||||
# DB 연결 안정성 옵션 (SQLite 락/쓰레드 문제 완화)
|
||||
SQLALCHEMY_ENGINE_OPTIONS = {
|
||||
"pool_pre_ping": True,
|
||||
"pool_recycle": 280,
|
||||
}
|
||||
if SQLALCHEMY_DATABASE_URI.startswith("sqlite"):
|
||||
SQLALCHEMY_ENGINE_OPTIONS["connect_args"] = {"check_same_thread": False}
|
||||
|
||||
SQLALCHEMY_TRACK_MODIFICATIONS = False
|
||||
|
||||
# ── Telegram (미설정 시 기능 비활성처럼 동작)
|
||||
TELEGRAM_BOT_TOKEN = os.environ.get("TELEGRAM_BOT_TOKEN", "")
|
||||
TELEGRAM_CHAT_ID = os.environ.get("TELEGRAM_CHAT_ID", "")
|
||||
|
||||
# ── 앱 폴더 경로 (문자열)
|
||||
# [Restructured]
|
||||
UPLOAD_FOLDER = (DATA_DIR / "temp" / "uploads").as_posix()
|
||||
BACKUP_FOLDER = (DATA_DIR / "system" / "backup").as_posix()
|
||||
TEMP_ZIP_FOLDER = (DATA_DIR / "temp" / "zips").as_posix()
|
||||
|
||||
XML_FOLDER = (DATA_DIR / "repository" / "xml").as_posix() # Assuming xml fits in repository
|
||||
SCRIPT_FOLDER = (DATA_DIR / "scripts").as_posix()
|
||||
|
||||
# Staging area for collection results
|
||||
IDRAC_INFO_FOLDER = (DATA_DIR / "temp" / "staging").as_posix()
|
||||
|
||||
# Final repositories
|
||||
MAC_FOLDER = (DATA_DIR / "repository" / "mac").as_posix()
|
||||
GUID_FOLDER = (DATA_DIR / "repository" / "guid_file").as_posix()
|
||||
GPU_FOLDER = (DATA_DIR / "repository" / "gpu_serial").as_posix()
|
||||
MAC_BACKUP_FOLDER = (DATA_DIR / "system" / "mac_backup").as_posix()
|
||||
ARCHIVE_FOLDER = (DATA_DIR / "system" / "archive").as_posix()
|
||||
|
||||
SERVER_LIST_FOLDER = (DATA_DIR / "server_list").as_posix() # Keep as is for now or move to repo?
|
||||
LOG_FOLDER = (DATA_DIR / "system" / "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", 35))
|
||||
BACKUP_FILES_PER_PAGE = int(os.getenv("BACKUP_FILES_PER_PAGE", 10))
|
||||
MAX_WORKERS = int(os.getenv("MAX_WORKERS", 60))
|
||||
|
||||
# ── 세션
|
||||
PERMANENT_SESSION_LIFETIME = timedelta(minutes=int(os.getenv("SESSION_MINUTES", 30)))
|
||||
SESSION_PERMANENT = True # 브라우저 닫아도 세션 유지 (타임아웃까지)
|
||||
|
||||
# ── 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
|
||||
Reference in New Issue
Block a user