Поиск по сайту:

Как установить Discourse Forum с Nginx и Free Lets Encrypt SSL на Debian 11


На этой странице

  1. Предпосылки
  2. Шаг 1. Настройка брандмауэра
  3. Шаг 2. Установите Git
  4. Шаг 3. Установите Docker
  5. Шаг 4. Загрузите Discourse
  6. Шаг 5. Настройка Discourse
    1. Установить домен
    2. Настройка открытых портов
    3. Настройка параметров SMTP
    4. Настройки памяти (необязательно)
    5. Настройки GeoLite2 (необязательно)

    1. Активируйте администратора Discourse из командной строки.
    2. Обсуждение обновлений
    3. Остановить обсуждение
    4. Просмотр журналов обсуждений

    Discourse — это дискуссионная платформа сообщества с открытым исходным кодом, созданная с использованием языка Ruby. Он предназначен для работы в качестве форума, чата или списка рассылки. Он легко интегрируется с другими платформами, а его функциональность можно расширить с помощью плагинов.

    В этом руководстве вы узнаете, как установить Discourse Forum с сервером Nginx на сервере под управлением Debian 11.

    Предпосылки

    • 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. Настройте брандмауэр

    Первым шагом является настройка брандмауэра. Debian поставляется с 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

    Установите 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, добавьте официальный GPG-ключ Dockers.

    $ 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 требует привилегий root. Если вы хотите избежать использования sudo при каждом запуске команды docker, добавьте свое имя пользователя в 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. Настройте дискурс

    Создайте файл конфигурации app.yml, скопировав образец файла standalone.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\. Это изменит внешний HTTP-порт для Discourse на 8080, поскольку мы будет использовать Nginx на порту 80. Закомментируйте строку \443:443\, так как мы будем устанавливать SSL извне.

    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)
    

    Настройки памяти (необязательно)

    Если на вашем сервере недостаточно оперативной памяти, вы можете соответствующим образом настроить следующие переменные, чтобы уменьшить объем памяти, занимаемой Discourses.

    db_shared_buffers: '128MB'
    UNICORN_WORKERS: 2
    

    Переменная db_shared_buffers обычно устанавливается равной 25% доступной памяти.

    Настройки GeoLite2 (необязательно)

    Если вам нужна функция поиска IP-адресов в Discourse, зарегистрируйте бесплатную учетную запись Maxmind Geolite2 и получите лицензионный ключ. Вставьте этот лицензионный ключ в качестве значения следующей переменной.

    DISCOURSE_MAXMIND_LICENSE_KEY: your_maxmind_license_key
    

    Сохраните файл, нажав Ctrl + X и введя Y при появлении запроса.

    Шаг 6 — Установите дискурс

    Выполните следующую команду, чтобы загрузить контейнер Discourse.

    $ sudo ./launcher bootstrap app
    

    Запустите приложение Discourse.

    $ sudo ./launcher start app
    

    Вы можете получить доступ к форуму, посетив URL-адреса http://yourserver_IP:8080 или http://discourse.example.com:8080 в вашем браузер. Вы получите следующий экран.

    Нажмите кнопку Регистрация, чтобы продолжить. Идентификатор электронной почты, указанный в файле app.yml, будет предварительно заполнен для вас.

    Нажмите кнопку «Регистрация», чтобы зарегистрировать учетную запись администратора. Вы перейдете к экрану подтверждения электронной почты.

    Если ваши настройки SMTP верны, вы получите письмо для активации учетной записи. Нажмите на ссылку в письме, чтобы завершить настройку учетной записи.

    Нажмите кнопку Активировать, чтобы завершить установку.

    Вы попадете на экран мастера настройки Discourses. Вы можете либо пропустить его, чтобы перейти непосредственно к форуму, либо пройти весь мастер.

    Ваш дискуссионный форум готов. Следующим шагом будет установка SSL и размещение форума за сервером Nginx.

    Шаг 7 — Установите SSL

    Чтобы установить SSL-сертификат с помощью Lets Encrypt, нам нужно установить инструмент Certbot.

    Для этого мы будем использовать установщик пакета Snapd. Поскольку большинство серверов Debian не поставляются с ним, установите установщик Snapd.

    $ sudo apt install snapd
    

    Убедитесь, что ваша версия Snapd обновлена.

    $ sudo snap install core && sudo snap refresh core
    

    Установите Сертбот.

    $ sudo snap install --classic certbot
    

    Используйте следующую команду, чтобы убедиться, что команду Certbot можно запустить, создав символическую ссылку на каталог /usr/bin.

    $ 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 на вашем сервере.

    Создайте групповой сертификат Диффи-Хеллмана.

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

    Создайте корневой каталог вызова для автоматического обновления Lets Encrypt.

    $ sudo mkdir -p /var/lib/letsencrypt
    

    Создайте задание Cron для обновления SSL. Он будет запускаться каждый день для проверки сертификата и его обновления при необходимости. Для этого сначала создайте файл /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
    

    Добавьте репозиторий для стабильной версии Nginx.

    $ 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
    

    Установите Нгинкс.

    $ sudo apt install nginx
    

    Проверьте установку. Убедитесь, что вы используете sudo каждый раз, когда запускаете команду Nginx в Debian. В противном случае это не сработает.

    $ 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 из командной строки.

    Если вы не получили электронное письмо с активацией, вы можете активировать учетную запись администратора из командной строки.

    Перейдите в каталог Discourse.

    $ cd /var/discourse
    

    Войдите в оболочку контейнера Discourse.

    $ sudo ./launcher enter app
    

    Введите команду rails c, чтобы получить доступ к командной строке Rails.

    :/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
    

    Обновите установку Discourse, скачав последние файлы с Github.

    $ git pull
    

    Восстановить дискурс.

    $ sudo ./launcher rebuild app
    

    Вам необходимо перестраивать Discourse каждый раз, когда вы вносите какие-либо изменения в файл app.yml. После внесения изменений запустите команду выше. Он уничтожает старый контейнер, загружает новый и запускает его.

    Остановить дискурс

    $ sudo ./launcher stop
    

    Просмотр журналов обсуждений

    $ sudo ./launcher logs
    

    Заключение

    На этом учебник заканчивается. Вы установили форум Discourse с помощью Docker за веб-сервером Nginx на сервере Debian 11. Если у вас есть какие-либо вопросы, задайте их в комментариях ниже.