跳到主要內容

架設 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 。

在DOS下檔案名稱加上日期

由於要完成檔案自動備份的需求,以減少每日使用人工的麻煩,也可以避免人為疏失造成的遺漏,需要定時拷貝某個檔案至遠端,在檔名加上日期以避免檔案覆蓋的情形。由於近來接觸Linux較多,自然比較熟悉Linux的Shell語法,回到Windows裡卻想不到解決的方法。 開始使用電腦時,已經活生生的跳過了DOS的年代,雖然會使用Copy語法,卻不知怎麼加上系統日期,參拜估狗大師後得到了解答,使用%DATE%環境變數。 在DOS中使用date會顯示目前日期,但會要求輸入新的日期時間不符合需求,雖然加上"/T"不會詢問新時間,但因為date是指令無法使用在copy的語法中,所以我們使用%DATE%環境變數,所以在我們要加上日期的檔案上加上此環境變數:copy test.txt test_%DATE%.txt 結果並不如我們想像,使用echo看%DATE%的傳回值,會出現"2007/12/4",使用於copy語法裡系統回應「命令語法不正確」,我們必須去除「/」的符號,這就需要用到環境變數的擴充功能了! 用echo來測試: # echo %DATE:~0,4% : 取環境變數%DATE%的值,由第一碼開始取四碼(可以取出"西元年"的值)。 # echo %DATE:~5,2% :取環境變數%DATE%的值,由第六碼開始取二碼(可以取出"月"的值)。 # echo %DATE:~8,2% :取環境變數%DATE%的值,由第九碼開始取二碼(可以取出"日"的值)。 原先的 #copy test.txt test_%DATE%.txt 要更改成 #copy test.txt test %DATE:~0,4% %DATE:~5,2% %DATE:~8,2% .txt 拷貝後的檔案為test_20071204.txt

使用者只能 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