zioinfo-web/deploy/install_ai.py
DESKTOP-TKLFCPRython 1e98f0d04a refactor: 101.79.17.164 → zioinfo.co.kr 전체 도메인 변환 + Manager UI 배포
- 37개 파일 IP → zioinfo.co.kr 치환 (소스/매뉴얼/설정/하네스)
- Manager DrConsole/NetworkConsole/CsapConsole 빌드 + /var/www/manager/ 배포
- 테스트: Manager HTTP 200, ITSM 신규 API 7개 전체 200

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-31 10:09:17 +09:00

111 lines
3.8 KiB
Python

#!/usr/bin/env python3
"""AI 플랫폼 설치 스크립트"""
import paramiko, time, sys
HOST='101.79.17.164'; USER='root'; PASS='1q2w3e!Q'
client = paramiko.SSHClient()
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
client.connect(HOST, username=USER, password=PASS, timeout=15)
sftp = client.open_sftp()
def run(label, cmd, timeout=300):
print(f'\n[{label}]')
chan = client.get_transport().open_session()
chan.set_combine_stderr(True)
chan.exec_command(cmd)
start = time.time()
while not chan.exit_status_ready():
if chan.recv_ready(): sys.stdout.buffer.write(chan.recv(4096)); sys.stdout.flush()
if time.time()-start > timeout: print('[TIMEOUT]'); break
time.sleep(0.5)
while chan.recv_ready(): sys.stdout.buffer.write(chan.recv(4096))
sys.stdout.flush()
rc = chan.recv_exit_status()
print(f'exit={rc}'); return rc
install_script = """#!/bin/bash
VENV=/opt/guardia/venv/bin/pip
$VENV install -q --upgrade langchain langchain-community langchain-ollama chromadb sentence-transformers
$VENV install -q langgraph langchain-chroma
echo DONE
"""
with sftp.open('/tmp/install_ai.sh', 'w') as f:
f.write(install_script)
sftp.close()
run('AI 패키지 설치', 'bash /tmp/install_ai.sh 2>&1 | tail -10', 300)
# 검증 스크립트
verify = """
import sys
results = []
for pkg in ['langchain', 'chromadb', 'langchain_community', 'langchain_ollama', 'langgraph']:
try:
m = __import__(pkg)
ver = getattr(m, '__version__', 'ok')
results.append('OK ' + pkg + '==' + str(ver))
except ImportError as e:
results.append('FAIL ' + pkg + ': ' + str(e))
for r in results:
print(r)
ok_cnt = sum(1 for r in results if r.startswith('OK'))
print('\\n결과: ' + str(ok_cnt) + '/' + str(len(results)) + ' PASS')
"""
sftp = client.open_sftp()
with sftp.open('/tmp/verify_ai.py', 'w') as f:
f.write(verify)
sftp.close()
run('설치 검증', '/opt/guardia/venv/bin/python3 /tmp/verify_ai.py')
# 임베딩 모델 다운로드 확인
run('nomic-embed-text 확인', 'ollama list | grep -i nomic || echo "not yet downloaded"')
# 코드베이스 임베딩 스크립트 생성
embed_script = '''#!/usr/bin/env python3
"""GUARDiA 코드베이스를 ChromaDB에 임베딩"""
import os, sys
os.environ["ANONYMIZED_TELEMETRY"] = "False"
from langchain_community.document_loaders import DirectoryLoader, TextLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain_ollama import OllamaEmbeddings
from langchain_chroma import Chroma
APP_DIR = "/opt/guardia/app"
VDB_DIR = "/opt/guardia/vectordb"
print("문서 로딩...")
loader = DirectoryLoader(APP_DIR, glob="**/*.py",
loader_cls=TextLoader, loader_kwargs={"encoding":"utf-8", "autodetect_encoding":True})
docs = loader.load()
print(f"로드된 파일: {len(docs)}개")
splitter = RecursiveCharacterTextSplitter(chunk_size=800, chunk_overlap=100)
chunks = splitter.split_documents(docs)
print(f"청크 수: {len(chunks)}")
embeddings = OllamaEmbeddings(model="nomic-embed-text", base_url="http://localhost:11434")
print("임베딩 중 (시간 소요)...")
vectordb = Chroma.from_documents(chunks[:50], embeddings, # 처음 50개만 테스트
persist_directory=VDB_DIR, collection_name="guardia_codebase")
print(f"임베딩 완료. 저장 위치: {VDB_DIR}")
# 테스트 검색
results = vectordb.similarity_search("라이선스 키 등록", k=2)
print("\\n테스트 검색 결과:")
for r in results:
print(f" - {r.metadata.get('source','?')}: {r.page_content[:60]}...")
'''
sftp = client.open_sftp()
with sftp.open('/opt/guardia/app/scripts/embed_codebase.py', 'w') as f:
f.write(embed_script)
run('embed_codebase.py 생성', 'ls /opt/guardia/app/scripts/')
sftp.close()
client.close()
print('\nAI 플랫폼 설치 완료')