Files
sundol/docs/operation-manual.md
joungmin afc9cdcde6 Refactor Playwright to singleton browser with tab-based crawling
- Add PlaywrightBrowserService: singleton Chromium browser with auto-recovery
- Refactor WebCrawlerService/YouTubeTranscriptService to use shared browser tabs
- Fix YouTube transcript: extract from DOM panel + fmt=json3 fallback
- Keep browser window alive (about:blank instead of page.close)
- Add docs: X Window setup, operation manual, crawling guide

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-09 19:18:33 +00:00

183 lines
4.3 KiB
Markdown

# Sundol 운영 매뉴얼
## 프로세스 구성
pm2로 3개 프로세스를 관리한다.
| id | name | 설명 |
|----|------|------|
| 0 | pdf-ocr | PDF OCR 서비스 |
| 1 | sundol-backend | Spring Boot 백엔드 |
| 2 | sundol-frontend | Next.js 프론트엔드 |
## pm2 기본 명령어
```bash
# 프로세스 목록 확인
pm2 list
# 로그 확인
pm2 logs sundol-backend
pm2 logs sundol-frontend
pm2 logs pdf-ocr
# 특정 프로세스 재시작
pm2 restart sundol-backend
pm2 restart sundol-frontend
pm2 restart pdf-ocr
# 전체 재시작
pm2 restart all
# 프로세스 중지
pm2 stop sundol-backend
# 프로세스 삭제
pm2 delete sundol-backend
```
## 백엔드 시작 스크립트
파일: `start-backend.sh`
```bash
#!/bin/bash
set -a
source /home/opc/sundol/.env
set +a
JAVA_HOME=${JAVA_HOME:-/usr/lib/jvm/java-21}
export JAVA_HOME
# Playwright 브라우저 경로
export PLAYWRIGHT_BROWSERS_PATH=/home/opc/.cache/ms-playwright
export PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD=1
# Playwright head 모드용 디스플레이
# :99 = Xvfb 가상 디스플레이 (브라우저 안 보임)
# :1 = VNC 디스플레이 (VNC에서 브라우저 보임)
export DISPLAY=:99
# Xvfb 가상 디스플레이 시작 (DISPLAY=:99일 때만 필요)
if ! pgrep -x Xvfb > /dev/null; then
Xvfb :99 -screen 0 1280x720x24 -nolisten tcp &
sleep 1
fi
BACKEND_DIR=/home/opc/sundol/sundol-backend
exec $JAVA_HOME/bin/java -cp "$BACKEND_DIR/target/classes:$BACKEND_DIR/target/dependency/*" com.sundol.SundolApplication
```
### DISPLAY 설정 가이드
| DISPLAY 값 | 용도 |
|-------------|------|
| `:99` | Xvfb 가상 디스플레이. 브라우저가 백그라운드에서 동작 (기본값) |
| `:1` | VNC 디스플레이. VNC 접속 시 Playwright 브라우저가 화면에 보임 (디버깅용) |
VNC에서 Playwright 브라우저를 직접 보려면:
1. `start-backend.sh`에서 `export DISPLAY=:1`로 변경
2. `pm2 restart sundol-backend`
## 백엔드 빌드
```bash
cd /home/opc/sundol/sundol-backend
export JAVA_HOME=/usr/lib/jvm/java-21
set -a && source /home/opc/sundol/.env && set +a
mvn package -q -DskipTests
```
> 컴파일만: `mvn compile` (위 환경변수 동일)
## 프론트엔드 빌드/배포
```bash
cd /home/opc/sundol/sundol-frontend
bash build.sh
```
> `.env`에 `NEXT_PUBLIC_GOOGLE_CLIENT_ID`, `NEXT_PUBLIC_API_URL` 필수.
## 배포 절차
1. 코드 변경 및 빌드
2. `pm2 restart sundol-backend` (또는 sundol-frontend)
3. `pm2 logs sundol-backend` 로 정상 기동 확인
4. `git push origin main`
## DB 접속 (Oracle Autonomous DB)
```bash
set -a && source /home/opc/sundol/.env && set +a
/home/opc/sqlcl/bin/sql ${ORACLE_USERNAME}/${ORACLE_PASSWORD}@${ORACLE_TNS_NAME}?TNS_ADMIN=${ORACLE_WALLET_PATH}
```
## Playwright 관련
- 브라우저 경로: `/home/opc/.cache/ms-playwright`
- WebCrawlerService: Playwright head 모드 (`setHeadless(false)`)
- YouTubeTranscriptService: Playwright head 모드 (`setHeadless(false)`)
- head 모드 사용 시 DISPLAY 환경변수 필수
## Playwright 의존 라이브러리
Playwright Chromium 실행에 필요한 시스템 라이브러리:
```bash
sudo dnf install -y libicu woff2 harfbuzz-icu libjpeg-turbo libwebp enchant2 hyphen libffi
```
> `libx264`는 WebKit 전용이므로 Chromium만 사용할 경우 불필요.
> 로그에 `validateDependenciesLinux` 에러가 나오면 위 패키지 설치 확인.
### Xvfb vs VNC 디스플레이
| 모드 | DISPLAY | 설명 |
|------|---------|------|
| Xvfb (운영) | `:99` | 가상 프레임버퍼. 화면 없이 백그라운드 동작 |
| VNC (디버깅) | `:1` | VNC 접속 시 브라우저가 화면에 보임 |
Xvfb 모드로 되돌리려면 `start-backend.sh`에서:
```bash
export DISPLAY=:99
if ! pgrep -x Xvfb > /dev/null; then
Xvfb :99 -screen 0 1280x720x24 -nolisten tcp &
sleep 1
fi
```
## 트러블슈팅
### 백엔드가 안 뜰 때
```bash
pm2 logs sundol-backend --lines 50
```
### Playwright 브라우저가 안 열릴 때
```bash
# DISPLAY 확인
echo $DISPLAY
# Xvfb 실행 여부 확인
pgrep -x Xvfb
# VNC 실행 여부 확인
vncserver -list
# Playwright 브라우저 설치 확인
ls /home/opc/.cache/ms-playwright/
```
### pm2 프로세스가 계속 재시작될 때
```bash
# 재시작 횟수 확인 (↺ 컬럼)
pm2 list
# 에러 로그 확인
pm2 logs sundol-backend --err --lines 100
```