Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
426a416e7b | ||
|
|
eddda22eb6 | ||
|
|
46b8dc6717 | ||
|
|
3c7549c104 | ||
|
|
087e80126d | ||
|
|
77c2892aba | ||
|
|
618e6ab213 | ||
|
|
0814e9f44c | ||
|
|
1752fed118 | ||
|
|
bd7d12255f | ||
|
|
9029085b38 |
@@ -0,0 +1,6 @@
|
|||||||
|
**
|
||||||
|
!Dockerfile
|
||||||
|
!release/
|
||||||
|
!release/app/
|
||||||
|
!release/app/**
|
||||||
|
!release/manifest.json
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
TRILIUM_KO_PORT=8082
|
||||||
|
TRILIUM_KO_BIND=127.0.0.1
|
||||||
|
TRILIUM_KO_DATA_DIR=./data
|
||||||
@@ -0,0 +1,4 @@
|
|||||||
|
*.sh text eol=lf
|
||||||
|
Dockerfile text eol=lf
|
||||||
|
*.yml text eol=lf
|
||||||
|
release/** -text
|
||||||
@@ -0,0 +1,4 @@
|
|||||||
|
data/
|
||||||
|
backups/
|
||||||
|
.env
|
||||||
|
*.bundle
|
||||||
@@ -0,0 +1,17 @@
|
|||||||
|
# 변경 기록
|
||||||
|
|
||||||
|
## 2.0.0 — 2026-09-13
|
||||||
|
|
||||||
|
- 기록용 폴더에 있던 최신 번역을 실제 Docker 이미지에 통합했습니다.
|
||||||
|
- 운영에서 확인한 Trilium 0.95.0 이미지의 다이제스트를 고정했습니다.
|
||||||
|
- 신규 설치용 기본 예제 ZIP을 한국어로 생성했습니다. 노트 ID가 바뀌어도 새로 가져올 수 있도록 원본 예제와 대응시켰습니다.
|
||||||
|
- 한국어 PDF와 도움말 및 API 문서와 Swagger 정적 파일을 포함했습니다.
|
||||||
|
- 서버 전용 경로를 쓰던 일회성 DB 마이그레이션 코드를 일반 배포 번들에서 제거했습니다.
|
||||||
|
- 설치 프로그램의 현재 폴더 사용과 포트·데이터 경로 설정을 정리했습니다.
|
||||||
|
- 이미지 빌드 시 파일 무결성과 JavaScript 구문을 검사합니다.
|
||||||
|
- 업데이트 전 데이터 백업과 이전 이미지 보존 및 기동 실패 시 이미지 복귀를 추가했습니다.
|
||||||
|
- `.dockerignore`로 빌드 입력을 배포 파일로 제한했습니다.
|
||||||
|
- 구형 루트 패치 파일은 `legacy/v1`로 옮겼습니다. 기존 v1.0.0 첨부 배포판은 최신 파일을 포함하지 않습니다.
|
||||||
|
- 신규 설치와 초기 예제 생성 및 공식 0.95.0에서의 전환과 재설치 및 고의 실패 복귀와 백업 복원을 검증했습니다.
|
||||||
|
|
||||||
|
상세 결과는 [배포 검증 기록](docs/DEPLOYMENT-TESTS.ko.md)을 참고하세요. 과거 운영 서버 번역 과정은 [번역 변경 기록](updates/2026-09-05/CHANGELOG.ko.md)에 보관했습니다.
|
||||||
@@ -1,5 +1,15 @@
|
|||||||
FROM triliumnext/notes:latest
|
FROM triliumnext/notes@sha256:611a430016585d35b170eb9a0fa300ce76318f04a8ec0067549c4c52561b0c36
|
||||||
|
LABEL org.opencontainers.image.title="Trilium 이스톰 한국어판" \
|
||||||
COPY main.cjs /usr/src/app/main.cjs
|
org.opencontainers.image.version="2.0.0" \
|
||||||
COPY translation.json /usr/src/app/public/translations/ko/translation.json
|
org.opencontainers.image.source="https://gitea.itosm.co.kr/syskiller/triliumnext-korean-patch"
|
||||||
COPY server.json /usr/src/app/assets/translations/ko/server.json
|
USER root
|
||||||
|
COPY release/app/ /usr/src/app/
|
||||||
|
COPY release/manifest.json /usr/src/app/korean-release.json
|
||||||
|
RUN node -e "const fs=require('fs'),c=require('crypto'),m=require('./korean-release.json');for(const [p,v] of Object.entries(m.files)){const b=fs.readFileSync(p);if(b.length!==v.bytes||c.createHash('sha256').update(b).digest('hex')!==v.sha256)throw Error(p)}" \
|
||||||
|
&& node --check /usr/src/app/main.cjs
|
||||||
|
RUN find /usr/src/app/assets/doc_notes/en /usr/src/app/public/translations/ko /usr/src/app/assets/translations/ko -type d -exec chmod 755 {} \; \
|
||||||
|
&& find /usr/src/app/assets/doc_notes/en /usr/src/app/public/translations/ko /usr/src/app/assets/translations/ko -type f -exec chmod 644 {} \; \
|
||||||
|
&& chmod 644 /usr/src/app/main.cjs /usr/src/app/assets/db/demo.zip /usr/src/app/public/src/*.js /usr/src/app/public/src/emoji-ko.json
|
||||||
|
ENV TZ=Asia/Seoul
|
||||||
|
HEALTHCHECK --interval=10s --timeout=3s --start-period=60s --retries=6 \
|
||||||
|
CMD node -e "require('http').get('http://127.0.0.1:8080/api/health-check',r=>process.exit(r.statusCode===200?0:1)).on('error',()=>process.exit(1))"
|
||||||
|
|||||||
@@ -0,0 +1,11 @@
|
|||||||
|
# Trilium 한국어판 작업 기준
|
||||||
|
|
||||||
|
## 2026-09-20 추가 번역 준비
|
||||||
|
|
||||||
|
대상 저장소는 `syskiller/triliumnext-korean-patch`다. 운영 기준은 0.95.0이며 배포판은 2.0.0이다. 최신 버전으로 이식한 상태는 아니다.
|
||||||
|
|
||||||
|
다음 작업은 `docs/TRANSLATION-MAINTENANCE.ko.md`에서 시작한다. `localization/baseline.json`에 기존 UI 번역 기준과 해시를 기록했다. 새 원문의 추가와 변경 및 삭제를 비교하는 도구와 배포 파일 변경을 비교하는 도구를 추가했다.
|
||||||
|
|
||||||
|
기존 UI 사전 자체 비교 결과는 재사용 후보 1482개와 원문 동일 검토 항목 14개다. 원문 동일 항목은 고유 명칭일 수 있으므로 미번역으로 단정하지 않는다. 서버 사전의 이전 영문은 별도로 확보해야 한다.
|
||||||
|
|
||||||
|
기존 이미지 유지와 한국어 설명 보완 정책을 유지한다. 코드 식별자와 URL은 원문을 유지한다. 직접 수정한 번들은 다른 버전에 복사하지 않는다. 운영 코드와 DB 변경 및 데이터 이전은 없다. 이번 작업은 도구와 문서 추가이므로 운영 데이터 백업을 새로 만들지 않는다. 기존 배포 커밋은 `eddda22`다.
|
||||||
@@ -1,173 +1,89 @@
|
|||||||
# TriliumNext Notes 한국어 패치 (번역 + main.cjs 패치)
|
# Trilium 이스톰 한국어판 2.0.0
|
||||||
|
|
||||||
[TriliumNext Notes](https://github.com/TriliumNext/Notes)의 비공식 커뮤니티 한국어 번역입니다.
|
Trilium 0.95.0용 한국어 배포판입니다. UI와 편집기 및 도움말과 API 참고 문서를 포함합니다. 새 문서에는 한국어 기본 예제와 한국어 PDF가 들어갑니다. 이미지 원본은 유지하고 한국어 설명을 제공합니다.
|
||||||
이 글을 쓰는 시점 기준으로 TriliumNext는 한국어 언어팩이 없고, 심지어 UI 언어 선택기에
|
|
||||||
뜨는 지원 언어 목록 자체가 `translations/` 폴더를 스캔해서 만들어지는 게 아니라 **컴파일된
|
|
||||||
서버 번들(`main.cjs`) 안에 하드코딩된 배열**이라서, 번역 파일만 올바른 경로에 넣는다고
|
|
||||||
"한국어"가 언어 선택기에 나타나지 않습니다. 그래서 번역 파일 외에 서버 번들을 패치하는
|
|
||||||
스크립트도 함께 제공합니다.
|
|
||||||
|
|
||||||
## 포함된 파일
|
Dockerfile과 설치 스크립트가 최신 배포 파일을 사용하도록 통합했습니다. `latest` 대신 검증한 이미지 다이제스트를 고정합니다. 다른 Trilium 버전에 이 서버 번들을 덮어쓰지 마세요.
|
||||||
|
|
||||||
- `install.sh` — **원클릭 설치 스크립트**. 명령어 한 줄로 저장소를 내려받고, 한국어가
|
## 설치
|
||||||
내장된 이미지를 빌드해서 바로 실행시킵니다.
|
|
||||||
- `Dockerfile` — `triliumnext/notes:latest` 위에 번역 파일과 패치된 `main.cjs`를
|
|
||||||
구워 넣어서, 별도 bind-mount 없이 한국어가 기본 내장된 이미지를 만듭니다.
|
|
||||||
- `docker-compose.yml` — 위 `Dockerfile`로 빌드해서 바로 띄우는 compose 파일
|
|
||||||
(`install.sh`가 내부적으로 이걸 사용합니다).
|
|
||||||
- `translation.json` — 클라이언트(브라우저) UI 문자열, 1,712개 키, 100% 번역 완료.
|
|
||||||
- `server.json` — 서버 문자열, 283개 키, 100% 번역 완료.
|
|
||||||
- `main.cjs` — **이미 패치가 적용된, 바로 쓸 수 있는 서버 번들** (`triliumnext/notes:latest`,
|
|
||||||
빌드일 2025-06-07, appVersion 0.95.0 기준).
|
|
||||||
- `patch_main_cjs.js` — 위 `main.cjs`를 만들어낸 패치 스크립트. 다른 버전의 이미지를 쓰거나
|
|
||||||
이미지가 업데이트된 경우, 이 스크립트를 새 원본 `main.cjs`에 다시 돌려서 직접 패치된
|
|
||||||
파일을 만들어야 합니다 (왜 이게 필요한지는 스크립트 상단 주석 참고).
|
|
||||||
- `docker-compose.bind-mount.yml.example` — 이미 떠 있는 공식 이미지 컨테이너에 파일만
|
|
||||||
bind-mount로 추가하고 싶을 때 쓰는 예시 (이미지를 새로 빌드하지 않는 방식).
|
|
||||||
|
|
||||||
`triliumnext/notes:latest` (빌드일 2025-06-07, appVersion 0.95.0) 기준으로 테스트했습니다.
|
Linux 서버의 Docker Engine과 Docker Compose 플러그인이 필요합니다. Compose는 `up --wait`를 지원해야 합니다. 저장소를 내려받을 때는 Git도 필요합니다. Docker 명령을 실행할 권한이 있는 계정으로 진행하세요.
|
||||||
`main.cjs` 안의 변수명은 전부 난독화(minify)되어 있고 **빌드마다 이름이 바뀔 수 있습니다** —
|
|
||||||
`patch_main_cjs.js`를 새 이미지에 돌렸을 때 `[skip]`이 출력되면, 스크립트가 찾는 문자열
|
|
||||||
패턴이 그 빌드에서 바뀐 것이니 새 빌드에서 같은 패턴을 다시 찾아 스크립트를 갱신해야 합니다.
|
|
||||||
|
|
||||||
## 설치 방법 — 명령어 한 줄 (추천)
|
|
||||||
|
|
||||||
Docker와 Docker Compose 플러그인만 설치되어 있으면 됩니다:
|
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
curl -fsSL https://gitea.itosm.co.kr/syskiller/triliumnext-korean-patch/raw/branch/main/install.sh | bash
|
git clone https://gitea.itosm.co.kr/syskiller/triliumnext-korean-patch.git
|
||||||
|
cd triliumnext-korean-patch
|
||||||
|
cp .env.example .env
|
||||||
|
bash install.sh
|
||||||
```
|
```
|
||||||
|
|
||||||
기본적으로 `./trilium-korean` 폴더에 저장소를 내려받고, 한국어가 내장된 이미지를 빌드해서
|
기본 주소는 `http://127.0.0.1:8082`입니다. 서버에 리버스 프록시가 있다면 이 주소로 연결하세요. 직접 외부 접속을 허용하려면 `.env`의 `TRILIUM_KO_BIND`를 서버의 수신 주소로 변경하세요. 모든 인터페이스를 사용할 값은 `0.0.0.0`입니다. 포트는 `TRILIUM_KO_PORT`에서 바꿉니다.
|
||||||
`http://localhost:8082`로 띄웁니다. 포트를 바꾸고 싶으면:
|
|
||||||
|
브라우저에서 새 문서를 만들고 비밀번호를 설정하세요. 언어 및 지역 설정에서 한국어를 선택하고 새로 고칩니다. 기존 계정의 언어 설정은 업데이트 때 유지합니다.
|
||||||
|
|
||||||
|
Docker 이미지는 설치 중 로컬에서 빌드합니다. 이 저장소는 공개 컨테이너 레지스트리에 이미지를 올렸다고 가정하지 않습니다. 최초 빌드에는 고정된 기반 이미지 다운로드가 필요할 수 있습니다.
|
||||||
|
|
||||||
|
## 업데이트
|
||||||
|
|
||||||
|
현재 설치 폴더에서 실행합니다.
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
TRILIUM_KO_PORT=9000 curl -fsSL https://gitea.itosm.co.kr/syskiller/triliumnext-korean-patch/raw/branch/main/install.sh | bash
|
git pull --ff-only
|
||||||
|
bash install.sh
|
||||||
```
|
```
|
||||||
|
|
||||||
설치가 끝나면 브라우저로 접속해서 초기 비밀번호를 설정한 뒤, **옵션 → 언어 및 지역**에서
|
스크립트는 새 이미지를 먼저 빌드합니다. 이후 이 Compose 프로젝트의 Trilium을 중지하고 데이터 전체를 `backups/날짜-번호/data.tar.gz`로 백업합니다. 새 컨테이너의 상태 검사를 통과해야 배포 성공으로 표시합니다. 기동 실패 시 이전 이미지로 복귀를 시도하며 백업은 보존합니다. 데이터베이스는 실패 시 자동으로 덮어쓰지 않습니다.
|
||||||
"한국어"를 선택하고 페이지를 새로고침하면 됩니다 (본문 텍스트까지 전부 한국어로 바뀌려면
|
|
||||||
새로고침이 한 번 필요합니다 — 앱 자체의 동작이며 이 패치의 문제는 아닙니다).
|
|
||||||
|
|
||||||
업데이트하려면 같은 명령어를 같은 폴더에서 다시 실행하면 됩니다.
|
새 설치용 예제 압축 파일을 바꿔도 기존 노트는 다시 가져오거나 덮어쓰지 않습니다. 기존 영어 예제나 사용자가 수정한 노트의 본문을 이 설치 스크립트가 임의로 번역하지 않습니다. 이스톰 운영 서버의 기존 노트 번역 기록은 `updates/2026-09-05`에 별도로 남아 있습니다.
|
||||||
|
|
||||||
## 설치 방법 — 이미 떠 있는 컨테이너에 추가하고 싶은 경우
|
## 기존 다른 컨테이너에서 이전
|
||||||
|
|
||||||
이미지를 새로 빌드하지 않고, 이미 쓰고 있는 공식 `triliumnext/notes` 컨테이너에 파일만
|
이 배포판은 Trilium 0.95.0과 같은 데이터 형식으로 검사했습니다. 더 최신 버전에서 쓰던 DB를 이전 버전으로 되돌리는 용도로 사용하지 마세요.
|
||||||
얹고 싶다면:
|
|
||||||
|
|
||||||
1. **번역 파일 + `main.cjs`를 `docker-compose.yml`에 bind-mount로 등록**
|
1. 기존 Trilium을 중지하고 데이터 폴더 전체를 백업합니다.
|
||||||
(`docker cp`로만 넣지 말 것 — 아래 "문제 4" 참고):
|
2. 기존 데이터를 별도 복사한 경로를 `.env`의 `TRILIUM_KO_DATA_DIR`로 지정합니다.
|
||||||
- `main.cjs` → `/usr/src/app/main.cjs`
|
3. 다른 포트로 이 배포판을 설치해 노트와 첨부 파일을 확인합니다.
|
||||||
- `translation.json` → `/usr/src/app/public/translations/ko/translation.json`
|
4. 확인 후 리버스 프록시의 연결 대상을 변경합니다.
|
||||||
- `server.json` → `/usr/src/app/assets/translations/ko/server.json`
|
|
||||||
2. `docker-compose.bind-mount.yml.example`을 참고해서 그대로 적용, 컨테이너 재시작.
|
|
||||||
3. 앱 안에서 **옵션 → 언어 및 지역**에서 "한국어" 선택 후 새로고침.
|
|
||||||
|
|
||||||
## 설치 방법 — 다른 이미지 버전을 쓰는 경우 (직접 패치)
|
하나의 데이터 폴더를 두 컨테이너에서 동시에 열지 마세요. 설치 스크립트는 같은 데이터 경로를 사용 중인 다른 컨테이너가 있으면 중단합니다. 기존 컨테이너의 bind mount 패치 설정은 새 컨테이너에 추가하지 않습니다. 모든 패치는 이미지 안에 포함돼 있습니다.
|
||||||
|
|
||||||
이미지 버전이 다르면 `main.cjs`의 난독화된 변수명/위치가 달라 이 저장소의 `main.cjs`가
|
## 백업 복원
|
||||||
그대로 안 맞을 수 있습니다. 이 경우 직접 패치해야 합니다:
|
|
||||||
|
|
||||||
1. 번역 파일은 위와 동일하게 bind-mount.
|
복원 전 현재 컨테이너를 중지하세요. 백업을 새 빈 데이터 폴더에 풀고 `.env`의 데이터 경로를 그 폴더로 바꾸는 방식을 권장합니다. 원래 폴더는 확인이 끝날 때까지 보존하세요. 백업 파일은 컨테이너의 root 권한으로 생성돼 `sudo`가 필요할 수 있습니다.
|
||||||
2. **컨테이너의 원본(패치 안 된) `main.cjs`를 추출**하고 패치 스크립트 실행:
|
|
||||||
```bash
|
|
||||||
docker create --name trilium-tmp triliumnext/notes:latest
|
|
||||||
docker cp trilium-tmp:/usr/src/app/main.cjs ./main.cjs
|
|
||||||
docker rm trilium-tmp
|
|
||||||
node patch_main_cjs.js ./main.cjs
|
|
||||||
node --check ./main.cjs # 반드시 배포 전에 문법 검사
|
|
||||||
```
|
|
||||||
`[skip]`이 출력되면 스크립트가 찾는 문자열 패턴이 그 빌드에서 바뀐 것이니, 새 빌드에서
|
|
||||||
같은 패턴을 다시 찾아 스크립트를 갱신해야 합니다 (아래 "빌드마다 달라짐" 참고).
|
|
||||||
3. **패치된 `main.cjs`를 `docker-compose.yml`에서 원본 위치에 bind-mount** —
|
|
||||||
`docker-compose.bind-mount.yml.example` 참고:
|
|
||||||
```yaml
|
|
||||||
services:
|
|
||||||
trilium:
|
|
||||||
image: triliumnext/notes:latest
|
|
||||||
restart: unless-stopped
|
|
||||||
ports:
|
|
||||||
- '127.0.0.1:18082:8080'
|
|
||||||
environment:
|
|
||||||
- TZ=Asia/Seoul
|
|
||||||
volumes:
|
|
||||||
- ./data:/home/node/trilium-data
|
|
||||||
- ./main.cjs:/usr/src/app/main.cjs:ro
|
|
||||||
- ./translation.json:/usr/src/app/public/translations/ko/translation.json:ro
|
|
||||||
- ./server.json:/usr/src/app/assets/translations/ko/server.json:ro
|
|
||||||
```
|
|
||||||
4. 컨테이너 시작 후 앱 안에서 **옵션 → 언어 및 지역**에서 "한국어" 선택.
|
|
||||||
|
|
||||||
## 겪었던 문제와 해결 (설치 전에 꼭 읽어보세요)
|
```bash
|
||||||
|
docker compose stop trilium
|
||||||
|
sudo mkdir /srv/trilium-restored
|
||||||
|
sudo tar -xzpf backups/복원할-백업/data.tar.gz -C /srv/trilium-restored
|
||||||
|
# .env의 TRILIUM_KO_DATA_DIR을 /srv/trilium-restored로 수정한 뒤 실행
|
||||||
|
bash install.sh
|
||||||
|
```
|
||||||
|
|
||||||
### 문제 1 — DB에서 `locale`을 직접 `'ko'`로 바꾸면 크래시
|
이전 이미지의 복구용 태그는 `previous-image.txt`에 있으며 원래 ID는 `previous-image-id.txt`에 있습니다. 이미지 복귀만으로 DB 형식이 되돌아가지는 않으므로 다른 버전 사이의 복원에서는 해당 버전의 데이터 백업을 함께 사용하세요.
|
||||||
|
|
||||||
지원 언어 목록에 없는 값을 옵션 DB에 직접 넣으면 앱이 시작하다가 죽습니다. 이 방법으로는
|
## 포함 범위
|
||||||
안 되고, 반드시 아래처럼 서버 번들 자체를 패치해야 합니다.
|
|
||||||
|
|
||||||
### 문제 2 — `main.cjs` 패치 위치를 잘못 잡으면 문법 자체가 깨짐
|
| 항목 | 내용 |
|
||||||
|
|---|---|
|
||||||
|
| 기반 앱 | Trilium 0.95.0 |
|
||||||
|
| 기반 이미지 | `triliumnext/notes@sha256:611a430016585d35b170eb9a0fa300ce76318f04a8ec0067549c4c52561b0c36` |
|
||||||
|
| UI | 한국어 사전과 편집기 및 지도·달력·마인드맵 수정 |
|
||||||
|
| 도움말 | 본문 173개와 제목 181개 |
|
||||||
|
| 이미지 설명 | 영문이 감지된 이미지 206개에 한국어 설명 |
|
||||||
|
| API 참고 화면 | 5개와 Swagger 정적 파일 |
|
||||||
|
| 신규 기본 예제 | 노트 170개 대응 및 번역 수정 148개와 한국어 PDF |
|
||||||
|
| 배포 파일 | `release/manifest.json`의 492개 파일 |
|
||||||
|
|
||||||
지원 언어 배열(테스트한 빌드에서 변수명 `K5i`)에 새 항목을 삽입할 때, 배열의 여는 대괄호
|
함수 이름과 코드 문법 및 URL과 제품 이름은 원문을 유지합니다. 연결된 외부 사이트 전체를 번역한 것은 아닙니다. 외부 스크립트 API 사본은 운영 버전과 지원 범위가 다를 수 있음을 문서에 표시했습니다.
|
||||||
`[` **바로 뒤**가 아니라 그 앞(변수 선언문 쪽)에 잘못 삽입하면 JS 문법 자체가 깨져서 앱이
|
|
||||||
아예 뜨지 못하고 크래시를 반복합니다. `patch_main_cjs.js`는 이 위치를 정확히 계산해서
|
|
||||||
삽입하지만, **패치 후에는 항상 `node --check`로 문법을 먼저 확인**하고 나서 컨테이너를
|
|
||||||
재시작하세요.
|
|
||||||
|
|
||||||
### 문제 3 — 완전 재생성(`docker compose down && up`) 시에만 나타나는 크래시
|
## 검증과 재생성
|
||||||
|
|
||||||
지원 언어 배열만 고치면 `docker restart`로는 잘 동작하는 것처럼 보이지만, 컨테이너를 완전히
|
다음 버전의 추가 번역은 [버전 업데이트와 추가 번역 절차](docs/TRANSLATION-MAINTENANCE.ko.md)를 따릅니다. 기존 한국어와 새 원문을 비교하는 도구 및 코드와 도움말 파일의 변경 확인 도구를 제공합니다. 현재 배포판의 지원 버전은 그대로 0.95.0입니다.
|
||||||
내렸다 올리면(`down && up`) 다시 크래시합니다. 원인은 Trilium 자체 번역과는 별개로,
|
|
||||||
**CKEditor 내장 다국어 리소스를 지연 로드하는 두 번째 하드코딩 맵**(테스트한 빌드에서
|
|
||||||
변수명 `IMi`)에도 `ko` 항목이 없어서 발생하는 `TypeError`입니다. 이 리소스는 애초에
|
|
||||||
한국어용 청크가 빌드에 포함되어 있지 않아 새로 만들 수 없으므로, `patch_main_cjs.js`는
|
|
||||||
이 항목을 영어 로더로 대체(alias)해서 우회합니다. **`restart`뿐 아니라 완전 재생성까지
|
|
||||||
반드시 테스트**하세요 — 재시작만으로는 이 문제가 드러나지 않습니다.
|
|
||||||
|
|
||||||
### 문제 4 — 번역이 배포 후 시간이 지나서 "모바일에서만" 다시 영어로 보임
|
검증 결과는 [배포 검증 기록](docs/DEPLOYMENT-TESTS.ko.md)에 있습니다. 배포 파일은 Docker 빌드 중 SHA-256 검사와 JavaScript 구문 검사를 통과해야 합니다. 개발 환경에 Node.js가 있다면 다음 명령으로도 확인할 수 있습니다.
|
||||||
|
|
||||||
가장 까다로웠던 문제입니다. 번역을 배포하고 정상 동작까지 확인했는데, 이후 **모바일
|
```bash
|
||||||
기기에서만** 옵션 페이지 등의 본문 텍스트가 다시 영어로 나오는 현상이 발생했습니다
|
node tools/verify-release.mjs
|
||||||
(페이지 제목이나 "한국어"라는 언어 이름 자체는 정상). 데스크톱에서는 동일 페이지가
|
```
|
||||||
100% 정상이었습니다.
|
|
||||||
|
|
||||||
처음엔 모바일 브라우저 캐시 문제로 의심했지만, 캐시를 초기화하고 서로 다른 브라우저
|
기록된 번역 단계와 `release/demo-ko.zip`에서 배포 트리를 다시 모으려면 `node tools/build-release.mjs`를 실행합니다. 예제 압축 파일 생성 원본과 ID 대응 자료는 `tools/demo-source`에 보관했습니다. 과거 일회성 운영 DB 마이그레이션 코드는 일반 배포 번들에서 제거했습니다.
|
||||||
엔진(Chrome, 삼성인터넷, 네이버) 세 개로 테스트해도 완전히 동일한 증상이 재현되어
|
|
||||||
캐시 이론은 기각했습니다.
|
|
||||||
|
|
||||||
**진짜 원인**: 번역 파일(`translation.json`, `server.json`)을 `docker cp`로 컨테이너
|
`legacy/v1`과 `patch-only` 및 기존 v1.0.0 첨부 파일은 과거 배포판입니다. 신규 설치에는 이 문서와 루트의 Dockerfile·설치 스크립트를 사용하세요. 상세 번역 내역은 [변경 기록](updates/2026-09-05/CHANGELOG.ko.md)을 참고하세요.
|
||||||
내부에 직접 복사만 하고 `docker-compose.yml`에는 bind-mount로 등록하지 않았던 것이
|
|
||||||
원인이었습니다. `docker cp`로 넣은 파일은 컨테이너의 쓰기 가능 레이어에만 존재하기 때문에,
|
|
||||||
이후 `main.cjs` 패치가 완전 재생성에도 살아남는지 테스트하려고 `docker compose down && up`을
|
|
||||||
실행했을 때 번역 파일 두 개가 컨테이너와 함께 통째로 사라졌습니다 (bind-mount 되어 있던
|
|
||||||
`main.cjs`만 살아남음). 서버가 `translations/ko/*.json` 요청에 404를 반환하기 시작했고,
|
|
||||||
i18next의 `fallbackLng:"en"` 설정 때문에 본문 텍스트가 조용히 영어로 대체됐습니다.
|
|
||||||
"한국어"라는 언어 이름만 정상이었던 이유는, 그 값이 이 JSON 파일이 아니라 별도의 DB 기반
|
|
||||||
API(`options/locales`)에서 오기 때문에 영향을 받지 않았던 것입니다.
|
|
||||||
|
|
||||||
데스크톱이 여전히 정상으로 보였던 이유는 단순히 파일이 사라지기 전에 브라우저가 이미
|
|
||||||
받아둔 번역 응답을 캐시하고 있었기 때문입니다 — 즉 데스크톱 쪽이 오히려 "낡은 캐시를
|
|
||||||
보여주던 쪽"이었고, 매번 새로 서버에 요청하는 모바일 쪽이 서버의 실제(망가진) 상태를
|
|
||||||
정확히 반영하고 있었던 것입니다. 세 개의 다른 모바일 브라우저에서 전부 동일한 증상이
|
|
||||||
나온 것도 이걸로 설명됩니다 — 캐시 종류와 무관하게 서버에 파일 자체가 없었으니까요.
|
|
||||||
|
|
||||||
**교훈**: `docker cp`로 컨테이너 안에 넣은 파일은 컨테이너가 사라지면 함께 사라집니다.
|
|
||||||
번역 파일도 `main.cjs`와 마찬가지로 **반드시 `docker-compose.yml`의 `volumes:`에
|
|
||||||
bind-mount로 선언**하세요 (위 설치 방법 3번, `docker-compose.yml.example` 참고). 그리고
|
|
||||||
증상이 "특정 기기에서만 재현됨", "캐시를 지워도 재현됨"처럼 보이더라도, 실제 원인은
|
|
||||||
클라이언트가 아니라 서버 쪽 데이터 유실일 수 있으므로 클라이언트 가설을 세우기 전에
|
|
||||||
서버가 실제로 무엇을 응답하는지(`curl`로 정확한 URL 직접 확인)부터 검증하는 게 우선입니다.
|
|
||||||
|
|
||||||
## 알려진 미해결 항목 — CKEditor 자체 툴바
|
|
||||||
|
|
||||||
CKEditor5 자체의 UI 문자열(툴바 버튼 이름 — "Paragraph", "Heading 2", "Bold" 등)은
|
|
||||||
이 프로젝트가 건드리는 번역 시스템과 완전히 별개인 `window.CKEDITOR_TRANSLATIONS`라는
|
|
||||||
자체 시스템에서 옵니다. 테스트한 빌드 기준으로, 독일어·프랑스어·스페인어·중국어를
|
|
||||||
포함해 이미 "지원"되는 언어 **어느 것도** 실제 CKEditor 사전을 갖고 있지 않아서 전부
|
|
||||||
영어 툴바로 나옵니다 — 한국어만의 문제가 아니라 업스트림 빌드 자체에 이미 있던 공백입니다.
|
|
||||||
|
|
||||||
## 라이선스
|
|
||||||
|
|
||||||
TriliumNext Notes 본체와 동일한 라이선스를 따릅니다. 무보증 — 이 프로젝트는 컴파일된
|
|
||||||
바이너리를 난독화된 변수명 문자열 매칭 방식으로 패치하는 것이라, 버전이 올라가면
|
|
||||||
깨지기 쉬운 구조입니다.
|
|
||||||
|
|||||||
@@ -1,11 +1,11 @@
|
|||||||
services:
|
services:
|
||||||
trilium:
|
trilium:
|
||||||
build: .
|
build: .
|
||||||
container_name: trilium-ko
|
image: ${TRILIUM_KO_IMAGE:-trilium-korean:2.0.0}
|
||||||
restart: unless-stopped
|
restart: unless-stopped
|
||||||
ports:
|
ports:
|
||||||
- '8082:8080'
|
- '${TRILIUM_KO_BIND:-127.0.0.1}:${TRILIUM_KO_PORT:-8082}:8080'
|
||||||
environment:
|
environment:
|
||||||
- TZ=Asia/Seoul
|
- TZ=Asia/Seoul
|
||||||
volumes:
|
volumes:
|
||||||
- ./data:/home/node/trilium-data
|
- ${TRILIUM_KO_DATA_DIR:-./data}:/home/node/trilium-data
|
||||||
|
|||||||
@@ -0,0 +1,42 @@
|
|||||||
|
# 한국어 배포판 2.0.0 검증 기록
|
||||||
|
|
||||||
|
검사일: 2026-09-13. Linux x86_64 서버의 Docker Engine 29.7.2와 Compose 5.5.0에서 검사했습니다. ARM과 다른 Trilium 버전으로의 업그레이드는 검사 범위에 포함하지 않습니다.
|
||||||
|
|
||||||
|
운영 컨테이너와 분리된 Compose 프로젝트를 사용했습니다. 포트는 서버의 루프백 주소 19092와 19093만 사용했으며 테스트 전용 새 데이터 폴더에서 검사했습니다.
|
||||||
|
|
||||||
|
| 검사 | 결과 |
|
||||||
|
|---|---|
|
||||||
|
| 고정된 공식 이미지에서 Docker 빌드 | 통과 |
|
||||||
|
| 이미지 내부 492개 파일 SHA-256 검사 | 통과 |
|
||||||
|
| 서버 번들 JavaScript 구문 검사 | 통과 |
|
||||||
|
| 설치 스크립트로 새 컨테이너 생성 | 통과 |
|
||||||
|
| 새 문서 생성과 기본 예제 가져오기 | HTTP 204 |
|
||||||
|
| 한국어 PDF 내용 검사 | 지정한 SHA-256과 일치 |
|
||||||
|
| 도움말 노트 생성 | 181개 |
|
||||||
|
| 내부 노트 링크 검사 | 끊어진 링크 0개 |
|
||||||
|
| 동일 설치의 재실행과 자동 백업 | 통과 |
|
||||||
|
| 공식 0.95.0 이미지에서 한국어 이미지로 전환 | 통과 |
|
||||||
|
| 업데이트 전후 노트 상태 비교 | 동일 |
|
||||||
|
| 종료 코드 42로 실패하는 이미지 배포 시험 | 실패를 감지하고 이전 이미지로 복귀 |
|
||||||
|
| 백업을 새 폴더에 복원 | 노트 상태 동일 |
|
||||||
|
| 복원한 데이터로 별도 컨테이너 기동 | 통과 |
|
||||||
|
| 실제 HTTP의 편집기 및 문서 파일 8개 | 배포 파일과 해시 일치 |
|
||||||
|
| Swagger 문서 경로 2개 | 정상 표시 파일 제공 |
|
||||||
|
|
||||||
|
업데이트와 복구 과정에서 비교한 활성 노트는 417개입니다. 노트 ID와 제목 및 본문 blobId 목록의 SHA-256은 `3441f91b417ce62fff0b7a9c04d5b5e3262c284ff53edf3bffe92dc690c815ff`입니다.
|
||||||
|
|
||||||
|
한국어 PDF의 SHA-256은 `1141ea4fb9d619fd55d75d0bdcd6bbd5678b161633586764d0eadfc4b9235400`입니다. 신규 예제 압축 파일은 원본 노트 170개를 제목 경로로 대응시켜 만들었습니다. 148개 노트의 번역 수정과 통계 표시 및 속성 이름과 할 일 접두사 및 PDF를 포함합니다. 원본의 폴더 항목과 가져오기 순서도 보존했습니다.
|
||||||
|
|
||||||
|
일반 배포용 main.cjs의 SHA-256은 `d0dd274cc5ad926e8f9297bb0bd2ae806227dae686983bf76550dc2b3fed642f`입니다. 운영 서버에 사용했던 일회성 노트 마이그레이션 함수와 호출을 제거했으므로 운영 서버의 main.cjs와 해시가 다른 것이 정상입니다.
|
||||||
|
|
||||||
|
## 시험 중 발견하고 수정한 사항
|
||||||
|
|
||||||
|
첫 예제 압축본은 폴더 항목이 빠져 일부 상위 노트를 생성하지 못했습니다. 원본 ZIP의 디렉토리 항목과 순서를 보존하도록 고친 뒤 완전히 새로운 데이터 폴더에서 새 문서 생성과 링크 검사를 다시 통과했습니다.
|
||||||
|
|
||||||
|
첫 실패 복귀 시험에서는 Docker가 재빌드 후 이전 이미지 다이제스트를 찾지 못했습니다. 새 빌드 전에 이전 이미지에 고유한 복구 태그를 붙이도록 변경했습니다. 수정 후 고의 실패를 다시 일으켜 이전 이미지와 기동 상태가 복구되는 것을 확인했습니다.
|
||||||
|
|
||||||
|
## 적용 범위
|
||||||
|
|
||||||
|
이 기록은 위 고정 버전과 환경에서 실제 수행한 검사 결과입니다. 새 설치와 공식 0.95.0에서의 전환 및 재설치 경로를 확인했습니다. 최신 Trilium 버전의 DB를 0.95.0으로 내리는 작업을 보장하지 않습니다. 기존 노트 본문을 자동으로 다시 번역하는 기능은 설치 프로그램에 넣지 않았습니다.
|
||||||
|
|
||||||
|
원시 검사 결과는 `test-results`에 있으며 검사에 사용한 스크립트는 `tools/test-database.py`와 `tools/test-release-recovery.py`에 있습니다. 이 스크립트들은 운영 DB 오작동을 막기 위해 당시 테스트 경로만 허용합니다. 일반 설치에는 이 검사 스크립트가 필요하지 않습니다.
|
||||||
@@ -0,0 +1,80 @@
|
|||||||
|
# 버전 업데이트와 추가 번역
|
||||||
|
|
||||||
|
이 저장소는 Trilium 한국어 배포판 전용이다. 게임 저장소나 게임 문서에 작업 기록을 넣지 않는다.
|
||||||
|
|
||||||
|
현재 운영 기준은 Trilium 0.95.0과 한국어 배포판 2.0.0이다. 다음 버전 번역을 이어 갈 준비를 위한 도구이며 최신 Trilium 지원을 완료한 것은 아니다. 기존 배포 파일과 운영 데이터는 이 도구로 변경하지 않는다.
|
||||||
|
|
||||||
|
## 이어서 작업할 자료
|
||||||
|
|
||||||
|
| 대상 | 기준 자료 | 다음 버전에서 할 일 |
|
||||||
|
|---|---|---|
|
||||||
|
| UI 번역 | `localization/baseline.json`의 영문과 한국어 파일 | 키와 원문을 비교한 뒤 새 문구와 변경된 문구 번역 |
|
||||||
|
| 서버 번역 | `release/app/assets/translations/ko/server.json` | 같은 버전의 공식 영문을 확보한 뒤 비교 도구에 명시적으로 전달 |
|
||||||
|
| 직접 수정한 코드 | `release/app/main.cjs`와 `release/app/public/src` | 새 버전 원본 소스에서 해당 기능을 찾아 번역 키로 수정 |
|
||||||
|
| 도움말 | `release/app/assets/doc_notes/en` | 원본 문서의 변경 내용과 내부 링크를 대조 |
|
||||||
|
| 예제와 PDF | `tools/demo-source`와 `tools/build-demo-archive.py` | 새 예제 구조와 노트 연결을 확인한 뒤 새 설치 환경에서 검사 |
|
||||||
|
| 이미지 | 도움말 이미지와 한국어 설명 | 원본 이미지를 유지하고 설명을 보완하는 기존 정책 유지 |
|
||||||
|
| 변경 이력 | `updates/2026-09-05` | 과거 작업의 참고 자료로 보존 |
|
||||||
|
|
||||||
|
`tools/build-release.mjs`는 0.95.0용 과거 작업 결과를 다시 모으는 도구다. 새 버전 이식 도구로 사용하지 않는다. 예제 생성 도구도 기존 노트 구조에 맞춰져 있으므로 새 버전에 바로 적용하지 않는다.
|
||||||
|
|
||||||
|
## 1. 원본과 작업 기준 확보
|
||||||
|
|
||||||
|
운영과 분리된 작업 폴더에서 대상 버전의 공식 소스와 배포 이미지를 확보한다. 버전과 커밋 및 이미지 다이제스트를 기록한다. 작업 브랜치는 `translation/대상버전` 형태로 구분한다. 기존 데이터와 비밀 파일은 저장소에 넣지 않는다.
|
||||||
|
|
||||||
|
영문 파일은 반드시 대상 버전에서 가져온다. 현재 저장소에 이전 서버 영문 사전은 없으므로 한국어 파일을 영문 기준으로 간주하면 안 된다. UI 기준은 `localization/baseline.json`에 경로와 SHA-256을 고정했다.
|
||||||
|
|
||||||
|
## 2. UI 문구 비교
|
||||||
|
|
||||||
|
Node.js 20 이상에서 저장소 루트를 기준으로 실행한다. 출력 폴더는 아직 존재하지 않는 경로를 지정한다.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
node tools/translation-upgrade.mjs 대상버전 /작업/새버전/translation.en.json /작업/번역검토
|
||||||
|
```
|
||||||
|
|
||||||
|
다른 사전이나 이후 버전의 검토 완료 자료를 기준으로 삼을 때는 이전 영문과 한국어를 함께 지정한다.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
node tools/translation-upgrade.mjs 대상버전 /작업/새영문.json /작업/서버검토 /작업/이전영문.json /작업/이전한국어.json
|
||||||
|
```
|
||||||
|
|
||||||
|
`review.json`에는 키 경로와 새 원문 및 이전 원문과 한국어 후보가 함께 들어간다.
|
||||||
|
|
||||||
|
| 상태 | 처리 |
|
||||||
|
|---|---|
|
||||||
|
| `reusable` | 원문과 자리표시자가 같아 재사용 후보로 분류됨. 화면 문맥은 확인해야 함 |
|
||||||
|
| `added` | 새 키. 한국어를 새로 작성 |
|
||||||
|
| `source-changed` | 원문이 바뀜. 이전 한국어를 참고해 다시 번역 |
|
||||||
|
| `missing` | 한국어가 없거나 빈 문자열임 |
|
||||||
|
| `placeholder-mismatch` | 변수 자리표시자가 다름. 적용 전 수정 |
|
||||||
|
| `review-identical` | 원문과 번역이 같음. 고유 명칭인지 미번역인지 확인 |
|
||||||
|
| `removed` | 새 사전에서 없어짐. 이전 기록에만 보존 |
|
||||||
|
|
||||||
|
이 도구는 i18next 중괄호 변수와 템플릿 변수 및 일반 printf 자리표시자를 비교한다. 모든 메시지 문법이나 HTML 및 복수형 의미를 검증하지는 않는다. 새 원문과 한국어를 검토한 뒤 대상 버전의 번역 파일에 반영한다. JSON 키를 바꾸거나 원문이 바뀐 문구에 이전 한국어를 일괄 덮어쓰지 않는다.
|
||||||
|
|
||||||
|
## 3. 코드와 도움말 수정 대상 비교
|
||||||
|
|
||||||
|
공식 이전 이미지와 새 이미지에서 앱 파일을 각각 별도 폴더로 추출한다. 두 폴더 모두 `main.cjs`와 `assets` 등이 바로 아래에 있어야 한다.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
node tools/translation-files.mjs /작업/이전원본앱 /작업/새원본앱 /작업/파일비교.json
|
||||||
|
```
|
||||||
|
|
||||||
|
현재 배포판의 수정 대상 492개 경로를 비교한다. 변경되거나 이동한 파일은 수동 검토 대상으로 삼는다. 한국어판에만 있는 파일도 별도로 표시한다. 새 버전에 추가된 다른 파일은 이 목록에 없으므로 공식 소스의 버전 간 Git diff도 함께 확인한다.
|
||||||
|
|
||||||
|
빌드된 `main.cjs`를 새 버전에 덮어쓰지 않는다. 바뀐 기능을 원본 소스에서 찾아 번역 기능을 연결하고 다시 빌드한다. 공식 기여를 준비할 때도 UI 사전과 번역 기능 추가 및 도움말 변경을 나누어 검토한다.
|
||||||
|
|
||||||
|
## 4. 검증과 배포
|
||||||
|
|
||||||
|
1. 자연스러운 한국어와 변수 및 링크를 검사한다. 문장을 잇기 위한 쉼표를 사용하지 않는다.
|
||||||
|
2. 대상 버전 소스의 빌드와 관련 검사를 수행한다.
|
||||||
|
3. 별도 Docker 환경에서 신규 설치와 한국어 선택 및 기본 예제를 확인한다.
|
||||||
|
4. 운영 데이터의 백업 사본으로 업데이트와 첨부 파일 및 검색을 확인한다.
|
||||||
|
5. 실패 시 이전 이미지와 해당 버전 데이터 백업으로 복원할 수 있는지 검사한다.
|
||||||
|
6. 기반 이미지와 배포 버전 및 생성 도구를 새 버전에 맞춰 수정한다. 파일 해시 검증과 실제 화면 확인을 마친 뒤 배포한다.
|
||||||
|
|
||||||
|
## 5. 다음 작업을 위한 기록
|
||||||
|
|
||||||
|
검토를 마친 새 영문과 한국어 사전의 경로와 해시를 새 기준으로 기록한다. 이전 기준은 Git 기록에 보존한다. `PROJECT_MEMORY.md`와 `수정기록.txt`에 버전과 변경 내용 및 검사 결과와 배포 여부를 남긴다. 번역 검토 자료는 비밀값이 없는지 확인한 뒤 해당 버전 폴더에 보관한다. 운영 노트를 기록할 때는 Trilium의 `Ubuntu 서버 운영` 아래 기존 Trilium 분류를 찾아 사용한다.
|
||||||
|
|
||||||
|
이번 준비 작업은 운영 앱과 데이터베이스를 변경하지 않는다. 새 버전 자동 배포나 자동 번역을 예약하지 않는다.
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
{"activeNotes": 417, "koreanTitles": 319, "helpNotes": 181, "koreanPdf": true, "danglingInternalLinks": 0, "noteSnapshotSha256": "3441f91b417ce62fff0b7a9c04d5b5e3262c284ff53edf3bffe92dc690c815ff"}
|
||||||
@@ -0,0 +1,15 @@
|
|||||||
|
{
|
||||||
|
"status": "passed",
|
||||||
|
"newInstall": true,
|
||||||
|
"initialDocumentCreationStatus": 204,
|
||||||
|
"official095Upgrade": true,
|
||||||
|
"repeatInstall": true,
|
||||||
|
"httpAssetChecks": 8,
|
||||||
|
"swaggerChecks": 2,
|
||||||
|
"dataSnapshotUnchanged": true,
|
||||||
|
"release": "2.0.0",
|
||||||
|
"appVersion": "0.95.0",
|
||||||
|
"engine": "29.7.2",
|
||||||
|
"compose": "5.5.0",
|
||||||
|
"platform": "linux/amd64"
|
||||||
|
}
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
{
|
||||||
|
"forcedFailureRejected": true,
|
||||||
|
"previousImageRestored": true,
|
||||||
|
"backupDataMatched": true,
|
||||||
|
"restoredContainerStarted": true,
|
||||||
|
"backup": "/tmp/trilium-release-test-20260913-r1/backups/20260913T094924Z-414939/data.tar.gz",
|
||||||
|
"restoredNoteSnapshotSha256": "3441f91b417ce62fff0b7a9c04d5b5e3262c284ff53edf3bffe92dc690c815ff"
|
||||||
|
}
|
||||||
@@ -1,46 +1,20 @@
|
|||||||
#!/usr/bin/env bash
|
#!/usr/bin/env bash
|
||||||
# TriliumNext Notes 한국어 패치 — 원클릭 설치 스크립트
|
|
||||||
#
|
|
||||||
# 사용법:
|
|
||||||
# curl -fsSL https://gitea.itosm.co.kr/syskiller/triliumnext-korean-patch/raw/branch/main/install.sh | bash
|
|
||||||
# 또는 저장소를 직접 clone 한 뒤:
|
|
||||||
# ./install.sh [설치 폴더 이름, 기본값: trilium-korean]
|
|
||||||
set -euo pipefail
|
set -euo pipefail
|
||||||
|
REPO_URL='https://gitea.itosm.co.kr/syskiller/triliumnext-korean-patch.git'
|
||||||
REPO_URL="https://gitea.itosm.co.kr/syskiller/triliumnext-korean-patch.git"
|
source_dir="$(cd -- "$(dirname -- "${BASH_SOURCE[0]:-.}")" 2>/dev/null && pwd || pwd)"
|
||||||
INSTALL_DIR="${1:-trilium-korean}"
|
if [[ $# -eq 0 && -f "$source_dir/release/manifest.json" ]]; then
|
||||||
PORT="${TRILIUM_KO_PORT:-8082}"
|
install_dir="$source_dir"
|
||||||
|
|
||||||
if ! command -v docker >/dev/null 2>&1; then
|
|
||||||
echo "Docker가 설치되어 있지 않습니다. https://docs.docker.com/get-docker/ 를 먼저 설치하세요." >&2
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
if ! docker compose version >/dev/null 2>&1; then
|
|
||||||
echo "Docker Compose 플러그인이 필요합니다 (docker compose, 하이픈 없는 버전)." >&2
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ -d "$INSTALL_DIR/.git" ]; then
|
|
||||||
echo "이미 설치되어 있습니다. 최신 패치로 업데이트합니다: $INSTALL_DIR"
|
|
||||||
git -C "$INSTALL_DIR" pull --ff-only
|
|
||||||
else
|
else
|
||||||
echo "저장소를 내려받습니다: $INSTALL_DIR"
|
install_dir="${1:-trilium-korean}"
|
||||||
git clone --depth 1 "$REPO_URL" "$INSTALL_DIR"
|
command -v git >/dev/null || { echo 'Git을 먼저 설치하세요.' >&2; exit 1; }
|
||||||
|
if [[ -d "$install_dir/.git" ]]; then
|
||||||
|
[[ -z "$(git -C "$install_dir" status --porcelain)" ]] || { echo '설치 폴더에 수정한 파일이 있습니다. 먼저 보관하거나 커밋하세요.' >&2; exit 1; }
|
||||||
|
git -C "$install_dir" pull --ff-only
|
||||||
|
elif [[ -e "$install_dir" ]]; then
|
||||||
|
echo '설치 대상 폴더가 이미 있습니다. 저장소 폴더에서 인수 없이 실행하거나 빈 경로를 지정하세요.' >&2; exit 1
|
||||||
|
else
|
||||||
|
git clone "$REPO_URL" "$install_dir"
|
||||||
|
fi
|
||||||
fi
|
fi
|
||||||
|
cd -- "$install_dir"
|
||||||
cd "$INSTALL_DIR"
|
exec bash tools/deploy.sh
|
||||||
|
|
||||||
if [ "$PORT" != "8082" ]; then
|
|
||||||
sed -i.bak "s/'8082:8080'/'${PORT}:8080'/" docker-compose.yml
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo "이미지를 빌드하고 컨테이너를 시작합니다 (최초 실행 시 몇 분 걸릴 수 있습니다)..."
|
|
||||||
docker compose up -d --build
|
|
||||||
|
|
||||||
echo
|
|
||||||
echo "설치 완료! http://localhost:${PORT} 로 접속하세요."
|
|
||||||
echo "처음 접속하면 초기 설정(마스터 비밀번호) 화면이 뜹니다."
|
|
||||||
echo "설정이 끝나면 옵션 → 언어 및 지역에서 '한국어'를 선택하세요."
|
|
||||||
echo
|
|
||||||
echo "업데이트하려면 이 스크립트를 같은 폴더 이름으로 다시 실행하면 됩니다: $INSTALL_DIR"
|
|
||||||
|
|||||||
@@ -0,0 +1,197 @@
|
|||||||
|
# TriliumNext Notes 한국어 패치 (번역 + main.cjs 패치)
|
||||||
|
|
||||||
|
최신 진행 상황: [2026-09-13 작업 기록](updates/2026-09-05/PROGRESS.md). 도움말 본문 173개와 제목 181개를 운영 서버에 반영했습니다. 전체 한글화는 추가 점검 중입니다.
|
||||||
|
|
||||||
|
## 2026-09-05 후속 작업
|
||||||
|
|
||||||
|
[최신 작업 상태와 파일](updates/2026-09-05/README.md) 및 [상세 변경 기록](updates/2026-09-05/CHANGELOG.ko.md)을 추가했습니다. 운영 서버에는 예제 노트 148개 수정과 편집기 한국어 사전 719개 문구 등을 반영했습니다. 2026-09-13에 기본 도움말 전체와 목록 제목을 서버에 반영했습니다. 전체 한글화는 진행 중입니다.
|
||||||
|
|
||||||
|
아래의 기존 설치 안내와 v1.0.0 다운로드는 이전 배포판에 대한 설명입니다. 이번 작업 폴더의 파일은 기존 설치 프로그램에 자동으로 포함되지 않습니다.
|
||||||
|
|
||||||
|
[TriliumNext Notes](https://github.com/TriliumNext/Notes)의 비공식 커뮤니티 한국어 번역입니다.
|
||||||
|
이 글을 쓰는 시점 기준으로 TriliumNext는 한국어 언어팩이 없고, 심지어 UI 언어 선택기에
|
||||||
|
뜨는 지원 언어 목록 자체가 `translations/` 폴더를 스캔해서 만들어지는 게 아니라 **컴파일된
|
||||||
|
서버 번들(`main.cjs`) 안에 하드코딩된 배열**이라서, 번역 파일만 올바른 경로에 넣는다고
|
||||||
|
"한국어"가 언어 선택기에 나타나지 않습니다. 그래서 번역 파일 외에 서버 번들을 패치하는
|
||||||
|
스크립트도 함께 제공합니다.
|
||||||
|
|
||||||
|
## 압축 파일로 받기
|
||||||
|
|
||||||
|
Git 없이 필요한 파일만 바로 받고 싶다면 압축된 배포판을 받으세요. 두 종류가 있습니다
|
||||||
|
([릴리스 페이지](https://gitea.itosm.co.kr/syskiller/triliumnext-korean-patch/releases/tag/v1.0.0)):
|
||||||
|
|
||||||
|
- **[triliumnext-korean-patch.zip 다운로드](https://gitea.itosm.co.kr/attachments/11f09ff6-4d85-4234-8360-a4ae968dd437)**
|
||||||
|
(2.5MB) — **처음 새로 설치하는 경우.** `Dockerfile`, `install.sh`, `docker-compose.yml`까지
|
||||||
|
전부 포함되어 있어서, 압축을 풀고 `./install.sh`를 실행하거나 `docker compose up -d --build`를
|
||||||
|
실행하면 한국어가 내장된 새 컨테이너가 만들어집니다.
|
||||||
|
- **[triliumnext-korean-patch-only.zip 다운로드](https://gitea.itosm.co.kr/attachments/679762e6-8b68-48e4-9954-82a2163750a8)**
|
||||||
|
(2.4MB) — **이미 Trilium을 운영 중인 경우.** 이미지를 새로 빌드하거나 컨테이너를 새로
|
||||||
|
만들지 않고, 기존 데이터/설정을 그대로 둔 채 파일 3개만 bind-mount로 추가합니다.
|
||||||
|
압축 안의 `README.md`에 기존 `docker-compose.yml`에 반영하는 방법이 자세히 적혀 있습니다.
|
||||||
|
|
||||||
|
## 포함된 파일
|
||||||
|
|
||||||
|
- `install.sh` — **원클릭 설치 스크립트**. 명령어 한 줄로 저장소를 내려받고, 한국어가
|
||||||
|
내장된 이미지를 빌드해서 바로 실행시킵니다.
|
||||||
|
- `Dockerfile` — `triliumnext/notes:latest` 위에 번역 파일과 패치된 `main.cjs`를
|
||||||
|
구워 넣어서, 별도 bind-mount 없이 한국어가 기본 내장된 이미지를 만듭니다.
|
||||||
|
- `docker-compose.yml` — 위 `Dockerfile`로 빌드해서 바로 띄우는 compose 파일
|
||||||
|
(`install.sh`가 내부적으로 이걸 사용합니다).
|
||||||
|
- `translation.json` — 클라이언트(브라우저) UI 문자열, 1,712개 키, 100% 번역 완료.
|
||||||
|
- `server.json` — 서버 문자열, 283개 키, 100% 번역 완료.
|
||||||
|
- `main.cjs` — **이미 패치가 적용된, 바로 쓸 수 있는 서버 번들** (`triliumnext/notes:latest`,
|
||||||
|
빌드일 2025-06-07, appVersion 0.95.0 기준).
|
||||||
|
- `patch_main_cjs.js` — 위 `main.cjs`를 만들어낸 패치 스크립트. 다른 버전의 이미지를 쓰거나
|
||||||
|
이미지가 업데이트된 경우, 이 스크립트를 새 원본 `main.cjs`에 다시 돌려서 직접 패치된
|
||||||
|
파일을 만들어야 합니다 (왜 이게 필요한지는 스크립트 상단 주석 참고).
|
||||||
|
- `docker-compose.bind-mount.yml.example` — 이미 떠 있는 공식 이미지 컨테이너에 파일만
|
||||||
|
bind-mount로 추가하고 싶을 때 쓰는 예시 (이미지를 새로 빌드하지 않는 방식).
|
||||||
|
|
||||||
|
`triliumnext/notes:latest` (빌드일 2025-06-07, appVersion 0.95.0) 기준으로 테스트했습니다.
|
||||||
|
`main.cjs` 안의 변수명은 전부 난독화(minify)되어 있고 **빌드마다 이름이 바뀔 수 있습니다** —
|
||||||
|
`patch_main_cjs.js`를 새 이미지에 돌렸을 때 `[skip]`이 출력되면, 스크립트가 찾는 문자열
|
||||||
|
패턴이 그 빌드에서 바뀐 것이니 새 빌드에서 같은 패턴을 다시 찾아 스크립트를 갱신해야 합니다.
|
||||||
|
|
||||||
|
## 설치 방법 — 명령어 한 줄 (추천)
|
||||||
|
|
||||||
|
Docker와 Docker Compose 플러그인만 설치되어 있으면 됩니다:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
curl -fsSL https://gitea.itosm.co.kr/syskiller/triliumnext-korean-patch/raw/branch/main/install.sh | bash
|
||||||
|
```
|
||||||
|
|
||||||
|
기본적으로 `./trilium-korean` 폴더에 저장소를 내려받고, 한국어가 내장된 이미지를 빌드해서
|
||||||
|
`http://localhost:8082`로 띄웁니다. 포트를 바꾸고 싶으면:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
TRILIUM_KO_PORT=9000 curl -fsSL https://gitea.itosm.co.kr/syskiller/triliumnext-korean-patch/raw/branch/main/install.sh | bash
|
||||||
|
```
|
||||||
|
|
||||||
|
설치가 끝나면 브라우저로 접속해서 초기 비밀번호를 설정한 뒤, **옵션 → 언어 및 지역**에서
|
||||||
|
"한국어"를 선택하고 페이지를 새로고침하면 됩니다 (본문 텍스트까지 전부 한국어로 바뀌려면
|
||||||
|
새로고침이 한 번 필요합니다 — 앱 자체의 동작이며 이 패치의 문제는 아닙니다).
|
||||||
|
|
||||||
|
업데이트하려면 같은 명령어를 같은 폴더에서 다시 실행하면 됩니다.
|
||||||
|
|
||||||
|
## 설치 방법 — 이미 떠 있는 컨테이너에 추가하고 싶은 경우
|
||||||
|
|
||||||
|
이미지를 새로 빌드하지 않고, 이미 쓰고 있는 공식 `triliumnext/notes` 컨테이너에 파일만
|
||||||
|
얹고 싶다면:
|
||||||
|
|
||||||
|
1. **번역 파일 + `main.cjs`를 `docker-compose.yml`에 bind-mount로 등록**
|
||||||
|
(`docker cp`로만 넣지 말 것 — 아래 "문제 4" 참고):
|
||||||
|
- `main.cjs` → `/usr/src/app/main.cjs`
|
||||||
|
- `translation.json` → `/usr/src/app/public/translations/ko/translation.json`
|
||||||
|
- `server.json` → `/usr/src/app/assets/translations/ko/server.json`
|
||||||
|
2. `docker-compose.bind-mount.yml.example`을 참고해서 그대로 적용, 컨테이너 재시작.
|
||||||
|
3. 앱 안에서 **옵션 → 언어 및 지역**에서 "한국어" 선택 후 새로고침.
|
||||||
|
|
||||||
|
## 설치 방법 — 다른 이미지 버전을 쓰는 경우 (직접 패치)
|
||||||
|
|
||||||
|
이미지 버전이 다르면 `main.cjs`의 난독화된 변수명/위치가 달라 이 저장소의 `main.cjs`가
|
||||||
|
그대로 안 맞을 수 있습니다. 이 경우 직접 패치해야 합니다:
|
||||||
|
|
||||||
|
1. 번역 파일은 위와 동일하게 bind-mount.
|
||||||
|
2. **컨테이너의 원본(패치 안 된) `main.cjs`를 추출**하고 패치 스크립트 실행:
|
||||||
|
```bash
|
||||||
|
docker create --name trilium-tmp triliumnext/notes:latest
|
||||||
|
docker cp trilium-tmp:/usr/src/app/main.cjs ./main.cjs
|
||||||
|
docker rm trilium-tmp
|
||||||
|
node patch_main_cjs.js ./main.cjs
|
||||||
|
node --check ./main.cjs # 반드시 배포 전에 문법 검사
|
||||||
|
```
|
||||||
|
`[skip]`이 출력되면 스크립트가 찾는 문자열 패턴이 그 빌드에서 바뀐 것이니, 새 빌드에서
|
||||||
|
같은 패턴을 다시 찾아 스크립트를 갱신해야 합니다 (아래 "빌드마다 달라짐" 참고).
|
||||||
|
3. **패치된 `main.cjs`를 `docker-compose.yml`에서 원본 위치에 bind-mount** —
|
||||||
|
`docker-compose.bind-mount.yml.example` 참고:
|
||||||
|
```yaml
|
||||||
|
services:
|
||||||
|
trilium:
|
||||||
|
image: triliumnext/notes:latest
|
||||||
|
restart: unless-stopped
|
||||||
|
ports:
|
||||||
|
- '127.0.0.1:18082:8080'
|
||||||
|
environment:
|
||||||
|
- TZ=Asia/Seoul
|
||||||
|
volumes:
|
||||||
|
- ./data:/home/node/trilium-data
|
||||||
|
- ./main.cjs:/usr/src/app/main.cjs:ro
|
||||||
|
- ./translation.json:/usr/src/app/public/translations/ko/translation.json:ro
|
||||||
|
- ./server.json:/usr/src/app/assets/translations/ko/server.json:ro
|
||||||
|
```
|
||||||
|
4. 컨테이너 시작 후 앱 안에서 **옵션 → 언어 및 지역**에서 "한국어" 선택.
|
||||||
|
|
||||||
|
## 겪었던 문제와 해결 (설치 전에 꼭 읽어보세요)
|
||||||
|
|
||||||
|
### 문제 1 — DB에서 `locale`을 직접 `'ko'`로 바꾸면 크래시
|
||||||
|
|
||||||
|
지원 언어 목록에 없는 값을 옵션 DB에 직접 넣으면 앱이 시작하다가 죽습니다. 이 방법으로는
|
||||||
|
안 되고, 반드시 아래처럼 서버 번들 자체를 패치해야 합니다.
|
||||||
|
|
||||||
|
### 문제 2 — `main.cjs` 패치 위치를 잘못 잡으면 문법 자체가 깨짐
|
||||||
|
|
||||||
|
지원 언어 배열(테스트한 빌드에서 변수명 `K5i`)에 새 항목을 삽입할 때, 배열의 여는 대괄호
|
||||||
|
`[` **바로 뒤**가 아니라 그 앞(변수 선언문 쪽)에 잘못 삽입하면 JS 문법 자체가 깨져서 앱이
|
||||||
|
아예 뜨지 못하고 크래시를 반복합니다. `patch_main_cjs.js`는 이 위치를 정확히 계산해서
|
||||||
|
삽입하지만, **패치 후에는 항상 `node --check`로 문법을 먼저 확인**하고 나서 컨테이너를
|
||||||
|
재시작하세요.
|
||||||
|
|
||||||
|
### 문제 3 — 완전 재생성(`docker compose down && up`) 시에만 나타나는 크래시
|
||||||
|
|
||||||
|
지원 언어 배열만 고치면 `docker restart`로는 잘 동작하는 것처럼 보이지만, 컨테이너를 완전히
|
||||||
|
내렸다 올리면(`down && up`) 다시 크래시합니다. 원인은 Trilium 자체 번역과는 별개로,
|
||||||
|
**CKEditor 내장 다국어 리소스를 지연 로드하는 두 번째 하드코딩 맵**(테스트한 빌드에서
|
||||||
|
변수명 `IMi`)에도 `ko` 항목이 없어서 발생하는 `TypeError`입니다. 이 리소스는 애초에
|
||||||
|
한국어용 청크가 빌드에 포함되어 있지 않아 새로 만들 수 없으므로, `patch_main_cjs.js`는
|
||||||
|
이 항목을 영어 로더로 대체(alias)해서 우회합니다. **`restart`뿐 아니라 완전 재생성까지
|
||||||
|
반드시 테스트**하세요 — 재시작만으로는 이 문제가 드러나지 않습니다.
|
||||||
|
|
||||||
|
### 문제 4 — 번역이 배포 후 시간이 지나서 "모바일에서만" 다시 영어로 보임
|
||||||
|
|
||||||
|
가장 까다로웠던 문제입니다. 번역을 배포하고 정상 동작까지 확인했는데, 이후 **모바일
|
||||||
|
기기에서만** 옵션 페이지 등의 본문 텍스트가 다시 영어로 나오는 현상이 발생했습니다
|
||||||
|
(페이지 제목이나 "한국어"라는 언어 이름 자체는 정상). 데스크톱에서는 동일 페이지가
|
||||||
|
100% 정상이었습니다.
|
||||||
|
|
||||||
|
처음엔 모바일 브라우저 캐시 문제로 의심했지만, 캐시를 초기화하고 서로 다른 브라우저
|
||||||
|
엔진(Chrome, 삼성인터넷, 네이버) 세 개로 테스트해도 완전히 동일한 증상이 재현되어
|
||||||
|
캐시 이론은 기각했습니다.
|
||||||
|
|
||||||
|
**진짜 원인**: 번역 파일(`translation.json`, `server.json`)을 `docker cp`로 컨테이너
|
||||||
|
내부에 직접 복사만 하고 `docker-compose.yml`에는 bind-mount로 등록하지 않았던 것이
|
||||||
|
원인이었습니다. `docker cp`로 넣은 파일은 컨테이너의 쓰기 가능 레이어에만 존재하기 때문에,
|
||||||
|
이후 `main.cjs` 패치가 완전 재생성에도 살아남는지 테스트하려고 `docker compose down && up`을
|
||||||
|
실행했을 때 번역 파일 두 개가 컨테이너와 함께 통째로 사라졌습니다 (bind-mount 되어 있던
|
||||||
|
`main.cjs`만 살아남음). 서버가 `translations/ko/*.json` 요청에 404를 반환하기 시작했고,
|
||||||
|
i18next의 `fallbackLng:"en"` 설정 때문에 본문 텍스트가 조용히 영어로 대체됐습니다.
|
||||||
|
"한국어"라는 언어 이름만 정상이었던 이유는, 그 값이 이 JSON 파일이 아니라 별도의 DB 기반
|
||||||
|
API(`options/locales`)에서 오기 때문에 영향을 받지 않았던 것입니다.
|
||||||
|
|
||||||
|
데스크톱이 여전히 정상으로 보였던 이유는 단순히 파일이 사라지기 전에 브라우저가 이미
|
||||||
|
받아둔 번역 응답을 캐시하고 있었기 때문입니다 — 즉 데스크톱 쪽이 오히려 "낡은 캐시를
|
||||||
|
보여주던 쪽"이었고, 매번 새로 서버에 요청하는 모바일 쪽이 서버의 실제(망가진) 상태를
|
||||||
|
정확히 반영하고 있었던 것입니다. 세 개의 다른 모바일 브라우저에서 전부 동일한 증상이
|
||||||
|
나온 것도 이걸로 설명됩니다 — 캐시 종류와 무관하게 서버에 파일 자체가 없었으니까요.
|
||||||
|
|
||||||
|
**교훈**: `docker cp`로 컨테이너 안에 넣은 파일은 컨테이너가 사라지면 함께 사라집니다.
|
||||||
|
번역 파일도 `main.cjs`와 마찬가지로 **반드시 `docker-compose.yml`의 `volumes:`에
|
||||||
|
bind-mount로 선언**하세요 (위 설치 방법 3번, `docker-compose.yml.example` 참고). 그리고
|
||||||
|
증상이 "특정 기기에서만 재현됨", "캐시를 지워도 재현됨"처럼 보이더라도, 실제 원인은
|
||||||
|
클라이언트가 아니라 서버 쪽 데이터 유실일 수 있으므로 클라이언트 가설을 세우기 전에
|
||||||
|
서버가 실제로 무엇을 응답하는지(`curl`로 정확한 URL 직접 확인)부터 검증하는 게 우선입니다.
|
||||||
|
|
||||||
|
## 이전 배포판의 미해결 항목 — CKEditor 자체 툴바
|
||||||
|
|
||||||
|
2026-09-05 후속 패치에서는 한국어 사전 719개를 적용하고 운영 화면을 확인했습니다. 다음 문단은 이전 배포판의 기록입니다.
|
||||||
|
|
||||||
|
CKEditor5 자체의 UI 문자열(툴바 버튼 이름 — "Paragraph", "Heading 2", "Bold" 등)은
|
||||||
|
이 프로젝트가 건드리는 번역 시스템과 완전히 별개인 `window.CKEDITOR_TRANSLATIONS`라는
|
||||||
|
자체 시스템에서 옵니다. 테스트한 빌드 기준으로, 독일어·프랑스어·스페인어·중국어를
|
||||||
|
포함해 이미 "지원"되는 언어 **어느 것도** 실제 CKEditor 사전을 갖고 있지 않아서 전부
|
||||||
|
영어 툴바로 나옵니다 — 한국어만의 문제가 아니라 업스트림 빌드 자체에 이미 있던 공백입니다.
|
||||||
|
|
||||||
|
## 라이선스
|
||||||
|
|
||||||
|
TriliumNext Notes 본체와 동일한 라이선스를 따릅니다. 무보증 — 이 프로젝트는 컴파일된
|
||||||
|
바이너리를 난독화된 변수명 문자열 매칭 방식으로 패치하는 것이라, 버전이 올라가면
|
||||||
|
깨지기 쉬운 구조입니다.
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
{
|
||||||
|
"appVersion": "0.95.0",
|
||||||
|
"koreanSha256": "e1d34275426dabf9aabf2f9b3ec880157946975f9f3f5a9035cf412ce02c9114",
|
||||||
|
"english": "updates/2026-09-05/work/trilium/scoped/translation.en.json",
|
||||||
|
"englishSha256": "3a08afa9a2215e53245466bc2ca84e5c2ff24edbfce0ee25577ff680cdb332ce",
|
||||||
|
"korean": "release/app/public/translations/ko/translation.json"
|
||||||
|
}
|
||||||
@@ -0,0 +1,56 @@
|
|||||||
|
# TriliumNext Notes 한국어 패치만 (기존 운영 중인 인스턴스용)
|
||||||
|
|
||||||
|
이미 Trilium Notes를 운영 중이고, 새 이미지를 빌드하거나 컨테이너를 새로 만들고 싶지
|
||||||
|
않은 경우를 위한 패키지입니다. 기존 데이터/설정은 그대로 두고 파일 3개만 컨테이너에
|
||||||
|
bind-mount로 추가하면 됩니다.
|
||||||
|
|
||||||
|
전체 배포판(Dockerfile, install.sh 포함, 새로 설치하는 사람용)은
|
||||||
|
[triliumnext-korean-patch](https://gitea.itosm.co.kr/syskiller/triliumnext-korean-patch)를 참고하세요.
|
||||||
|
|
||||||
|
## 포함된 파일
|
||||||
|
|
||||||
|
- `main.cjs` — 이미 패치가 적용된, 바로 쓸 수 있는 서버 번들
|
||||||
|
(`triliumnext/notes:latest`, 빌드일 2025-06-07, appVersion 0.95.0 기준).
|
||||||
|
- `translation.json` — 클라이언트 UI 문자열, 1,712개 키, 100% 번역.
|
||||||
|
- `server.json` — 서버 문자열, 283개 키, 100% 번역.
|
||||||
|
- `patch_main_cjs.js` — `main.cjs`를 만들어낸 패치 스크립트. 다른 버전의 이미지를 쓰고
|
||||||
|
있다면 이 저장소의 `main.cjs`가 안 맞을 수 있으니, 이 스크립트를 직접 돌려서 본인
|
||||||
|
이미지에 맞는 패치 파일을 새로 만드세요.
|
||||||
|
- `docker-compose.bind-mount.yml.example` — 기존 `docker-compose.yml`에 어떻게
|
||||||
|
반영하면 되는지 보여주는 예시.
|
||||||
|
|
||||||
|
## 적용 방법
|
||||||
|
|
||||||
|
1. 이 압축 파일을 기존 Trilium `docker-compose.yml`이 있는 폴더 옆에 풀어두거나,
|
||||||
|
`main.cjs`/`translation.json`/`server.json` 세 파일을 원하는 위치로 복사.
|
||||||
|
2. 기존 `docker-compose.yml`의 `trilium` 서비스에 아래 3줄을 `volumes:` 밑에 추가
|
||||||
|
(`docker-compose.bind-mount.yml.example` 참고, 경로는 본인 파일 위치에 맞게 조정):
|
||||||
|
```yaml
|
||||||
|
volumes:
|
||||||
|
- ./main.cjs:/usr/src/app/main.cjs:ro
|
||||||
|
- ./translation.json:/usr/src/app/public/translations/ko/translation.json:ro
|
||||||
|
- ./server.json:/usr/src/app/assets/translations/ko/server.json:ro
|
||||||
|
```
|
||||||
|
3. **주의: `docker cp`로 컨테이너 안에 파일만 직접 넣지 마세요.** 그렇게 하면 다음에
|
||||||
|
컨테이너를 완전히 재생성(`docker compose down && up`)할 때 파일이 통째로 사라져서,
|
||||||
|
나중에 "왜 갑자기 다시 영어로 나오지?" 하는 원인 불명의 문제가 생깁니다. 반드시
|
||||||
|
위 2번처럼 `docker-compose.yml`에 bind-mount로 등록하세요.
|
||||||
|
4. `docker compose up -d`로 재시작 (설정만 바뀌었으므로 `--build` 불필요).
|
||||||
|
5. 앱 안에서 **옵션 → 언어 및 지역**에서 "한국어" 선택 후 페이지 새로고침
|
||||||
|
(본문 텍스트까지 전부 한국어로 바뀌려면 새로고침이 한 번 필요합니다).
|
||||||
|
|
||||||
|
## 이미지 버전이 다른 경우
|
||||||
|
|
||||||
|
이 `main.cjs`는 위에 적은 특정 빌드용으로 패치된 파일입니다. 다른 버전을 쓰고 있어서
|
||||||
|
안 맞으면, 컨테이너의 원본 `main.cjs`를 추출해서 `patch_main_cjs.js`를 직접 돌리세요:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
docker create --name trilium-tmp triliumnext/notes:latest
|
||||||
|
docker cp trilium-tmp:/usr/src/app/main.cjs ./main.cjs
|
||||||
|
docker rm trilium-tmp
|
||||||
|
node patch_main_cjs.js ./main.cjs
|
||||||
|
node --check ./main.cjs # 반드시 배포 전에 문법 검사
|
||||||
|
```
|
||||||
|
|
||||||
|
전체 배경 설명(왜 이렇게 복잡한지, 겪었던 문제 4가지)은 전체 배포판 저장소의
|
||||||
|
[README](https://gitea.itosm.co.kr/syskiller/triliumnext-korean-patch)를 참고하세요.
|
||||||
|
After Width: | Height: | Size: 186 KiB |
|
After Width: | Height: | Size: 168 KiB |
|
After Width: | Height: | Size: 43 KiB |
|
After Width: | Height: | Size: 172 KiB |
|
After Width: | Height: | Size: 167 KiB |
|
After Width: | Height: | Size: 237 KiB |
|
After Width: | Height: | Size: 202 KiB |
|
After Width: | Height: | Size: 49 KiB |
|
After Width: | Height: | Size: 80 KiB |
|
After Width: | Height: | Size: 191 KiB |
@@ -0,0 +1,5 @@
|
|||||||
|
<p>이 버전에서 지원하는 제공자는 다음과 같습니다.</p><ul><li><a class="reference-link" href="#root/_help_7EdTxPADv95W">Ollama</a></li><li><a class="reference-link" href="#root/_help_ZavFigBX9AwP">OpenAI</a></li><li><a class="reference-link" href="#root/_help_e0lkirXEiSNc">Anthropic</a></li><li>Voyage AI</li></ul><p>사용할 대화 모델의 제공자 이름을 다음 위치에 입력하세요.</p><p><img style="aspect-ratio:1884/1267;" src="AI Provider Information_im.png"
|
||||||
|
width="1884" height="1267" alt="대화 모델 제공자 설정"></p><p>임베딩 제공자는 다음 위치에서 지정합니다.</p><p><img style="aspect-ratio:1907/1002;" src="1_AI Provider Information_im.png"
|
||||||
|
width="1907" height="1002" alt="임베딩 제공자 설정"></p>
|
||||||
|
|
||||||
|
<section class="korean-image-guide"><h2>예전 화면 이미지 읽는 법</h2><p>아래 설명은 본문에 나온 이미지 순서에 맞췄습니다. 이미지는 원본을 유지했으므로 영문 메뉴가 보일 수 있습니다. 현재 앱에서는 한국어 메뉴를 사용합니다. 코드와 주소 및 제품 이름은 원래 표기를 따릅니다.</p><h3>이미지 1 · 대화 모델 제공자 설정</h3><p>화면에서 사용하는 주요 표현은 다음과 같습니다.</p><ul><li><span lang="en">Provider Precedence</span>: 제공자 우선순위</li><li><span lang="en">Refresh Statistics</span>: 통계 새로고침</li><li><span lang="en">Processed Notes</span>: 처리된 노트</li><li><span lang="en">Last Processed</span>: 마지막 처리</li><li><span lang="en">Queued Notes</span>: 대기 중인 노트</li><li><span lang="en">Failed Notes</span>: 실패한 노트</li><li><span lang="en">Quick search</span>: 빠른 검색</li><li><span lang="en">Temperature</span>: 응답의 무작위성</li><li><span lang="en">Appearance</span>: 모양</li><li><span lang="en">Embeddings</span>: 임베딩</li><li><span lang="en">Shortcuts</span>: 단축키</li><li><span lang="en">Advanced</span>: 고급</li></ul><h3>이미지 2 · 임베딩 제공자 설정</h3><p>화면에서 사용하는 주요 표현은 다음과 같습니다.</p><ul><li><span lang="en">Provider Precedence</span>: 제공자 우선순위</li><li><span lang="en">Quick search</span>: 빠른 검색</li><li><span lang="en">Appearance</span>: 모양</li><li><span lang="en">Embeddings</span>: 임베딩</li><li><span lang="en">Shortcuts</span>: 단축키</li><li><span lang="en">Advanced</span>: 고급</li><li><span lang="en">Language</span>: 언어</li><li><span lang="en">Password</span>: 비밀번호</li><li><span lang="en">Options</span>: 옵션</li><li><span lang="en">Notes</span>: 노트</li><li><span lang="en">Other</span>: 기타</li><li><span lang="en">Model</span>: 모델</li></ul></section>
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
|
||||||
|
After Width: | Height: | Size: 47 KiB |
|
After Width: | Height: | Size: 270 KiB |
|
After Width: | Height: | Size: 24 KiB |
|
After Width: | Height: | Size: 13 KiB |
|
After Width: | Height: | Size: 89 KiB |
@@ -0,0 +1,10 @@
|
|||||||
|
<p><a href="https://ollama.com/">Ollama</a>는 여러 방식으로 설치할 수 있으며 <a href="https://hub.docker.com/r/ollama/ollama">Docker 컨테이너</a>에서도 실행할 수 있습니다. 지원되는 GPU를 사용하면 일반적으로 더 빠릅니다. CPU와 메모리만으로도 실행할 수 있습니다. 직접 설치하려면 공식 <a href="https://ollama.com/download">설치 프로그램</a>을 이용하세요.</p><p><img style="aspect-ratio:785/498;" src="3_Installing Ollama_image.png"
|
||||||
|
width="785" height="498" alt="Ollama 내려받기 화면"></p><p><img style="aspect-ratio:467/100;" src="Installing Ollama_image.png" width="467"
|
||||||
|
height="100" alt="설치 파일"></p><p><img style="aspect-ratio:1296/1011;" src="1_Installing Ollama_image.png"
|
||||||
|
width="1296" height="1011" alt="설치 진행 화면"></p><p>Windows에서는 설치 후 시작 메뉴에서 실행할 수 있습니다.</p><p><img style="aspect-ratio:1161/480;" src="2_Installing Ollama_image.png"
|
||||||
|
width="1161" height="480" alt="시작 메뉴의 Ollama"></p><p>PowerShell이나 명령 프롬프트에서 <code>ollama</code> 명령도 사용할 수 있습니다.</p><p><img style="aspect-ratio:1730/924;" src="5_Installing Ollama_image.png"
|
||||||
|
width="1730" height="924" alt="Ollama 명령줄 실행"></p><p>설치 후 <code>pull</code> 명령으로 사용할 모델을 내려받습니다. 다음은 원문 작성 시점인 2025년 4월에 소개한 도구 호출용 모델과 임베딩 모델의 예시입니다.</p><pre><code class="language-text-x-trilium-auto">ollama pull llama3.1:8b
|
||||||
|
ollama pull mxbai-embed-large</code></pre><p>기본 포트는 11434입니다. <a href="http://localhost:11434">로컬 Ollama 상태 페이지</a>를 열면 실행 여부를 확인할 수 있습니다.</p><p><img style="aspect-ratio:585/202;" src="4_Installing Ollama_image.png"
|
||||||
|
width="585" height="202" alt="Ollama 정상 실행 응답"></p><p>서비스를 실행하고 모델을 내려받았다면 Trilium에서 채팅 제공자와 임베딩 제공자로 설정할 준비가 된 것입니다.</p>
|
||||||
|
|
||||||
|
<section class="korean-image-guide"><h2>예전 화면 이미지 읽는 법</h2><p>아래 설명은 본문에 나온 이미지 순서에 맞췄습니다. 이미지는 원본을 유지했으므로 영문 메뉴가 보일 수 있습니다. 현재 앱에서는 한국어 메뉴를 사용합니다. 코드와 주소 및 제품 이름은 원래 표기를 따릅니다.</p><h3>이미지 1 · Ollama 내려받기 화면</h3><p>화면에서 사용하는 주요 표현은 다음과 같습니다.</p><ul><li><span lang="en">Download</span>: 다운로드</li></ul><h3>이미지 2 · 설치 파일</h3><p>화면에서 사용하는 주요 표현은 다음과 같습니다.</p><ul><li><span lang="en">Seconds</span>: 초</li></ul><h3>이미지 3 · 설치 진행 화면</h3><p>화면에서 사용하는 주요 표현은 다음과 같습니다.</p><ul><li><span lang="en">Version</span>: 버전</li><li><span lang="en">Cancel</span>: 취소</li></ul><h3>이미지 4 · 시작 메뉴의 Ollama</h3><p>화면에서 사용하는 주요 표현은 다음과 같습니다.</p><ul><li><span lang="en">Folders</span>: 폴더</li></ul><h3>이미지 5 · Ollama 명령줄 실행</h3><p>화면에서 사용하는 주요 표현은 다음과 같습니다.</p><ul><li><span lang="en">Version</span>: 버전</li><li><span lang="en">Model</span>: 모델</li><li><span lang="en">List</span>: 목록</li><li><span lang="en">Help</span>: 도움말</li><li><span lang="en">Copy</span>: 복사</li></ul><h3>이미지 6 · Ollama 정상 실행 응답</h3><p>Ollama 서버가 실행 중임을 알리는 응답입니다. 이 응답이 보이면 본문에 안내된 주소를 연결 설정에 사용합니다.</p></section>
|
||||||
|
After Width: | Height: | Size: 5.3 KiB |
@@ -0,0 +1 @@
|
|||||||
|
|
||||||
|
After Width: | Height: | Size: 198 KiB |
|
After Width: | Height: | Size: 175 KiB |
|
After Width: | Height: | Size: 548 KiB |
|
After Width: | Height: | Size: 76 KiB |
|
After Width: | Height: | Size: 52 KiB |
@@ -0,0 +1,2 @@
|
|||||||
|
<p>Trilium에서는 <a href="#root/_help_CdNpE2pqjmI6">스크립트</a>와 <a
|
||||||
|
href="#root/_help_OFXdgB2nNk1F">주요 속성</a>을 활용해 고급 기능을 만들 수 있습니다. 사용 방법을 보여 주기 위해 <a href="#root/_help_wX4HbRucYSDD">기본 예제 노트</a>에 다음 사례를 준비했습니다.</p><ul><li><a href="#root/_help_iRwzGnHPzonm">관계 지도</a></li><li><a href="#root/_help_l0tKav7yLHGF">일일 노트</a></li><li><a href="#root/_help_R7abl2fc6Mxi">체중 기록</a></li><li><a href="#root/_help_xYjQUYhpbUEW">할 일 관리</a></li></ul><p>이 예제들은 Trilium에서 구성할 수 있는 기능을 보여 주기 위한 것입니다. 모든 기능이 완성된 기본 기능으로 제공되는 것은 아닙니다.</p>
|
||||||
|
After Width: | Height: | Size: 23 KiB |
|
After Width: | Height: | Size: 59 KiB |
@@ -0,0 +1,28 @@
|
|||||||
|
<p>할 일 관리는 <a href="#root/_help_OFXdgB2nNk1F">주요 속성</a>과 <a
|
||||||
|
href="#root/_help_CdNpE2pqjmI6">스크립트</a>를 활용하는 <a href="#root/_help_wX4HbRucYSDD">기본 예제</a>입니다.</p><h2>동작 예시</h2><p><img src="Task Manager_task-manager.png" alt="할 일 관리 예제"></p><p>할 일과 완료된 일을 구분합니다. <code>doneDate</code>에 값이 있으면 완료된 일로 처리합니다. 아직 하지 않은 일은 장소와 태그로 분류하며 속성을 바꾸면 알맞은 위치로 자동 이동합니다.</p><p><a href="#root/_help_l0tKav7yLHGF">날짜별 노트</a>와도 연동합니다. 예정일인 <code>todoDate</code>와 완료일인 <code>doneDate</code>에 해당하는 날짜 노트 아래에 같은 작업을 <a href="#root/_help_IakOLONlIfGI">복제</a>하고 원본 예제에서는 TODO와 DONE <a href="#root/_help_kBrnXNG3Hplm">접두사</a>로 구분합니다.</p><h2>구현</h2><p>새 작업을 넣는 노트의 <code>~child:template</code> <a
|
||||||
|
href="#root/_help_zEY4DaJG4YT5">관계</a>가 작업 템플릿을 가리킵니다. <a href="#root/_help_bwZpz2ajCEwO">속성 상속</a>을 참고하세요.</p><h3>속성</h3><p>템플릿에서 예정일과 완료일 및 태그와 장소를 <a href="#root/_help_OFXdgB2nNk1F">주요 속성</a>으로 표시합니다. <code>~runOnAttributeChange</code>는 속성이 바뀔 때 실행할 <a href="#root/_help_GPERMystNGTB">이벤트</a> 처리기를 연결합니다. 이 <a href="#root/_help_CdNpE2pqjmI6">스크립트</a>는 완료일을 입력하면 완료 목록으로 옮기고 할 일과 장소 및 태그 목록에서 제거합니다.</p><h3>새 할 일 버튼</h3><pre><code class="language-text-x-trilium-auto">api.addButtonToToolbar({
|
||||||
|
title: '새 할 일',
|
||||||
|
icon: 'check',
|
||||||
|
shortcut: 'alt+n',
|
||||||
|
action: async () => {
|
||||||
|
// 노트 생성은 백엔드에서 처리합니다.
|
||||||
|
const taskNoteId = await api.runOnBackend(async () => {
|
||||||
|
const todoRootNote = await api.getNoteWithLabel('taskTodoRoot');
|
||||||
|
const {note} = await api.createNote(todoRootNote.noteId, '새 할 일', '');
|
||||||
|
|
||||||
|
return note.noteId;
|
||||||
|
});
|
||||||
|
|
||||||
|
// 생성한 노트를 바로 엽니다.
|
||||||
|
await api.activateNewNote(taskNoteId);
|
||||||
|
}
|
||||||
|
});</code></pre><h3>색상</h3><p>다음 CSS <a href="#root/_help_6f9hih2hXXZk">코드 노트</a>는 할 일을 빨간색으로 표시하고 완료한 일을 초록색으로 표시합니다.</p><pre><code class="language-text-x-trilium-auto">span.fancytree-node.todo .fancytree-title {
|
||||||
|
color: red !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
span.fancytree-node.done .fancytree-title {
|
||||||
|
color: green !important;
|
||||||
|
}</code></pre><p>이 <a href="#root/_help_6f9hih2hXXZk">코드 노트</a>에 <code>#appCss</code> <a
|
||||||
|
href="#root/_help_zEY4DaJG4YT5">라벨</a>을 지정하면 시작할 때 적용됩니다. 이벤트 처리기는 상태에 따라 <code>#cssClass</code> 값으로 <code>todo</code>나 <code>done</code>을 지정합니다.</p>
|
||||||
|
|
||||||
|
<section class="korean-image-guide"><h2>예전 화면 이미지 읽는 법</h2><p>아래 설명은 본문에 나온 이미지 순서에 맞췄습니다. 이미지는 원본을 유지했으므로 영문 메뉴가 보일 수 있습니다. 현재 앱에서는 한국어 메뉴를 사용합니다. 코드와 주소 및 제품 이름은 원래 표기를 따릅니다.</p><h3>이미지 1 · 할 일 관리 예제</h3><p>화면에서 사용하는 주요 표현은 다음과 같습니다.</p><ul><li><span lang="en">Quick search</span>: 빠른 검색</li><li><span lang="en">Promoted</span>: 승격됨</li><li><span lang="en">Widget</span>: 위젯</li><li><span lang="en">Code</span>: 코드</li></ul></section>
|
||||||
|
After Width: | Height: | Size: 158 KiB |
@@ -0,0 +1,48 @@
|
|||||||
|
<p><img src="Weight Tracker_image.png" alt="체중 기록 예제"></p><p>체중 기록은 <a href="#root/_help_GLks18SNjxmC">스크립트 API</a>를 활용하는 <a href="#root/_help_wX4HbRucYSDD">기본 예제</a>입니다. <code>weight</code>를 <a href="#root/_help_OFXdgB2nNk1F">주요 속성</a>으로 지정한 <a href="#root/_help_KC1HB96bqqHX">템플릿</a>에서 <a href="#root/_help_l0tKav7yLHGF">날짜별 노트</a>를 만들면 체중을 입력하고 시간에 따른 변화를 차트로 볼 수 있습니다.</p><h2>구현 방식</h2><p>체중 기록 화면은 HTML 표시 노트입니다. 자체 본문 대신 <a href="#root/_help_CdNpE2pqjmI6">스크립트</a>의 결과를 표시하는 영역을 제공합니다. <code>~renderNote</code> <a href="#root/_help_zEY4DaJG4YT5">관계</a>로 구현용 노트와 연결합니다.</p><p>구현에는 HTML과 JavaScript <a href="#root/_help_6f9hih2hXXZk">코드 노트</a>가 사용됩니다. <code>weight</code> 속성이 있는 노트를 모아 차트로 표시합니다. 차트 라이브러리 <a
|
||||||
|
href="https://www.chartjs.org/">Chart.js</a>는 Trilium에 내장되어 있지 않으므로 첨부 파일로 가져옵니다.</p><h3>코드</h3><p>다음 코드를 프런트엔드 JavaScript <a href="#root/_help_6f9hih2hXXZk">코드 노트</a>에 작성합니다.</p><pre><code class="language-text-x-trilium-auto">async function getChartData() {
|
||||||
|
const days = await api.runOnBackend(async () => {
|
||||||
|
const notes = api.getNotesWithLabel('weight');
|
||||||
|
const days = [];
|
||||||
|
|
||||||
|
for (const note of notes) {
|
||||||
|
const date = note.getLabelValue('dateNote');
|
||||||
|
const weight = parseFloat(note.getLabelValue('weight'));
|
||||||
|
|
||||||
|
if (date && weight) {
|
||||||
|
days.push({ date, weight });
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
days.sort((a, b) => a.date > b.date ? 1 : -1);
|
||||||
|
|
||||||
|
return days;
|
||||||
|
});
|
||||||
|
|
||||||
|
const datasets = [
|
||||||
|
{
|
||||||
|
label: "체중 (kg)",
|
||||||
|
backgroundColor: 'red',
|
||||||
|
borderColor: 'red',
|
||||||
|
data: days.map(day => day.weight),
|
||||||
|
fill: false,
|
||||||
|
spanGaps: true,
|
||||||
|
datalabels: {
|
||||||
|
display: false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
];
|
||||||
|
|
||||||
|
return {
|
||||||
|
datasets: datasets,
|
||||||
|
labels: days.map(day => day.date)
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
const ctx = $("#canvas")[0].getContext("2d");
|
||||||
|
|
||||||
|
new chartjs.Chart(ctx, {
|
||||||
|
type: 'line',
|
||||||
|
data: await getChartData()
|
||||||
|
});</code></pre><h2>상단 버튼 숨기기</h2><p>체중 기록의 연결된 노트 중 버튼 구현 노트를 찾아 본문을 지우거나 주석으로 처리하세요. Trilium을 다시 시작하면 체중 기록 버튼이 표시되지 않습니다.</p>
|
||||||
|
|
||||||
|
<section class="korean-image-guide"><h2>예전 화면 이미지 읽는 법</h2><p>아래 설명은 본문에 나온 이미지 순서에 맞췄습니다. 이미지는 원본을 유지했으므로 영문 메뉴가 보일 수 있습니다. 현재 앱에서는 한국어 메뉴를 사용합니다. 코드와 주소 및 제품 이름은 원래 표기를 따릅니다.</p><h3>이미지 1 · 체중 기록 예제</h3><p>화면에서 사용하는 주요 표현은 다음과 같습니다.</p><ul><li><span lang="en">Formatting</span>: 서식</li><li><span lang="en">Widget</span>: 위젯</li></ul></section>
|
||||||
|
After Width: | Height: | Size: 68 KiB |
@@ -0,0 +1,8 @@
|
|||||||
|
<p><img style="aspect-ratio:1071/146;" src="Attributes_image.png" width="1071"
|
||||||
|
height="146" alt="노트 속성"></p><p>속성은 노트에 지정하는 이름과 값의 쌍입니다. 추가 정보를 저장하거나 기능을 설정하며 크게 두 종류로 나뉩니다.</p><ul><li><a class="reference-link" href="#root/_help_HI6GBBIduIgv">라벨</a> — 메타데이터를 저장하거나 노트의 동작을 설정합니다. 검색에도 사용할 수 있습니다. 미리 정의된 항목은 <a class="reference-link"
|
||||||
|
href="#root/_help_HI6GBBIduIgv">라벨 안내</a>를 참고하세요.</li><li><a class="reference-link" href="#root/_help_Cq5X6iKQop6R">관계</a> — 링크처럼 노트 사이의 연결을 정의합니다. 메타데이터와 스크립트에 활용할 수 있습니다. 미리 정의된 항목은 <a
|
||||||
|
class="reference-link" href="#root/_help_Cq5X6iKQop6R">관계 안내</a>를 참고하세요.</li></ul><h2>속성 목록 확인하기</h2><p>현재 노트에 직접 지정한 라벨과 관계는 <a class="reference-link" href="#root/_help_BlN9DFI679QC">상단 리본</a>의 소유한 속성에서 확인하고 수정할 수 있습니다. 상위 노트에서 물려받은 항목은 상속된 속성에서 확인할 수 있으며 그곳에서는 수정할 수 없습니다.</p><p>목록에서 라벨 앞에는 <code>#</code>이 붙고 관계 앞에는 <code>~</code>가 붙습니다.</p><h2>같은 이름의 여러 값</h2><p>같은 이름의 속성을 여러 개 지정할 수 있습니다. 이를 통해 한 항목에 여러 값을 저장할 수 있습니다.</p><h2>속성 정의와 주요 속성</h2><p>특별한 라벨로 속성의 형식과 표시 방법을 정의할 수 있습니다. <a class="reference-link"
|
||||||
|
href="#root/_help_OFXdgB2nNk1F">주요 속성</a>을 참고하세요.</p><h2>속성 상속</h2><p>하위 노트가 상위 노트의 속성을 물려받을 수 있습니다. 자세한 내용은 <a class="reference-link"
|
||||||
|
href="#root/_help_bwZpz2ajCEwO">속성 상속</a>을 참고하세요.</p>
|
||||||
|
|
||||||
|
<section class="korean-image-guide"><h2>예전 화면 이미지 읽는 법</h2><p>아래 설명은 본문에 나온 이미지 순서에 맞췄습니다. 이미지는 원본을 유지했으므로 영문 메뉴가 보일 수 있습니다. 현재 앱에서는 한국어 메뉴를 사용합니다. 코드와 주소 및 제품 이름은 원래 표기를 따릅니다.</p><h3>이미지 1 · 노트 속성</h3><p>화면에서 사용하는 주요 표현은 다음과 같습니다.</p><ul><li><span lang="en">Owned Attributes</span>: 소유한 속성</li><li><span lang="en">Promoted</span>: 승격됨</li><li><span lang="en">Template</span>: 템플릿</li><li><span lang="en">Text</span>: 텍스트</li><li><span lang="en">Date</span>: 날짜</li></ul></section>
|
||||||
@@ -0,0 +1,2 @@
|
|||||||
|
<p>상속은 <a href="#root/_help_HI6GBBIduIgv">라벨</a>이나 <a href="#root/_help_Cq5X6iKQop6R">관계</a>를 여러 노트에 공통으로 적용하는 기능입니다. 주로 상위·하위 노트 사이에 적용하며 템플릿으로도 사용할 수 있습니다.</p><h2>일반 상속</h2><p><code>isInheritable</code>을 <code>true</code>로 지정하면 해당 속성을 현재 노트와 모든 하위 노트에 적용합니다. <a
|
||||||
|
class="reference-link" href="#root/_help_HI6GBBIduIgv">라벨</a>과 <a class="reference-link" href="#root/_help_Cq5X6iKQop6R">관계</a> 편집 화면에서 설정하거나 <code>#myLabel(inheritable)=value</code>처럼 작성할 수 있습니다.</p><p>예를 들어 <code>archived</code> 라벨의 상속을 켜면 하위 트리 전체를 검색 등의 목록에서 숨길 수 있습니다. 일반 상속은 모든 하위 노트에 적용됩니다. 일부 노트에서 개별적으로 바꿔야 한다면 복사 상속이나 템플릿 방식을 사용하세요.</p><h2>복사 상속</h2><p>속성 이름 앞에 <code>child:</code>를 붙이면 새 하위 노트에 해당 속성을 복사합니다. 복사된 속성은 독립적이며 노트를 다른 위치로 옮겨도 유지됩니다.</p><p><code>#child:exampleAttribute</code>를 상위 노트에 지정하면 새로 만드는 바로 아래 노트에 <code>#exampleAttribute</code>가 생깁니다. 관계는 <code>~child:myRelation</code>처럼 지정합니다. 기존 노트에는 소급 적용되지 않습니다. 무한한 하위 단계에 적용하려면 일반 상속이나 템플릿을 사용하세요.</p><h3>여러 단계로 복사하기</h3><p><code>#child:child:child:foo</code>를 지정하면 첫 단계에는 <code>#child:child:foo</code>가 생기고 다음 단계에는 <code>#child:foo</code>가 생기며 세 번째 단계에는 <code>#foo</code>가 생깁니다. 관계도 <code>~child:child:child:foo</code>로 같은 방식을 사용할 수 있습니다. 새로 만드는 노트에만 적용됩니다.</p><h2>템플릿 상속</h2><p><a class="reference-link" href="#root/_help_KC1HB96bqqHX">템플릿</a>의 속성도 물려받을 수 있습니다. 비슷한 구조와 역할을 가진 노트에 공통 설정을 유지할 때 유용합니다.</p>
|
||||||
@@ -0,0 +1,12 @@
|
|||||||
|
<p>라벨은 이름과 선택적인 값을 가진 노트의 <a href="#root/_help_zEY4DaJG4YT5">속성</a>입니다.</p><h2>활용 방법</h2><p><code>#year=1999</code>와 <code>#genre="공상 과학"</code> 및 <code>#author="닐 스티븐슨"</code>처럼 분류 정보를 붙입니다. <a
|
||||||
|
class="reference-link" href="#root/_help_OFXdgB2nNk1F">주요 속성</a>으로 표시하면 편리합니다. 앱의 고급 기능을 설정하거나 <a class="reference-link" href="#root/_help_R7abl2fc6Mxi">체중 기록</a>의 <code>weight</code>처럼 스크립트에 필요한 정보를 담기도 합니다.</p><h2>편집 화면에서 추가</h2><p><a class="reference-link"
|
||||||
|
href="#root/_help_BlN9DFI679QC">상단 리본</a>의 소유한 속성에서 더하기 → 새 라벨 추가를 선택합니다. 노트나 소유한 속성에 초점이 있을 때 Alt+L로도 엽니다. 이름을 입력하고 필요하면 값을 지정합니다. 하위 노트에도 적용하려면 상속 가능을 선택하세요. <a class="reference-link" href="#root/_help_bwZpz2ajCEwO">속성 상속</a>을 참고하세요.</p><h2>직접 입력</h2><p><a class="reference-link"
|
||||||
|
href="#root/_help_BlN9DFI679QC">상단 리본</a>의 소유한 속성에 입력합니다.</p><ul><li><code>#myLabel</code> — 값 없는 라벨</li><li><code>#myLabel=value</code> — 값을 가진 라벨</li><li><code>#myLabel="안녕하세요 여러분"</code> — 공백이 있는 값은 따옴표로 감쌉니다.</li><li><code>#myLabel='"안녕하세요"라고 말하기'</code> — 큰따옴표가 들어 있으면 작은따옴표로 감쌉니다.</li><li><code>#myLabel(inheritable)</code> 또는 <code>#myLabel(inheritable)=value</code> — 상속 가능한 라벨</li></ul><h2>미리 정의된 라벨</h2><p>다음 라벨은 Trilium에서 특별한 기능을 수행합니다. 별표는 같은 접두사로 시작하는 여러 라벨을 뜻합니다.</p><ul><li><code>disableVersioning</code> — 자동 <a class="reference-link" href="#root/_help_vZWERwf8U3nx">수정 이력</a> 생성을 끕니다. 다시 받을 수 있는 대형 라이브러리 등에 유용합니다.</li><li><code>versioningLimit</code> — 전체 설정 대신 해당 노트의 최대 <a class="reference-link" href="#root/_help_vZWERwf8U3nx">수정 이력</a> 수를 지정합니다.</li><li><code>calendarRoot</code> — <a class="reference-link"
|
||||||
|
href="#root/_help_l0tKav7yLHGF">일일 노트</a>의 루트입니다. 하나만 지정합니다.</li><li><code>archived</code> — 기본 검색과 선택 창에서 제외합니다. <a class="reference-link" href="#root/_help_oPVyFC7WL2Lp">노트 트리</a>에서도 숨기도록 설정할 수 있습니다.</li><li><code>excludeFromExport</code> — 내보낼 때 해당 노트와 하위 항목을 제외합니다.</li><li><code>run</code>과 <code>runOnInstance</code> 및 <code>runAtHour</code> — <a class="reference-link" href="#root/_help_GPERMystNGTB">이벤트</a> 실행 설정입니다.</li><li><code>disableInclusion</code> — 상위 스크립트 실행에 포함하지 않습니다.</li><li><code>sorted</code> — 하위 노트를 제목순으로 유지합니다. 값에 다른 라벨 이름을 지정하면 그 값으로 정렬합니다. 해당 라벨이 없는 노트는 제목을 사용합니다.</li><li><code>sortDirection</code> — 자동 정렬 방향입니다. <code>ASC</code>는 기본 오름차순이고 <code>DESC</code>는 내림차순입니다.</li><li><code>sortFoldersFirst</code> — 자동 정렬할 때 하위 노트가 있는 항목을 먼저 모읍니다.</li><li><code>top</code> — 상위 노트에 자동 정렬이 설정되어 있어도 해당 노트를 맨 위에 둡니다.</li><li><code>hidePromotedAttributes</code> — 현재 노트의 <a class="reference-link" href="#root/_help_OFXdgB2nNk1F">주요 속성</a>을 숨깁니다. 상속용 속성을 정의한 상위 노트 등에 유용합니다.</li><li><code>readOnly</code> — 텍스트와 코드 및 Mermaid 등 지원하는 노트를 항상 <a href="#root/_help_CoFPLs3dRlXc">읽기 전용</a>으로 엽니다.</li><li><code>autoReadOnlyDisabled</code> — 자동 <a href="#root/_help_CoFPLs3dRlXc">읽기 전용</a> 전환을 끕니다.</li><li><code>appCss</code> — 앱에 불러올 CSS 노트입니다. <a class="reference-link"
|
||||||
|
href="#root/_help_AlhDUqhENtH7">앱 전체 사용자 CSS</a>를 참고하세요.</li><li><code>appTheme</code> — 설정에서 선택할 수 있는 전체 테마 CSS입니다. <a class="reference-link" href="#root/_help_pKK96zzmvBGf">테마 개발</a>을 참고하세요.</li><li><code>appThemeBase</code> — <code>next</code>와 <code>next-light</code> 및 <code>next-dark</code>로 자동·밝은·어두운 Next 테마를 기반으로 사용합니다. <a class="reference-link"
|
||||||
|
href="#root/_help_WFGzWeUK6arS">Next 테마 수정</a>을 참고하세요.</li><li><code>cssClass</code> — <a class="reference-link" href="#root/_help_oPVyFC7WL2Lp">노트 트리</a> 항목에 추가할 CSS 클래스입니다. 템플릿에서도 사용할 수 있습니다.</li><li><code>iconClass</code> — 아이콘에 추가할 CSS 클래스입니다. 예: <code>bx bx-home</code>. Boxicons를 사용하며 템플릿에서도 지정할 수 있습니다.</li><li><code>pageSize</code> — <a class="reference-link"
|
||||||
|
href="#root/_help_0ESUbbAxVnoK">노트 목록</a>의 페이지당 항목 수입니다.</li><li><code>customRequestHandler</code> — <a class="reference-link" href="#root/_help_J5Ex1ZrMbyJ6">사용자 요청 처리기</a>입니다.</li><li><code>customResourceProvider</code> — <a class="reference-link" href="#root/_help_d3fAXQ2diepH">사용자 리소스 제공자</a>입니다.</li><li><code>widget</code> — 앱 구성 요소 트리에 넣을 <a class="reference-link" href="#root/_help_MgibgPcfeuGz">사용자 위젯</a>입니다.</li><li><code>searchHome</code> — 새 <a
|
||||||
|
class="reference-link" href="#root/_help_m523cpzocqaD">저장된 검색</a> 노트를 만들 위치입니다.</li><li><code>workspace</code> 및 관련 라벨 — <a class="reference-link" href="#root/_help_9sRHySam5fXb">작업 공간</a>을 설정합니다.</li><li><code>inbox</code> — 사이드바의 새 노트 버튼으로 만든 노트를 보관할 기본 위치입니다.</li><li><code>sqlConsoleHome</code> — <a class="reference-link" href="#root/_hidden/_help/_help_tC7s2alapj8V/_help_wX4HbRucYSDD/_help_oyIAJ9PvvwHX/_help__help_YKWqdJhzi2VY">SQL 콘솔</a> 노트의 기본 위치입니다.</li><li><code>bookmarked</code> — <a href="#root/_help_u3YFHC9tQlpm">북마크</a>로 지정합니다.</li><li><code>bookmarkFolder</code> — 하위 항목을 열 수 있는 <a class="reference-link" href="#root/_help_u3YFHC9tQlpm">북마크 폴더</a>로 표시합니다.</li><li><code>share*</code> — <a class="reference-link" href="#root/_help_R9pX4DGra2Vt">공개 공유</a> 설정입니다.</li><li><code>displayRelations</code>와 <code>hideRelations</code> — <a class="reference-link" href="#root/_help_iRwzGnHPzonm">관계도</a>와 <a class="reference-link" href="#root/_help_BCkXAVs63Ttv">노트 지도</a>에서 표시하거나 숨길 관계 이름을 쉼표로 구분해 지정합니다.</li><li><code>titleTemplate</code> — 새 하위 노트의 기본 제목입니다. JavaScript 템플릿 문자열로 계산하며 <code>now</code>와 <code>parentNote</code>를 사용할 수 있습니다. 예: <code>${parentNote.getLabel('authorName')}의 작품</code> 또는 <code>${now.format('YYYY-MM-DD HH:mm:ss')} 기록</code>. <a class="reference-link" href="#root/_help_47ZrP6FNuoG8">기본 노트 제목</a>을 참고하세요.</li><li><code>template</code> — 새 노트의 <a class="reference-link" href="#root/_help_KC1HB96bqqHX">템플릿</a> 선택 목록에 표시합니다.</li><li><code>toc</code> — <a class="reference-link" href="#root/_help_BFvAtE74rbP6">목차</a> 표시를 제어합니다. <code>#toc</code> 또는 <code>#toc=show</code>는 항상 표시하고 <code>#toc=false</code>는 숨깁니다.</li><li><code>color</code> — 트리와 링크 등의 노트 색입니다. <code>red</code>나 <code>#a13d5f</code> 같은 CSS 색상값을 사용합니다.</li><li><code>keyboardShortcut</code> — 해당 노트로 이동할 단축키입니다. 예: <code>ctrl+alt+e</code>. 변경 후 화면을 새로고침해야 합니다.</li><li><code>keepCurrentHoisting</code> — 현재 확대 범위 밖의 노트를 열어도 트리의 확대 범위를 유지합니다.</li><li><code>executeButton</code> — 현재 코드 노트 실행 버튼의 이름입니다.</li><li><code>executeDescription</code> — 실행 버튼과 함께 보여 줄 자세한 설명입니다.</li><li><code>excludeFromNoteMap</code> — <a class="reference-link"
|
||||||
|
href="#root/_help_bdUJEHsAPYQR">노트 지도</a>에서 제외합니다.</li><li><code>newNotesOnTop</code> — 새 하위 노트를 맨 위에 만듭니다.</li><li><code>hideHighlightWidget</code> — <a class="reference-link" href="#root/_help_AxshuNRegLAv">강조 표시 목록</a> 위젯을 숨깁니다.</li><li><code>hideChildrenOverview</code> — 해당 노트의 <a class="reference-link" href="#root/_help_0ESUbbAxVnoK">하위 노트 목록</a>을 숨깁니다.</li><li><code>printLandscape</code> — PDF를 가로 방향으로 내보냅니다.</li><li><code>printPageSize</code> — PDF 용지 크기입니다. <code>A0 A1 A2 A3 A4 A5 A6 Legal Letter Tabloid Ledger</code>를 지원합니다.</li><li><code>geolocation</code> — <a
|
||||||
|
class="reference-link" href="#root/_help_81SGnPGMk7Xc">지리 지도</a>에 표시할 위도와 경도입니다.</li><li><code>calendar:*</code> — <a class="reference-link" href="#root/_help_xWbu3jpNWapp">달력 보기</a> 설정입니다.</li><li><code>viewType</code> — 격자나 목록 등 <a class="reference-link"
|
||||||
|
href="#root/_help_0ESUbbAxVnoK">하위 노트 보기</a> 형식을 지정합니다.</li></ul>
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
<p>주요 속성은 자주 사용하는 <a href="#root/_help_zEY4DaJG4YT5">속성</a>을 노트의 주 화면에 입력란으로 표시하는 기능입니다.</p><p><img src="Promoted Attributes_promot.png" alt="주요 속성 입력란"></p><p>각 입력란은 일반 속성과 같은 값을 저장합니다. 검색이나 스크립트에서 사용할 속성을 매번 메뉴에서 찾지 않고 바로 확인하고 수정할 수 있습니다.</p><h2>속성 정의</h2><p>속성의 이름과 값은 문자열입니다. 속성 정의는 값을 글자나 날짜 등 어떤 형식으로 해석할지와 여러 값을 허용할지 및 주요 속성으로 표시할지를 지정합니다.</p><p><img src="Promoted Attributes_image.png" alt="속성 정의 예시"></p><p>실제 값을 저장하는 속성과 그 형식을 지정하는 속성은 별개입니다. 형식 정의에 <a href="#root/_help_bwZpz2ajCEwO">상속</a>을 설정하면 하위 트리 전체에 공통으로 적용하고 값은 각 노트에 따로 지정할 수 있습니다.</p><h3>역방향 관계</h3><p>배우자 관계처럼 양쪽에 같은 이름의 관계가 필요한 경우가 있습니다. 한 노트에서 다른 노트로 <code>isPartnerOf</code>를 연결했다면 반대 방향에도 같은 관계가 있어야 합니다.</p><p>부모와 자녀는 방향에 따라 이름이 다릅니다. 부모에서 자녀로는 <code>isParentOf</code>를 사용하고 반대쪽에는 <code>isChildOf</code>를 사용할 수 있습니다.</p><p>관계 정의에서 서로의 역방향 관계 이름을 지정하면 자동으로 관리할 수 있습니다. 부모·자녀 예제에서는 각 관계의 정의에 상대 관계 이름을 지정해야 합니다. 관계를 저장하면 대상 노트의 역방향 관계도 확인하고 생성합니다. 관계를 삭제하면 대응하는 역방향 관계도 삭제합니다.</p>
|
||||||
|
|
||||||
|
<section class="korean-image-guide"><h2>예전 화면 이미지 읽는 법</h2><p>아래 설명은 본문에 나온 이미지 순서에 맞췄습니다. 이미지는 원본을 유지했으므로 영문 메뉴가 보일 수 있습니다. 현재 앱에서는 한국어 메뉴를 사용합니다. 코드와 주소 및 제품 이름은 원래 표기를 따릅니다.</p><h3>이미지 1 · 주요 속성 입력란</h3><p>화면에서 사용하는 주요 표현은 다음과 같습니다.</p><ul><li><span lang="en">Quick search</span>: 빠른 검색</li><li><span lang="en">Promoted</span>: 승격됨</li><li><span lang="en">Note</span>: 참고</li><li><span lang="en">Type</span>: 유형</li></ul><h3>이미지 2 · 속성 정의 예시</h3><p>화면에서 사용하는 주요 표현은 다음과 같습니다.</p><ul><li><span lang="en">Label definition detail</span>: 라벨 정의 상세</li><li><span lang="en">Owned Attributes</span>: 소유한 속성</li><li><span lang="en">Multiplicity</span>: 다중성</li><li><span lang="en">Quick search</span>: 빠른 검색</li><li><span lang="en">label name</span>: 라벨 이름</li><li><span lang="en">Promoted</span>: 승격됨</li><li><span lang="en">Template</span>: 템플릿</li><li><span lang="en">Delete</span>: 삭제</li><li><span lang="en">Close</span>: 닫기</li><li><span lang="en">Notes</span>: 노트</li><li><span lang="en">Other</span>: 기타</li><li><span lang="en">Save</span>: 저장</li></ul></section>
|
||||||
|
After Width: | Height: | Size: 113 KiB |
|
After Width: | Height: | Size: 44 KiB |
@@ -0,0 +1,5 @@
|
|||||||
|
<p>관계는 <a href="#root/_help_HI6GBBIduIgv">라벨</a>과 비슷하지만 텍스트 값 대신 다른 노트를 가리킵니다.</p><h2>활용 방법</h2><ul><li>책 노트와 저자 노트를 연결하는 등 자료의 관계를 나타냅니다. <a class="reference-link" href="#root/_help_OFXdgB2nNk1F">주요 속성</a>으로 표시하면 더 편하게 사용할 수 있습니다.</li><li><a
|
||||||
|
class="reference-link" href="#root/_help_HcABDtFCkbFN">렌더링 노트</a>와 <a class="reference-link" href="#root/_help_R9pX4DGra2Vt">공개 공유</a> 및 <a
|
||||||
|
class="reference-link" href="#root/_help_KC1HB96bqqHX">템플릿</a>을 설정합니다.</li><li>노트의 이벤트나 조건에 맞춰 실행할 스크립트를 연결합니다.</li></ul><h2>편집 화면에서 만들기</h2><p><a class="reference-link"
|
||||||
|
href="#root/_help_BlN9DFI679QC">상단 리본</a>의 소유한 속성에서 더하기 버튼을 누르고 새 관계 추가를 선택합니다. 노트나 소유한 속성에 초점이 있을 때 Alt+L을 눌러도 편집 화면이 열립니다.</p><p>관계 이름과 대상 노트를 지정합니다. 관계에는 대상 노트가 반드시 있어야 합니다. 하위 노트에도 적용하려면 상속 가능을 선택하세요. <a class="reference-link" href="#root/_help_bwZpz2ajCEwO">속성 상속</a>을 참고하세요.</p><h2>직접 입력하기</h2><p><a class="reference-link"
|
||||||
|
href="#root/_help_BlN9DFI679QC">상단 리본</a>의 소유한 속성에서 <code>~myRelation=@</code>를 입력합니다. 자동 완성 목록에 대상 제목을 입력한 다음 Enter를 누르거나 원하는 노트를 선택합니다. <a class="reference-link" href="#root/_help_oPVyFC7WL2Lp">노트 트리</a>에서 노트를 복사했다면 <code>@</code> 없이 <code>=</code> 뒤에 붙여 넣을 수도 있습니다.</p><p>상속 가능한 관계는 <code>~myRelation</code> 대신 <code>~myRelation(inheritable)</code>로 입력합니다.</p><h2>미리 정의된 관계</h2><p>다음 관계는 Trilium에서 특별한 기능을 수행합니다. 이름 끝의 별표는 같은 접두사로 시작하는 여러 관계를 뜻합니다.</p><ul><li><code>runOn*</code> — <a class="reference-link" href="#root/_help_GPERMystNGTB">이벤트</a>에 따라 스크립트를 실행합니다.</li><li><code>template</code> — 상하위 관계가 없어도 속성을 상속합니다. 템플릿 규칙에 따라 비어 있는 인스턴스에 본문과 하위 트리를 추가합니다.</li><li><code>inherit</code> — 상하위 관계가 없어도 속성을 상속합니다. 비슷한 개념인 <a class="reference-link" href="#root/_help_KC1HB96bqqHX">템플릿</a>과 <a class="reference-link" href="#root/_help_bwZpz2ajCEwO">속성 상속</a>을 참고하세요.</li><li><code>renderNote</code> — <a class="reference-link" href="#root/_help_HcABDtFCkbFN">렌더링 노트</a>에서 표시할 HTML 또는 스크립트 코드 노트를 가리킵니다.</li><li><code>widget_relation</code> — 대상 노트를 실행하고 사이드바 위젯으로 표시합니다.</li><li><code>shareCss</code> — 공유 페이지에 넣을 CSS 노트입니다. 해당 노트도 공유 하위 트리에 있어야 합니다. 필요에 따라 <code>share_hidden_from_tree</code>와 <code>share_omit_default_css</code>를 함께 사용합니다.</li><li><code>shareJs</code> — 공유 페이지에 넣을 JavaScript 노트입니다. 해당 노트도 공유 하위 트리에 있어야 합니다. 필요하면 <code>share_hidden_from_tree</code>로 트리에서 숨깁니다.</li><li><code>shareTemplate</code> — 공유 노트 표시용 템플릿으로 사용할 임베디드 JavaScript 노트입니다. 지정하지 않으면 기본 템플릿을 사용합니다. 필요하면 <code>share_hidden_from_tree</code>로 숨깁니다.</li><li><code>shareFavicon</code> — 공유 페이지의 아이콘 노트입니다. 보통 공유 루트에 지정하고 상속 가능으로 설정합니다. 아이콘도 공유 하위 트리에 있어야 합니다. 필요하면 <code>share_hidden_from_tree</code>로 숨깁니다.</li></ul>
|
||||||
|
After Width: | Height: | Size: 22 KiB |
@@ -0,0 +1,6 @@
|
|||||||
|
<p><img style="aspect-ratio:1425/654;" src="Bulk Actions_image.png" width="1425"
|
||||||
|
height="654" alt="일괄 작업 설정"></p><p>일괄 작업으로 여러 노트에 라벨을 추가하거나 지우고 스크립트를 실행할 수 있습니다.</p><h2>사용 방법</h2><p><a class="reference-link"
|
||||||
|
href="#root/_help_oPVyFC7WL2Lp">노트 트리</a>에서 노트 하나를 선택하거나 <a class="reference-link" href="#root/_help_yTjUdsOi4CIE">여러 노트 선택</a> 방법으로 대상을 지정합니다. <a class="reference-link" href="#root/_help_oPVyFC7WL2Lp">노트 트리</a>의 마우스 오른쪽 메뉴에서 고급 → 일괄 작업 적용을 선택합니다.</p><p>기본 대상은 선택한 노트뿐입니다. 하위 노트도 처리하려면 선택한 노트의 하위 항목 포함을 선택하세요. 위쪽의 대상 노트 수가 갱신됩니다. 사용 가능한 작업에서 항목을 선택하고 선택한 작업 영역에서 세부 값을 지정합니다. 같은 유형의 작업을 여러 번 추가할 수 있으며 오른쪽 X로 제거합니다. 설정을 마친 뒤 일괄 작업 실행을 누릅니다. 마지막 설정은 다음에 창을 열 때 복원됩니다.</p><h2>라벨 작업</h2><p><a class="reference-link" href="#root/_help_HI6GBBIduIgv">라벨</a>을 다음과 같이 관리합니다.</p><ul><li>라벨 추가 — 같은 이름의 <a href="#root/_help_HI6GBBIduIgv">라벨</a>이 없으면 만들고 있으면 값을 바꿉니다. 새 값을 비우면 값 없는 라벨이 됩니다.</li><li>라벨 값 변경 — 해당 <a href="#root/_help_HI6GBBIduIgv">라벨</a>이 있는 노트만 처리합니다. 값을 비우면 기존 값이 지워집니다.</li><li>라벨 이름 변경 — 해당 <a href="#root/_help_HI6GBBIduIgv">라벨</a>의 이름만 바꾸고 값은 유지합니다.</li><li>라벨 삭제 — 같은 이름의 라벨을 값 유무와 관계없이 삭제합니다.</li></ul><h2>관계 작업</h2><p><a class="reference-link" href="#root/_help_Cq5X6iKQop6R">관계</a>의 추가와 대상 변경 및 이름 변경과 삭제를 지원합니다. 추가는 지정한 노트를 가리키는 관계를 만듭니다. 나머지 작업은 해당 관계가 있는 노트만 처리합니다. 이름을 바꿔도 대상 노트는 유지됩니다.</p><h2>노트 작업</h2><p>노트 이름 변경은 모든 대상의 제목을 지정한 값으로 바꿉니다. <a
|
||||||
|
class="reference-link" href="#root/_help_habiZ3HU8Kw8">FNote</a> 정보에 접근하는 템플릿 문자열도 사용할 수 있습니다. <code>새 항목: ${note.title}</code>은 제목 앞에 문구를 붙입니다. <code>${note.dateCreatedObj.format('MM-DD')}: ${note.title}</code>은 만든 날짜를 월·일 형식으로 붙입니다.</p><p>노트 이동은 지정한 상위 노트 아래로 옮깁니다. 간단한 이동은 <a class="reference-link" href="#root/_help_oPVyFC7WL2Lp">노트 트리</a>에서 잘라내기와 붙여넣기 또는 메뉴로 처리해도 됩니다. 노트 삭제는 대상을 삭제합니다. <a class="reference-link" href="#root/_help_oPVyFC7WL2Lp">노트 트리</a>에서 선택하고 Delete를 누르는 방법도 있습니다. 노트 수정 이력 삭제는 대상의 모든 <a class="reference-link" href="#root/_help_vZWERwf8U3nx">수정 이력</a>을 지웁니다.</p><h2>스크립트 실행</h2><p>복잡한 작업은 JavaScript로 작성할 수 있습니다. 다음 예제는 제목 뒤에 문구를 붙입니다.</p><pre><code class="language-application-javascript-env-backend">note.title = note.title + " - 추가 문구";</code></pre><p>다음 예제는 <code>#shareAlias</code> 라벨을 노트 제목으로 설정합니다.</p><pre><code class="language-application-javascript-env-backend">note.setLabel("shareAlias", note.title)</code></pre>
|
||||||
|
|
||||||
|
<section class="korean-image-guide"><h2>예전 화면 이미지 읽는 법</h2><p>아래 설명은 본문에 나온 이미지 순서에 맞췄습니다. 이미지는 원본을 유지했으므로 영문 메뉴가 보일 수 있습니다. 현재 앱에서는 한국어 메뉴를 사용합니다. 코드와 주소 및 제품 이름은 원래 표기를 따릅니다.</p><h3>이미지 1 · 일괄 작업 설정</h3><p>화면에서 사용하는 주요 표현은 다음과 같습니다.</p><ul><li><span lang="en">Update relation target</span>: 관계 대상 업데이트</li><li><span lang="en">Execute bulk actions</span>: 일괄 작업 실행</li><li><span lang="en">Update label value</span>: 라벨 값 업데이트</li><li><span lang="en">Available actions</span>: 사용 가능한 작업</li><li><span lang="en">Delete relation</span>: 관계 삭제</li><li><span lang="en">Rename relation</span>: 관계 이름 변경</li><li><span lang="en">Affected notes</span>: 영향받는 노트</li><li><span lang="en">Chosen actions</span>: 선택된 작업</li><li><span lang="en">Note Revisions</span>: 노트 수정 이력</li><li><span lang="en">Execute script</span>: 스크립트 실행</li><li><span lang="en">Delete label</span>: 라벨 삭제</li><li><span lang="en">Rename label</span>: 라벨 이름 변경</li></ul></section>
|
||||||
|
After Width: | Height: | Size: 53 KiB |
@@ -0,0 +1,4 @@
|
|||||||
|
<p>Trilium은 <code>config.ini</code> 파일과 환경 변수로 설정할 수 있습니다. 지원하는 항목은 <a href="https://github.com/TriliumNext/Notes/blob/develop/apps/server/src/assets/config-sample.ini">config-sample.ini 예제</a>와 <a href="https://github.com/TriliumNext/Notes">Notes 저장소</a>를 참고하세요.</p><p>환경 변수는 다음 규칙을 따릅니다.</p><ul><li>이름 앞에 <code>TRILIUM_</code>을 붙이고 INI의 구역과 키를 밑줄로 구분합니다.</li><li>형식은 <code>TRILIUM_<SECTION>_<KEY>=<VALUE></code>입니다.</li><li>같은 항목이 파일에도 있으면 환경 변수의 값이 우선합니다.</li></ul><p>예를 들어 설정 파일에 다음 내용이 있다고 가정합니다.</p><pre><code class="language-text-x-trilium-auto">[Network]
|
||||||
|
host=localhost
|
||||||
|
port=8080</code></pre><p>다음 환경 변수로 값을 바꿀 수 있습니다.</p><pre><code class="language-text-x-trilium-auto">TRILIUM_NETWORK_HOST=0.0.0.0
|
||||||
|
TRILIUM_NETWORK_PORT=9000</code></pre><p>설정은 다음 순서로 읽습니다.</p><ul><li><code>config.ini</code> 파일을 불러옵니다.</li><li><code>TRILIUM_</code>으로 시작하는 환경 변수를 찾습니다.</li><li>환경 변수 이름에서 구역과 키를 구분합니다.</li><li>환경 변수의 값을 우선해 파일의 설정과 합칩니다.</li></ul>
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
<p>기본 설정에서는 다른 도메인이나 출처의 웹페이지가 브라우저를 통해 Trilium에 요청하는 것을 허용하지 않습니다.</p><p>Trilium 0.93.0부터 환경 변수나 <code>config.ini</code>를 사용해 <a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Guides/CORS">교차 출처 리소스 공유(CORS)</a>를 설정할 수 있습니다.</p><table><thead><tr><th>CORS 헤더</th><th>환경 변수</th><th>config.ini의 Network 구역 설정</th></tr></thead><tbody><tr><td><code>Access-Control-Allow-Origin</code></td><td><code>TRILIUM_NETWORK_CORS_ALLOW_ORIGIN</code></td><td><code>corsAllowOrigin</code></td></tr><tr><td><code>Access-Control-Allow-Methods</code></td><td><code>TRILIUM_NETWORK_CORS_ALLOW_METHODS</code></td><td><code>corsAllowMethods</code></td></tr><tr><td><code>Access-Control-Allow-Headers</code></td><td><code>TRILIUM_NETWORK_CORS_ALLOW_HEADERS</code></td><td><code>corsAllowHeaders</code></td></tr></tbody></table>
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
<p>Trilium 인스턴스는 실행 중인 서버 하나를 뜻합니다. <a class="reference-link"
|
||||||
|
href="#root/_help_cbkrhQjrkKrh">동기화</a>를 구성하면 데스크톱 앱 내부의 서버와 동기화 대상 서버 등 여러 인스턴스를 사용하게 됩니다. 이때 현재 어느 인스턴스에서 실행 중인지 구분하면 편리합니다.</p><h2>인스턴스 이름 지정</h2><p><code>config.ini</code>에 다음과 같이 이름을 설정하세요.</p><pre><code class="language-text-x-trilium-auto">[General]
|
||||||
|
instanceName=내서버</code></pre><h2>서버에서 인스턴스 구분</h2><p><code>api.getInstanceName()</code>을 호출하면 설정 파일이나 환경 변수에 지정한 현재 서버의 인스턴스 이름을 얻을 수 있습니다.</p><h2>특정 인스턴스에서만 스크립트 실행</h2><p>정기적으로 실행하거나 특정 이벤트에 반응하는 스크립트를 일부 인스턴스에서만 실행할 수 있습니다. 코드를 바꿀 필요 없이 <code>runOnInstance</code> 라벨의 값에 실행할 인스턴스 이름을 넣으세요. 여러 인스턴스에서 실행하려면 라벨을 여러 개 추가하세요.</p>
|
||||||
@@ -0,0 +1,26 @@
|
|||||||
|
<p><a href="#root/_help_CdNpE2pqjmI6">스크립트</a>로 공개 REST 요청을 처리할 수 있습니다. 외부 서비스에서 제목과 본문을 보내 노트를 만드는 등의 연동에 사용합니다.</p><h2>외부 요청으로 노트 만들기</h2><p>다음은 백엔드 JavaScript <a href="#root/_help_6f9hih2hXXZk">코드 노트</a>예제입니다. 예시 비밀값을 그대로 공개 서비스에 사용하면 안 됩니다.</p><pre><code class="language-text-x-trilium-auto">const {req, res} = api;
|
||||||
|
const {secret, title, content} = req.body;
|
||||||
|
|
||||||
|
if (req.method == 'POST' && secret === 'secret-password') {
|
||||||
|
// 노트를 저장할 상위 노트를 지정합니다.
|
||||||
|
// 이 코드 노트의 관계로 대상 상위 노트를 연결합니다.
|
||||||
|
// 간단한 예제에서는 노트 정보에서 확인한 고정 ID를 사용할 수도 있습니다.
|
||||||
|
const targetParentNoteId = api.currentNote.getRelationValue('targetNote');
|
||||||
|
|
||||||
|
const {note} = api.createTextNote(targetParentNoteId, title, content);
|
||||||
|
const notePojo = note.getPojo();
|
||||||
|
|
||||||
|
res.status(201).json(notePojo);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
res.send(400);
|
||||||
|
}</code></pre><p><code>#customRequestHandler=create-note</code> 라벨과 저장할 위치를 가리키는 <code>~targetNote</code> 관계를 지정합니다.</p><h3>요청 예시</h3><pre><code class="language-text-x-trilium-auto">POST http://my.trilium.org/custom/create-note
|
||||||
|
Content-Type: application/json
|
||||||
|
|
||||||
|
{
|
||||||
|
"secret": "secret-password",
|
||||||
|
"title": "인사",
|
||||||
|
"content": "안녕하세요."
|
||||||
|
}</code></pre><p><code>/custom</code> 아래 요청은 <code>customRequestHandler</code> <a href="#root/_help_zEY4DaJG4YT5">라벨</a>이 있는 노트에서 처리기를 찾습니다. 라벨 값은 경로에 대응하는 정규식입니다. 찾은 스크립트에는 Express의 <a href="https://expressjs.com/en/api.html#req">요청 객체</a>와 <a
|
||||||
|
href="https://expressjs.com/en/api.html#res">응답 객체</a>가 <code>api.req</code>와 <code>api.res</code>로 제공됩니다.</p><p>이 경로는 기본 인증을 자동으로 요구하지 않습니다. 처리기에서 인증을 구현해야 합니다. 예제는 POST 방식과 비밀값을 확인한 뒤 <a
|
||||||
|
href="#root/_help_GLks18SNjxmC">스크립트 API</a>로 노트를 만듭니다.</p><h2>파일 제공</h2><p>파일만 제공하려면 <code>customResourceProvider</code> 라벨에 경로 정규식을 지정할 수 있습니다. <a href="#root/_help_d3fAXQ2diepH">사용자 지정 리소스 제공</a>을 참고하세요.</p><h2>고급 사용</h2><p>요청과 응답 객체의 기능은 <a href="https://expressjs.com/en/api.html">Express 공식 문서</a>에서 확인할 수 있습니다.</p><h3>경로 매개변수</h3><pre><code class="language-text-x-trilium-auto">http://my.trilium.org/custom/notes/123</code></pre><p>마지막 숫자처럼 바뀌는 부분을 정규식으로 받을 수 있습니다.</p><pre><code class="language-text-x-trilium-auto">notes/([0-9]+)</code></pre><p>괄호로 묶은 일치 결과는 <code>api.pathParams</code>에 들어갑니다.</p><pre><code class="language-text-x-trilium-auto">const noteId = api.pathParams[0];</code></pre><p><code>?noteId=123</code> 같은 쿼리 매개변수는 <code>req.query.noteId</code>로 읽습니다.</p>
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
<p>사용자 지정 리소스 제공 기능은 Trilium에 가져온 이미지와 글꼴 및 스타일시트 등의 파일을 공개 주소로 제공합니다. 테마와 함께 사용자 글꼴을 제공할 때 활용할 수 있습니다.</p><h2>설정 순서</h2><ul><li>이미지나 글꼴 파일을 Trilium으로 끌어서 가져옵니다.</li><li>파일 노트를 선택하고 소유한 속성을 엽니다.</li><li><code>#customResourceProvider=hello</code> 라벨을 추가합니다.</li><li>브라우저에서 <code><protocol>://<host>/custom/hello</code>를 엽니다. protocol에는 환경에 맞는 <code>http</code>나 <code>https</code>를 사용합니다. host는 Trilium 서버의 주소입니다. 별도 서버 없이 데스크톱 앱만 사용한다면 기본 주소는 <code>http://localhost:37840</code>입니다.</li><li>정상적으로 설정되었다면 가져온 파일이 내려받아집니다.</li></ul><p><code>hello</code> 대신 다음과 같은 이름도 사용할 수 있습니다.</p><ul><li>경로 — <code>fonts/Roboto.ttf</code>로 지정하면 <code><host>/custom/fonts/Roboto.ttf</code>로 접근합니다.</li><li>정규식 — <code>hello/.*</code>로 지정하면 <code>/custom/hello/1</code>과 <code>/custom/hello/2</code> 또는 <code>/custom/hello/world</code>처럼 여러 경로에 대응합니다.</li></ul><h2>테마에서 사용하기</h2><p>글꼴 파일을 가져온 뒤 <code>#customResourceProvider=fonts/myfont.ttf</code> 속성을 지정하세요. 테마 CSS에서는 다음처럼 불러올 수 있습니다.</p><pre><code class="language-text-css">@font-face {
|
||||||
|
font-family: customFont;
|
||||||
|
src: url("/custom/fonts/myfont.ttf");
|
||||||
|
}
|
||||||
|
|
||||||
|
div {
|
||||||
|
font-family: customFont;
|
||||||
|
}</code></pre>
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
<p>Trilium은 노트와 트리 구조 및 메타데이터와 대부분의 설정을 <a href="https://www.sqlite.org">SQLite</a> 데이터베이스에 저장합니다. 파일 이름은 <code>document.db</code>이며 기본 <a href="#root/_help_tAassRL4RSQL">데이터 폴더</a>에 있습니다.</p><h2>사용 예제</h2><p>처음 실행하면 주요 기능을 소개하는 예제 노트를 제공합니다. <a class="reference-link" href="#root/_help_6tZeKvSHEUiB">사용 예제</a>를 참고하세요.</p><h2>데이터베이스 직접 수정하기</h2><p>고급 사용자는 <a href="https://sqlitebrowser.org/">DB Browser for SQLite</a> 같은 도구로 데이터베이스를 살펴보거나 수정할 수 있습니다. 자세한 내용은 <a href="#root/_help_oyIAJ9PvvwHX">데이터베이스 직접 수정하기</a>를 참고하세요.</p><h2>데이터베이스 초기화하기</h2><p>시험 중인 환경을 초기 상태로 되돌리려면 기존 데이터베이스를 제거할 수 있습니다. 다음 실행 시 원본 예제 노트가 포함된 새 데이터베이스를 만듭니다. 기존 노트가 사라지므로 필요한 데이터를 먼저 백업하고 애플리케이션을 종료하세요.</p><p><a href="#root/_help_tAassRL4RSQL">데이터 폴더</a>에서 <code>document.db</code>와 이름이 <code>document.db</code>로 시작하는 관련 파일을 제거합니다.</p><p><code>config.ini</code>의 설정도 보존할 필요가 없다면 <a href="#root/_help_tAassRL4RSQL">데이터 폴더</a>의 내용을 모두 제거해 초기화할 수 있습니다. 파일 대신 환경 변수로 설정하는 방법은 <a href="#root/_help_Gzjqa934BdH4">설정 안내</a>를 참고하세요.</p>
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
<p>Trilium을 처음 실행하면 사용 예제가 포함된 데이터베이스를 만듭니다. 예제에서는 다음 기능을 살펴볼 수 있습니다.</p><ul><li><a class="reference-link" href="#root/_help_iRwzGnHPzonm">관계 지도</a></li><li><a class="reference-link" href="#root/_help_l0tKav7yLHGF">날짜별 노트</a></li><li><a class="reference-link" href="#root/_help_R7abl2fc6Mxi">체중 기록</a></li><li><a class="reference-link" href="#root/_help_xYjQUYhpbUEW">할 일 관리</a></li><li><a class="reference-link" href="#root/_help_Wy267RK4M69c">테마</a></li></ul><h3>사용 예제 복원하기</h3><p>고급 기능을 시험한 뒤 원래 예제를 다시 확인하고 싶거나 새 기능이 추가된 최신 예제를 살펴보고 싶을 때 원본 예제를 가져올 수 있습니다.</p><p>Trilium의 가져오기 기능을 사용하세요.</p><ul><li><a href="https://github.com/TriliumNext/Notes/raw/develop/db/demo.zip">최신 예제 ZIP 파일</a>을 내려받습니다.</li><li>예제를 넣을 상위 노트를 트리에서 마우스 오른쪽 버튼으로 클릭합니다.</li><li>노트로 가져오기를 선택합니다.</li><li>내려받은 ZIP 파일을 선택합니다.</li></ul>
|
||||||
|
After Width: | Height: | Size: 134 KiB |
@@ -0,0 +1,3 @@
|
|||||||
|
<p>고급 개발이나 문제 해결 과정에서 Trilium의 SQLite 데이터베이스를 직접 수정해야 할 때가 있습니다. 수정하기 전에 <code>document.db</code>를 백업하세요.</p><h2>내장 SQL 콘솔 사용하기</h2><p>Trilium에는 데이터베이스 편집기가 내장되어 있습니다. <a class="reference-link" href="#root/_help_YKWqdJhzi2VY">SQL 콘솔</a>을 참고하세요.</p><h2>외부 도구로 수정하기</h2><p>애플리케이션이 실행되지 않는 경우처럼 SQL 콘솔을 사용할 수 없을 때는 외부 도구를 이용할 수 있습니다. 데스크톱 앱을 종료하거나 서버 서비스와 Docker 컨테이너를 중지한 뒤 작업하세요.</p><h3>DB Browser for SQLite 사용하기</h3><p>여러 운영체제에서 사용할 수 있는 그래픽 데이터베이스 편집기입니다.</p><ul><li>파일 메뉴에서 데이터베이스 열기를 선택하고 <a href="#root/_help_tAassRL4RSQL">데이터 폴더</a>의 데이터베이스를 엽니다.</li><li>SQL 실행 탭을 선택합니다.</li><li>원하는 SQL 문을 입력합니다.</li><li>탭 아래 도구 모음의 실행 버튼을 누르거나 <kbd>F5</kbd>를 누릅니다.</li><li>주 도구 모음에서 변경 사항 쓰기를 누릅니다.</li><li>데이터베이스나 프로그램을 닫습니다.</li></ul><p><img src="Manually altering the data.png" alt="외부 데이터베이스 편집기 사용 예시"></p><h3>SQLite 명령줄 도구 사용하기</h3><p>데이터베이스 경로를 지정해 실행하세요.</p><pre><code class="language-text-x-trilium-auto">sqlite3 ~/.local/share/trilium-data/document.db</code></pre><ul><li>SQL 문 끝에 <code>;</code>을 붙여 입력합니다.</li><li>종료하려면 <code>.quit</code>을 입력하고 <kbd>Enter</kbd>를 누릅니다.</li></ul>
|
||||||
|
|
||||||
|
<section class="korean-image-guide"><h2>예전 화면 이미지 읽는 법</h2><p>아래 설명은 본문에 나온 이미지 순서에 맞췄습니다. 이미지는 원본을 유지했으므로 영문 메뉴가 보일 수 있습니다. 현재 앱에서는 한국어 메뉴를 사용합니다. 코드와 주소 및 제품 이름은 원래 표기를 따릅니다.</p><h3>이미지 1 · 외부 데이터베이스 편집기 사용 예시</h3><p>화면에서 사용하는 주요 표현은 다음과 같습니다.</p><ul><li><span lang="en">Attributes</span>: 속성</li><li><span lang="en">Delete</span>: 삭제</li><li><span lang="en">Tables</span>: 테이블</li><li><span lang="en">Notes</span>: 노트</li><li><span lang="en">Value</span>: 값</li><li><span lang="en">Query</span>: 쿼리</li><li><span lang="en">Name</span>: 이름</li><li><span lang="en">Type</span>: 유형</li><li><span lang="en">Text</span>: 텍스트</li><li><span lang="en">Open</span>: 열기</li><li><span lang="en">File</span>: 파일</li><li><span lang="en">Size</span>: 크기</li></ul></section>
|
||||||
|
After Width: | Height: | Size: 30 KiB |
|
After Width: | Height: | Size: 230 B |
|
After Width: | Height: | Size: 265 B |
@@ -0,0 +1,3 @@
|
|||||||
|
<p>SQL 콘솔은 Trilium에 내장된 데이터베이스 편집기입니다.</p><p><a href="#root/_help_Vc8PjrjAGuOp">전체 메뉴</a> → 고급 → SQL 콘솔 열기에서 실행할 수 있습니다.</p><p><img src="SQL Console_image.png" alt="SQL 콘솔 화면"></p><h3>사용 방법</h3><ul><li>화면 위쪽의 테이블 이름에 마우스를 올리면 열 이름과 자료형을 확인할 수 있습니다.</li><li>SQL 문은 한 번에 하나씩 실행할 수 있습니다.</li><li><img src="3_SQL Console_image.png" alt="실행 버튼">을 누르면 작성한 SQL 문을 실행합니다.</li><li>조회 결과는 표로 표시됩니다.<p><img src="1_SQL Console_image.png" alt="SQL 조회 결과"></p></li></ul><h3>SQL 콘솔 저장하기</h3><p>SQL 조회문이나 명령을 전용 노트로 저장할 수 있습니다. SQL 문을 작성한 뒤 <img src="2_SQL Console_image.png" alt="저장 버튼">을 누르세요. 저장한 노트는 <a href="#root/_help_l0tKav7yLHGF">날짜별 노트</a>에 나타납니다.</p><ul><li>SQL 문은 기본 화면에 표시되지 않습니다. 노트의 오른쪽 클릭 메뉴에서 노트 소스 보기를 선택하면 확인할 수 있습니다.</li><li>저장된 SQL 문은 직접 수정할 수 없습니다. 변경하려면 SQL 콘솔에 복사해 수정한 뒤 다시 저장하세요.</li></ul>
|
||||||
|
|
||||||
|
<section class="korean-image-guide"><h2>예전 화면 이미지 읽는 법</h2><p>아래 설명은 본문에 나온 이미지 순서에 맞췄습니다. 이미지는 원본을 유지했으므로 영문 메뉴가 보일 수 있습니다. 현재 앱에서는 한국어 메뉴를 사용합니다. 코드와 주소 및 제품 이름은 원래 표기를 따릅니다.</p><h3>이미지 1 · SQL 콘솔 화면</h3><p>화면에서 사용하는 주요 표현은 다음과 같습니다.</p><ul><li><span lang="en">Options</span>: 옵션</li><li><span lang="en">Tables</span>: 테이블</li><li><span lang="en">Value</span>: 값</li><li><span lang="en">Name</span>: 이름</li></ul><h3>이미지 3 · SQL 조회 결과</h3><p>화면에서 사용하는 주요 표현은 다음과 같습니다.</p><ul><li><span lang="en">Attributes</span>: 속성</li><li><span lang="en">Revisions</span>: 수정 이력</li><li><span lang="en">Options</span>: 옵션</li><li><span lang="en">Value</span>: 값</li></ul></section>
|
||||||
|
After Width: | Height: | Size: 35 KiB |
@@ -0,0 +1,2 @@
|
|||||||
|
<p>새 노트의 기본 제목은 새 노트입니다. 다른 제목이나 생성 시점에 따라 달라지는 제목을 사용하려면 <code>#titleTemplate</code> <a
|
||||||
|
href="#root/_help_zEY4DaJG4YT5">라벨</a>을 지정하세요. 이 기능은 0.52부터 지원합니다.</p><p>상위 노트에 라벨과 값을 지정하면 하위 노트를 만들 때 그 값을 제목으로 사용합니다. 상속을 켜면 더 아래 단계에도 적용됩니다. 최상위 노트에 지정하면 전체 노트에 적용할 수 있습니다.</p><p>예를 들어 2022년에 읽은 책 아래에 닐 스티븐슨의 아나뎀과 프란츠 카프카의 변신을 기록한다고 가정해 보겠습니다. 상위 노트에 <code>#titleTemplate="[저자]의 [책 제목] ([출간 연도])"</code>를 지정하면 새 하위 노트의 제목이 이 형식으로 만들어집니다.</p><p>정보를 자동으로 추론하는 기능은 아닙니다. 대괄호 부분은 사용자가 직접 채워 넣는 자리입니다.</p><h2>동적으로 제목 만들기</h2><p>제목 템플릿은 노트를 만드는 순간 JavaScript 문자열로 평가됩니다. 문자열 보간을 사용하면 날짜나 상위 노트의 값을 넣을 수 있습니다. <code>parentNote</code> 변수는 상위 노트의 <a href="#root/_help_habiZ3HU8Kw8">FNote 객체</a>를 제공합니다.</p><p>본문까지 기본 내용을 지정하려면 <a class="reference-link" href="#root/_help_KC1HB96bqqHX">템플릿</a>도 참고하세요.</p><h3>예제</h3><p>서버 장애 기록을 날짜별로 남긴다면 상위 노트에 <code>#titleTemplate="${now.format('YYYY-MM-DD')}: "</code>를 지정하세요. 새 노트를 만들 때 <a href="https://day.js.org/docs/en/display/format">now 날짜 객체</a>를 사용해 날짜가 입력됩니다. 이후 시스템 중단이나 백업 지연처럼 사건 이름을 덧붙이면 됩니다.</p><p>상위 노트의 저자 속성을 사용하려면 <code>#titleTemplate="${parentNote.getLabelValue('authorName')}의 작품"</code>을 사용하세요. 상위 노트의 제목을 그대로 사용하려면 <code>${parentNote.title}</code>을 지정합니다.</p>
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
<p>ETAPI는 외부 프로그램에서 Trilium을 사용하는 REST API입니다. 0.50부터 제공됩니다. 명세는 <a href="https://github.com/TriliumNext/Notes/blob/master/src/etapi/etapi.openapi.yaml">OpenAPI 문서</a>에서 확인할 수 있습니다.</p><h2>클라이언트 라이브러리</h2><p><a href="https://github.com/Nriver/trilium-py">trilium-py</a>를 사용하면 Python에서 Trilium에 접근하는 코드를 더 쉽게 작성할 수 있습니다.</p><h2>토큰 발급</h2><p>모든 API 작업은 토큰으로 인증해야 합니다. 설정 → ETAPI에서 발급하거나 <code>/auth/login</code> 요청으로 받을 수 있습니다. 자세한 요청 형식은 <a href="https://github.com/TriliumNext/Notes/blob/master/src/etapi/etapi.openapi.yaml">API 명세</a>를 참고하세요.</p><h2>인증</h2><h3>Authorization 헤더</h3><pre><code class="language-text-x-trilium-auto">GET https://myserver.com/etapi/app-info
|
||||||
|
Authorization: ETAPITOKEN</code></pre><p><code>ETAPITOKEN</code>을 발급받은 토큰으로 바꾸세요. 0.93.0부터는 다른 도구와의 호환성을 위해 <code>Bearer ETAPITOKEN</code> 형식도 지원합니다.</p><h3>기본 인증</h3><p>0.56부터 다음 형식도 지원합니다.</p><pre><code class="language-text-x-trilium-auto">GET https://myserver.com/etapi/app-info
|
||||||
|
Authorization: Basic BATOKEN</code></pre><ul><li><code>BATOKEN = BASE64(username + ':' + password)</code> 형식으로 만듭니다.</li><li>사용자 이름은 <code>etapi</code>입니다.</li><li>비밀번호 자리에 발급받은 ETAPI 토큰을 넣습니다.</li></ul><p>기본 인증만 지원하는 도구에서 사용할 수 있는 방식입니다.</p><h2>Bash 스크립트 예제</h2><p>다음 예제는 노트의 HTML 본문을 내려받습니다.</p><pre><code class="language-text-x-trilium-auto">#!/usr/bin/env bash
|
||||||
|
|
||||||
|
# 연결 설정
|
||||||
|
TOKEN=YOUR_ETAPI_TOKEN
|
||||||
|
SERVER=http://localhost:8080
|
||||||
|
|
||||||
|
# 노트 ID로 본문 내려받기
|
||||||
|
NOTE_ID="i6ra4ZshJhgN"
|
||||||
|
curl "$SERVER/etapi/notes/$NOTE_ID/content" -H "Authorization: $TOKEN" </code></pre><p>실행 전에 다음 값을 바꾸세요.</p><ul><li><code>TOKEN</code> — 직접 발급받은 ETAPI 토큰</li><li><code>SERVER</code> — 사용 중인 Trilium의 프로토콜과 호스트 및 포트</li><li><code>NOTE_ID</code> — 내려받을 노트의 ID</li></ul>
|
||||||
@@ -0,0 +1,15 @@
|
|||||||
|
<p><img style="aspect-ratio:263/445;" src="Hidden Notes_image.png" width="263"
|
||||||
|
height="445" alt="숨겨진 노트 트리"></p><p>Trilium은 여러 기능의 정보를 실제 노트로 저장합니다. 덕분에 <a class="reference-link"
|
||||||
|
href="#root/_help_zEY4DaJG4YT5">속성</a>과 <a class="reference-link"
|
||||||
|
href="#root/_help_Cq5X6iKQop6R">관계</a> 및 <a class="reference-link"
|
||||||
|
href="#root/_help_eIg8jdvaoNNd">검색</a>과 <a class="reference-link"
|
||||||
|
href="#root/_help_QEAPj01N5f7w">링크</a>를 활용할 수 있습니다. 트리가 복잡해지거나 실수로 지우는 일을 줄이기 위해 기본적으로 숨겨 둡니다. 일반 노트처럼 <a class="reference-link"
|
||||||
|
href="#root/_help_wX4HbRucYSDD">데이터베이스</a>에 저장되지만 특별한 <a class="reference-link" href="#root/_help_m1lbrzyKDaRB">노트 ID</a>로 구분합니다.</p><h2>숨겨진 트리 열기</h2><p><a class="reference-link" href="#root/_help_x3i7MxGccDuM">전체 메뉴</a>에서 고급 → 숨겨진 하위 트리 표시를 선택합니다.</p><h2>구성</h2><ul><li><a class="reference-link" href="#root/_hidden/_help__globalNoteMap">노트 지도</a> — <a class="reference-link" href="#root/_help_bdUJEHsAPYQR">노트 지도</a> 기능을 <a class="reference-link" href="#root/_help_xYmIYSP6wE3F">실행 도구 모음</a>에서 열 때 사용하는 노트입니다. 하위 노트를 만들어 지도 모음을 보관하고 다른 곳에서 연결하거나 <a href="#root/_help_u3YFHC9tQlpm">북마크</a>로 지정할 수 있습니다.</li><li><a class="reference-link" href="#root/_hidden/_help__sqlConsole">SQL 콘솔 기록</a> — <a class="reference-link"
|
||||||
|
href="#root/_help_YKWqdJhzi2VY">SQL 콘솔</a>에서 실행한 쿼리를 월별로 보관합니다. 결과는 저장하지 않습니다. <a class="reference-link" href="#root/_help_x3i7MxGccDuM">전체 메뉴</a> → 고급 → SQL 콘솔 기록 열기로도 접근합니다. 기록 처리에 영향을 주지 않도록 임의의 하위 노트는 만들지 않는 편이 좋습니다.</li><li><a class="reference-link" href="#root/_hidden/_help__search">검색 기록</a> — 전체 <a class="reference-link"
|
||||||
|
href="#root/_help_eIg8jdvaoNNd">검색</a>의 조건을 월별로 보관합니다. 결과 자체는 저장하지 않습니다. <a class="reference-link" href="#root/_help_x3i7MxGccDuM">전체 메뉴</a> → 고급 → 검색 기록 열기로 접근합니다. 임의의 하위 노트는 권장하지 않습니다.</li><li><a class="reference-link" href="#root/_hidden/_help__bulkAction">일괄 작업</a> — 마지막 <a class="reference-link" href="#root/_help_ivYnonVFBxbQ">일괄 작업</a> 설정을 각 <code>action</code> 라벨에 보관합니다. 하위 노트를 만들어도 특별한 기능은 없습니다.</li><li><a class="reference-link" href="#root/_hidden/_help__backendLog">백엔드 로그</a> — 서버의 <a class="reference-link"
|
||||||
|
href="#root/_help_qzNzp9LYQyPT">오류 로그</a>를 표시합니다. <a class="reference-link" href="#root/_help_x3i7MxGccDuM">전체 메뉴</a> → 고급 → 백엔드 로그 표시로도 엽니다.</li><li><a class="reference-link" href="#root/_hidden/_help__userHidden">사용자 숨김 영역</a> — <a href="#root/_help_CdNpE2pqjmI6">스크립트</a>가 화면에 직접 표시하지 않을 노트를 보관하는 공간입니다. ID는 <code>_userHidden</code>입니다.</li><li><a class="reference-link" href="#root/_hidden/_help__lbTplRoot">실행 도구 템플릿</a> — <a
|
||||||
|
class="reference-link" href="#root/_help_xYmIYSP6wE3F">실행 도구 모음</a>의 새 항목을 만드는 템플릿입니다. 하위 노트를 만들 수 없습니다. 일부 내용을 바꿀 수는 있지만 보통 필요하지 않습니다.</li><li><a class="reference-link" href="#root/_hidden/_help__share">공유 노트</a> — 위치와 관계없이 <a href="#root/_help_R9pX4DGra2Vt">공개 공유</a> 중인 노트를 모아 보여 줍니다. <a class="reference-link" href="#root/_help_x3i7MxGccDuM">전체 메뉴</a>의 공유 노트 하위 트리 표시로도 엽니다. 하위 노트는 만들 수 없습니다.</li><li><a class="reference-link" href="#root/_hidden/_help__lbRoot">실행 도구 모음</a> — 사용 가능하거나 화면에 표시 중인 <a class="reference-link"
|
||||||
|
href="#root/_help_xYmIYSP6wE3F">실행 도구</a>를 담습니다. <a class="reference-link" href="#root/_help_x3i7MxGccDuM">전체 메뉴</a>에서 실행 도구 모음 설정을 선택하거나 <a class="reference-link" href="#root/_help_xYmIYSP6wE3F">실행 도구 모음</a>의 빈 곳을 마우스 오른쪽 버튼으로 눌러 설정합니다. 하위 노트는 만들 수 없습니다.</li><li><a class="reference-link" href="#root/_hidden/_help__options">설정</a> — <a class="reference-link" href="#root/_help_4TIF1oA4VQRO">설정 항목</a>을 저장합니다. <a class="reference-link" href="#root/_help_x3i7MxGccDuM">전체 메뉴</a>의 설정 또는 <a class="reference-link"
|
||||||
|
href="#root/_help_xYmIYSP6wE3F">실행 도구 모음</a>의 설정 아이콘으로 엽니다.</li><li><a class="reference-link" href="#root/_hidden/_help__lbMobileRoot">모바일 실행 도구 모음</a> — 모바일 화면에서 사용하는 별도 도구 모음입니다. 모바일 화면에서 같은 방법으로 설정합니다.</li><li><a class="reference-link" href="#root/_hidden/_help__help">사용자 안내서</a> — 도움말 노트의 구조와 메타데이터를 담습니다. 본문은 앱 디렉터리의 파일에서 읽습니다.</li></ul>
|
||||||
|
|
||||||
|
<section class="korean-image-guide"><h2>예전 화면 이미지 읽는 법</h2><p>아래 설명은 본문에 나온 이미지 순서에 맞췄습니다. 이미지는 원본을 유지했으므로 영문 메뉴가 보일 수 있습니다. 현재 앱에서는 한국어 메뉴를 사용합니다. 코드와 주소 및 제품 이름은 원래 표기를 따릅니다.</p><h3>이미지 1 · 숨겨진 노트 트리</h3><p>화면에서 사용하는 주요 표현은 다음과 같습니다.</p><ul><li><span lang="en">Note Map</span>: 노트 지도</li><li><span lang="en">Options</span>: 옵션</li><li><span lang="en">Search</span>: 검색</li><li><span lang="en">action</span>: 작업</li><li><span lang="en">Shared</span>: 공유됨</li><li><span lang="en">Notes</span>: 노트</li></ul></section>
|
||||||
|
After Width: | Height: | Size: 8.6 KiB |
@@ -0,0 +1,28 @@
|
|||||||
|
<p>측정 지표 API는 Prometheus 같은 외부 모니터링 시스템에 Trilium 상태를 제공합니다.</p><h2>접속</h2><p><code>GET /etapi/metrics</code>로 요청합니다. ETAPI 토큰이 필요하며 기본 응답은 Prometheus 텍스트 형식입니다.</p><pre><code class="language-text-x-trilium-auto"># ETAPI 토큰 발급 예시
|
||||||
|
curl -X POST http://localhost:8080/etapi/auth/login \
|
||||||
|
-H "Content-Type: application/json" \
|
||||||
|
-d '{"password": "your_password"}'
|
||||||
|
</code></pre><h2>사용 예시</h2><pre><code class="language-text-x-trilium-auto">curl -H "Authorization: YOUR_ETAPI_TOKEN" \
|
||||||
|
http://localhost:8080/etapi/metrics
|
||||||
|
</code></pre><p>다음과 같은 형식으로 응답합니다. 지표 이름과 형식은 연동을 위해 유지합니다.</p><pre><code class="language-text-x-trilium-auto"># HELP trilium_info Trilium 인스턴스 정보
|
||||||
|
# TYPE trilium_info gauge
|
||||||
|
trilium_info{version="0.91.6",db_version="231",node_version="v18.17.0"} 1 1701432000
|
||||||
|
|
||||||
|
# HELP trilium_notes_total 삭제된 노트를 포함한 전체 노트 수
|
||||||
|
# TYPE trilium_notes_total gauge
|
||||||
|
trilium_notes_total 1234 1701432000
|
||||||
|
</code></pre><p>JSON으로 받으려면 다음처럼 요청합니다.</p><pre><code class="language-text-x-trilium-auto">curl -H "Authorization: YOUR_ETAPI_TOKEN" \
|
||||||
|
"http://localhost:8080/etapi/metrics?format=json"
|
||||||
|
</code></pre><h2>제공 지표</h2><ul><li><code>trilium_info</code> — 버전과 빌드 정보</li><li><code>trilium_notes_total</code> — 삭제된 노트를 포함한 전체 노트 수</li><li><code>trilium_notes_deleted</code> — 삭제된 노트 수</li><li><code>trilium_notes_active</code> — 활성 노트 수</li><li><code>trilium_notes_protected</code> — 보호 노트 수</li><li><code>trilium_attachments_total</code> — 전체 첨부 파일 수</li><li><code>trilium_attachments_active</code> — 활성 첨부 파일 수</li><li><code>trilium_revisions_total</code> — 수정 이력 수</li><li><code>trilium_branches_total</code> — 활성 가지 수</li><li><code>trilium_attributes_total</code> — 활성 속성 수</li><li><code>trilium_blobs_total</code> — 본문 데이터 레코드 수</li><li><code>trilium_etapi_tokens_total</code> — 활성 ETAPI 토큰 수</li><li><code>trilium_embeddings_total</code> — 노트 임베딩 수</li><li><code>trilium_notes_by_type</code> — 유형별 노트 수. type 라벨로 구분합니다.</li><li><code>trilium_attachments_by_type</code> — MIME 유형별 첨부 파일 수. mime_type 라벨로 구분합니다.</li><li><code>trilium_database_size_bytes</code> — 데이터베이스 크기. 바이트 단위입니다.</li><li><code>trilium_oldest_note_timestamp</code> — 가장 오래된 노트의 시각</li><li><code>trilium_newest_note_timestamp</code> — 가장 최근 노트의 시각</li><li><code>trilium_last_modified_timestamp</code> — 마지막 수정 시각</li></ul><h2>Prometheus 설정</h2><p><code>prometheus.yml</code>에 추가할 예시입니다.</p><pre><code class="language-text-x-trilium-auto">scrape_configs:
|
||||||
|
- job_name: 'trilium'
|
||||||
|
static_configs:
|
||||||
|
- targets: ['localhost:8080']
|
||||||
|
metrics_path: '/etapi/metrics'
|
||||||
|
bearer_token: 'YOUR_ETAPI_TOKEN'
|
||||||
|
scrape_interval: 30s
|
||||||
|
</code></pre><h2>오류 응답</h2><p>400은 지원하지 않는 format 값입니다. 401은 토큰이 없거나 유효하지 않다는 뜻이며 500은 서버 내부 오류입니다.</p><h2>Grafana 대시보드</h2><p><img style="aspect-ratio:2594/1568;" src="1_Metrics_image.png" width="2594"
|
||||||
|
height="1568" alt="Trilium 모니터링 대시보드"></p><p><a class="reference-link" href="#root/_help_bOP3TB56fL1V">Grafana 대시보드 JSON</a>을 가져오기 화면에 입력하세요.</p><p><img style="aspect-ratio:1881/282;" src="2_Metrics_image.png" width="1881"
|
||||||
|
height="282" alt="대시보드 가져오기 메뉴"></p><p>JSON을 붙여넣고 불러오기를 누릅니다.</p><p><img style="aspect-ratio:1055/830;" src="Metrics_image.png" width="1055"
|
||||||
|
height="830" alt="대시보드 JSON 입력"></p>
|
||||||
|
|
||||||
|
<section class="korean-image-guide"><h2>예전 화면 이미지 읽는 법</h2><p>아래 설명은 본문에 나온 이미지 순서에 맞췄습니다. 이미지는 원본을 유지했으므로 영문 메뉴가 보일 수 있습니다. 현재 앱에서는 한국어 메뉴를 사용합니다. 코드와 주소 및 제품 이름은 원래 표기를 따릅니다.</p><h3>이미지 1 · Trilium 모니터링 대시보드</h3><p>화면에서 사용하는 주요 표현은 다음과 같습니다.</p><ul><li><span lang="en">Attachments Growth Over Time</span>: 시간에 따른 첨부 파일 수 변화</li><li><span lang="en">Notes Growth Over Time</span>: 시간에 따른 노트 수 변화</li><li><span lang="en">Notes by Content Type</span>: 내용 유형별 노트</li><li><span lang="en">TriliumNext Dashboard</span>: TriliumNext 대시보드</li><li><span lang="en">Trends & Time Series</span>: 시간에 따른 변화</li><li><span lang="en">Attachments by Type</span>: 유형별 첨부 파일</li><li><span lang="en">Notes Distribution</span>: 노트 분포</li><li><span lang="en">Trilium Overview</span>: Trilium 개요</li><li><span lang="en">Protected Notes</span>: 보호된 노트</li><li><span lang="en">Database Size</span>: 데이터베이스 크기</li><li><span lang="en">Deleted Notes</span>: 삭제된 노트</li><li><span lang="en">Active Notes</span>: 사용 중인 노트</li></ul><h3>이미지 2 · 대시보드 가져오기 메뉴</h3><p>화면에서 사용하는 주요 표현은 다음과 같습니다.</p><ul><li><span lang="en">Folders</span>: 폴더</li><li><span lang="en">Search</span>: 검색</li></ul><h3>이미지 3 · 대시보드 JSON 입력</h3><p>화면에서 사용하는 주요 표현은 다음과 같습니다.</p><ul><li><span lang="en">Import</span>: 가져오기</li><li><span lang="en">title</span>: 제목</li><li><span lang="en">Model</span>: 모델</li><li><span lang="en">File</span>: 파일</li></ul></section>
|
||||||
|
After Width: | Height: | Size: 73 KiB |
@@ -0,0 +1,2 @@
|
|||||||
|
<p>Trilium은 파일 이름 대신 노트 ID로 각 노트를 구분합니다. 일반적으로 새 노트를 만들 때 영문 대소문자와 숫자로 이루어진 12자리 ID를 무작위로 생성합니다.</p><h2>가져오기와 내보내기의 영향</h2><p>노트를 내보내면 ID도 메타데이터에 기록됩니다. 하지만 다시 가져올 때는 모든 노트에 새 ID를 부여합니다. <a class="reference-link" href="#root/_help_0vhv7lsOLy82">첨부 파일</a>처럼 함께 가져오는 다른 항목도 새 ID를 받습니다.</p><h2>ID 충돌</h2><p>ID는 길이가 정해져 있고 무작위로 만들어지므로 <a
|
||||||
|
href="https://en.wikipedia.org/wiki/Pigeonhole_principle">비둘기집 원리</a>에 따라 기존 노트와 같은 ID가 생성될 가능성이 있습니다.</p><p>사용할 수 있는 문자가 62개이고 길이가 12자리이므로 가능한 ID 수는 <span class="math-tex">\(62^{12}\)</span>개입니다. 원문은 <a href="https://alex7kom.github.io/nano-nanoid-cc/?alphabet=0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz&size=12&speed=1000&speedUnit=hour">Nano ID 충돌 계산기</a>를 이용해 매시간 1000개의 노트를 약 900년 동안 만들어야 충돌 확률이 1% 정도가 된다고 설명합니다.</p><p>이처럼 가능성이 매우 작아 Trilium은 별도의 충돌 방지 절차를 두지 않습니다. 고유 해시를 사용하는 <a href="https://stackoverflow.com/questions/10434326/hash-collision-in-git">Git</a>에도 비슷한 문제가 있습니다. 이론적으로 충돌이 발생하면 기존 노트를 새 노트가 덮어쓸 가능성이 있습니다.</p>
|
||||||
|
After Width: | Height: | Size: 77 KiB |
@@ -0,0 +1,3 @@
|
|||||||
|
<p>노트 지도는 노트 사이의 연결을 시각적으로 보여 줍니다. 노트들이 어떤 구조로 묶여 있는지 파악할 수 있습니다.</p><p>다음 두 가지 보기가 있습니다.</p><ul><li>링크 지도 — 노트 사이의 관계를 표시합니다.</li><li>트리 지도 — 노트의 계층 구조를 표시합니다.</li></ul><h2>링크 지도</h2><p>노트 사이의 <a href="#root/_help_zEY4DaJG4YT5">관계</a>를 보여 줍니다.</p><p><img src="1_Note Map (Link map, Tree m.png" alt="링크 지도"></p><h2>트리 지도</h2><p>노트의 상위·하위 구조를 보여 줍니다.</p><p><img src="Note Map (Link map, Tree m.png" alt="트리 지도"></p><h2>독립된 노트 유형</h2><p>모든 노트에서 열 수 있는 지도 기능 외에 관계를 전체 화면에 표시하는 전용 노트를 만들 수도 있습니다. <a href="#root/_help_bdUJEHsAPYQR">노트 지도 유형</a>을 참고하세요.</p><h2>관련 기능</h2><p><a href="#root/_help_iRwzGnHPzonm">관계 지도</a>는 비슷한 기능이지만 다음과 같은 차이가 있습니다.</p><ul><li>노트 지도는 자동으로 만들어집니다. 관계 지도는 직접 구성합니다.</li><li>관계 지도는 하나의 노트 유형입니다. 링크 지도는 연결을 화면에 보여 주는 보기 기능입니다.</li></ul>
|
||||||
|
|
||||||
|
<section class="korean-image-guide"><h2>예전 화면 이미지 읽는 법</h2><p>아래 설명은 본문에 나온 이미지 순서에 맞췄습니다. 이미지는 원본을 유지했으므로 영문 메뉴가 보일 수 있습니다. 현재 앱에서는 한국어 메뉴를 사용합니다. 코드와 주소 및 제품 이름은 원래 표기를 따릅니다.</p><h3>이미지 1 · 링크 지도</h3><p>화면에서 사용하는 주요 표현은 다음과 같습니다.</p><ul><li><span lang="en">Template</span>: 템플릿</li></ul><h3>이미지 2 · 트리 지도</h3><p>화면에서 사용하는 주요 표현은 다음과 같습니다.</p><ul><li><span lang="en">Quick search</span>: 빠른 검색</li><li><span lang="en">Formatting</span>: 서식</li><li><span lang="en">Note Map</span>: 노트 지도</li><li><span lang="en">Widget</span>: 위젯</li></ul></section>
|
||||||
@@ -0,0 +1,18 @@
|
|||||||
|
<h2>노트의 내부 형식</h2><p>본문을 저장하는 방식은 <a class="reference-link" href="#root/_help_KSZ04uQ2D1St">노트 유형</a>마다 다릅니다.</p><ul><li><a class="reference-link" href="#root/_help_iPIMuisry3hd">텍스트 노트</a>는 <a class="reference-link"
|
||||||
|
href="#root/_help_MI26XDLSAlCD">CKEditor</a>가 사용하는 HTML로 저장합니다. 안내 상자처럼 Trilium 전용 요소도 있습니다.</li><li><a class="reference-link" href="#root/_help_6f9hih2hXXZk">코드 노트</a>는 입력한 텍스트를 그대로 저장합니다.</li><li><a class="reference-link" href="#root/_help_81SGnPGMk7Xc">지리 지도</a>는 위치와 확대 비율 등의 JSON을 저장합니다.</li><li><a class="reference-link" href="#root/_help_grjYqerjn243">캔버스</a>는 <a
|
||||||
|
class="reference-link" href="#root/_help_H0mM1lTxF9JI">Excalidraw</a>의 JSON과 Trilium용 정보를 함께 저장합니다.</li><li><a class="reference-link" href="#root/_help_gBbsAeiuUxI5">마인드맵</a>은 <a class="reference-link"
|
||||||
|
href="#root/_help_N4IDkixaDG9C">MindElixir</a>의 JSON 형식을 사용합니다.</li></ul><p>일부 정보는 <a class="reference-link"
|
||||||
|
href="#root/_help_0vhv7lsOLy82">첨부 파일</a>에 저장합니다. <a class="reference-link"
|
||||||
|
href="#root/_help_grjYqerjn243">캔버스</a>는 사용자 라이브러리를 첨부하며 <a class="reference-link"
|
||||||
|
href="#root/_help_gBbsAeiuUxI5">마인드맵</a> 등은 다른 노트에 포함하거나 공유할 때 사용할 SVG 미리보기도 첨부합니다.</p><p>다음은 이 문서의 HTML 형식을 설명하는 예제입니다.</p><pre><code class="language-text-x-trilium-auto"><h2>
|
||||||
|
노트의 내부 형식
|
||||||
|
</h2>
|
||||||
|
<p>
|
||||||
|
본문을 저장하는 방식은 다음 유형에 따라 다릅니다.&nbsp;
|
||||||
|
<a class="reference-link" href="#root/_help_KSZ04uQ2D1St">
|
||||||
|
노트 유형
|
||||||
|
</a>
|
||||||
|
.
|
||||||
|
</p></code></pre><h2>소스 보기</h2><p><a class="reference-link" href="#root/_help_8YBEPzcpUgxw">노트 메뉴</a>에서 노트 소스를 선택하면 새 탭에서 열립니다. 텍스트 노트처럼 일부 유형은 읽기 편하도록 들여쓰기를 적용합니다.</p><p><img src="Note source_image.png" alt="노트 소스 화면"></p><h2>소스 수정</h2><p>소스 보기 화면에서 직접 편집할 수는 없습니다. 수정하려면 노트 유형을 일반 텍스트나 JSON 또는 HTML 코드로 바꾸고 경고를 확인한 뒤 본문을 고치세요. 작업 후에는 원래 유형으로 되돌립니다.</p><p>형식을 잘못 수정하면 노트가 표시되지 않을 수 있습니다. 먼저 이전 버전을 저장하세요. 문제가 생기면 소스를 다시 수정하거나 이전 버전으로 복원합니다. 화면이 정상으로 돌아오지 않으면 새로고침이 필요할 수 있습니다.</p>
|
||||||
|
|
||||||
|
<section class="korean-image-guide"><h2>예전 화면 이미지 읽는 법</h2><p>아래 설명은 본문에 나온 이미지 순서에 맞췄습니다. 이미지는 원본을 유지했으므로 영문 메뉴가 보일 수 있습니다. 현재 앱에서는 한국어 메뉴를 사용합니다. 코드와 주소 및 제품 이름은 원래 표기를 따릅니다.</p><h3>이미지 1 · 노트 소스 화면</h3><p>화면에서 사용하는 주요 표현은 다음과 같습니다.</p><ul><li><span lang="en">Note source</span>: 노트 소스</li><li><span lang="en">Notes</span>: 노트</li><li><span lang="en">Code</span>: 코드</li></ul></section>
|
||||||
|
After Width: | Height: | Size: 24 KiB |
@@ -0,0 +1,14 @@
|
|||||||
|
<p>선택한 노트를 누구나 읽을 수 있는 웹문서로 공개합니다. 공유 화면은 읽기 전용입니다.</p><p><img style="aspect-ratio:1144/660;" src="Sharing_image.png" width="1144"
|
||||||
|
height="660" alt="공유 페이지"></p><h2>기능과 제한</h2><p>제목 검색과 모바일 화면을 지원합니다. 브라우저 설정에 따라 밝은 모드와 어두운 모드를 적용하며 직접 전환한 설정도 기억합니다. 트리를 접거나 펼치고 로고를 바꿀 수 있습니다. 이전·다음 노트 이동과 마지막 수정 날짜도 표시합니다.</p><ul><li><a class="reference-link" href="#root/pOsGYCXsbNQG/KSZ04uQ2D1St/_help_iPIMuisry3hd">텍스트</a> — 목차와 수식을 표시합니다. 언어를 지정한 코드 블록은 구문 강조를 지원하지만 자동 감지는 지원하지 않습니다. 노트 포함과 본문 안의 Mermaid 도표는 지원하지 않습니다.</li><li><a class="reference-link" href="#root/pOsGYCXsbNQG/KSZ04uQ2D1St/_help_6f9hih2hXXZk">코드</a> — 고정폭 글꼴로 본문을 보여 주지만 구문 강조는 없습니다.</li><li><a class="reference-link" href="#root/pOsGYCXsbNQG/KSZ04uQ2D1St/_help_m523cpzocqaD">저장된 검색</a> — 지원하지 않습니다.</li><li><a class="reference-link" href="#root/pOsGYCXsbNQG/KSZ04uQ2D1St/_help_iRwzGnHPzonm">관계도</a> — 지원하지 않습니다.</li><li><a class="reference-link" href="#root/pOsGYCXsbNQG/KSZ04uQ2D1St/_help_bdUJEHsAPYQR">노트 지도</a> — 지원하지 않습니다.</li><li><a class="reference-link" href="#root/pOsGYCXsbNQG/KSZ04uQ2D1St/_help_HcABDtFCkbFN">렌더링 노트</a> — 지원하지 않습니다.</li><li><a class="reference-link" href="#root/pOsGYCXsbNQG/KSZ04uQ2D1St/_help_GTwFsgaA0lCt">책</a> — 하위 노트를 정해진 형식으로 표시합니다. 달력 등 고급 보기는 지원하지 않습니다.</li><li><a class="reference-link" href="#root/pOsGYCXsbNQG/KSZ04uQ2D1St/_help_s1aBHPd79XYj">Mermaid 도표</a> — 벡터 이미지로 표시합니다. 추가 조작은 지원하지 않습니다.</li><li><a class="reference-link" href="#root/pOsGYCXsbNQG/KSZ04uQ2D1St/_help_grjYqerjn243">캔버스</a> — 벡터 이미지로 표시합니다. 추가 조작은 지원하지 않습니다.</li><li><a class="reference-link" href="#root/pOsGYCXsbNQG/KSZ04uQ2D1St/_help_1vHRoWCEjj0L">웹 보기</a> — 지원하지 않습니다.</li><li><a class="reference-link" href="#root/pOsGYCXsbNQG/KSZ04uQ2D1St/_help_gBbsAeiuUxI5">마인드맵</a> — 벡터 이미지로 표시합니다. 추가 조작은 지원하지 않습니다.</li><li><a class="reference-link" href="#root/pOsGYCXsbNQG/KSZ04uQ2D1St/_help_81SGnPGMk7Xc">지리 지도</a> — 지원하지 않습니다.</li><li><a class="reference-link" href="#root/pOsGYCXsbNQG/KSZ04uQ2D1St/_help_W8vYD3Q1zjCR">파일</a> — 내려받기를 지원합니다.</li></ul><p>공유 트리는 정적인 구조이며 보호된 노트는 공유할 수 없습니다.</p><h2>공유하기</h2><p><a class="reference-link"
|
||||||
|
href="#root/_help_WOcw2SLH6tbX">서버 설치</a>가 필요합니다. 노트 화면에서 공유 스위치를 켜면 접근할 URL이 나타납니다.</p><p><img src="Sharing_share-single-note.png" alt="노트 공유 스위치"></p><p>표시된 링크를 브라우저에서 엽니다. 서버 주소 설정에 따라 <code>localhost</code> 주소가 보일 수도 있습니다. 외부 접속에는 외부에서 접근 가능한 서버 주소가 필요합니다.</p><h3>하위 트리</h3><p>노트를 공유하면 그 아래의 하위 노트도 함께 공유됩니다. 공유 노트 하위 트리 표시에서 전체 공개 목록을 확인할 수 있습니다.</p><h3>접근 범위</h3><p>별도 인증을 설정하지 않은 공유 문서는 URL을 아는 누구나 열 수 있습니다. 무작위 주소는 접근 제어를 대신하지 않습니다. 공개할 자료인지 확인하세요.</p><h3>암호 설정</h3><p><code>#shareCredentials="username:password"</code> 형식으로 사용자 이름과 암호를 지정합니다. 하위 노트와 이미지에도 적용하려면 <a href="#root/_help_bwZpz2ajCEwO">상속 가능</a>으로 설정합니다.</p><h2>공유 화면 꾸미기</h2><p>CSS <a class="reference-link"
|
||||||
|
href="#root/_help_6f9hih2hXXZk">코드 노트</a>를 만들고 <code>~shareCss</code> 관계로 연결합니다. 하위 트리 전체에 적용하려면 관계를 상속 가능으로 설정합니다. CSS 노트에 <code>#shareHiddenFromTree</code>를 추가하면 탐색 트리에서 숨깁니다. <code>#shareOmitDefaultCss</code>는 <a
|
||||||
|
href="#root/_help_Wy267RK4M69c">기본 스타일</a>을 제외합니다.</p><h3>JavaScript</h3><p><code>~shareJs</code> 관계로 스크립트를 넣습니다. <code>fetchNote()</code>로 노트 정보를 읽을 수 있습니다. 다음 예제는 상위 노트의 속성을 출력합니다.</p><pre><code class="language-application-javascript-env-backend">const currentNote = await fetchNote();
|
||||||
|
const parentNote = await fetchNote(currentNote.parentNoteIds[0]);
|
||||||
|
|
||||||
|
for (const attr of parentNote.attributes) {
|
||||||
|
console.log(attr.type, attr.name, attr.value);
|
||||||
|
}</code></pre><h3>읽기 쉬운 주소</h3><p>보통 주소 끝에는 노트 ID가 붙습니다. <code>#shareAlias=highlighting</code>을 지정하면 <code>http://domain.tld/share/highlighting</code>처럼 사용할 수 있습니다. 별칭은 중복되지 않아야 하며 슬래시로 하위 경로를 만드는 방식은 지원하지 않습니다.</p><h3>공유 목록 관리</h3><p>공유 노트 영역에서 목록을 확인하고 이동이나 복제로 공유 상태를 관리할 수 있습니다.</p><p><img src="Sharing_shared-list.png" alt="공유 노트 목록"></p><h3>아이콘과 시작 페이지</h3><p><code>~shareFavicon</code> 관계로 <code>.ico</code> 같은 아이콘 파일 노트를 지정합니다. <code>#shareRoot</code>가 있는 노트는 <code>http://domain.tld/share</code>의 시작 페이지가 됩니다. <code>#shareIndex</code>를 함께 사용하면 공유 루트 목록을 보여 줄 수 있습니다.</p><h2>속성 안내</h2><ul><li><code>shareHiddenFromTree</code> — 탐색 트리에서만 숨깁니다. URL로는 여전히 접근할 수 있습니다.</li><li><code>shareExternalLink</code> — 공유 트리에서 외부 웹사이트 링크로 사용합니다.</li><li><code>shareAlias</code> — <code>https://your_trilium_host/share/[your_alias]</code> 주소의 별칭입니다.</li><li><code>shareOmitDefaultCss</code> — 기본 공유 CSS를 제외합니다.</li><li><code>shareRoot</code> — <code>/share</code>의 시작 노트입니다.</li><li><code>shareDescription</code> — HTML 설명 메타 태그에 넣을 문구입니다.</li><li><code>shareRaw</code> — HTML 틀 없이 원본 내용을 제공합니다. 속성 없이 사용하는 <a
|
||||||
|
class="reference-link" href="#root/_help_Qjt68inQ2bRj">노트 원문 제공</a> 방법도 있습니다.</li><li><code>shareDisallowRobotIndexing</code> — 검색 로봇에 색인 제외를 요청합니다. <code>X-Robots-Tag: noindex</code> 헤더와 <code>noindex, follow</code> 메타 태그를 설정합니다.</li><li><code>shareCredentials</code> — <code>username:password</code> 형식의 인증 정보입니다. 하위 노트와 이미지에도 적용하려면 상속 가능으로 설정합니다.</li><li><code>shareIndex</code> — 공유 중인 모든 루트 노트를 나열합니다.</li></ul><h2>제작에 도움을 준 프로젝트</h2><p>0.95.0부터 기본 적용된 공유 테마는 <a href="https://github.com/zerebos/trilium.rocks">Trilium Rocks!</a>를 바탕으로 합니다. 원작자는 <a
|
||||||
|
href="https://github.com/zerebos">zerebos</a>입니다. 모바일 화면과 밝기 전환 및 접을 수 있는 트리 등을 제공합니다.</p>
|
||||||
|
|
||||||
|
<section class="korean-image-guide"><h2>예전 화면 이미지 읽는 법</h2><p>아래 설명은 본문에 나온 이미지 순서에 맞췄습니다. 이미지는 원본을 유지했으므로 영문 메뉴가 보일 수 있습니다. 현재 앱에서는 한국어 메뉴를 사용합니다. 코드와 주소 및 제품 이름은 원래 표기를 따릅니다.</p><h3>이미지 1 · 공유 페이지</h3><p>화면에서 사용하는 주요 표현은 다음과 같습니다.</p><ul><li><span lang="en">Code Blocks</span>: 코드 블록</li><li><span lang="en">Formatting</span>: 서식</li><li><span lang="en">Delete</span>: 삭제</li><li><span lang="en">Search</span>: 검색</li><li><span lang="en">Notes</span>: 노트</li><li><span lang="en">Theme</span>: 테마</li><li><span lang="en">Help</span>: 도움말</li></ul><h3>이미지 2 · 노트 공유 스위치</h3><p>화면에서 사용하는 주요 표현은 다음과 같습니다.</p><ul><li><span lang="en">This note is shared locally on</span>: 이 노트는 다음에서 로컬로 공유됩니다</li><li><span lang="en">Protect the note</span>: 노트 보호</li><li><span lang="en">Quick search</span>: 빠른 검색</li><li><span lang="en">Code Blocks</span>: 코드 블록</li><li><span lang="en">Formatting</span>: 서식</li><li><span lang="en">September</span>: 9월</li><li><span lang="en">Note type</span>: 노트 유형</li><li><span lang="en">February</span>: 2월</li><li><span lang="en">Editable</span>: 편집 가능</li><li><span lang="en">Bookmark</span>: 북마크</li><li><span lang="en">August</span>: 8월</li><li><span lang="en">Widget</span>: 위젯</li></ul><h3>이미지 3 · 공유 노트 목록</h3><p>화면에서 사용하는 주요 표현은 다음과 같습니다.</p><ul><li><span lang="en">Quick search</span>: 빠른 검색</li><li><span lang="en">Shared</span>: 공유됨</li><li><span lang="en">Notes</span>: 노트</li></ul></section>
|
||||||
|
After Width: | Height: | Size: 11 KiB |
|
After Width: | Height: | Size: 6.8 KiB |