AI κΈ°λ° λ€μ€ μμ§ λ²μ μΉ μλΉμ€ - GPU κ°μ λ‘컬 AI λͺ¨λΈ νΉν
- μΉ μ¬μ΄νΈ: http://itsmyzone.iptime.org/translation/
- API: http://itsmyzone.iptime.org/translation-api/
λ²μ μλΉμ€
βββ νλ‘ νΈμλ: React + Vite β nginx (ν¬νΈ 80/443)
βββ λ°±μλ: Node.js Express β systemd (ν¬νΈ 3501)
βββ AI λͺ¨λΈ: Ollama Docker Container β GPU κ°μ (ν¬νΈ 11434)
git clone https://github.com/purestory/translation-service.git
cd translation-service# backend/.env νμΌ μμ± cp backend/.env.example backend/.env # νμν API ν€ μ€μ (μ νμ¬ν) DEEPL_API_KEY=your_deepl_key OPENAI_API_KEY=your_openai_key ANTHROPIC_API_KEY=your_anthropic_key GEMINI_API_KEY=your_gemini_key GROQ_API_KEY=your_groq_key OLLAMA_URL=http://localhost:11434
# λ°±μλ μμ‘΄μ± μ€μΉ cd backend npm install # νλ‘ νΈμλ μμ‘΄μ± μ€μΉ cd ../vite-frontend npm install
# Dockerλ‘ Ollama μ€ν sudo docker run -d --name ollama \ -p 11434:11434 \ --gpus all \ -v ollama_data:/root/.ollama \ ollama/ollama # νκ΅μ΄ νΉν λͺ¨λΈ λ€μ΄λ‘λ sudo docker exec ollama ollama pull gemma2:9b
# λ°±μλ μ€ν cd backend npm start # νλ‘ νΈμλ λΉλ λ° μ€ν (κ°λ°μ) cd ../vite-frontend npm run dev
- ollama-gemma2-sapie (κΈ°λ³Έκ°) - νκ΅μ΄ νΉν Sapie λͺ¨λΈ
- ollama-kanana-1.5 - Kakao Corp. Kanana 1.5-8B (BF16+Q8_0, 9.5GB)
- ollama-exaone3.5 - LG AI Research Exaone 3.5 (νκ΅μ΄ νΉν)
- ollama-gemma2 - Google Gemma2 9B
- ollama-hyperclovax - Naver HyperCLOVAX 3B (νκ΅μ΄ νΉν)
- ollama-hyperclovax-1.5b - Naver HyperCLOVAX 1.5B (κ²½λν)
- Google Gemini - κ³ νμ§ λ€κ΅μ΄ λ²μ
- Groq Llama - κ³ μ μΆλ‘
- OpenAI GPT - μμ°μ€λ¬μ΄ λ²μ
- Anthropic Claude - λ¬Έλ§₯ μ΄ν΄ μ°μ
- DeepL - μ λ¬Έ λ²μ μλΉμ€
- λͺ¨λΈ: NVIDIA RTX 3090
- VRAM: 24GB
- CUDA: 12.8
- μ»΄ν¨νΈ λ₯λ ₯: 8.6 (BF16 μ§μ)
# μ€μΉλ λͺ¨λΈ νμΈ curl -s http://localhost:11434/api/tags | jq '.models[].name' # GPU μ¬μ©λ νμΈ nvidia-smi
# λ²μ μλΉμ€ μν sudo systemctl status translation-service # Ollama 컨ν μ΄λ μν sudo docker ps | grep ollama # GPU μ¬μ©λ nvidia-smi # μλΉμ€ λ‘κ·Έ sudo journalctl -u translation-service -f --no-pager
# λ²μ μλΉμ€ μ¬μμ sudo systemctl restart translation-service # Ollama 컨ν μ΄λ μ¬μμ sudo docker restart ollama # μ 체 μμ€ν μ¬μμ sudo systemctl restart translation-service sudo docker restart ollama sudo nginx -s reload
translation-service/
βββ README.md # νλ‘μ νΈ λ¬Έμ
βββ package.json # λ£¨νΈ ν¨ν€μ§ μ€μ
βββ .gitignore # Git 무μ νμΌ
βββ backend/ # Node.js λ°±μλ
β βββ server.js # λ©μΈ μλ²
β βββ package.json # λ°±μλ μμ‘΄μ±
β βββ .env.example # νκ²½λ³μ μμ
β βββ routes/ # API λΌμ°νΈ
β β βββ translation.js # λ²μ API μλν¬μΈνΈ
β βββ services/ # λΉμ¦λμ€ λ‘μ§
β β βββ translationService.js # λ©μΈ λ²μ μλΉμ€
β βββ utils/ # μ νΈλ¦¬ν° ν¨μ
β βββ uploads/ # μ
λ‘λ νμΌ μμ μ μ₯
β βββ debug.log # μλ² λ‘κ·Έ
βββ vite-frontend/ # React νλ‘ νΈμλ
β βββ src/ # μμ€ μ½λ
β β βββ App.tsx # λ©μΈ React μ»΄ν¬λνΈ
β β βββ components/ # React μ»΄ν¬λνΈλ€
β β βββ types/ # TypeScript νμ
μ μ
β βββ public/ # μ μ νμΌ
β βββ dist/ # λΉλ κ²°κ³Ό (nginx μλΉ)
β βββ package.json # νλ‘ νΈμλ μμ‘΄μ±
β βββ vite.config.ts # Vite μ€μ
βββ tmp/ # μμ νμΌ (nginx μ€μ λ±)
cd vite-frontend # μ½λ μμ ν npm run build # λ°°ν¬ μλ²μμλ nginx μ¬λ‘λ sudo nginx -s reload
cd backend # μ½λ μμ ν npm start # κ°λ°μ # λλ sudo systemctl restart translation-service # μ΄μμ
# μ λͺ¨λΈ λ€μ΄λ‘λ sudo docker exec ollama ollama pull <model_name> # 컀μ€ν λͺ¨λΈ λ±λ‘ sudo docker exec ollama ollama create <custom_name> -f /path/to/Modelfile # λ°±μλμμ μμ§ μΆκ° ν μ¬μμ νμ
POST /translation-api/translation/text
Content-Type: application/json
{
"text": "λ²μν ν
μ€νΈ",
"targetLang": "ko",
"sourceLang": "en", // μ νμ¬ν (auto κ°μ§)
"engine": "ollama-gemma2-sapie" // μ νμ¬ν
}POST /translation-api/subtitle/translate Content-Type: multipart/form-data - file: SRT/VTT νμΌ - targetLang: ko - engine: ollama-gemma2-sapie - chunkSize: 10
GET /translation-api/translation/engines
GET /translation-api/translation/languages
- μλΉμ€ μν νμΈ:
sudo systemctl status translation-service - Ollama μν νμΈ:
sudo docker ps | grep ollama - GPU λ©λͺ¨λ¦¬ νμΈ:
nvidia-smi - λ‘κ·Έ νμΈ:
sudo journalctl -u translation-service -n 20 - μλΉμ€ μ¬μμ:
sudo systemctl restart translation-service
# μμΈ: GPU λ©λͺ¨λ¦¬ λΆμ‘±, CUDA μ€λ₯ λ± # ν΄κ²°: 컨ν μ΄λ μ¬μμ sudo docker start ollama # λ‘κ·Έ νμΈ sudo docker logs ollama --tail 50
# μμΈ: λ°±μλ μ€λ₯, Ollama μ°κ²° μ€ν¨ # ν΄κ²°: μλΉμ€ μν νμΈ ν μ¬μμ sudo systemctl status translation-service sudo docker ps | grep ollama
# GPU λ©λͺ¨λ¦¬ μ¬μ©λ νμΈ nvidia-smi # Ollama 컨ν μ΄λ μ¬μμ (λͺ¨λΈ μΈλ‘λ) sudo docker restart ollama # λ¬΄κ±°μ΄ λͺ¨λΈ μ κ±° sudo docker exec ollama ollama rm <heavy_model>
- nginx μν νμΈ:
sudo systemctl status nginx - λΉλ νμΌ νμΈ:
ls -la vite-frontend/dist/ - ν¬νΈ νμΈ:
lsof -i :80,443,3501 - nginx μ¬λ‘λ:
sudo nginx -s reload
- κΈ°λ³Έ μμ§:
ollama-gemma2-sapie(νκ΅μ΄ νΉν) - κΈ°λ³Έ μ²ν¬ ν¬κΈ°: 10
- κΈ°λ³Έ λ²μ λͺ¨λ: srt_direct
- μ΅λ νμΌ ν¬κΈ°: 10MB
- λ체 μμ§: νμ±ν (μλ ν΄λ°±)
- GPU κ°μ: RTX 3090 (24GB VRAM)
- BF16 μ λ°λ: μ§μλ¨
- λμ λ²μ: μ²ν¬ λ¨μ λ³λ ¬ μ²λ¦¬
- μ€μκ° μ§νλ₯ : WebSocket μ€νμΌ ν΄λ§
- Kanana 1.5 - Kakao (μ½λ©/μν/ν¨μνΈμΆ νΉν)
- Sapie - νκ΅μ΄ νΉν Gemma2 νλ
- Exaone 3.5 - LG AI Research (νκ΅μ΄)
- HyperCLOVAX - Naver (νκ΅μ΄)
- λ€μ€ μμ§: 6κ° λ‘컬 AI + 5κ° ν΄λΌμ°λ API
- μλ λ체: μμ§ μ€ν¨μ μλ ν΄λ°±
- μ€μκ° μ§νλ₯ : μ²ν¬λ³ μ§νμν© νμ
- λ°°μΉ λ²μ: λμ©λ νμΌ μμ μ²λ¦¬
- νμΌ νμ: SRT, VTT, ASS
- λ²μ λͺ¨λ: μλ, SRT μ§μ , ꡬλΆμ
- νμμ€ν¬ν: μλ³Έ μ μ§
- μΈμ½λ©: UTF-8 μλ λ³ν
- RESTful API: νμ€ HTTP API
- μ€μκ° μ§νλ₯ : κΈ΄ λ²μ μμ λͺ¨λν°λ§
- μ€λ₯ μ²λ¦¬: μμΈν μ€λ₯ λ©μμ§
- CORS μ§μ: ν¬λ‘μ€ λλ©μΈ μμ²
- μ½λ μμ ν λ°λμ ν μ€νΈ
- μ λ κ²½λ‘ μ¬μ© (
/home/purestory/...) - systemdλ‘ μλΉμ€ κ΄λ¦¬
- Dockerλ‘ Ollama κ΄λ¦¬
- GPU λ©λͺ¨λ¦¬ λͺ¨λν°λ§
~κ²½λ‘ μ¬μ© (μλμΉ μμ ν΄λ μμ±)- pm2 μ¬μ© (systemd μ¬μ© μ€)
- ν¬νΈ λ²νΈ μμ λ³κ²½
- Ollama λͺ¨λΈμ μ§μ μμ
- GPU μ€λ²ν΄λ (μμ μ± μ°μ )
- β Ollama μ°κ²° μμ μ± κ°μ
- β 500 Internal Server Error λ¬Έμ ν΄κ²°
- β μλΉμ€ μν λͺ¨λν°λ§ κ°ν
- β README.md κ°μ λ° μ€μΉ κ°μ΄λ μΆκ°
- β Kakao Kanana 1.5-8B λͺ¨λΈ μΆκ° (BF16+Q8_0, 9.5GB)
- β κΈ°λ³Έ μμ§μ sapieλ‘ λ³κ²½
- β GPU BF16 μ§μ νμΈ λ° μ΅μ ν
- β μμ§ μ°μ μμ μ¬μ‘°μ (νκ΅μ΄ νΉν λͺ¨λΈ μ°μ )
- β λ체 μμ§ μμ€ν κ°μ
- β Ollama GPU λ§μ΄κ·Έλ μ΄μ μλ£
- β 볡μ νκ΅μ΄ νΉν λͺ¨λΈ μΆκ°
- β μ€μκ° λ²μ μ§νλ₯ νμ
- β μ²ν¬ λ¨μ μμ μ λ²μ μμ€ν
- Fork the Project
- Create your Feature Branch (
git checkout -b feature/AmazingFeature) - Commit your Changes (
git commit -m 'Add some AmazingFeature') - Push to the Branch (
git push origin feature/AmazingFeature) - Open a Pull Request
μ΄ νλ‘μ νΈλ MIT λΌμ΄μ μ€λ‘ λ°°ν¬λ©λλ€. μμΈν λ΄μ©μ LICENSE νμΌμ μ°Έμ‘°νμΈμ.
- νλ‘μ νΈ URL: https://github.com/purestory/translation-service
- λΌμ΄λΈ λ°λͺ¨: http://itsmyzone.iptime.org/translation/
λ§μ§λ§ μ
λ°μ΄νΈ: 2025εΉ΄06ζ12ζ₯
λ²μ : 2.1.0
μλ²: itsmyzone.iptime.org
GPU: RTX 3090 24GB (CUDA 12.8)