Post

Project: Cone 사설 서버 설명서 [v0.55.14]

서버리스 클라이언트

프콘은 사설 서버를 사용하는 앱으로, 공식적으로 제공되는 서비스 서버가 없습니다. 지금은 개발 테스트 서버를 선택적으로 사용할 수 있으나 오직 제 개발 테스트를 편하게 하기 위한 버튼이므로 적당한 시기가 되면 무조건 누군가의 사설 서버를 등록하여 이용하거나, 로컬에서만 이용해야 합니다.

그리고 그 누군가의 사설 서버는 여러분 것이 될 수도 있습니다 :)

서버 파일 다운받기

서버 파일은 앱 설정 > Nakama 서버 파일 버튼 또는 Git을 이용하여 받을 수 있습니다.

1
git clone https://github.com/is2you2/pjcone_server.git

download_server

클라이언트에서 받은 경우, 압축을 풀면 docker-compose 로 즉시 올릴 수 있는 형태의 폴더 구조가 나옵니다. 아래 설정이 끝나고나면 이후에 서버를 가동할 때 이 폴더에서 도커를 동작시켜주면 됩니다.

도메인 및 SSL 키 발급

클라이언트는 깃 허브 주소를 사용하여 https 보안이 설정된 상태입니다. https는 보안상의 이유로 http와 통신하지 않기 때문에 브라우저앱을 사용할 계획이라면 SSL 설정이 필수가 됩니다.

개인적으로는 noip에서 DDNS를 발급받은 다음에 certbot에서 보안키를 발급받아서 사용하고 있습니다.

certbot에서 보안키를 발급받는 과정을 빠르게 처리하려면 새로운 폴더를 만든 뒤 docker-compose.yml 텍스트 파일을 생성하고 다음을 적어주세요.

1
2
3
4
5
6
7
8
9
10
11
services:
  certbot:
    image: certbot/certbot
    container_name: certbot
    ports: # 발급받을 때에만 잠시 사용하셔도 발급받은 키를 이용하실 수 있습니다.
      - "80:80"
      - "443:443"
    command: certonly --standalone --email [이메일@주소.작성] --agree-tos -d [도메인.주소.작성]
    volumes:
      - ./certbot/letsencrypt:/etc/letsencrypt
      - ./certbot/logs:/var/log/letsencrypt

키쌍을 받으시면 (./ = 압축을 푼 nakama 폴더 또는 pjcone_server 깃 저장소 폴더 기준입니다)

  • 공개키는 ./data/public.crt
  • 개인키는 ./data/private.key

에 파일을 옮겨주시면 됩니다.

이미 도메인이나 보안키를 가지고 계시다면 발급 과정은 생략하셔도 됩니다.

Nakama / Postgresql

여러분이 사용하는 채팅서버가 사실은 게임서버라는 사실을 알고 계셨습니까? 😃

나카마 서버는 오픈소스 게임서버로 여러분이 서버 규칙을 직접 구성할 수도 있습니다. 우리가 다운받은 파일에는 클라이언트 기능 수행에 필요한 몇가지 코드가 포함되어 있는데요(./data/modules/*), 이 폴더에 새 파일을 추가하여 코드를 작성하면 욕설이 포함된 채팅 내용을 가리는 등 추가 기능을 구성할 수도 있습니다. 서버 코드 구성에 대해 자세히 알아보시려면 이 페이지를 참조해주세요.

나카마 클라이언트의 전반적 설정은 ./data/pjcone.yml 에서 변경하실 수 있습니다. 더 많은 설정은 나카마 서버 구성 페이지를 참조해주세요.

나중에 도커를 실행하고나면 ./postgres/ 라는 폴더가 구성되는데 이곳에 서버에서 일어나는 일들이 저장됩니다. 서버를 초기화하고 싶다면 이 폴더를 지우시면 됩니다.

서버가 정상적으로 가동되었다면 localhost:7351 에서 콘솔을 이용하실 수 있습니다. 초기 계정은 ./data/pjcone.yml 에 작성된 정보이고, 로그인하여 사용자를 만들고 나면 비밀번호를 8자 미만으로 줄여 관리자 계정을 사용할 수 없게 하는 것을 추천합니다.

사용자를 관리자로 전환

앱에서 관리자 권한을 부여받으면 설정에 관리자 도구 메뉴가 추가되며 다음과 같은 추가 권한을 가지게 됩니다.

  • 모든 채널에 대한 매니저 권한이 있는 것으로 간주하여 퀘스트 생성시 참여한 채널 및 매니저 여부와 무관하게 다른 사람에게 퀘스트를 부여할 수 있습니다.
  • 관리자 도구를 이용하여 서버에 가입된 모든 사용자를 대상으로 전체 알림을 발송할 수 있습니다.
  • 관리자 도구를 이용하여 사용자에게 채널별 매니저 권한 부여, 1:1대화 시도, 계정 삭제를 할 수 있습니다.
  • 관리자 도구를 이용하여 그룹 설정 및 구성원을 검토하고 그룹을 강제 해산시킬 수 있습니다.

사용자에게 관리자 권한을 부여하려면 나카마 콘솔에서 Account > 사용자를 클릭한 후 metadata 입력란에 "is_admin": true 값을 추가해주세요.

promote_admin

권한 부여 후 재접속하면 적용됩니다.

Apache / Express

아파치는 파일 서버 구성을 위해 추가되었습니다. 지금은 Postgresql에 계정 검토를 하지 않기 때문에 채널에서 파일을 주고 받으면 해당 파일이 온라인 상에 전체 공개가 됩니다. 아파치와 Express가 동시에 구성된 이미지를 찾지 못해서 아파치 도커를 시작하면 nodejs 설치 및 노드 패키지 설치를 진행합니다. 이 부분은 향후에 별도 도커 이미지를 만들거나 nodejs 설치 경로를 볼륨으로 빼내고 bash 스크립트에서 설치 여부에 따라 동작을 나누거나 할 예정입니다.

주고받은 파일은 ./uploader/cdn/* 에 저장됩니다.

First File Server

클라이언트 설정 > 보조 도구에는 첫번째 파일 서버라는 입력칸이 있습니다. 이 입력칸에 [주소:포트] 정보를 입력하면 연결된 서버에 파일을 올리기 전에 입력된 서버에 파일 올리기를 시도하고, 업로드에 성공하면 이 서버 주소로 파일을 공유하게 됩니다.

입력하는 [주소:포트]는 해당 서버의 웹 주소가 개방된 포트이며 업로드 포트는 9001 이여야 합니다. 이렇게하면 사용자가 올린 파일을 사용자가 직접 관리하면서도 채팅중에 파일을 공유할 수 있습니다. (물론 정상적으로 공유되려면 해당 주소에 다른 사람들이 접근할 수 있어야 합니다)

이 정보가 입력되었다면 채널에서 파일을 보내기 전에 사용여부를 지정할 수 있습니다.

toggle_ffs

Coturn

Coturn은 WebRTC 서버로 음성 통화가 가능하게 해줍니다. 현재 버전에서는 1:1 대화에서만 음성 통화가 가능합니다.

./data/turnserver.conf 파일에서 서버를 설정할 수 있습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
...
# 원한다면 사용할 포트를 변경할 수 있습니다
# listening-port=3478
# listening-ip=175.210.64.135
external-ip=175.210.64.135
# tls-listening-port=5349

# WebRTC 에서 사용할 UDP 포트를 제한합니다.
min-port=12021
max-port=13000
verbose
fingerprint
lt-cred-mech
# use-auth-secret
# static-auth-secret=
# realm=www.example.com # 주석처리를 제거하고 도메인 주소를 입력해야합니다.
user=username:password # 이대로 두면 서버가 등록한 후 별도 설정 없이 바로 음성통화를 사용할 수 있습니다. 변경하게 된다면 앱에서 WebRTC 서버 정보를 재등록해야합니다.
total-quota=100
bps-capacity=0
...

상세한 설정은 이 페이지를 참조해주세요.

내부망 채팅에 대해서

안드로이드 앱은 http 로 구성되어 내부망 서버 이용이 가능합니다.

내부망 서버를 구성하려면 SSL과 관련된 모든 설정을 지우고, 미리 주석을 처리한 내용으로 변경하시면 됩니다.

구체적으로는 다음과 같습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
# ./docker-compose.yml 파일에서
...
apache: # 파일 업로드 공개 서버
    container_name: apache
    image: httpd
    volumes:
      ...
    ports:
      - "9001:9001"
+     - "9002:80" # no-ssl
-     - "9002:443" # 컴퓨터:도커
    command: sh /usr/local/apache2/htdocs/setup_uploader.sh
...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
// ./httpd.conf 파일에서
// "ssl" 로 검색하면 빠르게 찾을 수 있습니다
...

#LoadModule slotmem_shm_module modules/mod_slotmem_shm.so
#LoadModule slotmem_plain_module modules/mod_slotmem_plain.so
- LoadModule ssl_module modules/mod_ssl.so
#LoadModule optional_hook_export_module modules/mod_optional_hook_export.so
#LoadModule optional_hook_import_module modules/mod_optional_hook_import.so
#LoadModule optional_fn_import_module modules/mod_optional_fn_import.so

...

# Configure mod_proxy_html to understand HTML4/XHTML1
<IfModule proxy_html_module>
Include conf/extra/proxy-html.conf
</IfModule>

- # Secure (SSL/TLS) connections
- Include conf/extra/httpd-ssl.conf
- #
- # Note: The following must must be present to support
- #       starting without SSL on platforms with no /dev/random equivalent
- #       but a statically compiled-in mod_ssl.
- #
- <IfModule ssl_module>
- SSLRandomSeed startup builtin
- SSLRandomSeed connect builtin
- </IfModule>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// ./uploader/server.js 파일에서
...
- const options = {
-     key: fs.readFileSync('/usr/local/apache2/conf/private.key'),
-     cert: fs.readFileSync('/usr/local/apache2/conf/public.crt'),
- };
- 
- https.createServer(options, app).listen(9001, "0.0.0.0", () => {
-     console.log("Working on port 9001");
- });

+ /** Run the server.*/
+ app.listen(9001, "0.0.0.0", function () {
+     console.log("Working on port 9001");
+ });
1
2
3
4
5
6
7
8
9
# ./data/turnserver.conf 파일에서
...
bps-capacity=0
stale-nonce=600
- cert=/etc/coturn/public.crt
- pkey=/etc/coturn/private.key
log-file=/var/log/coturn/turnserver.log
simple-log
...
1
2
3
4
5
6
7
# ./data/pjcone.yml 파일에서
...
socket:
-   ssl_certificate: '/nakama/data/public.crt'
-   ssl_private_key: '/nakama/data/private.key'
    server_key: 'defaultkey'
...
This post is licensed under CC BY 4.0 by the author.