크롤링 복구: Chrome CDP를 PM2 sundol-chrome로 상시화
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) <noreply@anthropic.com>
This commit is contained in:
@@ -1,5 +1,14 @@
|
|||||||
module.exports = {
|
module.exports = {
|
||||||
apps: [
|
apps: [
|
||||||
|
{
|
||||||
|
name: "sundol-chrome",
|
||||||
|
script: "./start-chrome.sh",
|
||||||
|
interpreter: "/bin/bash",
|
||||||
|
cwd: "/home/opc/sundol",
|
||||||
|
env: {
|
||||||
|
DISPLAY: ":1",
|
||||||
|
},
|
||||||
|
},
|
||||||
{
|
{
|
||||||
name: "sundol-backend",
|
name: "sundol-backend",
|
||||||
script: "./start-backend.sh",
|
script: "./start-backend.sh",
|
||||||
@@ -12,7 +21,7 @@ module.exports = {
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "sundol-frontend",
|
name: "sundol-frontend",
|
||||||
script: "node",
|
script: "/usr/local/bin/node",
|
||||||
args: "sundol-frontend/.next/standalone/server.js",
|
args: "sundol-frontend/.next/standalone/server.js",
|
||||||
cwd: "/home/opc/sundol",
|
cwd: "/home/opc/sundol",
|
||||||
env: {
|
env: {
|
||||||
|
|||||||
35
start-chrome.sh
Executable file
35
start-chrome.sh
Executable file
@@ -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
|
||||||
@@ -20,7 +20,7 @@ import java.util.List;
|
|||||||
public class PlaywrightBrowserService {
|
public class PlaywrightBrowserService {
|
||||||
|
|
||||||
private static final Logger log = LoggerFactory.getLogger(PlaywrightBrowserService.class);
|
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 Playwright playwright;
|
||||||
private Browser browser;
|
private Browser browser;
|
||||||
|
|||||||
Reference in New Issue
Block a user