나만의 안전신문고는 모바일 어플과 연동하여 카카오톡이나 안전신문고 앱 알림을 인식하는 즉시 상세 내용을 크롤링, 파싱하여 사용자가 편하게 신고건에 대한 사후 처리 결과를 추적할 수 있도록 하는 것이 목적입니다.
이를 위해선 해당 프로그램을 24시간 켜놓고 웹 상에 노출시켜야 합니다. 운용중인 홈서버가 있을 경우 제격이겠지만, 그런 경우는 드물 것이고, ARM계열이 아닌 x86계열의 NAS가 있다면(시놀로지의 plus모델 등) 그것으로도 가능합니다. 그러나 그렇지 않고 일반 데스크탑만 가지고 있을 경우 프로그램 한 개를 위해 상시전원을 넣어놓기는 부담될 수도 있습니다.
이 프로그램은 N100 미니PC정도의 사양이면 충분히 잘 돌아갑니다. 그러나, 그것마저도 부담스러울 경우를 위해 이 글을 읽는 분이 왕초보라고 가정하고 라즈베리파이에 설치하고 도메인을 구입해 외부연동을 하는 것까지 설명해보겠습니다.
제가 가진 모델은 라즈베리파이4 램 4기가 모델이며, 테스트해본 결과 레거시 방식의 크롤링은 조금 힘들어하고, 크롤링 중 데이터 조회가 많이 느린 편이었습니다. 램이 부족하진 않았습니다. SD카드를 사용해도 I/O Delay가 생기는 수준은 아닙니다.
빠른 결론 : 굴러다니는 라즈베리파이4가 있다면 그냥 사용하시고, 새로 사실 예정이라면 라즈베리파이5 램 4기가 정도를 추천드립니다. 제일 좋은건 그거보다 조금 더 써서 N100 미니PC를 구입하시는 걸 추천드립니다. 라즈베리파이3은 사용이 어렵습니다.
일반 핸드폰용 고속 충전기를 사용하면 전력부족으로 클럭이 내려가 느려집니다. 5V 3A급의 전용 아답터를 사용하세요(라즈베리파이5의 경우 5A 이상).
라즈비안 설치
라즈베리파이는 라즈비안이라는 전용 리눅스OS가 있습니다. 컴퓨터에 적어도 16기가 이상의 SD카드 혹은 USB메모리를 꽃고 이 곳에서 프로그램을 다운받아 OS이미지를 구워주면 됩니다.

설치 시 English를 설치하면 알아서 한글로 출력됩니다(-_-..?).
보유한 모델에 따라 Raspberry Pi 5나 4를 선택 후 가장 최신 OS를 선택하고, SD카드(혹은 USB스틱)를 지정, 호스트 이름을 편한데로 지정해주세요.




그 다음 사용자 이름과 비밀번호를 설정하세요. 이게 있어야 OS가 설치된 후 내부에 접근할 수 있습니다.

와이파이로 구동하려면 아래 정보를 미리 입력해둘 경우 편하게 사용할 수 있습니다.
단, 유선환경이 좀 더 빠릿하기 때문에 저는 유선 환경으로 진행합니다.

SSH는 비밀번호 인증 모드로 켜두겠습니다. 만일, 라즈베리파이에 연결해줄 모니터가 없을 경우 SSH를 통해 진행할 수 있습니다.

라즈베리파이 커넥트는 별도 설정 없어도 중계서버를 이용해 원격제어를 할 수 있게 해주는 것으로, 사용을 원하실 경우 이 곳에서 회원가입 후 토큰을 발급받으시면 됩니다.
어차피 나만의 안전신문고는 켜두고 세팅하기만 하면 화면을 직접 볼 일은 없고 초반엔 SSH와 VNC를 잠깐 이용하면 되기 때문에, 저는 그냥 넘어가겠습니다.

이후 ‘기록’ 버튼을 클릭해 OS이미지를 구운 뒤 완료되면 라즈베리파이에 꼽고 전원을 넣으면 됩니다.

기초 설정
라즈베리파이 IP찾기
라즈베리파이에 모니터가 연결되어 있다면, 모니터에 현재 연결된 IP가 출력될 겁니다. 모른다면, 아래 예시처럼 공유기에서 연결된 기기명을 보고 찾는 방법도 있습니다.

VNC 켜기
화면을 보고 다루는 것이 편하기 때문에, VNC뷰어로 원격제어를 할 껀데, 이 기능을 사용하기 위해선 라즈베리파이에서 해당 설정을 켜주어야 합니다.
이 과정은, 라즈베리파이를 직접 건드리지 않고 내 데스크톱에서 라즈베리파이를 조작하기 위한 설정으로, 라즈베리파이에 직접 키보드/마우스를 꽃아 조작할 예정이라면 아래 나만의 안전신문고 문단으로 건너뛰어도 됩니다.
모니터가 연결되어 있다면, 메뉴 – Preferences – Control Centre – Interfaces – VNC를 순서대로 클릭해서 켜주면 됩니다.

모니터가 없다면, 명령 프롬포트를 열어주고 아래처럼 입력합니다(username 및 IP는 각자 환경에 맞게)
ssh {username}@10.30.10.16
아래처럼 메세지가 출력되면 yes라고 입력한 후 비밀번호를 입력하면 됩니다.
The authenticity of host '10.30.10.16 (10.30.10.16)' can't be established.
ED25519 key fingerprint is SHA256:kQm6tw/60ejEhPwJ9k0bwd4MsDI0H4jevbZYVTpihZY.
This key is not known by any other names.
Are you sure you want to continue connecting (yes/no/[fingerprint])?
이후 라즈베리파이에 접속되면 아래처럼 색깔이 바뀝니다.

여기서 sudo raspi-config를 입력해 메뉴에 진입한 뒤 Interface Options – VNC – Yes를 클릭합니다.




enabled되었다는 메세지가 출력되면 끝난겁니다.
Finish를 선택하여 빠져나오고 터미널은 닫아도 됩니다.

VNC 접속
VNC 뷰어는 그냥 아무 편한거 쓰시면 됩니다. 저는 RealVNC를 다운받겠습니다.

처음 실행 후 하단의 Use RealVNC Viewer without signing In을 클릭해서 귀차니즘을 방지합니다.

라즈베리파이의 IP를 입력하면 아래처럼 처음 연결하는 기기니까 확인하라는 메세지가 나옵니다. Continue를 클릭하고 아이디 패스워드를 넣습니다.


그럼 아래같이 라즈베리파이를 원격제어할 수 있게 됩니다.

나만의 안전신문고 설치
도커 설치
도커는 가상머신같은 개념입니다. 딥하게 들어가지 말고 그냥 간단하게 ‘경량화된 가상머신 같은 거’라고 알고 계시면 됩니다.
라즈베리파이에서 Ctrl+Alt+T 단축키를 입력해 터미널 창을 띄운 뒤 아래 명령어를 입력하면 알아서 도커를 설치해 줍니다.
curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh그러면 짧지도 않고 길지도 않은 시간 뭐가 주루룩 지나가고 난 다음 알아서 도커설치가 완료됩니다.
나만의 안전신문고 설치
화면 상단의 폴더 모양 아이콘을 눌러 나타난 곳에 마우스로 우클릭하여 새 폴더를 생성합니다.
예시에서는 mysafetyreport라고 하겠습니다.

그리고 해당 폴더 내부에서 다시 한 번 우클릭으로 data라는 이름의 폴더를 생성합니다.

그리고 키보드의 F4를 눌러주면 해당 위치에서 터미널이 열립니다. 열리지 않을 경우 Tools탭을 클릭하여 Open Current Folder in Ternimal을 클릭합니다.

터미널이 열리면 아래와 같이 입력하세요. VNC뷰어는 클립보드를 공유하므로 복사 붙여넣기(Shift+Insert)도 가능합니다.
wget https://github.com/Fentanest/safetyreport/blob/main/docker-compose.yml
이제 아래와 같이 입력하면 됩니다.
sudo docker compose up -d
이제 라즈베리파이 IP 뒤에 :6819 붙여서 인터넷창으로 접속해보면 나만의 안전신문고에 접속됩니다.

모바일 연동
기기 연동 메뉴에서 연동할 기기의 별칭을 정하고 API키를 생성합니다.


Github에서 APK파일을 다운받아 실행한뒤, 서버URL에 http://10.30.10.16:6819, API Key에 방금 복사한 키를 입력합니다.

이 어플의 목적을 제대로 달성하려면 요구하는 권한은 모두 허가해주는 것이 좋습니다.



데이터를 받아온 것을 확인 후 기기 연동 페이지를 확인해보면 연결된 기기에 대한 정보가 표시됩니다.

크롬 구동 방식 설정
앱 설정 페이지에서 2. 크롤링 설정 항목을 찾아 ‘로컬 데스크톱 크롬’을 선택하고 Headless모드를 켜주세요.
프로그램(도커 이미지) 내부에 포함된 크로니움을 사용하도록 하는 설정이고, 도커 내부엔 디스플레이가 없어 Headless를 켜지 않으면 오류가 발생합니다.

그 외에 프로그램 설정에 대한 부분은 프로그램 소개글을 참조해 주세요.
외부 접속 및 연동
서론
이렇게까지 진행했으면 프로그램과 안드로이드 앱은 잘 작동하긴 합니다.
라즈베리파이와 같은 네트워크를 공유하는, 우리집 안에서만요.
우리가 원하는건 내가 밖에 돌아다니고 있어도 안전신문고 알람을 알아서 서버(라즈베리파이)에 전송하고 내용을 긁어와 내가 편하게 보는 겁니다.
그러기 위해선, 나만의 안전신문고를 외부에서 접속가능하게 만들 필요가 있습니다.
외부 접속에 필요한 건 크게 2가지입니다.
하나는 주소(ex, naver.com), 다른 하나는 안전(인증서)입니다.
인증서(https)는 최소한의 안전장치입니다. 이거 좀 편리하게 쓰자고 내 데스크탑을 채굴용 좀비PC로 만들 순 없으니까요.
이 모든 작업을 무료로 좀 편하게 할 방법을 열심히 강구해봤으나, 지역별로 통신사에서 멋대로 웹포트(80,443)를 닫아버리는 경우도 있고 해서 1년에 커피 두 잔값 정도는 쓰는게 속편하겠다는 결론이 났습니다(원래 한 잔값이었는데 도메인비용도 오르고 달러환율도 올라서;).
안그러면 이런거 잘 모르는 사람을 상대로 설명해야 하는게 너무 많으니까요. 다들 그런거 알아서 뚝딱 할 줄 알았다면 ‘마인크래프트 서버 접속/생성하는 방법’같은게 검색완성어로 추천될리가 없습니다.
도메인 구입
커피값이란 다름 아닌 도메인(naver.com, google.com 같은 것) 구입비용입니다.
우린 외부연동까지 모조리 Cloudflare(이하 ‘클플’)라는 곳의 서비스를 이용할 것이기 때문에, 그냥 속 편하게 클플에서 도메인을 구입합시다.
본인이 쓰고 싶은 이름을 검색해보면 아래처럼 가능한 TLD를 나열해 줍니다.


우린 한국인이지만 uk도메인을 구입한다고 누구한테 혼나는게 아니니 제일 저렴한걸 사면 됩니다.
한 번 구입한 도메인은 1년동안 유지되고, 결제카드만 유효하다면 알아서 연장도 해 줍니다.
회원가입 후 원하는 도메인을 구입하고 나면 자신의 계정 홈에 아래처럼 보유한 도메인이 표시됩니다.
(아래부턴 제가 보유한 worklazy.net을 예시로 사용하겠습니다.)

Cloudflare Tunnel 설치
왼쪽 메뉴의 Zero Trust 클릭 후 네트워크 – 커넥터를 순서대로 클릭합니다.


터널 생성 – Cloudflared를 클릭합니다.


터널 이름은 임의로 정하시고 저장을 클릭합니다.

운영 체제와 아키텍처를 각각 Debian과 arm64-bit로 선택합니다.
아래에 나온 박스의 내용물을 몽땅 라즈베리파이에 붙여넣고 엔터칩니다.



이후 두 개의 한줄짜리 박스 중 위의 내용을 복사하여 붙여넣습니다.
아래의 것은 딱 한 번만 실행한다는 내용으로, 만일 라즈베리파이를 재부팅하면 외부접속이 먹통이 되는 것이니 저희 취지와 맞지 않습니다.


잠시 기다려보면 웹페이지에서 연결된 커넥터를 확인할 수 있습니다. 다음을 클릭합니다.

이후 Subdomain은 빈 칸, 도메인은 방금 구입한 도메인(저는 제가 보유한 도메인을 선택합니다).
형식 HTTP, URL에 localhost:6819를 입력합니다.
여기서의 빈 칸은 루트도메인(아무 사족 없는 도메인)을 사용하겠다는 뜻으로 아래사진과 같은 경우 worklazy.net이 됩니다.
(www는 제가 입력한 게 아니라 예시로 입력되어있는 placeholder입니다)
만일 구입한 도메인이 worklazy.net이고 아래처럼 설정한다면, 추후 외부에서 worklazy.net로 접속하면 됩니다.

이우 우측 하단의 ‘설정 완료’를 클릭하면 커넥터 페이지에서 작동중인 커넥터를 확인할 수 있고,

방금 구입한 도메인으로 접속해보면 아래처럼 잘 접속되는 걸 확인할 수 있습니다.
개인 가정 내 환경, 공유기 설정 등에 따라 집 내부에서 외부 도메인을 거쳐 접속(NAT)이 불가능할 수 있으니 핸드폰의 와이파이를 잠시 끄고 모바일 데이터로 테스트해보면 됩니다.

인증서 정책 변경
계정 홈으로 돌아가서 보유중인 도메인을 클릭한 후, 좌측의 SSL/TLS - 개요를 클릭합니다.


오른쪽의 구성을 클릭한 뒤

전체(엄격)을 선택하고 저장을 클릭합니다.

이러면 외부 접속을 위한 도메인 구입 및 연동, 인증서 적용은 모두 끝납니다.
안드로이드 앱 주소 변경
안드로이드 어플에서 우측 상단의 톱니바퀴를 누른 뒤 최초에 http://10.30.10.16:6819로 입력했던 부분을 https://worklazy.net (기타 여러분이 구매한 도메인)으로 변경한 후, 연결 테스트 수행, 저장 버튼을 클릭하면 마무리됩니다.



여기까지 해서 라즈베리파이에 나만의 안전신문고 설치, 웹 호스팅, 모바일 어플 연동을 모두 완료했습니다!

