서버 설치 · 21 min read · Oct 27, 2025
Matrix Synapse 및 Element를 사용하여 Rocky Linux 9에서 채팅 서버 설치 및 생성하는 방법

Matrix는 분산형 및 종단 간 암호화된 통신을 위한 개방형 표준입니다. 이는 서로 통신하는 서버 및 서비스의 모음으로, 표준화된 API를 사용하여 실시간으로 동기화됩니다. 홈서버를 사용하여 계정 정보 및 채팅 기록을 저장합니다. 하나의 홈 서버가 다운되면, 분산화의 특성 덕분에 다른 서버는 문제 없이 통신을 계속할 수 있습니다. 다른 사람이 호스팅하는 Matrix 홈 서버를 사용할 수도 있고, 데이터를 제어하기 위해 자신의 서버를 호스팅할 수도 있습니다.
이 튜토리얼에서는 Matrix의 홈 서버 구현인 Synapse를 사용하여 채팅 서버를 설치하고 생성하는 방법을 배웁니다. Element는 Matrix React SDK를 사용하여 구축된 Matrix 웹 클라이언트입니다. 이를 통해 웹에서 Matrix 채팅을 제공할 수 있습니다. 또한 Coturn 서버를 설치하여 음성 및 비디오 통화를 활성화합니다. Coturn 서비스는 사용하지 않으려면 선택 사항입니다.
전제 조건
- Debian 12를 실행하는 서버.
- 루트 권한이 있는 비관리자 사용자.
- 간단한 방화벽(UFW)이 활성화되어 실행 중입니다.
- Matrix, Element 및 Coturn에 대한 완전한 도메인 이름(FQDN)이 서버를 가리키고 있습니다. 우리는 세 가지 서비스에 대해 각각
matrix.example.com,element.example.com,coturn.example.com을 사용할 것입니다. - 모든 것이 업데이트되었는지 확인하십시오.
$ sudo dnf update
- 시스템에 필요한 몇 가지 패키지.
$ sudo dnf install wget curl nano unzip yum-utils policycoreutils-python-utils -y이러한 패키지 중 일부는 이미 시스템에 설치되어 있을 수 있습니다.
1단계 - 방화벽 구성
패키지를 설치하기 전에 첫 번째 단계는 HTTP, HTTPS 및 Synapse용 포트를 열기 위해 방화벽을 구성하는 것입니다. Rocky Linux는 Firewalld 방화벽을 사용합니다. 방화벽의 상태를 확인하십시오.
$ sudo firewall-cmd --state
running방화벽은 서로 다른 영역과 함께 작동하며, 공용 영역은 우리가 사용할 기본 영역입니다. 방화벽에서 활성화된 모든 서비스 및 포트를 나열합니다.
$ sudo firewall-cmd --zone=public --list-all다음과 같은 출력이 표시되어야 합니다.
public
target: default
icmp-block-inversion: no
interfaces: enp1s0
sources:
services: cockpit dhcpv6-client ssh
ports:
protocols:
forward: yes
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:HTTP, HTTPS 및 Synapse 포트를 방화벽에서 엽니다.
$ sudo firewall-cmd --zone=public --add-port=8448/tcp
$ sudo firewall-cmd --zone=public --add-service=http
$ sudo firewall-cmd --zone=public --add-service=https방화벽의 상태를 다시 확인하십시오.
$ sudo firewall-cmd --zone=public --list-all비슷한 출력을 볼 수 있어야 합니다.
public
target: default
icmp-block-inversion: no
interfaces: enp1s0
sources:
services: cockpit dhcpv6-client http https ssh
ports: 8448/tcp
protocols:
forward: yes
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:모든 변경 사항을 영구적으로 만들고 방화벽을 다시 로드하여 변경 사항을 활성화합니다.
$ sudo firewall-cmd --runtime-to-permanent
$ sudo firewall-cmd --reload2단계 - PostgreSQL 설치 및 구성
Rocky Linux 9는 기본적으로 PostgreSQL 13을 제공합니다. 우리는 공식 저장소에서 PostgreSQL 16을 사용할 것입니다.
PostgreSQL RPM 저장소를 설치합니다.
$ sudo dnf install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-9-x86_64/pgdg-redhat-repo-latest.noarch.rpm내장 PostgreSQL 모듈을 비활성화합니다.
$ sudo dnf -qy module disable postgresql이제 다음 명령을 사용하여 PostgreSQL을 설치할 수 있습니다.
$ sudo dnf install -y postgresql16-server postgresql16-contrib postgresql16-develsudo dnf install postgresql16-devel
export PATH=$PATH:/usr/pgsql-16/bin
postgresql-contrib 패키지는 몇 가지 추가 유틸리티를 포함합니다.
버전을 확인합니다.
$ psql --version
psql (PostgreSQL) 16.1PostgreSQL 데이터베이스를 초기화합니다.
$ sudo /usr/pgsql-16/bin/postgresql-16-setup initdb
Initializing database ... OKPostgreSQL 서비스를 활성화합니다.
$ sudo systemctl enable postgresql-16PostgreSQL 서비스를 시작합니다.
$ sudo systemctl start postgresql-16PostgreSQL 서비스의 상태를 확인합니다.
$ sudo systemctl status postgresql-16
? postgresql-16.service - PostgreSQL 16 database server
Loaded: loaded (/usr/lib/systemd/system/postgresql-16.service; enabled; preset: disabled)
Active: active (running) since Tue 2024-01-30 11:55:26 UTC; 10s ago
Docs: https://www.postgresql.org/docs/16/static/
Process: 9610 ExecStartPre=/usr/pgsql-16/bin/postgresql-16-check-db-dir ${PGDATA} (code=exited, status=0/SUCCESS)
Main PID: 9615 (postgres)
Tasks: 7 (limit: 12225)
Memory: 17.4M
CPU: 98ms
CGroup: /system.slice/postgresql-16.service
??9615 /usr/pgsql-16/bin/postgres -D /var/lib/pgsql/16/data/
??9616 "postgres: logger "
??9617 "postgres: checkpointer "
??9618 "postgres: background writer "
??9620 "postgres: walwriter "
??9621 "postgres: autovacuum launcher "
??9622 "postgres: logical replication launcher "
Jan 30 11:55:26 matrix.example.com systemd[1]: Starting PostgreSQL 16 database server...
Jan 30 11:55:26 matrix.example.com postgres[9615]: 2024-01-30 11:55:26.482 UTC [9615] LOG: redirecting log output to logging collector process
Jan 30 11:55:26 matrix.example.com postgres[9615]: 2024-01-30 11:55:26.482 UTC [9615] HINT: Future log output will appear in directory "log".
Jan 30 11:55:26 matrix.example.com systemd[1]: Started PostgreSQL 16 database server.서비스가 기본적으로 활성화되고 실행 중임을 확인할 수 있습니다.
postgres 시스템 계정으로 로그인합니다.
$ sudo -su postgresPostgreSQL용 새 데이터베이스 사용자와 데이터베이스를 생성합니다. 사용자를 생성할 때 비밀번호를 입력하라는 메시지가 표시됩니다.
$ createuser --pwprompt synapse
$ createdb --encoding=UTF8 --locale=C --template=template0 --owner=synapse synapsedbpostgres 계정을 종료합니다.
$ exit3단계 - Matrix Synapse 설치
Matrix Synapse는 Rocky Linux와 같은 CentOS 기반 배포판에 대한 미리 빌드된 패키지가 없습니다. 따라서 PyPI에서 Python 모듈로 설치할 것입니다.
첫 번째 단계는 Synapse가 작동하는 데 필요한 전제 조건을 설치하는 것입니다. python3-virtualenv 패키지를 포함하는 EPEL 저장소도 필요합니다.
$ sudo dnf install epel-release
$ sudo dnf install --enablerepo=crb libtiff-devel libjpeg-devel libzip-devel \
freetype-devel libwebp-devel libxml2-devel libxslt-devel \
libpq-devel python3-virtualenv libffi-devel openssl-devel \
python3-devel libicu-devel
$ sudo dnf groupinstall "Development Tools"
$ sudo dnf install postgresql16-develSynapse를 위한 디렉토리를 생성합니다.
$ mkdir -p ~/synapse해당 디렉토리에 Python 가상 환경을 생성합니다.
$ virtualenv -p python3 ~/synapse/env가상 환경을 활성화합니다.
$ source ~/synapse/env/bin/activate최신 버전의 pip 및 setuptools가 있는지 확인합니다.
(env) $ pip install --upgrade pip
(env) $ pip install --upgrade setuptoolsMatrix Synapse를 설치합니다.
(env) $ pip install "matrix-synapse[postgres]"이 명령은 PyPI에서 Synapse를 다운로드하고 설치하며, ~/synapse/env 폴더 아래의 가상 환경에 사용하는 Python 라이브러리를 설치합니다. 또한 Synapse가 PostgreSQL 서버와 연결하는 데 필요한 PostgreSQL Python 라이브러리도 설치합니다. 위의 명령은 pip install matrix-synapse와 pip install psycopg2 명령의 조합입니다.
다음 단계는 몇 가지 기본 설정으로 구성 파일을 생성하는 것입니다. Synapse 디렉토리로 이동합니다.
(env) $ cd ~/synapse구성 파일을 생성하기 위해 다음 명령을 실행합니다.
(env) $ python -m synapse.app.homeserver \
--server-name matrix.example.com \
--config-path homeserver.yaml \
--generate-config \
--report-stats=[yes|no]--server-name 변수의 값은 Matrix ID의 일부를 형성합니다. 해당 값으로 Matrix 도메인 이름을 입력합니다. 이는 홈 서버 주소로 작용합니다.
--report-stats 변수를 통해 홈 서버에 대한 익명 통계를 Matrix에 보낼지 여부를 선택할 수 있습니다. 선택에 따라 yes 또는 no를 선택하십시오.
다음과 같은 출력이 표시됩니다.
Generating config file homeserver.yaml
Generating log config file /home/navjot/synapse/matrix.example.com.log.config which will log to /home/navjot/synapse/homeserver.log
Generating signing key file /home/navjot/synapse/matrix.example.com.signing.key
A config file has been generated in 'homeserver.yaml' for server name 'matrix.example.com'. Please review this file and customise it to your needs.이 설정은 나중에 ~/synapse/homeserver.yaml 또는 /home/ 파일에서 변경할 수 있습니다. 위 명령으로 생성된 키는 홈 서버가 다른 홈 서버에 자신을 식별할 수 있도록 합니다.
이제 Matrix 서버를 실행할 시간입니다. Synapse 디렉토리 안에 있고 가상 환경이 활성화되어 있는지 확인하십시오.
홈 서버를 시작합니다.
(env) $ synctl start비슷한 출력을 볼 수 있어야 합니다.
This server is configured to use 'matrix.org' as its trusted key server via the
'trusted_key_servers' config option. 'matrix.org' is a good choice for a key
server since it is long-lived, stable and trusted. However, some admins may
wish to use another server for this purpose.
To suppress this warning and continue using 'matrix.org', admins should set
'suppress_key_server_warning' to 'true' in homeserver.yaml.
--------------------------------------------------------------------------------
started synapse.app.homeserver(homeserver.yaml)서버를 중지하려면 다음 명령을 실행하십시오.
(env) $ synctl stop가상 환경을 비활성화합니다.
(env) $ deactivate4단계 - Nginx 설치
생산 환경에서는 Nginx 프록시를 사용하여 Synapse 서버를 실행하는 것이 좋습니다.
Rocky Linux 9는 이전 버전의 Nginx를 제공합니다. 최신 버전을 설치하려면 공식 Nginx 저장소를 사용해야 합니다.
/etc/yum.repos.d/nginx.repo 파일을 생성하고 열어 편집합니다.
$ sudo nano /etc/yum.repos.d/nginx.repo다음 코드를 붙여넣습니다.
[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true
[nginx-mainline]
name=nginx mainline repo
baseurl=http://nginx.org/packages/mainline/centos/$releasever/$basearch/
gpgcheck=1
enabled=0
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true작업이 끝나면 Ctrl + X를 눌러 파일을 저장하고, 프롬프트가 표시되면 Y를 입력합니다.
Nginx 메인라인을 설치할 것이므로 해당 패키지를 활성화합니다.
$ sudo dnf config-manager --enable nginx-mainlineNginx를 설치합니다.
$ sudo dnf install nginx -y설치를 확인합니다.
$ nginx -v
nginx version: nginx/1.25.3Nginx 서버 서비스를 활성화하고 시작합니다.
$ sudo systemctl enable nginx --now서비스의 상태를 확인합니다.
$ sudo systemctl status nginx
? nginx.service - nginx - high performance web server
Loaded: loaded (/usr/lib/systemd/system/nginx.service; enabled; preset: disabled)
Active: active (running) since Tue 2024-01-30 12:50:34 UTC; 4s ago
Docs: http://nginx.org/en/docs/
Process: 10810 ExecStart=/usr/sbin/nginx -c /etc/nginx/nginx.conf (code=exited, status=0/SUCCESS)
Main PID: 10811 (nginx)
Tasks: 3 (limit: 12225)
Memory: 3.1M
CPU: 24ms
CGroup: /system.slice/nginx.service
??10811 "nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf"
??10812 "nginx: worker process"
??10813 "nginx: worker process"5단계 - SSL 설치
SSL 인증서를 생성하기 위해 Certbot을 설치해야 합니다. 이를 위해 Snapd 패키지 설치 관리자를 사용할 것입니다. Rocky Linux에는 기본적으로 포함되어 있지 않으므로 Snapd 설치 관리자를 설치합니다. EPEL(Enterprise Linux의 추가 패키지) 저장소가 필요합니다. 그러나 3단계에서 이미 설치했으므로 직접 진행할 수 있습니다.
Snapd 패키지를 설치합니다.
$ sudo dnf install snapd -ySnap 서비스를 활성화하고 시작합니다.
$ sudo systemctl enable snapd --nowSnap 코어 패키지를 설치하고 Snapd의 버전이 최신인지 확인합니다.
$ sudo snap install core
$ sudo snap refresh coreSnapd가 작동할 수 있도록 필요한 링크를 생성합니다.
$ sudo ln -s /var/lib/snapd/snap /snap
$ echo 'export PATH=$PATH:/var/lib/snapd/snap/bin' | sudo tee -a /etc/profile.d/snapd.shCertbot을 설치합니다.
$ sudo snap install --classic certbotCertbot 명령이 /usr/bin 디렉토리에서 실행될 수 있도록 다음 명령을 사용하여 심볼릭 링크를 생성합니다.
$ sudo ln -s /snap/bin/certbot /usr/bin/certbotCertbot 버전을 확인합니다.
$ certbot --version
certbot 2.8.0다음 명령을 실행하여 SSL 인증서를 생성합니다.
$ sudo certbot certonly --nginx --agree-tos --no-eff-email --staple-ocsp --preferred-challenges http -m [email protected] -d matrix.example.com위 명령은 서버의 /etc/letsencrypt/live/matrix.example.com 디렉토리에 인증서를 다운로드합니다.
Diffie-Hellman 그룹 인증서를 생성합니다.
$ sudo openssl dhparam -dsaparam -out /etc/ssl/certs/dhparam.pem 4096Certbot 갱신 스케줄러 서비스 확인합니다.
$ systemctl list-timerssnap.certbot.renew.service가 실행될 서비스 중 하나로 표시됩니다.
NEXT LEFT LAST PASSED UNIT ACTIVATES ----------------------------------------------------------------------------------------------------------------------------------
Tue 2024-01-30 14:37:50 UTC 29min left Tue 2024-01-30 13:05:13 UTC 1h 3min ago dnf-makecache.timer dnf-makecache.service
Tue 2024-01-30 15:13:00 UTC 1h 4min left - - snap.certbot.renew.timer snap.certbot.renew.service
Wed 2024-01-31 00:00:00 UTC 9h left Tue 2024-01-30 06:35:44 UTC 7h ago logrotate.timer logrotate.serviceSSL 갱신이 잘 작동하는지 확인하기 위해 프로세스를 드라이 런합니다.
$ sudo certbot renew --dry-run오류가 없으면 모든 설정이 완료된 것입니다. 인증서는 자동으로 갱신됩니다.
6단계 - SELinux 구성
SELinux는 바이너리가 사용자의 홈 디렉토리에 있는 시스템 서비스를 실행하는 것을 방지합니다. 이 때문에 Synapse를 위한 서비스 파일을 생성하면 SELinux에 의해 차단됩니다. 이 문제를 해결하기 위해 Python 바이너리가 시스템 서비스로 실행될 수 있도록 다음 명령을 실행해야 합니다.
$ sudo chcon -R -t bin_t /home/username/synapse/env/bin/python외부 호스트에 대한 연결을 허용하는 정책을 적용합니다.
$ sudo setsebool -P httpd_can_network_connect 1Nginx가 PostgreSQL에 접근할 수 있도록 허용하는 정책을 적용합니다.
$ sudo setsebool -P httpd_can_network_connect_db 17단계 - Matrix Systemd 서비스 생성
Synapse 서비스 상태는 재부팅 시 저장되지 않으므로 서버를 재시작하면 서버를 수동으로 시작해야 합니다. 이 문제를 해결하기 위해 Systemd 파일을 생성해야 합니다.
진행하기 전에 Synapse 서비스가 중지되어 있는지 확인하십시오.
$ cd ~/synapse
$ source env/bin/activate
(env) $ synctl stop
(env) $ deactivate/etc/systemd/system/ 디렉토리에서 matrix-synapse.service 파일을 생성하고 열어 편집합니다.
$ sudo nano /etc/systemd/system/matrix-synapse.service다음 코드를 붙여넣습니다. username 변수를 Synapse를 설치한 Linux 시스템 사용자로 바꿉니다.
# This assumes that Synapse has been installed by a user named username.
# This assumes that Synapse has been installed in a virtualenv in
# the user's home directory: `/home/username/synapse/env`.
[Unit]
Description=Synapse Matrix homeserver
After=postgresql-16.service
[Service]
Type=notify
NotifyAccess=main
ExecReload=/bin/kill -HUP $MAINPID
Restart=on-abort
WorkingDirectory=/home/username/synapse
ExecStart=/home/username/synapse/env/bin/python -m synapse.app.homeserver --config-path=/home/username/synapse/homeserver.yaml
SyslogIdentifier=matrix-synapse
# adjust the cache factor if necessary
# Environment=SYNAPSE_CACHE_FACTOR=2.0
[Install]
WantedBy=multi-user.target작업이 끝나면 Ctrl + X를 눌러 파일을 저장하고, 프롬프트가 표시되면 Y를 입력합니다.
서비스 데몬을 다시 로드합니다.
$ sudo systemctl daemon-reloadMatrix Synapse 서비스를 활성화합니다.
$ sudo systemctl enable matrix-synapseMatrix Synapse 서비스를 시작합니다.
$ sudo systemctl start matrix-synapse서비스 상태를 확인합니다.
$ sudo systemctl status matrix-synapse다음과 같은 출력을 볼 수 있어야 합니다.
? matrix-synapse.service - Synapse Matrix homeserver
Loaded: loaded (/etc/systemd/system/matrix-synapse.service; enabled; preset: disabled)
Active: active (running) since Tue 2024-01-30 14:20:20 UTC; 5s ago
Main PID: 14687 (python)
Tasks: 8 (limit: 12225)
Memory: 77.6M
CPU: 3.527s
CGroup: /system.slice/matrix-synapse.service
??14687 /home/navjot/synapse/env/bin/python -m synapse.app.homeserver --config-path=/home/navjot/synapse/homeserver.yaml
Jan 30 14:20:16 matrix.example.com systemd[1]: Starting Synapse Matrix homeserver...
Jan 30 14:20:19 matrix.example.com matrix-synapse[14687]: This server is configured to use 'matrix.org' as its trusted key server via the
Jan 30 14:20:19 matrix.example.com matrix-synapse[14687]: 'trusted_key_servers' config option. 'matrix.org' is a good choice for a key
Jan 30 14:20:19 matrix.example.com matrix-synapse[14687]: server since it is long-lived, stable and trusted. However, some admins may
Jan 30 14:20:19 matrix.example.com matrix-synapse[14687]: wish to use another server for this purpose.
Jan 30 14:20:19 matrix.example.com matrix-synapse[14687]: To suppress this warning and continue using 'matrix.org', admins should set
Jan 30 14:20:19 matrix.example.com matrix-synapse[14687]: 'suppress_key_server_warning' to 'true' in homeserver.yaml.
Jan 30 14:20:19 matrix.example.com matrix-synapse[14687]: --------------------------------------------------------------------------------
Jan 30 14:20:20 matrix.example.com systemd[1]: Started Synapse Matrix homeserver.8단계 - Matrix Synapse 구성
진행하기 전에 먼저 비밀 등록 키를 생성합니다. 이 키는 안전하게 보관해야 하며, 등록이 비활성화된 경우에도 새로운 사용자를 등록할 수 있게 해줍니다.
$ echo "registration_shared_secret: '$(cat /dev/urandom | tr -cd '[:alnum:]' | fold -w 256 | head -n 1)'"
registration_shared_secret: '1y75ja0RUxvbWcS6SdZhakenukUwHHEjOXWC9Mu3FpO0QenOnpKRsc6NBZSxuzPcHYsOEuIQziwVjSZcP87dlWK4ZkIGYniurMqNsCYL4xg5xXs4bJDuTJH2CUXab4U9liv399lmkIZFaMpJCLxV9lVWB9mKHILYsjeLgGY5wAARv1SiK07bFsQOwKJGFqIvsUXmxymx5QCNDzTHw8R4ShqZ7elnnZrbdYk4r2f7qogERNHvQaRV7IEYUIOtMhVP'위의 줄에서 출력을 복사하여 저장합니다.
Matrix 서버는 /home/username/synapse/homeserver.yaml 파일을 통해 구성할 수 있습니다. 편집을 위해 엽니다.
$ nano ~/synapse/homeserver.yaml파일의 맨 아래에 등록 키 명령의 출력을 붙여넣습니다.
기본적으로 Synapse는 SQLite 데이터베이스를 사용하도록 구성되어 있습니다. PostgreSQL 자격 증명을 추가하기 위해 이를 수정해야 합니다.
파일에서 다음 섹션을 찾아 주석 처리합니다.
#database:
# name: sqlite3
# args:
# database: /home/navjot/synapse/homeserver.db그 아래에 다음 섹션을 추가합니다. your-password 필드를 3단계에서 생성한 PostgreSQL 사용자 비밀번호로 바꿉니다. 데이터베이스를 다른 곳에 호스팅하는 경우 localhost를 서버의 IP 주소로 바꿉니다.
database:
name: psycopg2
args:
user: synapse
password: 'your-password'
database: synapsedb
host: localhost
cp_min: 5
cp_max: 10기본적으로 Synapse는 사용자가 온라인인지 여부를 보여주는 존재 표시기를 활성화합니다. 이는 높은 CPU 사용량을 유발할 수 있으므로 비활성화할 수 있습니다. 아래 줄을 맨 아래에 붙여넣습니다.
presence:
enabled: false작업이 끝나면 Ctrl + X를 눌러 파일을 저장하고, 프롬프트가 표시되면 Y를 입력합니다.
새 Matrix 사용자를 생성합니다. 사용자 이름과 비밀번호를 입력하라는 메시지가 표시됩니다. 첫 번째 사용자를 생성하는 것이므로 관리자로 만들 것인지 묻는 질문에 yes라고 입력합니다. 사용자를 생성하기 위해 가상 환경을 활성화해야 합니다.
$ cd ~/synapse
$ source env/bin/activate
(env) $ register_new_matrix_user -c homeserver.yaml http://localhost:8008
New user localpart [navjot]: navjot
Password:
Confirm password:
Make admin [no]: yes
Sending registration request...
Success!
(env) $ deactivate위 명령에서 포트 8008을 사용한 이유는 Matrix Synapse가 기본적으로 수신하는 포트이기 때문입니다.
기본적으로 새로운 사용자 등록은 비활성화되어 있으므로 위와 같이 모든 사용자를 수동으로 등록해야 합니다. 공개 등록을 열고 싶다면 homeserver.yaml 파일을 편집하여 그렇게 할 수 있습니다.
다시 편집을 위해 엽니다.
$ nano ~/synapse/homeserver.yaml맨 아래에 다음 줄을 붙여넣습니다.
enable_registration: true기본적으로 Synapse는 이메일 확인 없이 등록을 허용하지 않습니다. 이메일 확인을 활성화하려면 다음 줄을 붙여넣습니다.
registrations_require_3pid:
- email
email:
smtp_host: mail.example.com
smtp_port: 587
# If mail server has no authentication, skip these 2 lines
smtp_user: '[email protected]'
smtp_pass: 'password'
# Optional, require encryption with STARTTLS
require_transport_security: true
app_name: 'HowtoForge Example Chat' # defines value for %(app)s in notif_from and email subject
notif_from: "%(app)s <[email protected]>"이메일 확인을 비활성화하려면 대신 다음 줄을 붙여넣습니다.
enable_registration_without_verification: true작업이 끝나면 Ctrl + X를 눌러 파일을 저장하고, 프롬프트가 표시되면 Y를 입력합니다.
구성을 적용하기 위해 Synapse를 재시작합니다.
$ sudo systemctl restart matrix-synapse9단계 - Nginx 구성
/etc/nginx/nginx.conf 파일을 편집하기 위해 엽니다.
$ sudo nano /etc/nginx/nginx.confinclude /etc/nginx/conf.d/*.conf; 줄 앞에 다음 줄을 추가합니다.
server_names_hash_bucket_size 64;작업이 끝나면 Ctrl + X를 눌러 파일을 저장하고, 프롬프트가 표시되면 Y를 입력합니다.
/etc/nginx/conf.d/synapse.conf 파일을 생성하고 열어 편집합니다.
$ sudo nano /etc/nginx/conf.d/synapse.conf다음 코드를 붙여넣습니다.
# enforce HTTPS
server {
# Client port
listen 80;
listen [::]:80;
server_name matrix.example.com;
return 301 https://$host$request_uri;
}
server {
server_name matrix.example.com;
# Client port
listen 443 ssl;
listen [::]:443 ssl;
http2 on;
# Federation port
listen 8448 ssl default_server;
listen [::]:8448 ssl default_server;
access_log /var/log/nginx/synapse.access.log;
error_log /var/log/nginx/synapse.error.log;
# TLS configuration
ssl_certificate /etc/letsencrypt/live/matrix.example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/matrix.example.com/privkey.pem;
ssl_trusted_certificate /etc/letsencrypt/live/matrix.example.com/chain.pem;
ssl_session_timeout 1d;
ssl_session_cache shared:MozSSL:10m;
ssl_session_tickets off;
ssl_prefer_server_ciphers on;
ssl_stapling on;
ssl_stapling_verify on;
ssl_dhparam /etc/ssl/certs/dhparam.pem;
resolver 1.1.1.1 1.0.0.1 [2606:4700:4700::1111] [2606:4700:4700::1001] 8.8.8.8 8.8.4.4 [2001:4860:4860::8888] [2001:4860:4860::8844] valid=60s;
resolver_timeout 2s;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;
tcp_nopush on;
gzip on;
location ~ ^(/_matrix|/_synapse/client) {
proxy_pass http://localhost:8008;
proxy_http_version 1.1;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header Host $host;
# Nginx by default only allows file uploads up to 1M in size
# Increase client_max_body_size to match max_upload_size defined in homeserver.yaml
client_max_body_size 50M;
}
}작업이 끝나면 Ctrl + X를 눌러 파일을 저장하고, 프롬프트가 표시되면 Y를 입력합니다. 위 구성은 example.com 및 matrix.example.com 도메인의 IP 주소가 동일한 서버를 가리키고 있다고 가정합니다. 그렇지 않은 경우 example.com 서버에 대한 다음 구성 파일을 사용하십시오.
server {
server_name example.com;
listen 443 ssl http2;
listen [::]:443 ssl http2;
# TLS configuration
ssl_certificate /etc/letsencrypt/live/matrix.example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/matrix.example.com/privkey.pem;
ssl_trusted_certificate /etc/letsencrypt/live/matrix.example.com/chain.pem;
ssl_session_timeout 1d;
ssl_session_cache shared:MozSSL:10m;
ssl_session_tickets off;
ssl_prefer_server_ciphers on;
ssl_stapling on;
ssl_stapling_verify on;
ssl_dhparam /etc/ssl/certs/dhparam.pem;
resolver 1.1.1.1 1.0.0.1 [2606:4700:4700::1111] [2606:4700:4700::1001] 8.8.8.8 8.8.4.4 [2001:4860:4860::8888] [2001:4860:4860::8844] valid=60s;
resolver_timeout 2s;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384;
# Redirect
location ~ ^(/_matrix|/_synapse/client) {
return 301 "https://matrix.example.com$request_uri";
}
# Client homeserver autodiscovery
location /.well-known/matrix/client {
default_type application/json;
add_header Access-Control-Allow-Origin *;
return 200 '{ "m.homeserver": { "base_url": "https://matrix.example.com" } }';
}
# Domain delegation
location /.well-known/matrix/server {
default_type application/json;
add_header Access-Control-Allow-Origin *;
return 200 '{ "m.server": "matrix.example.com" }';
}
}Nginx 구성 파일 구문을 확인합니다.
$ sudo nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successfulNginx 서비스를 재시작합니다.
$ sudo systemctl restart nginx10단계 - Coturn 설치
음성 및 비디오 통화를 활성화하기 위해 NAT 주위에서 릴레이를 사용하는 Traversal Using Relays (TURN) 서버를 설치해야 합니다. 이를 위해 Coturn 패키지를 설치할 것입니다. 이 기능이 필요하지 않다면 이 단계를 건너뛸 수 있습니다.
Coturn을 설치합니다.
$ sudo dnf install coturnTURN 및 UDP 포트를 엽니다.
$ sudo firewall-cmd --zone=public --add-port=3478/{tcp,udp}
$ sudo firewall-cmd --zone=public --add-port=5349/{tcp,udp}
$ sudo firewall-cmd --zone=public --add-port=49152-65535/udp
$ sudo firewall-cmd --runtime-to-permanent
$ sudo firewall-cmd --reloadTurn (coturn.example.com)에 대한 SSL 인증서를 생성합니다.
$ sudo certbot certonly --nginx --agree-tos --no-eff-email --staple-ocsp --preferred-challenges http -m [email protected] -d coturn.example.comCoturn에 대한 인증 비밀을 생성합니다.
$ echo "static-auth-secret=$(cat /dev/urandom | tr -cd '[:alnum:]' | fold -w 256 | head -n 1)"
static-auth-secret=u3ksgJ9X876sFMO00A8KabXwZvzVwCmV30wWvZ7DzGiepRwNRYSCTYzf2E8olNzdDHu7oO3XpT3l5bv5mVdhXEQ3pnoTWBquSVPFFBJtyD6y9gBxiMaD2TYTD2WohQLE9s7OKJVpkDeKTnZQnkmjrFadE3M9DRxPL1W5Lgdg6XLLKABgb5XGkutRgkJOV0JRH4sBYsot63fWq9mcGTm6nAMdIycvDVDOs7vhoeqRzcTbMF0wsfAHVJNhXpGGFDyZ구성 파일을 편집하기 위해 엽니다.
$ sudo nano /etc/coturn/turnserver.conf파일을 살펴보며 필요한 설정을 활성화합니다. 먼저 use-auth-secret 줄의 주석을 제거하여 인증 방법을 활성화합니다.
# Be aware that use-auth-secret overrides some parts of lt-cred-mech.
# The use-auth-secret feature depends internally on lt-cred-mech, so if you set
# this option then it automatically enables lt-cred-mech internally
# as if you had enabled both.
#
# Note that you can use only one auth mechanism at the same time! This is because,
# both mechanisms conduct username and password validation in different ways.
#
# Use either lt-cred-mech or use-auth-secret in the conf
to avoid any confusion.
#
use-auth-secret다음으로 위에서 생성한 값으로 static-auth-secret 변수를 구성합니다. 이 비밀은 나중에 Synapse를 구성하는 데 필요합니다.
# 'Static' authentication secret value (a string) for TURN REST API only.
# If not set, then the turn server
# will try to use the 'dynamic' value in the turn_secret table
# in the user database (if present). The database-stored value can be changed on-the-fly
# by a separate program, so this is why that mode is considered 'dynamic'.
#
static-auth-secret=u3ksgJ9X876sFMO00A8KabXwZvzVwCmV30wWvZ7DzGiepRwNRYSCTYzf2E8olNzdDHu7oO3XpT3l5bv5mVdhXEQ3pnoTWBquSVPFFBJtyD6y9gBxiMaD2TYTD2WohQLE9s7OKJVpkDeKTnZQnkmjrFadE3M9DRxPL1W5Lgdg6XLLKABgb5XGkutRgkJOV0JRH4sBYsot63fWq9mcGTm6nAMdIycvDVDOs7vhoeqRzcTbMF0wsfAHVJNhXpGGFDyZ변경해야 할 다음 값은 realm입니다. 이는 Coturn을 위해 선택한 도메인을 나타냅니다.
# The default realm to be used for the users when no explicit
# origin/realm relationship is found in the database, or if the TURN
# server is not using any database (just the commands-line settings
# and the userdb file). Must be used with long-term credentials
# mechanism or with TURN REST API.
#
# Note: If the default realm is not specified, then realm falls back to the host domain name.
# If the domain name string is empty, or set to '(None)', then it is initialized as an empty string.
#
realm=coturn.example.com세션 수 및 사용자당 세션 수를 정의합니다. 서버에 적합한 값을 선택하십시오.
# Per-user allocation quota.
# default value is 0 (no quota, unlimited number of sessions per user).
# This option can also be set through the database, for a particular realm.
#
user-quota=12
# Total allocation quota.
# default value is 0 (no quota).
# This option can also be set through the database, for a particular realm.
#
total-quota=1200TCP를 비활성화해야 합니다. VOIP는 UDP이기 때문입니다.
# Uncomment if no TCP relay endpoints are allowed.
# By default TCP relay endpoints are enabled (like in RFC 6062).
#
no-tcp-relayCoturn에 대해 생성한 인증서의 위치를 구성해야 합니다.
# Certificate file.
# Use an absolute path or path relative to the
# configuration file.
# Use PEM file format.
#
cert=/etc/letsencrypt/live/coturn.example.com/fullchain.pem
# Private key file.
# Use an absolute path or path relative to the
# configuration file.
# Use PEM file format.
#
pkey=/etc/letsencrypt/live/coturn.example.com/privkey.pem보안을 강화하기 위해 개인 IP 범위에 대한 트래픽을 비활성화하고 멀티캐스트 주소에서 피어를 허용하지 않아야 합니다.
# Flag that can be used to disallow peers on well-known broadcast addresses (224.0.0.0 and above, and FFXX:*).
# This is an extra security measure.
#
no-multicast-peers
...............
# Option to allow or ban specific ip addresses or ranges of ip addresses.
# If an ip address is specified as both allowed and denied, then the ip address is
# considered to be allowed. This is useful when you wish to ban a range of ip
# addresses, except for a few specific ips within that range.
#
# This can be used when you do not want users of the turn server to be able to access
# machines reachable by the turn server, but would otherwise be unreachable from the
# internet (e.g. when the turn server is sitting behind a NAT)
#
# Examples:
# denied-peer-ip=83.166.64.0-83.166.95.255
# allowed-peer-ip=83.166.68.45
denied-peer-ip=0.0.0.0-0.255.255.255
denied-peer-ip=10.0.0.0-10.255.255.255
denied-peer-ip=100.64.0.0-100.127.255.255
denied-peer-ip=127.0.0.0-127.255.255.255
denied-peer-ip=169.254.0.0-169.254.255.255
denied-peer-ip=172.16.0.0-172.31.255.255
denied-peer-ip=192.0.0.0-192.0.0.255
denied-peer-ip=192.0.2.0-192.0.2.255
denied-peer-ip=192.88.99.0-192.88.99.255
denied-peer-ip=192.168.0.0-192.168.255.255
denied-peer-ip=198.18.0.0-198.19.255.255
denied-peer-ip=198.51.100.0-198.51.100.255
denied-peer-ip=203.0.113.0-203.0.113.255
denied-peer-ip=240.0.0.0-255.255.255.255
denied-peer-ip=::1
denied-peer-ip=64:ff9b::-64:ff9b::ffff:ffff
denied-peer-ip=::ffff:0.0.0.0-::ffff:255.255.255.255
denied-peer-ip=100::-100::ffff:ffff:ffff:ffff
denied-peer-ip=2001::-2001:1ff:ffff:ffff:ffff:ffff:ffff:ffff
denied-peer-ip=2002::-2002:ffff:ffff:ffff:ffff:ffff:ffff:ffff
denied-peer-ip=fc00::-fdff:ffff:ffff:ffff:ffff:ffff:ffff:ffff
denied-peer-ip=fe80::-febf:ffff:ffff:ffff:ffff:ffff:ffff:ffff작업이 끝나면 Ctrl + X를 눌러 파일을 저장하고, 프롬프트가 표시되면 Y를 입력합니다.
구성을 적용하기 위해 Coturn을 재시작합니다.
$ sudo systemctl restart coturnCoturn 설정을 추가하기 위해 Synapse 구성(homeserver.yaml) 파일을 엽니다.
$ nano ~/synapse/homeserver.yaml다음 줄을 붙여넣습니다. turn_shared_secret 값을 /etc/coturn/turnserver.conf 파일의 static-auth-secret 값으로 바꿉니다.
turn_uris: [ "turn:coturn.example.com?transport=udp", "turn:coturn.example.com?transport=tcp" ]
turn_shared_secret: 'static-auth-secret'
turn_user_lifetime: 86400000
turn_allow_guests: True
# vim:ft=yaml작업이 끝나면 Ctrl + X를 눌러 파일을 저장하고, 프롬프트가 표시되면 Y를 입력합니다.
변경 사항을 적용하기 위해 Synapse를 재시작합니다.
$ sudo systemctl restart matrix-synapse11단계 - Matrix에 접근
Element의 웹 클라이언트를 사용하여 Matrix Chat에 접근할 수 있습니다: https://app.element.io. 로그인 버튼을 클릭하여 진행합니다.

홈서버 아래의 편집 링크를 클릭합니다. matrix.example.com을 홈서버로 입력합니다.

클라이언트가 홈서버를 올바르게 감지하면 경계와 텍스트가 초록색으로 변하고, 그렇지 않으면 빨간색으로 표시됩니다. 계속을 클릭하여 진행합니다.

8단계에서 Synapse를 구성할 때 생성한 사용자 이름과 비밀번호를 입력합니다. 로그인 버튼을 클릭하여 로그인합니다. 안전하고 암호화된 백업을 생성하라는 메시지가 표시됩니다.

보안 문구 입력 옵션을 선택하여 로그인할 때마다 필요한 보안 문구를 생성합니다. 계속을 클릭하여 진행합니다.

보안 문구를 입력하고 계속 버튼을 클릭하여 진행합니다. 다음 화면에서 다시 확인하라는 메시지가 표시됩니다.

문구를 다시 입력하고 계속 버튼을 클릭하여 진행합니다.

보안 문구를 잊어버릴 경우 사용할 수 있는 보안 키 세트를 받게 됩니다. 다운로드 버튼을 클릭하여 저장합니다.
계속 버튼을 클릭하여 진행합니다.

계정 비밀번호를 입력하라는 메시지가 표시됩니다. 비밀번호를 입력하고 계속 버튼을 클릭하여 암호화된 백업 설정을 마칩니다.

홈페이지에서 그룹 채팅 생성 버튼을 사용하여 HowtoForge라는 그룹 채팅 방을 생성했습니다. 버튼을 클릭하면 다음과 같은 팝업이 표시됩니다.

고급 메뉴를 확장하고 옵션을 선택하여 도메인에 대한 멤버를 제한할 수 있습니다. 방 만들기 버튼을 클릭하여 방 생성을 완료합니다.
12단계 - Element 설치
Element를 위한 디렉토리를 생성합니다.
$ sudo mkdir -p /var/www/html/element최신 Element 릴리스를 가져오기 위한 새 파일을 생성합니다.
$ sudo nano /var/www/html/element/update.sh다음 줄을 추가합니다.
#!/bin/sh
set -e
install_location="/var/www/html/element"
latest="
$(curl -I https://github.com/element-hq/element-web/releases/latest | awk -F '/' '/^location/ {print substr($NF, 1, length($NF)-1)}')"
cd "$install_location"
[ ! -d "archive" ] && mkdir -p "archive"
[ -d "archive/element-${latest}" ] && rm -r "archive/element-${latest}"
[ -f "archive/element-${latest}.tar.gz" ] && rm "archive/element-${latest}.tar.gz"
wget "https://github.com/element-hq/element-web/releases/download/${latest}/element-${latest}.tar.gz" -P "archive"
tar xf "archive/element-${latest}.tar.gz" -C "archive"
[ -L "${install_location}/current" ] && rm "${install_location}/current"
ln -sf "${install_location}/archive/element-${latest}" "${install_location}/current"
ln -sf "${install_location}/config.json" "${install_location}/current/config.json"작업이 끝나면 Ctrl + X를 눌러 파일을 저장하고, 프롬프트가 표시되면 Y를 입력합니다.
파일을 실행 가능하게 만듭니다.
$ sudo chmod +x /var/www/html/element/update.sh스크립트를 실행하여 Element를 다운로드합니다.
$ sudo /var/www/html/element/update.sh13단계 - Element 구성
같은 Element 구성 파일을 복사합니다.
$ sudo cp /var/www/html/element/current/config.sample.json /var/www/html/element/config.json구성 파일을 편집하기 위해 엽니다.
$ sudo nano /var/www/html/element/config.json다음 줄을 찾습니다.
"m.homeserver": {
"base_url": "https://matrix-client.matrix.org",
"server_name": "matrix.org"
},기본 Matrix 홈서버 주소를 홈서버로 변경하고 server_name 변수를 제거합니다.
"m.homeserver": {
"base_url": "https://matrix.example.com",
"server_name": "example.com"
},웹사이트 제목에 Element 대신 이름을 사용하려면 브랜드 이름을 변경합니다.
"brand": "HowtoForge Example Chat",disable_guests 변수를 true로 설정하여 게스트가 Element를 사용하지 못하도록 합니다.
"disable_guests": true,작업이 끝나면 Ctrl + X를 눌러 파일을 저장하고, 프롬프트가 표시되면 Y를 입력합니다.
Element 클라이언트에 대한 SSL 인증서를 생성합니다.
$ sudo certbot certonly --nginx --agree-tos --no-eff-email --staple-ocsp --preferred-challenges http -m [email protected] -d element.example.com/etc/nginx/conf.d/element.conf 파일을 생성하고 열어 편집합니다.
$ sudo nano /etc/nginx/conf.d/element.conf다음 줄을 붙여넣습니다.
server {
listen 80;
listen [::]:80;
server_name element.example.com;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl;
listen [::]:443 ssl;
http2 on;
server_name element.example.com;
root /var/www/html/element/current;
index index.html;
access_log /var/log/nginx/element.access.log;
error_log /var/log/nginx/element.error.log;
add_header Referrer-Policy "strict-origin" always;
add_header X-Content-Type-Options "nosniff" always;
add_header X-Frame-Options "SAMEORIGIN" always;
# TLS configuration
ssl_certificate /etc/letsencrypt/live/element.example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/element.example.com/privkey.pem;
ssl_trusted_certificate /etc/letsencrypt/live/element.example.com/chain.pem;
ssl_session_timeout 1d;
ssl_session_cache shared:MozSSL:10m;
ssl_session_tickets off;
ssl_prefer_server_ciphers on;
ssl_stapling on;
ssl_stapling_verify on;
ssl_dhparam /etc/ssl/certs/dhparam.pem;
resolver 1.1.1.1 1.0.0.1 [2606:4700:4700::1111] [2606:4700:4700::1001] 8.8.8.8 8.8.4.4 [2001:4860:4860::8888] [2001:4860:4860::8844] valid=60s;
resolver_timeout 2s;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384;
}작업이 끝나면 Ctrl + X를 눌러 파일을 저장하고, 프롬프트가 표시되면 Y를 입력합니다.
Nginx 구성 파일 구문을 확인합니다.
$ sudo nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successfulNginx 서비스를 재시작합니다.
$ sudo systemctl restart nginxElement에 접근하기 전에 SELinux 설정을 구성해야 합니다. 다음 명령을 실행하여 Element가 실행될 수 있도록 허용합니다.
$ sudo semanage fcontext -a -t httpd_sys_rw_content_t "/var/www/html/element(/.*)?"
$ sudo restorecon -Rv /var/www/html/element/브라우저에서 https://element.example.com URL을 통해 Element 클라이언트에 접근할 수 있습니다. 로그인하면 앱 대시보드로 이동합니다. 먼저 https://app.element.io에서 앱을 확인하라는 메시지가 표시됩니다. 원래 Element 앱에 로그인했는지 확인하고 이모지 문자를 일치시켜야 합니다. 확인이 완료되면 다음 대시보드를 받게 됩니다.

결론
이로써 Rocky Linux 9에서 Nginx를 프록시 서버로 사용하여 Matrix Synapse 채팅 서버와 Coturn 및 Element 웹 클라이언트를 설치하는 튜토리얼이 마무리됩니다. 질문이 있으시면 아래 댓글에 남겨주세요.
새 게시물을 받은 편지함에서 받기
스팸은 없습니다. 언제든지 구독 해지 가능합니다.