Recommanded Free YOUTUBE Lecture: <% selectedImage[1] %>

Contents

Mattermost

Mattermost는 오픈소스 기반의 설치가능한(self-hostable) 온라인 채팅 서비스 및 파일공유 소프트웨어다. Slack의 오픈소스 버전이라고 할 수 있을 정도로 Slack과 유사한 인터페이스와 기능들을 제공한다.

효과적인 커뮤니케이션 시스템 구성은 개발환경에 매우 중요한 요소다. 나는 Slack, Jira, Confluence 조합을 주로 사용했다. 매우 훌륭한 조합이긴 한데, 보안 이슈 때문에 Slack을 사용 할 수 없는 경우가 있다. 이때 mattermost를 slack 대안으로 사용 할 수 있다.

Mattermost 설치

나는 아래와 같은 통합 개발 환경을 만들려고 한다.

 커뮤니케이션 환경

이들 환경은 개발팀에서 요구 할 경우 즉시 배치를 해야 하기 때문에 도커(docker)로 관리하기로 했다. 여기에서는 traefik를 reverse proxy로 하는 mattermost docker-compose를 구성 할 것이다.

traefik은 오픈소스 기반의 Edge Router이다. kong, istio와 유사한 솔류션이다.

 traefik

아래는 docker-compose 파일이다.
version: "2"

services:
    traefik:
        image: "traefik"
        container_name: "traefik"
        depends_on:
            - "mattermost"
        ports:
            - "80:80"
            - "8080:8080"
        volumes:
            - /var/run/docker.sock:/var/run/docker.sock
            - /home/yundream/workspace/devops/traefik.yml:/etc/traefik/traefik.yml
    mattermost:
        image: mattermost/mattermost-prod-app
        environment:
            - DB_PORT_NUMBER=3306
            - MM_SQLSETTINGS_DRIVERNAME=mysql
            - MM_SQLSETTINGS_DATASOURCE=mmuser:1234abcd@tcp(db:3306)/mattermost?charset=utf8mb4,utf8&readTimeout=30s&writeTimeout=30s
            - MM_USERNAME=mmuser
            - MM_PASSWORD=1234abcd
            - MM_DBNAME=mattermost
        labels:
            - "traefik.enable=true"
            - "traefik.port=8000"
            - "traefik.frontend.rule=Host:chat.joinc.co.kr"
            - "traefik.http.routers.mattermost.rule=Host(`chat.joinc.co.kr`)"
    db:
        image: mysql/mysql-server:8.0
        # read_only: true
        restart: unless-stopped
        volumes:
            - ./volumes/db/var/lib/mysql:/var/lib/mysql
            - /etc/localtime:/etc/localtime:ro
        environment:
            - MYSQL_ROOT_PASSWORD=mysql-root-password
            - MYSQL_USER=mmuser
            - MYSQL_PASSWORD=1234abcd
            - MYSQL_DATABASE=mattermost
하나씩 분석해보자.

    traefik:
        image: "traefik"
        container_name: "traefik"
        depends_on:
            - "mattermost"
        ports:
            - "80:80"
            - "8080:8080"
        volumes:
            - /var/run/docker.sock:/var/run/docker.sock
            - /home/yundream/workspace/devops/traefik.yml:/etc/traefik/traefik.yml
  • image : traefik 이미지를 사용한다.
  • container_name : 컨테이너 이름을 traefik로 설정했다.
  • depends_on : 서비스간의 종속성을 설정한다. traefik는 mattermost service에 종속성이 걸려있으므로 mattermost가 실행이 되어야지 traefik 서비스가 실행된다.
  • ports : traefik는 proxy를 위한 포트 80과 관리를 위한 포트 8080을 제공한다.
  • volumes : 볼륨을 마운트 하기 위해서 사용한다. traefik은 모니터링과 proxy를 위해서 도커로 실행된 mattermost의 정보를 알고 있어야지만 한다. docker api를 호출하기 위해서 docker.sock를 마운트했다. 아래는 traefik.yml 내용이다.
    ## traefik.yml
    
    # Docker configuration backend
    providers:
      docker:
        defaultRule: "Host(`{{ trimPrefix `/` .Name }}.docker.localhost`)"
    
    # API and dashboard configuration
    api:
      insecure: true
mattermost는 mysql과 postgresql를 지원한다. 나는 mysql를 사용하기로 했다. db 서비스를 먼저 확인해보자.
    db:
        image: mysql/mysql-server:8.0
        # read_only: true
        restart: unless-stopped
        volumes:
            - ./volumes/db/var/lib/mysql:/var/lib/mysql
            - /etc/localtime:/etc/localtime:ro
        environment:
            - MYSQL_ROOT_PASSWORD=mysql-root-password
            - MYSQL_USER=mmuser
            - MYSQL_PASSWORD=1234abcd
            - MYSQL_DATABASE=mattermost
mattermost 데이터베이스를 위한 환경을 설정했다.
  • MYSQL_DATABASE : mattermost가 사용할 데이터베이스
  • MYSQL_USER : mattermost 데이터베이스 사용자 계정
  • MYSQL_PASSWORD : 사용자 페스워드
  • MYSQL_ROOT_PASSWORD : Mysql 루트 패스워드
MYsQL_USER, MYSQL_PASSWORD, MYSQL_DATABASE 값은 mattermost 데이터베이스 설정에 사용한다.

mattermost 설정을 살펴보자.
    mattermost:
        image: mattermost/mattermost-prod-app
        environment:
            - DB_PORT_NUMBER=3306
            - MM_SQLSETTINGS_DRIVERNAME=mysql
            - MM_SQLSETTINGS_DATASOURCE=mmuser:1234abcd@tcp(db:3306)/mattermost?charset=utf8mb4,utf8&readTimeout=30s&writeTimeout=30s
            - MM_USERNAME=mmuser
            - MM_PASSWORD=1234abcd
            - MM_DBNAME=mattermost
        labels:
            - "traefik.enable=true"
            - "traefik.port=8000"
            - "traefik.frontend.rule=Host:chat.joinc.co.kr"
            - "traefik.http.routers.mattermost.rule=Host(`chat.joinc.co.kr`)"
앞서 설정한 mysql 데이터베이스 정보로 환경(environment)를 설정한다. 가장 중요한 것은 labels 다. 이렇게 된거 labels의 작동원리를 살펴보기로 했다. docker-compose up 으로 docker 애플리케이션을 실행 한 후 컨테이너 정보를 확인했다.
# docker ps
CONTAINER ID    IMAGE                            COMMAND                  CREATED        STATUS                   PORTS                                        NAMES
dc6d6be0cdc3    traefik                          "/entrypoint.sh trae…"   12 hours ago   Up 4 minutes             0.0.0.0:80->80/tcp, 0.0.0.0:8080->8080/tcp   traefik
42e332afa8a4    mattermost/mattermost-prod-app   "/entrypoint.sh matt…"   12 hours ago   Up 4 minutes (healthy)   8000/tcp                                     devops_mattermost_1
785f04c525df    mysql/mysql-server:8.0           "/entrypoint.sh mysq…"   12 hours ago   Up 4 minutes (healthy)   3306/tcp, 33060/tcp                          devops_db_1
docker inspect명령으로 devops_mattermost_1 컨테이너의 label 정보를 확인 할 수 있다. labels 외의 내용은 생략했다.
{
      "Labels": {
          "com.docker.compose.config-hash": "52ba544852067a964ac465020317cd4da506935ce18abff7d71497dc3e89e9d9",
          "com.docker.compose.container-number": "1",
          "com.docker.compose.oneoff": "False",
          "com.docker.compose.project": "devops",
          "com.docker.compose.service": "mattermost",
          "com.docker.compose.version": "1.21.0",
          "traefik.enable": "true",
          "traefik.frontend.rule": "Host:chat.joinc.co.kr",
          "traefik.http.routers.mattermost.rule": "Host(`chat.joinc.co.kr`)",
          "traefik.port": "8000"
      }
}
traefik 의 compose 설정에서 docker.sock를 마운트했던 것을 기억할 것이다. traefik 컨테이너는 docker.sock를 이용, mattermost 컨테이너의 label을 읽어서 라우팅룰을 만들 수 있다.
  1. traefik는 mattermost 컨테이너의 IP를 읽는다.
  2. traefik.port 를 읽는다.
  3. traefik는 mattermost 컨테이너의 label을 읽어서 "chat.joinc.co.kr"로 향하는 요청을 IP:PORT로 proxy 할 수 있다.

Mattermost 실행

Mattermost를 실행하기 전에 hosts 파일을 수정한다.
# cat /etc/hosts
127.0.0.1	localhost chat.joinc.co.kr

Mattermost를 실행해보자.
# docker-compose up
WARNING: Some networks were defined but are not used by any service: outside-world, internal-network
Starting devops_mattermost_1 ... done
Starting devops_db_1         ... done
Starting traefik             ... done
Attaching to devops_mattermost_1, devops_db_1, traefik
db_1          | [Entrypoint] MySQL Docker Image 8.0.19-1.1.15
db_1          | [Entrypoint] Starting MySQL 8.0.19-1.1.15
mattermost_1  | Using existing config file /mattermost/config/config.json
mattermost_1  | Using existing database connection
db_1          | 2020-04-19T08:01:27.649106Z 0 [System] [MY-010116] [Server] /usr/sbin/mysqld (mysqld 8.0.19) starting as process 1

Mattermost는 웹, 데스크탑, 모바일 클라이언트를 제공한다. 데스크탑은 윈도우즈, 리눅스, 맥 클라이언트를 제공하며, 모바일은 안드로이드와 iOS를 제공한다.

 Mattermost linux desktop application

정리

  • Docker compose를 스터디하는 문서가 되버렸네...
  • Docker compose network를 알아보자.
  • 그냥 Docker compose를 전반적으로 다시 살펴봐야 할 것 같다.
  • Docker swarm 기반으로 개발환경을 재 구성해보자.
  • github로 지금 코드들을 정리해야 겠는데..