Files
cafe24-testserver/lxc/setup_mariadb.sh

457 lines
17 KiB
Bash
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/bin/bash
# Rocky Linux 9 LXC - MariaDB 설치 및 초기 설정
# 오류 발생 시 초기화 옵션 제공, 중복 사용자 처리 포함
# root 계정에서 실행
# Linux / DB 계정 통합 여부 선택 가능
# dotfiles는 git에서 다운로드
# 파이프 실행 지원 (curl | bash)
set -euo pipefail
# dotfiles 저장소
DOTFILES_BASE_URL="https://git.siane.kr/firstgarden/cafe24-testserver/raw/branch/main"
# 전역 변수
LINUX_USER=""
DB_USER=""
# 터미널 입력 헬퍼 함수
# curl | bash로 실행할 때 /dev/tty에서 입력을 받도록 함
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
else
read -p "$prompt" "$var_name" < /dev/tty
fi
}
# 오류 처리 및 초기화 함수
cleanup() {
EXIT_CODE=$?
if [ $EXIT_CODE -ne 0 ]; then
echo ""
echo "❌ MariaDB 설정 중 에러 발생 ($EXIT_CODE)"
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
echo ""
# LINUX_USER가 설정되어 있으면 초기화 옵션 제공
if [ -n "$LINUX_USER" ]; then
read_input "초기화하고 다시 시작하시겠습니까? (y/n): " REINIT
if [[ "$REINIT" =~ ^[Yy]$ ]]; then
echo ""
echo "⚠️ $LINUX_USER 사용자 및 관련 설정을 초기화합니다..."
# MariaDB 사용자 삭제
if [ -n "$DB_USER" ]; then
mysql -u root -e "DROP USER IF EXISTS '$DB_USER'@'%';" 2>/dev/null || true
echo "✓ MariaDB 사용자 삭제 완료"
fi
# Linux 사용자 홈 디렉토리 포함 삭제
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
echo ""
echo "초기화가 완료되었습니다. 스크립트를 다시 실행하세요."
else
echo "초기화를 건너뜁니다. 수동으로 정리 후 다시 진행하세요."
fi
else
echo "스크립트를 다시 실행해 주세요."
fi
fi
exit $EXIT_CODE
}
trap cleanup EXIT
echo "=== LXC MariaDB 초기 세팅 시작 ==="
echo ""
# -------------------------------------------------
# 0. Timezone 설정
# -------------------------------------------------
timedatectl set-timezone Asia/Seoul
echo "✓ Timezone: Asia/Seoul"
# -------------------------------------------------
# 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 "✓ 필수 패키지 설치 완료"
# -------------------------------------------------
# 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:-Y}
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
# 새 사용자 생성 (비밀번호 입력)
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:-Y}
if [[ ! "$RETRY_PW" =~ ^[Yy]$ ]]; then
echo ""
read -p "스크립트를 다시 시작하시겠습니까? (Y/n): " RESTART_SCRIPT < /dev/tty
RESTART_SCRIPT=${RESTART_SCRIPT:-Y}
if [[ "$RESTART_SCRIPT" =~ ^[Yy]$ ]]; then
exit 1
else
echo "스크립트를 취소합니다."
exit 0
fi
fi
else
break
fi
done
CREATE_USER=true
fi
# MariaDB 계정 설정
read -p "MariaDB 계정을 Linux 계정과 동일하게 사용할까요? (Y/n): " SAME_ACCOUNT < /dev/tty
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:-Y}
if [[ ! "$RETRY_DB_PW" =~ ^[Yy]$ ]]; then
echo ""
read -p "스크립트를 다시 시작하시겠습니까? (Y/n): " RESTART_SCRIPT2 < /dev/tty
RESTART_SCRIPT2=${RESTART_SCRIPT2:-Y}
if [[ "$RESTART_SCRIPT2" =~ ^[Yy]$ ]]; then
exit 1
else
echo "스크립트를 취소합니다."
exit 0
fi
fi
else
break
fi
done
fi
echo "→ DB 사용자/비밀번호를 Linux 계정과 동일하게 사용합니다."
else
read -p "MariaDB 사용자 이름: " DB_USER < /dev/tty
# MariaDB 사용자 비밀번호 입력 (재시도 옵션)
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:-Y}
if [[ ! "$RETRY_DB_PW2" =~ ^[Yy]$ ]]; then
echo ""
read -p "스크립트를 다시 시작하시겠습니까? (Y/n): " RESTART_SCRIPT3 < /dev/tty
RESTART_SCRIPT3=${RESTART_SCRIPT3:-Y}
if [[ "$RESTART_SCRIPT3" =~ ^[Yy]$ ]]; then
exit 1
else
echo "스크립트를 취소합니다."
exit 0
fi
fi
else
break
fi
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
USER_HOME="/home/$LINUX_USER"
# -------------------------------------------------
# 5. dotfiles 다운로드 (git에서)
# -------------------------------------------------
echo "dotfiles 다운로드 중..."
if ! mkdir -p "$USER_HOME"; then
echo "❌ 홈 디렉토리 생성 실패: $USER_HOME"
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
dnf module enable mariadb:10.6 -y || { echo "❌ MariaDB 10.6 활성화 실패"; exit 1; }
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 <<MYSQL_INIT
DELETE FROM mysql.user WHERE User='';
DELETE FROM mysql.user WHERE User='root' AND Host NOT IN ('localhost', '127.0.0.1', '::1');
DROP DATABASE IF EXISTS test;
DELETE FROM mysql.db WHERE Db='test' OR Db='test\\_%';
FLUSH PRIVILEGES;
MYSQL_INIT
echo "✓ MariaDB 보안 초기화 완료"
# -------------------------------------------------
# 8. DB 사용자 및 데이터베이스 생성
# -------------------------------------------------
echo "DB 사용자 및 데이터베이스 생성 중..."
# 기존 사용자 확인
EXISTING_USER=$(mysql -u root -se "SELECT COUNT(*) FROM mysql.user WHERE User='$DB_USER';" 2>/dev/null || echo 0)
if [ "$EXISTING_USER" -gt 0 ]; then
echo "⚠️ DB 사용자 '$DB_USER'이(가) 이미 존재합니다."
read -p "기존 사용자의 비밀번호를 변경하시겠습니까? (Y/n): " UPDATE_PW < /dev/tty
UPDATE_PW=${UPDATE_PW:-Y}
if [[ "$UPDATE_PW" =~ ^[Yy]$ ]]; then
mysql -u root <<MYSQL_UPDATE
ALTER USER '$DB_USER'@'%' IDENTIFIED BY '$DB_PW';
FLUSH PRIVILEGES;
MYSQL_UPDATE
echo "✓ 비밀번호 업데이트 완료"
fi
else
mysql -u root <<MYSQL_CREATE
CREATE USER '$DB_USER'@'%' IDENTIFIED BY '$DB_PW';
GRANT ALL PRIVILEGES ON $DB_NAME.* TO '$DB_USER'@'%';
CREATE DATABASE IF NOT EXISTS $DB_NAME CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
FLUSH PRIVILEGES;
MYSQL_CREATE
echo "✓ DB 사용자 및 데이터베이스 생성 완료"
fi
# -------------------------------------------------
# 9. MariaDB 외부 접속 허용 설정
# -------------------------------------------------
echo "MariaDB 외부 접속 허용 설정 중..."
# 기존 설정 파일 백업
if [ -f /etc/my.cnf.d/50-server.cnf ]; then
cp /etc/my.cnf.d/50-server.cnf /etc/my.cnf.d/50-server.cnf.bak
echo " 기존 설정을 백업했습니다"
fi
cat > /etc/my.cnf.d/50-server.cnf <<EOF
[mysqld]
bind-address = 0.0.0.0
port = 3306
max_connections = 100
EOF
systemctl restart mariadb || { echo "❌ MariaDB 재시작 실패"; exit 1; }
echo "✓ MariaDB 외부 접속 허용 설정 완료"
# -------------------------------------------------
# 10. Firewall 설정 (3306 포트 개방)
# -------------------------------------------------
echo "Firewall 설정 중..."
systemctl enable firewalld 2>/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. 최종 확인 및 완료 메시지
# -------------------------------------------------
echo ""
echo "=== 최종 상태 확인 중... ==="
if ! systemctl is-active --quiet mariadb; then
echo "❌ MariaDB 서비스가 실행 중이 아닙니다"
exit 1
fi
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 " mysql -h <LXC_IP> -u $DB_USER -p"
echo ""
echo "📝 LXC IP 확인 (Proxmox에서):"
echo " pct exec 201 ip addr show eth0 | grep inet"