如何在生产环境搭建自己的Discourse论坛

送给宁愿违背我们的服务条款的人

自总结版Discourse安装教程

准备工作

安装Discourse前,你需要准备以下东西:

  1. 一台至少4GB RAM的服务器。我们以Debian作为示例,Discourse在所有论坛软件中比较庞大,低于这个值,你可能无法正常安装。

  2. 一个域名(可选)没有域名的话,别人将只能通过IP地址访问你的论坛.

  3. 一个SMTP发件服务。它可以是收费的,也可以是免费的(比如Sendinblue),甚至可以是自建的。

最简单的开始安装教程

登录你的服务器,执行以下操作(如果失败,使用root身份)

$ sudo apt install docker.io
$ git clone https://github.com/discourse/discourse_docker ~
$ cd ~/discourse_docker
$ ./discourse_setup

或者,你也可以自己配置app.yml

$ sudo apt install docker.io
$ git clone https://github.com/discourse/discourse_docker ~
$ cd ~/discourse_docker
$ cp samples/standalone.yml containers/app.yml
$ vim containers/app.yml

然后一行行看,配置好app.yml

之后执行:

$ ./launcher bootstrap app

如果第一次安装时出错,尝试:

  1. 直接删库重建
sudo rm -rf /var/discourse
./launcher bootstrap app
  1. 在app.yml中把版本从test-passed改成beta或者stable,然后再删库重建

详细说明

安装Docker

Discourse唯一的推荐安装方法是通过Docker。因此,我们首先安装docker:

sudo apt install docker.io

把discourse docker库克隆到本地

Discourse docker库包含了discourse开发的一键式安装脚本launcher。所以我们先用

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

把discourse docker库克隆到你的用户目录(事实上哪里都没啥关系)

然后

cd ~/discourse_docker

进入你克隆下来的目录。

目录下有好几个脚本,简单解释一下几个关键的东西:

  • containers/ 目录: 存放你的Discourse容器配置文件。
  • samples 目录: 存放Discourse为你提供的配置文件模板。
  • launcher 文件: 一个脚本,用来根据你 containers 目录下的配置文件构建和维护Docker容器。

app.yml (从standalone.yml模板复制而来)详细解释

(也就是翻译了一下各个注释)

## 这是一键式的, standalone Discourse Docker container 模板
##
## 修改此文件后,你需要执行 launcher rebuild app
## 例如 /var/discourse/launcher rebuild app
##
## 编辑的时候请非常小心
## 空格必须遵守 YAML 规范
## 参考 http://www.yamllint.com/ to validate this file as needed

templates:
  - "templates/postgres.template.yml"
  - "templates/redis.template.yml"
  - "templates/web.template.yml"
  ## 如果需要IPv6支持,把下面这行取消注释掉
  #- "templates/web.ipv6.template.yml"
  - "templates/web.ratelimited.template.yml"
  ## 如果你希望添加 Lets Encrypt 支持(免费https),把下面两行取消注释
  #- "templates/web.ssl.template.yml"
  #- "templates/web.letsencrypt.ssl.template.yml"

## Discourse使用的 TCP/IP 端口
## 前面是主机端口,后面是docker container里面的端口
## 如果你想让Discourse使用非默认端口,详见
## https://meta.discourse.org/t/17247 
expose:
  - "80:80"   # http
  - "443:443" # https

params:
  db_default_text_search_config: "pg_catalog.english"

  ## 取消注释下面这行,覆盖默认 db_shared_buffers 设置(最多设置到 25% 总计内存).
  ## 默认自动检测你的主机内存,决定一个合理的值,但是你可以覆盖
  #db_shared_buffers: "256MB"

  ## 可以提升搜索时的性能,代价是更高的内存使用
  #db_work_mem: "40MB"

  ## 你的Discourse使用哪个版本? (默认: tests-passed)(你一般还可以选beta和stable)
  #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使用的默认语言。但是你完全可以不用动它,反正可以在前端的管理员面板修改。

  ## 支持多少个同时的web请求?(由你的内存和CPU核心数决定)
  ## 你可以自行决定一个值,默认为根据CPU核心数自动检测
  #UNICORN_WORKERS: 3

  ## 你必须更改的:你的discourse使用的域名
  ## 不更改就不能用。Discourse不能在裸IP上工作(注:其实可以)
  DISCOURSE_HOSTNAME: 'discourse.example.com'

  ## Uncomment if you want the container to be started with the same
  ## hostname (-h option) as specified above (default "$hostname-$config")
  #DOCKER_USE_HOSTNAME: true

  ## 你需要更改的:用逗号分隔的论坛开发人员邮箱名单。这些人作为第一个用户注册时会被授予管理员权限,还会有开发者模式。
  ## 例如 '[email protected],[email protected]'
  DISCOURSE_DEVELOPER_EMAILS: '[email protected],[email protected]'

  ## 你必须更改的: SMTP邮件服务器配置
  # SMTP 服务器地址、用户名、密码是必须的
  # SMTP 密码中如果有 '#' 号,你得拿字符串括起来
  DISCOURSE_SMTP_ADDRESS: smtp.example.com
  #DISCOURSE_SMTP_PORT: 587
  DISCOURSE_SMTP_USER_NAME: [email protected]
  DISCOURSE_SMTP_PASSWORD: pa$$word
  #DISCOURSE_SMTP_ENABLE_START_TLS: true           # (可选,默认 true)
  #DISCOURSE_SMTP_DOMAIN: discourse.example.com    # (有的提供商要求)
  #DISCOURSE_NOTIFICATION_EMAIL: [email protected]    # (发件人默认地址)

  ## 如果你启用了 Lets Encrypt,取消注释下面这行,获取免费SSL证书
  #LETSENCRYPT_ACCOUNT_EMAIL: [email protected]

  ## 此Discourse实例的CDN
  ## see https://meta.discourse.org/t/14857 for details
  #DISCOURSE_CDN_URL: https://discourse-cdn.example.com
  
  ## The maxmind geolocation IP address key for IP address lookup
  ## see https://meta.discourse.org/t/-/137387/23 for details
  #DISCOURSE_MAXMIND_LICENSE_KEY: 1234567890123456

## The Docker container is stateless; all data is stored in /shared
volumes:
  - volume:
      host: /var/discourse/shared/standalone
      guest: /shared
  - volume:
      host: /var/discourse/shared/standalone/log/var-log
      guest: /var/log

## 插件在这里加入
## see https://meta.discourse.org/t/19157 for details
hooks:
  after_code:
    - exec:
        cd: $home/plugins
        cmd:
          - git clone https://github.com/discourse/docker_manager.git

## 在这里加入自定义命令
run:
  - exec: echo "Beginning of custom commands"
  ## If you want to set the 'From' email address for your first registration, uncomment and change:
  ## After getting the first signup email, re-comment the line. It only needs to run once.
  #- exec: rails r "SiteSetting.notification_email='[email protected]'"
  - exec: echo "End of custom commands"

常见错误解决

gnu_handshake() timeout

请开梯子。

relation 'user' does not exist

玄学错误,请删库跑路重建。(把你的 /var/discourse 目录删掉,然后再rebuild)
如果解决不了,试一下把分支改到stable.


附带对Discourse官方文档的翻译:


Discourse 官方安装教程

在 30 分钟内在云中搭建 Discourse,哪怕您对 Rails 或 Linux shell 零了解。本例子使用的是 DigitalOcean,但这些步骤适用于任何与 Docker 兼容的云提供商或本地服务器。这 演练将详细介绍这些内容:

:bell:没有 30 分钟的时间来设置?只需支付 150 美元的一次性固定费用,社区就可以为您在云中安装 Discourse。单击此处购买自助社区安装你也可以选择给锦心打钱,我只收你75美元,半价哦

开始之前

1. 准备域名

:bell:话语无法很好的在IP地址工作[1],您必须拥有域名才能继续。域名指的是类似example.com的东西。

  • 已经拥有域名?好耶!为您的话语实例选择一个子域名,例如 discourse.example.com 或者 forum.example.com
  • 没有域名?买一个!我们可以推荐NameCheap,或者还有许多其他很棒的域名注册商可供选择。
  • 您的 DNS 设置面板应该可以从您购买域名的位置访问。一旦您知道要安装Discourse的云服务器的IP地址,您将在此处为主机名创建DNS A记录,并为电子邮件输入SPF和DKIM记录

2. 设置电子邮件

:warning: 电子邮件对于 Discourse 中的帐户创建和通知至关重要。 如果您在引导前未正确配置电子邮件,您将拥有一个损坏的网站!

:bulb:这里的电子邮件是指交易电子邮件,而不是通常的电子邮件服务,如Gmail,Outlook和/或Yahoo。

  • 没有现有的邮件服务器?查看我们推荐的话语电子邮件提供商
  • 已有邮件服务器?伟大。使用现有的邮件服务器凭据。(Gmail/Outlook/Yahoo等免费电子邮件服务不支持交易性电子邮件。
  • 为确保邮件送达,您必须在 DNS 中添加有效的 SPF 和 DKIM 记录。有关详情,请参阅您的邮件提供商说明。
  • 如果您在使电子邮件正常工作时遇到问题,请按照我们的电子邮件问题排查指南

安装

3. 创建新的云服务器

创建您的新云服务器,比如在DigitalOcean上

  • 当前支持的 Ubuntu Server LTS 版本 默认值就够了。最低值?一个现代内核版本的 64 位 Linux 操作系统。
  • RAM 默认的 1 GB RAM 适用于小型话语社区。我们建议为较大的社区使用 2 GB RAM。[2]
  • 地理位置 对于大多数美国和欧洲观众来说,默认的纽约是一个不错的选择。或者选择地理位置更靠近受众群体的区域。
  • 输入您的域名(比如discourse.example.com)作为 Droplet 名称。

创建 Droplet 。您可能会收到一封包含 root 密码的电子邮件,但是,您应该设置 SSH 密钥,因为它们更安全。

:warning:现在您已经创建了云服务器!返回到 DNS 控件并使用 IP 地址为您的主机名discourse.example.com 设置 A record

4. 访问您的云服务器

使用SSH或Windows上的Putty通过其IP地址连接到您的服务器:

ssh [email protected]

使用设置服务器时 DigitalOcean 发送给您的电子邮件中的 root 密码,或者在本地计算机上配置有效的 SSH 密钥。

5. 安装话语

官方话语 Docker 映像克隆到 ./var/discourse

sudo -s
git clone https://github.com/discourse/discourse_docker.git /var/discourse
cd /var/discourse
chmod 700 containers

您需要在其余的设置和引导过程中成为 root 用户。

6. 编辑话语配置

在 启动设置工具

./discourse-setup

出现提示时,请回答以下问题:

Hostname for your Discourse? [discourse.example.com]: 
Email address for admin account(s)? [[email protected],[email protected]]: 
SMTP server address? [smtp.example.com]: 
SMTP port? [587]: 
SMTP user name? [[email protected]]: 
SMTP password? [pa$word]: 
Let's Encrypt account email? (ENTER to skip) [[email protected]]: 
Optional Maxmind License key () [xxxxxxxxxxxxxxxx]:

您将从电子邮件设置中获取SMTP详细信息,请务必完成该部分。

Let’s Encrypt 帐户设置是为了为您的站点提供免费的HTTPS证书,如果您希望您的网站安全,请务必进行设置。

这将代表您生成一个 app.yml 配置文件,然后启动引导程序。引导需要 2-8 分钟来设置您的话语。如果需要在引导后更改这些设置,可以再次运行./discourse-setup(它将重用文件中以前的值)或使用 vim 然后手动编辑 /containers/app.yml, 记得 ./launcher rebuild app 否则更改将不会生效。

7. 开始Discourse

引导完成后,您的Discourse应该可以通过您之前输入的域名在您的网络浏览器中访问。discourse.example.com

8. 注册新帐户并成为管理员

使用您在引导前输入的电子邮件地址之一注册新的管理员帐户。

(如果您无法注册管理员帐户,请查看日志并查看我们的电子邮件故障排除清单/var/discourse/shared/standalone/log/rails/production.log

注册管理员帐户后,设置向导将启动并指导您完成话语的基本配置。

完成设置向导后,应会看到员工主题和先阅读我:管理员快速入门指南。本指南包含有关进一步配置和自定义 Discourse 安装的建议。

9. 安装后维护

  • 我们强烈建议您为操作系统启用自动安全更新。在 Ubuntu 中,请使用该命令。在 CentOS/RHEL 中,使用 yum-cron 包。dpkg-reconfigure -plow unattended-upgrades
  • 如果您使用的是密码而不是 SSH 密钥,请务必强制使用强根密码。在 Ubuntu 中使用软件包。我们还建议阻止尝试 10 次以上密码重试的任何 IP 地址 3 分钟。apt install libpam-cracklib fail2ban
    • Ubuntuapt install fail2ban
    • CentOS/RHEL:sudo dnf install fail2ban
  • 如果你需要或想要一个默认的防火墙,请为 Ubuntu 打开 ufw 或用于 CentOS/RHEL。firewalld

:bulb:当新版本的话语发布时,Discourse 会向您发送电子邮件通知。请保持最新状态以获取最新功能和安全修复程序。

要将 Discourse 升级到最新版本,请访问浏览器并单击“升级”按钮。https://discourse.example.com/admin/upgrade

或者,您可以使用 ssh 连接到服务器并使用以下方法进行重建:

cd /var/discourse
git pull
./launcher rebuild app

文件夹中的命令可用于各种维护:launcher /var/discourse

Usage: launcher COMMAND CONFIG [--skip-prereqs] [--docker-args STRING]
Commands:
    start:      Start/initialize a container
    stop:       Stop a running container
    restart:    Restart a container
    destroy:    Stop and remove a container
    enter:      Use nsenter to get a shell into a container
    logs:       View the Docker logs for a container
    bootstrap:  Bootstrap a container for the config based on a template
    rebuild:    Rebuild a container (destroy old, bootstrap, start new)
    cleanup:    Remove all containers that have stopped for > 24 hours

Options:
    --skip-prereqs             Don't check launcher prerequisites
    --docker-args              Extra arguments to pass when running docker

10. (可选)添加更多话语功能

你想要吗。。。


  1. 锦心注:实际上可以,但是不能https ↩︎

  2. 锦心注:多少有点过时,你还是选择4GB最稳妥 ↩︎

6 Likes

建议写进服务条款(

1 Like

deb系的教程
虽然对于非deb系只需要改一下安装docker那步?

1 Like

(草(