CoolFace
Apppublic

korea-standards-association/barrier-free-dashboard

sourceHugging Faceupdated 2mo agoView on Hugging Face
0likes
App README
ℹ️ HF가 네이티브 streamlit SDK를 폐지(API가 gradio/docker/static만 허용)하여 Docker SDK로 실행한다. Dockerfile이 requirements 설치 후 Streamlit을 8501 포트로 구동(app_port: 8501). 비root(uid 1000) 사용자.

무장애 관광정보 수집 대시보드 — HF Spaces 배포 안내

KTO「2026년 전국 무장애 관광정보 수집」 운영 대시보드(Streamlit + SQLite). 이 디렉터리(app/)가 Hugging Face Public Space(로그인 보호)의 리포지토리 루트가 된다. 무거운 데이터 파이프라인은 로컬에서 돌리고, 호스팅 앱은 읽기 + 경량 쓰기(상태·연락처·배정·계정·POI 추가) 전용으로 운영한다.

⚠️ 영속성 — 버킷 스냅샷/복원 (HF가 $5 영속 디스크를 폐지, 2026-03)

HF 무료 티어 파일시스템은 휘발성이라 슬립/재시작 시 쓰기가 소실된다(현장 입력 전부 유실). HF는 기존 "$5/월 Persistent Storage 디스크(/data)"를 폐지하고 Storage Buckets(NFS/FUSE) 볼륨 마운트로 대체했다. 버킷에 라이브 read-write SQLite를 직접 두면 NFS 잠금/랜덤쓰기로 손상 위험이다. 그래서 이 앱은 DB를 런타임 로컬 디스크(`/tmp`, POSIX 안전)에서 동작시키고, 버킷은 부팅 시 복원 + 쓰기 후 전체파일 스냅샷의 영속 저장소로만 쓴다 (db.ensure_runtime_db / db.snapshot_durable). 무료 사설 저장 100GB 한도 내라 비용 0.

배포 단계 (Space Settings)

  1. 1.사설 버킷 생성 + 클린 DB 시딩 — 로컬에서 py -3.11 data/build_db.py로 dashboard.db 빌드 후 hf buckets create <USER>/<BUCKET> --private → python deploy/reseed.py --initial --bucket <USER>/<BUCKET> (버킷 루트가 Space /data로 마운트되므로 파일이 /data/dashboard.db가 됨).
  2. 2.버킷을 RW 마운트 — Settings → Storage Buckets → 버킷 선택, mount path /data, access read-write.
  3. 3.Secrets / Variables (Settings → Variables and secrets):
  4. 4.DASHBOARD_DB_PATH = /tmp/dashboard.db (런타임 로컬·POSIX 안전)
  5. 5.DASHBOARD_DURABLE_PATH = /data/dashboard.db (버킷 마운트 = 영속)
  6. 6.DASHBOARD_PASSWORD = <강한 부트스트랩 비밀번호> (기본 kto2026 사용 금지)
  7. 7.KAKAO_JS_KEY = <카카오맵 JS 키>
  8. 8.KAKAO_REST_API_KEY = <카카오 REST 키> (POI 추가 지오코딩용, 선택)
  9. 9.ENABLE_LOCAL_PIPELINES = 0 (CONLAB 크롤링·5510 커스터마이징 비활성 — 로컬 전용)
  10. 10.데이터 갱신(재시딩) — 로컬 재빌드(5510/크롤) 후 현장 입력을 덮어쓰지 않도록 python deploy/reseed.py --bucket <USER>/<BUCKET> 한 번으로 download→rebuild(보존)→검증→upload. 저트래픽 시간대(밤·주말) 권장. (deploy/는 로컬 전용 — HF Space에 업로드하지 않음.)

운영 안정성 — 공개 설정·가용성 (2026-06-23)

  • —공개 설정 = Public. .hf.space 직접 주소로 HF 크롬(탭·빌드 표시) 없이 접속: https://korea-standards-association-barrier-free-dashboard.hf.space 코드·로그인 화면만 공개되며 DB·버킷은 별도 비공개 저장소(노출 없음). 전환은 HF UI Settings의 'Change Space visibility' 토글 또는 py -3.11 deploy/set_visibility.py --public.
  • —Public이므로 로그인 노출 → 강한 `DASHBOARD_PASSWORD` 필수 + auth.py 로그인 시도 제한 (이름별 연속 실패 잠금 + 실패 지연, 인메모리). 회귀 tests/_test_login_throttle.py.
  • —콜드 빌드 멈춤 방지 (2026-06-22 수시간 Building 사고 대응). 무료 티어는 48h 무사용 시 절전 → 깨울 때 콜드 재빌드인데, 무거운 의존성이 미고정이면 콜드 빌드가 느려지거나 멈춘다. 대응: 1) requirements.txt 버전 고정(`==`) — 콜드 빌드 2~3분·재현성(분기 1회 수동 bump 후 로컬 스모크). 2) keep-alive — 외부 무료 모니터(UptimeRobot 등)가 /_stcore/health를 5분 간격 핑 → 절전 자체 차단(PC 무관). 보완: deploy/keep_alive.py + Windows 작업 스케줄러(6h). 3) 코드 배포는 야간/저트래픽 시간대에만 (재빌드 = 통제 가능한 유일 트리거).
  • —코드만 반영: py -3.11 deploy/publish_code_to_HF.py <파일...> -m "..." (지정 파일 원자 커밋).

로컬 실행

bash
cd app && py -3.11 -m streamlit run app.py
# PW=DASHBOARD_PASSWORD env 필수(.env 또는 환경변수). 기본 DB=app/data/dashboard.db

로컬 전용 파이프라인 (호스팅에서 비활성)

ENABLE_LOCAL_PIPELINES=0이면 🌐 CONLAB 크롤링 현행화·🛠️ 5510 커스터마이징·DB 재빌드 버튼이 비활성화된다(이들은 scripts/·마스터 CSV·외부 IP에 의존). 관리자 PC(로컬) 에서 실행한 뒤 갱신된 dashboard.db를 영속 스토리지에 재업로드한다.