使用 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

  1. 按照 https://github.com/rocodev/guides/wiki/setup-production-development 安裝正常的 Rails Production 環境
  2. 幾個記得要安裝的套件
    • 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

你可能感兴趣的:(capistrano,discourse)