Infra · DevOps
무중단 프론트엔드 인프라 & CI/CD
WebSocket 프록시를 유지하는 커스텀 Next 서버와 GitLab CI/CD 자동 배포로 실시간 프론트의 무중단 운영을 구현
- 소속
- (주)페르소나AI
- 기간
- 2025.10 – 현재
- 역할
- 프론트엔드 인프라 · DevOps
Next.js 15Custom server.js (ws-proxy)GitLab CI/CDDockerNginxSFTPPrisma
01
Overview
실시간 회의 프론트엔드를 무중단으로 운영하기 위한 인프라 작업입니다. Next.js standalone의 한계를 커스텀 server.js로 해결해 WebSocket ws-proxy를 유지하고, GitLab CI/CD로 시크릿 주입·SFTP 배포를 자동화했습니다.
02
Background
실시간 회의는 WebSocket 연결이 끊기면 사용자 경험이 크게 깨집니다. 동시에 잦은 배포에도 서비스가 멈추지 않아야 했습니다.
03
Problem
Next standalone 빌드에서 커스텀 WebSocket 프록시가 동작하지 않았고, 배포 시 DB/SFTP 시크릿의 안전한 런타임 주입과 배포 컨테이너 권한(EACCES) 문제가 있었습니다.
04
My Role
- 커스텀 server.js 기반 ws-proxy 설계로 standalone 한계 우회
- GitLab CI/CD 파이프라인(빌드·시크릿 주입·SFTP 배포) 구성
- 배포 권한/DNS 등 운영 이슈 트러블슈팅
05
Architecture
Next 앱을 standalone이 아닌 커스텀 server.js로 실행해 HTTP와 WebSocket(ws-proxy)을 한 프로세스에서 처리합니다. CI는 빌드 후 시크릿을 런타임 주입하고 SFTP로 배포합니다.
GitLab CI (빌드)→시크릿 런타임 주입 (DB / SFTP)→SFTP 배포→Docker / Nginx→커스텀 server.js (HTTP + ws-proxy)
06
Key Features
- ▸WebSocket 프록시를 유지하는 커스텀 Next 서버
- ▸시크릿 런타임 주입 자동 배포
- ▸업스트림 연결 전 메시지 큐잉으로 유실 방지
07
Technical Decisions
standalone 대신 커스텀 server.js
왜 → standalone에서 ws-proxy가 끊겨 실시간 기능이 죽어, 커스텀 서버로 복구했습니다.
SFTP 키를 읽기 가능한 복사본으로 마운트
왜 → 컨테이너 EACCES로 배포가 실패해, 권한 문제를 해결했습니다.
08
Troubleshooting
문제 · 컨테이너에서 SFTP 키 EACCES로 배포 실패
해결 · 키를 읽기 가능한 복사본으로 마운트하도록 CI 수정.
문제 · Docker 빌드 호스트의 Docker Hub DNS 실패
해결 · Dockerfile syntax 지시자 제거로 우회.
09
Result
- 실시간 프론트의 무중단 배포·운영 체계 확립
- 잦은 배포에도 WebSocket 연결 유지
10
What I Learned
- 프레임워크 추상화(standalone)의 한계를 직접 서버 제어로 푸는 법
- CI/CD 시크릿 관리와 컨테이너 권한 디버깅