8.4 KiB
8.4 KiB
FlaskFarm 프로젝트 구조 및 흐름 분석
이 프로젝트는 Flask 기반의 플러그인 확장 가능한 웹 프레임워크입니다.
1. 전체 아키텍처
main.py (진입점)
↓
framework.initialize()
↓
├─ Framework 초기화 (Singleton)
├─ Flask App 생성
├─ 시스템 모듈 로딩
└─ 플러그인 동적 로딩
↓
Flask Server 시작
2. 핵심 컴포넌트
A. Framework (lib/framework/)
싱글톤 패턴으로 구현된 핵심 프레임워크:
-
init_main.py: Framework 클래스 - 모든 컴포넌트의 중앙 관리자
- Flask, Celery, SQLAlchemy, SocketIO, Scheduler, Redis 초기화
- 로깅 시스템 설정
- config.yaml 기반 설정 관리
-
init_plugin.py: PluginManager - 플러그인 동적 로딩
data/plugins/폴더에서 플러그인 자동 발견path_dev설정으로 개발 플러그인 경로 지원- 플러그인 화이트리스트/블랙리스트 필터링
-
scheduler.py: APScheduler 래퍼
- Interval/Cron 기반 스케줄링
- Job 인스턴스 생명주기 관리
- gevent/threading 모드 지원
B. Plugin 시스템 (lib/plugin/)
플러그인 구조 (3계층):
Plugin
└─ Module (기능 그룹)
└─ Page (세부 페이지)
주요 파일:
-
create_plugin.py: PluginBase 클래스
info.yaml에서 메타데이터 로드- Blueprint 등록 (URL prefix:
/플러그인명/) - DB 바인딩 (SQLite per plugin)
- ModelSetting으로 설정 관리
-
logic_module_base.py: PluginModuleBase
- 모듈별 라우팅 (menu, ajax, command, api)
- 스케줄러 통합
- 페이지 리스트 관리
C. System 모듈 (lib/system/)
내장 시스템 기능:
- mod_setting: 일반 설정, 웹, 인증, 알림 등
- mod_plugin: 플러그인 관리 UI
- mod_log: 전체 로그 뷰어
- mod_tool: Command, 업로드, Python REPL 등
3. 실행 흐름
시작 단계
-
main.py 실행
- gevent monkey patching
- Celery 환경변수 설정
framework.initialize()호출
-
Framework 초기화
F = Framework.get_instance() # Singleton F.__initialize()- config.yaml 로드
- 로깅 시스템 구성
- Flask app 생성
- DB 초기화 (system + 각 플러그인)
- Scheduler, SocketIO, Celery 설정
-
시스템 모듈 로딩
F.initialize_system()- system 패키지에서 기본 모듈 로드
- 라우트 등록
-
플러그인 로딩
F.initialize_plugin()- PluginManager가 플러그인 목록 수집
- 각 플러그인 info.yaml 파싱
- setup.py에서 Plugin 인스턴스 생성
- 모듈/페이지 초기화
- DB 마이그레이션
- 자동시작 설정된 스케줄러 등록
-
서버 시작
frame.start()- SocketIO 서버 실행 (gevent 또는 threading 모드)
4. 플러그인 개발 패턴
플러그인 구조 예시 (ffmpeg):
ffmpeg/
├── info.yaml # 메타데이터
├── __init__.py # 플러그인 엔트리포인트
├── setup.py # P = create_plugin_instance(setting)
├── mod_download.py # Module 구현
└── templates/ # Jinja2 템플릿
라우팅 자동 생성:
/ffmpeg/download/list→mod_download.process_menu('list')/ffmpeg/download/ajax/<sub>→mod_download.process_ajax(sub)
5. 데이터 흐름
설정 관리
config.yaml (글로벌)
↓
Framework.config (딕셔너리)
↓
각 플러그인의 ModelSetting (DB 저장)
데이터 저장
path_data/
├── db/
│ ├── system.db # 시스템 설정
│ ├── ffmpeg.db # 플러그인별 DB
│ └── ...
├── log/ # 로테이션 로그
├── plugins/ # 설치된 플러그인
└── tmp/ # 임시 파일
6. 비동기 작업 (Celery)
- Redis를 브로커로 사용
- 각 모듈에서
@celery.task데코레이터로 정의 plugin_load_celery()훅으로 초기화- 백그라운드 작업 처리 (다운로드, 인코딩 등)
7. 스케줄링
Job 인스턴스 생성
↓
Scheduler.add_job_instance()
↓
APScheduler에 등록 (Interval/Cron)
↓
자동 실행 (랜덤 딜레이 포함)
- 모듈별
auto_start설정 - DB 자동 삭제 기능 (
db_auto_delete) - 실시간 상태 모니터링
8. 주요 기능
✅ 플러그인 시스템: 동적 로드/언로드
✅ 멀티 DB: SQLite per plugin
✅ 실시간 통신: SocketIO
✅ 스케줄링: Interval/Cron 작업
✅ 인증: Flask-Login
✅ 알림: 텔레그램, 디스코드 지원
✅ 로그 뷰어: 웹 기반 실시간 로그
✅ 파일 관리: 업로드, 다운로드, 편집 (flaskcode)
9. 설정 우선순위
- 환경변수 (REDIS_PORT 등)
- config.yaml
- DB의 SystemModelSetting
- 플러그인별 ModelSetting
10. 디렉토리 구조
flaskfarm/
├── main.py # 애플리케이션 진입점
├── config.yaml # 글로벌 설정
├── lib/ # 핵심 라이브러리
│ ├── framework/ # 프레임워크 코어
│ │ ├── init_main.py # Framework 클래스 (Singleton)
│ │ ├── init_plugin.py # PluginManager
│ │ ├── init_route.py # 글로벌 라우팅
│ │ ├── scheduler.py # 스케줄러
│ │ └── ...
│ ├── plugin/ # 플러그인 베이스
│ │ ├── create_plugin.py # PluginBase 클래스
│ │ ├── logic_module_base.py
│ │ ├── route.py # 플러그인 라우팅
│ │ └── ...
│ ├── system/ # 시스템 모듈
│ │ ├── mod_setting.py # 설정 관리
│ │ ├── mod_plugin.py # 플러그인 관리
│ │ ├── mod_log.py # 로그 뷰어
│ │ └── ...
│ ├── support/ # 공통 유틸리티
│ ├── tool/ # 도구 모음
│ └── tool_base/ # 기본 도구
├── data/ # 데이터 디렉토리
│ ├── db/ # SQLite 데이터베이스
│ ├── log/ # 로그 파일
│ ├── plugins/ # 설치된 플러그인
│ └── tmp/ # 임시 파일
└── files/ # 템플릿 파일
11. 플러그인 생명주기
1. 발견 (Discovery)
- PluginManager.get_plugin_name_list()
- data/plugins/ 또는 path_dev 스캔
2. 로딩 (Loading)
- info.yaml 파싱
- setup.py의 create_plugin_instance() 호출
- Blueprint 등록
- DB 바인딩
3. 초기화 (Initialization)
- plugin_load() 호출
- DB 마이그레이션
- 스케줄러 등록
- Celery 작업 등록
4. 실행 (Runtime)
- HTTP 요청 처리
- 스케줄 작업 실행
- SocketIO 이벤트 처리
5. 언로딩 (Unloading)
- plugin_unload() 호출
- 스케줄러 작업 제거
- 리소스 정리
12. 주요 API 엔드포인트
글로벌 엔드포인트
/→ 홈 (시스템 대시보드로 리다이렉트)/system/setting→ 시스템 설정/system/plugin→ 플러그인 관리/system/log→ 전체 로그/global/ajax/<sub>→ 공통 AJAX 처리
플러그인 엔드포인트 (예: ffmpeg)
/ffmpeg/→ 플러그인 홈/ffmpeg/<module>/<page>→ 모듈/페이지/ffmpeg/<module>/ajax/<sub>→ AJAX 요청/ffmpeg/<module>/command→ 커맨드 실행/ffmpeg/<module>/api/<sub>→ API 호출
결론
FlaskFarm은 플러그인을 통한 기능 확장에 최적화되어 있으며, 각 플러그인이 독립적인 DB, 스케줄러, 라우팅을 가지면서도 중앙 프레임워크의 공통 기능(로깅, 인증, 알림 등)을 활용할 수 있는 모듈식 웹 애플리케이션 플랫폼입니다.
주요 설계 원칙:
- 플러그인 독립성: 각 플러그인은 자체 DB와 설정을 가짐
- 확장성: 새로운 플러그인을 쉽게 추가 가능
- 중앙 관리: Framework 싱글톤을 통한 통합 관리
- 비동기 처리: Celery를 통한 백그라운드 작업
- 실시간 통신: SocketIO를 통한 양방향 통신