zioinfo-mail/setup/lib/db_select.sh
DESKTOP-TKLFCPR\ython 4b7904d14a feat(setup): DB 선택/pgvector/Qdrant/Gitea 통합
[DB 선택 대화형 프롬프트]
- setup/lib/db_select.sh: 설치 시 SQLite/PostgreSQL/PostgreSQL+pgvector 선택
- DB_TYPE 환경변수로 무인 설치 지원
- pgvector 자동 빌드/설치 (소스 빌드 폴백 포함)
- .env DATABASE_URL 자동 기록

[Vector DB]
- docker-compose.yml: postgres를 pgvector/pgvector:pg15 이미지로 교체
- Qdrant: docker profile=vector 로 선택적 활성화
- docs/vector_db_guide.md: pgvector/Qdrant 사용법 + 시나리오

[Gitea 온프레미스 Git 서버]
- docker-compose.yml: gitea/gitea:1.21-rootless 서비스 추가
- setup/lib/gitea_setup.sh: 공통 설치/초기화 함수
- setup/gitea_init.sh: 독립 실행형 초기화 스크립트
  - 관리자 계정 생성
  - guardia 조직 + GUARDiA 저장소 생성
  - main 브랜치 보호 (PR + 리뷰 1명 필수)
  - develop 브랜치 생성
  - 개발자 계정 (engineer1/2, pm1, admin) + feature/이름/init 브랜치 자동 생성
  - 현재 소스 자동 push

[브랜치 전략]
  main         : 보호 브랜치, PR 필수, 리뷰 1명 필수
  develop      : 통합 브랜치, force-push 금지
  feature/이름/기능: 개인 개발 브랜치

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-29 19:32:47 +09:00

180 lines
5.4 KiB
Bash

#!/bin/bash
# ==============================================================
# GUARDiA DB 선택 공통 함수
# ==============================================================
# 사용법: source setup/lib/db_select.sh; select_database
# 결과: DB_TYPE, DATABASE_URL, INSTALL_POSTGRES, INSTALL_PGVECTOR 변수 설정
# ==============================================================
select_database() {
# 환경변수로 이미 지정된 경우 프롬프트 생략
if [[ -n "${DB_TYPE:-}" ]]; then
info "DB_TYPE=$DB_TYPE (환경변수 설정됨)"
_apply_db_type "$DB_TYPE"
return
fi
echo ""
echo "============================================================"
echo " 데이터베이스 선택"
echo "============================================================"
echo " 1) SQLite (개발·단독 실행 권장, 추가 설치 없음)"
echo " 2) PostgreSQL (운영 환경 권장)"
echo " 3) PostgreSQL + pgvector (AI 벡터 검색 포함, 권장)"
echo ""
echo " pgvector: SR 유사도 검색, KB 시맨틱 검색, 이상 탐지에 활용"
echo " Qdrant: docker-compose에 선택적 포함 (고성능 벡터 검색)"
echo "============================================================"
local choice
read -rp " 선택 [1-3, 기본값=3]: " choice
choice="${choice:-3}"
case "$choice" in
1) DB_TYPE="sqlite" ;;
2) DB_TYPE="postgres" ;;
3) DB_TYPE="postgres-vector";;
*) warn "잘못된 선택 '$choice' — 기본값 3(postgres-vector) 사용"
DB_TYPE="postgres-vector" ;;
esac
_apply_db_type "$DB_TYPE"
}
_apply_db_type() {
local dtype="$1"
case "$dtype" in
sqlite)
DATABASE_URL="sqlite+aiosqlite:///./guardia_itsm.db"
INSTALL_POSTGRES=false
INSTALL_PGVECTOR=false
INSTALL_QDRANT=false
ok "DB: SQLite (개발 모드)"
;;
postgres)
DATABASE_URL="postgresql+asyncpg://guardia:guardia@localhost:5432/guardia"
INSTALL_POSTGRES=true
INSTALL_PGVECTOR=false
INSTALL_QDRANT=false
ok "DB: PostgreSQL"
;;
postgres-vector)
DATABASE_URL="postgresql+asyncpg://guardia:guardia@localhost:5432/guardia"
INSTALL_POSTGRES=true
INSTALL_PGVECTOR=true
INSTALL_QDRANT=false # Qdrant는 docker-compose로 별도 제공
ok "DB: PostgreSQL + pgvector (AI 벡터 검색 포함)"
;;
*)
warn "알 수 없는 DB_TYPE='$dtype' — SQLite로 대체"
DATABASE_URL="sqlite+aiosqlite:///./guardia_itsm.db"
INSTALL_POSTGRES=false
INSTALL_PGVECTOR=false
INSTALL_QDRANT=false
;;
esac
export DB_TYPE DATABASE_URL INSTALL_POSTGRES INSTALL_PGVECTOR INSTALL_QDRANT
}
setup_postgres() {
local pgpw="${POSTGRES_PASSWORD:-guardia}"
[[ "$INSTALL_POSTGRES" != "true" ]] && return
echo ""
info "PostgreSQL 설정..."
# 배포 환경별 초기화 (호출 스크립트에서 처리됨)
# 여기서는 DB/사용자 생성만 담당
# 비밀번호 안전 저장
sudo -u postgres psql \
-tc "SELECT 1 FROM pg_user WHERE usename='guardia'" 2>/dev/null \
| grep -q 1 \
|| sudo -u postgres psql -c \
"CREATE USER guardia WITH PASSWORD '${pgpw}';" 2>/dev/null
sudo -u postgres psql \
-tc "SELECT 1 FROM pg_database WHERE datname='guardia'" 2>/dev/null \
| grep -q 1 \
|| sudo -u postgres psql -c \
"CREATE DATABASE guardia OWNER guardia;" 2>/dev/null
ok "PostgreSQL DB/사용자 생성 완료"
# pgvector 확장 설치
if [[ "$INSTALL_PGVECTOR" == "true" ]]; then
_install_pgvector "$pgpw"
fi
}
_install_pgvector() {
local pgpw="$1"
echo ""
info "pgvector 확장 설치..."
# OS별 패키지 설치
if command -v apt-get &>/dev/null; then
apt-get install -y -qq postgresql-server-dev-all build-essential git 2>/dev/null || true
# pgvector 소스 빌드 (패키지 없는 경우)
if ! dpkg -l postgresql-15-pgvector &>/dev/null 2>&1; then
_build_pgvector_from_source
else
apt-get install -y -qq "postgresql-$(pg_lsclusters | grep online | awk '{print $1}' | head -1)-pgvector" 2>/dev/null \
|| _build_pgvector_from_source
fi
elif command -v dnf &>/dev/null; then
dnf install -y pgvector_15 2>/dev/null \
|| _build_pgvector_from_source
else
_build_pgvector_from_source
fi
# 확장 활성화
sudo -u postgres psql -d guardia -c "CREATE EXTENSION IF NOT EXISTS vector;" 2>/dev/null \
&& ok "pgvector 확장 활성화 완료" \
|| warn "pgvector 활성화 실패 — 나중에 수동: CREATE EXTENSION vector;"
}
_build_pgvector_from_source() {
local tmpdir
tmpdir=$(mktemp -d)
info "pgvector 소스 빌드..."
git clone --depth 1 https://github.com/pgvector/pgvector.git "$tmpdir" 2>/dev/null \
|| { warn "pgvector 소스 클론 실패 — 인터넷 연결 확인"; return; }
cd "$tmpdir"
make 2>/dev/null
make install 2>/dev/null
cd -
rm -rf "$tmpdir"
ok "pgvector 빌드 완료"
}
write_db_env() {
local env_file="$1"
# .env 파일에 DATABASE_URL 기록
if grep -q "^DATABASE_URL=" "$env_file" 2>/dev/null; then
sed -i "s|^DATABASE_URL=.*|DATABASE_URL=${DATABASE_URL}|" "$env_file"
else
echo "DATABASE_URL=${DATABASE_URL}" >> "$env_file"
fi
# pgvector 설정 추가
if [[ "$INSTALL_PGVECTOR" == "true" ]]; then
grep -q "^ENABLE_VECTOR=" "$env_file" 2>/dev/null \
|| echo "ENABLE_VECTOR=true" >> "$env_file"
fi
ok ".env DATABASE_URL 기록 완료: $DATABASE_URL"
}