feat: install.sh 원클릭 설치 스크립트 + Dockerfile 추가 (main.cjs 실제 파일 포함)

- Dockerfile: triliumnext/notes:latest에 번역+패치된 main.cjs를 구워 넣어 별도
  bind-mount 없이 한국어 내장 이미지를 만듦
- install.sh: curl | bash 한 줄로 clone + build + up까지 처리
- 기존 bind-mount 방식은 docker-compose.bind-mount.yml.example로 유지
- 실제 빌드/실행/언어전환/컨테이너완전재생성까지 전부 테스트 완료
This commit is contained in:
syskiller
2026-08-26 09:54:35 +09:00
parent c3c91d4573
commit 9ebc24d681
5 changed files with 113 additions and 10 deletions
+5
View File
@@ -0,0 +1,5 @@
FROM triliumnext/notes:latest
COPY main.cjs /usr/src/app/main.cjs
COPY translation.json /usr/src/app/public/translations/ko/translation.json
COPY server.json /usr/src/app/assets/translations/ko/server.json
+37 -10
View File
@@ -9,35 +9,62 @@
## 포함된 파일 ## 포함된 파일
- `install.sh` — **원클릭 설치 스크립트**. 명령어 한 줄로 저장소를 내려받고, 한국어가
내장된 이미지를 빌드해서 바로 실행시킵니다.
- `Dockerfile` — `triliumnext/notes:latest` 위에 번역 파일과 패치된 `main.cjs`를
구워 넣어서, 별도 bind-mount 없이 한국어가 기본 내장된 이미지를 만듭니다.
- `docker-compose.yml` — 위 `Dockerfile`로 빌드해서 바로 띄우는 compose 파일
(`install.sh`가 내부적으로 이걸 사용합니다).
- `translation.json` — 클라이언트(브라우저) UI 문자열, 1,712개 키, 100% 번역 완료. - `translation.json` — 클라이언트(브라우저) UI 문자열, 1,712개 키, 100% 번역 완료.
- `server.json` — 서버 문자열, 283개 키, 100% 번역 완료. - `server.json` — 서버 문자열, 283개 키, 100% 번역 완료.
- `main.cjs` — **이미 패치가 적용된, 바로 쓸 수 있는 서버 번들** (`triliumnext/notes:latest`, - `main.cjs` — **이미 패치가 적용된, 바로 쓸 수 있는 서버 번들** (`triliumnext/notes:latest`,
빌드일 2025-06-07, appVersion 0.95.0 기준). 아래 설치 방법 2번을 직접 실행할 필요 없이 빌드일 2025-06-07, appVersion 0.95.0 기준).
이 파일로 바로 bind-mount 하면 됩니다.
- `patch_main_cjs.js` — 위 `main.cjs`를 만들어낸 패치 스크립트. 다른 버전의 이미지를 쓰거나 - `patch_main_cjs.js` — 위 `main.cjs`를 만들어낸 패치 스크립트. 다른 버전의 이미지를 쓰거나
이미지가 업데이트된 경우, 이 스크립트를 새 원본 `main.cjs`에 다시 돌려서 직접 패치된 이미지가 업데이트된 경우, 이 스크립트를 새 원본 `main.cjs`에 다시 돌려서 직접 패치된
파일을 만들어야 합니다 (왜 이게 필요한지는 스크립트 상단 주석 참고). 파일을 만들어야 합니다 (왜 이게 필요한지는 스크립트 상단 주석 참고).
- `docker-compose.yml.example` — 아래 설치 방법을 그대로 반영한 예시 compose 파일. - `docker-compose.bind-mount.yml.example` — 이미 떠 있는 공식 이미지 컨테이너에 파일만
bind-mount로 추가하고 싶을 때 쓰는 예시 (이미지를 새로 빌드하지 않는 방식).
`triliumnext/notes:latest` (빌드일 2025-06-07, appVersion 0.95.0) 기준으로 테스트했습니다. `triliumnext/notes:latest` (빌드일 2025-06-07, appVersion 0.95.0) 기준으로 테스트했습니다.
`main.cjs` 안의 변수명은 전부 난독화(minify)되어 있고 **빌드마다 이름이 바뀔 수 있습니다** — `main.cjs` 안의 변수명은 전부 난독화(minify)되어 있고 **빌드마다 이름이 바뀔 수 있습니다** —
`patch_main_cjs.js`를 새 이미지에 돌렸을 때 `[skip]`이 출력되면, 스크립트가 찾는 문자열 `patch_main_cjs.js`를 새 이미지에 돌렸을 때 `[skip]`이 출력되면, 스크립트가 찾는 문자열
패턴이 그 빌드에서 바뀐 것이니 새 빌드에서 같은 패턴을 다시 찾아 스크립트를 갱신해야 합니다. 패턴이 그 빌드에서 바뀐 것이니 새 빌드에서 같은 패턴을 다시 찾아 스크립트를 갱신해야 합니다.
## 설치 방법 (빠른 길 — 이미지 버전이 같다면) ## 설치 방법 — 명령어 한 줄 (추천)
이 저장소의 `main.cjs`는 이미 패치가 끝난 파일입니다. `triliumnext/notes:latest` Docker와 Docker Compose 플러그인만 설치되어 있으면 됩니다:
(appVersion 0.95.0, 빌드일 2025-06-07)를 그대로 쓴다면 아래 1, 3번만 하면 됩니다.
```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로 등록** 1. **번역 파일 + `main.cjs`를 `docker-compose.yml`에 bind-mount로 등록**
(`docker cp`로만 넣지 말 것 — 아래 "문제 4" 참고): (`docker cp`로만 넣지 말 것 — 아래 "문제 4" 참고):
- `main.cjs` → `/usr/src/app/main.cjs` - `main.cjs` → `/usr/src/app/main.cjs`
- `translation.json` → `/usr/src/app/public/translations/ko/translation.json` - `translation.json` → `/usr/src/app/public/translations/ko/translation.json`
- `server.json` → `/usr/src/app/assets/translations/ko/server.json` - `server.json` → `/usr/src/app/assets/translations/ko/server.json`
2. `docker-compose.yml.example`을 참고해서 그대로 적용, 컨테이너 시작. 2. `docker-compose.bind-mount.yml.example`을 참고해서 그대로 적용, 컨테이너 재시작.
3. 앱 안에서 **옵션 → 언어 및 지역**에서 "한국어" 선택. 3. 앱 안에서 **옵션 → 언어 및 지역**에서 "한국어" 선택 후 새로고침.
## 설치 방법 (다른 이미지 버전을 쓰는 경우) ## 설치 방법 — 다른 이미지 버전을 쓰는 경우 (직접 패치)
이미지 버전이 다르면 `main.cjs`의 난독화된 변수명/위치가 달라 이 저장소의 `main.cjs`가 이미지 버전이 다르면 `main.cjs`의 난독화된 변수명/위치가 달라 이 저장소의 `main.cjs`가
그대로 안 맞을 수 있습니다. 이 경우 직접 패치해야 합니다: 그대로 안 맞을 수 있습니다. 이 경우 직접 패치해야 합니다:
@@ -54,7 +81,7 @@
`[skip]`이 출력되면 스크립트가 찾는 문자열 패턴이 그 빌드에서 바뀐 것이니, 새 빌드에서 `[skip]`이 출력되면 스크립트가 찾는 문자열 패턴이 그 빌드에서 바뀐 것이니, 새 빌드에서
같은 패턴을 다시 찾아 스크립트를 갱신해야 합니다 (아래 "빌드마다 달라짐" 참고). 같은 패턴을 다시 찾아 스크립트를 갱신해야 합니다 (아래 "빌드마다 달라짐" 참고).
3. **패치된 `main.cjs`를 `docker-compose.yml`에서 원본 위치에 bind-mount** — 3. **패치된 `main.cjs`를 `docker-compose.yml`에서 원본 위치에 bind-mount** —
`docker-compose.yml.example` 참고: `docker-compose.bind-mount.yml.example` 참고:
```yaml ```yaml
services: services:
trilium: trilium:
+14
View File
@@ -0,0 +1,14 @@
services:
trilium:
image: triliumnext/notes:latest
container_name: trilium
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
+11
View File
@@ -0,0 +1,11 @@
services:
trilium:
build: .
container_name: trilium-ko
restart: unless-stopped
ports:
- '8082:8080'
environment:
- TZ=Asia/Seoul
volumes:
- ./data:/home/node/trilium-data
Executable
+46
View File
@@ -0,0 +1,46 @@
#!/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
REPO_URL="https://gitea.itosm.co.kr/syskiller/triliumnext-korean-patch.git"
INSTALL_DIR="${1:-trilium-korean}"
PORT="${TRILIUM_KO_PORT:-8082}"
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
echo "저장소를 내려받습니다: $INSTALL_DIR"
git clone --depth 1 "$REPO_URL" "$INSTALL_DIR"
fi
cd "$INSTALL_DIR"
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"