Admin

Back to docs

Admin Dashboard

/admin은 사이트 운영자 전용 페이지입니다. 연구실 owner/admin 권한만으로는 접근할 수 없습니다.

접근 권한

  • User.isSiteAdmin = true 인 계정
  • 또는 SITE_ADMIN_EMAILS 환경 변수에 등록된 이메일

승격 명령:

npm run make-admin -- user@example.com

제공 지표

  • 요약 카드
    • totalUsers
    • totalLabs
    • publishedLabs
    • totalMemberships
    • totalPosts
    • totalPublications
    • connectionsAccepted / connectionsPending / connectionsBlocked
  • 최근 N일 활동 (days=7|30|90)
    • newUsers
    • newLabs
    • newPosts
    • newPublications
    • newConnectionsAccepted / newConnectionsPending
    • activeLabs (최근 N일 내 post/publication 활동이 있었던 연구실 수)

그래프

  • users created per day
  • labs created per day
  • posts created per day
  • connections created per day

CSV 내보내기

  • /admin/export/users
    • id,email,createdAt,isSiteAdmin
  • /admin/export/labs
    • id,slug,name,createdAt,publishedAt,ownerUserId
  • /admin/export/connections
    • labAId,labBId,status,requestedByLabId,createdAt,respondedAt
  • /admin/export/activity?days=30
    • day,newUsers,newLabs,newPosts,newConnections,newPublications

운영 콘솔과 인증 감사 기록

보호된 /admin 콘솔은 개요, 사용자, 연구실, 접근 기록, 세션, 활동, 시스템 화면으로 구성됩니다. 모든 화면은 서버에서 사이트 관리자 권한을 검사하며 CSV route도 별도로 같은 권한을 검사합니다.

상세 인증 기록의 보존 기간은 90일입니다. cron 등에서 다음 명령을 주기적으로 실행할 수 있습니다.

npm run admin:cleanup-auth

이 명령은 90일이 지난 AuthEvent만 삭제합니다.

Apache reverse proxy와 클라이언트 주소

클라이언트 주소는 IPv4 /24, IPv6 /64로 익명화된 네트워크 prefix만 저장합니다. Next.js 3001 포트가 신뢰하는 Apache를 통해서만 접근 가능한 경우에만 TRUST_PROXY_HEADERS=true를 설정하세요. 앱은 Apache가 추가한 X-Forwarded-For의 가장 오른쪽 주소를 사용하며, 설정이 꺼져 있으면 forwarded IP를 사용하지 않습니다.

Apache는 외부에서 전달된 forwarding header를 제거하고 확인된 peer 주소를 전달하도록 구성해야 합니다. 예시는 다음과 같습니다.

ProxyPreserveHost On
RequestHeader unset X-Forwarded-For
RequestHeader set X-Forwarded-Proto "https"
ProxyPass / http://127.0.0.1:3001/
ProxyPassReverse / http://127.0.0.1:3001/

배포 환경의 mod_remoteip 정책을 별도로 확인하고, trusted proxy 설정을 활성화하기 전에 3001 포트를 loopback 또는 방화벽 내부로 제한해야 합니다.