목차
개요
NodeBB는 node.js 기반으로 제작된 포럼형 CMS이다.
처음 설치할 때는 한글로 된 설치법이 없어 해외 사이트들을 참고하며 삽질을 많이 했는데, 쓰다보니 너무 마음에 들어 직접 한글화도 완료했다.
오라클 클라우드의 VM 인스턴스에 설치했기 때문에 Ubuntu의 기본 세팅까지는 아래의 글과 같다.
Ubuntu에 NodeBB를 설치하고 SSL 인증서로 https 설정을 완료하기 위해 NodeBB 공식 설치법에 추가로 작업을 더 해주었다.
참고: 오라클 클라우드 Free-Tier 계정으로 VM 인스턴스 생성
Firewall 설정
오라클 클라우드로 진행하면 VCN에서 허용할 포트를 미리 지정하기 때문에 필요없는 과정이지만, 아니라면 Firewall을 설정해서 허용할 포트를 지정해준다.
아래의 명령어로 Firewall이 활성화됐는지 확인해본다.
$ sudo ufw status
Status: inactive
따로 설정을 하지 않았다면 inactive로 나와있을 것이다.
Firewall을 활성화하기 전 허용할 포트를 미리 지정해준다.
27017포트는 MongoDB를 위한 포트, 4567은 NodeBB를 위한 포트이다.
$ sudo ufw allow OpenSSH
$ sudo ufw allow 27017
$ sudo ufw allow 4567
$ sudo ufw allow 80
$ sudo ufw allow 443
허용할 포트를 입력한 뒤에는 아래의 명령어로 Firewall을 활성화해준다.
$ sudo ufw enable
Command may disrupt existing ssh connections. Proceed with operation (y|n)? y
Firewall is active and enabled on system startup
다시 Firewall 상태를 확인해보면 아래와 같은 화면이 나온다.
$ sudo ufw status
Status: active
To Action From
-- ------ ----
OpenSSH ALLOW Anywhere
27017 ALLOW Anywhere
4567 ALLOW Anywhere
80 ALLOW Anywhere
443 ALLOW Anywhere
OpenSSH (v6) ALLOW Anywhere (v6)
27017 (v6) ALLOW Anywhere (v6)
4567 (v6) ALLOW Anywhere (v6)
80 (v6) ALLOW Anywhere (v6)
443 (v6) ALLOW Anywhere (v6)
Node.js 설치
진행을 위해 필요한 것들을 아래 명령어로 설치한다.
$ sudo apt install curl wget nano ca-certificates gnupg2 lsb-release
Node.js는 NodeSource Ubuntu binary distributions repository에서 받을 수 있다.
아래의 명령어로 Node.js를 설치한다.
$ curl -sL https://deb.nodesource.com/setup_14.x | sudo -E bash -
$ sudo apt-get install -y nodejs
아래의 명령어로 node.js와 npm의 버전을 확인한다.
$ node -v
v14.16.0
$ npm -v
6.14.11
MongoDB 설치
사실 지금까지는 MariaDB만 써봐서 MongoDB에 대해서는 잘 모르겠다.
일단 MongoDB나 Redis로만 가능하다고 하니 설치한다.
$ sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 9DA31620334BD75D9DCB49F368818C72E52529D4
$ echo "deb [ arch=amd64 ] https://repo.mongodb.org/apt/ubuntu bionic/mongodb-org/4.0 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-4.0.list
$ sudo apt-get update
$ sudo apt-get install -y mongodb-org
설치 후 아래 명령어로 MongoDB의 버전을 확인한다.
$ mongod --version
db version v4.0
아래 명령어로 MongoDB를 실행하고 상태를 확인한다.
$ sudo systemctl start mongod
$ sudo systemctl enable mongod
$ sudo systemctl status mongod
MongoDB 접속 및 설정
아래 명령어로 MongoDB에 접속한다.
$ mongo
접속 후에는 admin db로 이동해 admin 사용자를 생성한다.
> use admin
> db.createUser( { user: "admin", pwd: "비밀번호입력", roles: [ { role: "root", db: "admin" } ] } )
NodeBB에는 다른 db를 사용할 것이기 때문에 nodebb db와 사용자를 생성한다.
> use nodebb
> db.createUser( { user: "nodebb", pwd: "비밀번호입력", roles: [ { role: "readWrite", db: "nodebb" }, { role: "clusterMonitor", db: "admin" } ] } )
db와 사용자 생성이 완료됐으니 아래의 명령어로 MongoDB에서 나온다.
> quit()
이제 나노 에디터로 MongoDB의 설정 파일을 수정해줘야 한다.
$ sudo nano /etc/mongod.conf
하단에 아래의 내용을 추가한다.
security:
authorization: enabled
MongoDB를 재시작하고 생성한 admin 유저를 인증한다.
$ sudo systemctl restart mongod
$ mongo -u admin -p 입력했던비밀번호 --authenticationDatabase=admin
Nginx 서버 설치
공식 사이트의 설치법에서는 NodeBB를 설치한 다음에 Nginx를 설치하지만, 진행하면서 오류가 발생하는 부분이 있기 때문에 Nginx를 먼저 설치하는 것이 좋다.
SSH에서 아래 명령어를 입력하고 공용 IP로 접속하면 Welcome to nginx!라는 화면이 뜬다.
$ sudo apt install nginx
$ sudo systemctl start nginx
$ sudo systemctl enable nginx
$ sudo iptables -F
공용 IP로 확인을 한 뒤에는 리눅스 폴더의 권한을 설정해준다.
$ sudo chown -R ubuntu /var/www
$ sudo chgrp -R ubuntu /var/www
NodeBB 설치
NodeBB는 git을 통해 설치할 것이기 때문에 git을 먼저 설치하고 자신의 정보를 입력한다.
$ sudo apt install git
$ git config --global user.name "이름"
$ git config --global user.email "이메일 주소"
NodeBB를 root 계정으로 돌리는 것보다는 따로 계정을 생성해주는 것이 보안에 좋긴 한데.. 오라클 클라우드에 돌려서 그런지 이럴 경우 나중에 오류가 난다.
오라클 클라우드를 사용 중이라면 NodeBB도 ubuntu 계정으로 돌려준다.
NodeBB가 설치될 폴더를 생성해 소유자를 변경해준다.
$ sudo mkdir /var/www/nodebb
$ sudo chown -R ubuntu:ubuntu /var/www/nodebb
소유자를 변경했으면 nodebb가 설치될 폴더로 이동한다.
$ su nodebb
$ cd /var/www/nodebb
이제 NodeBB의 깃허브에서 NodeBB를 현재 내가 있는 NodeBB가 설치될 폴더로 clone 한다.
$ git clone -b v1.16.x https://github.com/NodeBB/NodeBB.git .
아래의 명령어로 NodeBB 설치를 진행한다.
$ ./nodebb setup
설치 과정에서 다른 것들은 그냥 엔터를 입력해서 넘겨도 되지만 꼭 입력해야 되는 것들이 있다.
- URL used to access this NodeBB 항목은 example.com 이라던가 forum.example.com 등 내가 NodeBB를 운영할 도메인을 입력한다.
- MongoDB username 항목에는 nodebb를 입력하고 MongoDB의 nodebb 사용자에 설정한 비밀번호를 입력한다.
- 관리자 정보를 입력하는 부분에서는 내가 NodeBB에서 사용할 최고 관리자의 정보를 입력한다.
설치 과정이 끝나면 아래의 명령어로 NodeBB를 실행한다.
$ ./nodebb start
[이미지]
여기까지 진행했다면 http://내공용아이피:4567로 접속했을 때 위와 같은 화면이 나온다.
도메인 연결
도메인은 Freenom의 무료 도메인을 사용했다.
신청 방법이나 클라우드 플레어 연결 방법은 아래의 글을 참고하면 된다.
참고: 오라클 클라우드 라이믹스&미디어위키 설치
[이미지]
DNS 설정에서 위 사진과 같이 입력한다.
Nginx default 파일 수정
수정하기 전에 default 파일의 소유자와 권한을 변경해준다.
$ sudo chgrp ubuntu /etc/nginx/sites-available/default
$ sudo chmod 664 /etc/nginx/sites-available/default
ubuntu 계정으로 변경할 수 있게 됐으니 Editplus를 이용해서 default 파일을 수정해준다.
# Default server configuration
server {
listen 80;
server_name 도메인.com;
access_log /var/log/nginx/도메인.com.access.log;
error_log /var/log/nginx/도메인.com.error.log;
location / {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header Host $http_host;
proxy_set_header X-NginX-Proxy true;
proxy_pass http://127.0.0.1:4567;
proxy_redirect off;
# Socket.IO Support
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
location ~ /\.ht {
deny all;
}
}
참고: 오라클 클라우드 라이믹스&미디어위키 설치
입력을 완료한 뒤 nginx가 정상적으로 작동 중이라면 재시작한다.
$ sudo nginx -t
$ sudo systemctl reload nginx
$ sudo iptables -F
여기까지 진행하고 도메인으로 접속하면 http://내공용아이피:4567로 접속했을 때와 같이 NodeBB의 첫 화면이 나온다.
NodeBB의 시스템 서비스 등록
NodeBB를 설치하고 실행도 했지만 시스템을 다시 시작하게 되면 NodeBB가 자동으로 실행되지 않는다.
NodeBB가 자동으로 실행될 수 있도록 시스템 서비스로 등록하기 전 아래의 명령어로 미리 NodeBB를 종료한다.
$ ./nodebb stop
아래의 명령어로 관련 설정 파일을 생성하고 작성한다.
$ sudo nano /etc/systemd/system/nodebb.service
나노 에디터로 해당 파일에 아래의 내용을 입력한다.
User 부분에는 ubuntu, 경로 관련 부분은 NodeBB가 설치된 경로가 입력돼야 한다.
[Unit]
Description=NodeBB
Documentation=https://docs.nodebb.org
After=system.slice multi-user.target mongod.service
[Service]
Type=forking
User=ubuntu
StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=nodebb
Environment=NODE_ENV=production
WorkingDirectory=/var/www/nodebb
PIDFile=/var/www/nodebb/pidfile
ExecStart=/usr/bin/env node loader.js
Restart=always
[Install]
WantedBy=multi-user.target
입력 후 NodeBB를 실행한 뒤 상태를 확인한다.
$ sudo systemctl enable nodebb
$ sudo systemctl start nodebb
$ sudo systemctl status nodebb
자동 인증서 관리 환경 구성
$ mkdir -p /var/www/letsencrypt/.well-known/acme-challenge
$ sudo touch /etc/nginx/snippets/letsencrypt.conf
$ sudo chown root:ubuntu /etc/nginx/snippets/letsencrypt.conf
$ sudo chmod 775 /etc/nginx/snippets/letsencrypt.conf
$ sudo nano /etc/nginx/snippets/letsencrypt.conf
letsencrypt.conf 파일을 열어서 아래 내용을 넣어준다.
location ^~ /.well-known/acme-challenge/ {
default_type "text/plain";
root /var/www/letsencrypt;
}
EditPlus로 /etc/nginx/sites-available/default 파일을 열어서 'server_name 도메인;' 아래 'include /etc/nginx/snippets/letsencrypt.conf;'를 추가 후 저장한다.
# Default server configuration
server {
listen 80;
server_name 도메인.com;
include /etc/nginx/snippets/letsencrypt.conf;
access_log /var/log/nginx/도메인.com.access.log;
error_log /var/log/nginx/도메인.com.error.log;
location / {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header Host $http_host;
proxy_set_header X-NginX-Proxy true;
proxy_pass http://127.0.0.1:4567;
proxy_redirect off;
# Socket.IO Support
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
location ~ /\.ht {
deny all;
}
}
그 후 nginx 상태를 확인해보고 재시작한다.
$ sudo nginx -t
$ sudo service nginx restart
$ sudo iptables -F
Let's Encrypt SSL 인증서 적용
$ wget https://dl.eff.org/certbot-auto -P /home/ubuntu/
$ chmod a+x certbot-auto
$ export LC_ALL="C"
$ sudo reboot now
재부팅하고 잠시 후에 다시 들어가서 아래 명령어로 python과 certbot을 설치한다.
$ sudo iptables -F
$ sudo apt-get update && sudo apt-get install -y certbot
$ sudo apt install certbot python3-certbot-nginx
설치 후에 아래 명령어로 Let's Encrypt SSL 인증서를 다운로드한다.
nginx의 default 파일에 한글로 작성된 주석이 있으면 utf-8 관련 오류가 나니 다시 한번 확인해보고 진행하는 것이 좋다.
$ sudo certbot --nginx -d 도메인.com -d www.도메인.com
Please choose whether HTTPS access is required or optional.
-------------------------------------------------------------------------------
1: Easy - Allow both HTTP and HTTPS access to these sites
2: Secure - Make all requests redirect to secure HTTPS access
-------------------------------------------------------------------------------
Select the appropriate number [1-2] then [enter] (press 'c' to cancel): 2
위와 같이 선택하는 화면이 나오면 2번의 secure 옵션을 선택한다.
secure로 선택할 경우 사이트의 모든 페이지가 https로 연결된다.
$ sudo iptables -F
$ sudo ls -al /etc/letsencrypt/live/도메인명
아래와 같이 나오면 인증서가 제대로 적용된 것이다.
drwxr-xr-x 2 root root 4096 Feb 28 20:30 .
drwx------ 3 root root 4096 Feb 28 20:30 ..
-rw-r--r-- 1 root root 692 Feb 28 20:30 README
lrwxrwxrwx 1 root root 31 Feb 28 20:30 cert.pem -> ../../archive/도메인/cert1.pem
lrwxrwxrwx 1 root root 32 Feb 28 20:30 chain.pem -> ../../archive/도메인/chain1.pem
lrwxrwxrwx 1 root root 36 Feb 28 20:30 fullchain.pem -> ../../archive/도메인/fullchain1.pem
lrwxrwxrwx 1 root root 34 Feb 28 20:30 privkey.pem -> ../../archive/도메인/privkey1.pem
Nginx에 SSL 인증서 적용
아래의 명령어로 OpenSSL을 사용하여 dhparam을 암호화한다.
20분 정도 걸린다고 하는데 금방 끝나는 경우도 있고 더 오래 걸리기도 한다.
$ sudo openssl dhparam -out /etc/nginx/dhparam.pem 4096
다 끝나면 ssl.conf 파일의 권한을 변경해준다.
$ sudo touch /etc/nginx/snippets/ssl.conf
$ sudo chmod 777 /etc/nginx/snippets/ssl.conf
$ sudo nano /etc/nginx/snippets/ssl.conf
ssl.conf 파일을 열어 아래와 같이 입력해준다.
ssl_session_timeout 1d;
ssl_session_cache shared:SSL:50m;
ssl_session_tickets off;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_dhparam /etc/nginx/dhparam.pem;
ssl_ciphers ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384;
ssl_ecdh_curve secp384r1;
ssl_prefer_server_ciphers on;
ssl_stapling on;
ssl_stapling_verify on;
resolver 8.8.8.8 8.8.4.4;
add_header Strict-Transport-Security "max-age=15768000; includeSubdomains; preload";
add_header X-Content-Type-Options nosniff;
add_header X-Frame-Options "SAMEORIGIN";
수정할 수 없도록 다시 권한을 변경해준다.
$ sudo chmod 644 /etc/nginx/snippets/ssl.conf
EditPlus로 /etc/nginx/sites-available/도메인-ssl.conf 파일을 열어서 아래의 내용을 그대로 붙여넣는다.
# Default HTTPS server configuration
server {
listen 443 ssl http2 default_server;
listen [::]:443 ssl http2 default_server;
server_name 도메인.com;
ssl_certificate /etc/letsencrypt/live/도메인.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/도메인.com/privkey.pem;
ssl_trusted_certificate /etc/letsencrypt/live/도메인.com/fullchain.pem;
include /etc/nginx/snippets/ssl.conf;
access_log /var/log/nginx/도메인.com.access.log;
error_log /var/log/nginx/도메인.com.error.log;
location / {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header Host $http_host;
proxy_set_header X-NginX-Proxy true;
proxy_pass http://127.0.0.1:4567; # no trailing slash
proxy_redirect off;
# Socket.IO Support
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
location ~ /\.ht {
deny all;
}
}
# HTTPS www. server configuration
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name www.도메인.com;
ssl_certificate /etc/letsencrypt/live/도메인.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/도메인.com/privkey.pem;
ssl_trusted_certificate /etc/letsencrypt/live/도메인.com/fullchain.pem;
include /etc/nginx/snippets/ssl.conf;
location / {
return 301 https://도메인.com$request_uri;
}
}
# Default server configuration
server {
listen 80;
listen [::]:80 default_server;
server_name 도메인.com;
include /etc/nginx/snippets/letsencrypt.conf;
location / {
return 301 https://도메인.com$request_uri;
}
}
# HTTP - CNAME Connect www.도메인.com to 도메인.com
server {
listen 80;
listen [::]:80;
server_name www.도메인.com;
include /etc/nginx/snippets/letsencrypt.conf;
location / {
return 301 https://도메인.com$request_uri;
}
}
바꾸기로 도메인.com을 다 수정하고 nginx를 재시작한다.
$ sudo nginx -t
$ sudo service nginx restart
$ sudo iptables -F
재시작 후에 도메인으로 접속해보면 https가 적용되어있다.
SSL 인증서 자동갱신
$ sudo su
$ cd /bin
$ nano letsencrypt.sh
나노 에디터에서 letsencrypt.sh 파일에 아래 내용을 입력한다.
#!/bin/bash
sudo certbot renew
sudo service nginx restart
입력 후 실행할 수 있게 권한을 변경해준다.
$ chmod +x letsencrypt.sh
그 뒤엔 인증서가 자동으로 갱신이 되게 해줘야 한다.
$ sudo crontab -e
선택창이 뜨는데 1번 나노 에디터를 선택하고 맨 아래 쪽에 아래의 내용을 입력한다.
*을 포함한 5개의 숫자는 분/시/일/월/요일을 뜻하므로 아래 내용은 매일 새벽 4시에 갱신을 한다는 것이다.
0 4 * * * /usr/bin/letsencrypt.sh
갱신할 필요가 없다면 갱신 시도는 자동으로 종료되지만 이어지는 명령어로 인해 nginx가 재시작한다.
설정을 마치면 crontab을 활성화해야 한다.
$ sudo service cron start
아래의 명령어로 자동 갱신 테스트를 해서 Congratulations가 나오면 앞으로 SSL이 자동으로 갱신된다.
$ sudo certbot renew --dry-run
아래의 사이트에 도메인을 입력하면 보안 점수를 알려주는데, SSL 인증서 설치가 제대로 완료됐다면 A+ 등급이 나온다.
이렇게 SSL 인증서가 자동으로 갱신되는 NodeBB 포럼의 구축에 성공했다.