- 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>
111 lines
3.8 KiB
Python
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 플랫폼 설치 완료')
|