感覺以后可以出個實(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é)果了埋涧,這很難嗎板辽?
話說三年前我也是做到了這一步棘催,然后看了三秒鐘劲弦,覺得這界面真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的說明未辆,給個圖吧
其中最主要的是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_KEY
和GITHUB_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
真的是寫在后面的話
安裝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