B2C · Xtream · Reseller





아카이브 스토리지 계층
500개 이상의 동시 클라이언트를 위한 3계층 아카이브 시스템.
인코더
쓰기 버퍼
2시간 핫 윈도우(NVMe 또는 tmpfs)
→ 거울(연속)
HDD RAID 5
50TB, 14일 보존
→ 요청 시 미리 가져오기
재생 캐시
1TB 웜 캐시, 500개 이상의 클라이언트
클라이언트
Mirror_min_age_분보다 오래된 세그먼트는 지속적으로 RAID에 복사됩니다.
층
목적
설정
쓰기 버퍼
연중무휴 24시간 세그먼트 수신, 빠른 최근 되감기 재생을 위한 2시간 핫 윈도우 유지, 무작위 IO로부터 RAID를 보호합니다.
device_path(블록 장치 또는 'tmpfs'), tmpfs_size_pct(tmpfs 시 10-50% MemAvailable), mirror_min_age_ Minutes, evict_age_ Minutes, flash_threshold_percent(강제 플러시 트리거)
HDD RAID 아카이브
전체 보존을 위한 롱테일 스토리지(기본값 14일)
보유 일수, raid_device, nginx_location, min_free_percent
재생 캐시(선택 사항)
2시간보다 오래된 인기 파일(예: EPG 따라잡기)에 대한 읽기 측 캐시입니다.
prefetch_hours, max_sessions, eviction_policy(세션/lru/fifo)
라이브 쓰기 × 2h = write_buffer 핫 창 크기.
Stream.dvr_file_path/2는 write_buffer → Playback_cache → Archive를 순서대로 검색합니다.
각 계층은 물리적 블록 장치 대신 RAM 지원 tmpfs 가상 디스크를 사용할 수 있습니다.
할당은 MemAvailable(/proc/meminfo에서)의 백분율로 지정됩니다. 10단계, 유효한 값은 10/20/30/40/50입니다.
계산된 대상이 현재 MemAvailable의 60%를 초과하면 탑재가 거부되고 계층은 오프라인 상태로 유지됩니다(Stream.archive_path는 다음 정상 계층으로 넘어갑니다).
tmpfs는 RAM에 상주합니다. 호스트가 재부팅되면 모든 진행 중인 버퍼 콘텐츠가 손실됩니다.
다음과 같은 경우 write_buffer에 tmpfs를 사용합니다. (a) 개발/테스트 상자에 예비 NVMe가 없지만 통합 테스트를 위해 전체 DVR 파이프라인을 계속 실행하려는 경우, (b) 운영자가 NVMe를 미리 구매하지 않고 미러 + 아카이브 동작을 검증하려는 경우, (c) 재부팅 시 손실이 허용되는 임시 테스트를 수행하는 경우.
쓰기 계층이 tmpfs인 경우 StorageTierFlush는 더 엄격한 기본값(mirror_min_age 2분, evict_age 15분(물리적 NVMe의 경우 5분/120분))을 사용합니다.
계층은 구성 > 스토리지 > 스토리지 계층을 통해 한 번 구성되고 자동으로 프로비저닝됩니다. 호스트에서 mkfs/mount/fstab을 수동으로 편집할 필요가 없습니다.
처음 부팅할 때(DB에 쓰기 계층 없음) 시스템은 30% MemAvailable 할당, 마운트 지점 /mnt/nvme_write를 사용하여 tmpfs 지원 쓰기 계층을 자동 생성합니다.
Stream.archive_path/1은 첫 번째 '정상' 계층을 반환합니다. 안전 층 위에 마운트+쓰기 가능+free_pct인 경우 write_buffer, 그렇지 않으면 아카이브(저하 모드)로 대체됩니다.
UI에서 tmpfs_size_pct를 변경하면 저장 시 마운트 해제 + 새 크기로 다시 마운트가 트리거됩니다.
기본 URL — OSTV 플레이어
패키지 필드
패키지 API
비밀번호 정책
리셀러 API
설정
사용자 필드
사용자 관리
기본 URL — OSTV 플레이어
OSTV Player 애플리케이션을 사용하면 사용자는 서버 기본 URL(API 주소)을 변경할 수 있습니다.
이유: 기본 URL 변경은 서버 간 전환(예: 프로덕션 및 테스트)이 가능하도록 관리자/루트 사용자만을 위한 것입니다.
사용자 필드
패키지 API
가격 및 청구 기간이 포함된 모든 활성 패키지 목록을 반환합니다.
관리 사용자(리셀러/공급자) 목록입니다.
특정 관리 사용자에 대한 크레딧 잔액을 반환합니다.
패키지 필드
리셀러 API
리셀러/공급업체를 위한 API입니다.
비밀번호 정책
구독자를 생성할 때 비밀번호가 필요합니다.
최소 8자
대문자(A-Z) 1개 이상
특수 문자 1개 이상(!@#$%^&* 등)
UI 및 API에 적용됩니다.
설정
계층 자동 프로비저닝 및 안전
용량 + 파일 시스템 자동 감지: 드롭다운에서 무료 NVMe를 선택하면 lsblk -bn -o SIZE에서 용량(GB)을 읽고 blkid에서 현재 FS를 읽습니다(전체 디스크 대체 사용).
계층 플러시 메커니즘 - 연속 미러
StorageTierFlush GenServer는 60초마다 실행됩니다.
연속 미러가 "60분 대기, 일괄 이동"을 능가하는 이유: (1) RAID 로드는 균일합니다. 시간 경계에서 5GB 버스트가 없고 7MB 세그먼트가 조금씩만 발생합니다.
진행 중인 세그먼트 안전: 미러는 find -mmin +5를 통해 MIRROR_MIN_AGE_MINUTES보다 오래된 파일만 선택합니다.
배포별 튜닝(.env)
500~1000
크기 조정 규칙:
DVR 미리보기 달력
DVR 미리보기 탭에는 디스크에 녹화물이 존재하는 날짜만 강조 표시하는 서버 렌더링 달력이 표시됩니다.
녹음이 있는 날짜는 클릭 가능합니다(파란색). 클릭하면 날짜/시간 입력이 해당 날짜 00:00으로 미리 채워집니다.
각 계층 마운트에서 find -minlength 4 -maxlength 4 -type d를 통해 Stream.available_dvr_days/1에 구현됩니다.
개요
B2C(Business-to-Consumer) API는 최종 사용자 플레이어 애플리케이션에 대한 인증 및 스트림 액세스를 제공합니다.
사용자를 인증하고 후속 API 호출에 대한 auth_token을 얻습니다.
방법
엔드포인트
요청 본문
매개변수
유형
필수의
설명
예
사용자 로그인 이름
사용자 비밀번호
예시 요청
응답 필드
성공응답 (200)
후속 API 호출을 위한 암호화된 인증 토큰
ISO 8601 형식의 토큰 만료 날짜/시간
성공 응답 예시
오류 응답(403)
오류 설명 메시지
HTTP 상태 코드
오류 응답 예
인증 토큰을 사용하여 인증된 사용자에 대한 정보를 검색합니다.
응답 필드
인증된 사용자의 사용자 이름
서버 메시지(없으면 비어 있음)
인증 상태(1 = 인증됨)
계정 상태: 활성, 금지, 비활성화, 평가판
계정 만료 날짜(무제한인 경우 Null)
현재 활성 연결 수
ISO 8601 형식의 계정 생성 날짜
최대 허용 동시 연결
허용되는 출력 스트림 형식 목록
사용자 소유자/리셀러의 제공업체 이름(없으면 null)
공급자 로고 이미지의 URL(없는 경우 null)
제공업체 축소 로고 이미지의 URL 208x208(없으면 null)
ISO 8601 형식의 현재 서버 시간
예시 요청
유형별로 필터링된 카테고리를 검색합니다.
카테고리 유형: 라이브, VOD, 시리즈
카테고리 ID를 문자열로 표시
카테고리 표시 이름
상위 카테고리 ID(루트인 경우 0)
캐시 무효화를 위한 콘텐츠의 MD5 해시
예시 요청
메타데이터 및 스트림 링크를 포함하여 특정 VOD 항목에 대한 자세한 정보를 검색합니다.
VOD 스트림 ID(UUID)
표지 이미지 URL
TMDB 식별자
배경화면 이미지 URL
장르 문자열
줄거리 / 설명
출연진
등급 값(0-10)
이사명
출시일
지속 시간(초)
형식화된 문자열로 표시되는 기간
카테고리 ID 배열
성인용 콘텐츠인 경우 1, 그렇지 않은 경우 0
VOD 스트림 ID
VOD 제목
추가된 날짜(ISO 8601)
스트림 링크 URL
비디오/오디오 코덱 메타데이터
시즌 번호별로 그룹화된 전체 시즌 및 에피소드 목록이 포함된 시리즈 정보를 검색하세요.
시리즈 ID(UUID)
시즌 번호
시즌 표시 이름
시즌의 에피소드 수
시즌 방송일
시즌 개요/설명
시즌 표지 이미지 URL
시즌 번호 문자열로 키가 지정된 지도입니다.
에피소드 개체 필드
에피소드 ID
TMDB 에피소드 ID
시즌 내 에피소드 번호
추가된 날짜(ISO 8601)
시즌 번호
에피소드 정보 객체(VOD 정보와 동일한 구조)
스트림 링크 URL
비디오/오디오 코덱 메타데이터
토큰 만료는 사용자 역할에 따라 다릅니다. 관리자 = 365일, 기타 = 30일|비활성화된 계정은 인증할 수 없습니다(403 반환)|성공적인 로그인은 사용자의 last_login 타임스탬프를 업데이트합니다|토큰은 암호화되며 user_id, 사용자 이름, 역할 및 만료를 포함합니다.
성공응답 (200)
/auth 엔드포인트에서 얻은 인증 토큰