此安装方法未获官方认可。使用风险自负。
Discourse 团队仅推荐使用 官方安装指南 进行安装。
此为不受支持的安装方式,适用于具备 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 等替代服务器环境提供支持,也不支持那些仅通过命令行运行的环境。
因此,我想分享我的设置和流程,以防其他人觉得有用。
[如果有人尝试此方法,请告诉我结果如何,或者我如何能改进本教程!
]
安装 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 实例…








