Demo Flow

make demo/check는 source repo의 최소 end-to-end 흐름을 검증합니다.

1. 흐름

signal fixture
  -> signal-device-simulator
  -> POST /signal-packets
  -> patient-risk-python-api
  -> monitoring snapshot
  -> review queue
  -> patient-monitor-ui-core view model
  -> patient-monitor-react-components render
  -> clinical UI accessibility smoke
  -> alarm acknowledge/mute workflow

2. 검증하는 것

  • synthetic signal packet이 API로 전송되는지
  • Python API가 monitoring snapshot과 review queue를 만드는지
  • TypeScript UI core가 live API 응답을 ViewModel로 바꾸는지
  • React component가 waveform, numeric, risk, alarm state, clinician review queue를 렌더하는지
  • rendered App markup이 clinical landmark, waveform image role, alarm live region, review item semantic label을 유지하는지
  • acknowledge/mute action이 API를 통해 snapshot state로 되돌아오는지

3. 실행

3-1. In-memory demo

make demo/check

이 명령은 local 임시 포트를 사용합니다. 별도 서버를 미리 띄울 필요는 없습니다.

기본 demo는 Rust/PyO3 Python package를 현재 uv environment에 먼저 설치한 뒤 PATIENT_RISK_STORAGE_BACKEND=memory로 실행합니다. 따라서 local machine에는 Rust toolchain과 maturin build 경로가 필요합니다. Python API process 안의 in-memory repository가 signal packet, monitoring snapshot, review queue state를 들고 있으므로 가장 빠르게 end-to-end 흐름을 확인할 수 있습니다.

3-2. Storage-backed demo

PostgreSQL/Redis adapter까지 확인하려면 아래 명령을 사용합니다.

make demo/check/storage

make demo/check/storage는 Docker container로 PostgreSQL과 Redis를 띄운 뒤 같은 demo smoke를 PATIENT_RISK_STORAGE_BACKEND=postgres-redis로 실행하고, 완료되면 container와 demo volume을 정리합니다. 이때 signal packet과 review queue는 PostgreSQL에 저장되고, latest monitoring snapshot과 alarm state는 Redis에 저장됩니다.

기본 port는 local 개발에서 충돌을 줄이기 위해 아래처럼 잡습니다.

Store URL
PostgreSQL postgresql+psycopg://patient_risk:patient_risk@127.0.0.1:55432/patient_risk
Redis redis://127.0.0.1:56379/0

port를 바꾸고 싶으면 Make variable을 override합니다.

make demo/check/storage \
  DEMO_DATABASE_URL=postgresql+psycopg://patient_risk:patient_risk@127.0.0.1:15432/patient_risk \
  DEMO_REDIS_URL=redis://127.0.0.1:16379/0

Rust Python wheel 설치와 demo smoke는 서로 다른 uv 실행 인자를 받습니다. Nexus PyPI credential이 없는 local 환경에서는 Rust Python wheel 설치에 공개 PyPI index를 명시합니다.

make demo/check/storage \
  RUST_PYTHON_UV_RUN_ARGS="--default-index https://pypi.org/simple --index-strategy unsafe-best-match"

API process 자체에 추가 uv 인자가 필요하면 DEMO_UV_RUN_ARGS를 사용합니다. Nexus PyPI credential이 있는 CI 환경에서는 두 값을 비워 내부 proxy 경로를 검증할 수 있습니다.

이 저장소 topology는 local demo용입니다. 운영 schema migration, backup, PHI 보관 정책, Redis persistence policy는 CD/infra repo의 책임으로 둡니다.

3-3. 장시간 실행 demo

브라우저에서 직접 확인하려면 아래 명령을 사용합니다.

make demo/run

make demo/run은 아래 topology를 Docker Compose로 띄웁니다.

signal-device-simulator seed
  -> patient-risk-python-api
      -> PostgreSQL
      -> Redis
  -> patient-risk-web
      -> /api proxy
      -> patient-risk-python-api

기본 URL은 아래와 같습니다.

Service URL
Python API http://127.0.0.1:39080
Web UI http://127.0.0.1:39081

Web container는 browser CORS 문제를 피하기 위해 /apipatient-risk-python-api:8080으로 proxy합니다. Browser는 http://127.0.0.1:39081만 호출하고, nginx가 내부 compose network의 API로 전달합니다.

API container는 /healthz가 아니라 /readyz로 healthcheck를 수행합니다. 이 endpoint는 PostgreSQL과 Redis readiness를 확인하므로, Web container는 storage-backed API가 준비된 뒤 시작됩니다.

포트가 이미 사용 중이면 아래처럼 실행 포트를 바꿉니다. DEMO_API_URL은 simulator가 seed packet을 보낼 주소이므로 API port와 함께 맞춰야 합니다.

make demo/run \
  DEMO_API_PORT=39082 \
  DEMO_WEB_PORT=39083 \
  DEMO_API_URL=http://127.0.0.1:39082 \
  DEMO_WEB_URL=http://127.0.0.1:39083

종료하려면 아래 명령을 사용합니다.

make demo/stop

로그를 보려면 아래 명령을 사용합니다.

make demo/logs