From 9569309e494bf8058f77b331710ad0ead47fb59a Mon Sep 17 00:00:00 2001 From: joungmin Date: Mon, 18 May 2026 01:06:58 +0000 Subject: [PATCH] =?UTF-8?q?=ED=81=AC=EB=A1=A4=EB=A7=81=20=EB=B3=B5?= =?UTF-8?q?=EA=B5=AC:=20Chrome=20CDP=EB=A5=BC=20PM2=20sundol-chrome?= =?UTF-8?q?=EB=A1=9C=20=EC=83=81=EC=8B=9C=ED=99=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Chrome 136+가 기본 프로필 디렉토리에서 원격 디버깅(CDP)을 거부하여 4월 13일 이후 웹크롤링 3차 폴백/유튜브 자막 추출이 전부 실패하던 문제 해결. - 프로필을 non-default 디렉토리(~/.config/google-chrome-cdp)로 이동해 로그인 세션 유지한 채 CDP 허용 - start-chrome.sh 신규: 기존 Chrome 정리 + stale lock 제거 후 --remote-debugging-port=9222 --remote-debugging-address=127.0.0.1 로 기동 - ecosystem.config.cjs: sundol-chrome PM2 앱 추가 (수동 실행 금지, PM2 통일) ※ frontend script의 /usr/local/bin/node 변경은 이전 작업분이 함께 포함됨 - PlaywrightBrowserService: CDP_URL을 127.0.0.1로 고정 (IPv6 ::1 해석 함정 제거) Co-Authored-By: Claude Opus 4.7 (1M context) --- ecosystem.config.cjs | 11 +++++- start-chrome.sh | 35 +++++++++++++++++++ .../service/PlaywrightBrowserService.java | 2 +- 3 files changed, 46 insertions(+), 2 deletions(-) create mode 100755 start-chrome.sh diff --git a/ecosystem.config.cjs b/ecosystem.config.cjs index 2b5d190..c9629e4 100644 --- a/ecosystem.config.cjs +++ b/ecosystem.config.cjs @@ -1,5 +1,14 @@ module.exports = { apps: [ + { + name: "sundol-chrome", + script: "./start-chrome.sh", + interpreter: "/bin/bash", + cwd: "/home/opc/sundol", + env: { + DISPLAY: ":1", + }, + }, { name: "sundol-backend", script: "./start-backend.sh", @@ -12,7 +21,7 @@ module.exports = { }, { name: "sundol-frontend", - script: "node", + script: "/usr/local/bin/node", args: "sundol-frontend/.next/standalone/server.js", cwd: "/home/opc/sundol", env: { diff --git a/start-chrome.sh b/start-chrome.sh new file mode 100755 index 0000000..b4a36d3 --- /dev/null +++ b/start-chrome.sh @@ -0,0 +1,35 @@ +#!/bin/bash +# 사용자 Chrome을 CDP 디버깅 포트(9222)로 기동한다. +# PM2(sundol-chrome)가 관리하는 전용 스크립트이므로 수동 실행 금지. +# 봇 판정 우회를 위해 사용자 로그인 세션이 담긴 기존 프로필을 그대로 사용한다. +set -u + +export DISPLAY=:1 +PROFILE_DIR="/home/opc/.config/google-chrome-cdp" +DEBUG_PORT=9222 + +# 1) 동일 프로필을 쓰는 기존 Chrome 종료. +# 같은 user-data-dir로 Chrome이 이미 떠 있으면 새 인스턴스는 +# 디버깅 포트를 열지 못하고 기존 인스턴스에 명령만 전달하고 끝난다. +pkill -TERM -f "/opt/google/chrome/chrome" 2>/dev/null || true +for _ in $(seq 1 10); do + pgrep -f "/opt/google/chrome/chrome" >/dev/null 2>&1 || break + sleep 1 +done +pkill -KILL -f "/opt/google/chrome/chrome" 2>/dev/null || true +sleep 1 + +# 2) 비정상 종료로 남은 stale 싱글톤 락 정리. +rm -f "$PROFILE_DIR/SingletonLock" \ + "$PROFILE_DIR/SingletonCookie" \ + "$PROFILE_DIR/SingletonSocket" 2>/dev/null || true + +# 3) Chrome 기동. exec로 foreground 유지 → PM2 fork 모드가 프로세스를 추적. +# --remote-debugging-address=127.0.0.1 로 IPv4 바인딩을 명시한다. +exec /usr/bin/google-chrome \ + --user-data-dir="$PROFILE_DIR" \ + --remote-debugging-port="$DEBUG_PORT" \ + --remote-debugging-address=127.0.0.1 \ + --no-first-run \ + --no-default-browser-check \ + --start-maximized diff --git a/sundol-backend/src/main/java/com/sundol/service/PlaywrightBrowserService.java b/sundol-backend/src/main/java/com/sundol/service/PlaywrightBrowserService.java index 9b3b75f..30e5531 100644 --- a/sundol-backend/src/main/java/com/sundol/service/PlaywrightBrowserService.java +++ b/sundol-backend/src/main/java/com/sundol/service/PlaywrightBrowserService.java @@ -20,7 +20,7 @@ import java.util.List; public class PlaywrightBrowserService { private static final Logger log = LoggerFactory.getLogger(PlaywrightBrowserService.class); - private static final String CDP_URL = "http://localhost:9222"; + private static final String CDP_URL = "http://127.0.0.1:9222"; private Playwright playwright; private Browser browser;