웹사이트 검색

Nginx 및 Free Lets Encrypt SSL on Debian 11로 Discourse Forum을 설치하는 방법


이 페이지에서

  1. 전제 조건
  2. 1단계 - 방화벽 구성\n
  3. 2단계 - Git 설치
  4. 3단계 - Docker 설치
  5. 4단계 - 담론 다운로드
  6. 5단계 - 담론 구성
    1. 도메인 설정
    2. 노출된 포트 구성
    3. SMTP 설정 구성
    4. 메모리 설정(선택 사항)\n
    5. GeoLite2 설정(선택 사항)\n

    1. 명령줄에서 Discourse Administrator 활성화\n
    2. 업그레이드 담론
    3. 담론 중지
    4. 담론 로그 보기

    Discourse는 Ruby 언어를 사용하여 구축된 오픈 소스 커뮤니티 토론 플랫폼입니다. 포럼, 채팅 소프트웨어 또는 메일링 리스트로 작동하도록 설계되었습니다. 다른 플랫폼과 쉽게 통합되며 플러그인으로 기능을 확장할 수 있습니다.

    이 튜토리얼에서는 Debian 11 기반 서버에서 Nginx 서버와 함께 Discourse Forum을 설치하는 방법을 배웁니다.

    전제 조건

    • A server running Debian 11 with a minimum of 1GB RAM and 1 Core CPU. Discourse setup will automatically create a swap partition on systems with 1GB or less RAM. Therefore, it is recommended to install it on a system with at least 2GB RAM.

    • A non-root user with sudo privileges.

    • A Domain name (discourse.example.com) pointing to the server.

    • Everything is updated.

      $ sudo apt update && sudo apt upgrade
      
    • Few packages that your system needs.

      $ sudo apt install nano ufw software-properties-common dirmngr apt-transport-https gnupg2 ca-certificates lsb-release debian-archive-keyring -y
      

      Some of these packages may already be installed on your system.

    1단계 - 방화벽 구성

    첫 번째 단계는 방화벽을 구성하는 것입니다. 데비안은 ufw(복잡하지 않은 방화벽)와 함께 제공됩니다.

    방화벽이 실행 중인지 확인하십시오.

    $ sudo ufw status
    

    다음 출력을 얻어야 합니다.

    Status: inactive
    

    방화벽이 활성화 시 현재 연결을 끊지 않도록 SSH 포트를 허용합니다.

    $ sudo ufw allow OpenSSH
    

    HTTP 및 HTTPS 포트도 허용합니다.

    $ sudo ufw allow 80/tcp
    $ sudo ufw allow 443/tcp
    

    방화벽 활성화

    $ sudo ufw enable
    Command may disrupt existing ssh connections. Proceed with operation (y|n)? y
    Firewall is active and enabled on system startup
    

    방화벽의 상태를 다시 확인하십시오.

    $ sudo ufw status
    

    비슷한 출력이 표시되어야 합니다.

    Status: active
    
    To                         Action      From
    --                         ------      ----
    OpenSSH                    ALLOW       Anywhere
    80/tcp                     ALLOW       Anywhere
    443/tcp                    ALLOW       Anywhere
    OpenSSH (v6)               ALLOW       Anywhere (v6)
    80/tcp (v6)                ALLOW       Anywhere (v6)
    443/tcp (v6)               ALLOW       Anywhere (v6)
    

    2단계 - Git 설치

    기본 Appstream을 사용하여 Git을 설치합니다.

    $ sudo dnf install git
    

    설치를 확인하십시오.

    $ git --version
    git version 2.30.2
    

    다음 명령을 실행하여 Git 설치를 구성합니다.

    $ git config --global user.name "Your Name"
    $ git config --global user.email ""
    

    3단계 - 도커 설치

    최신 버전의 Docker를 설치하려면 Dockers 공식 GPG 키를 추가하십시오.

    $ curl -fsSL https://download.docker.com/linux/debian/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
    

    공식 Docker 저장소를 설치합니다.

    $ echo \
      "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/debian \
      $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
    

    Debian 시스템 리포지토리를 업데이트합니다.

    $ sudo apt update
    

    최신 버전의 Docker를 설치합니다.

    $ sudo apt install docker-ce docker-ce-cli containerd.io
    

    Docker가 실행 중인지 확인합니다.

    $ sudo systemctl status docker
    ? docker.service - Docker Application Container Engine
         Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled)
         Active: active (running) since Sat 2022-02-05 13:32:54 UTC; 1h ago
    TriggeredBy: ? docker.socket
           Docs: https://docs.docker.com
       Main PID: 5818 (dockerd)
          Tasks: 26
         Memory: 1.4G
            CPU: 5min 34.561s
         CGroup: /system.slice/docker.service
                 ?? 5818 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
                 ??12162 /usr/bin/docker-proxy -proto tcp -host-ip 0.0.0.0 -host-port 8080 -container-ip 172.17.0.2 -contai>
                 ??12169 /usr/bin/docker-proxy -proto tcp -host-ip :: -host-port 8080 -container-ip 172.17.0.2 -container-p>
    

    기본적으로 Docker에는 루트 권한이 필요합니다. sudo 명령을 실행할 때마다 sudo를 사용하지 않으려면 docker 명령에 사용자 이름을 추가하세요. > 그룹.

    $ sudo usermod -aG docker $(whoami)
    

    이 변경 사항을 사용하려면 서버에서 로그아웃하고 동일한 사용자로 다시 로그인해야 합니다.

    4단계 - 담론 다운로드

    Discourse의 루트 디렉터리를 만듭니다.

    $ sudo mkdir /var/discourse
    

    공식 Discourse Docker Github 리포지토리를 복제합니다.

    $ sudo git clone https://github.com/discourse/discourse_docker.git /var/discourse
    

    5단계 - 담화 구성

    샘플 standalone.yml 파일을 복사하여 구성 파일 app.yml을 생성합니다.

    $ sudo cp samples/standalone.yml containers/app.yml
    

    편집을 위해 app.yml을 엽니다.

    $ sudo nano containers/app.yml
    

    도메인 설정

    변수 DISCOURSE_HOSTNAME을 포럼에 대해 선택한 도메인 이름으로 설정합니다. 도메인 이름이 없는 경우 여기에서 IP 주소를 사용할 수 있습니다.

    DISCOURSE_HOSTNAME: 'discourse.example.com'
    

    노출된 포트 구성

    "80:80 줄을 "8080:80"로 변경합니다. 이렇게 하면 Discourse의 외부 HTTP 포트가 8080으로 변경됩니다. 포트 80에서 Nginx를 사용합니다. 외부에서 SSL을 설치할 것이므로 "443:443" 줄을 주석 처리합니다.

    expose:
      - "8080:80"   # http
      #- "443:443" # https
    

    SMTP 설정 구성

    사용 중인 트랜잭션 이메일 서비스에 따라 다음 변수를 작성하십시오. 변수 DISCOURSE_DEVELOPER_EMAILS를 사용하여 관리자 계정의 이메일을 설정합니다. 그렇지 않으면 이 단계는 필수이며 포럼이 부트스트랩되지 않습니다.

    ..
    DISCOURSE_DEVELOPER_EMAILS: ''
    ..
    DISCOURSE_SMTP_ADDRESS: smtp.example.com
    DISCOURSE_SMTP_PORT: 587
    DISCOURSE_SMTP_USER_NAME: 
    DISCOURSE_SMTP_PASSWORD: your_smtp_password
    #DISCOURSE_SMTP_ENABLE_START_TLS: true           # (optional, default true)
    #DISCOURSE_SMTP_DOMAIN: discourse.example.com    # (required by some providers)
    DISCOURSE_NOTIFICATION_EMAIL:     # (address to send notifications from)
    

    메모리 설정(옵션)

    서버의 RAM이 부족한 경우 Discourses 메모리 사용 공간을 줄이기 위해 다음 변수를 적절하게 구성할 수 있습니다.

    db_shared_buffers: '128MB'
    UNICORN_WORKERS: 2
    

    db_shared_buffers 변수는 일반적으로 사용 가능한 메모리의 25%로 설정됩니다.

    GeoLite2 설정(옵션)

    Discourse에서 IP 조회 기능을 사용하려면 무료 Maxmind Geolite2 계정에 가입하고 라이선스 키를 받으세요. 해당 라이선스 키를 다음 변수의 값으로 붙여넣습니다.

    DISCOURSE_MAXMIND_LICENSE_KEY: your_maxmind_license_key
    

    Ctrl + X를 누르고 메시지가 표시되면 Y를 입력하여 파일을 저장합니다.

    6단계 - 담론 설치

    다음 명령을 실행하여 Discourse 컨테이너를 부트스트랩합니다.

    $ sudo ./launcher bootstrap app
    

    담화 응용 프로그램을 시작합니다.

    $ sudo ./launcher start app
    

    URL http://yourserver_IP:8080 또는 http://discourse.example.com:8080을 방문하여 포럼에 액세스할 수 있습니다. 브라우저. 다음 화면이 나타납니다.

    계속하려면 등록 버튼을 클릭하십시오. app.yml 파일에 설정된 이메일 ID는 자동으로 채워집니다.

    등록 버튼을 클릭하여 관리자 계정을 등록합니다. 이메일 확인 화면으로 이동합니다.

    SMTP 설정이 올바르면 계정 활성화를 위한 메일을 받게 됩니다. 이메일에서 링크를 클릭하여 계정 설정을 완료합니다.

    활성화 버튼을 클릭하여 설치를 마칩니다.

    Discourses 설정 마법사 화면이 나타납니다. 건너뛰어 포럼으로 직접 진행하거나 전체 마법사를 진행할 수 있습니다.

    Discourse 포럼이 준비되었습니다. 다음 단계는 SSL을 설치하고 포럼을 Nginx 서버 뒤에 배치하는 것입니다.

    7단계 - SSL 설치

    Lets Encrypt를 사용하여 SSL 인증서를 설치하려면 Certbot 도구를 설치해야 합니다.

    이를 위해 Snapd 패키지 설치 프로그램을 사용합니다. 대부분의 Debian 서버는 함께 제공되지 않으므로 Snapd 설치 프로그램을 설치합니다.

    $ sudo apt install snapd
    

    Snapd 버전이 최신인지 확인하세요.

    $ sudo snap install core && sudo snap refresh core
    

    Certbot을 설치합니다.

    $ sudo snap install --classic certbot
    

    다음 명령을 사용하여 /usr/bin 디렉토리에 대한 심볼릭 링크를 생성하여 Certbot 명령을 실행할 수 있는지 확인하십시오.

    $ sudo ln -s /snap/bin/certbot /usr/bin/certbot
    

    설치를 확인하십시오.

    $ certbot --version
    certbot 1.22.0
    

    SSL 인증서를 생성합니다.

    $ sudo certbot certonly --standalone --agree-tos --no-eff-email --staple-ocsp --preferred-challenges http -m  -d discourse.example.com
    

    위의 명령은 서버의 /etc/letsencrypt/live/discourse.example.com 디렉터리에 인증서를 다운로드합니다.

    Diffie-Hellman 그룹 인증서를 생성합니다.

    $ sudo openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048
    

    Lets Encrypt 자동 갱신을 위한 챌린지 웹루트 디렉터리를 만듭니다.

    $ sudo mkdir -p /var/lib/letsencrypt
    

    SSL을 갱신하기 위해 Cron 작업을 생성합니다. 인증서를 확인하고 필요한 경우 갱신하기 위해 매일 실행됩니다. 이를 위해 먼저 /etc/cron.daily/certbot-renew 파일을 생성하고 편집을 위해 엽니다.

    $ sudo nano /etc/cron.daily/certbot-renew
    

    다음 코드를 붙여넣습니다.

    #!/bin/sh
    certbot renew --cert-name discourse.example.com --webroot -w /var/lib/letsencrypt/ --post-hook "systemctl reload nginx"
    

    Ctrl + X를 누르고 메시지가 표시되면 Y를 입력하여 파일을 저장합니다.

    실행 가능하도록 태스크 파일에 대한 권한을 변경하십시오.

    $ sudo chmod +x /etc/cron.daily/certbot-renew
    

    8단계 - Nginx 설치 및 구성

    Debian은 이전 버전의 Nginx와 함께 제공됩니다. 최신 버전을 설치하려면 공식 Nginx 저장소를 다운로드해야 합니다.

    공식 Nginx 서명 키를 가져옵니다.

    $ curl https://nginx.org/keys/nginx_signing.key | gpg --dearmor \
    	 | sudo tee /usr/share/keyrings/nginx-archive-keyring.gpg >/dev/null
    

    Nginxs 안정 버전용 리포지토리를 추가합니다.

    $ echo "deb [signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg arch=amd64] \
        http://nginx.org/packages/debian `lsb_release -cs` nginx" \
        | sudo tee /etc/apt/sources.list.d/nginx.list
    

    Debian 리포지토리를 업데이트합니다.

    $ sudo apt update
    

    Nginx를 설치합니다.

    $ sudo apt install nginx
    

    설치를 확인하십시오. Debian에서 Nginx 명령을 실행할 때마다 sudo를 사용해야 합니다. 그렇지 않으면 작동하지 않습니다.

    $ sudo nginx -v
    nginx version: nginx/1.20.2
    

    편집을 위해 /etc/nginx/conf.d/discourse.conf 파일을 만들고 엽니다.

    $ sudo nano /etc/nginx/conf.d/discourse.conf
    

    다음 코드를 붙여넣습니다.

    # enforce HTTPS
    server {
        listen       80; 
        listen 	[::]:80;
        server_name  discourse.example.com;
        return 301   https://$host$request_uri;
    }
    server {
        listen       443 ssl http2;
        listen 	[::]:443 ssl http2;
        server_name  discourse.example.com;
    
        access_log  /var/log/nginx/discourse.access.log;
        error_log   /var/log/nginx/discourse.error.log;
        
        # SSL
        ssl_certificate      /etc/letsencrypt/live/discourse.example.com/fullchain.pem;
        ssl_certificate_key  /etc/letsencrypt/live/discourse.example.com/privkey.pem;
        ssl_trusted_certificate /etc/letsencrypt/live/discourse.example.com/chain.pem;
        ssl_session_timeout  5m;
        ssl_session_cache shared:MozSSL:10m;
        ssl_session_tickets off;
        ssl_protocols TLSv1.2 TLSv1.3;
        ssl_prefer_server_ciphers on;
        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;
        ssl_ecdh_curve X25519:prime256v1:secp384r1:secp521r1;
        ssl_stapling on;
        ssl_stapling_verify on;
        ssl_dhparam /etc/ssl/certs/dhparam.pem;
        resolver 8.8.8.8;
        
        client_max_body_size 100m;
        
        location / {
            proxy_pass http://discourse.example.com:8080/;
            proxy_set_header Host $http_host;
            proxy_http_version 1.1;
            proxy_set_header X-Forwarded-Proto $scheme;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Real-IP $remote_addr;
        }    
    }
    

    완료되면 Ctrl + X를 누르고 프롬프트가 표시되면 Y를 입력하여 파일을 저장합니다.

    편집을 위해 /etc/nginx/nginx.conf 파일을 엽니다.

    $ sudo nano /etc/nginx/nginx.conf
    

    include /etc/nginx/conf.d/*.conf; 줄 앞에 다음 줄을 추가합니다.

    server_names_hash_bucket_size  64;
    

    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 successful
    

    Nginx 서비스를 시작하여 새 구성을 활성화합니다.

    $ sudo systemctl start nginx
    

    9단계 - 담론 명령

    명령줄에서 Discourse Administrator 활성화

    활성화 이메일을 받지 못한 경우 명령줄에서 관리자 계정을 활성화할 수 있습니다.

    Discourse 디렉토리로 전환합니다.

    $ cd /var/discourse
    

    담화 컨테이너 셸에 들어갑니다.

    $ sudo ./launcher enter app
    

    Rails 명령 프롬프트에 액세스하려면 rails c 명령을 입력하십시오.

    :/var/www/discourse# rails c
    

    다음 프롬프트가 표시됩니다.

    [1] pry(main)> 
    

    명령을 입력하여 관리자 계정을 찾습니다.

    [1] pry(main)>  User.find_by_email("")
    => #<User:0x00005564492032a0
     id: 1,
     username: "username",
     created_at: Sun, 06 Feb 2022 14:46:58.451302000 UTC +00:00,
     updated_at: Sun, 06 Feb 2022 14:54:17.079564000 UTC +00:00,
     name: nil,
     seen_notification_id: 4,
     last_posted_at: nil,
     password_hash: "[FILTERED]",
     salt: "20d6012d3c98da70896dcfc27bc9d264",
     active: true,
     username_lower: "username",
     last_seen_at: Mon, 07 Feb 2022 08:34:12.435844000 UTC +00:00,
     admin: true,
     last_emailed_at: Sun, 06 Feb 2022 14:47:00.694121000 UTC +00:00,
     trust_level: 1,
     approved: false,
     approved_by_id: nil,
     approved_at: nil,
     previous_visit_at: Sun, 06 Feb 2022 15:40:35.804941000 UTC +00:00,
     suspended_at: nil,
     suspended_till: nil,
     date_of_birth: nil,
     views: 0,
     flag_level: 0,
     ip_address: #<IPAddr: IPv4:69.28.90.35/255.255.255.255>,
     moderator: false,
     title: nil,
     uploaded_avatar_id: 3,
    :
    

    q를 입력하여 프롬프트로 돌아가서 다음 명령을 순서대로 입력하십시오.

    [2] pry(main)> user.approved = true
    [3] pry(main)> user.save
    [4] pry(main)> EmailToken.confirm(user.email_tokens.first.token)
    

    exit를 두 번 입력하여 셸로 돌아갑니다. 관리자 계정이 활성화되어 사용할 준비가 되었습니다.

    업그레이드 담론

    포럼을 업그레이드하려면 두 가지 방법 중 하나를 사용할 수 있습니다. 첫 번째 방법은 관리자 대시보드를 통해 업그레이드하는 것입니다. 두 번째 방법은 명령줄을 사용하는 것입니다.

    Discourse 디렉토리로 전환합니다.

    $ cd /var/discourse
    

    Github에서 최신 파일을 가져와 Discourse 설치를 업데이트합니다.

    $ git pull
    

    담론을 재건하십시오.

    $ sudo ./launcher rebuild app
    

    app.yml 파일을 변경할 때마다 Discourse를 다시 빌드해야 합니다. 변경 후 위의 명령을 실행합니다. 이전 컨테이너를 파괴하고 새 컨테이너를 부트스트랩하고 시작합니다.

    담화 중지

    $ sudo ./launcher stop
    

    담화 로그 보기

    $ sudo ./launcher logs
    

    결론

    이것으로 튜토리얼을 마칩니다. Debian 11 서버의 Nginx 웹 서버 뒤에 Docker를 사용하여 Discourse 포럼을 설치했습니다. 질문이 있으시면 아래 의견에 게시하십시오.