const p=s=>'

'+s+'

';const ul=xs=>''; export default { 145:({a,img,pre})=>p('측정 지표 API는 Prometheus 같은 외부 모니터링 시스템에 Trilium 상태를 제공합니다.')+'

접속

'+p('GET /etapi/metrics로 요청합니다. ETAPI 토큰이 필요하며 기본 응답은 Prometheus 텍스트 형식입니다.')+pre(0).replace('# Get an ETAPI token','# ETAPI 토큰 발급 예시')+'

사용 예시

'+pre(1)+p('다음과 같은 형식으로 응답합니다. 지표 이름과 형식은 연동을 위해 유지합니다.')+pre(2).replace('Trilium instance information','Trilium 인스턴스 정보').replace('Total number of notes including deleted','삭제된 노트를 포함한 전체 노트 수')+p('JSON으로 받으려면 다음처럼 요청합니다.')+pre(3)+'

제공 지표

'+ul([ 'trilium_info — 버전과 빌드 정보',...[ ['notes_total','삭제된 노트를 포함한 전체 노트 수'],['notes_deleted','삭제된 노트 수'],['notes_active','활성 노트 수'],['notes_protected','보호 노트 수'],['attachments_total','전체 첨부 파일 수'],['attachments_active','활성 첨부 파일 수'],['revisions_total','수정 이력 수'],['branches_total','활성 가지 수'],['attributes_total','활성 속성 수'],['blobs_total','본문 데이터 레코드 수'],['etapi_tokens_total','활성 ETAPI 토큰 수'],['embeddings_total','노트 임베딩 수'],['notes_by_type','유형별 노트 수. type 라벨로 구분합니다.'],['attachments_by_type','MIME 유형별 첨부 파일 수. mime_type 라벨로 구분합니다.'],['database_size_bytes','데이터베이스 크기. 바이트 단위입니다.'],['oldest_note_timestamp','가장 오래된 노트의 시각'],['newest_note_timestamp','가장 최근 노트의 시각'],['last_modified_timestamp','마지막 수정 시각'] ].map(([k,v])=>'trilium_'+k+' — '+v)])+'

Prometheus 설정

'+p('prometheus.yml에 추가할 예시입니다.')+pre(4)+'

오류 응답

'+p('400은 지원하지 않는 format 값입니다. 401은 토큰이 없거나 유효하지 않다는 뜻이며 500은 서버 내부 오류입니다.')+'

Grafana 대시보드

'+p(img(0,'Trilium 모니터링 대시보드'))+p(a(0,'Grafana 대시보드 JSON')+'을 가져오기 화면에 입력하세요.')+p(img(1,'대시보드 가져오기 메뉴'))+p('JSON을 붙여넣고 불러오기를 누릅니다.')+p(img(2,'대시보드 JSON 입력')), 146:({a})=>'

프런트엔드 API

'+p('일반 스크립트는 현재 앱과 노트의 문맥에서 실행됩니다. 위젯은 객체를 내보내 화면 구성 요소로 사용합니다. 두 경우 모두 전역 변수 api로 프런트엔드 API를 사용할 수 있습니다. '+a(0,'스크립트 API')+'를 참고하세요.')+'

스크립트

'+p('실행 버튼으로 실행하거나 '+a(1,'속성')+'으로 실행 시점을 지정할 수 있습니다.')+'

전체 이벤트

'+p('#run 값으로 frontendStartup은 일반 화면 시작을 지정하며 mobileStartup은 모바일 화면 시작을 지정합니다. backendStartup은 백엔드 시작입니다. hourly와 daily는 백엔드에서 매시간 또는 매일 실행합니다.')+'

항목별 이벤트

'+p('다음 '+a(2,'관계')+'로 스크립트를 연결하거나 상속하면 해당 노트에서 이벤트가 발생할 때 실행합니다. 이 이벤트는 백엔드 스크립트를 대상으로 합니다.')+ul([['runOnNoteCreation','노트 생성'],['runOnNoteTitleChange','제목 변경. 생성 포함'],['runOnNoteContentChange','본문 변경. 생성 포함'],['runOnNoteChange','노트 변경. 생성 포함'],['runOnNoteDeletion','노트 삭제'],['runOnBranchCreation','복제나 이동 등에 따른 가지 생성'],['runOnBranchDeletion','이동 등에 따른 기존 가지 삭제'],['runOnChildNoteCreation','직접 하위 노트 생성'],['runOnAttributeCreation','속성 생성'],['runOnAttributeChange','속성 변경']].map(([k,v])=>''+k+' — '+v))+'

위젯

'+p(a(3,'BasicWidget')+'이나 그 하위 클래스를 확장합니다. 새 인스턴스를 module.exports에 지정하고 parentWidget과 정수 position으로 위치를 정합니다. 코드 노트에는 #widget 라벨이 필요합니다.')+p(a(4,'BasicWidget')+'과 '+a(5,'NoteContextAwareWidget')+'은 doRender()에서 this.$widget을 만들고 반환합니다. '+a(6,'RightPanelWidget')+'은 이 처리를 제공하므로 doRenderBody()에서 본문을 반환합니다.')+'

배치 영역

'+ul(['left-pane — 노트 트리가 있는 왼쪽 영역','center-pane — 노트와 분할 보기가 있는 가운데 영역','note-detail-pane — 각 노트와 함께 표시하는 영역. 분할 시 여러 번 나타날 수 있습니다.','right-pane — 열린 노트의 오른쪽 영역'])+p(a(7,'위젯 기본 예제')+'에서 구현 과정을 확인하세요.'), 147:({a,img})=>'

제목

'+p(img(0,'제목 서식 선택'))+p('본문은 제목 2~6으로 구분할 수 있습니다. 제목 1은 노트 제목에 사용합니다. 일반 문단으로 되돌리려면 본문을 선택하세요. ##부터 ######까지 입력해 제목 2~6을 만들 수도 있습니다.')+'

글자 크기

'+p(img(1,'글자 크기 선택'))+p('일부 글자를 선택하고 크기를 바꾸면 강조할 수 있습니다. 숫자 대신 매우 작게와 작게 같은 상대 크기를 사용합니다. 모든 노트를 크게 보고 싶다면 '+a(0,'설정')+'의 기본 글자 크기나 화면 확대를 조정하세요.')+'

굵게와 기울임 및 밑줄과 취소선

'+p(img(2,'글자 서식 버튼'))+p('각 버튼으로 적용하고 서식 지우기로 제거할 수 있습니다. 단축키는 굵게가 Ctrl+B이며 기울임은 Ctrl+I이고 밑줄은 Ctrl+U입니다. **글자**나 __글자__는 굵게입니다. *글자*나 _글자_는 기울임이며 ~~글자~~는 취소선입니다.')+'

위 첨자와 아래 첨자

'+p('cm³ 같은 단위와 NaHCO₃ 같은 화학식에 사용할 수 있습니다. 복잡한 식은 '+a(1,'수식 기능')+'을 사용하세요.')+'

글자색과 배경색

'+p(img(3,'색상 선택'))+p('미리 지정된 색을 선택하거나 색상 선택기로 직접 정할 수 있습니다. 문서에서 사용한 색은 다시 고르기 쉽도록 목록에 나타납니다. 밝은 '+a(2,'테마')+'와 어두운 테마 사이를 전환해도 읽기 쉬운 대비인지 확인하세요. 색상 제거 또는 서식 지우기로 해제할 수 있습니다.')+'

서식 지우기

'+p(img(4,'서식 지우기 버튼')+'은 선택한 글자의 굵기와 색상 및 크기 등을 지웁니다. 제거할 서식이 없으면 비활성화됩니다. 제목 서식은 별도로 본문으로 바꿔야 합니다. 붙여넣을 때부터 서식을 제외하려면 Ctrl+Shift+V를 사용하세요.')+'

Markdown

'+p(a(3,'Markdown')+'으로 내보낼 때 제목과 굵게 및 기울임과 밑줄 등 대부분의 기본 서식을 유지합니다.'), 148:({a,pre})=>'

macOS 지원

'+p('기존 Trilium Notes와 달리 TriliumNext는 macOS 사용 환경도 개선하고 있습니다. 운영체제에 따른 문제가 있으면 '+a(0,'오류를 보고')+'해 주세요.')+'

번역 지원

'+p('기존 앱에는 다국어 지원이 없었지만 TriliumNext에는 번역 기능이 추가되었습니다. 번역 기여를 환영합니다.')+'

여러 사용자

'+p('이 버전은 한 사람이 사용하는 노트 앱을 전제로 합니다. 원문 개발자는 사용자 관리와 권한 및 충돌 처리와 실시간 공동 편집의 구현 범위가 크고 개인 기록이라는 중심 기능에서 벗어난다고 설명했습니다. 단일 사용자에게 허용되는 '+a(1,'스크립트')+'도 다중 사용자 환경에서는 다른 사용자의 데이터에 접근하는 보안 문제가 될 수 있습니다.')+'

여러 데이터베이스

'+p('한 프로세스는 하나의 '+a(2,'데이터베이스')+'만 엽니다. 두 프로세스를 실행하고 '+a(3,'데이터 폴더')+'와 포트를 각각 지정할 수 있습니다. 다음은 원문의 실행 예제이며 사용하는 버전의 포트 환경 변수 이름을 확인하세요.')+pre(0)+p('실행 스크립트나 별칭으로 저장할 수 있습니다. 두 번째 인스턴스는 다른 폴더와 포트를 사용해야 합니다.')+'

파일 동기화 서비스 사용

'+p('열려 있는 데이터베이스를 Dropbox와 Google Drive 또는 OneDrive로 동기화하면 파일이 손상될 수 있습니다. 다음과 같은 오류가 나타날 수 있습니다.')+pre(1)+p('지원하는 방식은 Trilium의 '+a(4,'동기화 서버')+'를 사용하는 것입니다.')+'

개별 파일 대신 데이터베이스를 사용하는 이유

'+p('개별 파일은 다른 도구와 연동하기 쉽지만 Trilium의 구조를 그대로 표현하기 어렵습니다. 그래서 SQLite '+a(5,'데이터베이스')+'를 사용합니다.')+ul([a(6,'복제')+'는 같은 하위 트리를 여러 위치에 두는 기능입니다. 일반적인 파일·폴더 구조만으로 표현하기 어렵습니다.','Trilium의 노트는 본문과 하위 노트를 함께 가질 수 있습니다.','노트 순서를 사용자가 직접 지정합니다.',a(7,'속성')+'을 저장하고 검색해야 합니다. 파일 시스템 확장 속성은 운영체제마다 지원이 다릅니다.','노트 사이의 연결과 '+a(8,'노트 지도')+'를 빠르게 조회해야 합니다. 파일만 사용하면 별도의 색인 자료가 필요합니다.','트랜잭션을 사용하면 노트와 메타데이터의 변경을 일관되게 처리하기 쉽습니다.']) };