오류 처리 및 중복 설정 처리 기능 추가 (모든 스크립트)
This commit is contained in:
@ -1,43 +1,79 @@
|
||||
#!/bin/bash
|
||||
# Rocky Linux 9 LXC - MariaDB 설치 및 초기 설정
|
||||
# 오류 처리: 중단 시 부분 설정 방지, 중복 사용자 처리 포함
|
||||
# root 계정에서 실행
|
||||
# Linux / DB 계정 통합 여부 선택 가능
|
||||
# dotfiles는 git에서 다운로드
|
||||
|
||||
set -e
|
||||
set -euo pipefail
|
||||
|
||||
# dotfiles 저장소
|
||||
# Gitea raw 파일 경로: https://git.siane.kr/firstgarden/cafe24-testserver/raw/branch/main/...
|
||||
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 set to Asia/Seoul"
|
||||
echo "✓ Timezone: Asia/Seoul"
|
||||
|
||||
# -------------------------------------------------
|
||||
# 1. 필수 패키지 사전 설치
|
||||
# -------------------------------------------------
|
||||
dnf update -y
|
||||
dnf install -y sudo vim wget curl
|
||||
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 사용자 비밀번호가 일치하지 않습니다."
|
||||
echo "❌ Linux 사용자 비밀번호가 일치하지 않습니다."
|
||||
exit 1
|
||||
fi
|
||||
CREATE_USER=true
|
||||
else
|
||||
echo "ℹ️ 기존 사용자를 사용합니다: $LINUX_USER"
|
||||
CREATE_USER=false
|
||||
LINUX_PW=""
|
||||
fi
|
||||
|
||||
# -------------------------------------------------
|
||||
# 3. MariaDB 계정을 동일하게 사용할지 여부
|
||||
@ -47,7 +83,12 @@ 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
|
||||
@ -64,16 +105,31 @@ 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 ! id "$LINUX_USER" &>/dev/null; then
|
||||
useradd -m -s /bin/bash "$LINUX_USER"
|
||||
echo "$LINUX_USER:$LINUX_PW" | chpasswd
|
||||
echo "Linux 사용자 $LINUX_USER 생성 완료"
|
||||
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
|
||||
|
||||
usermod -aG wheel "$LINUX_USER"
|
||||
# wheel 그룹 추가 (이미 포함된 경우 무시)
|
||||
usermod -aG wheel "$LINUX_USER" 2>/dev/null || true
|
||||
|
||||
USER_HOME="/home/$LINUX_USER"
|
||||
|
||||
@ -81,33 +137,62 @@ USER_HOME="/home/$LINUX_USER"
|
||||
# 5. dotfiles 다운로드 (git에서)
|
||||
# -------------------------------------------------
|
||||
echo "dotfiles 다운로드 중..."
|
||||
curl -fsSL -o "$USER_HOME/.vimrc" "$DOTFILES_BASE_URL/dotfiles/vimrc"
|
||||
curl -fsSL -o "$USER_HOME/.bashrc_addon" "$DOTFILES_BASE_URL/dotfiles/bashrc_addon"
|
||||
if ! mkdir -p "$USER_HOME"; then
|
||||
echo "❌ 홈 디렉토리 생성 실패: $USER_HOME"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# 기존 .bashrc 백업 및 추가 설정 적용
|
||||
# .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
|
||||
|
||||
# 새 설정 추가
|
||||
cat "$USER_HOME/.bashrc_addon" >> "$USER_HOME/.bashrc"
|
||||
rm "$USER_HOME/.bashrc_addon"
|
||||
# 중복 추가 방지: 기존 설정에서 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
|
||||
|
||||
chown "$LINUX_USER:$LINUX_USER" "$USER_HOME/.vimrc" "$USER_HOME/.bashrc" "$USER_HOME/.bashrc.bak" 2>/dev/null || true
|
||||
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
|
||||
dnf module enable mariadb:10.6 -y
|
||||
dnf install -y mariadb-server
|
||||
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
|
||||
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');
|
||||
@ -116,21 +201,48 @@ 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 IF NOT EXISTS '$DB_USER'@'%' IDENTIFIED BY '$DB_PW';
|
||||
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
|
||||
@ -138,30 +250,41 @@ port = 3306
|
||||
max_connections = 100
|
||||
EOF
|
||||
|
||||
systemctl restart mariadb
|
||||
systemctl restart mariadb || { echo "❌ MariaDB 재시작 실패"; exit 1; }
|
||||
echo "✓ MariaDB 외부 접속 허용 설정 완료"
|
||||
|
||||
# -------------------------------------------------
|
||||
# 10. Firewall 설정 (3306 포트 개방)
|
||||
# -------------------------------------------------
|
||||
echo "Firewall 설정 중..."
|
||||
systemctl enable firewalld
|
||||
systemctl start firewalld
|
||||
firewall-cmd --permanent --add-port=3306/tcp
|
||||
firewall-cmd --reload
|
||||
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. 완료 메시지
|
||||
# 11. 최종 확인 및 완료 메시지
|
||||
# -------------------------------------------------
|
||||
echo ""
|
||||
echo "=========================================="
|
||||
echo "=== MariaDB 설정 완료 ==="
|
||||
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 "📋 VM에서 연결 문자열:"
|
||||
echo " mysql -h <LXC_IP> -u $DB_USER -p"
|
||||
echo "=========================================="
|
||||
echo ""
|
||||
echo "📝 LXC IP 확인 (Proxmox에서):"
|
||||
echo " pct exec 201 ip addr show eth0 | grep inet"
|
||||
|
||||
@ -1,34 +1,94 @@
|
||||
#!/bin/bash
|
||||
# PHP 설치 스크립트 (Rocky Linux 9)
|
||||
# 오류 처리: 실패 시 롤백, 중복 설정 처리 포함
|
||||
# 현재 사용자 계정 기준으로 PHP-FPM pool 생성
|
||||
# 사용법: ./install_php.sh 8.2 또는 8.4
|
||||
|
||||
set -euo pipefail
|
||||
|
||||
PHP_VERSION=$1
|
||||
if [[ -z "$PHP_VERSION" ]]; then
|
||||
echo "사용법: $0 <PHP_VERSION> (예: 8.2 또는 8.4)"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# 지원 버전 확인
|
||||
if [[ ! "$PHP_VERSION" =~ ^(8\.[2-9]|9\.[0-9])$ ]]; then
|
||||
echo "❌ 지원하지 않는 PHP 버전: $PHP_VERSION"
|
||||
echo "지원 버전: 8.2, 8.3, 8.4, 9.0 이상"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# 현재 사용자 계정 및 홈
|
||||
WEB_USER=$USER
|
||||
WEB_HOME=$(eval echo "~$WEB_USER")
|
||||
WEB_ROOT="$WEB_HOME/www"
|
||||
|
||||
# 오류 처리 함수
|
||||
cleanup() {
|
||||
EXIT_CODE=$?
|
||||
if [ $EXIT_CODE -ne 0 ]; then
|
||||
echo "❌ PHP 설치 중 에러 발생 ($EXIT_CODE)"
|
||||
echo "변경사항이 부분적으로 적용되었을 수 있습니다."
|
||||
echo "다시 실행하면 기존 설정을 덮어씁니다."
|
||||
fi
|
||||
exit $EXIT_CODE
|
||||
}
|
||||
|
||||
trap cleanup EXIT
|
||||
|
||||
echo "설치 사용자: $WEB_USER"
|
||||
echo "웹 루트: $WEB_ROOT"
|
||||
echo "설치 PHP 버전: $PHP_VERSION"
|
||||
echo ""
|
||||
|
||||
# Remi 저장소 설치
|
||||
sudo dnf install -y https://rpms.remirepo.net/enterprise/remi-release-9.rpm
|
||||
sudo dnf module reset php -y
|
||||
sudo dnf module enable php:remi-$PHP_VERSION -y
|
||||
# 사전 확인: 이미 설치된 경우
|
||||
FPM_POOL="/etc/php-fpm.d/$WEB_USER.conf"
|
||||
if [ -f "$FPM_POOL" ]; then
|
||||
echo "⚠️ ${WEB_USER}의 PHP-FPM pool이 이미 존재합니다."
|
||||
read -p "기존 설정을 덮어쓰고 진행하시겠습니까? (y/n) " -n 1 -r
|
||||
echo
|
||||
if [[ ! $REPLY =~ ^[Yy]$ ]]; then
|
||||
echo "설정 업데이트를 건너뜁니다."
|
||||
exit 0
|
||||
fi
|
||||
echo "기존 pool 설정을 백업합니다..."
|
||||
sudo cp "$FPM_POOL" "${FPM_POOL}.bak.$(date +%s)"
|
||||
fi
|
||||
|
||||
# Remi 저장소 설치 (이미 설치된 경우 재설치하지 않음)
|
||||
if ! rpm -q remi-release 2>/dev/null; then
|
||||
echo "Remi 저장소 설치 중..."
|
||||
sudo dnf install -y https://rpms.remirepo.net/enterprise/remi-release-9.rpm || { echo "❌ Remi 저장소 설치 실패"; exit 1; }
|
||||
else
|
||||
echo "ℹ️ Remi 저장소가 이미 설치되어 있습니다"
|
||||
fi
|
||||
|
||||
# PHP 버전 설정
|
||||
echo "PHP $PHP_VERSION 모듈 활성화 중..."
|
||||
sudo dnf module reset php -y 2>/dev/null || true
|
||||
sudo dnf module enable php:remi-$PHP_VERSION -y || { echo "❌ PHP $PHP_VERSION 활성화 실패"; exit 1; }
|
||||
|
||||
# PHP 및 필수 모듈 설치 (NTS 빌드)
|
||||
sudo dnf install -y php php-cli php-fpm php-mysqlnd php-pdo php-mbstring php-xml php-gd php-curl php-opcache \
|
||||
php-soap php-intl php-zip php-bcmath php-bz2 php-imagick
|
||||
echo "PHP 패키지 설치 중..."
|
||||
PACKAGES="php php-cli php-fpm php-mysqlnd php-pdo php-mbstring php-xml php-gd php-curl php-opcache php-soap php-intl php-zip php-bcmath php-bz2 php-imagick"
|
||||
|
||||
for pkg in $PACKAGES; do
|
||||
if ! sudo dnf install -y "$pkg" 2>/dev/null; then
|
||||
echo "⚠️ $pkg 설치 실패 (선택사항 건너뜀)"
|
||||
fi
|
||||
done
|
||||
|
||||
# PHP 설치 확인
|
||||
if ! command -v php &>/dev/null; then
|
||||
echo "❌ PHP 설치 실패"
|
||||
exit 1
|
||||
fi
|
||||
PHP_INSTALLED=$(php -r 'echo phpversion();')
|
||||
echo "✓ PHP $PHP_INSTALLED 설치 완료"
|
||||
|
||||
# PHP-FPM pool 생성 (사용자 계정 기준)
|
||||
FPM_POOL="/etc/php-fpm.d/$WEB_USER.conf"
|
||||
echo "PHP-FPM pool 설정 중..."
|
||||
sudo bash -c "cat > $FPM_POOL" <<EOF
|
||||
[$WEB_USER]
|
||||
user = $WEB_USER
|
||||
@ -46,9 +106,38 @@ php_value[display_errors] = Off
|
||||
php_value[error_reporting] = E_ALL & ~E_DEPRECATED & ~E_STRICT
|
||||
EOF
|
||||
|
||||
echo "✓ PHP-FPM pool 설정 파일 생성 완료: $FPM_POOL"
|
||||
|
||||
# PHP-FPM 서비스 활성화 및 재시작
|
||||
sudo systemctl enable --now php-fpm
|
||||
sudo systemctl restart php-fpm
|
||||
echo "PHP-FPM 서비스 재시작 중..."
|
||||
sudo systemctl enable --now php-fpm 2>/dev/null || { echo "❌ PHP-FPM 활성화 실패"; exit 1; }
|
||||
sudo systemctl restart php-fpm || { echo "❌ PHP-FPM 재시작 실패"; exit 1; }
|
||||
|
||||
# 서비스 상태 확인
|
||||
if ! sudo systemctl is-active --quiet php-fpm; then
|
||||
echo "❌ PHP-FPM 서비스가 실행 중이 아닙니다"
|
||||
sudo systemctl status php-fpm
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Socket 파일 확인
|
||||
SOCKET="/run/php-fpm/$WEB_USER.sock"
|
||||
if [ ! -S "$SOCKET" ]; then
|
||||
echo "❌ PHP-FPM socket 파일이 생성되지 않았습니다: $SOCKET"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo ""
|
||||
echo "✅ PHP $PHP_INSTALLED 설치 완료!"
|
||||
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
||||
echo "✓ PHP-FPM pool: $FPM_POOL"
|
||||
echo "✓ PHP-FPM socket: $SOCKET"
|
||||
echo ""
|
||||
echo "📋 다음 단계:"
|
||||
echo " 1. Apache 재시작: sudo systemctl restart httpd"
|
||||
echo " 2. PHP 정보 확인: php -v"
|
||||
echo " 3. PHP-FPM 상태: sudo systemctl status php-fpm"
|
||||
echo " 4. 웹 접속 및 테스트"
|
||||
|
||||
# Apache와 PHP-FPM 연동 설정 (setup_common.sh에서 이미 설정됨)
|
||||
# Apache 재시작
|
||||
|
||||
@ -1,34 +1,81 @@
|
||||
#!/bin/bash
|
||||
# 테스트 서버용 공통 설치 스크립트 (Rocky Linux 9)
|
||||
# 오류 처리: 실패 시 변경사항 롤백, 중복 설정 처리 포함
|
||||
# Tailscale 호환, 외부 미노출 아님, 최소 권한, Apache + FTP + Vim + Bash 설정
|
||||
# 홈 디렉토리 권한 문제 해결 포함
|
||||
|
||||
set -euo pipefail
|
||||
|
||||
WEB_USER=$USER
|
||||
WEB_HOME=$(eval echo "~$WEB_USER")
|
||||
WEB_ROOT="$WEB_HOME/www"
|
||||
|
||||
# 오류 처리 함수
|
||||
cleanup() {
|
||||
EXIT_CODE=$?
|
||||
if [ $EXIT_CODE -ne 0 ]; then
|
||||
echo "❌ 에러 발생 ($EXIT_CODE). 변경사항을 롤백합니다..."
|
||||
|
||||
# 설치된 패키지 및 서비스 복원
|
||||
echo "Apache 설정 롤백 중..."
|
||||
sudo rm -f /etc/httpd/conf.d/${WEB_USER}.conf
|
||||
sudo rm -f /etc/httpd/conf.modules.d/10-php-${WEB_USER}.conf
|
||||
|
||||
# 설정 파일 복원
|
||||
sudo systemctl restart httpd 2>/dev/null || true
|
||||
|
||||
echo "변경사항이 롤백되었습니다. 처음부터 다시 실행하세요."
|
||||
fi
|
||||
exit $EXIT_CODE
|
||||
}
|
||||
|
||||
trap cleanup EXIT
|
||||
|
||||
echo "설치 사용자: $WEB_USER"
|
||||
echo "웹 루트: $WEB_ROOT"
|
||||
|
||||
# 1. 시스템 업데이트
|
||||
sudo dnf update -y
|
||||
# 사전 확인: 이미 설정된 경우
|
||||
if [ -f "/etc/httpd/conf.d/${WEB_USER}.conf" ]; then
|
||||
echo "⚠️ ${WEB_USER}의 Apache 설정이 이미 존재합니다."
|
||||
read -p "기존 설정을 삭제하고 진행하시겠습니까? (y/n) " -n 1 -r
|
||||
echo
|
||||
if [[ $REPLY =~ ^[Yy]$ ]]; then
|
||||
echo "기존 설정을 삭제합니다..."
|
||||
sudo rm -f /etc/httpd/conf.d/${WEB_USER}.conf
|
||||
sudo rm -f /etc/httpd/conf.modules.d/10-php-${WEB_USER}.conf
|
||||
else
|
||||
echo "설정을 건너뜁니다."
|
||||
fi
|
||||
fi
|
||||
|
||||
# 2. firewalld 비활성화
|
||||
sudo systemctl stop firewalld
|
||||
sudo systemctl disable firewalld
|
||||
echo "firewalld 비활성화 완료"
|
||||
# 1. 시스템 업데이트
|
||||
echo "시스템 업데이트 중..."
|
||||
sudo dnf update -y || { echo "❌ dnf update 실패"; exit 1; }
|
||||
|
||||
# 2. firewalld 비활성화 (이미 비활성화된 경우 무시)
|
||||
sudo systemctl stop firewalld 2>/dev/null || true
|
||||
sudo systemctl disable firewalld 2>/dev/null || true
|
||||
echo "✓ firewalld 비활성화 완료"
|
||||
|
||||
# 3. 홈 디렉토리 권한 조정 (Apache가 진입 가능하도록)
|
||||
chmod 711 "$WEB_HOME"
|
||||
|
||||
# 4. www 폴더 생성, 소유자/권한 제한
|
||||
if [ ! -d "$WEB_ROOT" ]; then
|
||||
mkdir -p "$WEB_ROOT"
|
||||
chmod 750 "$WEB_ROOT"
|
||||
chown $WEB_USER:$WEB_USER "$WEB_ROOT"
|
||||
echo "✓ 웹 루트 디렉토리 생성 완료"
|
||||
else
|
||||
echo "ℹ️ 웹 루트 디렉토리가 이미 존재합니다"
|
||||
fi
|
||||
|
||||
# 5. Apache 설치
|
||||
sudo dnf install -y httpd
|
||||
sudo systemctl enable --now httpd
|
||||
if ! command -v httpd &>/dev/null; then
|
||||
echo "Apache 설치 중..."
|
||||
sudo dnf install -y httpd || { echo "❌ Apache 설치 실패"; exit 1; }
|
||||
fi
|
||||
sudo systemctl enable --now httpd || { echo "❌ Apache 서비스 활성화 실패"; exit 1; }
|
||||
echo "✓ Apache 활성화 완료"
|
||||
|
||||
# Apache DocumentRoot 및 PHP-FPM 설정
|
||||
APACHE_CONF="/etc/httpd/conf.d/${WEB_USER}.conf"
|
||||
@ -70,72 +117,103 @@ sudo bash -c "cat > $APACHE_CONF" <<EOF
|
||||
</VirtualHost>
|
||||
EOF
|
||||
|
||||
# Apache 모듈 활성화
|
||||
sudo a2enmod proxy_fcgi setenvif rewrite 2>/dev/null || sudo dnf install -y mod_proxy_fcgi
|
||||
echo "✓ Apache 설정 파일 생성 완료"
|
||||
|
||||
sudo systemctl restart httpd
|
||||
# Apache 모듈 활성화
|
||||
if ! sudo httpd -M 2>/dev/null | grep -q proxy_fcgi; then
|
||||
sudo dnf install -y mod_proxy_fcgi || { echo "❌ mod_proxy_fcgi 설치 실패"; exit 1; }
|
||||
fi
|
||||
echo "✓ Apache 프록시 모듈 확인 완료"
|
||||
|
||||
sudo systemctl restart httpd || { echo "❌ Apache 재시작 실패"; exit 1; }
|
||||
echo "✓ Apache 재시작 완료"
|
||||
|
||||
# 6. FTP 설치 및 설정 (vsftpd)
|
||||
sudo dnf install -y vsftpd
|
||||
sudo systemctl enable --now vsftpd
|
||||
if ! command -v vsftpd &>/dev/null; then
|
||||
echo "vsftpd 설치 중..."
|
||||
sudo dnf install -y vsftpd || { echo "❌ vsftpd 설치 실패"; exit 1; }
|
||||
fi
|
||||
sudo systemctl enable --now vsftpd || { echo "❌ vsftpd 서비스 활성화 실패"; exit 1; }
|
||||
|
||||
# FTP 설정
|
||||
sudo sed -i 's/anonymous_enable=YES/anonymous_enable=NO/' /etc/vsftpd/vsftpd.conf
|
||||
sudo sed -i 's/#chroot_local_user=YES/chroot_local_user=YES/' /etc/vsftpd/vsftpd.conf
|
||||
# FTP 설정 (이미 설정된 경우 무시)
|
||||
if ! grep -q "allow_writeable_chroot=YES" /etc/vsftpd/vsftpd.conf; then
|
||||
sudo sed -i 's/anonymous_enable=YES/anonymous_enable=NO/' /etc/vsftpd/vsftpd.conf 2>/dev/null || true
|
||||
sudo sed -i 's/#chroot_local_user=YES/chroot_local_user=YES/' /etc/vsftpd/vsftpd.conf 2>/dev/null || true
|
||||
sudo bash -c "echo 'allow_writeable_chroot=YES' >> /etc/vsftpd/vsftpd.conf"
|
||||
sudo bash -c "echo 'listen_address=127.0.0.1' >> /etc/vsftpd/vsftpd.conf"
|
||||
sudo systemctl restart vsftpd
|
||||
sudo systemctl restart vsftpd || { echo "❌ vsftpd 재시작 실패"; exit 1; }
|
||||
echo "✓ vsftpd 설정 완료"
|
||||
else
|
||||
echo "ℹ️ vsftpd 설정이 이미 존재합니다"
|
||||
fi
|
||||
|
||||
# 7. SSH 설정 강화
|
||||
sudo sed -i 's/#PermitRootLogin yes/PermitRootLogin no/' /etc/ssh/sshd_config
|
||||
sudo sed -i 's/#PasswordAuthentication yes/PasswordAuthentication yes/' /etc/ssh/sshd_config
|
||||
# 7. SSH 설정 강화 (이미 설정된 경우 무시)
|
||||
if grep -q "^PermitRootLogin yes" /etc/ssh/sshd_config; then
|
||||
sudo sed -i 's/^PermitRootLogin yes/PermitRootLogin no/' /etc/ssh/sshd_config
|
||||
sudo systemctl restart sshd
|
||||
echo "✓ SSH 설정 강화 완료"
|
||||
else
|
||||
echo "ℹ️ SSH 설정은 이미 강화되어 있습니다"
|
||||
fi
|
||||
|
||||
# 8. Vim 및 Bash 설정 파일 다운로드 (git에서)
|
||||
# Gitea raw 파일 경로: https://git.siane.kr/firstgarden/cafe24-testserver/raw/branch/main/...
|
||||
DOTFILES_BASE_URL="https://git.siane.kr/firstgarden/cafe24-testserver/raw/branch/main"
|
||||
|
||||
if command -v curl &>/dev/null; then
|
||||
echo "dotfiles 다운로드 중..."
|
||||
curl -fsSL -o "$WEB_HOME/.vimrc" "$DOTFILES_BASE_URL/dotfiles/vimrc" 2>/dev/null || echo "경고: .vimrc 다운로드 실패"
|
||||
|
||||
# .bashrc_addon 다운로드
|
||||
if curl -fsSL -o "$WEB_HOME/.bashrc_addon" "$DOTFILES_BASE_URL/dotfiles/bashrc_addon" 2>/dev/null; then
|
||||
# .vimrc 다운로드 (기존 백업)
|
||||
if [ -f "$WEB_HOME/.vimrc" ]; then
|
||||
cp "$WEB_HOME/.vimrc" "$WEB_HOME/.vimrc.bak"
|
||||
fi
|
||||
curl -fsSL -o "$WEB_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 "$WEB_HOME/.bashrc" ]; then
|
||||
cp "$WEB_HOME/.bashrc" "$WEB_HOME/.bashrc.bak"
|
||||
fi
|
||||
# 추가 설정 병합
|
||||
cat "$WEB_HOME/.bashrc_addon" >> "$WEB_HOME/.bashrc"
|
||||
rm "$WEB_HOME/.bashrc_addon"
|
||||
# 이미 추가된 경우 제거하고 다시 추가
|
||||
grep -v "$(head -1 /tmp/.bashrc_addon)" "$WEB_HOME/.bashrc" > "$WEB_HOME/.bashrc.tmp" 2>/dev/null || cp "$WEB_HOME/.bashrc" "$WEB_HOME/.bashrc.tmp"
|
||||
mv "$WEB_HOME/.bashrc.tmp" "$WEB_HOME/.bashrc"
|
||||
cat "/tmp/.bashrc_addon" >> "$WEB_HOME/.bashrc"
|
||||
rm "/tmp/.bashrc_addon"
|
||||
echo "✓ Bash 설정 병합 완료"
|
||||
else
|
||||
echo "⚠️ .bashrc_addon 다운로드 실패"
|
||||
fi
|
||||
else
|
||||
echo "경고: curl이 설치되어 있지 않습니다. dotfiles 수동 설정 필요"
|
||||
echo "⚠️ curl이 설치되어 있지 않습니다. dotfiles 수동 설정 필요"
|
||||
fi
|
||||
|
||||
# 파일 소유권 설정
|
||||
sudo chown $WEB_USER:$WEB_USER "$WEB_HOME/.vimrc" "$WEB_HOME/.bashrc"
|
||||
sudo chown $WEB_USER:$WEB_USER "$WEB_HOME/.vimrc" "$WEB_HOME/.bashrc" 2>/dev/null || true
|
||||
|
||||
# 10. SELinux 웹 루트 접근 허용
|
||||
sudo chcon -R -t httpd_sys_content_t "$WEB_ROOT"
|
||||
sudo chcon -R -t httpd_sys_content_t "$WEB_ROOT" 2>/dev/null || true
|
||||
|
||||
# 11. 오류 처리 확인
|
||||
# 11. 최종 확인
|
||||
echo ""
|
||||
echo "=== 최종 상태 확인 중... ==="
|
||||
if ! sudo systemctl is-active --quiet httpd; then
|
||||
echo "에러: Apache 서비스가 실행 중이 아닙니다."
|
||||
echo "❌ 에러: Apache 서비스가 실행 중이 아닙니다."
|
||||
sudo systemctl status httpd
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if ! sudo systemctl is-active --quiet php-fpm; then
|
||||
echo "경고: PHP-FPM이 설치되지 않았습니다. install_php.sh 실행 필요"
|
||||
if ! sudo systemctl is-active --quiet php-fpm 2>/dev/null; then
|
||||
echo "ℹ️ PHP-FPM이 설치되지 않았습니다. install_php.sh 실행 필요"
|
||||
fi
|
||||
|
||||
echo "=== 테스트 서버용 공통 설정 완료! ==="
|
||||
echo ""
|
||||
echo "✅ 테스트 서버용 공통 설정 완료!"
|
||||
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
||||
echo "✓ Apache + FTP + Vim + Bash 환경 구성됨"
|
||||
echo "✓ 웹 루트: $WEB_ROOT (권한: 750)"
|
||||
echo "✓ 홈 디렉토리: $WEB_HOME (권한: 711)"
|
||||
echo ""
|
||||
echo "다음 단계:"
|
||||
echo " 1. PHP 설치: ./install_php.sh 8.2 또는 8.4"
|
||||
echo "📋 다음 단계:"
|
||||
echo " 1. PHP 설치: ./vm/install_php.sh 8.2 또는 8.4"
|
||||
echo " 2. 웹 접속: http://$(hostname -I | awk '{print $1}')/"
|
||||
echo " 3. 로그 확인: tail -f /var/log/httpd/${WEB_USER}-*.log"
|
||||
|
||||
Reference in New Issue
Block a user