346 lines
13 KiB
Bash
346 lines
13 KiB
Bash
#!/bin/bash
|
||
# Rocky Linux 9 LXC - MariaDB 설치 및 초기 설정
|
||
# 오류 발생 시 초기화 옵션 제공, 중복 사용자 처리 포함
|
||
# root 계정에서 실행
|
||
# Linux / DB 계정 통합 여부 선택 가능
|
||
# dotfiles는 git에서 다운로드
|
||
|
||
set -euo pipefail
|
||
|
||
# dotfiles 저장소
|
||
DOTFILES_BASE_URL="https://git.siane.kr/firstgarden/cafe24-testserver/raw/branch/main"
|
||
|
||
# 전역 변수
|
||
LINUX_USER=""
|
||
DB_USER=""
|
||
|
||
# 오류 처리 및 초기화 함수
|
||
cleanup() {
|
||
EXIT_CODE=$?
|
||
if [ $EXIT_CODE -ne 0 ]; then
|
||
echo ""
|
||
echo "❌ MariaDB 설정 중 에러 발생 ($EXIT_CODE)"
|
||
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
||
echo ""
|
||
|
||
if [ -n "$LINUX_USER" ]; then
|
||
read -p "초기화하고 다시 시작하시겠습니까? (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
|
||
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 -p "Linux 사용자 이름: " LINUX_USER
|
||
|
||
# 사용자 존재 확인 및 재생성 옵션
|
||
if id "$LINUX_USER" &>/dev/null; then
|
||
echo "⚠️ 사용자 '$LINUX_USER'이(가) 이미 존재합니다."
|
||
echo ""
|
||
echo "선택 사항:"
|
||
echo " 1) 기존 사용자 사용 (비밀번호는 변경하지 않음)"
|
||
echo " 2) 사용자 삭제 후 재생성 (홈 디렉토리 포함 삭제)"
|
||
echo ""
|
||
read -p "선택 (1 또는 2): " USER_ACTION
|
||
|
||
case $USER_ACTION in
|
||
2)
|
||
read -p "정말로 '$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' 삭제 완료"
|
||
|
||
# 새 비밀번호 입력
|
||
read -s -p "새로운 Linux 사용자 비밀번호: " LINUX_PW
|
||
echo ""
|
||
read -s -p "Linux 사용자 비밀번호 확인: " LINUX_PW_CONFIRM
|
||
echo ""
|
||
|
||
if [[ "$LINUX_PW" != "$LINUX_PW_CONFIRM" ]]; then
|
||
echo "❌ Linux 사용자 비밀번호가 일치하지 않습니다."
|
||
exit 1
|
||
fi
|
||
CREATE_USER=true
|
||
else
|
||
echo "❌ 사용자 삭제를 취소했습니다. 다른 사용자명을 입력하세요."
|
||
exit 1
|
||
fi
|
||
;;
|
||
1|*)
|
||
echo "ℹ️ 기존 사용자를 사용합니다: $LINUX_USER"
|
||
CREATE_USER=false
|
||
LINUX_PW=""
|
||
;;
|
||
esac
|
||
else
|
||
# 새 사용자 생성
|
||
read -s -p "Linux 사용자 비밀번호: " LINUX_PW
|
||
echo ""
|
||
read -s -p "Linux 사용자 비밀번호 확인: " LINUX_PW_CONFIRM
|
||
echo ""
|
||
|
||
if [[ "$LINUX_PW" != "$LINUX_PW_CONFIRM" ]]; then
|
||
echo "❌ Linux 사용자 비밀번호가 일치하지 않습니다."
|
||
exit 1
|
||
fi
|
||
CREATE_USER=true
|
||
fi
|
||
|
||
# -------------------------------------------------
|
||
# 3. MariaDB 계정을 동일하게 사용할지 여부
|
||
# -------------------------------------------------
|
||
read -p "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
|
||
read -s -p "MariaDB 비밀번호: " DB_PW
|
||
echo ""
|
||
fi
|
||
echo "→ DB 사용자/비밀번호를 Linux 계정과 동일하게 사용합니다."
|
||
else
|
||
read -p "MariaDB 사용자 이름: " DB_USER
|
||
read -s -p "MariaDB 사용자 비밀번호: " DB_PW
|
||
echo ""
|
||
read -s -p "MariaDB 사용자 비밀번호 확인: " DB_PW_CONFIRM
|
||
echo ""
|
||
|
||
if [[ "$DB_PW" != "$DB_PW_CONFIRM" ]]; then
|
||
echo "❌ MariaDB 비밀번호가 일치하지 않습니다."
|
||
exit 1
|
||
fi
|
||
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
|
||
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"
|