跳到主要內容

架設 Gitlab 於 uBuntu 12.04.3 LTS(Non-root path)

有一個 GUI 的界面對我們的親和力總是比較高的,即使是習慣 Coding 的人還是會想有一個好的介面來使用 Git,諸如 github 與 bitbucket 此類的 Code hosting,也都設計了想當好的 Web Interface 提供相當好的使用體驗。如果我們想要有好的界面,但是又想自己 Hosting Code 在自己的伺服器呢?目前有許多 Open Source 的專案提供了這類的  Web 應用,我比較喜歡的是 Indefero(基於PHP) 和 Gitlab(基於Ruby) 這兩套。Indefero 是類似 Google Code 的網站,而 GitLab 則是類似 Github 的界面。
Indefero
GitLab
由於個人比較喜歡 GitLab 的界面,所以雖然對 Ruby 不是很熟悉,決定來挑戰一下安裝 GitLab。參考了 Tsung's Blog:將 GitLab 架設 於 Ubuntu 12.04 (Precise)官方的安裝說明文件,不同的地方主要是在前述方法會成爲主要的 Root 網站,但我運行的伺服器還有運行其他的 Web 服務,所以要安裝在非主目錄。尋找解決方法和測試,花了將近 8 個小時,爲了方便自己記憶,決定記錄下整個過程。

套件需求


  • Python 2.5+
  • ruby 1.9.3+
  • git 1.7.10+
  • redis 2.0+
  • MySQL(or PostgreSQL)

基本環境安裝

  1. 更新套件庫資料
    $ sudo apt-get update
    $ sudo apt-get dist-upgrade
  2. 安裝 VIM 作爲編輯工具,並設定爲預設編輯器(若已安裝請略過)
    $ sudo apt-get install -y vim
    $ sudo update-alternatives --set editor /usr/bin/vim.basic
  3. 安裝必要的套件
    $ sudo apt-get install -y build-essential zlib1g-dev libyaml-dev libssl-dev libgdbm-dev libreadline-dev libncurses5-dev libffi-dev curl openssh-server redis-server checkinstall libxml2-dev libxslt-dev libcurl4-openssl-dev libicu-dev logrotate
  4. 確定 Python 的版本,必須是 2.5+
    $ python --version
  5. 確認能夠使用 python2 使用 Python,如果不行請自行建立連結
    $ python2 --version

    # 如果出現 command not found 錯誤請建立連結
    $ sudo ln -s /usr/bin/python /usr/bin/python2
  6. 安裝 python-docutils
    $ sudo apt-get install -y python-docutils

確認 Git 安裝的版本必須要在 1.7.10 以上

  1. 檢查目前 12.04 官方套件庫的版本資訊
    $ apt-cache showpkg git-core
    Package: git-core
    Versions:
    1:1.7.9.5-1
    # 目前的版本爲 1.7.9.5 所以必須手動安裝 Git
  2. 安裝 Git 相依性套件
    $ sudo apt-get install -y libexpat1-dev gettext libz-dev
  3. 手動安裝 Git
    $ cd /tmp
    $ curl --progress https://git-core.googlecode.com/files/git-1.8.4.1.tar.gz | tar xz
    $ cd git-1.8.4.1/
    $ make prefix=/usr/local all

    # 指定安裝至 /usr/local/bin(預設會裝至 ~/bin/)
    $ sudo make prefix=/usr/local install

安裝 Ruby

  1. 安裝 Ruby 2.0+ (若有安裝 Ruby 1.8 請先移除)
    $ mkdir /tmp/ruby && cd /tmp/ruby
    $ curl --progress ftp://ftp.ruby-lang.org/pub/ruby/2.0/ruby-2.0.0-p353.tar.gz | tar xz
    $ cd ruby-2.0.0-p353
    $ ./configure --disable-install-rdoc
    $ make
    $ sudo make install
  2. 安裝 Bundler Gem
    $ sudo gem install bundler --no-ri --no-rdoc

新增 GitLab 系統帳號

  1. 不允許登入
    $ sudo adduser --disabled-login --gecos 'GitLab' git

安裝 GitLab shell

  1. 切換至 git 帳號家目錄
    $ cd /home/git
  2. 複製 GitLab shell
    $ sudo -u git -H git clone https://github.com/gitlabhq/gitlab-shell.git
    $ cd gitlab-shell
  3. 切換至正確的版本(使用 git tag 找最新版)
    $ sudo -u git -H git checkout v1.7.6
  4. 編輯 config 檔
    $ sudo -u git -H cp config.yml.example config.yml

    # 修改 gitlab_url, 改成自己的 domain name, http://your-domain-name/
    $ sudo -u git -H editor config.yml
  5. 執行安裝
    $ sudo -u git -H ./bin/install

安裝資料庫

  1. 資料庫安裝可以參考檔案 databases.md
  2. 我是使用 MySQL,安裝的方式不再贅述,以 root 身份登入
    $ mysql -u root -p
  3. 建立 GitLab 使用的 MySQL 帳號
    mysql> CREATE USER 'gitlab'@'localhost' IDENTIFIED BY '$password';
  4. 建立 GitLab production 資料庫和設定權限
    mysql> CREATE DATABASE IF NOT EXISTS `gitlabhq_production` DEFAULT CHARACTER SET `utf8` COLLATE `utf8_unicode_ci`;
    mysql> GRANT SELECT, LOCK TABLES, INSERT, UPDATE, DELETE, CREATE, DROP, INDEX, ALTER ON `gitlabhq_production`.* TO 'gitlab'@'localhost';
  5. 使用 gitlab 帳號, 測試 MySQL 連線狀況
    $ sudo -u git -H mysql -u gitlab -p -D gitlabhq_production
    # 如果看到 mysql> 表示成功了

安裝與設定 GitLab

  1. 切換至 git 家目錄,複製檔案
    $ cd /home/git

    # 由 Github 複製 GitLab 檔案
    $ sudo -u git -H git clone https://github.com/gitlabhq/gitlabhq.git gitlab
    $ cd /home/git/gitlab
  2. Checkout 穩定版本,git branch -a 或 git branch -r 找 stable 版本
    $ sudo -u git -H git checkout 6-3-stable
  3. 設定 GitLab
    $ cd /home/git/gitlab

    # 複製 GitLab Config 範本
    $ sudo -u git -H cp config/gitlab.yml.example config/gitlab.yml

    # 修改設定,將所有 localhost 更換成我們的 domain name
    # 因爲前述步驟中,我們 Git 是由 Source 自行安裝,將 bin_path 修改爲 /usr/local/bin/git
    $ sudo -u git -H editor config/gitlab.yml

    # 確認 GitLab 可以寫入 log/ 和 tmp/ 資料夾
    $ sudo chown -R git log/
    $ sudo chown -R git tmp/
    $ sudo chmod -R u+rwX  log/
    $ sudo chmod -R u+rwX  tmp/

    # 建立新資料夾給 satellites
    $ sudo -u git -H mkdir /home/git/gitlab-satellites

    # 建立資料夾給 sockets/pids
    $ sudo -u git -H mkdir tmp/pids/
    $ sudo -u git -H mkdir tmp/sockets/
    $ sudo chmod -R u+rwX  tmp/pids/
    $ sudo chmod -R u+rwX  tmp/sockets/

    # 建立 public/uploads 資料夾
    $ sudo -u git -H mkdir public/uploads
    $ sudo chmod -R u+rwX  public/uploads

    # 複製 unicorn 範例及設定,如果2G RAM, worker_processes 可以改成 3
    $ sudo -u git -H cp config/unicorn.rb.example config/unicorn.rb
    $ sudo -u git -H editor config/unicorn.rb

    # 複製 Rack attack 範例及設定
    $ sudo -u git -H cp config/initializers/rack_attack.rb.example config/initializers/rack_attack.rb
    $ sudo -u git -H git config --global user.name "GitLab"
    $ sudo -u git -H git config --global user.email "gitlab@localhost"
    $ sudo -u git -H git config --global core.autocrlf input
    # 到此設定完成可以再檢查確認 gitlab.yml, unicorn.rb 是否存在, 檢查 gitlab.yml 設定是否正確

GitLab Database 設定

  1. 我是使用 MySQL 所以複製 database.yml.mysql,使用Postgresql 請複製 database.yml.postgresql
    $ sudo -u git cp config/database.yml.mysql config/database.yml
  2. 修改 database.yml 中  production(第一個部分)中的設定,將 'secure password' 修改爲 資料庫 gitlab 帳號的密碼
    $ sudo -u git -H editor config/database.yml
  3. 修改 database.yml 權限,只有 git 帳號可以讀取
    $ sudo -u git -H chmod o-rwx config/database.yml

安裝 Gems

  1. 切換至 gitlab 目錄
    $ cd /home/git/gitlab
  2. MySQL 的使用者,選項請使用 "without ... postgres",PostgresSQL 的使用者請使用 "without ... mysql"
    $ sudo -u git -H bundle install --deployment --without development test postgres aws

初始化資料庫

  1. 輸入 "yes" 來建立需要的資料庫內容
    $ sudo -u git -H bundle exec rake gitlab:setup RAILS_ENV=production
  2. 完成後將取得 GitLab 系統預設帳號、密碼
    Administrator account created:
        login.........admin@local.host
        password......5iveL!fe

設定開機啓動與 Logrotate

  1. 複製 init Script,加上執行權限
    $ sudo cp lib/support/init.d/gitlab /etc/init.d/gitlab
    $ sudo chmod +x /etc/init.d/gitlab
  2. 設定開機啓動 GitLab
    $ sudo update-rc.d gitlab defaults 21
  3. 設定 Logrotate
    $ sudo cp lib/support/logrotate/gitlab /etc/logrotate.d/gitlab

檢查GitLab 應用程式狀態和啓動

  1. 檢查 GitLab 環境設定狀態
    $ sudo -u git -H bundle exec rake gitlab:env:info RAILS_ENV=production
  2. 啓動 GitLab
    $ sudo service gitlab start
    # 或是
    $ sudo /etc/init.d/gitlab restart
  3. 再檢查應用程式的狀態,如果都出現綠色就是沒有問題,否則再仔細檢查前述的步驟
    $ sudo -u git -H bundle exec rake gitlab:check RAILS_ENV=production

設定 Apache2 環境

這個部分是我和大家比較不一樣的地方,是設定 Sub directory,像是:http://www.example.com/gitlab/ 。如果你的伺服器比較單純,沒有進行其他的網站服務,可以使用 Tsung's Blog 上的方法,下載 gitlab.conf 即可。
  1. 有三個檔案需要修改:application.rb、gitlab.yml、unicorn.rb,將下面資料前面的註解移除。
    # 移除 config.relative_url_root = "/gitlab" 前方註解
    $ sudo -u git -H editor config/application.rb

    # 移除 relative_url_root: /gitlab 前方註解
    $ sudo -u git -H editor config/gitlab.yml

    # 移除 ENV['RAILS_RELATIVE_URL_ROOT'] 前方註解
    $ sudo -u git -H editor config/unicorn.rb
  2. 設定網站的 Alias 至 apache2 中
    $ sudo vim /etc/apache2/sites-available/default
    Alias /gitlab "/home/git/gitlab/public"
    <Directory /home/git/gitlab/public>
        Options -MultiViews
        SetEnv RAILS_RELATIVE_URL_ROOT "/gitlab"
    </directory>
  3. 啓用下面幾項模組
    $ sudo a2enmod rewrite proxy proxy_http
  4. 修改 Proxy 設定,檔案中加入下面幾行
    $ sudo vim /etc/apache2/mod-available/proxy.conf
    ProxyRequests On
    ProxyPreserveHost on
    <proxy>
      AddDefaultCharset off
      Order deny,allow
      Allow from all
      AllowOverride All
    </proxy>
  5. 修改 apache2.conf 設定
    $ sudo vim /etc/apache2/apache2.conf
    # 檔案最後加上下列兩行
    ProxyPass         /gitlab/ http://127.0.0.1:8080/gitlab/
    ProxyPassReverse  /gitlab/ http://127.0.0.1:8080/gitlab/
  6. 重新啓動 Apache 和 GitLab
    $ sudo service apache2 restart
    $ sudo service gitlab restart

修改 unicorn listen 設定(選擇性)

因爲我的 8080 Port 運行著 Tomcat,所以必須修改 unicorn 的 listen port 避免他們打架 XD
  1. 切換到 gitlab 目錄
    $ cd /home/git/gitlab
  2. 修改 config/unicorn.rb 資料,找到 listen 的地方修改 8080 更換成想要的 Port 號碼
    $ sudo -u git -H editor config/unicorn.rb
    listen "127.0.0.1:9242"
  3. 前段第五點 apache2.conf 設定,改爲下列
    $ sudo vim /etc/apache2/apache2.conf
    ProxyPass         /gitlab/ http://127.0.0.1:9242/gitlab/
    ProxyPassReverse  /gitlab/ http://127.0.0.1:9242/gitlab/
  4. 重新啓動 Apache 和 GitLab
到這裏 GitLab 就架設完成了~ !連到 http://your-domain-name/gitlab/ 享受甜美的果實吧!(第一次啓動會花比較久的時間,請耐心等候)


留言

這個網誌中的熱門文章

Word的合併列印如何出現「千分位」符號

今天樓下的同事突然問我一個問題,合併列印的時候如何顯示「千分位符號」(逗號),就是12 , 300。在Excel我們可以很容易的為儲存格裡的數字加上千分位的標記,但是儲存格實際儲存的還是只有數字,那個千分位符號是Excel給我們看的一種「格式」。 當我們在Word裡使用Excel做好的報表來合併列印的時候,Word會最真實的將這個數字欄位給讀出來,呈現在合併列印的欄位數值裡,無論在Excel理事不是有設定千分位符號,在Word合併列印後卻沒有出現,所以我們同樣的必須給他加上格式。 Word裡加上格式並不如Excel裡按一下就完成,加上逗號的千分位格式方法如後: 1.在Word裡插入合併列印的欄位變數。 2.在變數上按滑鼠右鍵,選擇「切換功能變數代碼」(也可以直接按Alt+F9),變數會由 經費 >> 變成 { MERGEFIELD "經費" } 。 3.加上格式就是把 { MERGEFIELD "經費" } 在}前加入數字格式參數 /##,###,會成為 { MERGEFIELD "經費" /# ##,### }(這裡指定五位數,以此類推) #:這個格式項目會指定要在結果中顯示的必要位數;如果結果不含該位數的數字,則 Word 會顯示一個空格。 0:這個格式項目會指定要在結果中顯示的必要位數;如果結果不含該位數的數字,則 Word 會顯示 0 (零)。 4.預覽內容,就可以發現千分位(逗號)出現,如果數值有零的話,最好可以換成 /# ##,## 0 ,避免空格出現。 數字格式參數請參考 Microsoft Office Online 。

使用 Stackedit 發佈至 Blogger

使用 StackEdit 發佈至 Blogger 目前部落格裡新的文章幾乎都是在 StackEdit 上使用 Markdown 來完成撰寫,是一個舒適的撰寫體驗,也更能讓自己專注在文章的撰寫,不用去調整版面上的細節。StackEdit 除了可以將文本直接存在 Google Drive 上,圖形直接嵌入引用 Google+ 相簿,讓整個寫作的流程都是在雲端上完成,另外一個我喜歡的優點,是能夠直接將寫好的文章發佈到自己的部落格上。 發佈至 Blogger 部落格 將文章發佈至 Blogger 上的方法非常簡單,在 StackEdit 的左上角開啓左邊的功能列,拉開 Publish 項目並點選 Blogger,如下圖: 第一次使用時會導引至 Google 的授權頁,回到彈出的對話視窗,填寫好 Blogger 的 URL 內容。新發佈不用填寫 POST ID,這個是未來若需要更新內容的時候使用的。 按下「OK」後就完成發佈的動作,發佈完成後,在 StackEdit 該篇文章的右上角會出現 Blogger 的 Icon。 部落格的樣本改造 文章發佈至 Blogger 後有的模板會有小小的問題,如果我們使用 Markdown 時沒有寫入圖片的最大寬度,插入的圖片若比較大就會造成圖形突破樣板的驚嚇感。 這個可以透過自己改造Blogger 模板內容的 CSS,將圖片最大限制在某個數值。簡單一點的方式,是選擇現在 Blogger 中就已經有限制圖片大小的佈景主題。 程式碼高亮標識 StackEdit 的程式區塊是有支援程式碼高亮標識(Highlight)的功能,預設是使用 Highlight.js 的函式庫,也可以使用 Google prettify。Highlight.js 目前已經支援 118 種的程式語法自動偵測。還有 54 種的 Style 可以選擇。但是發佈至 Blogger 後因模板沒有相關的引入,所以程式碼區塊就和一般的文字一樣,沒有區塊和程式碼標識的區別。 我們可以透過修改 Blogger 的樣板的樣式,引入 Highlight.js 的函式庫與樣式。進入 Blogger 的後臺管理頁面,在左方的選單中選擇 範本 ,然後右方選 編輯 HTML ,開啓樣板的 HTML 編輯畫面。 我們可以在 Highlight.js ...

使用者只能 SFTP 登入自己的家目錄

使用者只能 SFTP 登入自己的家目錄 老師的電腦動畫課堂的期末作品,是開放讓學生透過 FTP 上傳自己的作品及網頁至實驗室的伺服器,由於 FTP 是明碼的封包傳輸於最近升級系統後,便考慮改用 SFTP(SSH File Transfer Protocol)來提供上傳的服務。 提供 SFTP 上傳的同時,希望使用者和以前一樣只能使用 SFTP 無法使用 SSH 登入伺服器。SFTP 為 SSH 的檔案傳輸服務,預設建立帳號的時候使用者同時可以使用這兩種服務。透過 SFTP only + Chroot 設定我們能限制使用者僅能 SFTP 並且無法離開自己的家目錄去到處閒晃。 安裝 OpenSSH 如果安裝的是 Ubuntu Server 應該在安裝過程會安裝 openssh-server 套件,沒有的話可以利用下面的指令安裝。 $ sudo apt-get install openssh-server 新增一個給 SFTP 使用的群組 sftpaccess $ sudo groupadd sftpaccess 修改 OpenSSH 設定檔 編輯 /etc/ssh/sshd_config 設定檔,在約 77 行的地方找到 Subsystem sftp /usr/lib/openssh/sftp-server 註解此行並修改為 Subsystem sftp internal-sftp 。 $ sudo vim /etc/ssh/sshd_config #Subsystem sftp /usr/lib/openssh/sftp-server Subsystem sftp internal-sftp 在檔案的尾端加上下面的片段 Match group sftpaccess ChrootDirectory /home/%u X11Forwarding no AllowTcpForwarding no ForceCommand internal-sftp 建立新的使用者並加入 sftpaccess 群組 在設定檔中,我們設置了 sftpaccess 這個群組套用要做 ChrootDirectory 的設定,所以我們將要限制的使用者,加入這個群組中。 $ sudo useradd ...