NAS에서 ChromeDriver가 안 될 때 — Docker Ubuntu 컨테이너 + crontab으로 우회한 자동화 파이프라인
<!– 대표 이미지 권장: hiwony-1-1/59/img/img_2.png (Docker 컨테이너 목록 화면) –>
“자료 저장용으로 24시간 켜져 있는 NAS를 활용하여 네이버 카페 로그인 및 카페 댓글 작성을 자동화로 구현한다.”
이 한 문장이 꽤 긴 우회의 시작이었습니다. 직접 운영하는 카페의 반복 작업을 자동화하고 싶었고, 항상 켜져 있는 NAS가 가장 자연스러운 실행 환경처럼 보였습니다. 그런데 NAS에는 Chrome이 설치되지 않아 ChromeDriver를 직접 쓸 수 없었고, Docker Ubuntu로 우회했더니 이번엔 apt 서버에 연결이 안 됐습니다. 그 문제를 풀고 나서야 shell script와 crontab까지 연결할 수 있었습니다.
이 글은 그 다섯 단계 우회의 전체 흐름을 정리한 회고이자, 같은 길을 걷는 분께 드리는 안내입니다.
사전 준비 사항
본격적으로 들어가기 전에, 이 글에서 다루는 환경을 따라 구성하려면 아래 조건을 갖춰두면 수월합니다.
- NAS에 SSH로 접속할 수 있어야 합니다.
- NAS에 Docker 패키지가 설치되어 있어야 합니다 (시놀로지 기준 패키지 센터에서 설치).
- Linux 기본 명령어 (
ls,cd,mkdir,vi) 사용에 익숙하면 좋습니다.
이 중 하나라도 생소하다면, SSH 접속 설정 및 Docker 패키지 설치를 먼저 진행하신 뒤 돌아오시면 됩니다.
1. 출발점 — NAS에서 ChromeDriver를 쓰고 싶었습니다
Selenium + ChromeDriver로 headless 브라우저 자동화를 하려면 Chrome이 먼저 설치돼 있어야 합니다. 그런데 시놀로지 NAS는 경량 리눅스 OS를 사용하는데, Chrome이 지원되지 않고 설치도 되지 않습니다. 결국 NAS 자체에서 ChromeDriver를 직접 사용하지 못한다는 결론에 이를 수밖에 없었습니다.
당시 블로그에는 이렇게 남겼습니다.
“알아보고 테스트해보고 몇일 꼬박 걸렸습니다.”
처음에는 설정 문제인가 싶어 이것저것 시도해봤지만, NAS 위에서 Chrome을 직접 올리는 건 근본적으로 안 된다는 사실을 확인하는 데만 며칠이 걸렸습니다. NAS 위에 별도 환경을 하나 올리고, 그 안에서 Chrome을 사용하는 우회 방법을 찾아야 했습니다.
<!– 이미지: hiwony-1-1/59/img/img_1.png | alt: 시놀로지 NAS Docker 패키지 GUI 실행 화면 –>
2. 차선책 — Docker Ubuntu로 우회하기로
VMware, XenServer 같은 가상 머신은 세팅하고 사용해본 경험이 있었지만, Docker를 직접 써본 적은 없었습니다. Docker Ubuntu 안에서 Chrome이 설치되고 ChromeDriver가 제대로 동작할지도 알 수 없는 상태로 시작했습니다.
그래도 자신감의 근거가 하나 있었습니다. “가상 머신들 안에서 동작하는 것과 이론적으로 같다”고 판단했고, 자료를 찾다 보니 NAS에 가상 머신으로 Windows 10을 세팅한 자료도 있어서 “더욱 가능하겠다”는 생각이 들었습니다. NAS Docker 패키지가 GUI로 간단히 실행된다는 점도 진입 장벽을 낮춰줬습니다. 일단 Docker를 처음으로 써보기로 했습니다.
3. Docker Ubuntu 20.04 컨테이너 띄우기
3.1 NAS Docker 패키지에서 컨테이너 생성
NAS Docker 패키지는 GUI로 간단하게 실행할 수 있습니다. 컨테이너를 생성하고 이름을 ubuntu2로 설정했습니다.
<!– 이미지: hiwony-1-1/59/img/img_2.png | alt: 시놀로지 NAS Docker 컨테이너 목록 화면 –>
3.2 docker exec로 컨테이너 접속하기
컨테이너를 띄운 뒤에는 SSH로 NAS에 접속하고, root 계정으로 전환한 뒤 Docker 컨테이너 안으로 들어갔습니다.
$ sudo -i # root 계정으로 전환
$ docker ps # docker 현재 상황 확인
$ docker exec -it ubuntu2 /bin/bash # ubuntu2 컨테이너에 접속
docker exec 명령에서 ubuntu2(NAMES) 대신 컨테이너 ID(786f8bf91866)를 입력해도 동일하게 접속됩니다.
3.3 apt 업데이트 및 패키지 설치
컨테이너 안에 들어오면 가장 먼저 apt 업데이트부터 진행합니다.
$ apt-get update
$ apt-get upgrade
이후에는 Python3, Google Chrome, ChromeDriver, 관련 의존성 패키지를 순서대로 설치하고, 환경 변수(PATH)도 잡아줘야 합니다. 상세 설치 명령어는 아래 외부망 문제 해결 포스팅에 함께 정리해뒀습니다.
그런데 여기서 문제가 생겼습니다. 컨테이너 생성 시 설정이 잘못되어 Docker가 외부 인터넷에 연결되지 않았고, apt 서버에 접속이 안 돼 패키지를 설치하지 못하는 상황이 발생했습니다. NAS와 Docker를 하나의 네트워크로 설정하는 옵션 문제였는데, 이 부분의 해결 과정은 별도 글에 정리해뒀습니다.
→ apt-get update가 안 될 때 — NAS Docker 외부망 연결 문제 해결
4. shell script로 Python 감싸기
4.1 cron에서 Python 직접 실행이 실패하는 이유
cron에서 바로 Python 파일을 실행하면 환경 변수(PATH) 경로가 터미널 세션과 달라, 파이썬 인터프리터나 의존 라이브러리를 찾지 못해 실행이 실패하는 경우가 있습니다. 저도 이 오류를 겪었고, shell script로 Python을 감싸는 방법으로 해결했습니다.
4.2 Python 실행 + 로그 기록 shell script 구조
shell script 안에서 Python 파일을 호출하고, 실행 결과를 로그 파일에 기록하는 구조입니다. “Python 실행 → stdout/stderr를 로그 파일에 append”로 이루어진 간단한 스크립트입니다. 상세 내용은 아래 포스팅에 정리해뒀습니다.
→ log 작성하는 Shell Script — python 실행 + 로그 남기기
이 단계가 짧아 보여도, 이후 crontab 디버깅 과정에서 로그가 얼마나 중요한지 실감하게 됩니다. shell script 없이 cron에서 Python을 바로 실행했다가 오류가 나도 원인을 찾기가 어렵습니다.
5. crontab으로 정기 실행
자동화의 마지막 퍼즐은 crontab입니다. 원하는 시간에 shell script가 자동으로 실행되도록 등록하면 됩니다.
처음에 cron이 정상적인 동작을 안 해서 꽤 헤맸습니다. 아래 외부 글에서 원인 파악에 도움을 많이 받았습니다.
→ crontab이 정상 실행 안 될 때 (외부 참조)
5.1 crontab -e로 간단히 등록하기
저는 30분당 한 번 동작하면 됐기 때문에 crontab -e로 열고 아래 항목을 추가했습니다.
$ crontab -e
등록 항목:
0,30 * * * * /0.python/naver/job.sh
0,30은 매시간 0분과 30분에 동작한다는 의미입니다.
<!– 이미지: hiwony-1-1/59/img/img.png | alt: crontab -e 등록 화면 –>
5.2 /etc/crontab 직접 수정 — root 명시
crontab -e와 별개로, 에디터로 /etc/crontab 파일을 직접 수정하는 방법도 있습니다. 이 경우에는 실행 계정(여기서는 root)을 명시해야 합니다.
$ vi /etc/crontab
# 맨 아래에 작성
0,30 * * * * root /0.python/naver/job.sh
5.3 cron 재시작 및 로그로 동작 확인
내용을 추가한 뒤에는 반드시 cron을 재시작해야 변경이 반영됩니다.
$ service cron restart
<!– 이미지: hiwony-1-1/59/img/스크린샷 2021-01-12 오후 10.07.05.png | alt: python log 출력으로 crontab 정상 동작을 확인하는 화면 –>
Python 안에서 로그를 출력할 수 있게 코딩해뒀고, 재시작 이후 로그가 찍히는 것을 보고 정상 동작을 확인했습니다. crontab 사용법 자체는 아래 글에 따로 정리되어 있습니다.
→ Linux crontab 사용법 — 리눅스 예약·반복 작업
자주 묻는 질문 (FAQ)
Q. Docker 대신 KVM 가상 머신이나 Podman도 사용할 수 있나요?
→ 원론적으로는 가능합니다. 시놀로지는 Virtual Machine Manager로 가상 머신을 지원하고, Podman도 Docker와 유사한 컨테이너 환경을 제공합니다. 다만 저는 Docker를 선택했는데, NAS의 Docker 패키지가 GUI로 간편하게 제공되어 진입 장벽이 낮았기 때문입니다.
Q. 컨테이너를 삭제하면 Python 파일도 함께 사라지나요?
→ 컨테이너 내부에만 파일을 저장했다면, 컨테이너 삭제 시 함께 삭제됩니다. NAS의 볼륨(폴더)을 컨테이너에 마운트해두면 컨테이너를 재생성해도 파일이 유지됩니다. 장기 운용을 염두에 두고 있다면 볼륨 마운트 설정을 권장합니다.
Q. QNAP이나 다른 NAS에서도 같은 방법이 되나요?
→ Docker를 지원하는 NAS라면 같은 방식으로 구현할 수 있습니다. 다만 Docker 패키지 설치 방법과 네트워크 설정은 기기마다 다르니, 각 기기의 공식 문서를 먼저 확인하시기 바랍니다.
마무리 — 우회의 우회 끝에
당시 원문에는 이렇게 마무리했습니다.
“여러 조건들을 충족 해야 하는 터라 우회하고 우회한 듯합니다.”
NAS → Docker → apt 외부망 문제 → shell script → crontab으로 이어지는 이 길이 딱 그 표현이었습니다. 어떤 길이 막히면 다른 방법을 찾고, 그 길도 막히면 또 돌아가는 식으로 한 단계씩 나아간 결과였습니다.
5년이 지난 지금도 시놀로지 NAS에 Chrome을 직접 설치하지 못한다는 환경 조건은 크게 다르지 않습니다. Docker로 격리된 컨테이너를 띄워 필요한 환경을 꾸리는 발상은 여전히 유효한 접근이라고 봅니다. 다만 자동화 도구나 런타임 선택지는 그동안 많이 늘었으니, 이 글은 “그때 그 길을 어떻게 찾아갔는가”의 기록으로 읽어주시면 됩니다.
자동화 대상 서비스의 약관과 ToS는 각자 직접 확인하신 후 사용하시기 바랍니다.
5단계 자동화 파이프라인 — 한 장 정리
| 단계 | 무엇을 | 이 글에서 다룬 깊이 | 별도 참조 |
|---|---|---|---|
| 1 | NAS에 Chrome 직접 설치 | 시도 → 불가 판정 | — |
| 2 | Docker Ubuntu 20.04 컨테이너 생성 | GUI로 생성 안내 | — |
| 3 | 컨테이너 안에서 apt 업데이트 / Chrome·ChromeDriver 설치 | 흐름 안내 | hiwony.tistory.com/57 (외부망 문제 해결) |
| 4 | Python을 shell script로 감싸기 | 이유 + 구조 안내 | hiwony.tistory.com/67 |
| 5 | crontab 30분 단위 등록 + service cron restart | 명령어 포함 | hiwony.tistory.com/62, ckbcorp.tistory.com/780 |
원본 포스팅: 2021-01-12 티스토리 blog-59. 본 글은 원본 회고를 바탕으로 5단계 인과 흐름을 재정리한 글입니다.