docker-back
메인 인덱스 | bob-yamong
실행 골격
main.py는 FastAPI를 root_path=/api/v1로 띄우고, CORSMiddleware를 전체 허용으로 붙인 뒤 routes에서 모은 router를 한 번에 주입합니다.
__main__ 진입점은 uvicorn.run("main:app", host="0.0.0.0", port=8000, workers=4)입니다.
routes/__init__.py는 routes/*.py를 디렉터리 스캔해서 각 모듈의 router를 동적으로 import합니다.
요청 흐름
server_route.py는 /server에서 서버 생성, 목록 조회, 이름 수정을 제공합니다.
container_route.py는 /container에서 컨테이너 추가, 서버별 조회, 상세 조회, 태그 추가 및 갱신을 분리합니다.
heartbeat_route.py는 KAFKA_BROKERS가 설정되면 EventManager("heartbeat")를 시작하고, Kafka 메시지를 SSEManager로 전달해 /heartbeat/stream으로 내보냅니다.
- 같은 모듈에서
/heartbeat/server/{server_id}, /heartbeat/container/{container_id}, /heartbeat/simple/{server_id} 통계 조회를 제공합니다.
log_route.py는 EventManager("lsm")를 붙여 /log/lsm_stream SSE를 열고, /log/lsm과 /log/container/{container_id}에서 로그를 조회합니다.
policy_route.py는 create -> upload -> apply -> predefined -> delete 흐름으로 정책을 다룹니다. parse_yaml_raw_as로 YAML을 PolicyCreateReq로 파싱하고, /policy/apply/{server_id}와 /policy/predefined에서 적용 흐름을 분리합니다.
정책 흐름
create_custom_policy()는 정책 이름 중복을 먼저 확인한 뒤 Policy를 만들고, RawTracePointPolicy, TracepointPolicy, LsmFilePolicy, LsmNetPolicy, LsmProcPolicy를 순서대로 적재합니다.
apply_predefined_policy()는 기존 정책을 timestamp가 붙은 새 이름으로 복사한 뒤, 선택한 컨테이너에 다시 연결합니다.
get_server_policy()는 서버에 연결된 정책을 조회하고, delete_policy()는 정책 이름 기준으로 제거합니다.
KafkaSender.send_message()는 정책 본문을 Kafka policy 토픽으로 보낼 때 사용됩니다.
데이터 모델
- 핵심 엔티티는
Server, Container, Heartbeat, ContainerLog, LsmLog, Policy, SystemInfo입니다.
- 관계 테이블로는
InternalContainerId, PolicyContainer, ContainerTag가 사용됩니다.
Policy는 LsmFilePolicy, LsmNetPolicy, LsmProcPolicy, RawTracePointPolicy, TracepointPolicy와 연결됩니다.
메시지와 스트림
utils/queue_eventmanager.py는 KafkaConsumer/KafkaProducer를 감싸고 topic별 subscriber와 send_message()를 제공합니다.
utils/sse_manager.py는 topic별 asyncio.Queue를 유지해 Kafka 이벤트를 SSE 클라이언트로 팬아웃합니다.
heartbeat_route.py와 log_route.py는 같은 패턴으로 Kafka 입력을 SSE 출력으로 변환합니다.
의존성
requirements.txt에는 fastapi, SQLAlchemy, psycopg2-binary, kafka-python-ng, sse-starlette, uvicorn, pydantic_yaml, ruamel.yaml, python-multipart가 들어갑니다.