안녕하세요, 천상나타입니다.

    시리즈 앞 글들에서 SD 슬롯 고장난 파이를 USB 부팅으로 살리고, 첫 부팅을 완전 자동화한 얘기를 했는데요. 이번엔 그 파이에 Jenkins와 셀레니움 크롤러를 올린 뒤, 헤드리스인데도 브라우저가 움직이는 걸 눈으로 보게 만든 세팅입니다.

    자동화 잡이 진짜로 사이트를 여는지, 캡차에 막히는지, 어디서 멈추는지를 확인하려면 화면이 필요한데 — Lite 이미지엔 GUI가 아예 없거든요. xvfb-run으로 임시 가상 화면을 만드는 방법도 있지만, 그건 실행할 때만 생기고 끝나면 사라지는 거라 "지금 뭐 하고 있는지"는 볼 수 없습니다.

    그래서 고정된 가상 디스플레이 + VNC 서버를 만들어서, 맥에서 파이의 화면에 상시 접속하게 했습니다.

    첫 시도: Xvfb + x11vnc — 됐다가 안 됐다

    직관적인 조합부터 썼습니다:

    • Xvfb :1 — 가상 X 서버를 띄워서 화면 없이 GUI 프로그램이 그려지게 함
    • x11vnc — 그 :1 화면을 VNC로 중계

    동작은 했어요 — VNC로 접속하면 가상 데스크톱이 보였습니다. 문제는 부팅 때마다 죽는 것. 로그를 보니 x11vnc가 Xvfb보다 먼저 뜨면서 연결할 화면이 없어 죽거나, MIT-SHM BadAccess 에러로 브라우저가 창을 못 띄웠어요.

    원인은 구조 자체에 있었습니다 — x11vnc는 "이미 존재하는 X 서버의 화면을 중계"하는 도구라, 중계 대상이 먼저 준비돼야 합니다. systemd로 순서를 맞춰도 타이밍이 불안정했어요.

    정착: TigerVNC + openbox — X서버를 VNC가 직접 띄운다

    답은 중계가 아니라 생성이었습니다. TigerVNC의 Xvnc는 VNC 서버와 가상 X 서버가 한 프로세스라 — 시작 순서 문제가 아예 없습니다.

    구성은 이렇게 했어요:

    
    # 1) TigerVNC + 최소 창 관리자 + 한글 폰트
    sudo apt install tigervnc-standalone-server openbox fonts-noto-cjk
    
    # 2) VNC 비밀번호 설정 (8자 제한 주의)
    vncpasswd ~/.config/tigervnc/passwd
    
    # 3) :1 세션에서 openbox가 창을 관리하도록
    cat > ~/.config/tigervnc/xstartup <<'SH'
    #!/bin/sh
    unset SESSION_MANAGER
    openbox &
    SH
    chmod +x ~/.config/tigervnc/xstartup
    
    # 4) systemd 서비스로 부팅 시 자동 기동
    vncserver -localhost no :1
    

    포인트 몇 가지:

    • ~/.vnc vs ~/.config/tigervnc — 최신 버전은 후자를 씁니다. 전자에 파일을 만들면 "마이그레이션 실패"로 안 뜹니다(이것도 삽질했어요)
    • 비밀번호 8자 제한 — vncpasswd가 8자 이상을 받아도 실제론 8자까지만 저장됩니다
    • -localhost no — 이거 없으면 로컬호스트만 들어요. 같은 네트워크의 맥에서 접속하려면 필수

    headless 파이에서 브라우저를 눈으로 보는 구조 — Xvfb+x11vnc의 불안정한 중계 방식 vs TigerVNC의 생성 방식

    맥에서 접속 — 앱 설치 필요 없음

    맥은 VNC 클라이언트가 내장돼 있습니다. Finder에서 ⌘+K(서버에 연결) → vnc://192.168.45.253:5901 입력하면 화면공유가 바로 뜨고 비밀번호 넣으면 파이의 가상 데스크톱이 보여요.

    처음엔 브라우저가 안 보이는 빈 화면만 나왔는데 — openbox가 창 관리만 하는 최소 환경이라 그렇습니다. 크롬을 띄우면 그제서야 창이 생겼어요:

    
    DISPLAY=:1 chromium-browser --no-sandbox https://www.google.com &
    

    VNC 화면에 크롬 창이 실제로 뜨는 걸 확인했습니다 — headless 파이에서 GUI가 살아있다는 증거.

    진짜 목적: 셀레니움 크롤러를 눈으로 보기

    이제 본론 — Jenkins에서 돌던 성북구 크롤링 스크립트를 VNC 화면에서 실행해 봤습니다.

    
    DISPLAY=:1 venv/bin/python3 SbSubscription.py
    

    이 한 줄이 다입니다. 셀레니움이 chromedriver를 통해 chromium을 띄우는데, DISPLAY=:1이 잡아서 창을 가상 디스플레이에 그립니다. 그리고 그 화면을 VNC가 중계하니까 — 맥 화면에서는 크롤러가 사이트를 열고, 스크롤하고, 버튼을 누르는 게 실시간으로 보였어요.

    DISPLAY=:1로 셀레니움 실행 → 가상 디스플레이에 창이 그려지고 VNC로 중계되는 구조

    왜 이게 필요했냐면:

    • 크롤러가 조용히 실패할 때 — 로그에 "element not found"만 뜨면 원인을 추측해야 하는데, 화면 보면 "아 사이트 구조가 바뀌어서 버튼이 없구나"가 바로 보입니다
    • 캡차·봇 탐지 확인 — headless에서만 나오는 차단 화면이 있는지 직접 확인 가능
    • 디버깅 중 브라우저 상태를 유지한 채로 다른 터미널에서 로그 확인 가능

    나중에 잡을 Jenkins에 올릴 땐 xvfb-run -a로 돌리면 됩니다 — 실행마다 임시 화면을 만들고 정리하니까 부담이 없어요. 개발·검증할 땐 VNC로 보고, 운영할 땐 xvfb-run으로 하는 게 제 결론입니다.

    추가로 겪은 사소한 문제들

    • 한글 깨짐 — 처음엔 사이트 한글이 전부 네모(□)로 나왔습니다. Lite 이미지엔 폰트가 빈 거나 마찬가지라 fonts-noto-cjk 하나 설치로 해결
    • VNC 비밀번호 입력 안 됨 — 맥 화면공유에서 붙여넣기가 안 먹혀서 직접 타이핑. 8자 제한 때문에 짧은 비밀번호로 해두길 잘했습니다
    • 화면 공유 끊김 후 재접속 — vncserver는 데몬으로 돌고 있어서 끊겨도 세션은 유지됩니다. 다시 접속하면 하던 화면이 그대로 있어요

    정리

    헤드리스 파이에서 브라우저 자동화를 돌릴 때 "눈으로 보는" 건 사치가 아니라 디버깅 도구입니다. 정리하면:

    • Xvfb+x11vnc 중계 방식은 시작 순서·MIT-SHM 문제로 불안정 → TigerVNC+openbox가 정답
    • vncserver :1로 고정 가상 디스플레이를 만들고, DISPLAY=:1로 GUI 프로그램을 띄움
    • 맥은 내장 화면공유로 vnc://IP:5901 접속 — 별도 앱 없이 바로
    • 개발·검증할 땐 눈으로 보고, Jenkins 운영 잡은 xvfb-run -a로 headless 유지

    이걸로 파이 세팅 시리즈는 마무리입니다 — 죽은 슬롯 우회, 첫 부팅 자동화, 눈으로 보는 크롤링까지. 이제 이 파이는 Jenkins + 크롤러 + Tailscale 원격 접속까지 갖춘 완전한 작업 서버가 됐어요.

    728x90
    Posted by 천상나타.