docker를 이용해 matrix(연합 채팅 프로토콜) 서버 올리기

준비물

필요한 프로그램

1. docker-compose.yml 만들기

원하는 경로에 matrix 폴더를 만들고 그 안에 docker-compose.yml을 만들어 다음 내용을 작성한다. 폴더는 따로 안 만들어도 동작 하지만 나는 matrix용 폴더를 만들고 그 안에 docker 볼륨이 들어갈 폴더를 만들었다.

services:
  synapse:
    image: matrixdotorg/synapse
    restart: always
    ports:
      - 8008:8008
    volumes:
      - [볼륨을 물릴 경로]:/data

2. 도메인 물려서 서버 동작시키기

docker run -it --rm -v [볼륨을 물릴 경로]:/data -e SYNAPSE_SERVER_NAME=[서버를 돌릴 도메인 주소] -e SYNAPSE_REPORT_STATS=yes matrixdotorg/synapse:latest generate

동작시키면 [볼륨을 물릴 경로]에 homeserver.yaml 파일이 생긴다. 이 파일에서 가입을 열고 다른 설정을 할 수 있다.

위 명령어가 잘 동작했다면 서버의 8008 포트에 접속해본다.

매트릭스 서버가 성공적으로 올라갔을 때 뜨는 웹화면 위와 같은 화면이 뜨면 성공적으로 올라간 것이다.

3. nginx에 서버 물려서 서비스하기

nginx는 설치되어 있다는 가정 하에, /etc/nginx/sites-available/ 경로에 매트릭스를 위한 config파일을 하나 만든다. 파일명은 알아만 볼 수 있으면 된다.

기본적인 내용은 다음과 같다

server {

        server_name [서버를 돌릴 도메인 주소];

        location ~ ^(/_matrix|/_synapse/client) {
                proxy_pass http://localhost:8008;
                proxy_set_header X-Forwarded-For $remote_addr;
                proxy_set_header X-Forwarded-Proto $scheme;
                proxy_set_header Host $host;

                client_max_body_size 50M;
                proxy_http_version 1.1;
        }
}

위 내용으로 config 파일을 만들었다면

ln -s /etc/nginx/sites-available/[설정파일명] /etc/nginx/sites-enabled/[설정파일명]

을 수행한 후 nginx -t 명령으로 설정에 문제가 없는지 확인한다.

systemctl restart nginx nginx를 재시작한다.

nginx가 제대로 돌아가려면 방화벽에서 80번 포트와 443 포트가 열려있어야 한다. 그걸 위해 아래 명령을 수행하거나 또는 다른 툴을 이용해 방화벽을 열어준다.

ufw allow 'Nginx Full'

4. 인증서 발급

certbot을 이용해 인증서를 발급받는다. 이 과정 설명은 생략한다.

인증서를 발급받으면 방금 설정한 nginx 설정 아래쪽에 listen 443 ssl; # managed by Certbot로 시작하는 코드가 몇 줄 생겼을 것이다. 그 위에 listen 8448 ssl;를 추가해준다.

기존의 locationlisten ... 사이에 다음 코드를 추가해준다.

        location /.well-known/matrix/client {
                return 200 '{"m.server": {"base_url": "[서비스할 도메인 주소]:443"}}';
                default_type application/json;
                add_header Access-Control-Allow-Origin *;
        }
        
        location /.well-known/matrix/server {
                default_type application/json;
                add_header Access-Control-Allow-Origin *;
                return 200 '{"m.server":"[서비스할 도메인 주소]:443"}';
        }

3.5 만약 실제 서비스는 서브 도메인으로, 계정 핸들은 메인 도메인으로 사용하고 싶다면

바로 위의 /.well-known/... 설정은 메인 도메인 nginx 설정에 넣어준다. 코드 내부에 넣을 주소는 실제 서비스가 돌아가고 있는 서브도메인 주소를 넣으면 된다.

[볼륨을 물릴 경로] 내부의 파일을 다 지운다. 그 후 docker compose down을 이용해 서버를 내리고

docker run -it --rm -v [볼륨을 물릴 경로]:/data -e SYNAPSE_SERVER_NAME=[핸들로 사용할 도메인] -e SYNAPSE_REPORT_STATS=yes matrixdotorg/synapse:latest generate

위 명령어를 실행한다.

4. 가입 열기

[볼륨을 물릴 경로]/homeserver.yaml을 열어 enable_registration: true를 추가한다.

이후 docker compose를 올리면 되는데... 내가 해봤을 때 뭔가 설정을 추가해달라는 요구가 뜨며 오류가 났었다. 정확히 무슨 옵션을 추가하라고 했었는지는 기억이 나지 않으니 docker compose up 명령어를 이용해 직접 확인해서 추가하면 된다. 모든 옵션 설정이 끝나면

docker compose up -d

로 서버를 백그라운드에 올려서 완료.

5. 오브젝트 스토리지

여기서 끝인 줄 알았는데 object storage를 연결해야한다는 걸 알게됐다. 버킷 없이 관리할 수도 있지만 자신이 없어서 물려놓기로 했다. 문제는 직접 설치한 게 아니라 도커로 서버를 올렸다는 것.

직접 설치했을 경우 matrix.org에서 제공하는 synapse-s3-storage-provider를 이용할 수 있으나 도커로 올리면 방법이 없다.

검색을 반복한 끝에 [볼륨을 물릴 경로]/media_store에 rclone으로 오브젝트 스토리지를 mount 하기로 했다. 각자의 object storage의 특성에 맞춰 mount해서 사용하면 된다. media_store는 기본 설정이므로 homeserver.yaml파일에서 설정을 바꿀 수 있다.

6. 도움이 되는 사이트

matrix 연합 테스터

7. 참조

https://theselfhostingblog.com/posts/self-hosting-your-own-matrix-server-on-a-raspberry-pi/ https://matrix-org.github.io/synapse/latest/

#matrix #삐삐쀼쀼