From bdc254cfd0efd082f0c856eea1cd969b4516434e Mon Sep 17 00:00:00 2001 From: siane Date: Tue, 23 Dec 2025 17:47:59 +0900 Subject: [PATCH] Update lxc/setup_mariadb.sh --- lxc/setup_mariadb.sh | 533 +++++++++++-------------------------------- 1 file changed, 131 insertions(+), 402 deletions(-) diff --git a/lxc/setup_mariadb.sh b/lxc/setup_mariadb.sh index 948bbb3..0fdba58 100644 --- a/lxc/setup_mariadb.sh +++ b/lxc/setup_mariadb.sh @@ -1,27 +1,25 @@ #!/bin/bash -# Rocky Linux 9 LXC - MariaDB 설치 및 초기 설정 -# 오류 발생 시 초기화 옵션 제공, 중복 사용자 처리 포함 +# Rocky Linux 9 LXC - MariaDB 10.6.5 설치 및 초기 설정 (고정 버전) +# 서비스 서버(호스팅)와 동일한 DB 환경 재현 목적 # root 계정에서 실행 -# Linux / DB 계정 통합 여부 선택 가능 -# dotfiles는 git에서 다운로드 -# 파이프 실행 지원 (curl | bash) +# curl | bash 실행 지원 set -euo pipefail -# dotfiles 저장소 DOTFILES_BASE_URL="https://git.siane.kr/firstgarden/cafe24-testserver/raw/branch/main" -# 전역 변수 LINUX_USER="" DB_USER="" +DB_NAME="" -# 터미널 입력 헬퍼 함수 -# curl | bash로 실행할 때 /dev/tty에서 입력을 받도록 함 +############################################ +# 입력 헬퍼 (pipe 대응) +############################################ read_input() { local prompt="$1" local var_name="$2" local is_secret="${3:-false}" - + if [ "$is_secret" = "true" ]; then read -s -p "$prompt" "$var_name" < /dev/tty echo "" >&2 @@ -30,452 +28,183 @@ read_input() { fi } -# 오류 처리 및 초기화 함수 +############################################ +# 오류 발생 시 정리 +############################################ cleanup() { EXIT_CODE=$? if [ $EXIT_CODE -ne 0 ]; then echo "" - echo "❌ 설정 중 에러 발생 ($EXIT_CODE)" - echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" - echo "" - echo "선택 사항:" - echo " 1) Linux/DB 사용자만 정리하고 다시 시작" - echo " 2) MariaDB 완전 제거 후 다시 시작 (권장)" - echo " 3) 취소" - echo "" - read_input "선택 (1, 2 또는 3): " CLEANUP_OPTION - CLEANUP_OPTION=${CLEANUP_OPTION:-3} - - case $CLEANUP_OPTION in - 2) - echo "MariaDB를 완전히 제거합니다..." - systemctl stop mariadb 2>/dev/null || true - dnf remove -y mariadb-server 2>/dev/null || true - rm -rf /var/lib/mysql /etc/my.cnf.d/50-server.cnf 2>/dev/null || true - echo "✓ MariaDB 완전 제거 완료" - - # LINUX_USER가 설정되어 있으면 Linux 사용자/DB 사용자 정리 - if [ -n "$LINUX_USER" ]; then - if [ -n "$DB_USER" ]; then - echo "⚠️ MariaDB 사용자 '$DB_USER' 정리 (수동으로 필요할 수 있음)" - fi - - if id "$LINUX_USER" &>/dev/null; then - userdel -r "$LINUX_USER" 2>/dev/null || userdel "$LINUX_USER" 2>/dev/null || true - echo "✓ Linux 사용자 '$LINUX_USER' 삭제 완료" - fi - fi - echo "" - echo "초기화가 완료되었습니다. 스크립트를 다시 실행하세요." - ;; - 1) - echo "" - echo "⚠️ Linux/DB 사용자를 정리합니다..." - - if [ -n "$LINUX_USER" ]; then - if id "$LINUX_USER" &>/dev/null; then - userdel -r "$LINUX_USER" 2>/dev/null || userdel "$LINUX_USER" 2>/dev/null || true - echo "✓ Linux 사용자 '$LINUX_USER' 삭제 완료" - fi - fi - - echo "" - echo "초기화가 완료되었습니다. 스크립트를 다시 실행하세요." - ;; - *) - echo "정리를 건너뜁니다. 수동으로 정리 후 다시 진행하세요." - ;; - esac + echo "❌ 설정 중 오류 발생 ($EXIT_CODE)" + echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" + echo "MariaDB / 사용자 상태를 확인하세요." fi exit $EXIT_CODE } - trap cleanup EXIT -echo "=== LXC MariaDB 초기 세팅 시작 ===" +echo "=== Rocky Linux 9 LXC - MariaDB 10.6.5 고정 설치 시작 ===" echo "" -# ------------------------------------------------- -# 0. Timezone 설정 -# ------------------------------------------------- +############################################ +# 0. Timezone +############################################ timedatectl set-timezone Asia/Seoul -echo "✓ Timezone: Asia/Seoul" +echo "✓ Timezone 설정 완료" -# ------------------------------------------------- -# 1. 필수 패키지 사전 설치 -# ------------------------------------------------- -echo "필수 패키지 설치 중..." -dnf update -y > /dev/null 2>&1 || { echo "❌ dnf update 실패"; exit 1; } -dnf install -y sudo vim wget curl mariadb-server > /dev/null 2>&1 || { echo "❌ 필수 패키지 설치 실패"; exit 1; } -echo "✓ 필수 패키지 설치 완료" +############################################ +# 1. 필수 패키지 +############################################ +dnf update -y +dnf install -y sudo vim wget curl policycoreutils-python-utils -# ------------------------------------------------- -# 2. Linux 사용자 정보 입력 -# ------------------------------------------------- +############################################ +# 2. Linux 사용자 +############################################ read_input "Linux 사용자 이름: " LINUX_USER -# 사용자 존재 확인 및 재생성 옵션 -if id "$LINUX_USER" &>/dev/null; then - echo "⚠️ 사용자 '$LINUX_USER'이(가) 이미 존재합니다." - echo "" - echo "선택 사항:" - echo " 1) 기존 사용자 사용 (비밀번호는 변경하지 않음)" - echo " 2) 사용자 삭제 후 재생성 (홈 디렉토리 포함 삭제)" - echo "" - read_input "선택 (1 또는 2): " USER_ACTION - - case $USER_ACTION in - 2) - read_input "정말로 '$LINUX_USER'을(를) 삭제하고 재생성하시겠습니까? (y/n): " CONFIRM - if [[ "$CONFIRM" =~ ^[Yy]$ ]]; then - echo "사용자 삭제 중..." - userdel -r "$LINUX_USER" 2>/dev/null || userdel "$LINUX_USER" 2>/dev/null || true - echo "✓ 사용자 '$LINUX_USER' 삭제 완료" - - # 새 비밀번호 입력 (재시도 옵션) - while true; do - read -s -p "새로운 Linux 사용자 비밀번호: " LINUX_PW < /dev/tty - echo "" - - # 비밀번호 입력 확인 - if [ -z "$LINUX_PW" ]; then - echo "❌ 비밀번호를 입력해주세요 (빈 문자열 불가)." - continue - fi - - read -s -p "Linux 사용자 비밀번호 확인: " LINUX_PW_CONFIRM < /dev/tty - echo "" - - if [[ "$LINUX_PW" != "$LINUX_PW_CONFIRM" ]]; then - echo "❌ Linux 사용자 비밀번호가 일치하지 않습니다." - read -p "다시 입력하시겠습니까? (Y/n): " RETRY_PW_2 < /dev/tty - RETRY_PW_2=${RETRY_PW_2:-N} - if [[ ! "$RETRY_PW_2" =~ ^[Yy]$ ]]; then - echo "비밀번호 입력을 취소했습니다." - exit 1 - fi - else - break - fi - done - CREATE_USER=true - else - echo "❌ 사용자 삭제를 취소했습니다. 다른 사용자명을 입력하세요." - exit 1 - fi - ;; - 1|*) - echo "ℹ️ 기존 사용자를 사용합니다: $LINUX_USER" - CREATE_USER=false - LINUX_PW="" - ;; - esac -else - # 새 사용자 생성 (비밀번호 입력) +if ! id "$LINUX_USER" &>/dev/null; then while true; do - read -s -p "Linux 사용자 비밀번호: " LINUX_PW < /dev/tty - echo "" - - # 비밀번호 입력 확인 - if [ -z "$LINUX_PW" ]; then - echo "❌ 비밀번호를 입력해주세요 (빈 문자열 불가)." - continue - fi - - read -s -p "Linux 사용자 비밀번호 확인: " LINUX_PW_CONFIRM < /dev/tty - echo "" - - if [[ "$LINUX_PW" != "$LINUX_PW_CONFIRM" ]]; then - echo "❌ Linux 사용자 비밀번호가 일치하지 않습니다." - read -p "다시 입력하시겠습니까? (Y/n): " RETRY_PW < /dev/tty - RETRY_PW=${RETRY_PW:-N} - if [[ ! "$RETRY_PW" =~ ^[Yy]$ ]]; then - echo "" - read -p "스크립트를 다시 시작하시겠습니까? (Y/n): " RESTART_SCRIPT < /dev/tty - RESTART_SCRIPT=${RESTART_SCRIPT:-N} - if [[ "$RESTART_SCRIPT" =~ ^[Yy]$ ]]; then - exit 1 - else - echo "스크립트를 취소합니다." - exit 0 - fi - fi - else - break - fi + read_input "Linux 사용자 비밀번호: " LINUX_PW true + read_input "비밀번호 확인: " LINUX_PW_CONFIRM true + [ "$LINUX_PW" = "$LINUX_PW_CONFIRM" ] && break + echo "❌ 비밀번호 불일치" done - CREATE_USER=true + useradd -m -s /bin/bash "$LINUX_USER" + echo "$LINUX_USER:$LINUX_PW" | chpasswd + usermod -aG wheel "$LINUX_USER" + echo "✓ Linux 사용자 생성 완료" +else + echo "ℹ️ 기존 Linux 사용자 사용: $LINUX_USER" fi -# MariaDB 계정 설정 -read -p "MariaDB 계정을 Linux 계정과 동일하게 사용할까요? (Y/n): " SAME_ACCOUNT < /dev/tty +############################################ +# 3. DB 계정 설정 +############################################ +read_input "MariaDB 계정을 Linux 계정과 동일하게 사용할까요? (Y/n): " SAME_ACCOUNT SAME_ACCOUNT=${SAME_ACCOUNT:-Y} if [[ "$SAME_ACCOUNT" =~ ^[Yy]$ ]]; then DB_USER="$LINUX_USER" - if [ "$CREATE_USER" = true ]; then - DB_PW="$LINUX_PW" - else - # 기존 사용자의 경우 비밀번호 입력 - while true; do - read -s -p "MariaDB 비밀번호: " DB_PW < /dev/tty - echo "" - - # 비밀번호 입력 확인 - if [ -z "$DB_PW" ]; then - echo "❌ 비밀번호를 입력해주세요 (빈 문자열 불가)." - continue - fi - - read -s -p "MariaDB 비밀번호 확인: " DB_PW_CONFIRM < /dev/tty - echo "" - - if [[ "$DB_PW" != "$DB_PW_CONFIRM" ]]; then - echo "❌ MariaDB 비밀번호가 일치하지 않습니다." - read -p "다시 입력하시겠습니까? (Y/n): " RETRY_DB_PW < /dev/tty - RETRY_DB_PW=${RETRY_DB_PW:-N} - if [[ ! "$RETRY_DB_PW" =~ ^[Yy]$ ]]; then - echo "" - read -p "스크립트를 다시 시작하시겠습니까? (Y/n): " RESTART_SCRIPT2 < /dev/tty - RESTART_SCRIPT2=${RESTART_SCRIPT2:-N} - if [[ "$RESTART_SCRIPT2" =~ ^[Yy]$ ]]; then - exit 1 - else - echo "스크립트를 취소합니다." - exit 0 - fi - fi - else - break - fi - done - fi - echo "→ DB 사용자/비밀번호를 Linux 계정과 동일하게 사용합니다." + DB_PW="$LINUX_PW" else - read -p "MariaDB 사용자 이름: " DB_USER < /dev/tty - # MariaDB 사용자 비밀번호 입력 (재시도 옵션) + read_input "MariaDB 사용자 이름: " DB_USER while true; do - read -s -p "MariaDB 사용자 비밀번호: " DB_PW < /dev/tty - echo "" - - # 비밀번호 입력 확인 - if [ -z "$DB_PW" ]; then - echo "❌ 비밀번호를 입력해주세요 (빈 문자열 불가)." - continue - fi - - read -s -p "MariaDB 사용자 비밀번호 확인: " DB_PW_CONFIRM < /dev/tty - echo "" - - if [[ "$DB_PW" != "$DB_PW_CONFIRM" ]]; then - echo "❌ MariaDB 비밀번호가 일치하지 않습니다." - read -p "다시 입력하시겠습니까? (Y/n): " RETRY_DB_PW2 < /dev/tty - RETRY_DB_PW2=${RETRY_DB_PW2:-N} - if [[ ! "$RETRY_DB_PW2" =~ ^[Yy]$ ]]; then - echo "" - read -p "스크립트를 다시 시작하시겠습니까? (Y/n): " RESTART_SCRIPT3 < /dev/tty - RESTART_SCRIPT3=${RESTART_SCRIPT3:-N} - if [[ "$RESTART_SCRIPT3" =~ ^[Yy]$ ]]; then - exit 1 - else - echo "스크립트를 취소합니다." - exit 0 - fi - fi - else - break - fi + read_input "MariaDB 비밀번호: " DB_PW true + read_input "비밀번호 확인: " DB_PW_CONFIRM true + [ "$DB_PW" = "$DB_PW_CONFIRM" ] && break + echo "❌ 비밀번호 불일치" done fi -# MariaDB DB 이름을 사용자 이름과 동일하게 설정 DB_NAME="$DB_USER" -echo "" -echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" -echo "설정 요약:" -echo " Linux 사용자: $LINUX_USER" -echo " MariaDB 사용자: $DB_USER" -echo " MariaDB DB: $DB_NAME (사용자와 동일)" -echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" -echo "" - -# ------------------------------------------------- -# 4. Linux 사용자 생성 -# ------------------------------------------------- -if [ "$CREATE_USER" = true ]; then - if id "$LINUX_USER" &>/dev/null; then - echo "⚠️ 사용자 '$LINUX_USER'이(가) 이미 존재합니다 (생성 건너뜀)" - else - echo "Linux 사용자 생성 중..." - useradd -m -s /bin/bash "$LINUX_USER" || { echo "❌ 사용자 생성 실패"; exit 1; } - echo "$LINUX_USER:$LINUX_PW" | chpasswd || { echo "❌ 비밀번호 설정 실패"; exit 1; } - echo "✓ Linux 사용자 $LINUX_USER 생성 완료" - fi -fi - -# wheel 그룹 추가 (이미 포함된 경우 무시) -usermod -aG wheel "$LINUX_USER" 2>/dev/null || true - +############################################ +# 4. dotfiles +############################################ USER_HOME="/home/$LINUX_USER" +mkdir -p "$USER_HOME" -# ------------------------------------------------- -# 5. dotfiles 다운로드 (git에서) -# ------------------------------------------------- -echo "dotfiles 다운로드 중..." -if ! mkdir -p "$USER_HOME"; then - echo "❌ 홈 디렉토리 생성 실패: $USER_HOME" +curl -fsSL -o "$USER_HOME/.vimrc" "$DOTFILES_BASE_URL/dotfiles/vimrc" || true +curl -fsSL -o "/tmp/.bashrc_addon" "$DOTFILES_BASE_URL/dotfiles/bashrc_addon" || true + +if [ -f /tmp/.bashrc_addon ]; then + cat /tmp/.bashrc_addon >> "$USER_HOME/.bashrc" + rm -f /tmp/.bashrc_addon +fi + +chown -R "$LINUX_USER:$LINUX_USER" "$USER_HOME" + +############################################ +# 5. MariaDB 10.6.5 설치 (Archive Repo) +############################################ +echo "" +echo "▶ MariaDB 10.6.5 설치 중 (Archive Repo 고정)" + +# Rocky AppStream 완전 차단 +dnf module disable mariadb -y || true +dnf remove -y mariadb mariadb-server mariadb-libs 2>/dev/null || true + +cat > /etc/yum.repos.d/MariaDB.repo <<'EOF' +[mariadb] +name = MariaDB 10.6.5 Archive +baseurl = https://archive.mariadb.org/mariadb-10.6.5/yum/rocky9-amd64/ +gpgkey = https://archive.mariadb.org/PublicKey +gpgcheck = 1 +enabled = 1 +EOF + +dnf clean all +dnf makecache +dnf install -y MariaDB-server MariaDB-client + +systemctl enable --now mariadb + +############################################ +# 6. 버전 검증 (중요) +############################################ +MYSQL_VER=$(mysql --version) +echo "설치된 버전: $MYSQL_VER" + +if ! echo "$MYSQL_VER" | grep -q "10.6.5-MariaDB"; then + echo "❌ MariaDB 10.6.5가 아닙니다. 중단합니다." exit 1 fi -# .vimrc 다운로드 (기존 백업) -if [ -f "$USER_HOME/.vimrc" ]; then - cp "$USER_HOME/.vimrc" "$USER_HOME/.vimrc.bak" -fi -curl -fsSL -o "$USER_HOME/.vimrc" "$DOTFILES_BASE_URL/dotfiles/vimrc" 2>/dev/null || echo "⚠️ .vimrc 다운로드 실패" - -# .bashrc_addon 다운로드 -if curl -fsSL -o "/tmp/.bashrc_addon" "$DOTFILES_BASE_URL/dotfiles/bashrc_addon" 2>/dev/null; then - # 기존 .bashrc 백업 - if [ -f "$USER_HOME/.bashrc" ]; then - cp "$USER_HOME/.bashrc" "$USER_HOME/.bashrc.bak" - fi - - # 중복 추가 방지: 기존 설정에서 addon 제거 후 다시 추가 - if [ -f "$USER_HOME/.bashrc" ]; then - grep -v "$(head -1 /tmp/.bashrc_addon 2>/dev/null || echo 'NEVER_MATCH')" "$USER_HOME/.bashrc" > "$USER_HOME/.bashrc.tmp" 2>/dev/null || cp "$USER_HOME/.bashrc" "$USER_HOME/.bashrc.tmp" - mv "$USER_HOME/.bashrc.tmp" "$USER_HOME/.bashrc" - fi - - cat "/tmp/.bashrc_addon" >> "$USER_HOME/.bashrc" - rm "/tmp/.bashrc_addon" - echo "✓ Bash 설정 병합 완료" -else - echo "⚠️ .bashrc_addon 다운로드 실패" -fi - -chown "$LINUX_USER:$LINUX_USER" "$USER_HOME/.vimrc" "$USER_HOME/.bashrc" 2>/dev/null || true - -# ------------------------------------------------- -# 6. MariaDB 10.6 설치 -# ------------------------------------------------- -echo "MariaDB 10.6 설치 중..." -dnf module reset mariadb -y 2>/dev/null || true - -# MariaDB 모듈 활성화 (실패 시 일반 설치 시도) -if ! dnf module enable mariadb:10.6 -y 2>/dev/null; then - echo "⚠️ MariaDB 10.6 모듈이 없습니다. 기본 MariaDB를 설치합니다..." -fi - -dnf install -y mariadb-server || { echo "❌ MariaDB 설치 실패"; exit 1; } - -systemctl enable --now mariadb || { echo "❌ MariaDB 서비스 활성화 실패"; exit 1; } -echo "✓ MariaDB 서비스 활성화 완료" - -# MariaDB 실행 대기 -sleep 2 -if ! systemctl is-active --quiet mariadb; then - echo "❌ MariaDB 서비스가 실행 중이 아닙니다" - systemctl status mariadb - exit 1 -fi - -# ------------------------------------------------- +############################################ # 7. MariaDB 보안 초기화 -# ------------------------------------------------- -echo "MariaDB 보안 초기화 중..." -mysql -u root </dev/null || echo 0) +GRANT ALL PRIVILEGES ON \`$DB_NAME\`.* TO '$DB_USER'@'%'; +GRANT ALL PRIVILEGES ON \`$DB_NAME\`.* TO '$DB_USER'@'localhost'; -if [ "$EXISTING_USER" -gt 0 ]; then - echo "⚠️ DB 사용자 '$DB_USER'이(가) 이미 존재합니다." - read -p "기존 사용자의 비밀번호를 변경하시겠습니까? (Y/n): " UPDATE_PW < /dev/tty - UPDATE_PW=${UPDATE_PW:-N} - if [[ "$UPDATE_PW" =~ ^[Yy]$ ]]; then - mysql -u root < /etc/my.cnf.d/50-server.cnf </dev/null || true -systemctl start firewalld 2>/dev/null || true -firewall-cmd --permanent --add-port=3306/tcp 2>/dev/null || echo "⚠️ Firewall 설정 실패 (선택사항)" -firewall-cmd --reload 2>/dev/null || true -echo "✓ Firewall 설정 완료" - -# ------------------------------------------------- -# 11. 최종 확인 및 완료 메시지 -# ------------------------------------------------- +############################################ +# 10. 완료 +############################################ echo "" -echo "=== 최종 상태 확인 중... ===" -if ! systemctl is-active --quiet mariadb; then - echo "❌ MariaDB 서비스가 실행 중이 아닙니다" - exit 1 -fi - +echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" +echo "✅ MariaDB 10.6.5 설치 및 설정 완료" +echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" +echo "Linux 사용자 : $LINUX_USER" +echo "DB 사용자 : $DB_USER" +echo "DB 이름 : $DB_NAME" +echo "MariaDB 버전 : 10.6.5 (고정)" echo "" -echo "✅ MariaDB 설정 완료!" -echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" -echo "Linux 사용자: $LINUX_USER" -echo "DB 사용자: $DB_USER" -echo "DB 이름: $DB_NAME" -echo "바인드 주소: 0.0.0.0 (모든 인터페이스)" -echo "포트: 3306" -echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" -echo "" -echo "📋 VM에서 연결 문자열:" +echo "접속 예시:" echo " mysql -h -u $DB_USER -p" echo "" -echo "📝 LXC IP 확인 (Proxmox에서):" -echo " pct exec 201 ip addr show eth0 | grep inet"