Mattermost install with docker-composer on Centos7

Docker와 Docker-Compose가 Centos에 이미 설치 되어있다는 전제임

Location

관련 자료

docker-compose github 위치

https://github.com/mattermost/mattermost-docker

docker-compose를 이용한 deployment 설명

https://docs.mattermost.com/install/prod-docker.html

로컬 Download 및 환경 설정

git clone https://github.com/mattermost/mattermost-docker.git
cd mattermost-docker
docker-compose build
mkdir -pv ./volumes/app/mattermost/{data,logs,config,plugins,client-plugins}
chown -R 2000:2000 ./volumes/app/mattermost/
docker-compose up -d

상위와 같은 순서데로 하면 대부분 잘 작동 하는 것으로 보임

그러나 나 같은 경우는 상위 처럼 해서 정상 작동을 하지 않아 다음과 같이 수정하였음

Permission Error를 피하기 위한 수정 사항

[root@localhost mattermost-docker]# ls
LICENSE  MAINTENANCE.md  README.md  app  contrib  db  docker-compose.yml  volumes  web
[root@localhost app]# ll
합계 0
drwxr-xr-x. 7 2000 2000 81  6월 28 19:43 mattermost
[root@localhost app]# pwd
/root/mattermost/mattermost-docker/volumes/app
[root@localhost app]#

상위와 같은 내용은 로컬 Download 및 환경 설정이 되었다면 동일 할 것이다.

그러나 Postgres와 app이 directory prmission denied 나게 된다면 다음과 같이 수정 해줄 필요가 있다.

[root@localhost mattermost-docker]# ls
LICENSE  MAINTENANCE.md  README.md  app  contrib  db  docker-compose.yml  volumes  web
[root@localhost mattermost-docker]# vi docker-compose.yml
[root@localhost mattermost-docker]# pwd
/root/mattermost/mattermost-docker
[root@localhost mattermost-docker]#

여기에서 docker-compose.yml을 아래와 같이 수정 필요하다.

version: "2"

services:

  db:
    build: db
    read_only: true
    restart: unless-stopped
    volumes:
-     - ./volumes/db/var/lib/postgresql/data:/var/lib/postgresql/data
+     - ./volumes/db/var/lib/postgresql/data:/var/lib/postgresql/data:z
      - /etc/localtime:/etc/localtime:ro
    environment:
      - POSTGRES_USER=mmuser
      - POSTGRES_PASSWORD=mmuser_password
      - POSTGRES_DB=mattermost
    # uncomment the following to enable backup
    #  - AWS_ACCESS_KEY_ID=XXXX
    #  - AWS_SECRET_ACCESS_KEY=XXXX
    #  - WALE_S3_PREFIX=s3://BUCKET_NAME/PATH
    #  - AWS_REGION=us-east-1

  app:
    build:
      context: app
      # uncomment following lines for team edition or change UID/GID
      args:
-      # - edition=team
-      # - PUID=2000
-      # - PGID=2000
+       - edition=team
+       - PUID=2000
+       - PGID=2000
    restart: unless-stopped
    volumes:
-     - ./volumes/app/mattermost/config:/mattermost/config:rw
-     - ./volumes/app/mattermost/data:/mattermost/data:rw
-     - ./volumes/app/mattermost/logs:/mattermost/logs:rw
-     - ./volumes/app/mattermost/plugins:/mattermost/plugins:rw
-     - ./volumes/app/mattermost/client-plugins:/mattermost/client/plugins:rw
+     - ./volumes/app/mattermost/config:/mattermost/config:z
+     - ./volumes/app/mattermost/data:/mattermost/data:z
+     - ./volumes/app/mattermost/logs:/mattermost/logs:z
+     - ./volumes/app/mattermost/plugins:/mattermost/plugins:z
+     - ./volumes/app/mattermost/client-plugins:/mattermost/client/plugins:z
      - /etc/localtime:/etc/localtime:ro
    environment:
      # set same as db credentials and dbname
      - MM_USERNAME=mmuser
      - MM_PASSWORD=mmuser_password
      - MM_DBNAME=mattermost
      # in case your config is not in default location
      #- MM_CONFIG=/mattermost/config/config.json

  web:
    build: web
    ports:
      - "80:80"
      - "443:443"
    read_only: true
    restart: unless-stopped
    volumes:
      # This directory must have cert files if you want to enable SSL
      - ./volumes/web/cert:/cert:ro
      - /etc/localtime:/etc/localtime:ro

수정을 하는 사유

솔직히 정확히는 모르겠다.

그냥 짐작을 하자면 다음과 같다.

SELinux 동작 모드

centos 공식 사이트에서 다운로드 받은 DVD iso 파일을 default로 install 하면 SELinux가 작동 하게 된다.

SELinux는 Security Enhanced Linux의 의미로 Linux의 보안을 강화 하기 위한 모드이다.

zero day 공격 및 buffer overflow 등 어플리케이션 취약점 방어를 위한 kernel 이라고 한다.

sestatus 명령어를 사용해서 SELinux 모드가 작동 중인지 확인 할 수있다.

[root@localhost mattermost-docker]# sestatus
SELinux status:                 enabled
SELinuxfs mount:                /sys/fs/selinux
SELinux root directory:         /etc/selinux
Loaded policy name:             targeted
Current mode:                   enforcing
Mode from config file:          enforcing
Policy MLS status:              enabled
Policy deny_unknown status:     allowed
Max kernel policy version:      31
Docker와 selinux

https://docs.docker.com/v17.09/engine/admin/volumes/bind-mounts/#configure-the-selinux-label

Docker에서는 share를 위한 파일 label을 제공 하는데 그것은 SELinux에서 관리 하는 영역이다.

[root@localhost mattermost-docker]# ls -Z
-rw-r--r--. root root unconfined_u:object_r:admin_home_t:s0 LICENSE
-rw-r--r--. root root unconfined_u:object_r:admin_home_t:s0 MAINTENANCE.md
-rw-r--r--. root root unconfined_u:object_r:admin_home_t:s0 README.md
drwxr-xr-x. root root unconfined_u:object_r:admin_home_t:s0 app
drwxr-xr-x. root root unconfined_u:object_r:admin_home_t:s0 contrib
drwxr-xr-x. root root unconfined_u:object_r:admin_home_t:s0 db
-rw-r--r--. root root unconfined_u:object_r:admin_home_t:s0 docker-compose.yml
drwxr-xr-x. root root unconfined_u:object_r:admin_home_t:s0 volumes
drwxr-xr-x. root root unconfined_u:object_r:admin_home_t:s0 web
  • unconfined_u : user
  • object_r : role
  • admin_home_t : type
  • s0 : level

상위와 같이 파일별 라벨링을 통해서 DAC 컨트롤을 처리 한다.

https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/7/html/selinux_users_and_administrators_guide/sect-security-enhanced_linux-working_with_selinux-selinux_contexts_labeling_files

라지만 역시 아직도 이해는 안간다...

아무튼 상위와 같은 사유로 z 옵션을 통해서 컨테이너가 mount한 파일 시스템의 영역을 share 할 수있는지 여부를 설정해준다.

  • z : 여러 컨테이너가 마운트한 contents를 share 할 수있다.
  • Z : share 하지 않고 컨텐츠를 마운트한다.

여기서 Z의 의미가 하나의 컨테이너로 마은트 하면 된다는 의미인지는 잘 모르겠다. 일단 mattermost는 z로 처리 하면 정상 작동한다.

728x90
반응형

'Software활용' 카테고리의 다른 글

Pgmodeler install  (0) 2020.03.27
Build a Node.js and React app with npm on jenkins  (0) 2020.03.27
Jenkins with tomcat  (0) 2020.03.27
Jenkins on centos7  (0) 2020.03.27
Jenkins Basic  (0) 2020.03.27