在大陆地区的云上部署 Discourse


(Erick Guan) #1

请对照阅读以下指南,这个主题将指出一些需要特别注意的地方。

如果您使用

以下是需要注意的区别:

配置 Docker 镜像

Discourse 用 Docker 镜像来配置最基础的工具,等于是下载一个小系统。

Docker 镜像的服务器在国外,下载速度比较慢且容易失败。你可以考虑配置使用镜像。
在安装完成 Docker 后,开始编辑配置文件前,可以考虑配置镜像来提高下载速度。但是国内没有权威的官方源,这里给出了 USTC 大学提供的 Docker 源。你可以用你能找到且稳定使用的任意源。比如灵雀云注册后的“免费加速器”大概也能用。

这些源我只能说:不保证稳定性、不保证安全性、不保证具体速度

对于 Ubuntu 用户,可以在 /etc/default/docker 内修改参数(更多配置可以参考 Docker 官方网站的文档)为:

DOCKER_OPTS="--registry-mirror=https://docker.mirrors.ustc.edu.cn"

重启 Docker 服务:service docker restart

编辑 Discourse 配置文件解决网络问题

因为 rubygems.org 被墙,所以要使用镜像或者代理。所以需要使用淘宝的镜像让 gembundle 运行时不撞墙,但是这无法解决访问 GitHub 的时候 DNS 失败的问题。如果你有稳定的代理,代理优于镜像。以下两种方法 2 选 1:

增加模板用 Ruby China 镜像

这个镜像由 Ruby China 社群共享,放在腾讯云上。
打开配置文件,例如 app.yml

添加语句包含 web.china.template.yml 模板:

templates:
  - "templates/postgres.template.yml"
  - "templates/redis.template.yml"
  - "templates/sshd.template.yml"
  - "templates/web.template.yml"
  - "templates/web.china.template.yml"

使用代理

VPN 的配置难度较高,你需要自己解决配置问题。 HTTP 代理相对简单,当然你需要有这样一个代理服务器,详见:

初始化容器

重建容器:

./launcher rebuild app

或初始化:

./launcher bootstrap app

搞定!以后就不会再有网络问题了。

配置邮件

@fy1128 指出在阿里云部署时,配置邮件要增加:

DISCOURSE_SMTP_AUTHENTICATION: login
DISCOURSE_SMTP_OPENSSL_VERIFY_MODE: none
DISCOURSE_SMTP_ENABLE_START_TLS: true

此外在配置文件最后的 run: 那一块中找到:

run:
  - exec: echo "Beginning of custom commands"

  ## If you want to set the 'From' email address for your first registration, uncomment and change:
  #- exec: rails r "SiteSetting.notification_email='info@unconfigured.discourse.org'"
  ## After getting the first signup email, re-comment the line. It only needs to run once. 

删除掉
#- exec: rails r "SiteSetting.notification_email='info@unconfigured.discourse.org'"
这一行开头的 # 井号,再把 info@unconfigured.discourse.org 改成你的发件邮箱地址。
编辑文件的时候不要删除每一行前的空格符,保持语句块上下是对齐的,不要删除没说明的引号。

国外的邮件平台到达 QQ 邮箱可能会有问题。但是如果没有问题,将是最好选择。国内没有类似平台。企业邮箱有发送阈值,切记自行查看,到信时间没有保证。


如何安装 Discourse?
阿里云就是Discourse的悲剧!
国内邮箱无法发送邮件
如何安装 Discourse?
此论坛程序下载地址?
Discourse 邮件配置除错
邮箱收不到,使用命令也不行
分享 一次 discourse 安装经历的 SMTP 配置
30 分钟内在云上部署 Discourse
./launcher bootstrap app一直等待,新手求指教
30 分钟内在云上部署 Discourse
./launcher bootstrap app一直等待,新手求指教
阿里云安装ruby 报错
#2

补充一下这个文件的内容吧。


(Erick Guan) #3

你指的是?这里面就是让 gembundle 去使用淘宝的镜像。


(ying) #4

感谢!web.china.yml 我的文件是web.china.template.yml ,是不是最新的已经更改了。

另外经我反复测试,最后发现在阿里云的机器上配置邮件需要在app.yml更改这几个设置:

DISCOURSE_SMTP_AUTHENTICATION: login
DISCOURSE_SMTP_OPENSSL_VERIFY_MODE: none
DISCOURSE_SMTP_ENABLE_START_TLS: true

将默认的authentication 由plain 改为login,端口587 和25 都可以。最后我自己的配置如下

DISCOURSE_SMTP_ADDRESS: smtp.exmail.qq.com # (mandatory)
DISCOURSE_SMTP_PORT: 587 # (optional)
DISCOURSE_SMTP_USER_NAME: your@domain.com # (optional)
DISCOURSE_SMTP_PASSWORD: yourpassword # (optional)
DISCOURSE_SMTP_AUTHENTICATION: login
DISCOURSE_SMTP_OPENSSL_VERIFY_MODE: none
DISCOURSE_SMTP_ENABLE_START_TLS: true

后台的notification email 也需要保持与DISCOURSE_SMTP_USER_NAME 一致。

@icanmake @fantasticfears 我添加了一些补充:

腾讯企业邮箱 / 阿里云邮企业版 发信比较重要的设置是notification email 这个选项,因为首次 bootstrap 后,管理员是没办法收到激活邮件的,所以notification email 的设置没办法修改。

只需在终端激活管理员帐号后再登录后台设置就可以了。


安装discourse, 使用qq企业邮箱, 注册无法收到激活邮件
(qingxp9) #5

我这并没有进行这样设置也没发现什么异常啊?


(wow) #6

不仅加了 web.china.template.yml
而且 server 开了 vpn 才 boostrap 成功…


(Erick Guan) #7

应该只有 Gravatar 的问题了吧?准备提供一个 env 来换 Gravatar 的镜像,和一个参数来禁用 Gravatar 和它的自动更新。


(qingxp9) #8

不知能否分享一下服务器翻墙有哪些费用较低廉的方案,除了用国外的服务器


(麦芽圈) #9

请问,我用的是阿里云,根据楼主的配置,就是始终无法安装成功,老是:
FAILED

RuntimeError: cd /var/www/discourse && su discourse -c ‘bundle exec rake db:migrate’ failed with return #<Process::Status: pid 18683 exit 1>
Location of failure: /pups/lib/pups/exec_command.rb:105:in `spawn’
exec failed with the params {“cd”=>"$home", “hook”=>“bundle_exec”, “cmd”=>[“su discourse -c ‘bundle install --deployment --verbose --without test --without development’”, “su discourse -c ‘bundle exec rake db:migrate’”, “su discourse -c ‘bundle exec rake assets:precompile’”]}

不知道是什么问题,如何解决,请大家指点。


(麦芽圈) #10

谢谢 @fantasticfears . 确实是gravatar被GFW block的问题。

已经安装成功。

ps: F*cking GFW!


(ying) #11

我觉得部署discourse 最容易碰到的问题就是这个了。就像@fantasticfears 提到一样,绝大多数都是GFW 等网络相关的问题 一样,用国内的云服务真的太受气!

但我这次bootstrap 又成功了,在app.yml 中加入git,启用了@fantasticfears 的分享插件和QQ登陆插件,并没有按照做修改。


碰到的ERROR 多数都是与git 有关,虽然不是很确定是否有效,但bootstrap / rebuild 通过的机率真的大了,所以还是摘录了一些相关内容,看看有没有帮助:

这速度…

Cloning into '/var/discourse'...
remote: Counting objects: 1328, done.
remote: Compressing objects: 100% (16/16), done.
Receiving objects:  94% (1249/1328), 276.00 KiB | 2.00 KiB/s

(麦芽圈) #12

在阿里云部署之后,邮件配置有问题。
sudo ./launcher mailtest app
Install the python3-xtermcolor package for coloured output
Enter your email address: dev@icanmake.cn
DISCOURSE_SMTP_ settings:
DISCOURSE_SMTP_ADDRESS = smtp.exmail.qq.com
DISCOURSE_SMTP_USER_NAME = dev@icanmake.cn
DISCOURSE_SMTP_ENABLE_START_TLS = True
DISCOURSE_SMTP_PASSWORD = (hidden)
DISCOURSE_SMTP_OPENSSL_VERIFY_MODE = none
DISCOURSE_SMTP_PORT = 465
DISCOURSE_SMTP_AUTHENTICATION = login

WARNING: I can’t yet handle testing port 465.
It’s probably wrong though - most servers use 587 or 25 for submission.
ERROR: Connection unexpectedly closed: timed out

这个问题是阿里云的问题吗?还是QQ企业邮箱的问题?

还有就是:telnet是通的
telnet smtp.exmail.qq.com 465
Trying 163.177.65.157…
Connected to smtp.exmail.qq.com.
Escape character is ‘^]’.


(ROSchina) #14

安装 Install the python3-xtermcolor
用Mandrill管理邮箱,比较好
用Gmail注册Mandrill(翻墙注册)
QQ企业邮箱没有尝试过。

不是阿里云的问题,QQ企业邮箱的问题无法确定。


(麦芽圈) #15

Mandrill对中国无法申请。
国内的,哪个邮箱可以用呢?


(ROSchina) #16

翻墙可以注册的。

国内的没有尝试过。


(Erick Guan) #17

搜狐的 SendCloud 在国内的口碑还不错。

QQ 企业邮箱要注意额度和范围:
http://service.exmail.qq.com/cgi-bin/help?subtype=1&&no=1000904&&id=11

以及企业邮箱是哪个端口得去翻企鹅的文档。


(麦芽圈) #18

Thx @fantasticfears


(ying) #19

QQ邮箱可以的,465 端口我也没成功,587 可以。


(麦芽圈) #20

@fy1128 我用587不行。
配置:
DISCOURSE_SMTP_ADDRESS: smtp.exmail.qq.com # (mandatory)
DISCOURSE_SMTP_PORT: 587 # (optional)
DISCOURSE_SMTP_USER_NAME: (我的邮箱) # (optional)
DISCOURSE_SMTP_PASSWORD: (我的密码) # (optional)
DISCOURSE_SMTP_AUTHENTICATION: login
DISCOURSE_SMTP_OPENSSL_VERIFY_MODE: none
DISCOURSE_SMTP_ENABLE_START_TLS: true

但是用mailtest,出错
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: (501, b’mail from address must be same as authorization user’, ‘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


(ying) #21

notification email 是否一致?

奇怪,我已经重装了,还是能发邮件啊…