const p=s=>'

'+s+'

';const ul=xs=>''; export default { 167:({a,pre})=>p('이 문서는 설치된 버전에 포함된 Docker 설치 안내입니다. 예제의 버전과 네트워크 주소는 환경에 맞게 바꿔야 합니다. AMD64와 ARMv7 및 ARM64/v8용 이미지는 '+a(0,'Docker Hub')+'에서 확인할 수 있습니다.')+'

준비

'+p('Docker를 먼저 설치합니다. '+a(1,'Docker 설치 안내')+'를 참고하세요. 일반 이미지는 초기 실행에 루트 권한이 필요합니다. SMB/CIFS 공유를 데이터 폴더로 사용하는 경우에는 '+a(2,'관련 문제 해결 안내')+'에 따라 nobrl과 noperm 마운트 옵션이 필요할 수 있습니다.')+'

Docker Compose로 실행

'+p('Compose 파일을 받습니다.')+pre(0)+p('docker-compose.yml을 열어 설정을 확인합니다. 원문 예제의 기본 데이터 경로는 ~/trilium-data이며 포트는 8080입니다. 다음 명령으로 백그라운드에서 시작합니다.')+pre(1)+'

Docker 명령으로 실행

'+p(a(3,'배포된 태그 목록')+'에서 원하는 버전을 선택합니다. 아래 버전은 원문의 예제입니다.')+pre(2)+p('latest는 나중에 새 이미지를 받을 때 버전이 달라질 수 있습니다. 동기화하는 인스턴스의 호환성을 유지하려면 버전을 고정하는 편이 좋습니다. 호스트에 데이터 폴더를 만들고 컨테이너에서 쓸 수 있도록 마운트합니다.')+'

같은 컴퓨터에서만 접속

'+p('[VERSION]을 실제 태그로 바꿉니다. 테스트나 리버스 프록시 뒤에서 운영할 때 사용할 수 있습니다.')+pre(3)+p('docker ps로 상태를 확인하고 브라우저에서 127.0.0.1:8080을 엽니다.')+'

로컬 네트워크 연결 예제

'+p('다음 macvlan 예제의 인터페이스와 주소 범위는 실제 네트워크에 맞춰야 합니다.')+pre(4)+pre(5).replace('triliumnext/notes:-latest','triliumnext/notes:[VERSION]')+p('일반 이미지에서 데이터의 사용자와 그룹 ID는 USER_UID와 USER_GID로 지정합니다.')+pre(6).replace('triliumnext/notes:-latest','triliumnext/notes:[VERSION]')+p('컨테이너 주소를 확인한 뒤 로컬 네트워크에서 접속합니다.')+pre(7)+'

모든 인터페이스에서 접속

'+p('다음 예제는 호스트의 모든 인터페이스에 포트를 엽니다. 외부 공개 범위는 방화벽과 프록시 설정도 함께 확인해야 합니다.')+pre(8)+p('docker ps에서 ID를 확인하고 docker stop <CONTAINER ID>로 중지합니다.')+'

데이터 경로 변경

'+pre(9)+p('콜론 앞은 호스트의 경로이고 뒤는 컨테이너 안의 경로입니다. '+a(4,'Docker 볼륨 개요')+'와 '+a(5,'볼륨 사용 안내')+'를 참고하세요.')+'

리버스 프록시

'+p(a(6,'Nginx')+' 또는 '+a(7,'Apache')+' 안내를 참고하세요.')+'

실행 사용자와 시간대

'+p('일반 이미지는 --user 대신 USER_UID와 USER_GID를 사용합니다. 시간대가 맞지 않으면 TZ에 '+a(8,'시간대 식별자')+'를 지정합니다. 한국은 Asia/Seoul입니다.')+'

일반 사용자로 실행하는 이미지

'+p('rootless 계열은 컨테이너 안에서 루트가 아닌 trilium 사용자로 앱을 실행합니다. 데이터 경로는 일반 이미지와 다른 /home/trilium/trilium-data입니다. Debian과 Alpine 기반 변형을 제공합니다.')+pre(10).replace('For Debian-based image','Debian 기반 이미지').replace('For Alpine-based image','Alpine 기반 이미지')+p('일반 사용자로 실행하면 앱 프로세스의 권한을 줄일 수 있습니다. 호스트에서 Docker 데몬 자체를 비루트로 실행하는 설정과는 구분해야 합니다. 이미지 빌드 시 사용자를 만들고 별도 진입 스크립트 없이 실행합니다. 이 이미지에서는 --user로 UID와 GID를 지정할 수 있습니다.')+'

Compose 예제

'+pre(11).replace('Run with default UID/GID (1000:1000)','기본 UID/GID로 실행 (1000:1000)').replace('Run with custom UID/GID (e.g., match your host user)','호스트 사용자에 맞춘 UID/GID로 실행').replace('Specify a custom data directory','데이터 폴더 지정')+'

Docker 명령 예제

'+pre(12).replace('Build the image','이미지 빌드').replace('Run with default UID/GID (1000:1000)','기본 UID/GID로 실행 (1000:1000)').replace('Run with custom UID/GID','지정한 UID/GID로 실행')+'

환경 변수와 권한

'+p('TRILIUM_UID와 TRILIUM_GID는 Compose 설정을 통해 프로세스 ID를 지정하는 데 사용합니다. TRILIUM_DATA_DIR의 적용 위치는 사용한 Compose 파일을 확인하세요. 위 예제에서는 데이터 경로를 지정하는 변수로 사용합니다. 호스트 데이터 폴더의 소유권과 쓰기 권한이 실행 사용자에 맞아야 합니다.')+pre(13).replace('For example, if your data directory is owned by UID 1001 and GID 1001:','데이터 폴더의 소유자가 UID 1001과 GID 1001인 예제:')+p('프로세스는 시작할 때 지정한 UID/GID로 실행합니다. 기존 방식의 usermod나 groupmod 진입 스크립트를 사용하지 않으며 실행 중 스스로 사용자 ID를 바꾸지 않습니다.')+'

이미지 종류

'+p('원문의 Debian 변형은 Bullseye Slim을 기반으로 하며 apps/server/Dockerfile.rootless를 사용합니다. Alpine 변형은 크기가 작지만 환경에 따라 호환성 차이가 있을 수 있으며 apps/server/Dockerfile.alpine.rootless를 사용합니다.')+'

사용자 지정 이미지 빌드

'+pre(14).replace('For Debian-based image with custom UID/GID','UID/GID를 지정한 Debian 기반 이미지').replace('For Alpine-based image with custom UID/GID','UID/GID를 지정한 Alpine 기반 이미지')+p('빌드 인수 USER의 기본값은 trilium입니다. UID와 GID의 기본값은 각각 1000입니다.'), 168:({a,img})=>p(img(0,'지리 지도 예제'))+p('하위 노트의 위치 속성을 바탕으로 지도에 표시합니다. 지도에서 위치를 선택해 새 노트를 만들 수도 있습니다.')+'

지도 만들기

'+p('노트 트리에서 마우스 오른쪽 메뉴의 하위 노트 삽입 → 지리 지도를 선택합니다.')+p(img(1,'지리 지도 만들기'))+p('처음에는 전 세계가 보이는 빈 지도가 열립니다.')+p(img(2,'새 지도'))+'

이동과 확대

'+p('지도를 끌어 이동합니다. 마우스 휠이나 터치패드 두 손가락 동작 또는 왼쪽 위의 더하기·빼기 버튼으로 확대 비율을 바꿉니다. 위치와 확대 비율은 노트에 저장되어 다음에 열 때 복원됩니다.')+'

지도에서 표시점 추가

'+p('원하는 위치로 이동한 뒤 오른쪽 위 '+a(0,'떠 있는 버튼')+' 영역의 '+img(3,'표시점 추가 버튼')+' 버튼을 누릅니다. 보이지 않으면 '+img(4,'버튼 영역 펼치기')+' 버튼으로 펼칩니다.')+p(img(5,'표시점 삽입 모드'))+p('지도에서 위치를 누릅니다. 취소하려면 Esc를 누르세요.')+p(img(6,'표시점 이름 입력'))+p('이름을 입력하고 확인하면 표시점과 하위 노트가 만들어집니다.')+p(img(7,'표시점과 하위 노트 생성'))+'

위치 저장 방식

'+p('하위 노트의 #geolocation 속성에 위도와 경도를 쉼표로 구분해 저장합니다. 직접 입력할 수도 있습니다.')+p(img(8,'위치 속성'))+'

표시점 이동

'+p('표시점을 끌어서 옮기면 마우스를 놓는 즉시 저장됩니다. 이 버전에서는 이동을 실행 취소할 수 없습니다. 아직 마우스를 놓지 않았다면 Ctrl+R로 새로고침해 취소할 수 있습니다.')+'

표시점 사용

'+p('마우스를 올리면 노트 내용이 보이고 제목을 누르면 현재 화면에서 엽니다. 마우스 가운데 버튼은 새 탭에서 엽니다. 오른쪽 메뉴에서는 새 탭·분할 화면·창으로 열거나 지원되는 외부 지도 앱으로 위치를 열 수 있습니다. 지도에서 제거는 #geolocation 속성을 지웁니다. 다시 표시하려면 좌표를 입력해야 합니다.')+'

아이콘과 색상

'+p(img(9,'표시점의 아이콘과 색상'))+p('노트와 같은 아이콘을 사용합니다. #color=green처럼 색상 속성을 지정할 수도 있습니다.')+'

좌표 직접 추가

'+p('지도 아래에 노트를 만들고 #geolocation에 쉼표로 구분한 위도와 경도를 넣습니다.')+'

Google 지도

'+p('원하는 위치를 마우스 오른쪽 버튼으로 누르고 첫 항목의 좌표를 복사합니다.')+p(img(10,'Google 지도에서 좌표 복사'))+p('Trilium 지도 아래에 노트를 만듭니다.')+p(img(11,'하위 노트 만들기'))+p('소유한 속성에 #geolocation="을 입력한 뒤 좌표를 붙이고 닫는 따옴표를 입력합니다. Enter로 확정합니다.')+p(img(12,'복사한 좌표를 속성에 입력'))+'

OpenStreetMap

'+p('원하는 위치의 오른쪽 메뉴에서 주소 표시를 선택합니다.')+p(img(13,'OpenStreetMap 주소 표시'))+p('왼쪽 위에 표시되는 좌표를 선택해 복사합니다.')+p(img(14,'좌표 복사'))+p('지도 하위 노트의 #geolocation 값에 넣으면 표시됩니다.')+p(img(15,'위치 속성에 붙여넣기'))+'

GPS 경로 파일

'+p('기본적인 GPX 경로 표시를 지원합니다. 노트 트리의 지도 노트 안으로 .gpx 파일을 끌어 놓습니다.')+p(img(16,'GPX 파일 가져오기'))+p('파일 유형이 application/gpx+xml인지 확인합니다.')+p(img(17,'GPX 파일 유형'))+p('지도에 경로와 시작·끝 표시점이 나타납니다.')+p(img(18,'지도에 표시된 경로'))+p('시작 표시점은 노트 제목과 아이콘 및 색상을 사용합니다. 끝 표시점은 다른 아이콘으로 구분합니다. GPX에 경유지가 있으면 함께 표시하며 이름이 있는 경유지는 마우스를 올렸을 때 이름이 나옵니다.')+'

문제 해결

'+p(img(19,'지도에 격자 선이 나타나는 현상'))+p('앱 확대 비율이 100%가 아니면 소수점 배율 때문에 지도 조각 사이에 선이 보일 수 있습니다. Ctrl+0으로 화면 확대를 100%로 되돌리세요.') };