Python을 쓸 때 virtualenv는 필수였다. 거기에 덤으로 virtualenvwrapper도 같이 쓰곤 했다.
그러던 중 누군가 나에게 말했다.
아직도 Python2를 쓴다고? 이제 대세는 Python3이야!
팔랑귀였던 나는 당장 Python3을 설치했다.
하지만 뭔가 문제가 생겼다. 터미널에서 virtualenv + virtualenvwrapper의 조합으로 가상환경을 구성해 쓰던 나였는데 virtualenv 이 놈은 Python2만 바라보고 있으니 Python3는 가상환경을 구성하지 못하는 불편함이 있었다.
혹시 방법이 있을까해서 help를 쳐봤다.
1 2 3 4 5 6 7 8 9 10 11
$ mkvirtualenv --help ...
-p PYTHON_EXE, --python=PYTHON_EXE The Python interpreter to use, e.g., --python=python2.5 will use the python2.5 interpreter to create the new environment. The default is the interpreter that virtualenv was installed with (/usr/local/opt/python/bin/python2.7)
집이 1층인데 햇빛도 잘 안들어오고 환기도 잘 안되서 거의 항상 습하고 곰팡이도… 어느 주말에 그날도 역시 습한 집에 누워있다가 갑자기 집이 도대체 얼마나 습한건지 궁금해졌다. 어떻게 할까 고민하던 중 작년에 IoT관련 세미나에서 받은 라즈베리파이와 키트를 살펴보니 온습도 센서를 발견했다.(이거다!) 그래서 무작정 개발해보기로 했다.
개발 구상
라즈베리파이와 온습도 센서를 통해 데이터 가져오기
온습도 데이터를 저장하고 웹에서 간단히 보여줄 수 있는 웹 서버 개발
(후에 추가된) 온습도 모니터링해서 알려주는 봇 개발
이렇게만 하면 되겠지..?
라즈베리파이
일단 라즈베리파이에 Thing+가 셋팅되어 있었는데, 그 API를 활용해서 데이터를 불러오려고 시도했다. 하지만 뭔가 잘못된것인지 라즈베리파이와 연동이 안되서 실패했다. 그래서 그냥 빵판에 연결해서 데이터를 뽑아보는 방법으로 바꿨는데 하다보니 좋은 오픈소스도 있어서 쉽게 할 수 있었다.
humidity, temperature = Adafruit_DHT.read_retry(11, 4)
data = {'humidity': humidity, 'temperature': temperature, 'ticktime': datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')}
url = 'SERVER_URL'
res = requests.post(url, data=data) res.content
웹 개발
라즈베리파이로 자체 웹서버를 올려서 사용할까도 생각했었는데 공유기로 연결을 해둬서 그런가 IP포워딩등 여러가지 설정할것이 있어서 그냥 Microsoft의 Azure를 사용하기로 했다. 기본적으로 Node.js + Express 로 웹서버를 구축하고 라즈베리파이에서 전송한 데이터를 몽고디비에 저장하는 API하나를 만들고, 웹 페이지에서 마지막 업데이트 시간과 온도, 습도를 보여주는 페이지를 개발했다. 시간대별로 온습도가 어떻게 변하는지 보고싶어서 plotly.js 라이브러리를 사용해서 그래프를 쉽게 만들었다. 다만 모바일 화면에서 너무 찌그러져보이는 단점이 있는데 커스터마이징을 할 수 있는 d3.js로 나중에 바꿀 생각이다.
생각보다 빠르고 쉽게 구축을 했는데, 막상 웹 페이지에서 보는것만 있으니 조금 별로였다. 쾌적한 온습도 범위를 벗어나면 내가 알 수 있는 어떤 장치가 필요하다고 생각했다.
메신저 개발
사실 처음에는 (이미 해봤던)슬랙 API를 활용해서 만들려고했다. 하지만 좀 새로운 것이 없을까 하다가 슬랙과 유사한 서비스인 잔디에도 비슷한 기능이 있을 것 같아서 찾아보니 역시 있었다. 그래서 내가 원하는 습도가 넘어가면 알림을 Jandi Webhook 을 통해 알림을 줄 수 있게 해놨다.
오예!
그런데 이렇게 막상 만들고나니 습도가 높아졌을 때 알림이 오는건 좋은데 내가 원할 때마다 웹 페이지에 접속하고 보는게 생각보다 불편했다. 그래서 뭔가 대안이 없을까 생각을 하다가 요즘 핫하다는 Facebook Messenger 로 온습도를 알려주는 Bot을 만들기로 했다.
막상 한다곤 했지만 아는게 없어서 일단 이 링크를 따라했다. 생각보다 훨씬 빠르고 간단하게 개발이 완료되었는데, 여기에 뭐 쓰기도 애매한 수준이라 생략하겠다.(저 링크에 더 자세히 나온다.)
웹이 어느정도 개발되고 이제 고도화를 해야할 단계가 왔다. 그 중에 보안을 위해 Https를 도입하는 것이 우선시 되었는데, Https를 사용하기 위해서는 ssl 인증서가 필요했다. ssl 인증서를 구입해서 쓰는 것 보다 언젠가 들어본 Let’s Encrypt를 쓰기로 했다.
Let’s Encrypt
쉽게 말하자면 인증서를 무료로 제공하는 인증기관이다. mozilla, cisco, facebook 등 후원하는 곳들도 많은 것을 보니 믿을만 할 것 같다.
사용 방법
저번에는 letsencrypt repository를 클론 받아서 사용했었는데, 이제 client가 나온 것 같았다. 홈페이지에서도 certbot이라는 클라이언트를 사용하는 것을 추천했다. 들어가보니 첫 페이지에서 Webserver와 OS를 선택하면 그에 맞는 설치 방법도 친절하게 알려줬다.
0. 환경
요즘 개인적으로 하고있는 프로젝트가 있는데 Https를 도입할 일이 있어서 그 서버에서 진행하기로 했다. Azure, Ubuntu 14.04, Nginx 이런 조합이다.
어떤 방식으로 인증을 할거냐 물어보는데 Webserver(nginx)를 따로 사용하고 있으므로 1번을 선택한다.
도메인 이름을 적으면됨
webroot를 /var/www/ 로 설정하고
nginx conf 파일에 이렇게 추가해두었다.
1 2 3
location /.well-known { root /var/www; }
아래와 같은 메시지가 출력되면 성공한건데, /etc/letsencrypt 위치에 설치되어있다.
1 2 3 4 5 6 7 8 9 10 11
IMPORTANT NOTES: - Congratulations! Your certificate and chain have been saved at /etc/letsencrypt/live/{domain}/fullchain.pem. Your cert will expire on 2016-11-10. To obtain a new or tweaked version of this certificate in the future, simply run certbot-auto again. To non-interactively renew *all* of your certificates, run "certbot-auto renew" - If you like Certbot, please consider supporting our work by:
Donating to ISRG / Let's Encrypt: https://letsencrypt.org/donate Donating to EFF: https://eff.org/donate-le