搭建自己的GitHub Pages服务器

| 分类 技术随笔  | 标签 Web 

最近我们专业在进行OmegaT的本地化项目,其中包括了omegat的网站,是jekyll生成的。我把它放到github pages上,但生成失败,提示有不支持的tag。看来github的jekyll缺少插件。那我们就本地用jekyll生成吧。

但是配置环境还是挺麻烦的事,还是直接配一台自己的github pages服务器方便,其它人也可以用。

下面是具体步骤:

1、安装jekyll

debian linux下用以下方法安装:

# apt get install ruby ruby-dev make gcc g++

# gem install bundle jekyll

注意不要用apt装jekyll,会报错。

2、clone远程omegat的网页仓库

$ git clone https://github.com/omegat-org/omegat-website

之后进入仓库,运行JEKYLL_ENV=production bundle exec jekyll build就可以生成页面了。

3、建立本地git仓库

首先建立一个供其它用户使用git的账户

# adduser git

切换到git用户

#su git

建立裸仓库。git的服务器端必须用–bare。

$ git init --bare web

这里我预期用户需要上传仓库的内容不是omegat网站的全部内容,而是zh_CN文件夹部分。

4、配置lighttpd

jekyll生成的是静态页面,可以用lighttpd来提供服务。

因为此后要用git账户修改www文件夹的内容,所以选择用git账户启动lighttpd。

以下是lighttpd.conf的内容:

server.modules = (
        "mod_access",
        "mod_alias",
        "mod_compress",
        "mod_redirect",
        "mod_rewrite",
)

server.document-root        = "/home/git/www/html"
server.upload-dirs          = ( "/home/git/var/uploads" )
server.errorlog             = "/home/git/var/error.log"
server.pid-file             = "/home/git/var/lighttpd.pid"
server.username             = "git"
server.groupname            = "git"
server.port                 = 8080


index-file.names            = ( "index.php", "index.html", "index.lighttpd.html" )
url.access-deny             = ( "~", ".inc" )
static-file.exclude-extensions = ( ".php", ".pl", ".fcgi" )
url.rewrite-if-not-file = (
  "zh_CN/(.+)" => "zh_CN/$1.html"
)

compress.cache-dir          = "/home/git/var"
compress.filetype           = ( "application/javascript", "text/css", "text/html", "text/plain" )

# default listening port for IPv6 falls back to the IPv4 port
include_shell "/usr/share/lighttpd/use-ipv6.pl " + server.port
include_shell "/usr/share/lighttpd/create-mime.assign.pl"
include_shell "/usr/share/lighttpd/include-conf-enabled.pl"

可以建立一个shell脚本来启动,内容如下:

#!/bin/bash

/usr/sbin/lighttpd -f ~/lighttpd.conf

这里我给lighttpd开启了mod_rewrite功能,主要是因为omegat的链接有的是/documentation这样的,需要补上.html。我用正则表达式试了好久,最后发现应该使用url.rewrite-if-not-file。另外用的是(.+)而不是(.*)以支持/zh_CN这样的路径。相比于用b4j写jetty的服务器程序,lighttpd给我的自定义空间要小了点。

5、配置git hooks

在git仓库的hooks文件夹里有很多示例的脚本,把它们文件名后面的.sample去掉就可以启动。另外,文件名会影响这些脚本在什么时候运行。比如这里我们需要的是post-update,在提交保存后进行操作。

以下是脚本的内容:

#!/bin/bash

cd ~/git
rm -rf web
git clone ssh://git@127.0.0.1:43999/home/git/web
cd web
cp -r * ~/omegat-website-master/_i18n/zh_CN
cp yml/* ~/omegat-website-master/_i18n/
cd ~/omegat-website-master/
JEKYLL_ENV=production bundle exec jekyll build
cp -r _site/* ~/www/html
pkill lighttpd
~/run.sh
echo "OKay!!!"
exit 0

因为服务器上的git仓库都是git objects,所以需要在本地clone一次。我还给git账户用ssh-keygen配置了公钥,免去输入密码的步骤。

最后参考廖雪峰的教程,需要禁止git以ssh登录。修改/etc/passwd里git用户对应/bin/bash为/usr/bin/git-shell。但是我测试发现lighttpd的启动会有问题,就没有修改了。

再具体讲一下操作流程:

  1. 用户clone ssh://git@127.0.0.1:43999/home/git/web,用最新翻译出来的zh_CN文件夹的内容进行替换。
  2. 用户提交,远程服务器将zh_CN文件夹放到jekyll项目里,生成网页到_site文件夹。
  3. 将_site文件夹的内容替换lighttpd的www/html文件夹。
  4. 重启lighttpd,结果生效。

4.16更新

其实OmegaT的网站开发者是有用jenkins这个持续集成(continuous integration)的工具,和git hooks的实现类似,不过更加方便。另外omegat的网站是放在github pages上的。才发现github pages有遮去路径中的html的功能。


上一篇     下一篇