All checks were successful
deploy-dev / deploy (push) Successful in 36s
웹 티어(211.37.173.197 / Rocky 8): - csv.wise.ai.kr nginx vhost + Let's Encrypt SSL - WAS는 SSH 터널(arko-was-tunnel.service)로 연결 — 개발서버가 NAT 뒤라 8088이 포워딩되지 않고 Tomcat도 127.0.0.1 바인딩이기 때문이다. 키는 WAS에서 restrict,permitopen="127.0.0.1:8088" 로 묶어 셸 접근 불가. - 정적 리소스는 운영 웹이 직접 서빙하고 없으면 @was 폴백 — 전환 중에도 깨지지 않는다. 파이프라인: git push -> 개발 WAS 배포 -> 개발 헬스체크 -> 운영 웹 정적 배포 -> 운영 검증 개발 헬스체크를 통과한 뒤에만 운영으로 넘어간다. 접속 방향은 개발->운영(개발서버는 NAT 뒤라 역방향 접속이 불가능하다).
116 lines
4.3 KiB
Bash
116 lines
4.3 KiB
Bash
#!/usr/bin/env bash
|
|
# 운영 웹서버(utimsurpai.cafe24.com / 211.37.173.197)에서 실행 — 자동 배포 수신 준비.
|
|
#
|
|
# 사용법: bash 05-prodweb-prepare.sh '<개발서버 공개키 한 줄>'
|
|
#
|
|
# 하는 일:
|
|
# 1) 개발서버(101.79.17.164) 배포 키 등록 — 출발지 IP 고정 + 셸 부가기능 차단
|
|
# 2) 정적 리소스 디렉토리 생성 (/var/www/csv.wise.ai.kr/static)
|
|
# 3) nginx vhost의 정적 경로를 "로컬 파일 우선, 없으면 WAS 프록시"로 전환
|
|
#
|
|
# 3)이 핵심이다. 이렇게 해야 배포가 의미를 갖는다 —
|
|
# 정적 파일을 운영 웹서버가 직접 서빙하므로 WAS 왕복과 SSH 터널 트래픽이 줄고,
|
|
# 아직 배포되지 않은 파일은 @was 폴백으로 그대로 나가서 전환 중에도 깨지지 않는다.
|
|
set -euo pipefail
|
|
|
|
PUBKEY=${1:-}
|
|
[ -n "$PUBKEY" ] || { echo "사용법: $0 '<공개키>'"; exit 1; }
|
|
echo "$PUBKEY" | grep -q "^ssh-" || { echo "공개키 형식이 아니다"; exit 1; }
|
|
|
|
DEV_IP=101.79.17.164
|
|
DOMAIN=csv.wise.ai.kr
|
|
STATIC_ROOT=/var/www/$DOMAIN/static
|
|
VHOST=/etc/nginx/conf.d/$DOMAIN.conf
|
|
TS=$(date +%Y%m%d_%H%M%S)
|
|
|
|
# ------------------------------------------------------------ 1. 키 등록
|
|
echo "=== 1. 배포 키 등록 ==="
|
|
AK=/root/.ssh/authorized_keys
|
|
mkdir -p /root/.ssh && chmod 700 /root/.ssh && touch "$AK"
|
|
cp -f "$AK" "$AK.bak_$TS"
|
|
|
|
# rsync를 써야 하므로 restrict(명령 실행 전면 차단)는 쓸 수 없다.
|
|
# 대신 출발지 IP를 개발서버로 고정하고 부가 기능은 모두 끈다.
|
|
OPTS="from=\"$DEV_IP\",no-agent-forwarding,no-port-forwarding,no-x11-forwarding,no-pty"
|
|
KEY_BODY=$(echo "$PUBKEY" | awk '{print $2}')
|
|
if grep -q "$KEY_BODY" "$AK"; then
|
|
echo "이미 등록됨 — 건너뜀"
|
|
else
|
|
echo "$OPTS $PUBKEY" >> "$AK"
|
|
echo "등록 완료 (출발지 $DEV_IP 로 제한)"
|
|
fi
|
|
chmod 600 "$AK"
|
|
|
|
# -------------------------------------------------- 2. 정적 디렉토리
|
|
echo
|
|
echo "=== 2. 정적 리소스 디렉토리 ==="
|
|
mkdir -p "$STATIC_ROOT"
|
|
chown -R nginx:nginx "/var/www/$DOMAIN" 2>/dev/null || chown -R root:root "/var/www/$DOMAIN"
|
|
ls -ld "$STATIC_ROOT"
|
|
|
|
# ------------------------------------------------------ 3. vhost 전환
|
|
echo
|
|
echo "=== 3. nginx 정적 경로 전환 ==="
|
|
cp -f "$VHOST" "$VHOST.bak_$TS"
|
|
echo "백업: $VHOST.bak_$TS"
|
|
|
|
if grep -q "location @was" "$VHOST"; then
|
|
echo "이미 전환됨 — 건너뜀"
|
|
else
|
|
# 기존 정적 location 블록(프록시)을 로컬 우선 + 폴백 구조로 교체한다.
|
|
python3 - "$VHOST" "$STATIC_ROOT" <<'PY'
|
|
import re, sys
|
|
path, static_root = sys.argv[1], sys.argv[2]
|
|
src = open(path, encoding='utf-8').read()
|
|
|
|
old = re.search(
|
|
r'\n[ \t]*# ?정적[^\n]*\n[ \t]*location ~\* \^/\(images\|css\|js\|fonts\|new\)/ \{.*?\n[ \t]*\}\n',
|
|
src, re.S)
|
|
if not old:
|
|
old = re.search(r'\n[ \t]*location ~\* \^/\(images\|css\|js\|fonts\|new\)/ \{.*?\n[ \t]*\}\n', src, re.S)
|
|
if not old:
|
|
print("정적 location 블록을 찾지 못했다 — 수동 확인 필요")
|
|
sys.exit(1)
|
|
|
|
new = f'''
|
|
# 정적 리소스: 운영 웹서버가 직접 서빙하고, 없으면 WAS로 폴백한다.
|
|
# 배포(rsync)로 채워지는 경로 — 아직 없는 파일도 @was 덕분에 깨지지 않는다.
|
|
location ~* ^/(images|css|js|fonts|new)/ {{
|
|
root {static_root};
|
|
try_files $uri @was;
|
|
expires 10m;
|
|
add_header Cache-Control "public, max-age=600";
|
|
access_log off;
|
|
}}
|
|
|
|
# 정적 폴백 — 아직 배포되지 않은 파일은 개발 WAS에서 가져온다
|
|
location @was {{
|
|
proxy_pass http://127.0.0.1:8088;
|
|
proxy_http_version 1.1;
|
|
proxy_set_header Host $host;
|
|
proxy_set_header X-Real-IP $remote_addr;
|
|
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
|
proxy_set_header X-Forwarded-Proto $scheme;
|
|
proxy_read_timeout 300s;
|
|
}}
|
|
'''
|
|
open(path, 'w', encoding='utf-8').write(src[:old.start()] + new + src[old.end():])
|
|
print("정적 경로 전환 완료")
|
|
PY
|
|
fi
|
|
|
|
echo
|
|
echo "=== nginx 검증 ==="
|
|
if nginx -t; then
|
|
systemctl reload nginx
|
|
echo "반영 완료"
|
|
else
|
|
cp -f "$VHOST.bak_$TS" "$VHOST"
|
|
echo "설정 오류 → 백업 복구하고 중단"
|
|
exit 1
|
|
fi
|
|
|
|
echo
|
|
echo "=== 확인 ==="
|
|
curl -s -o /dev/null -w "https://$DOMAIN/ → %{http_code}\n" --max-time 30 "https://$DOMAIN/"
|