Gollum搭建實戰(zhàn)篇

感覺以后可以出個實戰(zhàn)篇系列,畢竟只有自己動手操作過,感受才會比較深,解決方法不說最好,但至少是在當(dāng)時管用的:)

閑話少說,今天帶來的是一個比較小資的wiki管理系統(tǒng)--Gollum,為啥叫小資呢,因為我感覺這個系統(tǒng)采用的極簡風(fēng)格非常具有小資情調(diào),而且要能夠玩轉(zhuǎn)這個系統(tǒng),你也必須是一個開發(fā)者,所以這個系統(tǒng)并不適合所有人,但對于有追求的小資來說,卻是再好不過的了。

首先上一張最終的效果圖,如果你感覺不是你喜歡的風(fēng)格,那么接下來就可以不用看了:)


效果圖

簡單的標題,功能強大的搜索框(支持wiki內(nèi)的全文搜索哦),加上兩個必不可少的功能按鈕,這就是全部了。剛開始很多人對這種風(fēng)格還不是很適應(yīng),但用一段時間,估計大家就會喜歡上,畢竟極簡風(fēng)現(xiàn)在很流行??!

安裝準備

Gollum是使用ruby開發(fā)的,要求ruby的版本在1.9以上,所以如果你是老版本的ruby,那就需要升級咯,這里給出一個yum安裝高版本ruby的方法。

首先安裝yum源

yum install centos-release-scl-rh

安裝指定版本的ruby

yum install rh-ruby24  -y

使用scl安裝的軟件缺省是不在path路徑里的,需要手動激活

scl enable rh-ruby24 bash

當(dāng)然為了避免麻煩,你也可以找到enable腳本,然后把其中的內(nèi)容復(fù)制到你的.bashrc中,通常enable腳本的路徑為

/opt/rh/rh-ruby24/enable

這時你可以看看ruby的版本號

ruby -v

因為gollum是需要編譯安裝的,因此你還需要安裝ruby-develrubygems

yum install rh-ruby24-ruby-devel rh-ruby24-rubygems -y

如果你之前沒有安裝過其它需要編譯的軟件包,那么大概率你還需要安裝下面幾個包

yum install libicu libicu-devel zlib zlib-devel -y

這時候你可以執(zhí)行以下gem看看版本號(這是一個安裝管理工具,和yum類似,不過管理的對象是用ruby開發(fā)的程序)

gem -v

如果到這里一切順利,那么恭喜你,真正困難的路終于要開始了!

中國特色

一切需要從國外源下載安裝的軟件都會有這個類似的環(huán)節(jié),那就是國外源實在是太太太慢了,只能換成國內(nèi)的源,從這一點來看,這幾年阿里和淘寶做得不錯,百度就不行了,但今天這個gem源卻不是這哥仨提供的,原來淘寶有個源,但現(xiàn)在好像已經(jīng)不維護了。下面就是換源操作

# 添加國內(nèi)源
gem sources -a http://gems.ruby-china.com/
# 刪除官方源
gem sources -r http://rubygems.org/
# 查看當(dāng)前源
gem sources -l

該國內(nèi)源到本文發(fā)布之時可用(只能這么說了)

安裝Gollum

一切就緒,懷著激動的心情按下回車鍵吧

gem install gollum

真的就這么簡單,然后你就可以出去走走,呼吸一下新鮮空氣,喝杯茶,然后再回來看結(jié)果。

寫在后面

經(jīng)過休息,回來發(fā)現(xiàn)已經(jīng)安裝完畢了,一共耗時不到1個小時,感覺這也不像之前說得這么復(fù)雜啊。最多是和一般wiki不一樣的,gollum需要一個git目錄才能使用

# 創(chuàng)建一個空目錄
mkdir wiki
# 進入目錄
cd wiki
# 初始化為git項目目錄
git init
# 啟動gollum
gollum

然后打開瀏覽器,訪問缺省地址http://server.com:4567就可以看到一個創(chuàng)建新Home頁面的界面,隨便輸入兩句話,點擊保存就可以看到結(jié)果了,這很難嗎?

網(wǎng)上盜的圖,我的忘記截屏了

話說三年前我也是做到了這一步,然后看了三秒鐘,覺得這界面真TMD丑,果斷放棄,沒想到三年后我胡漢三又回來了,這次怎么也得多走兩步啊。

再次出發(fā)

首先一個真正的碼農(nóng)是不會滿足于直接使用gollum內(nèi)置的web服務(wù),必須搞成專門的web服務(wù),而且必須是后臺服務(wù);怎么可以對外暴露4567這么low的端口的,那必須改;而且直接訪問根路徑就可以訪問到wiki,那怎么行,必須加一個content path,這也必須改;界面上怎么有那么多功能按鈕,看起來好丑,不是說好極簡風(fēng)格的嗎?改!居然沒有用戶管理,最in的OAuth授權(quán)呢,必須加!

unicorn

unicorn官方給出的宣傳語是

Rack HTTP server for fast clients and Unix

不管怎么樣,總是一個專業(yè)的web服務(wù)器,而且也是gem管理的,安裝方便?。∠妊b為敬

gem install unicorn

不過這軟件的文檔可是真難找,不過我已經(jīng)為大家準備好了一個配置文件,拿走不謝!

# unicron.conf
worker_processes  2
working_directory '/home/wiki'
#listen '/tmp/unicorn.sock', :backlog => 1024
listen 4567, :tcp_nopush => true
timeout 10
pid '/tmp/gollum.pid'
preload_app  true
stderr_path '/home/wiki/logs/unicorn.log'

before_fork do |server, worker|
  old_pid = "#{server.config[:pid]}.oldbin"
  if old_pid != server.pid
    begin
      sig = (worker.nr + 1) >= server.worker_processes ? :QUIT : :TTOU
      Process.kill(sig, File.read(old_pid).to_i)
    rescue Errno::ENOENT, Errno::ESRCH
    end
  end

  sleep 1
end

after_fork do |server, worker|
  addr = "127.0.0.1:#{4568 + worker.nr}"
  server.listen(addr, :tries => -1, :delay => 5, :tcp_nopush => 1)
end

另外gollum也需要一個配置文件config.ru,不過那個配置文件一言難盡,先給個簡易版本的

#!/usr/bin/env ruby
require 'rubygems'
require 'gollum/app'

gollum_path = File.expand_path('/home/wiki/docroot')
Precious::App.set(:gollum_path, gollum_path)
Precious::App.set(:default_markup, :markdown)

# Specify the wiki options.
wiki_options = {
  :base_path => '/wiki',
  :universal_toc => false,
  :live_preview => false,
  :allow_uploads => false,
  :h1_title => true,
  :allow_editing => true
}
Precious::App.set(:wiki_options, wiki_options)
run Precious::App

此時可以執(zhí)行以下命令啟動unicorn的后臺模式

unicorn -D -c /home/wiki/config/unicorn.conf config.ru

啟動之后就可以看到gollum啟動一樣的界面了。

反向代理

常見的有兩個軟件可以實現(xiàn)端口隱藏,一個是nginx,另一個就是Apache Httpd,配置也相對簡單,下面我把兩種代理配置都貼出來。

Nginx

server {
    listen       80;
    server_name  localhost;
    access_log   /home/wiki/logs/nginx_access_log;
    error_log    /home/wiki/logs/nginx_error_log info;

    location /wiki {
        proxy_set_header Host $http_host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_pass       http://localhost:4567;
        proxy_redirect   off;
    }
}

Apache Httpd

ProxyPass /wiki http://localhost:4567
ProxyPassReverse /wiki  http://localhost:4567

這兩個配置都是把訪問/wiki的請求轉(zhuǎn)移到了內(nèi)部的4567端口,即隱藏了4567端口,又設(shè)置了wiki的content path,一舉兩得!

呸!想的美,反轉(zhuǎn)來了!怎么訪問4567端口都是正常的,訪問80端口的/wiki就出現(xiàn)了各種問題,首先是直接跳轉(zhuǎn)到了/Home,出404錯誤,訪問/wiki/Home,則只有文字,所有的css和js都加載不到,仔細一看,見了鬼了,返回到所有路徑居然都是直接指向根路徑!我不是已經(jīng)在config.ru文件中設(shè)置了base_path為/wiki了嗎?

碼農(nóng)專用

這時候就體現(xiàn)出碼農(nóng)的基本素質(zhì)了,有問題,看源碼,反正gollum的源碼都在,不是嗎?經(jīng)過簡單排查(也就花了幾分鐘不止),發(fā)現(xiàn)我傳進去的參數(shù)居然被在內(nèi)部重新賦值了,我暈!不是應(yīng)該用參數(shù)給內(nèi)部變量賦值的嗎?這個開發(fā)人員當(dāng)時是怎么想的?

#/opt/rh/rh-ruby24/root/usr/local/share/gems/gems/gollum-4.1.4/lib/gollum/app.rb:101
# above will detect base_path when it's used with map in a config.ru
settings.wiki_options.merge!({ :base_path => @base_url })

不管了,先改了再說

# above will detect base_path when it's used with map in a config.ru
# settings.wiki_options.merge!({ :base_path => @base_url })
@base_url = settings.wiki_options.fetch(:base_path, @base_url)

改了之后記得要重新啟動unicorn,立馬效果不一樣,80端口的/wiki界面終于正常了。當(dāng)然在這個文件里還有一些重定向的函數(shù)也有問題,一并改了,改得并不徹底,先用著吧。

redirect to("#@base_url/create/#{encodeURIComponent(@name)}")
redirect to("#@base_url/#{page.escaped_url_path}") unless page.nil?
redirect to("#@base_url/")
redirect to("#@base_url/#{clean_url(::File.join(page_dir, page.escaped_url_path))}")
redirect to("#@base_url/#{clean_url(::File.join(encodeURIComponent(page_dir), encodeURIComponent(path), encodeURIComponent(name)))}")
redirect to("#@base_url/create/#{clean_url(encodeURIComponent(page_path))}")

做事就要一氣呵成,不是嫌功能按鈕太多不美觀嗎?順手都改了

#/opt/rh/rh-ruby24/root/usr/local/share/gems/gems/gollum-4.1.4/lib/gollum/templates/page.mustache

把不需要的多余按鈕全刪除了,只留兩個!

目前為止,5個目標已經(jīng)實現(xiàn)了4個,也算是基本成功了!

最后的沖刺

都說碼農(nóng)是追求完美的,那必須把第5個目標也實現(xiàn)了!為gollum加上OAuth認證機制。這里先科普一下,gollum本身是不帶用戶管理的,需要使用一個叫omnigollum的插件進行外掛處理,而這個插件也繼承了gollum的風(fēng)格,本身只做了一個權(quán)限管理的平臺,本身并不帶真正的權(quán)限管理,需要使用一個叫omniauth的插件來實現(xiàn)權(quán)限管理,最后這個omniauth也是一個平臺,本身也并不實現(xiàn)權(quán)限認證,需要你選擇一個真正的認證插件來實現(xiàn),例如有面向Twitter的認證插件、面向Facebook的認證插件等等,說了一堆,不知道你有沒有了解清楚呢,讓我們來看看下面這個列表吧

gollum
    - omnigollum
          - omniauth
                 - omniauth-twitter
                 - omniauth-facebook
                 - omniauth-github
                 ...

好吧,歪果碼農(nóng)做事就是這么,怎么說呢,專業(yè)吧?。ㄊ謩踊?br> 開始安裝以上一系列軟件,這里我選的是github認證插件,原因很簡單,twitter和facebook國內(nèi)用不了,國內(nèi)微信、支付寶的認證插件又沒有找到,那就只能這樣了!

gem install omnigollum omniauth omniauth-github

安裝之后,需要做的準備工作就是去github上申請一個clientID和secretKey,這個申請過程我就省略了,可以直接查github的說明,給個圖吧


github apps

其中最主要的是Authorization callback URL

http://your.server.com/__omnigollum__/auth/github/callback

是時候把config.rb的另外一半補上了,下面是個全的

#!/usr/bin/env ruby
require 'rubygems'
require 'gollum/app'

gollum_path = File.expand_path('/home/wiki/docroot')
Precious::App.set(:gollum_path, gollum_path)
Precious::App.set(:default_markup, :markdown)

# Specify the wiki options.
wiki_options = {
  :base_path => '/wiki',
  :universal_toc => false,
  :live_preview => false,
  :allow_uploads => false,
  :h1_title => true,
  :allow_editing => true
}
Precious::App.set(:wiki_options, wiki_options)

# Set as Sinatra environment as production (no stack traces)
Precious::App.set(:environment, :production)

# Setup Omniauth via Omnigollum.
require 'omnigollum'
require 'omniauth/strategies/github'

options = {
  # OmniAuth::Builder block is passed as a proc
  :providers => Proc.new do
     provider :github, ENV['GITHUB_KEY'], ENV['GITHUB_SECRET'], {
       scope: "user",
       provider_ignores_state: true
     }
  end,
  :dummy_auth => false,
  # Make the entire wiki private
  # :protected_routes => ['/*'],
  # Specify committer name as just the user name
  :author_format => Proc.new { |user| user.name },
  # Specify committer e-mail as just the user e-mail
  :author_email => Proc.new { |user| user.email },
  :authorized_users => nil
}

# :omnigollum options *must* be set before the Omnigollum extension is registered
Precious::App.set(:omnigollum, options)
Precious::App.register Omnigollum::Sinatra

run Precious::App

其中GITHUB_KEYGITHUB_SECRET的值就是剛才申請到的,可以在環(huán)境變量中進行設(shè)置。

是不是一切都OK了?現(xiàn)在都已經(jīng)不敢說這句話了!

話說其實已經(jīng)差不多了,但如果在界面上顯示一下已經(jīng)登錄的用戶名,另外再增加了一個Login和Logout的按鈕是不是會更爽?這些已經(jīng)有人考慮到了,請按照這篇中提到的地方進行修改吧
https://github.com/arr2036/gollum/commit/dd1fdad59d9f12bfe637704c0101af96aaa1a7e4

patch

真的是寫在后面的話

安裝gollum對我來說絕對是一個有趣的過程,我之前從來沒有接觸過ruby,但通過這次安裝,又結(jié)識了一門新的語言,感覺很不錯!安裝只是一個起點,不斷有新的想法,然后不斷去實現(xiàn)它,才是樂趣所在!

Git地址

https://github.com/arr2036/omnigollum
https://github.com/omniauth/omniauth
https://github.com/omniauth/omniauth-github

參考文獻

https://cn.charlee.li/gollum-lightweighted-wiki-engine.html
http://railscasts.com/episodes/304-omniauth-identity

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容