SiteStats
이용자에게 보여주는 공개 방문자 통계 플러그인입니다. 운영자 분석용 Analytics와 달리, 사이트 화면에 현재 방문자, 오늘 방문자, 전체 방문자, 인기페이지, 실시간 방문자 현황을 표시합니다.
상태
| 항목 | 값 |
|---|---|
| Layer | composite |
| Tier | L1 |
| Status | wip |
| Version | 0.1.0 |
| 가격 | Free |
| 카테고리 | Social |
Analytics와의 분리
| 플러그인 | 목적 | 데이터 흐름 |
|---|---|---|
Analytics | 운영자 분석 | GA4, Naver Analytics 등 외부 provider로 전송 |
SiteStats | 이용자 공개 표시 | 자체 Redis 집계 후 사이트 화면에 표시 |
SiteStats는 전환 이벤트 분석이나 광고 측정용이 아닙니다. 사이트 방문자에게 "지금 몇 명이 보고 있는지", "인기 페이지가 무엇인지"를 보여주는 소셜 프루프 영역입니다.
기능 토글
| feature | 내용 |
|---|---|
counters | 현재 / 오늘 / 전체 방문자 |
popular_pages | 인기페이지 Top N |
live_feed | 실시간 방문자 현황 |
dwell_time | 평균 체류시간 보조 지표 |
content_top | 인기 글 adapter, 후속 |
설치 / 활성화
프로젝트 composer.json에 SiteStats PSR-4 매핑이 있어야 합니다.
"App\\Plugins\\SiteStats\\": "app/Plugins/SiteStats/src/",
"App\\Plugins\\SiteStats\\Database\\": "app/Plugins/SiteStats/database/",
"App\\Plugins\\SiteStats\\Tests\\": "app/Plugins/SiteStats/tests/"
플러그인 provider가 활성화되면 route, view, lang, config, migration이 등록됩니다.
App\Plugins\SiteStats\Providers\SiteStatsServiceProvider::class
Blade 사용법
레이아웃의 </body> 직전에 beacon을 한 번 넣습니다.
<x-sitestats::beacon />
표시할 위치에 필요한 위젯을 배치합니다.
<x-sitestats::current />
<x-sitestats::today />
<x-sitestats::total />
<x-sitestats::popular :limit="10" />
<x-sitestats::live />
방문자 국가/언어 표시
Core가 요청 단위로 만든 visitor.context를 live feed에 함께 저장합니다.
| 필드 | 의미 |
|---|---|
country_code | KR, JP 같은 국가 코드 |
country_source | 기본 cloudflare |
locale_hint | 국가 기반 추정 locale |
resolved_locale | 실제 적용된 locale |
is_estimated | IP 기반 추정 여부 |
Cloudflare 프록시가 켜져 있으면 CF-IPCountry 헤더로 국가를 추정합니다. 헤더가 없거나 지원하지 않는 국가면 필드를 비운 채 기존 live feed만 표시합니다.
표시 예:
손님 🇯🇵 JP · ja /bible
이 값은 추정치입니다. VPN, 프록시, 해외 거주자 때문에 실제 언어 선호와 다를 수 있으므로 보안, 권한, 과금 판단에는 사용하지 않습니다.
관련 Core 설정
CORE_VISITOR_COUNTRY_DETECTION=true
CORE_VISITOR_COUNTRY_HEADER=CF-IPCountry
CORE_VISITOR_COUNTRY_SOURCE=cloudflare
국가 기반 locale hint는 ?lang, 로그인 사용자 설정, 세션, 브라우저 Accept-Language보다 낮은 우선순위입니다.
저장 구조
| 항목 | 저장소 |
|---|---|
| 현재 접속자 | Redis ZSET |
| 오늘/전체 unique | Redis HyperLogLog |
| 인기페이지 | Redis ZSET |
| live feed | Redis HASH |
| 누적 스냅샷 | DB snapshot table |
Redis live payload에는 원본 IP를 저장하지 않습니다. 국가 코드는 Core visitor.context에서 정규화된 값만 저장합니다.
보안 / 개인정보
- beacon POST는 same-origin + CSRF 토큰을 사용합니다.
- 봇은 JS beacon 미실행 + 서버측 UA 필터로 제외합니다.
- 원본 IP는 공개 표시용으로 저장하지 않습니다.
- Redis 키는 tenant key prefix로 분리합니다.
데모 / 문서 링크
- Platform plugin demo:
https://template.codebase.how/platform/plugin-demo/site-stats - Plugin Store:
https://store.codebase.how/plugins/site-stats - 운영 문서:
https://docs.codebase.how/operations/visitor-context-site-stats