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 뒤라 역방향 접속이 불가능하다).
81 lines
2.9 KiB
Bash
81 lines
2.9 KiB
Bash
#!/usr/bin/env bash
|
|
# csv.wise.ai.kr 웹 티어 구축 — 웹서버(utimsurpai.cafe24.com / 211.37.173.197)에서 실행
|
|
#
|
|
# 사용법: bash 01-web-server-setup.sh
|
|
# 멱등: 다시 실행해도 안전하다.
|
|
#
|
|
# 이 서버는 nginx만 담당한다. WAS(Tomcat)와 DB(MariaDB)는 개발서버(101.79.17.164)를 그대로 쓴다.
|
|
#
|
|
# 선행 조건:
|
|
# 1) /root/.ssh/id_arko_tunnel 키가 있고, 그 공개키가 WAS의 authorized_keys에
|
|
# restrict,permitopen="127.0.0.1:8088" 로 등록되어 있을 것
|
|
# (WAS에서 deploy/web/03-was-tunnel-key.sh 실행)
|
|
# 2) csv.wise.ai.kr A/CNAME 레코드가 이 서버를 가리킬 것
|
|
set -euo pipefail
|
|
|
|
DOMAIN=csv.wise.ai.kr
|
|
WAS_HOST=101.79.17.164
|
|
KEY=/root/.ssh/id_arko_tunnel
|
|
SRC_DIR=$(cd "$(dirname "$0")" && pwd)
|
|
|
|
log() { echo -e "\n[$(date +'%F %T')] === $* ==="; }
|
|
|
|
# ------------------------------------------------------- 1. 사전 확인
|
|
log "1. 사전 확인"
|
|
command -v nginx > /dev/null || { echo "nginx가 없다"; exit 1; }
|
|
nginx -v 2>&1
|
|
[ -f "$KEY" ] || { echo "터널 키가 없다: $KEY"; exit 1; }
|
|
echo "터널 키 확인"
|
|
|
|
# --------------------------------------------------------- 2. 터널
|
|
log "2. WAS 터널 서비스"
|
|
install -m 644 "$SRC_DIR/arko-was-tunnel.service" /etc/systemd/system/arko-was-tunnel.service
|
|
systemctl daemon-reload
|
|
systemctl enable arko-was-tunnel
|
|
systemctl restart arko-was-tunnel
|
|
|
|
for i in $(seq 1 20); do
|
|
ss -lnt 2>/dev/null | grep -q "127.0.0.1:8088" && break
|
|
sleep 1
|
|
done
|
|
|
|
if ! ss -lnt 2>/dev/null | grep -q "127.0.0.1:8088"; then
|
|
echo "터널이 열리지 않았다"
|
|
systemctl status arko-was-tunnel --no-pager | tail -15
|
|
exit 1
|
|
fi
|
|
echo "터널 개통: 127.0.0.1:8088 → $WAS_HOST"
|
|
|
|
CODE=$(curl -s -o /dev/null -w "%{http_code}" --max-time 20 -H "Host: $DOMAIN" http://127.0.0.1:8088/ || echo 000)
|
|
echo "WAS 응답 → HTTP $CODE"
|
|
[ "$CODE" = "200" ] || [ "$CODE" = "302" ] || { echo "WAS가 정상 응답하지 않는다"; exit 1; }
|
|
|
|
# --------------------------------------------------------- 3. nginx
|
|
log "3. nginx 가상호스트"
|
|
# 이 서버는 sites-enabled 없이 conf.d 만 include 한다
|
|
install -m 644 "$SRC_DIR/$DOMAIN.conf" "/etc/nginx/conf.d/$DOMAIN.conf"
|
|
|
|
if nginx -t; then
|
|
systemctl reload nginx
|
|
echo "nginx 반영 완료"
|
|
else
|
|
rm -f "/etc/nginx/conf.d/$DOMAIN.conf"
|
|
echo "nginx 설정 오류 → 제거하고 중단"
|
|
exit 1
|
|
fi
|
|
|
|
CODE=$(curl -s -o /dev/null -w "%{http_code}" --max-time 30 -H "Host: $DOMAIN" http://127.0.0.1/ || echo 000)
|
|
echo "nginx 경유 → HTTP $CODE"
|
|
curl -s --max-time 30 -H "Host: $DOMAIN" http://127.0.0.1/ | grep -oiE "<title>[^<]*</title>" | head -1
|
|
|
|
# ----------------------------------------------------------- 4. SSL
|
|
log "4. SSL"
|
|
if [ -d "/etc/letsencrypt/live/$DOMAIN" ]; then
|
|
echo "인증서 이미 존재 — 건너뜀"
|
|
else
|
|
certbot --nginx -d "$DOMAIN" --non-interactive --agree-tos --redirect
|
|
fi
|
|
|
|
log "완료"
|
|
echo "확인: https://$DOMAIN/"
|