From 9ebc24d681cb5469b5f2807fa5742b2d8dc80fd6 Mon Sep 17 00:00:00 2001 From: syskiller Date: Wed, 26 Aug 2026 09:54:35 +0900 Subject: [PATCH] =?UTF-8?q?feat:=20install.sh=20=EC=9B=90=ED=81=B4?= =?UTF-8?q?=EB=A6=AD=20=EC=84=A4=EC=B9=98=20=EC=8A=A4=ED=81=AC=EB=A6=BD?= =?UTF-8?q?=ED=8A=B8=20+=20Dockerfile=20=EC=B6=94=EA=B0=80=20(main.cjs=20?= =?UTF-8?q?=EC=8B=A4=EC=A0=9C=20=ED=8C=8C=EC=9D=BC=20=ED=8F=AC=ED=95=A8)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Dockerfile: triliumnext/notes:latest에 번역+패치된 main.cjs를 구워 넣어 별도 bind-mount 없이 한국어 내장 이미지를 만듦 - install.sh: curl | bash 한 줄로 clone + build + up까지 처리 - 기존 bind-mount 방식은 docker-compose.bind-mount.yml.example로 유지 - 실제 빌드/실행/언어전환/컨테이너완전재생성까지 전부 테스트 완료 --- Dockerfile | 5 +++ README.md | 47 +++++++++++++++++++++------ docker-compose.bind-mount.yml.example | 14 ++++++++ docker-compose.yml | 11 +++++++ install.sh | 46 ++++++++++++++++++++++++++ 5 files changed, 113 insertions(+), 10 deletions(-) create mode 100644 Dockerfile create mode 100644 docker-compose.bind-mount.yml.example create mode 100644 docker-compose.yml create mode 100755 install.sh diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..3e988a1 --- /dev/null +++ b/Dockerfile @@ -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 diff --git a/README.md b/README.md index eead773..916dc29 100644 --- a/README.md +++ b/README.md @@ -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% 번역 완료. - `server.json` — 서버 문자열, 283개 키, 100% 번역 완료. - `main.cjs` — **이미 패치가 적용된, 바로 쓸 수 있는 서버 번들** (`triliumnext/notes:latest`, - 빌드일 2025-06-07, appVersion 0.95.0 기준). 아래 설치 방법 2번을 직접 실행할 필요 없이 - 이 파일로 바로 bind-mount 하면 됩니다. + 빌드일 2025-06-07, appVersion 0.95.0 기준). - `patch_main_cjs.js` — 위 `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) 기준으로 테스트했습니다. `main.cjs` 안의 변수명은 전부 난독화(minify)되어 있고 **빌드마다 이름이 바뀔 수 있습니다** — `patch_main_cjs.js`를 새 이미지에 돌렸을 때 `[skip]`이 출력되면, 스크립트가 찾는 문자열 패턴이 그 빌드에서 바뀐 것이니 새 빌드에서 같은 패턴을 다시 찾아 스크립트를 갱신해야 합니다. -## 설치 방법 (빠른 길 — 이미지 버전이 같다면) +## 설치 방법 — 명령어 한 줄 (추천) -이 저장소의 `main.cjs`는 이미 패치가 끝난 파일입니다. `triliumnext/notes:latest` -(appVersion 0.95.0, 빌드일 2025-06-07)를 그대로 쓴다면 아래 1, 3번만 하면 됩니다. +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.yml.example`을 참고해서 그대로 적용, 컨테이너 시작. -3. 앱 안에서 **옵션 → 언어 및 지역**에서 "한국어" 선택. +2. `docker-compose.bind-mount.yml.example`을 참고해서 그대로 적용, 컨테이너 재시작. +3. 앱 안에서 **옵션 → 언어 및 지역**에서 "한국어" 선택 후 새로고침. -## 설치 방법 (다른 이미지 버전을 쓰는 경우) +## 설치 방법 — 다른 이미지 버전을 쓰는 경우 (직접 패치) 이미지 버전이 다르면 `main.cjs`의 난독화된 변수명/위치가 달라 이 저장소의 `main.cjs`가 그대로 안 맞을 수 있습니다. 이 경우 직접 패치해야 합니다: @@ -54,7 +81,7 @@ `[skip]`이 출력되면 스크립트가 찾는 문자열 패턴이 그 빌드에서 바뀐 것이니, 새 빌드에서 같은 패턴을 다시 찾아 스크립트를 갱신해야 합니다 (아래 "빌드마다 달라짐" 참고). 3. **패치된 `main.cjs`를 `docker-compose.yml`에서 원본 위치에 bind-mount** — - `docker-compose.yml.example` 참고: + `docker-compose.bind-mount.yml.example` 참고: ```yaml services: trilium: diff --git a/docker-compose.bind-mount.yml.example b/docker-compose.bind-mount.yml.example new file mode 100644 index 0000000..9c4feb1 --- /dev/null +++ b/docker-compose.bind-mount.yml.example @@ -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 diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..3c2050b --- /dev/null +++ b/docker-compose.yml @@ -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 diff --git a/install.sh b/install.sh new file mode 100755 index 0000000..779d2ae --- /dev/null +++ b/install.sh @@ -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"