Last active
July 14, 2026 13:28
-
-
Save HoKim98/6aeb4d81e0794443564c1d5dec477823 to your computer and use it in GitHub Desktop.
install_ai_agent_ubuntu24.sh
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| #!/usr/bin/env bash | |
| set -Eeuo pipefail | |
| # ============================================================================== | |
| # Ubuntu 24.04 AI Agent 통합 개발환경 자동 설치 | |
| # ============================================================================== | |
| # 설치 항목 | |
| # - 기본 개발 도구: Git, Git LFS, curl, ffmpeg, build-essential, Node.js/npm | |
| # - Python 가상환경: AI/Agent/Vision/RAG 개발 패키지 | |
| # - Ollama 및 로컬 모델: Gemma 4, LLaVA, Qwen3 | |
| # - YOLO11 / OpenCV / ByteTrack 지원(ultralytics 내 tracker) | |
| # - LangChain / LangGraph / MCP / FastAPI / JupyterLab | |
| # - 설치 확인 및 예제 프로그램 자동 생성 | |
| # | |
| # 기본 실행: | |
| # chmod +x install_ai_agent_ubuntu24.sh | |
| # ./install_ai_agent_ubuntu24.sh | |
| # | |
| # 선택 실행 예: | |
| # INSTALL_NVIDIA_DRIVER=1 ./install_ai_agent_ubuntu24.sh | |
| # SKIP_MODELS=1 ./install_ai_agent_ubuntu24.sh | |
| # GEMMA_MODEL=gemma4:e4b QWEN_MODEL=qwen3:8b ./install_ai_agent_ubuntu24.sh | |
| # | |
| # 주의: | |
| # - NVIDIA 드라이버 자동 설치는 기본적으로 비활성화되어 있습니다. | |
| # - 모델 다운로드에는 수 GB 이상의 디스크 공간과 시간이 필요할 수 있습니다. | |
| # ============================================================================== | |
| PROJECT_DIR="${PROJECT_DIR:-$HOME/ai_agent_workspace}" | |
| VENV_DIR="${VENV_DIR:-$PROJECT_DIR/venv}" | |
| GEMMA_MODEL="${GEMMA_MODEL:-gemma4:e2b}" | |
| VISION_MODEL="${VISION_MODEL:-llava:7b}" | |
| QWEN_MODEL="${QWEN_MODEL:-qwen3:4b}" | |
| SKIP_MODELS="${SKIP_MODELS:-0}" | |
| INSTALL_NVIDIA_DRIVER="${INSTALL_NVIDIA_DRIVER:-0}" | |
| INSTALL_VSCODE="${INSTALL_VSCODE:-1}" | |
| INSTALL_DOCKER="${INSTALL_DOCKER:-0}" | |
| LOG_FILE="${LOG_FILE:-$HOME/ai_agent_install.log}" | |
| exec > >(tee -a "$LOG_FILE") 2>&1 | |
| log() { printf '\n\033[1;32m[설치]\033[0m %s\n' "$*"; } | |
| info() { printf '\n\033[1;36m[정보]\033[0m %s\n' "$*"; } | |
| warn() { printf '\n\033[1;33m[주의]\033[0m %s\n' "$*" >&2; } | |
| fail() { printf '\n\033[1;31m[오류]\033[0m %s\n' "$*" >&2; exit 1; } | |
| trap 'fail "명령 실행 실패: $BASH_COMMAND (행: $LINENO). 로그: $LOG_FILE"' ERR | |
| if [ -f /tmp/.ai-agent-ready ]; then | |
| echo '이미 설치되었습니다' | |
| exit | |
| fi | |
| # ------------------------------------------------------------------------------ | |
| # 1. 환경 확인 | |
| # ------------------------------------------------------------------------------ | |
| [[ "$(uname -s)" == "Linux" ]] || fail "Linux 환경에서만 실행할 수 있습니다." | |
| command -v apt-get >/dev/null 2>&1 || fail "apt-get을 찾을 수 없습니다." | |
| if [[ -r /etc/os-release ]]; then | |
| # shellcheck disable=SC1091 | |
| source /etc/os-release | |
| info "운영체제: ${PRETTY_NAME:-알 수 없음}" | |
| if [[ "${ID:-}" != "ubuntu" ]]; then | |
| warn "Ubuntu가 아닌 배포판입니다. 일부 설치가 실패할 수 있습니다." | |
| fi | |
| fi | |
| if [[ "$EUID" -eq 0 ]]; then | |
| SUDO="" | |
| REAL_USER="${SUDO_USER:-root}" | |
| else | |
| command -v sudo >/dev/null 2>&1 || fail "sudo가 필요합니다." | |
| SUDO="sudo" | |
| REAL_USER="$USER" | |
| fi | |
| ARCH="$(dpkg --print-architecture)" | |
| [[ "$ARCH" == "amd64" || "$ARCH" == "arm64" ]] \ | |
| || fail "지원하지 않는 아키텍처입니다: $ARCH" | |
| mkdir -p "$PROJECT_DIR" | |
| # ------------------------------------------------------------------------------ | |
| # 2. Ubuntu 시스템 패키지 | |
| # ------------------------------------------------------------------------------ | |
| log "Ubuntu 패키지 목록을 갱신합니다." | |
| $SUDO apt-get update | |
| log "충돌이 발생하는 패키지를 삭제합니다." | |
| $SUDO DEBIAN_FRONTEND=noninteractive apt-get remove --allow-change-held-packages -y \ | |
| nodejs \ | |
| podman | |
| $SUDO DEBIAN_FRONTEND=noninteractive apt-get autoremove --allow-change-held-packages -y | |
| log "AI 개발에 필요한 시스템 패키지를 설치합니다." | |
| $SUDO DEBIAN_FRONTEND=noninteractive apt-get install -y \ | |
| build-essential \ | |
| ca-certificates \ | |
| curl \ | |
| wget \ | |
| git \ | |
| git-lfs \ | |
| unzip \ | |
| zip \ | |
| jq \ | |
| tree \ | |
| htop \ | |
| nano \ | |
| vim \ | |
| tmux \ | |
| pkg-config \ | |
| cmake \ | |
| python3 \ | |
| python3-dev \ | |
| python3-pip \ | |
| python3-venv \ | |
| python3-full \ | |
| ffmpeg \ | |
| libgl1 \ | |
| libsm6 \ | |
| libxext6 \ | |
| libxrender1 \ | |
| libgomp1 \ | |
| v4l-utils \ | |
| sqlite3 \ | |
| redis-server \ | |
| nodejs \ | |
| zstd | |
| git lfs install || true | |
| $SUDO systemctl enable --now redis-server 2>/dev/null || true | |
| # ------------------------------------------------------------------------------ | |
| # 3. 선택: NVIDIA 드라이버 | |
| # ------------------------------------------------------------------------------ | |
| if lspci 2>/dev/null | grep -qi nvidia; then | |
| info "NVIDIA GPU가 감지되었습니다." | |
| if [[ "$INSTALL_NVIDIA_DRIVER" == "1" ]]; then | |
| log "Ubuntu 권장 NVIDIA 드라이버를 설치합니다." | |
| $SUDO apt-get install -y ubuntu-drivers-common | |
| $SUDO ubuntu-drivers install | |
| warn "NVIDIA 드라이버 적용을 위해 설치 완료 후 재부팅이 필요할 수 있습니다." | |
| elif command -v nvidia-smi >/dev/null 2>&1; then | |
| nvidia-smi || true | |
| else | |
| warn "NVIDIA 드라이버가 보이지 않습니다." | |
| warn "자동 설치하려면 INSTALL_NVIDIA_DRIVER=1로 다시 실행하십시오." | |
| fi | |
| else | |
| info "NVIDIA GPU가 감지되지 않았습니다. CPU 기반으로 구성합니다." | |
| fi | |
| # ------------------------------------------------------------------------------ | |
| # 4. Python 가상환경 | |
| # ------------------------------------------------------------------------------ | |
| log "Python 가상환경을 준비합니다: $VENV_DIR" | |
| if [[ ! -x "$VENV_DIR/bin/python" ]]; then | |
| python3 -m venv "$VENV_DIR" | |
| fi | |
| PYTHON="$VENV_DIR/bin/python" | |
| PIP="$VENV_DIR/bin/pip" | |
| log "pip 기본 도구를 업그레이드합니다." | |
| "$PYTHON" -m pip install --upgrade pip setuptools wheel | |
| log "AI·Agent·Vision·RAG Python 패키지를 설치합니다." | |
| "$PIP" install --upgrade \ | |
| numpy \ | |
| pandas \ | |
| scipy \ | |
| matplotlib \ | |
| pillow \ | |
| requests \ | |
| httpx \ | |
| aiohttp \ | |
| python-dotenv \ | |
| pydantic \ | |
| pydantic-settings \ | |
| rich \ | |
| typer \ | |
| tqdm \ | |
| psutil \ | |
| pyyaml \ | |
| orjson \ | |
| tenacity \ | |
| opencv-python \ | |
| ultralytics \ | |
| torch \ | |
| torchvision \ | |
| torchaudio \ | |
| transformers \ | |
| accelerate \ | |
| sentence-transformers \ | |
| huggingface-hub \ | |
| safetensors \ | |
| langchain \ | |
| langchain-core \ | |
| langchain-community \ | |
| langchain-ollama \ | |
| langgraph \ | |
| langgraph-checkpoint-sqlite \ | |
| mcp \ | |
| fastapi \ | |
| "uvicorn[standard]" \ | |
| jupyterlab \ | |
| ipykernel \ | |
| chromadb \ | |
| faiss-cpu \ | |
| sqlalchemy \ | |
| redis \ | |
| beautifulsoup4 \ | |
| lxml \ | |
| pypdf \ | |
| python-docx \ | |
| openpyxl | |
| # 가상환경을 Jupyter 커널로 등록 | |
| "$PYTHON" -m ipykernel install --user \ | |
| --name ai-agent-ubuntu24 \ | |
| --display-name "AI Agent (Ubuntu 24.04)" || true | |
| # ------------------------------------------------------------------------------ | |
| # 5. Ollama | |
| # ------------------------------------------------------------------------------ | |
| if command -v ollama >/dev/null 2>&1; then | |
| info "Ollama가 이미 설치되어 있습니다." | |
| else | |
| log "Ollama를 설치합니다." | |
| curl -fsSL https://ollama.com/install.sh | sh | |
| fi | |
| log "Ollama 서비스를 준비합니다." | |
| if command -v systemctl >/dev/null 2>&1; then | |
| $SUDO systemctl enable --now ollama 2>/dev/null || true | |
| fi | |
| if ! ollama list >/dev/null 2>&1; then | |
| warn "Ollama 서비스 응답이 없어 사용자 백그라운드 서비스를 시작합니다." | |
| nohup ollama serve >"$PROJECT_DIR/ollama.log" 2>&1 & | |
| sleep 6 | |
| fi | |
| ollama --version | |
| ollama list >/dev/null 2>&1 || fail "Ollama 서비스에 연결할 수 없습니다." | |
| if [[ "$SKIP_MODELS" == "1" ]]; then | |
| warn "SKIP_MODELS=1: 로컬 모델 다운로드를 생략합니다." | |
| else | |
| log "Gemma 4 모델을 다운로드합니다: $GEMMA_MODEL" | |
| ollama pull "$GEMMA_MODEL" | |
| log "비전 모델을 다운로드합니다: $VISION_MODEL" | |
| ollama pull "$VISION_MODEL" | |
| log "Agent·코딩 보조 모델을 다운로드합니다: $QWEN_MODEL" | |
| ollama pull "$QWEN_MODEL" | |
| fi | |
| # ------------------------------------------------------------------------------ | |
| # 6. 선택: Visual Studio Code | |
| # ------------------------------------------------------------------------------ | |
| if [[ "$INSTALL_VSCODE" == "1" ]]; then | |
| if command -v code >/dev/null 2>&1; then | |
| info "Visual Studio Code가 이미 설치되어 있습니다." | |
| else | |
| log "Visual Studio Code 설치를 시도합니다." | |
| if command -v snap >/dev/null 2>&1; then | |
| $SUDO snap install code --classic || warn "VS Code 설치에 실패했습니다." | |
| else | |
| warn "snap을 사용할 수 없어 VS Code 설치를 생략합니다." | |
| fi | |
| fi | |
| fi | |
| # ------------------------------------------------------------------------------ | |
| # 7. 선택: Docker | |
| # ------------------------------------------------------------------------------ | |
| if [[ "$INSTALL_DOCKER" == "1" ]]; then | |
| log "Docker Engine을 Ubuntu 저장소 패키지로 설치합니다." | |
| $SUDO apt-get install -y docker.io docker-compose-v2 | |
| $SUDO systemctl enable --now docker | |
| if [[ "$REAL_USER" != "root" ]]; then | |
| $SUDO usermod -aG docker "$REAL_USER" | |
| warn "Docker 그룹 권한은 로그아웃 후 다시 로그인해야 적용됩니다." | |
| fi | |
| fi | |
| # ------------------------------------------------------------------------------ | |
| # 8. 프로젝트 구조 및 설정 파일 생성 | |
| # ------------------------------------------------------------------------------ | |
| log "AI Agent 프로젝트 기본 구조를 생성합니다." | |
| mkdir -p \ | |
| "$PROJECT_DIR/apps" \ | |
| "$PROJECT_DIR/data" \ | |
| "$PROJECT_DIR/models" \ | |
| "$PROJECT_DIR/notebooks" \ | |
| "$PROJECT_DIR/scripts" \ | |
| "$PROJECT_DIR/logs" | |
| cat > "$PROJECT_DIR/.env.example" <<EOF | |
| OLLAMA_BASE_URL=http://localhost:11434 | |
| OLLAMA_MODEL=$GEMMA_MODEL | |
| VISION_MODEL=$VISION_MODEL | |
| QWEN_MODEL=$QWEN_MODEL | |
| EOF | |
| cat > "$PROJECT_DIR/activate.sh" <<EOF | |
| #!/usr/bin/env bash | |
| source "$VENV_DIR/bin/activate" | |
| export OLLAMA_BASE_URL="\${OLLAMA_BASE_URL:-http://localhost:11434}" | |
| cd "$PROJECT_DIR" | |
| echo "AI Agent 가상환경 활성화 완료" | |
| echo "Python: \$(python --version)" | |
| echo "작업 폴더: $PROJECT_DIR" | |
| EOF | |
| chmod +x "$PROJECT_DIR/activate.sh" | |
| cat > "$PROJECT_DIR/scripts/check_environment.py" <<'PYEOF' | |
| import importlib | |
| import platform | |
| import subprocess | |
| import sys | |
| packages = [ | |
| "cv2", "numpy", "torch", "ultralytics", "transformers", | |
| "langchain", "langgraph", "langchain_ollama", "mcp", | |
| "fastapi", "chromadb", "sentence_transformers", | |
| ] | |
| print("=" * 70) | |
| print("AI Agent 개발환경 확인") | |
| print("=" * 70) | |
| print("OS:", platform.platform()) | |
| print("Python:", sys.version.split()[0]) | |
| for package in packages: | |
| try: | |
| module = importlib.import_module(package) | |
| version = getattr(module, "__version__", "설치됨") | |
| print(f"[OK] {package}: {version}") | |
| except Exception as exc: | |
| print(f"[FAIL] {package}: {exc}") | |
| try: | |
| import torch | |
| print("CUDA 사용 가능:", torch.cuda.is_available()) | |
| if torch.cuda.is_available(): | |
| print("GPU:", torch.cuda.get_device_name(0)) | |
| except Exception: | |
| pass | |
| try: | |
| result = subprocess.run( | |
| ["ollama", "list"], capture_output=True, text=True, check=True | |
| ) | |
| print("\nOllama 모델:") | |
| print(result.stdout.strip()) | |
| except Exception as exc: | |
| print("[FAIL] Ollama:", exc) | |
| PYEOF | |
| cat > "$PROJECT_DIR/apps/simple_agent.py" <<PYEOF | |
| from langchain.agents import create_agent | |
| from langchain_ollama import ChatOllama | |
| MODEL_NAME = "$GEMMA_MODEL" | |
| def get_weather(city: str) -> str: | |
| """예제용 날씨 도구입니다.""" | |
| return f"{city}의 날씨 정보는 실제 API를 연결해 조회하도록 확장할 수 있습니다." | |
| def main() -> None: | |
| model = ChatOllama( | |
| model=MODEL_NAME, | |
| base_url="http://localhost:11434", | |
| temperature=0, | |
| ) | |
| agent = create_agent( | |
| model=model, | |
| tools=[get_weather], | |
| system_prompt=( | |
| "당신은 로컬에서 실행되는 한국어 AI Agent입니다. " | |
| "필요하면 제공된 도구를 사용하고 결과를 명료하게 설명하세요." | |
| ), | |
| ) | |
| result = agent.invoke( | |
| {"messages": [{"role": "user", "content": "광주의 날씨 도구를 시험해 줘."}]} | |
| ) | |
| print(result["messages"][-1].content) | |
| if __name__ == "__main__": | |
| main() | |
| PYEOF | |
| cat > "$PROJECT_DIR/apps/ollama_chat.py" <<PYEOF | |
| from langchain_ollama import ChatOllama | |
| MODEL_NAME = "$GEMMA_MODEL" | |
| model = ChatOllama( | |
| model=MODEL_NAME, | |
| base_url="http://localhost:11434", | |
| ) | |
| response = model.invoke("AI Agent와 일반 챗봇의 차이를 한국어로 간단히 설명해 줘.") | |
| print(response.content) | |
| PYEOF | |
| cat > "$PROJECT_DIR/scripts/yolo_test.py" <<'PYEOF' | |
| from ultralytics import YOLO | |
| model = YOLO("yolo11n.pt") | |
| print("YOLO11 모델 준비 완료:", model.model_name) | |
| PYEOF | |
| cat > "$PROJECT_DIR/run_checks.sh" <<EOF | |
| #!/usr/bin/env bash | |
| set -e | |
| source "$VENV_DIR/bin/activate" | |
| cd "$PROJECT_DIR" | |
| python scripts/check_environment.py | |
| python scripts/yolo_test.py | |
| EOF | |
| chmod +x "$PROJECT_DIR/run_checks.sh" | |
| cat > "$PROJECT_DIR/start_jupyter.sh" <<EOF | |
| #!/usr/bin/env bash | |
| source "$VENV_DIR/bin/activate" | |
| cd "$PROJECT_DIR" | |
| jupyter lab | |
| EOF | |
| chmod +x "$PROJECT_DIR/start_jupyter.sh" | |
| cat > "$PROJECT_DIR/README_FIRST.txt" <<EOF | |
| Ubuntu 24.04 AI Agent 개발환경 | |
| 1. 가상환경 활성화 | |
| source "$PROJECT_DIR/activate.sh" | |
| 2. 환경 점검 | |
| "$PROJECT_DIR/run_checks.sh" | |
| 3. Ollama 모델 실행 | |
| ollama run "$GEMMA_MODEL" | |
| ollama run "$VISION_MODEL" | |
| ollama run "$QWEN_MODEL" | |
| 4. LangChain/Ollama 예제 | |
| python "$PROJECT_DIR/apps/ollama_chat.py" | |
| 5. Agent 도구 호출 예제 | |
| python "$PROJECT_DIR/apps/simple_agent.py" | |
| 6. JupyterLab | |
| "$PROJECT_DIR/start_jupyter.sh" | |
| 7. 기존 CCTV 프로그램 실행 예 | |
| source "$VENV_DIR/bin/activate" | |
| cd "\$HOME/다운로드/ibhak" | |
| python yolo_visionllm_v3.py | |
| EOF | |
| # ------------------------------------------------------------------------------ | |
| # 9. 설치 확인 | |
| # ------------------------------------------------------------------------------ | |
| log "Python 핵심 패키지와 YOLO 설치를 확인합니다." | |
| "$PYTHON" "$PROJECT_DIR/scripts/check_environment.py" | |
| ( | |
| cd "$PROJECT_DIR" | |
| "$PYTHON" "$PROJECT_DIR/scripts/yolo_test.py" | |
| ) | |
| # ------------------------------------------------------------------------------ | |
| # 10. 완료 안내 | |
| # ------------------------------------------------------------------------------ | |
| printf '\n\033[1;36m============================================================\033[0m\n' | |
| printf '\033[1;36m AI Agent 통합 개발환경 설치 완료\033[0m\n' | |
| printf '\033[1;36m============================================================\033[0m\n' | |
| printf '작업 폴더 : %s\n' "$PROJECT_DIR" | |
| printf 'Python 환경 : %s\n' "$VENV_DIR" | |
| printf '설치 로그 : %s\n' "$LOG_FILE" | |
| printf '환경 활성화 : source "%s/activate.sh"\n' "$PROJECT_DIR" | |
| printf '전체 점검 : "%s/run_checks.sh"\n' "$PROJECT_DIR" | |
| printf 'JupyterLab : "%s/start_jupyter.sh"\n' "$PROJECT_DIR" | |
| printf 'Gemma 4 실행 : ollama run %s\n' "$GEMMA_MODEL" | |
| printf 'LLaVA 실행 : ollama run %s\n' "$VISION_MODEL" | |
| printf 'Qwen3 실행 : ollama run %s\n' "$QWEN_MODEL" | |
| printf '사용 안내 : cat "%s/README_FIRST.txt"\n' "$PROJECT_DIR" | |
| if [[ "$INSTALL_NVIDIA_DRIVER" == "1" ]]; then | |
| printf '\nNVIDIA 드라이버를 설치했다면 시스템을 재부팅하십시오:\n' | |
| printf ' sudo reboot\n' | |
| fi | |
| printf '\n설치 완료 후 권장 첫 명령:\n' | |
| printf ' source "%s/activate.sh"\n' "$PROJECT_DIR" | |
| printf ' python apps/ollama_chat.py\n\n' | |
| touch /tmp/.ai-agent-ready |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| #!/usr/bin/env bash | |
| set -Eeuo pipefail | |
| # Ubuntu 24.04용 CCTV Vision + Ollama/LLaVA 자동 설치 스크립트 | |
| # 구성: Python venv + OpenCV + NumPy + Ultralytics + Requests + Ollama + LLaVA | |
| # | |
| # 사용: | |
| # chmod +x install_cctv_ai.sh | |
| # ./install_cctv_ai.sh | |
| # | |
| # 선택 환경변수: | |
| # PROJECT_DIR="$HOME/cctv_project" ./install_cctv_ai.sh | |
| # OLLAMA_MODEL="llava:7b" ./install_cctv_ai.sh | |
| # SKIP_OLLAMA_PULL=1 ./install_cctv_ai.sh | |
| PROJECT_DIR="${PROJECT_DIR:-$HOME/cctv_project}" | |
| VENV_DIR="$PROJECT_DIR/venv" | |
| OLLAMA_MODEL="${OLLAMA_MODEL:-llava}" | |
| GEMMA_MODEL="${GEMMA_MODEL:-gemma4}" | |
| SKIP_OLLAMA_PULL="${SKIP_OLLAMA_PULL:-0}" | |
| log() { | |
| printf '\n\033[1;32m[설치]\033[0m %s\n' "$*" | |
| } | |
| warn() { | |
| printf '\n\033[1;33m[주의]\033[0m %s\n' "$*" >&2 | |
| } | |
| fail() { | |
| printf '\n\033[1;31m[오류]\033[0m %s\n' "$*" >&2 | |
| exit 1 | |
| } | |
| trap 'fail "설치 중 오류가 발생했습니다. 실패한 명령: $BASH_COMMAND"' ERR | |
| if [ -f /tmp/.ai-cctv-ready ]; then | |
| echo '이미 설치되었습니다' | |
| exit | |
| fi | |
| if [[ "$(uname -s)" != "Linux" ]]; then | |
| fail "이 스크립트는 Ubuntu/Linux 환경에서만 실행할 수 있습니다." | |
| fi | |
| if ! command -v apt-get >/dev/null 2>&1; then | |
| fail "apt-get을 찾을 수 없습니다. Ubuntu 24.04 환경인지 확인하십시오." | |
| fi | |
| if [[ "${EUID}" -eq 0 ]]; then | |
| SUDO="" | |
| else | |
| command -v sudo >/dev/null 2>&1 || fail "sudo가 설치되어 있지 않습니다." | |
| SUDO="sudo" | |
| fi | |
| log "시스템 패키지 목록을 갱신합니다." | |
| $SUDO apt-get update | |
| log "충돌이 발생하는 패키지를 삭제합니다." | |
| $SUDO DEBIAN_FRONTEND=noninteractive apt-get remove --allow-change-held-packages -y \ | |
| nodejs \ | |
| podman | |
| $SUDO DEBIAN_FRONTEND=noninteractive apt-get autoremove --allow-change-held-packages -y | |
| log "필수 시스템 패키지를 설치합니다." | |
| $SUDO apt-get install -y \ | |
| python3 \ | |
| python3-pip \ | |
| python3-venv \ | |
| ffmpeg \ | |
| libgl1 \ | |
| curl \ | |
| ca-certificates | |
| log "프로젝트 폴더를 준비합니다: $PROJECT_DIR" | |
| mkdir -p "$PROJECT_DIR" | |
| log "Python 가상환경을 준비합니다." | |
| if [[ ! -x "$VENV_DIR/bin/python" ]]; then | |
| python3 -m venv "$VENV_DIR" | |
| fi | |
| log "pip와 필수 Python 라이브러리를 설치합니다." | |
| "$VENV_DIR/bin/python" -m pip install --upgrade pip setuptools wheel | |
| "$VENV_DIR/bin/python" -m pip install \ | |
| opencv-python \ | |
| numpy \ | |
| ultralytics \ | |
| requests | |
| log "YOLO11 모델 다운로드 및 로딩을 시험합니다." | |
| ( | |
| cd "$PROJECT_DIR" | |
| "$VENV_DIR/bin/python" -c "from ultralytics import YOLO; YOLO('yolo11n.pt')" | |
| ) | |
| if command -v ollama >/dev/null 2>&1; then | |
| log "Ollama가 이미 설치되어 있습니다: $(ollama --version 2>/dev/null || true)" | |
| else | |
| log "Ollama를 설치합니다." | |
| curl -fsSL https://ollama.com/install.sh | sh | |
| fi | |
| log "Ollama 서비스를 준비합니다." | |
| if command -v systemctl >/dev/null 2>&1; then | |
| $SUDO systemctl enable --now ollama 2>/dev/null || true | |
| fi | |
| if ! ollama list >/dev/null 2>&1; then | |
| warn "Ollama 서비스가 아직 응답하지 않습니다. 백그라운드 실행을 시도합니다." | |
| nohup ollama serve >"$PROJECT_DIR/ollama.log" 2>&1 & | |
| sleep 5 | |
| fi | |
| ollama --version || fail "Ollama 설치 확인에 실패했습니다." | |
| if [[ "$SKIP_OLLAMA_PULL" == "1" ]]; then | |
| warn "SKIP_OLLAMA_PULL=1 설정으로 모델 다운로드를 건너뜁니다." | |
| else | |
| log "Ollama 모델을 다운로드합니다: $OLLAMA_MODEL" | |
| ollama pull "$OLLAMA_MODEL" | |
| fi | |
| cat > "$PROJECT_DIR/activate.sh" <<EOF | |
| #!/usr/bin/env bash | |
| source "$VENV_DIR/bin/activate" | |
| echo "가상환경 활성화 완료: $VENV_DIR" | |
| EOF | |
| chmod +x "$PROJECT_DIR/activate.sh" | |
| cat > "$PROJECT_DIR/run_yolo_test.sh" <<EOF | |
| #!/usr/bin/env bash | |
| set -e | |
| source "$VENV_DIR/bin/activate" | |
| cd "$PROJECT_DIR" | |
| python -c "from ultralytics import YOLO; YOLO('yolo11n.pt'); print('YOLO11 로딩 성공')" | |
| EOF | |
| chmod +x "$PROJECT_DIR/run_yolo_test.sh" | |
| if [[ "$SKIP_OLLAMA_PULL" == "1" ]]; then | |
| warn "SKIP_OLLAMA_PULL=1 설정으로 Gemma4 다운로드를 건너뜁니다." | |
| else | |
| log "Gemma 모델을 다운로드합니다: $GEMMA_MODEL" | |
| ollama pull "$GEMMA_MODEL" | |
| fi | |
| printf '\n\033[1;36m설치가 완료되었습니다.\033[0m\n' | |
| printf '프로젝트 폴더: %s\n' "$PROJECT_DIR" | |
| printf '가상환경 활성화: source "%s/bin/activate"\n' "$VENV_DIR" | |
| printf 'YOLO 테스트: "%s/run_yolo_test.sh"\n' "$PROJECT_DIR" | |
| printf 'LLaVA 실행 : ollama run %s\n' "$OLLAMA_MODEL" | |
| printf 'Gemma4 실행: ollama run %s\n' "$GEMMA_MODEL" | |
| printf '카메라 확인: ls /dev/video*\n\n' | |
| printf '기존 프로그램 실행 예:\n' | |
| printf ' cd "$HOME/다운로드/ibhak"\n' | |
| printf ' source "%s/bin/activate"\n' "$VENV_DIR" | |
| printf ' python yolo_visionllm_v3.py\n\n' | |
| printf '참고: anthropic 패키지와 ANTHROPIC_API_KEY는 필요하지 않습니다.\n' | |
| touch /tmp/.ai-cctv-ready |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment