Files
cafe24-testserver/lxc/setup_mariadb.sh

291 lines
10 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에서 다운로드
set -euo pipefail
# dotfiles 저장소
DOTFILES_BASE_URL="https://git.siane.kr/firstgarden/cafe24-testserver/raw/branch/main"
# 오류 처리 함수
cleanup() {
EXIT_CODE=$?
if [ $EXIT_CODE -ne 0 ]; then
echo ""
echo "❌ MariaDB 설정 중 에러 발생 ($EXIT_CODE)"
echo "부분적으로 설정된 데이터가 있을 수 있습니다."
echo "다시 실행할 때 기존 사용자/데이터베이스는 건너뛰어집니다."
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'이(가) 이미 존재합니다."
read -p "기존 사용자를 사용하시겠습니까? (Y/n): " USE_EXISTING
USE_EXISTING=${USE_EXISTING:-Y}
if [[ ! "$USE_EXISTING" =~ ^[Yy]$ ]]; then
echo "❌ 다른 사용자명을 입력하세요."
exit 1
fi
fi
# 비밀번호 입력 (기존 사용자인 경우 생략 가능)
if ! id "$LINUX_USER" &>/dev/null; then
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 " 기존 사용자를 사용합니다: $LINUX_USER"
CREATE_USER=false
LINUX_PW=""
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
read -p "MariaDB DB 이름: " DB_NAME
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"