로켓챗을 이용하여 사내 메신저 구축하기

2019. 2. 22. 13:56Article




사내 메신저로 로켓챗을 사용하고 있다. 
이번 글에서는 로켓챗을 채택한 과정과 운영하면서 생긴 이슈와 그를 해결했던 경험을 다루려고 한다.




메신저 선정

메신저를 이용해야 할 인원이 많지 않다면 카카오톡도 좋은 메신저가 될 수 있다. 
하지만 규모가 커지고 다루어야할 주제(단톡방?)가 많아 진다면 한계가 오기 시작한다.
인원 관리도 힘들고 보안에도 좋지 않기 때문이다.

그래서 사내에서 사용할 메신저 서비스를 찾게 되었다.

필요한 조건은 2가지였다.


오픈소스
  • 유지비용이 가급적 들지 않으면 좋겠다.
  • 모두가 신뢰할 수 있는 구조여야 한다.

설치형
  • 데이터 이전이 자유로워야 한다.

처음에는 많이들 사용하는 슬랙이 거론 되었다.
하지만 유지비용과 보안 측면으로 인해 쉽게 선정 결정을 내리지 못했다.

후보로 나온것은 매터모스트, 로켓챗 이었다. 둘 다 슬랙의 기능을 대부분 제공하고 있었다.

이들의 특징으로는 오픈소스 기반에 설치형 버전을 제공한다. 
필요하다면 월사용료를 내고 호스팅과 기술지원을 받을수도 있는 유료모델도 있다.

그 중 로켓챗의 모바일앱이 좀 더 활용하기 편한것으로 보여서 최종적으로 로켓챗으로 선정하였다.
자체적으로 돌릴수 있는 서버가 있었기에 유료모델은 고려하지 않았고 설치형 버전을 사용하기로 하였다.




설치


설치는 리눅스 계열을 추천하는듯 하다. 
Debian(Ubuntu), CentOS 계열에 대한 설치방법을 안내하고 있다.
설치 자체는 심플한 편이다.  링크를 참조하여 진행하면 된다.




운영중 이슈 및 해결


앱에서 푸쉬는 어찌 받을 수 있나

로켓챗은 다양한 방법으로 푸쉬를 지원하고 있다. 푸쉬 관련해서 기본설정으로도 잘 되는 편이다.
하지만.. 로켓챗 푸시서버의 상태가 안좋을 때 푸시가 제대로 서비스 안 될 수도 있기에 다른 방법들에 대해서도 미리 검토를 해보았다.


기본설정 푸시

로켓챗의 푸시 게이트웨이(https://gateway.rocket.chat)를 통해 푸시를 전달한다.
이 푸시는 로켓챗 공식앱을 통해 사용자의 앱으로 푸시가 전달된다.
푸시 발생 후 앱에서 푸시를 받을때까지 보통 2~5초 정도로 응답속도는 준수한 편이다.


자체 게이트웨이 구축

공용으로 쓰는 로켓챗의 푸시 게이트웨이가 가끔 안될 때가 있다. 
지금까지 로켓챗을 1년 넘게 사용해본 결과… 
안되는 상황이, 빈도로 보면 1년에 몇번 정도로 잦은편은 아니다.

하지만 높은 신뢰도가 필요하다면 이것도 불안할 수 있다.
그때는 자체 게이트웨이를 사용하면 된다. 
이와 함께 앱에 들어가는 앱 푸시 정보(APNS, FCM 등)를 마켓 개발자 계정으로 새로 발급받고 앱 소스에 넣어서 새로 빌드 해야한다.

.....이건 쉽게 할 수 있는 작업이 아니다. 
안드로이드 앱은 그나마 개발자 계정 새로 만들어서 배포 하면 되겠지만,
iOS 앱은 개발자 계정으로 설치할 수 있는 기기수 제한도 있고 설치도 불편하다.

나는  자체구축을 포기하고 기본설정 푸시를 사용했다.
혹시 도전하고픈 분들이 계시다면 아래 링크가 도움이 될 것이다.




웹훅 API

레드마인, 젠킨스, 컨플루언스 등 다양한 서비스에서 특정 상황이 되면 
로켓챗에 메시지를 보내주었으면 요청이 있었다.

예를 들자면, 젠킨스에서 빌드가 완료되었을 때 빌드 정보를 로켓챗의 특정 채널 이나 사용자에게 전달해 주는 것이다.

대부분의 서비스에서는 이런 상황을 위해 슬랙에서 사용하는 웹훅API 를 지원하고 있다.
전달할 주소와 인증정보가 필요한데 이것을 슬랙에서 정의하고 서비스 설정에서 넣어서 연동하는 식이다.

로켓챗에서도 슬랙과 동일한 방식으로 웹훅API 연동이 가능하게 되어있다.

메뉴에서 Intergrations > New Integration > incomming webhook 이다.
이곳에서 정보를 등록하고 나온 URL 을 젠킨스 쪽에 넣어주면 된다.

등록해야하는 설정 중 주요 설정은 아래와 같다.

Post to Channel
메시지를 보낼 채널 혹은 사용자의 이름이다. ex) #channel_id , @user_id

Post as
채팅창에 나오는 봇의 이름이다.

Script
일괄적으로 적용하고 싶은 스크립트가 있다면 적는다. 
일반적으로는 비워두고 웹훅을 보내는쪽에서 넣는편이다.

등록을 마치면 WebHook URL 과 Token 이 나온다.

Example 에 있는 예시를 이용하면 커맨드라인 상에서  CURL 을 이용해 메시지를 보낼 수도 있다.

curl -X POST -H 'Content-Type: application/json' --data '{"icon_url":"https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQnQFLCYQ-rg_iJFXBzazZjUqMXTHPmTQ-AVU_JymsxleUHI1Oe","text":"Example message","attachments":[{"title":"Rocket.Chat","title_link":"https://rocket.chat","text":"Rocket.Chat, the best open source chat","image_url":"/images/integration-attachment-example.png","color":"#764FA5"}]}' http://[로켓챗주소]/hooks/[토큰]

레드마인, 젠킨스, 컨플루언스 등에서는 각각 슬랙의 웹훅API 와 연동하는 방법이 각 공식사이트에 정리되어 있다.

슬랙과의 연동방법을 참고해서 웹훅API 정보에 위에서 나온 로켓챗 웹훅 API URL 을 넣으면 된다.



젠킨스에서 슬랙 플러그인 설치 후 설정화면




챗봇

특정 메시지에 반응하는 챗봇을 만들고 싶다는 요청이 있었다.

휴봇(https://hubot.github.com/) 이라는 오픈소스로 된 챗봇이 있다. 
이 챗봇에서는 로켓챗에서 적용할 수 있도록 만든 버전을 지원한다.

설치는 아래 링크에서 참고하자.

2가지 설정파일이 필요하다. 환경설정(.env)과 스크립트(.js)이다.

환경설정 파일에는 로켓챗 접속정보를 넣는다.
스크립트 파일에는 봇이 동작할 로직을 넣으면 된다.

특정 문자열이 입력되면 다른 문자열로 고치는 로직을 간단하게 구현한 스크립트 내용이다. 
'onenote://' 라는 내용이 포함된 문자열이 들어오면 그 내용을 'onenotedesktop:' 으로 변경하는 로직이다.

module.exports = (robot) => {
  robot.hear(/^onenote:\/\/\/(.*)/, (res) => {
    var parsedMsg = res.match[1].replace(/\\/gi, "/")
    parsedMsg = 'onenotedesktop:' + parsedMsg
    parsedMsg = parsedMsg.replace(/\s/g, "%20")
    parsedMsg = parsedMsg.replace(/{/g, "%7B")
    parsedMsg = parsedMsg.replace(/}/g, "%7D")
    res.send(`${parsedMsg}`)
  })
}

휴봇 매뉴얼을 참조하면 이것 외에도 다양한 활용이 가능하다.

추가로, PM2 를 이용하면 nodeJS로 만들어진 휴봇 프로세스 관리를 좀 더 수월하게 할 수 있다.