30 分钟内在云上部署 Discourse


(Erick Guan) #1

原文为 GitHub 上的 How Do I Install Discourse?(有改动),翻译于:2014-10-10

使用我们的 Discourse Docker 镜像在不需要了解任何 Ruby、Rails 或 Linux shell 的情况下 在 30 分钟内在云服务器上部署 Discourse。如果想要在境外部署,我们更喜欢Digital Ocean。当然这些步骤应该在别的支持 Docker 的云服务商那也应该是一样的。让我们开始吧!

创建新的 Digital Ocean Droplet

注册 Digital Ocean 账户,更新付款信息,然后创建您的新云服务器(Droplet)。

  • 输入您的域名 discourse.example.com 将其作为 Droplet 的名字。

  • 默认的 1GB RAM 对小社群是足够的。我们推荐中等大小的社群使用 2GB 内存。

  • 默认的 Ubuntu 14.04 LTS x64 没有问题。总是选用最新的 64位的长期支持(LTS)发行版

创建您的新 Droplet。您将收到一封来自 Digital Ocean 的邮件,包含了您服务器的 root 账户的密码。(不过,如果您知道如何使用 SSH keys,您可能不需要密码就可以登录了。)

访问您的 Droplet

通过 SSH 连接至您的 Droplet,或在 Windows 上使用 Putty

ssh root@192.168.1.1

用您 Droplet 的 IP 地址替换 192.168.1.1

您会被问到是否同意连接,输入yes,然后再输入您从 Digital Ocean 邮件中收到的 root 账户的密码。您也可能被提示更改 root 账户的密码。

设置 Swap(如果需要)

  • 如果您在使用最小的 1GB 内存安装,您必须设置 swap 文件

  • 如果您的服务器有 2GB+ 的内存,您可能不需要设置 swap 文件。

安装 Docker / Git

wget -qO- https://get.docker.io/ | sh

安装 Discourse

创建 /var/discourse 文件夹,克隆官方 Discourse Docker 镜像至其中,然后在拷贝一个配置文件,并命名为 app.yml

mkdir /var/discourse
git clone https://github.com/discourse/discourse_docker.git /var/discourse
cd /var/discourse
cp samples/standalone.yml containers/app.yml

编辑 Discourse 配置文件

配置文件是 YAML 格式,请不要删除配置项“:”前的内容。

app.yml 中编辑 Discourse 配置:

nano containers/app.yml

我们建议使用 Nano 是因为它是一个经典的图形文本编辑器,只使用了方向键。

  • params 中的 version 前的注释符号 # 去掉,然后设置其为最稳定的 stable(正式版)。其他还有两个分支可以选择,分别是 beta(测试版) 和 tests-passed(预览版)。beta 更新比 stable 快,如果想帮助反馈问题和试用新特性,可以较为安全的使用。tests-passed 和主线开发版本非常近,但不稳定。

  • env 中增加 DISCOURSE_DEFAULT_LOCALE,并设为您想用的语言,比如简体中文 zh_CN。Discourse 初始化时会自动创建一些分类和主题,这样可以初始化成简体中文。如果在此设置了语言,在站点设置中将无法修改站点语言,但是你总是可以在配置文件中更改语言并重建容器。

  • 如果是在墙内部署,添加 web.china.template.yml 模板,具体方法见:在大陆地区的云上部署 Discourse

  • DISCOURSE_DEVELOPER_EMAILS 改为您的邮件地址。

  • DISCOURSE_HOSTNAME 设置为 discourse.example.com,意思是您想要您的 Discourse 可以通过 http://discourse.example.com/ 访问。您需要更新您的 DNS 的 A 记录,使其指向您服务器的 IP 地址。

  • 将您邮件发送的验证信息填在 DISCOURSE_SMTP_ADDRESSDISCOURSE_SMTP_PORTDISCOURSE_SMTP_USER_NAMEDISCOURSE_SMTP_PASSWORD。如果需要的话请确定删掉了这几行前面的多余空格和 # 字符。

  • 如果您在使用 1 GB 的服务器,将 UNICORN_WORKERS 设为 2,db_shared_buffers设为 128MB,以节省内存。

完成这些编辑后,按下CtrlO之后再按Enter保存,再按CtrlX退出。

电子邮件及其重要

Discourse 需要在账户创建和通知时发送电子邮件给用户。如果您没有在初始化前配置好电子邮件设置,您的站点没法正常工作!

  • 已经有邮件服务器了?很好,使用那个邮件服务器的验证信息。

  • 没有邮件服务器,或您根本不知道这是什么?没问题,在 Mailgun(或 Mailjet)注册一个免费账户,然后使用他们仪表盘里提供的验证信息。

  • 要保证邮件成功投递,您必须设置正确的 DNS 记录SPF 和 DKIM 记录。在 Mandrill 中,验证信息在 Sending Domains、View DKIM/SPF 安装指引下。

初始化 Discourse

保存好 app.yml 文件,然后开始初始化 Discourse:

./launcher bootstrap app

运行这个命令大致要 8 分钟。它自动配置好您的 Discourse 环境。

运行完成后,启动 Discourse:

./launcher start app

恭喜!您的 Discourse 可以使用了!

假设您配置好了 DNS 记录且也已生效,您就可以通过您前面输入的域名 discourse.example.com 访问了。如果不行,您可以直接通过服务器 IP 访问,例如 http://192.168.1.1

注册新账户并成为管理员

请想想上面填写的DISCOURSE_DEVELOPER_EMAILS;通过填写的邮件地址中的任意一个注册新账户,之后您的账户将自动变成管理员。

(如果您没有收到任何邮件,并且您注册不了管理员账户,请看我们的电子邮件配置除错检查清单。)

您应该可以看到职员主题和管理员操作指南(这里有一份中文版)。它包含了进一步配置和自定义您 Discourse 安装的指南。

(如果您仍不能通过邮件注册成为管理员,参见通过命令行创建管理员账户,但是请注意如果没有配置好邮件设置,您的站点仍不能正常运行。)

安装后维护

我们强烈建议您打开 Ubuntu 的自动安全更新功能:

dpkg-reconfigure -plow unattended-upgrades

升级 Discourse 至最新版,访问 /admin/upgrade 并按照指示操作。

/var/discourse 下的 launcher命令可以完成几种维护操作:

Usage: launcher COMMAND CONFIG [--skip-prereqs]
Commands:
    start:      启动/初始化容器
    stop:       关闭运行中的容器
    restart:    重启容器
    destroy:    关闭并删除容器
    enter:      使用 nsenter 进入容器
    ssh:        在运行中的容器中启动 bash shell
    logs:       容器的 Docker 日志
    mailtest:   测试容器中的邮件配置
    bootstrap:  基于配置文件预设模板初始化容器
    rebuild:    重建一个容器(删除老容器,初始化,启动新容器)

使用更多 Discourse 特性

您想要…


如何安装 Discourse?
Discourse建站新手来求助
有人在腾讯云上部署过么?
在大陆地区的云上部署 Discourse
Ramnode KVM 512M 安装成功 Discourse :)
30分钟,同一台ubuntu服务器下 安装discourse和wordpress站点 并配置ssl和nginx 要求客服开通25端口
Discourse 中文无法搜索问题
./launcher bootstrap app一直等待,新手求指教
在阿里云上安装 Docker
在同一服务器上部署 Wordpress 和 Discourse 不成功
(Erick Guan) 于置顶 #2

#3

为什么我无法创建呢,Unable to find image ‘samsaffron/discourse:1.0.12’ locally
Repository samsaffron/discourse already being pulled by another client. Waiting.
提示


#4

@fantasticfears 请求帮助


(Erick Guan) #5

你似乎同时运行了两个 launcher,这个过程比较慢,严重依赖网络条件。总共要下载1.5G左右的内容。

你可以重启服务器后再尝试或者重启 Docker。


#7

感谢您,现在我重启后重新部署又好了;

但是遇到新的问题,我按照:在大陆地区的云上部署 Discourse,这个方式部署了阿里云企业邮箱作为邮件服务器,但是无论如何都无法收到邮件,怎么办呢~~


#8

DISCOURSE_SMTP_ settings:
DISCOURSE_SMTP_ADDRESS = smtp.mxhichina.com
DISCOURSE_SMTP_PORT = 587
DISCOURSE_SMTP_PASSWORD = (hidden)
DISCOURSE_SMTP_USER_NAME = dmaster@rhinel.xyz

unable to establish TLS, continuing: STARTTLS extension not supported by server.
ERROR: nobody+launcher-mailtest@discourse.org
Traceback (most recent call last):
File “/var/discourse/scripts/mailtest”, line 143, in
result = smtp.sendmail(‘nobody+launcher-mailtest@discourse.org’, destemail, msg.as_string())
File “/usr/lib/python3.4/smtplib.py”, line 766, in sendmail
raise SMTPSenderRefused(code, resp, from_addr)
smtplib.SMTPSenderRefused: (440, b"mail from account doesn’t conform with authentication (Auth Account:dmaster@rhinel.xyz|Mail Account:nobody+launcher-mailtest@discourse.org)", ‘nobody+launcher-mailtest@discourse.org’)

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
File “/var/discourse/scripts/mailtest”, line 172, in
if ‘SMTP AUTH extension not supported by server’ in e.args[0]:
TypeError: argument of type ‘int’ is not iterable

这是提示信息


(Erick Guan) #9

#10

感谢您的回答,我按照这样设置了

DISCOURSE_SMTP_ settings:
DISCOURSE_SMTP_AUTHENTICATION = login
DISCOURSE_SMTP_ADDRESS = smtp.mxhichina.com
DISCOURSE_SMTP_PORT = 587
DISCOURSE_SMTP_OPENSSL_VERIFY_MODE = none
DISCOURSE_SMTP_ENABLE_START_TLS = True
DISCOURSE_SMTP_PASSWORD = (hidden)
DISCOURSE_SMTP_USER_NAME = dmaster@rhinel.xyz

ERROR: STARTTLS extension not supported by server.

另外这步怎么执行?我的收到是一堆命令提示,抱歉我很小白
此外需要在 bootstrap 后用 ./launcher enter app 进入容器内执行:

rails console
SiteSetting.notification_email = ‘你的发件邮箱地址’


(Erick Guan) #11
  1. 进入 /var/discourse/。
  2. ./launcher enter app
  3. 接着进行上述操作。

#12

进行到第二步提示:

root@iZ94l1f7rmgZ:/var/discourse# ./launcher enter app
Error: Command not found: exec
Error: Command not found: -it
Usage: docker [OPTIONS] COMMAND [arg…]
-H=[unix:///var/run/docker.sock]: tcp://host:port to bind/connect to or unix://path/to/socket to use

A self-sufficient runtime for linux containers.

Commands:
attach Attach to a running container
build Build an image from a Dockerfile
commit Create a new image from a container’s changes
cp Copy files/folders from a container’s filesystem to the host path
diff Inspect changes on a container’s filesystem
events Get real time events from the server
export Stream the contents of a container as a tar archive
history Show the history of an image
images List images
import Create a new filesystem image from the contents of a tarball
info Display system-wide information
inspect Return low-level information on a container
kill Kill a running container
load Load an image from a tar archive
login Register or log in to a Docker registry server
logout Log out from a Docker registry server
logs Fetch the logs of a container
port Lookup the public-facing port that is NAT-ed to PRIVATE_PORT
pause Pause all processes within a container
ps List containers
pull Pull an image or a repository from a Docker registry server
push Push an image or a repository to a Docker registry server
restart Restart a running container
rm Remove one or more containers
rmi Remove one or more images
run Run a command in a new container
save Save an image to a tar archive
search Search for an image on the Docker Hub
start Start a stopped container
stop Stop a running container
tag Tag an image into a repository
top Lookup the running processes of a container
unpause Unpause a paused container
version Show the Docker version information
wait Block until a container stops, then print its exit code


(Erick Guan) #13

你的 discourse_docker 不是最新的?

可以用 git pull origin master 更新一下。


#14

运行后提示:

root@iZ94l1f7rmgZ:/var/discourse# git pull origin master
From https://github.com/discourse/discourse_docker

  • branch master -> FETCH_HEAD
    Already up-to-date.

非常抱歉,我真是一点基础都没有。


(Erick Guan) #15

你的 Docker 版本需要更新。如果你用的是 Ubuntu:

apt-get update
apt-get dist-upgrade
apt-get upgrade lxc-docker

如果是其他版本或者环境不同,你就需要按照 Docker 官方的文档:
https://docs.docker.com/installation/#installation


#16

版本更新后问题依旧……没有改观……


(Erick Guan) #17

运行 docker version 的报告是什么?


(jamie) #18

root@iZ11w5mcwhoZ:/var/discourse# ./launcher enter app
root@iZ11w5mcwhoZ-app:/# rails console
[1] pry(main)> SiteSetting.notification_email = ‘xxx@xxx.com’
=> "xxx@xxx.com"
[2] pry(main)>

你好,新手求教,最后设置notification_email时出现这种情况,还是不能发送邮件,请问怎么解决


(Erick Guan) #19

你用了什么邮件服务?又是什么设置?


(jamie) #20

我用的sendcloud,昨晚进app开了管理员帐号,但邮件还是不能发,应该是邮箱账号密码设置错误。但我不知道sendcloud究竟怎么设置,请问你知道吗。不行今晚回去换其他邮箱


(Erick Guan) #21

建议你直接询问 SendCloud 的服务支持,询问 SMTP 服务器地址、端口、配置和账户密码。