使用 Capistrano 部署 Discourse
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)
upstream g0v_unicorn_socket { server unix:/home/apps/discourse/shared/sockets/unicorn.sock fail_timeout=0; } server { listen 80; server_name community.g0v.tw; root /home/apps/discourse/current/public; client_max_body_size 5M; location ~* ^/assets/ { expires 1y; add_header Cache-Control public; if ($request_filename ~* ^.*?\.(eot)|(ttf)|(woff)|(svg)|(otf)$){ add_header Access-Control-Allow-Origin *; } break; } try_files $uri/index.html $uri.html $uri @app; location @app { proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host $http_host; proxy_redirect off; proxy_pass http://g0v_unicorn_socket; proxy_connect_timeout 600; proxy_send_timeout 600; proxy_read_timeout 600; send_timeout 600; } }
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