본문 바로가기

Tools/Other Tools

changedetection.io 셀프 호스팅 하기

사이트 변경사항을 추적하는 서비스를 클라우드 인스턴스에 안전하게 구축해보자.

 

먼저 이미지를 받아서 올려본다.

git clone https://github.com/dgtlmoon/changedetection.io.git
cd changedetection.io
sudo docker-compose up -d

 

만약 실행이 안되면 docker-compse 를 설치해준다.

sudo apt update
sudo apt install docker-compose

 

서비스를 실행해본다.

sudo docker-compose up -d

 

실행 된 컨테이너를 확인해보면 로컬에서만 접근 가능한 상태로 실행됨을 알 수 있다. (127.0.0.1:5000->5000/tcp)

sudo docker ps
CONTAINER ID   IMAGE                                 COMMAND                  CREATED         STATUS         PORTS                      NAMES
8b8141806946   ghcr.io/dgtlmoon/changedetection.io   "python ./changedete…"   7 minutes ago   Up 7 minutes   127.0.0.1:5000->5000/tcp   changedetection

 

yml 파일을 열어서 포트 정보를 수정한다.

cd /home/USERNAME/chagedetection.io
nano docker-compose.yml


ports:
        - 0.0.0.0:5000:5000

 

컨테이너를 내렸다가 다시 올려본다.

sudo docker-compose down
Stopping changedetection ... done
Removing changedetection ... done
Removing network changedetectionio_default

sudo docker-compose up -d
Creating network "changedetectionio_default" with the default driver
Creating changedetection ... done

 

 

http://<도메인>:5000 으로 접속해본다.

http 이므로 안전한 사이트가 아니라는 경고가 나오더라도 그대로 접속하면 된다.

 

그런데 이 상태로는 아무나 웹 사이트에 접근이 가능해져버리는 문제가 있으므로

접속 포트를 변경하고, 인증을 추가하도록 한다.

 

그러기 위해 nginx 를 거쳐서 들어오도록 해야한다.

우선 패스워드 파일을 생성한다. 

sudo apt install apache2-utils
sudo htpasswd -c /etc/nginx/.htpasswd <로그인에 사용할 ID>
New password:
Re-type new password:
Adding password for user ****

 

 

nginx 설정파일에서 인증 파일 정보를 추가해준다. (/etc/nginx/site-avaliable/default)

server {
  server_name yourdomain.com;
  listen 사용할 포트 ssl; # managed by Certbot
  ssl_certificate /etc/letsencrypt/live/xxxxxxxx/fullchain.pem; # Let's Encrypt 인증서 경로
  ssl_certificate_key /etc/letsencrypt/live/xxxxxxxxx/privkey.pem; # Let's Encrypt 개인 키 경로
  
  location / {
    auth_basic "Restricted Content";
    auth_basic_user_file /etc/nginx/.htpasswd;
    proxy_pass_header Server;
    proxy_set_header Host $http_host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Scheme $scheme;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_set_header X-Forwarded-Port "사용할 포트";
    proxy_pass http://localhost:5000;
  }
}

 

nginx 설정 정합성 확인 후, 서비스를 재시작 해준다.

sudo nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
sudo systemctl restart nginx

 

인증이 필요한 상태가 되는지 한 번 접속해본다.

 

근데 이걸로는 대부분의 사이트를 탐지하지 못한다. 

브라우저가 반드시 필요하다..

 

docker-compose.yml 을 다시 아래와 같이 수정한다.

services:
    changedetection:
      image: ghcr.io/dgtlmoon/changedetection.io
      container_name: changedetection
      hostname: changedetection
      volumes:
        - changedetection-data:/datastore
      environment:
        - PLAYWRIGHT_DRIVER_URL=ws://sockpuppetbrowser:3000
      ports:
        - 5000:5000
      restart: unless-stopped
    sockpuppetbrowser:
        hostname: sockpuppetbrowser
        image: dgtlmoon/sockpuppetbrowser:latest
        cap_add:
            - SYS_ADMIN
        restart: unless-stopped
        environment:
            - SCREEN_WIDTH=1920
            - SCREEN_HEIGHT=1024
            - SCREEN_DEPTH=16
            - MAX_CONCURRENT_CHROME_PROCESSES=10
volumes:
  changedetection-data:

 

컨테이너를 내리고 이미지를 pull 하고 다시 실행한다. 

sudo docker-compose down
sudo docker-compose pull
sudo docker-compose up -d

 

 

실제로 웹 페이지를 렌더링 해줄 백엔드 컨테이너가 같이 실행됨을 확인할 수 있다.

 

이제 다시 브라우저로 가서 아마존 제품URL을 넣어서 테스트 해보면...

 

 

header 에 agent 정보를 넣어봤지만...

 

amazon 은 쉽지 않다..