在 CloudPanel 上安装 Discourse

:warning: 此安装方法未获官方认可。使用风险自负。

Discourse 团队仅推荐使用 官方安装指南 进行安装。

:information_source: 此为不受支持的安装方式,适用于具备 CloudPanel 使用经验、是经验丰富的系统管理员、熟悉 Docker 和反向代理,且已成功完成标准安装的用户。

为什么选择 CloudPanel

为什么您可能想在运行 CloudPanel 的 VPS 或专用服务器上安装 Discourse 论坛?

以下是我的理由:

我更喜欢使用图形界面进行服务器和站点管理。我曾使用过大多数 Web 托管控制面板

与其他面板相比,CloudPanel 非常 精简且极简,界面 整洁有序。它具备我所需的所有功能,呈现方式简单直观。仅此而已。它没有任何我不需要的功能。

除了 Discourse 论坛外,我还开发、托管和管理许多 Ghost 博客、Wordpress 站点、Drupal 站点以及其他类型的站点。我真的只需要一台服务器,可以在上面同时托管我的 Discourse 论坛、Ghost 博客以及 Wordpress 和 Drupal 站点。(我不希望为每个 Discourse 实例单独付费并维护一台服务器。)

CloudPanel 开箱即用,内置 Nginx,并提供简单的界面用于设置和管理反向代理,这是在同一台服务器上运行一个或多个 Discourse 实例或与其他类型网站共存所必需的。

Discourse 团队(以及 Meta 论坛的工作人员)不为 Cpanel、Plesk 或(如本例中的)CloudPanel 等替代服务器环境提供支持,也不支持那些仅通过命令行运行的环境。

因此,我想分享我的设置和流程,以防其他人觉得有用。

[如果有人尝试此方法,请告诉我结果如何,或者我如何能改进本教程!:heart_eyes:]

安装 Docker

在 Putty(或其他终端)中,从根目录运行以下命令:

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
echo "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu focal stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt update
sudo apt-get install docker-ce docker-ce-cli docker-compose containerd.io

在 CloudPanel 中创建反向代理站点

→ 我们点击 + 添加站点 按钮…

对于我的 Discourse 实例,我使用的是域名 noobish.me。因此,从此刻起,如果您在后续说明中看到该域名,请将 noobish.me 替换为您自己的实际域名(例如 yoursite.com)。

→ 我们在 CloudPanel 中为希望托管 Discourse 论坛的域名创建一个新的“反向代理站点”(当然,该域名的 DNS A 记录需要指向与 CloudPanel 相同的 IP 地址)。

准备域名并设置 SSL

对于我的站点,我使用 Cloudflare 的命名服务器来指向该域名。在 Cloudflare 中,我将 SSL 设置为“Full”或“Full (strict)”。

我还创建了一条 Cloudflare 页面规则。请访问 此帖子 了解原因。

我还为我的域名使用了免费的 Cloudflare SSL 源证书,并将其“导入”到 CloudPanel 中该站点的“SSL/TLS”站点设置中(只需将从 Cloudflare 账户下载的证书和私钥粘贴进去即可。)

安装 Discourse

回到 Putty(或其他终端),从根目录(按 c d Enter 返回根目录)→ 使用以下命令安装 Discourse 标准安装

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

Enter

cd /var/discourse

Enter

chmod 700 containers

复制独立配置文件

现在,我们将文件 /var/discourse/standalone.yml 复制到 /var/discourse/containers/ 并命名为 app.yml,以便根据我们的站点设置对其进行编辑。

cp /var/discourse/samples/standalone.yml /var/discourse/containers/app.yml

编辑 app.yml 文件

除了根据我们特定的站点设置修改 app.yml 文件外,在保存之前,我们还需要更改该文件中的 3 项内容

templates: 部分下,我们需要添加:

  - "templates/web.socketed.template.yml"

由于我使用了 Cloudflare,在 templates: 部分下,我还添加了:

  - "templates/cloudflare.template.yml"

expose: 部分下,我们需要注释掉:

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

env: 部分下,我们需要添加:

   DISCOURSE_FORCE_HTTPS: true
供参考,您可以点击此处查看我在 noobish.me 上使用的 `app.yml` 内容,其中同时使用了 Cloudflare 和 Mailgun...
## 这是全合一的独立 Discourse Docker 容器模板
##
## 修改此文件后,您必须重新构建
## /var/discourse/launcher rebuild app
##
## 编辑时请 *非常* 小心!
## YAML 文件对空格或对齐错误极其敏感!
## 如有需要,请访问 http://www.yamllint.com/ 验证此文件

templates:
  - "templates/postgres.template.yml"
  - "templates/redis.template.yml"
  - "templates/web.template.yml"
  - "templates/web.ratelimited.template.yml"
  - "templates/web.socketed.template.yml"
  - "templates/cloudflare.template.yml"

params:
  db_default_text_search_config: "pg_catalog.english"

  ## 将 db_shared_buffers 设置为总内存的最大 25%。
## 将根据检测到的 RAM 自动设置,或者您可以覆盖
  db_shared_buffers: "4096MB"

  ## 可提高排序性能,但会增加每个连接的内存使用量
  #db_work_mem: "40MB"

  ## 此容器应使用哪个 Git 修订版?(默认:tests-passed)
  #version: tests-passed

env:
  LC_ALL: en_US.UTF-8
  LANG: en_US.UTF-8
  LANGUAGE: en_US.UTF-8
  # DISCOURSE_DEFAULT_LOCALE: en

  DISCOURSE_FORCE_HTTPS: true

  ## 支持多少个并发 Web 请求?取决于内存和 CPU 核心数。
  ## 将根据检测到的 CPU 自动设置,或者您可以覆盖
  UNICORN_WORKERS: 8

  ## TODO: 此 Discourse 实例将响应的域名
  ## 必填。Discourse 无法在纯 IP 地址上运行。
  DISCOURSE_HOSTNAME: 'noobish.me'

  ## 如果希望容器以与上述指定的相同主机名(-h 选项)启动,请取消注释
  ## (默认值为 "$hostname-$config")
  #DOCKER_USE_HOSTNAME: true

  ## TODO: 初始注册时将设为管理员和开发人员的逗号分隔邮箱列表
  ## 示例:'user1@example.com,user2@example.com'
  DISCOURSE_DEVELOPER_EMAILS: 'admin@noobish.me'

  ## TODO: 用于验证新账户和发送通知的 SMTP 邮件服务器
  # SMTP 地址、用户名和密码为必填项
  # 警告:SMTP 密码中的字符 '#' 可能会导致问题!
  DISCOURSE_SMTP_ADDRESS: smtp.mailgun.org
  DISCOURSE_SMTP_PORT: 587
  DISCOURSE_SMTP_USER_NAME: postmaster@noobish.me
  DISCOURSE_SMTP_PASSWORD:  pYdRLyQW
  #DISCOURSE_SMTP_ENABLE_START_TLS: true           # (可选,默认为 true)
  #DISCOURSE_SMTP_DOMAIN: noobish.me    # (某些提供商要求)
  DISCOURSE_NOTIFICATION_EMAIL: noreply@noobish.me    # (发送通知的地址)

  ## 此 Discourse 实例的 http 或 https CDN 地址(配置为拉取)
  ## 详见 https://meta.discourse.org/t/14857
  #DISCOURSE_CDN_URL: https://discourse-cdn.example.com

  ## MaxMind 地理位置 IP 地址查找的许可证密钥
  ## 详见 https://meta.discourse.org/t/-/137387/23
  #DISCOURSE_MAXMIND_LICENSE_KEY: 1234567890123456

## Docker 容器是无状态的;所有数据都存储在 /shared 中
volumes:
  - volume:
      host: /var/discourse/shared/standalone
      guest: /shared
  - volume:
      host: /var/discourse/shared/standalone/log/var-log
      guest: /var/log

## 插件放在这里
## 详见 https://meta.discourse.org/t/19157
hooks:
  after_code:
    - exec:
        cd: $home/plugins
        cmd:
          - git clone https://github.com/discourse/docker_manager.git

## 构建后运行的任何自定义命令
run:
  - exec: echo "开始自定义命令"
  ## 如果您想为首次注册设置“发件人”电子邮件地址,请取消注释并更改:
  ## 收到首次注册邮件后,重新注释该行。它只需运行一次。
  #- exec: rails r "SiteSetting.notification_email='info@unconfigured.discourse.org'"
  - exec: echo "自定义命令结束"

然后我们保存并退出 app.yml 文件…

CTRL-X

y

Enter

接下来,我们为 app.yml 文件设置权限…

chmod o-rwx containers/app.yml

然后…

引导应用程序

cd /var/discourse
./launcher bootstrap app

这将花费相当长的时间。在引导过程结束时,您将被要求:

./launcher start app

编辑 Vhost 文件

现在,我们返回 CloudPanel,将以下代码粘贴到 Discourse 站点的“Vhost 编辑器”中(覆盖现有内容)。当然,请将 yoursite.com 替换为您自己的实际域名。

server {
  listen 443 ssl http2;
  listen [::]:443 ssl http2;
  {{ssl_certificate_key}}
  {{ssl_certificate}}
  server_name yoursite.com;
  {{root}}

  {{nginx_access_log}}
  {{nginx_error_log}}

  if ($scheme != "https") {
    rewrite ^ https://$host$uri permanent;
  }

  location ~ /.well-known {
    auth_basic off;
    allow all;
  }

  {{settings}}

  add_header Cache-Control no-transform;

  location / {
                proxy_pass http://unix:/var/discourse/shared/standalone/nginx.http.sock:;
                proxy_set_header Host $http_host;
                proxy_http_version 1.1;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_set_header X-Forwarded-Proto $scheme;
                proxy_set_header X-Real-IP $remote_addr;

  }
}

重启 Nginx

接下来,我们需要重启 Nginx,可以通过点击 CloudPanel 管理区域中的按钮来完成…

恭喜!

现在,在我们的浏览器中,我们可以访问站点的 URL 并运行 Discourse 设置向导…

和平共处

现在,我可以使用一个简洁轻量的管理面板自行托管和管理我的 Discourse 站点,同时托管我的 Ghost、Wordpress、Drupal 和其他类型的站点,未来几乎无需使用终端/命令行。


安装额外的 Discourse 实例…

3 个赞

您应该删除这些步骤,然后创建一个不产生此错误的 app.yml 文件。这会让人感到困惑。

(如果您要替换整个文件,为什么要复制示例?)更好的做法是说明需要从现有示例中更改什么。看起来是 socket 模板和强制 https。

这会导致您有两个 postgres 副本,消耗的内存比单个 postgres 多。虽然可行,但这并非最佳实践。

有许多因素使得这并非一个好的示例,并且将极难获得支持。我很高兴您为自己找到了解决方案,但我认为这不是一个应该引导人们走的正确方向。

3 个赞

感谢 @pfaffman

你说得对。它能完成工作,但过程太混乱了。顺序不对。我感谢你的建议,我会把它修正好。

你能解释一下为什么你这么认为吗?

因为它很复杂,而且只适合那些能够自己弄清楚的人。这很浪费,如果目标只是运行两个讨论区,在大多数情况下,两个独立的虚拟机是更便宜、更简单的解决方案。

2 个赞

再次感谢 @pfaffman——我现在已经简化了该过程,并删除了关于在同一服务器上添加第二个 Discourse 站点的部分。

1 个赞

我收到了这个消息

sudo apt update
sudo apt-get install docker-ce docker-ce-cli docker-compose containerd.io
usage: gpg [options] --dearmor [file]
curl: (23) Failed writing body

为什么?

安东尼奥,你好。欢迎。

这似乎是 Docker 的问题,而不是 Discourse 的问题。你最好搜索你的操作系统并更新 docker-ce,而不是在这里提问。

你是在尝试使用 Discourse 还是 CloudPanel?

1 个赞

我刚按照这里的指南操作。我运行了第一个命令,用于 Docker 安装,服务器响应如下:
命令是:

1 个赞

每行末尾不应有反斜杠。反斜杠会转义换行符,这意味着 shell 会将下一行视为同一行的延续。

在这种情况下,这将导致尝试将此作为单个命令运行,这就是错误来源:
sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg echo \"deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu focal stable\"

只需删除行末尾的反斜杠即可解决此问题:

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
echo \"deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu focal stable\" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt update
sudo apt-get install docker-ce docker-ce-cli docker-compose containerd.io
2 个赞

谢谢,现在运行正常

2 个赞

谢谢 @Simon_Manning – 我已移除置顶帖子教程中的代码片段中的反斜杠。

2 个赞

抱歉,我现在遇到这个错误: FAILED

Pups::ExecError: /usr/local/bin/ruby -e 'if ENV["DISCOURSE_SMTP_ADDRESS"] == "smtp.example.com"; puts "Aborting! Mail is not configured!"; exit 1; end' failed with return #<Process::Status: pid 112 exit 1>
Location of failure: /usr/local/lib/ruby/gems/3.2.0/gems/pups-1.1.1/lib/pups/exec_command.rb:117:in `spawn'
exec failed with the params "/usr/local/bin/ruby -e 'if ENV[\"DISCOURSE_SMTP_ADDRESS\"] == \"smtp.example.com\"; puts \"Aborting! Mail is not configured!\"; exit 1; end'"
bootstrap failed with exit code 1
** FAILED TO BOOTSTRAP ** please scroll up and look for earlier error messages, there may be more than one.
./discourse-doctor may help diagnose the problem.
214c73c4474ed59e7b6fb7f42143ce126d2b453022b08770da3af31ca2fdaaba

我不了解 CloudPanel,但错误消息似乎不言自明:

'if ENV["DISCOURSE_SMTP_ADDRESS"] == "smtp.example.com"; puts "Aborting! Mail is not configured!"; exit 1; end'
'if ENV[\"DISCOURSE_SMTP_ADDRESS\"] == \"smtp.example.com\"; puts \"Aborting! Mail is not configured!\"; exit 1; end'\"

看起来您的电子邮件在 ./discourse-setup 期间或在 app.yml 中未配置(您可以随时手动编辑它)。 :thinking:

2 个赞

各位老师,你们好!我是费米高中的一名教授,正在为我们学校安装 Discourse 社区。由于我们使用云面板,我遵循了本指南,但显然有些东西遗漏了。是否可以获得帮助和更详细的指南?非常感谢!

1 个赞

如果您没有多少系统管理知识,我认为使用高级安装可能不是您想要的。另一个需要考虑的重要问题是,此类安装将属于 unsupported-install,如果您遇到问题,在此处获得帮助的可能性会降低。

如果您有预算,并且取决于您的社区规模,最好在另一台服务器上托管 Discourse 并遵循标准安装。

1 个赞

抱歉,像这样的服务有什么用?在我看来,也许指南不够详细,它是为系统管理员准备的,只需指出各个步骤就足够了。在我们那里有句话说:没有人天生就受过教育。感谢您的帮助和您的时间。

1 个赞

你说得对。这就是为什么推荐标准安装。

而且,@denvergeeks,这就是为什么我一开始就不认为创建这样的指南是个好主意。它很难编写,很难维护,而且只有你能检查它。

4 个赞

抱歉,我不同意。我已经在使用带有各种域名的Cloud Panel,此外,Discourse社区将放在一个子域上,那么作者的前提就非常清楚了(本指南适用于在VPS上安装了各种服务的Cloud Panel用户)。只需要稍微努力一下,就可以更好地详细说明一切。毕竟,知识共享是社区的基础,否则我就会购买已经安装并准备好使用的软件了。总之,我不想打扰任何人,如果可能的话,请提供帮助,谢谢,否则我将不再打扰您。

1 个赞

@denvergeeks 设置电子邮件对于正常运行至关重要,尽管有一个指向标准安装的链接,但该指南目前的写法绕过了电子邮件的设置以及可能对某些设置重要的其他杂项信息。

我想知道是否值得将“安装 Discourse”到“引导应用程序”部分替换为更类似以下内容的内容:

安装和配置 Discourse

按照 标准安装 的第 1-6 步进行操作

<在“编辑 app.yml 文件”中执行当前操作>

重新构建 Discourse:

./launcher rebuild app

然后在“恭喜!”部分,在屏幕截图后添加一行,说明“继续完成标准的其余安装文档。”本质上是重新构建指南,提供补充标准安装的额外步骤,而不是提供替代的安装说明。

我认为您提供的关于 CloudPanel 的信息非常有价值,并且说明很清晰,Discourse 部分可以减少与标准安装的偏差,使其更安全,并使用 unsupported-install 标签来明确(更清晰)此处有风险。

2 个赞

[quote=“Antonio Cirillo, post:18, topic:266422, username:Antonio_Cirillo”]
毕竟,知识共享是社区的基础,否则我早就买了现成的软件了。总之,我不想打扰任何人,如果能得到帮助,我将不胜感激,否则我将不再打扰。
[/quote]讨论有点偏离了最初的话题,但请放心,我们很乐意提供帮助。 :slight_smile:

总结一下:

如果您具备基本的 IT 知识,可以按照标准安装流程进行。您还需要一个域名,并配置一个电子邮件发送服务,例如 Mailgun(教程链接:Configure Mailgun for email when using Digital Ocean for DNS

请注意,我们通常不会帮助处理超出本论坛范围的事宜。例如,“如何注册域名?”这个问题就不适合在这里讨论。

如果您不具备基本的 IT 知识,并且取决于您的预算,您可以在 Marketplace 上寻求付费支持。

最后,您还可以查看 Discourse 的托管付费计划,其中几乎所有内容都将由我们处理,您还可以获得我们的团队支持。

另外,请注意,鉴于您提到这是为您的学校服务的,我们为教育目的提供折扣:

是否有教育或非营利组织折扣?

是的!如果您被合法认定为教育机构,我们提供 85% 的折扣。如果您被合法认定为免税的非营利组织,我们提供 50% 的折扣。这些折扣仅适用于我们的基础版、专业版和商业版计划,不能与其他折扣合并使用,并且必须通过借记卡/信用卡按月或按年支付。请在开始试用后联系我们,我们将为您添加折扣。

4 个赞