#!/usr/bin/env bash # ============================================================================= # GovBot KR — 자동 설치 스크립트 v1.0 # 지원 OS: Ubuntu 20.04+, Debian 11+, macOS 13+ # 필요 권한: sudo (Docker 설치 시) # 사용법: curl -fsSL https://raw.githubusercontent.com/22blabs/govbot-kr/main/install.sh | bash # 또는: chmod +x install.sh && ./install.sh # ============================================================================= set -euo pipefail BOLD='\033[1m' GREEN='\033[0;32m' YELLOW='\033[1;33m' RED='\033[0;31m' NC='\033[0m' info() { echo -e "${GREEN}[INFO]${NC} $*"; } warn() { echo -e "${YELLOW}[WARN]${NC} $*"; } error() { echo -e "${RED}[ERROR]${NC} $*" >&2; exit 1; } step() { echo -e "\n${BOLD}==> $*${NC}"; } GOVBOT_DIR="${GOVBOT_DIR:-$HOME/govbot-kr}" GOVBOT_VERSION="${GOVBOT_VERSION:-latest}" # ─── 환경 확인 ─────────────────────────────────────────────────────────────── step "환경 확인" OS=$(uname -s) ARCH=$(uname -m) info "OS: $OS / ARCH: $ARCH" if [[ "$OS" != "Linux" && "$OS" != "Darwin" ]]; then error "지원하지 않는 OS입니다. Linux 또는 macOS가 필요합니다.\nWindows는 WSL2를 사용하세요: docs/WSL2_가이드.md" fi # ─── Docker 확인 / 설치 ─────────────────────────────────────────────────────── step "Docker 확인" if command -v docker &>/dev/null; then DOCKER_VER=$(docker --version | grep -oE '[0-9]+\.[0-9]+' | head -1) info "Docker $DOCKER_VER 감지됨" else warn "Docker가 설치되어 있지 않습니다. 설치를 시작합니다..." if [[ "$OS" == "Linux" ]]; then curl -fsSL https://get.docker.com | sudo sh sudo usermod -aG docker "$USER" info "Docker 설치 완료. 이 터미널을 닫고 다시 열어주세요 (docker 그룹 적용)." else error "macOS에서는 Docker Desktop을 수동으로 설치해주세요: https://www.docker.com/products/docker-desktop/" fi fi if ! command -v docker compose &>/dev/null && ! command -v docker-compose &>/dev/null; then warn "Docker Compose가 없습니다. Docker Desktop 또는 최신 Docker Engine을 설치하세요." fi # ─── 프로젝트 디렉터리 ──────────────────────────────────────────────────────── step "프로젝트 디렉터리: $GOVBOT_DIR" if [[ -d "$GOVBOT_DIR" ]]; then warn "디렉터리가 이미 존재합니다: $GOVBOT_DIR" read -rp "계속 진행하시겠습니까? 기존 설정은 유지됩니다. [y/N] " answer [[ "$answer" =~ ^[Yy]$ ]] || error "설치를 취소했습니다." else mkdir -p "$GOVBOT_DIR" info "디렉터리 생성: $GOVBOT_DIR" fi cd "$GOVBOT_DIR" # ─── .env 파일 생성 ─────────────────────────────────────────────────────────── step ".env 설정 파일 생성" if [[ -f ".env" ]]; then warn ".env 파일이 이미 존재합니다. 덮어쓰지 않습니다." else SECRET_KEY=$(python3 -c "import secrets; print(secrets.token_hex(32))" 2>/dev/null \ || openssl rand -hex 32 2>/dev/null \ || echo "change-this-secret-key-before-production") cat > .env << EOF # GovBot KR 환경 설정 # 생성일: $(date +%Y-%m-%d) # ── 데이터베이스 ────────────────────────────────────── DATABASE_URL=postgresql+asyncpg://govbot:govbot@db:5432/govbot # ── Redis ──────────────────────────────────────────── REDIS_URL=redis://redis:6379/0 # ── ChromaDB ───────────────────────────────────────── CHROMA_HOST=chromadb CHROMA_PORT=8001 # ── 보안 ───────────────────────────────────────────── SECRET_KEY=${SECRET_KEY} # ── LLM (선택) ─────────────────────────────────────── # LLM_PROVIDER=none # 기본값: LLM 없이 FAQ+RAG만 사용 # LLM_PROVIDER=anthropic # ANTHROPIC_API_KEY=sk-ant-... # LLM_PROVIDER=openai # OPENAI_API_KEY=sk-... # ── 로그 ───────────────────────────────────────────── LOG_LEVEL=INFO EOF info ".env 파일 생성 완료" warn "⚠️ SECRET_KEY가 자동 생성되었습니다. 안전하게 보관하세요." fi # ─── docker-compose.yml 다운로드 ───────────────────────────────────────────── step "docker-compose.yml 확인" if [[ ! -f "docker-compose.yml" ]]; then # 소스에서 직접 실행 시: 현재 디렉터리의 파일 사용 SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" if [[ -f "$SCRIPT_DIR/docker-compose.yml" ]]; then cp "$SCRIPT_DIR/docker-compose.yml" . cp -r "$SCRIPT_DIR/backend" . 2>/dev/null || true info "소스 파일 복사 완료" else error "docker-compose.yml을 찾을 수 없습니다.\nGovBot KR 소스 디렉터리에서 install.sh를 실행해주세요." fi fi # ─── 서비스 시작 ────────────────────────────────────────────────────────────── step "Docker 서비스 시작" COMPOSE_CMD="docker compose" command -v "docker compose" &>/dev/null || COMPOSE_CMD="docker-compose" info "이미지 빌드 중... (첫 실행 시 5~10분 소요)" $COMPOSE_CMD build --quiet info "서비스 시작 중..." $COMPOSE_CMD up -d # ─── DB 마이그레이션 ────────────────────────────────────────────────────────── step "데이터베이스 마이그레이션" info "DB 초기화 대기 중..." sleep 5 $COMPOSE_CMD exec -T backend alembic upgrade head && \ info "마이그레이션 완료" || \ warn "마이그레이션 실패. 수동으로 실행하세요: docker compose exec backend alembic upgrade head" # ─── 헬스 체크 ──────────────────────────────────────────────────────────────── step "서비스 상태 확인" sleep 3 HTTP_STATUS=$(curl -s -o /dev/null -w "%{http_code}" http://localhost:8000/health 2>/dev/null || echo "000") if [[ "$HTTP_STATUS" == "200" ]]; then info "✅ 서비스 정상 동작 확인" else warn "헬스 체크 응답: $HTTP_STATUS (서비스 시작 중일 수 있습니다)" fi # ─── 완료 메시지 ────────────────────────────────────────────────────────────── echo "" echo -e "${BOLD}${GREEN}================================================" echo -e " GovBot KR 설치 완료!" echo -e "================================================${NC}" echo "" echo -e " API 서버: http://localhost:8000" echo -e " API 문서: http://localhost:8000/docs" echo -e " 헬스 체크: http://localhost:8000/health" echo "" echo -e " 다음 단계:" echo -e " 1. 관리자 계정 생성:" echo -e " ${BOLD}docker compose exec backend python -m app.scripts.create_admin${NC}" echo -e "" echo -e " 2. 대시보드 접속 (프론트엔드 빌드 후):" echo -e " http://localhost:3000" echo "" echo -e " 운영 가이드: docs/운영가이드.md" echo ""