Ubuntu 上不使用 Docker 安装 Discourse 指南

本教程将向您展示如何在 Ubuntu 20.04/18.04 服务器上安装 Discourse。Discourse 由 StackExchange 创始人 Jeff Atwood 创建,是一款开源的互联网论坛(又名在线留言板)和邮件列表管理软件,旨在革新论坛讨论方式。它使用 Ember.js 和 Ruby on Rails 编写,并使用 PostgreSQL 作为后端数据库管理系统。

Discourse 的特性

  • 无限滚动。帖子中没有下一页。只需向下滚动即可阅读更多内容。
  • 实时更新,拖放附件。
  • 论坛帖子可以按受欢迎程度排名。
  • “最佳帖子”视图可以显示特定帖子的最佳回复。
  • 能够记住您在帖子中的阅读位置。
  • 展开 URL 以提供 URL 的摘要。
  • 用户可以通过电子邮件回复。
  • 标记系统会自动隐藏不适当的帖子,直到工作人员可以审查它们。
  • 版主可以拆分、合并、本地化或存档任何主题。
  • 根据信任级别,用户可以被提升为版主,或被降级为巨魔、不良行为者或垃圾邮件发送者,以保持论坛文明。内置 Akismet 垃圾邮件保护和启发式方法,包括新用户沙箱、用户标记阻止和标准 nofollow。
  • 徽章系统可以显示用户取得的成就。
  • 移动友好、响应式网页设计。用户可以通过笔记本电脑、平板电脑和手机阅读或发帖。
  • 100% 免费开源。没有具有更好或更完整功能的付费商业版本。
  • 单点登录。将 Discourse 与您现有站点的登录系统无缝集成。
  • 社交登录。轻松添加常见的社交登录方式,如 Google、Facebook、Twitter 等。
  • 提供 iOS 和 Android 应用程序。
  • 提供 30 多种语言版本。
  • 双因素身份验证以提高帐户安全性。
  • 还有更多。

为什么要在没有 Docker 的情况下在 Ubuntu 20.04/18.04 上安装 Discourse

安装 Discourse 的官方方法是使用 Docker,这对于那些想要快速启动和运行应用程序的人来说非常棒。但是 Docker 也非常消耗资源。试想一下:如果您已经启动并运行了一些组件(如 PostgreSQL 数据库服务器),Docker 方法仍然会在容器内运行一个单独的 PostgreSQL 数据库,这会浪费服务器资源。您需要一个 2GB RAM 的服务器才能使用 Docker 运行 Discourse。我将向您展示如何在没有 Docker 的情况下在 1GB RAM 的服务器上运行 Discourse。

先决条件

要运行 Discourse,您需要一台至少具有 1GB RAM 的服务器。如果您正在寻找虚拟专用服务器 (VPS),我推荐 Kamatera VPS,它具有以下特点:

  • 30 天免费试用。
  • 起价为每月 4 美元(1GB RAM)
  • 高性能基于 KVM 的 VPS
  • 在全球拥有 9 个数据中心,包括美国、加拿大、英国、德国、荷兰、香港和以色列。

请按照下面链接的教程在 Kamatera 上创建您的 Linux VPS 服务器。

一旦您拥有运行 Ubuntu 20.04/18.04 的 VPS,请按照以下说明进行操作。

您还需要一个域名。我在 NameCheap 注册了我的域名,因为价格低廉,并且他们终身免费提供 whois 隐私保护。

注意:我在 Ubuntu 20.04/18.04 上使用 sudo 用户安装了 Discourse。为了获得最佳效果,您也应该使用 sudo 用户(而不是 root 用户)按照本教程进行操作。

要添加 sudo 用户,只需运行

sudo adduser 用户名
sudo adduser 用户名 sudo

然后切换到新用户。

su - 用户名

步骤 1:配置 PostgreSQL 数据库服务器

通过 SSH 登录到您的服务器,然后运行以下命令从默认的 Ubuntu 软件存储库安装 PostgreSQL。

sudo apt install postgresql

PostgreSQL 数据库服务器将自动启动并监听 127.0.0.1:5432,可以通过以下命令查看。(如果您的 Ubuntu 服务器没有 netstat 命令,您可以运行 sudo apt install net-tools 命令来安装它。)

sudo netstat -lnpt | grep postgres

如果您没有看到上述命令的任何输出,则可能是因为 PostgreSQL 服务器未运行。您可以通过发出以下命令来启动 PostgreSQL 服务器。

sudo systemctl start postgresql

在安装过程中,将在操作系统上创建 postgres 用户。它是 PostgreSQL 数据库服务器的超级用户。默认情况下,此用户没有密码,并且无需设置密码,因为您可以使用 sudo 切换到 postgres 用户并登录到 PostgreSQL 控制台。

sudo -u postgres psql

为 Discourse 创建一个数据库。

CREATE DATABASE discourse;

创建一个数据库用户。

CREATE USER discourse_user;

为此用户设置密码。

ALTER USER discourse_user WITH ENCRYPTED PASSWORD '您的首选密码';

将此用户设置为 discourse 数据库的所有者。

ALTER DATABASE discourse OWNER TO discourse_user;

连接到 discourse 数据库。

\c discourse;

创建 hstorepg_trgm 扩展。

CREATE EXTENSION hstore;
CREATE EXTENSION pg_trgm;

从 PostgreSQL 控制台注销。

\q

步骤 2:在 Ubuntu 20.04/18.04 上安装 Ruby

Discourse 需要 Ruby 2.7 或更高版本。但是,Ubuntu 20.04/18.04 存储库附带 Ruby 2.5.1。Ruby 的最新版本是 3.0.1。但是,我不建议使用最新版本,因为它可能与 Discourse 不兼容。为了获得最佳兼容性,我建议从 PPA 安装 Ruby 2.7。

sudo apt install software-properties-common
sudo apt-add-repository ppa:brightbox/ruby-ng
sudo apt install ruby2.7

要检查您的 Ruby 版本号,请运行

ruby -v

输出:

ruby 2.7.1p83 (2020-03-31 revision a0c7c23c9c) [x86_64-linux-gnu]

步骤 3:下载并配置 Discourse

安装 git 工具。

sudo apt install git

假设您位于主目录中,请运行以下命令从 Github 克隆 Discourse 代码存储库。

git clone https://github.com/discourse/discourse.git

创建 /var/www/ 目录(如果尚未创建)。

sudo mkdir /var/www/

将 discourse 目录移动到 /var/www/

sudo mv discourse/ /var/www/

更改目录并使用 Discourse 的最新稳定版本。您可以转到 Github 发布页面 查看最新稳定版本。我现在使用的是 v2.5.0。

cd /var/www/discourse/
git checkout v2.5.0

安装 bundler:Ruby 依赖项管理器。

sudo /usr/bin/gem install bundler

安装以下软件包以编译源代码。

sudo apt-get install gcc build-essential ruby2.7-dev libxslt-dev libxml2-dev zlib1g-dev libpq-dev imagemagick

然后安装 Discourse 的依赖项。此过程可能会占用大量 RAM。

RAILS_ENV=production /usr/local/bin/bundle config set path '/var/www/discourse/vendor/bundle/'
RAILS_ENV=production /usr/local/bin/bundle install

将默认配置文件复制到新文件。

cp config/discourse_defaults.conf config/discourse.conf

编辑新文件。

nano config/discourse.conf

配置数据库连接。

# db 服务器的主机地址
# 此项设置为空,因此它会首先尝试使用套接字
db_host = localhost
# 运行 db 服务器的端口,无需设置
db_port = 5432
# 运行 discourse 的数据库名称
db_name = discourse
# 访问数据库的用户名
db_username = discourse_user
# 用于访问数据库的密码
db_password = 您的密码

更改与您的 Discourse 论坛一起使用的域名。

# 运行论坛的主机名
hostname = "community.example.com"

保存并关闭文件。

步骤 4:获取免费的 MaxMind 许可证密钥

Discourse 附带一个内置的 Web 分析工具。如果您想知道访问者的地理信息,则需要一个 MaxMind 许可证密钥。

在 MaxMind 创建一个帐户。Maxmind 将向您发送一封电子邮件。单击电子邮件中的链接以设置密码,然后登录到您的 MaxMind 帐户。接下来,选择左侧栏上的“我的许可证密钥”。

单击“生成新许可证密钥”按钮。

为您的许可证密钥命名。然后选择“否”,因为我们不需要使用 geoipupdate 程序。然后单击“确认”按钮。

创建许可证密钥后,复制许可证密钥。打开 Discourse 配置文件。

nano config/discourse.conf

找到以下行并将您的许可证密钥添加到此处。

maxmind_license_key=

保存并关闭文件。

步骤 5:启动 Discourse

安装所需的软件包。

sudo apt install redis-server optipng pngquant jhead jpegoptim gifsicle nodejs npm
sudo npm install -g svgo

编辑生产环境配置文件。

nano /var/www/discourse/config/environments/production.rb

将以下代码添加为第五行。

require 'uglifier'

然后找到以下行。

config.assets.js_compressor = :uglifier

将其替换为:

config.assets.js_compressor = Uglifier.new(:harmony => true)

保存并关闭文件。然后运行以下命令来初始化数据库。如果您在此步骤中看到任何错误,只需再次运行该命令即可。

RAILS_ENV=production /usr/local/bin/bundle exec rake db:migrate

接下来,我们将编译静态资源(如 JavaScript),但在执行此操作之前,我们需要编辑一个文件。

nano /var/www/discourse/lib/tasks/assets.rake

我们需要找到包含 brotli 的行并将其注释掉以禁用 Brotili 压缩,因为 JavaScript 文件将使用 Gzip 压缩。如果同时启用 Gzip 和 Brotili 压缩,则在编译资源时会出现一些烦人的错误。找到以下行(第 281 行)并将其注释掉。

brotli(path, max_compress)

保存并关闭文件。接下来,运行以下命令来编译资源。此过程可能会占用大量 RAM,例如 1GB。

RAILS_ENV=production /usr/local/bin/bundle exec rake assets:precompile

如果您遇到“要使用 ES6 语法,必须启用 harmony 模式”错误,则只需再次运行相同的命令即可继续。

编译 JavaScript 和 CSS 文件后,您可以继续执行下一个命令。

接下来,编辑 puma.rb 文件

nano /var/www/discourse/config/puma.rb

找到以下行。

APP_ROOT = '/home/discourse/discourse'

将应用程序路径更改为

APP_ROOT = '/var/www/discourse'

保存并关闭文件。然后创建套接字和进程 ID 目录。

mkdir /var/www/discourse/tmp/sockets/ /var/www/discourse/tmp/pids/

启动 Discourse。

RAILS_ENV=production bundle exec puma -C /var/www/discourse/config/puma.rb

示例输出:

[24161] Puma starting in cluster mode...
[24161] * Version 4.3.1 (ruby 2.7.1-p146), codename: Mysterious Traveller
[24161] * Min threads: 8, max threads: 32
[24161] * Environment: development
[24161] * Process workers: 4
[24161] * Preloading application
[24161] * Listening on unix:///var/www/discourse/tmp/sockets/puma.sock
[24161] ! WARNING: Detected 4 Thread(s) started in app boot:
[24161] ! #<Thread:0x000055c7d2b72d08@/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.6/lib/concurrent-ruby/concurrent/atomic/ruby_thread_local_var.rb:38 sleep_forever> - /var/www/discourse/vendor/bundle/ruby/2.6.0/gems/concurrent-ruby-1.1.6/lib/concurrent-ruby/concurrent/atomic/ruby_thread_local_var.rb:40:in `pop'
[24161] ! #<Thread:0x000055c7d543cfb8@/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/message_bus-2.2.3/lib/message_bus.rb:667 sleep> - /var/www/discourse/vendor/bundle/ruby/2.6.0/gems/redis-4.1.3/lib/redis/connection/ruby.rb:68:in `select'
[24161] ! #<Thread:0x000055c7d543cd88@/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/message_bus-2.2.3/lib/message_bus/timer_thread.rb:38 sleep> - /var/www/discourse/vendor/bundle/ruby/2.6.0/gems/message_bus-2.2.3/lib/message_bus/timer_thread.rb:123:in `sleep'
[24161] ! #<Thread:0x000055c7d5f04680@lib/discourse.rb:708 sleep> - lib/discourse.rb:711:in `sleep'
[24161] * Daemonizing...

Discourse 正在监听 Unix 套接字:/var/www/discourse/tmp/sockets/puma.sock

步骤 6:配置 Nginx 反向代理

从 Ubuntu 20.04/18.04 默认软件仓库安装 Nginx Web 服务器。

sudo apt install nginx

复制 Nginx 虚拟主机配置文件示例。

sudo cp /var/www/discourse/config/nginx.sample.conf /etc/nginx/conf.d/discourse.conf

编辑新文件。

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

找到以下行并注释掉,因为我们将使用 Puma。

upstream discourse { server unix:/var/www/discourse/tmp/sockets/nginx.http.sock; server unix:/var/www/discourse/tmp/sockets/nginx.https.sock; }

找到以下行并取消注释。

# upstream discourse { # server unix:/var/www/discourse/tmp/sockets/puma.sock; # }

找到以下行。

server_name enter.your.web.hostname.here;

更改服务器名称。不要忘记为域名添加 DNS A 记录。

server_name community.example.com;

Nginx 默认不支持 Brotli 压缩,因此请注释掉以下行。

brotli_static on;

保存并关闭文件。创建缓存目录。

sudo mkdir -p /var/nginx/cache/

然后测试 Nginx 配置。

sudo nginx -t

如果测试成功,则重新加载 Nginx 以使更改生效。

sudo systemctl reload nginx

现在您应该可以在 http://community.example.com 看到 Discourse 论坛。

第 7 步:启用 HTTPS

为了加密 HTTP 流量,我们可以通过安装 Let’s Encrypt 颁发的免费 TLS 证书来启用 HTTPS。运行以下命令在 Ubuntu 20.04/18.04 服务器上安装 Let’s Encrypt 客户端 (certbot)。

sudo apt install certbot python3-certbot-nginx

接下来,运行以下命令获取并安装 TLS 证书。

sudo certbot --nginx --agree-tos --redirect --hsts --staple-ocsp --email [email protected] -d community.example.com

其中:

  • --nginx: 使用 nginx 插件。
  • --agree-tos: 同意服务条款。
  • --redirect: 通过 301 重定向强制使用 HTTPS。
  • --hsts: 将 Strict-Transport-Security 标头添加到每个 HTTP 响应。强制浏览器始终对该域使用 TLS。防御 SSL/TLS 剥离攻击。
  • --staple-ocsp: 启用 OCSP Stapling。有效的 OCSP 响应会附加到服务器在 TLS 期间提供的证书上。

现在应该已获取并自动安装证书。

您可以通过 HTTPS (https://community.example.com) 访问 Discourse 论坛。

如果 Firefox 在浏览器地址栏中显示黄色三角形,那是因为某些图像仍然通过 HTTP 协议提供。要解决此问题,您可以编辑 Discourse Nginx 配置文件。

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

在 SSL 服务器块中添加以下行以升级不安全请求。

add_header Content-Security-Policy upgrade-insecure-requests;

保存并关闭文件。然后重新加载 Nginx。

sudo nginx -t
sudo systemctl reload nginx

第 8 步:创建管理员帐户

转到 discourse 目录 (/var/www/discourse/) 并运行以下命令以创建管理员帐户。

RAILS_ENV=production /usr/local/bin/bundle exec rake admin:create

系统将要求您输入管理员帐户的电子邮件地址和密码。

之后,重新启动 Discourse。

RAILS_ENV=production /usr/local/bin/bundle exec pumactl -P /var/www/discourse/tmp/pids/puma.pid restart

现在刷新 Discourse 网页,您将能够登录。

如果您看到 502 Bad Gateway 错误,则表示重新启动命令未成功,您需要使用以下命令启动 Discourse:

RAILS_ENV=production bundle exec puma -C /var/www/discourse/config/puma.rb

登录后,您可以启动设置向导 (https://community.example.com/wizard) 并按照说明完成安装。如果您使用 Cloudflare CDN,则需要转到 settingssecuritycontent security policy src 并添加此 URL:https://community.example.com/cdn-cgi/

第 9 步:配置后台处理服务:Sidekiq

Sidekiq 是一个开源作业调度器。许多任务(如发送电子邮件)由 sidekiq 异步执行。编辑 sidekiq.yml 文件。

nano /var/www/discourse/config/sidekiq.yml

将以下行添加到文件末尾。此配置适用于用户活动和 RAM 较低的 Discourse 论坛。如果用户活动很多,请考虑将并发性和队列数量加倍。

production:
  :concurrency: 2
  :queues:
    - [critical, 4]
    - [default, 2]
    - [low]
    - [ultra_low]

保存并关闭文件。然后为 sidekiq 创建一个 Systemd 服务。

sudo nano /etc/systemd/system/discourse-sidekiq.service

在文件中添加以下行。将 username 替换为您的真实用户名。

[Unit]
Description=Discourse sidekiq background processing service
After=multi-user.target

[Service]
Type=simple
User=username
PIDFile=/var/www/discourse/tmp/pids/sidekiq.pid
WorkingDirectory=/var/www/discourse
Environment=RAILS_ENV=production
ExecStart=/usr/local/bin/bundle exec sidekiq -C /var/www/discourse/config/sidekiq.yml
Restart=on-failure
RestartSec=5

[Install]
WantedBy=multi-user.target

保存并关闭文件。然后启动并启用此服务。

sudo systemctl start discourse-sidekiq
sudo systemctl enable discourse-sidekiq

检查状态。确保它正在运行。

sudo systemctl status discourse-sidekiq

Sidekiq 仪表板位于 https://community.example.com/sidekiq

第 10 步:为 Discourse 创建 Systemd 服务

首先,使用以下命令停止当前的 Discourse 进程:

cd /var/www/discourse/
RAILS_ENV=production /usr/local/bin/bundle exec pumactl -P /var/www/discourse/tmp/pids/puma.pid stop

然后编辑 puma.rb 文件。

nano /var/www/discourse/config/puma.rb

注释掉以下两行(在每行开头添加 # 符号),因为 Systemd 将处理进程 ID 和守护进程化。

# pidfile "#{APP_ROOT}/tmp/pids/puma.pid"
# daemonize true

接下来,为 Discourse 创建一个 Systemd 服务。

sudo nano /etc/systemd/system/discourse.service

在文件中添加以下行。将 username 替换为您的真实用户名。

[Unit]
Description=Discourse service

[Service]
Type=simple
User=username
PIDFile=/var/www/discourse/tmp/pids/puma.pid
WorkingDirectory=/var/www/discourse
Environment=RAILS_ENV=production
ExecStart=/usr/local/bin/bundle exec puma -C config/puma.rb
Restart=on-failure
RestartSec=5

[Install]
WantedBy=multi-user.target

保存并关闭文件。然后启动并启用此服务。

sudo systemctl start discourse
sudo systemctl enable discourse

检查状态。确保它正在运行。

sudo systemctl status discourse

第 11 步:配置 SMTP

Discourse 需要发送电子邮件,以便访问者可以在您的论坛上注册帐户并接收通知。要编辑 SMTP 设置,请打开 discourse.conf 文件。

nano /var/www/discourse/config/discourse.conf

您可以找到以下行来配置 SMTP 服务器。通常,您希望使用 587 作为 SMTP 端口。

# address of smtp server used to send emails
smtp_address =
# port of smtp server used to send emails
smtp_port = 25
# domain passed to smtp server
smtp_domain =
# username for smtp server
smtp_user_name =
# password for smtp server
smtp_password =
# smtp authentication mechanism
smtp_authentication = plain
# enable TLS encryption for smtp connections
smtp_enable_start_tls = true

您可能还想在此文件中添加 From: 地址,如下所示。

# From: address
notification_email = [email protected]

有关如何设置自己的邮件服务器的信息,请查看以下教程。请注意,我强烈建议在全新的干净操作系统上运行 iRedMail 邮件服务器。在具有其他 Web 应用程序的操作系统上安装 iRedMail 可能会失败,并可能破坏现有应用程序。

如果您更喜欢使用第三方 SMTP 中继服务,那么我推荐 Sendinblue,它允许您每月免费发送 9000 封电子邮件。

保存 SMTP 设置后,重新启动 Discourse 服务。

sudo systemctl restart discourse discourse-sidekiq

然后,您可以在 Discourse 管理仪表板中测试电子邮件发送。

您可以转到 mail-tester.com,它将为您提供一个唯一的电子邮件地址。从您的 Discourse 向此电子邮件地址发送测试电子邮件,以了解您的发件人评分。

无法发送电子邮件

如果您的 Discourse 实例无法发送电子邮件,并且您在 Discourse 网页上看到以下消息:

所有外发电子邮件已被管理员全局禁用。不会发送任何类型的电子邮件通知。

您需要转到 SettingsEmail(不是 Emails),将 disable emails 设置为 no。保存设置并重新启动 Discourse。

sudo systemctl restart discourse discourse-sidekiq

如果您的 Discourse 仍然无法发送电子邮件,请检查它是否可以 ping 通邮件服务器。此外,请转到 https://community.example.com/sidekiq/retries,它将显示失败的电子邮件以及电子邮件发送失败的原因。

有时,discourse-sidekiq.service 可能会失败并导致电子邮件无法发送,因此您可能需要检查此服务是否正在运行。

sudo systemctl status discourse-sidekiq

优化 RAM 使用

默认的 puma 配置使 Discourse 使用大量 RAM。默认情况下,我的 Discourse 使用 4 个工作进程、8 个最小线程和 32 个最大线程。如果您的 RAM 不够,redis 服务器将被停止。要减少 RAM 使用量,您可以在 puma.rb 文件中减少工作进程和线程的数量。

nano /var/www/discourse/config/puma.rb

找到以下两行。

workers "#{num_workers}"
threads 8, 32

您可以更改如下值,这会告诉 puma 使用 2 个工作进程、4 个最小线程和 16 个最大线程。此设置适用于只有 1GB RAM 的服务器。

workers 2
threads 4, 16

保存并关闭文件。然后重新启动 Discourse 服务。

sudo systemctl restart discourse

升级 Discourse

您可以订阅 Discourse 版本发布的 RSS 源 以随时了解最新版本。在升级 Discourse 之前,我强烈建议在 Discourse 管理仪表板中进行手动数据库备份,并将其下载到您的硬盘。

注意:如果您在没有 Docker 的情况下安装了 Discourse,则一键浏览器升级 (404 page not found - yourdomain.com) 将不起作用。您需要按照以下说明进行操作。

要升级 Discourse,请先停止服务。

sudo systemctl stop discourse

转到 Discourse 安装目录。

cd /var/www/discourse/

从 Github 存储库获取新标签。

git fetch --tags

在检出最新的稳定版本之前,我建议将配置文件备份到您的主目录。

首先,复制以下文件:
```bash
cp config/puma.rb ~
cp config/environments/production.rb ~
cp config/sidekiq.yml ~
cp config/discourse.conf ~
```

然后删除 Gemfile.lock 文件。

rm Gemfile.lock

检出最新的稳定版本,例如:

git checkout v2.3.4

若出现以下错误提示:

请提交您的更改或在切换分支前暂存它们。中止

则运行以下命令:

git stash

然后再次运行 git checkout 命令。

为新的 Discourse 版本安装依赖项。此过程可能占用大量内存。

RAILS_ENV=production /usr/local/bin/bundle install --path vendor/bundle/

编辑 assets.rake 文件。

nano /var/www/discourse/lib/tasks/assets.rake

找到以下行(第 273 行)并注释掉它。

brotli(path, max_compress)

保存并关闭文件。接下来,运行以下命令以准备生产环境。

RAILS_ENV=production bundle exec rake db:migrate RAILS_ENV=production bundle exec rake assets:precompile

然后,您可以检查新的 `puma.rb` 配置文件是否相比原始文件添加了新行。如果没有新内容,则可以直接用原始文件替换该文件。

mv ~/puma.rb /var/www/discourse/config/puma.rb mv ~/production.rb /var/www/discourse/config/environments/production.rb mv ~/sidekiq.yml /var/www/discourse/config/sidekiq.yml mv ~/discourse.conf /var/www/discourse/config/discourse.conf

最后,启动 Discourse。

sudo systemctl start discourse

现在,您可以从管理仪表板检查 Discourse 版本。

![在 Ubuntu 上不使用 Docker 升级 Discourse|859x210](https://www.linuxbabe.com/wp-content/uploads/2019/05/upgrade-discourse-without-docker-ubuntu.png)

## Discourse 主题定制

如果您不喜欢默认的白色主题,可以通过 **管理仪表板** -> **定制** -> **主题** 进行自定义。默认安装了 3 个主题。

* 蓝色调
* 深色
* 浅色

我选择了蓝色调主题。您还可以通过单击 **编辑 CSS/HTML** 按钮添加自定义 CSS。以下是我为 Discourse 添加的 CSS。

html { background-color:#ececec; } #main-outlet { background-color: #fff; padding-left: 20px; } .d-header { background-color:rgb(45, 45, 45); } a:visited { color: blueviolet; } a { color: blueviolet; }

重启 Discourse 服务以使更改生效。

sudo systemctl restart discourse discourse-sidekiq

## 将 WordPress 与 Discourse 集成

如果您运行一个 [WordPress](https://www.linuxbabe.com/ubuntu/install-wordpress-ubuntu-22-04-nginx-mariadb-php8-1-lemp) 站点,您可以在 WordPress 站点上安装 WP Discourse 插件并将其与 Discourse 集成。它允许:

* 将帖子发布到 Discourse
* 使用 Discourse 进行 WordPress 评论
* 使用 WordPress 登录 Discourse (DiscourseConnect)

有关如何集成这两个软件的说明,请访问以下页面。

* [WP Discourse 插件安装和设置](https://meta.discourse.org/t/wp-discourse-plugin-installation-and-setup/50752)

## 如何将 Discourse 迁移到新服务器

首先,备份您的原始 Discourse 论坛,并下载 tar.gz 文件。(不要更改文件名。)

![Discourse 备份|1008x338](https://www.linuxbabe.com/wp-content/uploads/2019/05/discourse-backup.png)

然后,您需要在新服务器上按照步骤 1 到步骤 11 安装 Discourse。接下来,将备份文件上传到新服务器上的 `/var/www/discourse/public/backups/default/` 目录。

转到新服务器上的 /var/www/discourse/ 目录。

cd /var/www/discourse/

安装依赖项。

sudo gem install thor

转到 Discourse **管理仪表板** -> **设置** -> **备份**,勾选 **允许恢复**。

![从命令行恢复 Discourse 备份|844x309](https://www.linuxbabe.com/wp-content/uploads/2019/05/discourse-restore-from-backup-command-line.png)

接下来,运行以下命令以从备份恢复站点。

RAILS_ENV=production script/discourse restore file-name-of-the-backup-file.tar.gz

恢复完成后,重启 Discourse。

sudo systemctl restart discourse discourse-sidekiq

刷新 Discourse 网页,您将看到您的原始 Discourse 论坛重新上线。

如果看到以下错误:

此锁定文件必须使用 Bundler 2 或更高版本。

则需要更新 bundler。

gem install bundler

更新 gemfile.lock

RAILS_ENV=production bundle update --bundler

您也可以删除 Gemfile.lock 文件,这样就不会看到此错误。

## 如何卸载 Discourse

删除 PostgreSQL 数据库服务器。

sudo apt remove postgresql

删除 webroot 目录。

sudo rm /var/www/discourse/ -rf

删除 Nginx 配置文件。

sudo rm /etc/nginx/conf.d/discourse.conf

删除 Let’s Encrypt SSL 证书。

sudo certbot revoke --cert-name community.example.com

删除 SystemD 服务。

sudo rm /etc/systemd/system/discourse.service sudo rm /etc/systemd/system/discourse-sidekiq.service

## 监控 Discourse 实例的健康状况

您应该密切关注 Discourse 错误日志,您可以通过 **管理仪表板** -> **日志** -> **错误日志** 找到它。如果您的服务器流量很大,您可能需要更多内存来运行 Discourse。以下日志显示我的服务器内存不足。

![Discourse 错误日志|1230x335](https://www.linuxbabe.com/wp-content/uploads/2019/05/discourse-error-log.png)

## 如何处理 Discourse 中的难缠用户

如果您的 Discourse 论坛上有某个用户让您感到困扰,您可以将该用户的信任级别锁定为 `0: 新用户`,然后转到 Discourse `管理` -> `设置` -> `发帖`,并要求 `0: 新用户` 创建的帖子/主题在发布前获得批准。

![Discourse 发帖设置|884x419](https://www.linuxbabe.com/wp-content/uploads/2019/05/discourse-posting-settings.png)

## 结论

我希望本文能帮助您在不使用 Docker 的情况下在 Ubuntu 20.04/18.04 上安装 Discourse 论坛软件。一如既往,如果您觉得这篇文章有用,请[订阅我们的免费新闻通讯](https://newsletter.linuxbabe.com/subscription/wkeY5d6pg)以获取更多技巧和窍门。保重 🙂
```