arko_renual/deploy
infraurp e4973fb777
All checks were successful
deploy-dev / deploy (push) Successful in 39s
배포 파이프라인 결함 3건 수정
2026-07-30 나눔고딕 글꼴 배포 중 드러난 문제들이다.

1) build-and-upload.sh: 업로드 검증이 없어 잘린 WAR이 통과했다
   pscp가 대용량 전송 중 약 30초 지점에서 조용히 끊기며 exit 0을 반환해,
   194MB WAR이 66MB/84MB로 잘린 채 "업로드 완료"로 처리됐다. 그 WAR로
   배포가 돌아 실패했다. 30MB 조각 전송 + 조각별 크기 확인(3회 재시도) +
   서버 결합 후 size/md5 대조를 통과할 때만 arko.war 로 교체하도록 바꿨다.

2) build-and-upload.sh: mvn -ntp 는 Maven 3.6.1+ 전용
   PATH에 3.5.4가 잡히면 "Unrecognized option: -ntp"로 빌드가 즉시 죽는다.
   진행률 억제 옵션일 뿐이라 제거했다.

3) arko-dev-deploy.sh: WAR 검증이 파이프+pipefail 조합으로 취약
   정상 WAR인데 Actions 실행 중 "WEB-INF/web.xml 없음"으로 오판해 배포가
   멈췄다(서버에서 동일 명령 재실행 시 20/20 통과). unzip 목록을 한 번만
   읽어 변수에 담고 파이프 없이 검사한다.
   ※ 서버의 /opt/arko-dev/bin/ 사본은 워크플로가 갱신하지 않으므로 별도 반영 필요.

덧붙여 워크플로 주석의 "빈 커밋으로 재배포" 안내를 정정했다 —
paths-ignore 때문에 변경 경로가 없는 커밋은 워크플로가 실행되지 않는다.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-07-30 13:44:50 +09:00
..
dev 배포 파이프라인 결함 3건 수정 2026-07-30 13:44:50 +09:00
web 운영 웹서버(csv.wise.ai.kr) 구축 및 개발→운영 자동 배포 연결 2026-07-29 17:50:32 +09:00
README.md act_runner 폴링 정지 워치독 추가 2026-07-29 18:45:25 +09:00

arko_renual 배포 구성

전체 구조

                  ┌──────────────────────────────────────────────────────────┐
   git push ─────>│ Gitea (git.zioinfo.co.kr) + act_runner                    │
                  │   ※ runner는 nginx를 거치지 않고 127.0.0.1:9003 직결      │
                  └────────────────────────┬─────────────────────────────────┘
                                           │
                  ┌────────────────────────▼─────────────────────────────────┐
                  │ 개발서버 zio-server (101.79.17.164, NAT 뒤)               │
                  │   Tomcat 9 :8088 (127.0.0.1) ← ROOT 전개                  │
                  │   MariaDB csv                                            │
                  │   nginx → https://csv.zioinfo.co.kr        [개발 웹]      │
                  └───────┬──────────────────────────────┬───────────────────┘
                          │ ① SSH 터널(운영→개발, 인바운드)  │ ② rsync(개발→운영)
                          │    8088 프록시                  │    정적 리소스
                  ┌───────▼──────────────────────────────▼───────────────────┐
                  │ 운영 웹서버 utimsurpai.cafe24.com (211.37.173.197)        │
                  │   nginx → https://csv.wise.ai.kr           [운영 웹]      │
                  │   정적: /var/www/csv.wise.ai.kr/static (로컬 서빙)        │
                  │   그 외: 터널 통해 개발 WAS로 프록시                      │
                  └──────────────────────────────────────────────────────────┘

WAS와 DB는 개발서버 것 하나만 쓴다. 운영 웹서버는 웹 티어 전용이다.

배포 흐름

bash deploy/dev/build-and-upload.sh   # ① 로컬 JDK8 빌드 + WAR 업로드
git push origin master                # ② 이하 자동
② push
   → 개발 WAS 배포 (ROOT 재전개 + 환경설정 주입 + 재기동 + 헬스체크, 실패 시 자동 롤백)
   → 개발 웹 확인 (csv.zioinfo.co.kr)
   → 운영 웹 배포 (정적 리소스 rsync)
   → 운영 웹 확인 (csv.wise.ai.kr)

개발 헬스체크를 통과한 뒤에만 운영으로 넘어간다. 문서(**.md)만 바뀐 커밋은 배포하지 않는다.

왜 이런 구조인가

빌드를 서버에서 하지 않는 이유 — 개발서버는 2코어에 가용 메모리 1G 안팎이고 40개 이상의 서비스가 동거한다. 실제로 2026-07-29 하루에만 서버 전체가 응답 불능이 되어 두 번 재부팅됐다. Maven(힙 1G)을 여기서 돌리지 않는다.

접속 방향 — 개발서버는 NAT 뒤라 외부에서 먼저 접속할 수 없다. 그래서

  • 웹→WAS 연결은 운영 웹서버가 개발서버로 SSH 터널을 연다(아웃바운드)
  • 배포는 개발서버가 운영 웹서버로 나간다(운영은 공인망 SSH 9271이 열려 있음)

터널을 쓰는 이유 — WAS의 8088은 NAT에서 포워딩되지 않고 Tomcat도 127.0.0.1 바인딩이다. 포트를 인터넷에 여는 대신 터널을 쓴다. 양쪽 키 모두 authorized_keys에서 용도를 좁혀 두었다.

위치 제한
id_arko_tunnel 운영 웹 → 개발 restrict,port-forwarding,permitopen="127.0.0.1:8088" (셸 불가)
id_arko_prodweb 개발 → 운영 웹 from="101.79.17.164",no-pty,no-port-forwarding,...

정적 리소스를 운영 웹이 직접 서빙하는 이유 — 릴리스마다 실제로 옮길 산출물이 생기고, WAS 왕복과 터널 트래픽이 줄어든다. 아직 배포되지 않은 파일은 @was 폴백으로 나가므로 전환 중에도 화면이 깨지지 않는다.

디렉토리

경로 내용
deploy/dev/ 개발서버(WAS) 구축·배포 — 상세
deploy/web/ 운영 웹서버 구축·배포
.gitea/workflows/deploy-dev.yml 파이프라인 정의

deploy/web

파일 실행 위치 역할
01-web-server-setup.sh 운영 웹 터널 서비스 + nginx vhost + SSL 발급
03-was-tunnel-key.sh 개발서버 운영 웹의 터널 공개키를 제한 등록
04-prod-web-deploy.sh 개발서버 정적 리소스 rsync (CI가 호출)
05-prodweb-prepare.sh 운영 웹 배포 키 등록 + 정적 경로 전환
arko-was-tunnel.service 운영 웹 SSH 터널 (자동 재연결)
csv.wise.ai.kr.conf 운영 웹 nginx vhost

운영 명령

# 개발서버
systemctl status arko-dev arko-dev-runner
tail -f /opt/arko-dev/logs/deploy.log
tail -f /opt/arko-dev/tomcat/logs/catalina.out

# 운영 웹서버 (ssh -p 9271 root@211.37.173.197)
systemctl status arko-was-tunnel        # 502가 나면 여기부터 확인
tail -f /var/log/nginx/csv.wise.ai.kr.error.log

알려진 이슈

act_runner 폴링 정지 (미해결 — 워치독으로 우회 중)

act_runner가 작업 하나를 끝낸 뒤 폴링을 멈춘다. 프로세스는 살아 있고 Gitea로의 TCP 연결도 ESTABLISHED 인데 응답 없이 물려 있으며, CPU 사용량이 완전히 정지한다(20초 관찰 시 utime/stime 변화 0). 재기동하면 밀린 작업을 즉시 집어간다.

시도한 것과 결과:

조치 결과
nginx 경유 제거 → Gitea 직결(127.0.0.1:9003) 재등록 (06-runner-reregister.sh) 재현
act_runner 0.2.11 → 0.2.13 업그레이드 (07-runner-upgrade.sh) 재현

근본 원인을 잡지 못해 워치독으로 보완했다. arko-runner-watchdog.timer가 1분마다 "대기 90초 넘긴 작업이 있는데 실행 중인 작업은 없는" 상태를 확인해 러너를 재기동한다. 실행 중인 작업이 있으면 절대 건드리지 않으므로 배포 도중 끊길 일은 없다. 동작 기록은 /opt/arko-dev/logs/watchdog.log.

배포는 자동으로 완료되지만, 러너가 멈췄다가 최대 1분 뒤 워치독에 의해 살아나 처리되는 경우가 있다. 배포가 1~2분 늦어지는 것으로 보일 수 있다.

Gitea 1.22는 workflow_dispatch를 지원하지 않는다 — 넣으면 워크플로가 Actions 목록에 아예 뜨지 않는다. 수동 재배포는 git commit --allow-empty 후 push 로 한다.

개발서버 자원 — 가용 메모리가 상시 1G 안팎이다. Tomcat 힙은 448m로 묶여 있고 (arko-dev.service), 늘리기 전에 반드시 free -h 로 여유를 확인할 것.