Discourse 是目前 Opensource 界相當受歡迎的一套論壇軟體。通常用來架設技術社群專屬討論區。
Discourse 官方目前的推薦部署模式目前是採 Docker,直接在 Digital Ocean 部署。這個方案可以少去很多不熟 Rails 的人安裝上的求助需求。
但也大大限制了社群未來想 patch 功能的自由性。(社群貢獻代碼和功能的方式,通常是透過 Github Fork 原始碼,拉 pull request 回去,而用 Docker deploy 的架構,很難讓想幫忙的人直接插手)。
而 Discourse 的設計與架構,也與傳統在設計 Rails Application 的做法大大不同(其 Anti-Pattern 真是多到令人髮指)。一般的 Rails Application 都是會設計成使用 capistrano deploy,然後 config 拆開另外放。這樣的好處是 source code 可公開,可讓人自由 fork,config 的敏感資訊又不會被泄露。
這篇文章就是一個引子,讓有心想使用 Capistrano 架設 Discourse 的人可以找到線索架設。
安裝
我的機器是再 Linode 租的。跑 Ubuntu 13.10
- 按照 https://github.com/rocodev/guides/wiki/setup-production-development 安裝正常的 Rails Production 環境
- 幾個記得要安裝的套件
- PostgreSQL database ( database backend )
- Redis Server ( 要給 sidekiq 跑 queue 用)
PG SQL 注意事項
我們用來部署的 agent 跑在 apps 上,但 pgsql 會先吃 apps 這個賬號。所以要記得開 apps 再 pgsql 上的帳號,然後再開 discourse
這個 db,把權限 assign 上去。
另外 discourse 有用了一些 extension,跑 migration 時會跳警告,按照警告的內容處理就可以了...
Capistrano / Unicorn 檔
- 記得塞 Capfile
- 記得塞 config/deploy.rb https://github.com/xdite/discourse/blob/production/config/deploy.rb
- unicorn 的 setting https://github.com/xdite/discourse/blob/production/config/unicorn/production.rb
值得注意的是
discourse 的 production config 並非跑在 config/enviorments/production.rb,而是 https://github.com/xdite/discourse/blob/master/config/discourse_defaults.conf
所以我在 production branch 上 remove & ignore 這個檔,改用 deploy symlink 的方式。
(避免上面的 database / smtp password 外洩)
Nginx Config
discourse 完全不建議跑在 passenger 上,因為 discourse 是採用 long polling 的方式作 Ajax,所以架在 passenger 上會奇慢無比。通常會跑在 thin 或 unicorn 上,我是放在 unicorn。
這是與 unicorn 搭配的 nginx config。
(記得要先建這個資料夾 ../discourse/shared/sockets)
SMTP
SMTP 我是直接用 Mailgun 。設一個賬號密碼就完成了。
其他注意事項
..discourse/shared/uploads 這個資料夾也要記得開。否則圖片會上傳不上去。
Contribute on Github
慣例是 master
追原始 Discourse branch,production 上跑自己的客制版本。
如果要追官方更新
- 加上 upstream
git remote add upstream https://github.com/discourse/discourse.git
git fetch upstream
git checkout master; git merge upstream/master