如何在 Debian 11 上使用 Nginx 和 Free Lets Encrypt SSL 安装 Discourse Forum
在此页
- 先决条件
- 第 1 步 - 配置防火墙
- 第 2 步 - 安装 Git
- 第 3 步 - 安装 Docker
- 第 4 步 - 下载 Discourse
- 第 5 步 - 配置 Discourse
- 设置域
- 配置公开端口
- 配置 SMTP 设置
- 内存设置(可选)
- GeoLite2 设置(可选)
- 从命令行激活 Discourse Administrator
- 升级话语
- 停止讨论
- 查看讨论日志
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 步 - 配置防火墙
第一步是配置防火墙。 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
使用默认的 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
要安装最新版本的 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 需要 root 权限。如果您想避免每次运行
docker
命令时都使用sudo
,请将您的用户名添加到docker
组。$ sudo usermod -aG docker $(whoami)
要启用此更改,您需要注销服务器并以同一用户身份重新登录。
第 4 步 - 下载 Discourse
为 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。注释掉\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 设置(可选)
如果您想在 Discourse 上使用 IP 查找功能,请注册免费的 Maxmind Geolite2 帐户并获取许可证密钥。将该许可证密钥粘贴为以下变量的值。
DISCOURSE_MAXMIND_LICENSE_KEY: your_maxmind_license_key
通过按 Ctrl + X 并在出现提示时输入 Y 来保存文件。
第 6 步 - 安装 Discourse
运行以下命令来引导您的 Discourse 容器。
$ sudo ./launcher bootstrap app
启动 Discourse 应用程序。
$ sudo ./launcher start app
您可以通过访问网址
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 自动更新创建一个挑战 webroot 目录。
$ 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
安装 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
进入 Discourse 容器 Shell。
$ 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
两次以返回 shell。您的管理员帐户已激活并可以使用。升级话语
要升级论坛,您可以使用以下两种方式之一。第一种方法是通过管理员仪表板升级它。第二种方法是使用命令行。
切换到 Discourse 目录。
$ cd /var/discourse
通过从 Github 获取最新文件来更新 Discourse 安装。
$ git pull
重建话语。
$ sudo ./launcher rebuild app
每次在
app.yml
文件中进行任何更改时,都需要重建 Discourse。进行更改后,运行上面的命令。它销毁旧容器,引导一个新容器并启动它。停止话语
$ sudo ./launcher stop
查看讨论日志
$ sudo ./launcher logs
结论
本教程到此结束。您已经在 Debian 11 服务器上的 Nginx Web 服务器后面使用 Docker 安装了 Discourse 论坛。如果您有任何问题,请在下面的评论中发表。