Gollum搭建實(shí)戰(zhàn)篇

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

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

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


效果圖

簡單的標(biāo)題弯菊,功能強(qiáng)大的搜索框(支持wiki內(nèi)的全文搜索哦),加上兩個必不可少的功能按鈕踱阿,這就是全部了管钳。剛開始很多人對這種風(fēng)格還不是很適應(yīng)钦铁,但用一段時間,估計(jì)大家就會喜歡上才漆,畢竟極簡風(fēng)現(xiàn)在很流行芭2堋!

安裝準(zhǔ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

因?yàn)間ollum是需要編譯安裝的窝革,因此你還需要安裝ruby-devel躲履、rubygems

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é),那就是國外源實(shí)在是太太太慢了拴泌,只能換成國內(nèi)的源魏身,從這一點(diǎn)來看,這幾年阿里和淘寶做得不錯蚪腐,百度就不行了箭昵,但今天這個gem源卻不是這哥仨提供的,原來淘寶有個源回季,但現(xiàn)在好像已經(jīng)不維護(hù)了家制。下面就是換源操作

# 添加國內(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
# 進(jìn)入目錄
cd wiki
# 初始化為git項(xiàng)目目錄
git init
# 啟動gollum
gollum

然后打開瀏覽器澈侠,訪問缺省地址http://server.com:4567就可以看到一個創(chuàng)建新Home頁面的界面劫侧,隨便輸入兩句話,點(diǎn)擊保存就可以看到結(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管理的批幌,安裝方便啊荧缘!先裝為敬

gem install unicorn

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

# 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啟動一樣的界面了绸罗。

反向代理

常見的有兩個軟件可以實(shí)現(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都加載不到儡毕,仔細(xì)一看,見了鬼了扑媚,返回到所有路徑居然都是直接指向根路徑腰湾!我不是已經(jīng)在config.ru文件中設(shè)置了base_path為/wiki了嗎?

碼農(nóng)專用

這時候就體現(xiàn)出碼農(nóng)的基本素質(zhì)了疆股,有問題费坊,看源碼,反正gollum的源碼都在旬痹,不是嗎附井?經(jīng)過簡單排查(也就花了幾分鐘不止)讨越,發(fā)現(xiàn)我傳進(jì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個目標(biāo)已經(jīng)實(shí)現(xiàn)了4個捡偏,也算是基本成功了峡迷!

最后的沖刺

都說碼農(nóng)是追求完美的绘搞,那必須把第5個目標(biāo)也實(shí)現(xiàn)了夯辖!為gollum加上OAuth認(rèn)證機(jī)制蒿褂。這里先科普一下卒暂,gollum本身是不帶用戶管理的也祠,需要使用一個叫omnigollum的插件進(jìn)行外掛處理,而這個插件也繼承了gollum的風(fēng)格堪旧,本身只做了一個權(quán)限管理的平臺淳梦,本身并不帶真正的權(quán)限管理爆袍,需要使用一個叫omniauth的插件來實(shí)現(xiàn)權(quán)限管理李滴,最后這個omniauth也是一個平臺所坯,本身也并不實(shí)現(xiàn)權(quán)限認(rèn)證,需要你選擇一個真正的認(rèn)證插件來實(shí)現(xiàn)堂湖,例如有面向Twitter的認(rèn)證插件、面向Facebook的認(rèn)證插件等等伺糠,說了一堆训桶,不知道你有沒有了解清楚呢酣倾,讓我們來看看下面這個列表吧

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

好吧躁锡,歪果碼農(nóng)做事就是這么,怎么說呢拦焚,專業(yè)吧J臧堋(手動滑稽)
開始安裝以上一系列軟件抬伺,這里我選的是github認(rèn)證插件,原因很簡單妓笙,twitter和facebook國內(nèi)用不了寞宫,國內(nèi)微信拉鹃、支付寶的認(rèn)證插件又沒有找到,那就只能這樣了钥屈!

gem install omnigollum omniauth omniauth-github

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


github apps

其中最主要的是Authorization callback URL

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

是時候把config.rb的另外一半補(bǔ)上了兼蜈,下面是個全的

#!/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)境變量中進(jìn)行設(shè)置。

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

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

patch

真的是寫在后面的話

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

Git地址

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

參考文獻(xiàn)

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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市饼疙,隨后出現(xiàn)的幾起案子慕爬,更是在濱河造成了極大的恐慌,老刑警劉巖磅甩,帶你破解...
    沈念sama閱讀 218,036評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件姥卢,死亡現(xiàn)場離奇詭異独榴,居然都是意外死亡括眠,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,046評論 3 395
  • 文/潘曉璐 我一進(jìn)店門捞烟,熙熙樓的掌柜王于貴愁眉苦臉地迎上來题画,“玉大人苍息,你說我怎么就攤上這事竞思「桥纾” “怎么了?”我有些...
    開封第一講書人閱讀 164,411評論 0 354
  • 文/不壞的土叔 我叫張陵距辆,是天一觀的道長跨算。 經(jīng)常有香客問我诸蚕,道長挫望,這世上最難降的妖魔是什么狂窑? 我笑而不...
    開封第一講書人閱讀 58,622評論 1 293
  • 正文 為了忘掉前任泉哈,我火速辦了婚禮丛晦,結(jié)果婚禮上烫沙,老公的妹妹穿的比我還像新娘隙笆。我一直安慰自己撑柔,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,661評論 6 392
  • 文/花漫 我一把揭開白布剪决。 她就那樣靜靜地躺著柑潦,像睡著了一般渗鬼。 火紅的嫁衣襯著肌膚如雪乍钻。 梳的紋絲不亂的頭發(fā)上银择,一...
    開封第一講書人閱讀 51,521評論 1 304
  • 那天夹孔,我揣著相機(jī)與錄音,去河邊找鬼析孽。 笑死搭伤,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的袜瞬。 我是一名探鬼主播怜俐,決...
    沈念sama閱讀 40,288評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼邓尤!你這毒婦竟也來了拍鲤?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,200評論 0 276
  • 序言:老撾萬榮一對情侶失蹤汞扎,失蹤者是張志新(化名)和其女友劉穎季稳,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體澈魄,經(jīng)...
    沈念sama閱讀 45,644評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡痹扇,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,837評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片杜窄。...
    茶點(diǎn)故事閱讀 39,953評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡莉钙,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出蚊伞,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 35,673評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站预吆,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜蔬芥,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,281評論 3 329
  • 文/蒙蒙 一测僵、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦纲辽、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,889評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間学少,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,011評論 1 269
  • 我被黑心中介騙來泰國打工忌堂, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 48,119評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子醋旦,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,901評論 2 355

推薦閱讀更多精彩內(nèi)容