이 문서는 Ubuntu에서 T2Editor 9.1.0의 NSFWJS 브라우저 필터를 self-hosted 방식으로 배포할 때 필요한 운영 절차를 정리합니다. 기본 전제는 vendor/ 아래에 TensorFlow.js, backend 스크립트, NSFWJS, MobileNetV2Mid 모델을 직접 배치하는 것입니다.
이 문서는 아래 설치 위치를 예시로 사용합니다.
text/var/www/html/plugin/editor/t2editor/
웹 경로는 보통 아래처럼 맞춰야 합니다.
phpdefine('T2EDITOR_URL', '/plugin/editor/t2editor');
필요 패키지 예시:
bashsudo apt update sudo apt install -y curl git
text/plugin/editor/t2editor/vendor/ tfjs/ tfjs-backend-webgl/ tfjs-backend-webgpu/ tfjs-backend-wasm/ nsfwjs/ nsfwjs/models/mobilenet_v2_mid/
bashsudo mkdir -p /var/www/html/plugin/editor/t2editor/vendor/{tfjs,tfjs-backend-webgl,tfjs-backend-webgpu,tfjs-backend-wasm,nsfwjs,nsfwjs/models} cd /var/www/html/plugin/editor/t2editor/vendor sudo curl -L https://cdn.jsdelivr.net/npm/@tensorflow/tfjs@4.22.0/dist/tf.min.js \ -o tfjs/tf.min.js sudo curl -L https://cdn.jsdelivr.net/npm/@tensorflow/tfjs-backend-webgl@4.22.0/dist/tf-backend-webgl.min.js \ -o tfjs-backend-webgl/tf-backend-webgl.min.js sudo curl -L https://cdn.jsdelivr.net/npm/@tensorflow/tfjs-backend-webgpu@4.22.0/dist/tf-backend-webgpu.min.js \ -o tfjs-backend-webgpu/tf-backend-webgpu.min.js sudo curl -L https://cdn.jsdelivr.net/npm/@tensorflow/tfjs-backend-wasm@4.22.0/dist/tf-backend-wasm.min.js \ -o tfjs-backend-wasm/tf-backend-wasm.min.js sudo curl -L https://cdn.jsdelivr.net/npm/@tensorflow/tfjs-backend-wasm@4.22.0/dist/tfjs-backend-wasm.wasm \ -o tfjs-backend-wasm/tfjs-backend-wasm.wasm sudo curl -L https://cdn.jsdelivr.net/npm/@tensorflow/tfjs-backend-wasm@4.22.0/dist/tfjs-backend-wasm-simd.wasm \ -o tfjs-backend-wasm/tfjs-backend-wasm-simd.wasm sudo curl -L https://cdn.jsdelivr.net/npm/@tensorflow/tfjs-backend-wasm@4.22.0/dist/tfjs-backend-wasm-threaded-simd.wasm \ -o tfjs-backend-wasm/tfjs-backend-wasm-threaded-simd.wasm sudo curl -L https://cdn.jsdelivr.net/npm/nsfwjs@2.4.2/dist/nsfwjs.min.js \ -o nsfwjs/nsfwjs.min.js
모델 폴더는 배포 방식에 따라 수동 복사 또는 저장소에서 별도 수집해 배치합니다.
bashsudo chown -R www-data:www-data /var/www/html/plugin/editor/t2editor/vendor sudo find /var/www/html/plugin/editor/t2editor/vendor -type d -exec chmod 755 {} \; sudo find /var/www/html/plugin/editor/t2editor/vendor -type f -exec chmod 644 {} \;
editor.lib.php에서 아래 값이 실제 설치 위치와 맞는지 확인합니다.
phpdefine('T2EDITOR_URL', '/plugin/editor/t2editor'); define('T2_NSFW_RUNTIME_ASSET_BASE', T2EDITOR_URL . '/vendor'); define('T2_NSFW_BROWSER_MODEL', 'MobileNetV2Mid'); define('T2_NSFW_BROWSER_MODEL_TYPE', 'graph'); define('T2_NSFW_BROWSER_MODEL_URL', T2_NSFW_RUNTIME_ASSET_BASE . '/nsfwjs/models/mobilenet_v2_mid/model.json'); define('T2_NSFW_BROWSER_BACKEND_PRIORITY', 'webgpu,webgl,wasm,cpu');
아래 URL이 브라우저 또는 curl -I에서 200 응답이어야 합니다.
text/plugin/editor/t2editor/vendor/tfjs/tf.min.js /plugin/editor/t2editor/vendor/tfjs-backend-webgpu/tf-backend-webgpu.min.js /plugin/editor/t2editor/vendor/tfjs-backend-wasm/tfjs-backend-wasm.wasm /plugin/editor/t2editor/vendor/nsfwjs/nsfwjs.min.js /plugin/editor/t2editor/vendor/nsfwjs/models/mobilenet_v2_mid/model.json
window.T2EDITOR_NSFW_RUNTIME_ASSETS가 올바른지 확인webgl 또는 wasm 스크립트 누락 여부 확인운영에서 가장 흔한 실수는 “파일은 복사했는데 T2EDITOR_URL을 기존 기본값으로 둔 상태”입니다. 이 경우 파일이 서버에 있어도 브라우저는 전혀 다른 URL을 요청합니다.
이 문서가 다루는 9.1.0 운영 포인트는 아래와 같습니다.
이 문서는 Ubuntu에서 T2Editor 9.1.0의 NSFWJS 브라우저 필터를 self-hosted 방식으로 배포할 때 필요한 운영 절차를 정리합니다. 기본 전제는 vendor/ 아래에 TensorFlow.js, backend 스크립트, NSFWJS, MobileNetV2Mid 모델을 직접 배치하는 것입니다.
이 문서는 아래 설치 위치를 예시로 사용합니다.
text/var/www/html/plugin/editor/t2editor/
웹 경로는 보통 아래처럼 맞춰야 합니다.
phpdefine('T2EDITOR_URL', '/plugin/editor/t2editor');
필요 패키지 예시:
bashsudo apt update sudo apt install -y curl git
text/plugin/editor/t2editor/vendor/ tfjs/ tfjs-backend-webgl/ tfjs-backend-webgpu/ tfjs-backend-wasm/ nsfwjs/ nsfwjs/models/mobilenet_v2_mid/
bashsudo mkdir -p /var/www/html/plugin/editor/t2editor/vendor/{tfjs,tfjs-backend-webgl,tfjs-backend-webgpu,tfjs-backend-wasm,nsfwjs,nsfwjs/models} cd /var/www/html/plugin/editor/t2editor/vendor sudo curl -L https://cdn.jsdelivr.net/npm/@tensorflow/tfjs@4.22.0/dist/tf.min.js \ -o tfjs/tf.min.js sudo curl -L https://cdn.jsdelivr.net/npm/@tensorflow/tfjs-backend-webgl@4.22.0/dist/tf-backend-webgl.min.js \ -o tfjs-backend-webgl/tf-backend-webgl.min.js sudo curl -L https://cdn.jsdelivr.net/npm/@tensorflow/tfjs-backend-webgpu@4.22.0/dist/tf-backend-webgpu.min.js \ -o tfjs-backend-webgpu/tf-backend-webgpu.min.js sudo curl -L https://cdn.jsdelivr.net/npm/@tensorflow/tfjs-backend-wasm@4.22.0/dist/tf-backend-wasm.min.js \ -o tfjs-backend-wasm/tf-backend-wasm.min.js sudo curl -L https://cdn.jsdelivr.net/npm/@tensorflow/tfjs-backend-wasm@4.22.0/dist/tfjs-backend-wasm.wasm \ -o tfjs-backend-wasm/tfjs-backend-wasm.wasm sudo curl -L https://cdn.jsdelivr.net/npm/@tensorflow/tfjs-backend-wasm@4.22.0/dist/tfjs-backend-wasm-simd.wasm \ -o tfjs-backend-wasm/tfjs-backend-wasm-simd.wasm sudo curl -L https://cdn.jsdelivr.net/npm/@tensorflow/tfjs-backend-wasm@4.22.0/dist/tfjs-backend-wasm-threaded-simd.wasm \ -o tfjs-backend-wasm/tfjs-backend-wasm-threaded-simd.wasm sudo curl -L https://cdn.jsdelivr.net/npm/nsfwjs@2.4.2/dist/nsfwjs.min.js \ -o nsfwjs/nsfwjs.min.js
모델 폴더는 배포 방식에 따라 수동 복사 또는 저장소에서 별도 수집해 배치합니다.
bashsudo chown -R www-data:www-data /var/www/html/plugin/editor/t2editor/vendor sudo find /var/www/html/plugin/editor/t2editor/vendor -type d -exec chmod 755 {} \; sudo find /var/www/html/plugin/editor/t2editor/vendor -type f -exec chmod 644 {} \;
editor.lib.php에서 아래 값이 실제 설치 위치와 맞는지 확인합니다.
phpdefine('T2EDITOR_URL', '/plugin/editor/t2editor'); define('T2_NSFW_RUNTIME_ASSET_BASE', T2EDITOR_URL . '/vendor'); define('T2_NSFW_BROWSER_MODEL', 'MobileNetV2Mid'); define('T2_NSFW_BROWSER_MODEL_TYPE', 'graph'); define('T2_NSFW_BROWSER_MODEL_URL', T2_NSFW_RUNTIME_ASSET_BASE . '/nsfwjs/models/mobilenet_v2_mid/model.json'); define('T2_NSFW_BROWSER_BACKEND_PRIORITY', 'webgpu,webgl,wasm,cpu');
아래 URL이 브라우저 또는 curl -I에서 200 응답이어야 합니다.
text/plugin/editor/t2editor/vendor/tfjs/tf.min.js /plugin/editor/t2editor/vendor/tfjs-backend-webgpu/tf-backend-webgpu.min.js /plugin/editor/t2editor/vendor/tfjs-backend-wasm/tfjs-backend-wasm.wasm /plugin/editor/t2editor/vendor/nsfwjs/nsfwjs.min.js /plugin/editor/t2editor/vendor/nsfwjs/models/mobilenet_v2_mid/model.json
window.T2EDITOR_NSFW_RUNTIME_ASSETS가 올바른지 확인webgl 또는 wasm 스크립트 누락 여부 확인운영에서 가장 흔한 실수는 “파일은 복사했는데 T2EDITOR_URL을 기존 기본값으로 둔 상태”입니다. 이 경우 파일이 서버에 있어도 브라우저는 전혀 다른 URL을 요청합니다.
이 문서가 다루는 9.1.0 운영 포인트는 아래와 같습니다.
| 이전 | 새 버전 | ||
|---|---|---|---|
| 1 | --- | 1 | --- |
| 2 | title: 운영: Ubuntu에서 NSFWJS self-hosted + WebGPU 설치 | 2 | title: 운영: Ubuntu에서 NSFWJS self-hosted + WebGPU 설치 |
| 3 | document_id: ops-nsfwjs-selfhost-webgpu-ubuntu | 3 | document_id: ops-nsfwjs-selfhost-webgpu-ubuntu |
| 4 | slug: ops-nsfwjs-selfhost-webgpu-ubuntu | 4 | slug: ops-nsfwjs-selfhost-webgpu-ubuntu |
| 5 | target_editor_version: 9.1.0 | 5 | target_editor_version: 9.1.0 |
| 6 | document_type: ops-guide | 6 | document_type: ops-guide |
| 7 | doc_type: ops-guide | 7 | doc_type: ops-guide |
| 8 | target_readers: [웹마스터, 개발자, AI agent] | 8 | target_readers: [웹마스터, 개발자, AI agent] |
| 9 | importance: High | 9 | importance: High |
| 10 | dependency: High | 10 | dependency: High |
| 11 | core_type: Guide | 11 | core_type: Guide |
| 12 | stability: [Stable Anchor, Version-Bound] | 12 | stability: [Stable Anchor, Version-Bound] |
| 13 | stable_anchor: | 13 | stable_anchor: |
| 14 | - vendor 디렉터리 구조 | 14 | - vendor 디렉터리 구조 |
| 15 | - T2EDITOR_URL 기반 경로 조립 | 15 | - T2EDITOR_URL 기반 경로 조립 |
| 16 | version_bound: | 16 | version_bound: |
| 17 | - MobileNetV2Mid 모델 폴더명 | 17 | - MobileNetV2Mid 모델 폴더명 |
| 18 | - TensorFlow.js backend 파일명 | 18 | - TensorFlow.js backend 파일명 |
| 19 | related_docs: | 19 | related_docs: |
| 20 | - guide-nsfwjs-overview | 20 | - guide-nsfwjs-overview |
| 21 | - config-nsfwjs-runtime-settings | 21 | - config-nsfwjs-runtime-settings |
| 22 | - migration-legacy-nsfw-to-nsfwjs | 22 | - migration-legacy-nsfw-to-nsfwjs |
| 23 | related_files: | 23 | related_files: |
| 24 | - 9.1.0/t2editor/editor.lib.php | 24 | - 9.1.0/t2editor/editor.lib.php |
| 25 | - 9.1.0/t2editor/config/nsfw_api_browser.js | 25 | - 9.1.0/t2editor/config/nsfw_api_browser.js |
| 26 | related_functions: [] | 26 | related_functions: [] |
| 27 | related_classes_modules: | 27 | related_classes_modules: |
| 28 | - NSFWFilterAPI | 28 | - NSFWFilterAPI |
| 29 | related_features: | 29 | related_features: |
| 30 | - self-hosted 배포 | 30 | - self-hosted 배포 |
| 31 | - WebGPU 폴백 | 31 | - WebGPU 폴백 |
| 32 | - 정적 자산 검증 | 32 | - 정적 자산 검증 |
| 33 | related_ui: [] | 33 | related_ui: [] |
| 34 | change_risk: 운영 서버 경로와 문서 경로가 불일치하면 모델 로딩이 실패하므로, 설정 변경 전에 실제 설치 위치를 먼저 고정해야 합니다. | 34 | change_risk: 운영 서버 경로와 문서 경로가 불일치하면 모델 로딩이 실패하므로, 설정 변경 전에 실제 설치 위치를 먼저 고정해야 합니다. |
| 35 | reading_order: 21 | 35 | reading_order: 21 |
| 36 | summary: Ubuntu 환경에서 NSFWJS, TensorFlow.js, 모델 파일을 self-hosted 방식으로 설치하고 점검하는 절차를 안내합니다. | 36 | summary: Ubuntu 환경에서 NSFWJS, TensorFlow.js, 모델 파일을 self-hosted 방식으로 설치하고 점검하는 절차를 안내합니다. |
| 37 | description: WebGPU 우선 폴백 구조를 쓰는 브라우저 NSFW 필터를 Ubuntu + Apache/Nginx 계열 환경에 배치하기 위한 운영 문서입니다. | 37 | description: WebGPU 우선 폴백 구조를 쓰는 브라우저 NSFW 필터를 Ubuntu + Apache/Nginx 계열 환경에 배치하기 위한 운영 문서입니다. |
| 38 | tags: [Ubuntu, self-hosted, NSFWJS, WebGPU, TensorFlow.js, 운영] | 38 | tags: [Ubuntu, self-hosted, NSFWJS, WebGPU, TensorFlow.js, 운영] |
| 39 | version_tag: 9.1.0 | 39 | version_tag: 9.1.0 |
| 40 | maintenance_difficulty: Medium | 40 | maintenance_difficulty: Medium |
| 41 | test_requirement: High | 41 | test_requirement: High |
| 42 | ai_agent_risk: Medium | 42 | ai_agent_risk: Medium |
| 43 | source_basis: [현재 코드 분석 기반] | 43 | source_basis: [현재 코드 분석 기반] |
| 44 | beginner_section_included: false | 44 | beginner_section_included: false |
| 45 | webmaster_section_included: true | 45 | webmaster_section_included: true |
| 46 | developer_section_included: true | 46 | developer_section_included: true |
| 47 | --- | 47 | --- |
| 48 | 48 | ||
| 49 | [목차] | 49 | [목차] |
| 50 | 50 | ||
| 51 | [[분류:운영]] | 51 | [[분류:운영]] |
| 52 | [[분류:NSFW]] | 52 | [[분류:NSFW]] |
| 53 | [[config-nsfwjs-runtime-settings|설정 문서]] | ||
| 54 | [[guide-nsfwjs-overview|전체 개요]] | ||
| 55 | 53 | ||
| 56 | [note(요약)] | 54 | [note(요약)] |
| 57 | 이 문서는 Ubuntu에서 T2Editor 9.1.0의 NSFWJS 브라우저 필터를 **self-hosted** 방식으로 배포할 때 필요한 운영 절차를 정리합니다. | 55 | 이 문서는 Ubuntu에서 T2Editor 9.1.0의 NSFWJS 브라우저 필터를 **self-hosted** 방식으로 배포할 때 필요한 운영 절차를 정리합니다. |
| 58 | 기본 전제는 `vendor/` 아래에 TensorFlow.js, backend 스크립트, NSFWJS, `MobileNetV2Mid` 모델을 직접 배치하는 것입니다. | 56 | 기본 전제는 `vendor/` 아래에 TensorFlow.js, backend 스크립트, NSFWJS, `MobileNetV2Mid` 모델을 직접 배치하는 것입니다. |
| 59 | [/note] | 57 | [/note] |
| 60 | 58 | ||
| 61 | # 설치 대상 예시 | 59 | # 설치 대상 예시 |
| 62 | 60 | ||
| 63 | 이 문서는 아래 설치 위치를 예시로 사용합니다. | 61 | 이 문서는 아래 설치 위치를 예시로 사용합니다. |
| 64 | 62 | ||
| 65 | ```text | 63 | ```text |
| 66 | /var/www/html/plugin/editor/t2editor/ | 64 | /var/www/html/plugin/editor/t2editor/ |
| 67 | ``` | 65 | ``` |
| 68 | 66 | ||
| 69 | 웹 경로는 보통 아래처럼 맞춰야 합니다. | 67 | 웹 경로는 보통 아래처럼 맞춰야 합니다. |
| 70 | 68 | ||
| 71 | ```php | 69 | ```php |
| 72 | define('T2EDITOR_URL', '/plugin/editor/t2editor'); | 70 | define('T2EDITOR_URL', '/plugin/editor/t2editor'); |
| 73 | ``` | 71 | ``` |
| 74 | 72 | ||
| 75 | ## 준비 | 73 | ## 준비 |
| 76 | 74 | ||
| 77 | 필요 패키지 예시: | 75 | 필요 패키지 예시: |
| 78 | 76 | ||
| 79 | ```bash | 77 | ```bash |
| 80 | sudo apt update | 78 | sudo apt update |
| 81 | sudo apt install -y curl git | 79 | sudo apt install -y curl git |
| 82 | ``` | 80 | ``` |
| 83 | 81 | ||
| 84 | ## 권장 디렉터리 구조 | 82 | ## 권장 디렉터리 구조 |
| 85 | 83 | ||
| 86 | ```text | 84 | ```text |
| 87 | /plugin/editor/t2editor/vendor/ | 85 | /plugin/editor/t2editor/vendor/ |
| 88 | tfjs/ | 86 | tfjs/ |
| 89 | tfjs-backend-webgl/ | 87 | tfjs-backend-webgl/ |
| 90 | tfjs-backend-webgpu/ | 88 | tfjs-backend-webgpu/ |
| 91 | tfjs-backend-wasm/ | 89 | tfjs-backend-wasm/ |
| 92 | nsfwjs/ | 90 | nsfwjs/ |
| 93 | nsfwjs/models/mobilenet_v2_mid/ | 91 | nsfwjs/models/mobilenet_v2_mid/ |
| 94 | ``` | 92 | ``` |
| 95 | 93 | ||
| 96 | ## 수동 설치 예시 | 94 | ## 수동 설치 예시 |
| 97 | 95 | ||
| 98 | ```bash | 96 | ```bash |
| 99 | sudo mkdir -p /var/www/html/plugin/editor/t2editor/vendor/{tfjs,tfjs-backend-webgl,tfjs-backend-webgpu,tfjs-backend-wasm,nsfwjs,nsfwjs/models} | 97 | sudo mkdir -p /var/www/html/plugin/editor/t2editor/vendor/{tfjs,tfjs-backend-webgl,tfjs-backend-webgpu,tfjs-backend-wasm,nsfwjs,nsfwjs/models} |
| 100 | 98 | ||
| 101 | cd /var/www/html/plugin/editor/t2editor/vendor | 99 | cd /var/www/html/plugin/editor/t2editor/vendor |
| 102 | 100 | ||
| 103 | sudo curl -L https://cdn.jsdelivr.net/npm/@tensorflow/tfjs@4.22.0/dist/tf.min.js \ | 101 | sudo curl -L https://cdn.jsdelivr.net/npm/@tensorflow/tfjs@4.22.0/dist/tf.min.js \ |
| 104 | -o tfjs/tf.min.js | 102 | -o tfjs/tf.min.js |
| 105 | 103 | ||
| 106 | sudo curl -L https://cdn.jsdelivr.net/npm/@tensorflow/tfjs-backend-webgl@4.22.0/dist/tf-backend-webgl.min.js \ | 104 | sudo curl -L https://cdn.jsdelivr.net/npm/@tensorflow/tfjs-backend-webgl@4.22.0/dist/tf-backend-webgl.min.js \ |
| 107 | -o tfjs-backend-webgl/tf-backend-webgl.min.js | 105 | -o tfjs-backend-webgl/tf-backend-webgl.min.js |
| 108 | 106 | ||
| 109 | sudo curl -L https://cdn.jsdelivr.net/npm/@tensorflow/tfjs-backend-webgpu@4.22.0/dist/tf-backend-webgpu.min.js \ | 107 | sudo curl -L https://cdn.jsdelivr.net/npm/@tensorflow/tfjs-backend-webgpu@4.22.0/dist/tf-backend-webgpu.min.js \ |
| 110 | -o tfjs-backend-webgpu/tf-backend-webgpu.min.js | 108 | -o tfjs-backend-webgpu/tf-backend-webgpu.min.js |
| 111 | 109 | ||
| 112 | sudo curl -L https://cdn.jsdelivr.net/npm/@tensorflow/tfjs-backend-wasm@4.22.0/dist/tf-backend-wasm.min.js \ | 110 | sudo curl -L https://cdn.jsdelivr.net/npm/@tensorflow/tfjs-backend-wasm@4.22.0/dist/tf-backend-wasm.min.js \ |
| 113 | -o tfjs-backend-wasm/tf-backend-wasm.min.js | 111 | -o tfjs-backend-wasm/tf-backend-wasm.min.js |
| 114 | 112 | ||
| 115 | sudo curl -L https://cdn.jsdelivr.net/npm/@tensorflow/tfjs-backend-wasm@4.22.0/dist/tfjs-backend-wasm.wasm \ | 113 | sudo curl -L https://cdn.jsdelivr.net/npm/@tensorflow/tfjs-backend-wasm@4.22.0/dist/tfjs-backend-wasm.wasm \ |
| 116 | -o tfjs-backend-wasm/tfjs-backend-wasm.wasm | 114 | -o tfjs-backend-wasm/tfjs-backend-wasm.wasm |
| 117 | 115 | ||
| 118 | sudo curl -L https://cdn.jsdelivr.net/npm/@tensorflow/tfjs-backend-wasm@4.22.0/dist/tfjs-backend-wasm-simd.wasm \ | 116 | sudo curl -L https://cdn.jsdelivr.net/npm/@tensorflow/tfjs-backend-wasm@4.22.0/dist/tfjs-backend-wasm-simd.wasm \ |
| 119 | -o tfjs-backend-wasm/tfjs-backend-wasm-simd.wasm | 117 | -o tfjs-backend-wasm/tfjs-backend-wasm-simd.wasm |
| 120 | 118 | ||
| 121 | sudo curl -L https://cdn.jsdelivr.net/npm/@tensorflow/tfjs-backend-wasm@4.22.0/dist/tfjs-backend-wasm-threaded-simd.wasm \ | 119 | sudo curl -L https://cdn.jsdelivr.net/npm/@tensorflow/tfjs-backend-wasm@4.22.0/dist/tfjs-backend-wasm-threaded-simd.wasm \ |
| 122 | -o tfjs-backend-wasm/tfjs-backend-wasm-threaded-simd.wasm | 120 | -o tfjs-backend-wasm/tfjs-backend-wasm-threaded-simd.wasm |
| 123 | 121 | ||
| 124 | sudo curl -L https://cdn.jsdelivr.net/npm/nsfwjs@2.4.2/dist/nsfwjs.min.js \ | 122 | sudo curl -L https://cdn.jsdelivr.net/npm/nsfwjs@2.4.2/dist/nsfwjs.min.js \ |
| 125 | -o nsfwjs/nsfwjs.min.js | 123 | -o nsfwjs/nsfwjs.min.js |
| 126 | ``` | 124 | ``` |
| 127 | 125 | ||
| 128 | 모델 폴더는 배포 방식에 따라 수동 복사 또는 저장소에서 별도 수집해 배치합니다. | 126 | 모델 폴더는 배포 방식에 따라 수동 복사 또는 저장소에서 별도 수집해 배치합니다. |
| 129 | 127 | ||
| 130 | ## 퍼미션 예시 | 128 | ## 퍼미션 예시 |
| 131 | 129 | ||
| 132 | ```bash | 130 | ```bash |
| 133 | sudo chown -R www-data:www-data /var/www/html/plugin/editor/t2editor/vendor | 131 | sudo chown -R www-data:www-data /var/www/html/plugin/editor/t2editor/vendor |
| 134 | sudo find /var/www/html/plugin/editor/t2editor/vendor -type d -exec chmod 755 {} \; | 132 | sudo find /var/www/html/plugin/editor/t2editor/vendor -type d -exec chmod 755 {} \; |
| 135 | sudo find /var/www/html/plugin/editor/t2editor/vendor -type f -exec chmod 644 {} \; | 133 | sudo find /var/www/html/plugin/editor/t2editor/vendor -type f -exec chmod 644 {} \; |
| 136 | ``` | 134 | ``` |
| 137 | 135 | ||
| 138 | ## 설정 점검 | 136 | ## 설정 점검 |
| 139 | 137 | ||
| 140 | `editor.lib.php`에서 아래 값이 실제 설치 위치와 맞는지 확인합니다. | 138 | `editor.lib.php`에서 아래 값이 실제 설치 위치와 맞는지 확인합니다. |
| 141 | 139 | ||
| 142 | ```php | 140 | ```php |
| 143 | define('T2EDITOR_URL', '/plugin/editor/t2editor'); | 141 | define('T2EDITOR_URL', '/plugin/editor/t2editor'); |
| 144 | define('T2_NSFW_RUNTIME_ASSET_BASE', T2EDITOR_URL . '/vendor'); | 142 | define('T2_NSFW_RUNTIME_ASSET_BASE', T2EDITOR_URL . '/vendor'); |
| 145 | define('T2_NSFW_BROWSER_MODEL', 'MobileNetV2Mid'); | 143 | define('T2_NSFW_BROWSER_MODEL', 'MobileNetV2Mid'); |
| 146 | define('T2_NSFW_BROWSER_MODEL_TYPE', 'graph'); | 144 | define('T2_NSFW_BROWSER_MODEL_TYPE', 'graph'); |
| 147 | define('T2_NSFW_BROWSER_MODEL_URL', T2_NSFW_RUNTIME_ASSET_BASE . '/nsfwjs/models/mobilenet_v2_mid/model.json'); | 145 | define('T2_NSFW_BROWSER_MODEL_URL', T2_NSFW_RUNTIME_ASSET_BASE . '/nsfwjs/models/mobilenet_v2_mid/model.json'); |
| 148 | define('T2_NSFW_BROWSER_BACKEND_PRIORITY', 'webgpu,webgl,wasm,cpu'); | 146 | define('T2_NSFW_BROWSER_BACKEND_PRIORITY', 'webgpu,webgl,wasm,cpu'); |
| 149 | ``` | 147 | ``` |
| 150 | 148 | ||
| 151 | ## 동작 확인 | 149 | ## 동작 확인 |
| 152 | 150 | ||
| 153 | 아래 URL이 브라우저 또는 `curl -I`에서 200 응답이어야 합니다. | 151 | 아래 URL이 브라우저 또는 `curl -I`에서 200 응답이어야 합니다. |
| 154 | 152 | ||
| 155 | ```text | 153 | ```text |
| 156 | /plugin/editor/t2editor/vendor/tfjs/tf.min.js | 154 | /plugin/editor/t2editor/vendor/tfjs/tf.min.js |
| 157 | /plugin/editor/t2editor/vendor/tfjs-backend-webgpu/tf-backend-webgpu.min.js | 155 | /plugin/editor/t2editor/vendor/tfjs-backend-webgpu/tf-backend-webgpu.min.js |
| 158 | /plugin/editor/t2editor/vendor/tfjs-backend-wasm/tfjs-backend-wasm.wasm | 156 | /plugin/editor/t2editor/vendor/tfjs-backend-wasm/tfjs-backend-wasm.wasm |
| 159 | /plugin/editor/t2editor/vendor/nsfwjs/nsfwjs.min.js | 157 | /plugin/editor/t2editor/vendor/nsfwjs/nsfwjs.min.js |
| 160 | /plugin/editor/t2editor/vendor/nsfwjs/models/mobilenet_v2_mid/model.json | 158 | /plugin/editor/t2editor/vendor/nsfwjs/models/mobilenet_v2_mid/model.json |
| 161 | ``` | 159 | ``` |
| 162 | 160 | ||
| 163 | ## 문제 해결 | 161 | ## 문제 해결 |
| 164 | 162 | ||
| 165 | ### 증상: 계속 loading만 보임 | 163 | ### 증상: 계속 loading만 보임 |
| 166 | - 모델 파일 또는 backend 스크립트가 404인지 확인 | 164 | - 모델 파일 또는 backend 스크립트가 404인지 확인 |
| 167 | - `window.T2EDITOR_NSFW_RUNTIME_ASSETS`가 올바른지 확인 | 165 | - `window.T2EDITOR_NSFW_RUNTIME_ASSETS`가 올바른지 확인 |
| 168 | - 콘솔에서 import 오류가 없는지 확인 | 166 | - 콘솔에서 import 오류가 없는지 확인 |
| 169 | 167 | ||
| 170 | ### 증상: WebGPU가 선택되지 않음 | 168 | ### 증상: WebGPU가 선택되지 않음 |
| 171 | - 브라우저가 WebGPU를 지원하는지 확인 | 169 | - 브라우저가 WebGPU를 지원하는지 확인 |
| 172 | - WebGPU backend 스크립트가 실제로 로드되는지 확인 | 170 | - WebGPU backend 스크립트가 실제로 로드되는지 확인 |
| 173 | - 너무 오래된 브라우저나 보안 정책 이슈가 없는지 확인 | 171 | - 너무 오래된 브라우저나 보안 정책 이슈가 없는지 확인 |
| 174 | 172 | ||
| 175 | ### 증상: WebGPU는 실패하고 CPU로만 감 | 173 | ### 증상: WebGPU는 실패하고 CPU로만 감 |
| 176 | - `webgl` 또는 `wasm` 스크립트 누락 여부 확인 | 174 | - `webgl` 또는 `wasm` 스크립트 누락 여부 확인 |
| 177 | - WASM 바이너리 3종이 모두 배치되었는지 확인 | 175 | - WASM 바이너리 3종이 모두 배치되었는지 확인 |
| 178 | - 폴백 순서 설정이 잘못되지 않았는지 확인 | 176 | - 폴백 순서 설정이 잘못되지 않았는지 확인 |
| 179 | 177 | ||
| 180 | [warning] | 178 | [warning] |
| 181 | 운영에서 가장 흔한 실수는 “파일은 복사했는데 `T2EDITOR_URL`을 기존 기본값으로 둔 상태”입니다. | 179 | 운영에서 가장 흔한 실수는 “파일은 복사했는데 `T2EDITOR_URL`을 기존 기본값으로 둔 상태”입니다. |
| 182 | 이 경우 파일이 서버에 있어도 브라우저는 전혀 다른 URL을 요청합니다. | 180 | 이 경우 파일이 서버에 있어도 브라우저는 전혀 다른 URL을 요청합니다. |
| 183 | [/warning] | 181 | [/warning] |
| 184 | 182 | ||
| 185 | ## 수정 요약 | 183 | ## 수정 요약 |
| 186 | 184 | ||
| 187 | 이 문서가 다루는 9.1.0 운영 포인트는 아래와 같습니다. | 185 | 이 문서가 다루는 9.1.0 운영 포인트는 아래와 같습니다. |
| 188 | 186 | ||
| 189 | - CDN 의존이 아닌 self-hosted 구조 | 187 | - CDN 의존이 아닌 self-hosted 구조 |
| 190 | - vendor 중심 정적 자산 배치 | 188 | - vendor 중심 정적 자산 배치 |
| 191 | - WebGPU 우선, WebGL/WASM/CPU 폴백 | 189 | - WebGPU 우선, WebGL/WASM/CPU 폴백 |
| 192 | - 모델 파일까지 포함한 정적 경로 검증 | 190 | - 모델 파일까지 포함한 정적 경로 검증 |
| 193 | |||
| 194 | ## 관련 문서 | ||
| 195 | |||
| 196 | - [[guide-nsfwjs-overview|가이드: NSFWJS 기반 이미지 필터 개요]] | ||
| 197 | - [[config-nsfwjs-runtime-settings|설정: NSFWJS 런타임과 모델 경로]] | ||
| 198 | - [[migration-legacy-nsfw-to-nsfwjs|마이그레이션: 레거시 NSFW 구조에서 NSFWJS로]] | ||
| 199 | |||