Red Hat Enterprise Linux에 Mattermost 배포
Mattermost v12.0요약
Red Hat Enterprise Linux(RHEL) 9 이상 또는 Rocky Linux, AlmaLinux, Oracle Linux, CentOS Stream 9 이상과 같은 호환 배포판에 Mattermost 서버를 설치합니다.
사용 가능 에디션: Free, Professional, Enterprise, Enterprise Advanced
사용 가능 배포 방식: 셀프 호스팅
Red Hat Enterprise Linux(RHEL) 9 이상 또는 Rocky Linux, AlmaLinux, Oracle Linux, CentOS Stream 9 이상과 같은 호환 배포판에 Mattermost 서버를 설치합니다. RHEL에는 서명된 APT 방식의 리포지터리가 없으므로, 이 가이드는 릴리즈 tarball에서 설치하고 systemd를 수동으로 설정한 다음, RHEL 배포에 일반적으로 필요한 보안 구성(SELinux 컨텍스트, firewalld 규칙, fapolicyd 허용 규칙)을 안내합니다.
- 운영 체제: RHEL 9 이상, Rocky Linux 9 이상, AlmaLinux 9 이상, Oracle Linux 9 이상 또는 CentOS Stream 9 이상. v12.0부터 서버 바이너리는 glibc 2.34 이상이 필요하므로, 이러한 배포판의 버전 7 및 8 릴리즈(glibc 2.17 및 2.28)에서는 v11.7 ESR을 포함하여 Mattermost v11.11 이하만 실행할 수 있습니다.
- 하드웨어: vCPU 1개 및 RAM 2GB(최대 약 1,000명 사용자 지원).
- 데이터베이스: PostgreSQL 15 이상.
- 네트워크: TCP 80/443 인바운드(TLS), 8065 인바운드(System Console), 10025 아웃바운드(SMTP 릴레이를 사용하는 경우).
1단계: PostgreSQL 데이터베이스 확보#
다음 중 하나를 선택하세요.
- 동일한 호스트에 PostgreSQL을 로컬로 설치합니다. PostgreSQL 설치 문서를 참조하세요.
- 외부 PostgreSQL 서버를 사용하고 2단계 전에 연결 자격 증명을 확보합니다.
- 관리형 데이터베이스 서비스를 사용합니다(AWS RDS, Azure Database for PostgreSQL 등).
2단계: 데이터베이스 준비#
데이터베이스 준비 지침에 따라 Mattermost 데이터베이스, 사용자, 권한을 생성합니다.
3단계: Mattermost 서버 tarball 다운로드#
대상 호스트에 SSH로 접속하여 릴리즈를 다운로드합니다. ARM 기반 하드웨어의 경우 amd64를 arm64로 교체하세요.
wget https://releases.mattermost.com/12.0.0/mattermost-12.0.0-linux-amd64.tar.gz
wget https://releases.mattermost.com/11.7.12/mattermost-11.7.12-linux-amd64.tar.gz
Enterprise 및 Team Edition 릴리즈는 버전 아카이브에서 확인할 수 있습니다.
4단계: Mattermost 서버 설치#
먼저 기존 시스템 패키지를 업데이트합니다.
sudo dnf update
sudo dnf upgrade
tarball을 추출하고, 제자리로 이동한 다음, 소유권을 설정합니다.
tar -xvzf mattermost*.gz
sudo mv mattermost /opt
sudo mkdir /opt/mattermost/data
sudo useradd --system --user-group mattermost
sudo chown -R mattermost:mattermost /opt/mattermost
sudo chmod -R g+w /opt/mattermost
/opt/mattermost 이외의 경로나 mattermost 이외의 사용자/그룹 이름을 사용하는 경우, 이후 모든 단계에서 해당 이름을 사용하세요.
/etc/systemd/system/mattermost.service에 systemd 유닛 파일을 생성합니다.
이 가이드의 이전 버전에서는 패키지 관리자가 설치하고 소유하는 유닛 파일용으로 예약된 /lib/systemd/system/ 아래에 유닛 파일을 만들도록 안내했습니다.
[Unit]
Description=Mattermost
After=network.target
[Service]
Type=notify
ExecStart=/opt/mattermost/bin/mattermost
TimeoutStartSec=3600
KillMode=mixed
Restart=always
RestartSec=10
WorkingDirectory=/opt/mattermost
User=mattermost
Group=mattermost
LimitNOFILE=49152
[Install]
WantedBy=multi-user.target
systemd를 리로드합니다.
sudo systemctl daemon-reload
5단계: 서버 구성 및 시작#
편집하기 전에 기본 구성을 백업합니다.
sudo cp /opt/mattermost/config/config.json /opt/mattermost/config/config.defaults.json
/opt/mattermost/config/config.json을 편집하여 다음을 설정합니다.
SqlSettings.DriverName:"postgres"SqlSettings.DataSource:"postgres://mmuser:<mmuser-password>@<host>:5432/mattermost?sslmode=disable&connect_timeout=10"— 각 플레이스홀더를 교체합니다.ServiceSettings.SiteURL: 배포의 공개 URL(예:https://mattermost.example.com).- (권장)
SupportSettings.SupportEmail: 사용자가 도움이 필요할 때 연락하는 이메일 주소.
서버를 시작합니다.
sudo systemctl start mattermost
curl http://localhost:8065
Mattermost HTML 응답이 표시되어야 합니다. 부팅 시 자동 시작되도록 활성화합니다.
sudo systemctl enable mattermost.service
강화된 RHEL 시스템에서 시작에 실패하면 다른 곳에서 문제를 해결하기 전에 아래의 강화된 RHEL 구성 섹션을 계속 진행하세요. 원인은 거의 항상 SELinux, firewalld 또는 fapolicyd입니다.
6단계: 서버 업데이트#
tarball 기반 설치는 수동으로 업그레이드합니다. Mattermost 서버 업그레이드를 참조하세요.
강화된 RHEL 구성#
강화된 RHEL 설치에는 일반적으로 SELinux, firewalld, fapolicyd에 대한 추가 구성이 필요합니다. 각각 아래에서 설명합니다.
RHEL 9는 SELinux가 강제(enforcing) 모드로 설정된 상태로 제공됩니다. sestatus로 확인하세요. 강제 모드라면 Mattermost를 시작하기 전에 적절한 컨텍스트를 설정하세요.
/opt/mattermost/bin의 바이너리 컨텍스트를 설정합니다.
sudo semanage fcontext -a -t bin_t "/opt/mattermost/bin(/.*)?"
sudo restorecon -RF /opt/mattermost/bin
/opt/mattermost의 디렉터리 컨텍스트를 설정합니다. 현재 컨텍스트를 확인합니다.
ls -Z /opt/mattermost
유형이 default_t이면 웹 애플리케이션 컨텍스트를 설정합니다.
sudo semanage fcontext -a -t httpd_sys_content_t "/opt/mattermost(/.*)?"
sudo restorecon -R /opt/mattermost
Mattermost가 8065 포트(또는 구성한 포트)에 바인딩하도록 허용합니다.
sudo semanage port -l | grep 8065
sudo semanage port -a -t http_port_t -p tcp 8065
SELinux가 특정 작업을 차단하는 경우 커스텀 정책을 생성합니다. 거부 내역을 확인합니다.
sudo ausearch -m avc -ts recent
sudo cat /var/log/audit/audit.log | grep denied
해당 거부 내역으로 정책 모듈을 생성합니다.
sudo yum install -y policycoreutils-python-utils
sudo grep mattermost /var/log/audit/audit.log | audit2allow -M mattermost_policy
sudo semodule -i mattermost_policy.pp
재시작 및 확인:
sudo systemctl restart mattermost
디버깅을 위해 sudo setenforce 0으로 SELinux를 일시적으로 permissive(허용) 모드로 전환할 수 있습니다. 컨텍스트가 올바르게 설정되면 sudo setenforce 1로 강제 모드를 다시 활성화하세요. 프로덕션 배포를 permissive 모드로 운영하지 마세요.
참고 자료
firewalld는 RHEL의 기본 방화벽입니다. 상태를 확인합니다.
sudo systemctl status firewalld
Mattermost 포트를 엽니다:
sudo firewall-cmd --permanent --add-port=8065/tcp
sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --permanent --add-service=https
sudo firewall-cmd --reload
sudo firewall-cmd --list-all
출력에 8065/tcp와 http / https 서비스가 표시되어야 합니다.
Mattermost Calls 포트 (Calls 플러그인 또는 독립형 rtcd 서비스를 실행하는 경우):
# Integrated Calls plugin
sudo firewall-cmd --permanent --add-port=8443/udp
sudo firewall-cmd --permanent --add-port=8443/tcp
sudo firewall-cmd --reload
# Standalone rtcd (adds API port)
sudo firewall-cmd --permanent --add-port=8045/tcp
sudo firewall-cmd --reload
- 8443 포트(UDP/TCP)는 RTC 미디어(오디오, 비디오, 화면 공유)를 전송합니다.
- 8045 포트(TCP)는 rtcd API입니다.
- RTC용 TCP 지원에는 Calls v0.17 이상 및 rtcd v0.11 이상이 필요합니다.
전체 토폴로지는 Calls 배포 가이드를 참조하세요.
fapolicyd(File Access Policy Daemon)는 신뢰할 수 없는 바이너리의 실행을 차단합니다. 보안 RHEL 환경에서는 Mattermost 바이너리와 플러그인을 차단하는 경우가 많으며, 증상은 mattermost.log의 "operation not permitted" 오류입니다.
일시적으로 중지하여 fapolicyd가 원인인지 확인합니다.
sudo systemctl stop fapolicyd
sudo systemctl start mattermost
이제 Mattermost가 작동하면 fapolicyd를 재시작하고 허용 규칙을 구성합니다.
거부 항목을 식별합니다.
sudo fapolicyd --debug
다음과 같은 줄을 찾습니다.
rule=15 dec=deny_audit perm=execute auid=-1 pid=19735
exe=/opt/mattermost/bin/mattermost : path=/opt/mattermost/plugins/focalboard/server/dist/plugin-linux-amd64
ftype=application/x-executable trust=0
규칙 번호를 확인하세요. 허용 규칙은 먼저 평가되도록 이보다 낮은 번호여야 합니다.
/etc/fapolicyd/rules.d/80-mattermost.rules에 허용 규칙을 생성합니다.
allow perm=execute exe=/usr/bin/sudo trust=1 : dir=/opt/mattermost/ all trust=0
allow perm=execute exe=/opt/mattermost/bin/mattermost : dir=/opt/mattermost all trust=0
allow perm=execute exe=/usr/lib/systemd/systemd trust=1 : dir=/opt/mattermost/ all trust=0
검증 및 로드:
sudo fagenrules --check
sudo fagenrules --load
sudo systemctl restart fapolicyd
sudo systemctl restart mattermost
확인합니다.
curl http://localhost:8065
sudo systemctl status mattermost
독립형 rtcd 서비스 규칙 (배포한 경우): /etc/fapolicyd/rules.d/80-rtcd.rules를 생성합니다.
allow perm=execute exe=/usr/bin/sudo trust=1 : dir=/opt/rtcd/ all trust=0
allow perm=execute exe=/opt/rtcd/bin/rtcd : dir=/opt/rtcd all trust=0
allow perm=execute exe=/usr/lib/systemd/systemd trust=1 : dir=/opt/rtcd/ all trust=0
그런 다음 위와 같이 fapolicyd를 리로드합니다. 전체 rtcd 설치 경로는 RTCD 설정 및 구성을 참조하세요.
fapolicyd 규칙은 순서대로 평가됩니다. 허용 규칙은 Mattermost를 차단하는 거부 규칙보다 낮은 번호여야 하며, 기본 구성에서는 보통 80-이 안전합니다. 거부 항목이 계속 발생하면 fapolicyd --debug에서 규칙 번호를 다시 확인하고 그에 맞게 번호를 조정하세요.
참고: Mattermost와 fapolicyd 지원 문서.
Mattermost 제거#
서버를 중지하고 필요한 데이터를 백업한 다음, 설치 디렉터리를 제거합니다.
sudo systemctl stop mattermost
sudo rm -rf /opt/mattermost
sudo rm /lib/systemd/system/mattermost.service
sudo userdel mattermost
/opt/mattermost에는 config/, logs/, plugins/, client/plugins/, data/가 있습니다. 복원이 필요할 수 있다면 rm -rf를 실행하기 전에 이 항목들을 백업하세요.