From ae3a2526e00510b7c2dc1ce58b7c08f617832976 Mon Sep 17 00:00:00 2001 From: KWON Date: Tue, 23 Dec 2025 12:52:21 +0900 Subject: [PATCH] =?UTF-8?q?=EC=98=A4=EB=A5=98=20=EC=B2=98=EB=A6=AC=20?= =?UTF-8?q?=EB=B0=8F=20=EC=A4=91=EB=B3=B5=20=EC=84=A4=EC=A0=95=20=EC=B2=98?= =?UTF-8?q?=EB=A6=AC=20=EA=B8=B0=EB=8A=A5=20=EC=B6=94=EA=B0=80=20(?= =?UTF-8?q?=EB=AA=A8=EB=93=A0=20=EC=8A=A4=ED=81=AC=EB=A6=BD=ED=8A=B8)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lxc/setup_mariadb.sh | 213 ++++++++++++++++++++++++++++++++++--------- vm/install_php.sh | 107 ++++++++++++++++++++-- vm/setup_common.sh | 166 ++++++++++++++++++++++++--------- 3 files changed, 388 insertions(+), 98 deletions(-) diff --git a/lxc/setup_mariadb.sh b/lxc/setup_mariadb.sh index 646265e..3e7709c 100644 --- a/lxc/setup_mariadb.sh +++ b/lxc/setup_mariadb.sh @@ -1,42 +1,78 @@ #!/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 -read -s -p "Linux 사용자 비밀번호: " LINUX_PW -echo "" -read -s -p "Linux 사용자 비밀번호 확인: " LINUX_PW_CONFIRM -echo "" +# 사용자 존재 확인 +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 [[ "$LINUX_PW" != "$LINUX_PW_CONFIRM" ]]; then - echo "Linux 사용자 비밀번호가 일치하지 않습니다." - exit 1 +# 비밀번호 입력 (기존 사용자인 경우 생략 가능) +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 # ------------------------------------------------- @@ -47,7 +83,12 @@ SAME_ACCOUNT=${SAME_ACCOUNT:-Y} if [[ "$SAME_ACCOUNT" =~ ^[Yy]$ ]]; then DB_USER="$LINUX_USER" - DB_PW="$LINUX_PW" + 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" - -# 기존 .bashrc 백업 및 추가 설정 적용 -if [ -f "$USER_HOME/.bashrc" ]; then - cp "$USER_HOME/.bashrc" "$USER_HOME/.bashrc.bak" +if ! mkdir -p "$USER_HOME"; then + echo "❌ 홈 디렉토리 생성 실패: $USER_HOME" + exit 1 fi -# 새 설정 추가 -cat "$USER_HOME/.bashrc_addon" >> "$USER_HOME/.bashrc" -rm "$USER_HOME/.bashrc_addon" +# .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 다운로드 실패" -chown "$LINUX_USER:$LINUX_USER" "$USER_HOME/.vimrc" "$USER_HOME/.bashrc" "$USER_HOME/.bashrc.bak" 2>/dev/null || true +# .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 -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 </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 < /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. 완료 메시지 +# 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 -u $DB_USER -p" -echo "==========================================" +echo "" +echo "📝 LXC IP 확인 (Proxmox에서):" +echo " pct exec 201 ip addr show eth0 | grep inet" diff --git a/vm/install_php.sh b/vm/install_php.sh index 878d073..3491ff9 100644 --- a/vm/install_php.sh +++ b/vm/install_php.sh @@ -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 (예: 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" </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 재시작 diff --git a/vm/setup_common.sh b/vm/setup_common.sh index e8c781e..18ab85a 100644 --- a/vm/setup_common.sh +++ b/vm/setup_common.sh @@ -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 폴더 생성, 소유자/권한 제한 -mkdir -p "$WEB_ROOT" -chmod 750 "$WEB_ROOT" -chown $WEB_USER:$WEB_USER "$WEB_ROOT" +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 -# 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 -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 +# 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 || { 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 -sudo systemctl restart sshd +# 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"