marimo run _ 앱 모드 이해
PART 07 Ch 04에서 marimo run app.py를 처음 실행했습니다. 코드가 숨겨지고 위젯과 차트만 보이는 앱 화면이 등장했습니다. 기본 포트 2718으로 로컬 브라우저에서 접근했고, Ctrl + C로 종료했습니다. 그 내용은 이미 다뤘습니다.
이 챕터는 그 경험을 배포 관점으로 확장합니다. 혼자 로컬에서 쓸 때와 팀원이나 고객이 접근할 때는 고려할 사항이 달라집니다.
외부 접근을 허용하는 방법
기본 실행은 localhost에서만 동작합니다. 같은 컴퓨터 안에서만 접근할 수 있다는 뜻입니다. 팀 내부 서버나 Docker 컨테이너에서 앱을 실행하고 외부에서 접근하려면 --host 옵션이 필요합니다.
marimo run app.py --host 0.0.0.0 --port 8080
--host 0.0.0.0은 서버의 모든 네트워크 인터페이스에서 접속을 받겠다는 의미입니다. 서버 IP 주소나 도메인을 통해 외부에서 http://서버주소:8080으로 접근할 수 있게 됩니다.
포트는 원하는 번호로 바꿀 수 있습니다. 80이나 443(HTTPS)처럼 시스템 포트는 관리자 권한이 필요할 수 있으므로, 8080처럼 높은 번호 포트를 쓰고 리버스 프록시(nginx 등)로 앞단을 처리하는 방식이 일반적입니다. Ch 04에서 그 구조를 다룹니다.
여러 사용자가 접근하면 어떻게 되는가
이 질문은 배포 전에 반드시 생각해야 합니다.
marimo의 앱 모드는 세션 기반입니다. 사용자 A가 브라우저를 열면 A를 위한 Python 실행 컨텍스트가 생성됩니다. 사용자 B가 다른 브라우저에서 같은 URL을 열면 B를 위한 별도 컨텍스트가 생성됩니다. A가 슬라이더를 움직여도 B의 화면에 영향을 주지 않습니다.
이런 구조 덕분에 기본적인 사용자 간 상태 격리가 이루어집니다. 단, 이것은 프로세스 수준의 격리가 아닙니다. 파일 시스템을 공유하는 코드가 있다면, 예를 들어 특정 경로에 파일을 저장하거나 읽는 코드가 있다면, 여러 사용자가 같은 파일에 동시에 접근할 수 있습니다. 배포 전에 앱 코드에 공유 자원이 있는지 확인하세요.
인증 없음 — 이것이 핵심 주의사항
marimo run은 기본적으로 인증을 제공하지 않습니다. --host 0.0.0.0으로 열고 포트가 외부에 노출되어 있으면, URL을 아는 사람이라면 누구든 앱에 접근할 수 있습니다.
http://서버IP:8080 ← URL을 아는 사람이라면 누구든 접근 가능
신뢰할 수 있는 내부 네트워크(사내 VPN, 팀 내부 LAN 등)에서만 사용한다면 이 상태로 충분할 수 있습니다. 그러나 인터넷에 공개하거나 민감한 데이터를 다루는 앱이라면 반드시 접근 제어 레이어를 앞에 두어야 합니다. nginx 같은 리버스 프록시에 HTTP 기본 인증을 걸거나, 클라우드 플랫폼의 접근 제어 기능을 활용하는 방법이 있습니다.
요약하면, marimo가 앱 서버 역할을 담당하고, 인증이나 HTTPS는 그 앞에 별도 레이어로 추가하는 구조로 설계해야 합니다.
배포 모드별 비교
배포 관점에서 각 옵션이 의미하는 바를 정리합니다.
| 실행 방법 | 대상 | 상태 격리 | 비고 |
|---|---|---|---|
marimo run app.py |
혼자 로컬 | 해당 없음 | 기본 포트 2718 |
marimo run app.py --host 0.0.0.0 --port 8080 |
팀 내부 서버 | 세션 단위 격리 | 방화벽/VPN 함께 구성 권장 |
Docker + marimo run |
서버/클라우드 | 세션 단위 격리 | Ch 04에서 다룸 |
| WASM 내보내기 | 브라우저 단독 실행 | 사용자 브라우저 내부 | 서버 불필요, Ch 02에서 다룸 |
다음 단계
marimo run으로 서버를 직접 실행하는 방법은 이 정도로 충분합니다. 이제 서버가 전혀 없어도 앱을 배포하는 방법을 살펴볼 차례입니다. 다음 챕터에서는 노트북을 브라우저 단독 실행 HTML 파일로 변환하는 WASM 내보내기를 다룹니다.
정리
--host 0.0.0.0 --port 8080옵션을 추가하면 서버 외부에서 앱에 접근할 수 있습니다.- marimo 앱 모드는 사용자 세션 단위로 Python 실행 컨텍스트를 분리합니다. 슬라이더 값 같은 위젯 상태는 사용자마다 독립적입니다.
marimo run은 기본적으로 사용자 인증을 제공하지 않습니다. 신뢰할 수 없는 네트워크에 공개하려면 리버스 프록시 또는 플랫폼 수준의 접근 제어를 함께 구성해야 합니다.