Hem >> Bloggar >> Teknikbloggen >> Hantera Git med GitLab på din egna Ubuntu server med Apache och Mysql

Hantera Git med GitLab på din egna Ubuntu server med Apache och Mysql

  • Posted on: 13 January 2015
  • By: Pontus

GitHub är verkligen jättebra för att hantera utveckling men ibland vill man inte lämna över allt till någon annan. Då är det bästa att installera GitLab som är en "klon" av GitHub på din egna Ubuntu server.

GitLab har tagit fram ett .deb packet vilket är smidigt om du vill installera GitLab. Problemet är bara att den även installerar alla beroenden, Ruby, PostreSQL, Redis, Nginx. Vilket är bra om man ska installera det på en dedikerad maskin, däremot om du ska installerade det tillsammans med Apache och vill använda mysql istället för PostreSQL så får vi ta till manuella metoder.

Rekommenderade systemkrav är minst 2 kärnor, och minst 2GB RAM för att hantera upp till 500 användare. Jag kommer att installera GitLab på en server som även hanterar andra webbsidor med Apache, eftersom att GitLab endast stödjer Nginx som webbserver så kommer vi att göra så Nginx svarar på port 8181 och Apache ligger som en proxy mellan port 80 och port 8181. Databasen ligger i mitt fall på en separat databasserver, men den kan lika gärna ligga på samma server som GitLab.

Först skapar vi en användare för GitLab 

sudo adduser --disabled-login --gecos 'GitLab' git

Adding user `git' ...

Adding new group `git' (1002) ...

Adding new user `git' (1002) with group `git' ...

Creating home directory `/home/git' ...

Copying files from `/etc/skel' ...

Sen installerar vi de paketet som krävs.

sudo apt-get install build-essential cmake 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

Installera Git

sudo apt-get install git

och postfix för att hantera mail

sudo apt-get install postfix

När konfigurationen kommer upp så anger du "Internet site".

Konfigurera Postfix som internet värd

Rutan efter så anger du din domän. Om du behöver installera en fullständiga mailserver för att hantera konto så kommer det förmodligen att komma en guide här för det.

Ange domänen för Postfix

 

Installera Ruby

Även om GitLab är ett Ruby on Rails program så saknas det tyvärr stöd för versionshanterare såsom RVM och rbenv. Dessutom krävs det minst version 2.0 av Ruby, standard i Ubuntu 14.04 är 1.9.3. Så först ta vi bort Ruby om det är installerat.

sudo apt-get remove ruby

Reading package lists... Done

Building dependency tree       

Reading state information... Done

Package 'ruby' is not installed, so not removed

0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.

Senaste versionen av Ruby är när det här skrivs 2.1.5 så det är den vi laddar ner och kompilerar nu.

mkdir /tmp/ruby && cd /tmp/ruby

wget http://ftp.ruby-lang.org/pub/ruby/2.1/ruby-2.1.5.tar.gz 

tar xvzf ruby-2.1.5.tar.gz

cd ruby-2.1.5

./configure --disable-install-rdoc --prefix=/usr/local

make

sudo make install

Kontrollera så att kompileringen fungerade.

$ ruby -v

När kompileringen är klar  så konfigurerar vi databasen. Jag har valt att separera databasen och lägga den på en egen server som här kommer att heta db01, vi utgår här även ifrån att vi redan har installera mysql på den servern.

Börja med att lägga till användare git och skapa databasen gitlab.

mysql -u user -p -h db01

mysql> create user 'git'@'x.x.x.x' identified by 'password';

mysql> create database git DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci;

mysql> grant all on git.* to 'git'@'x.x.x.x';

Ersätt x.x.x.x med ip-nummret till din webbserver, alternativt ersätt det med % om du vill tillåta att man ska kunna ansluta från hela internet, det är osäkert och rekommenderas inte. 

Installera GitLab

Nu är det dags att installera GitLab hemkatalogen för användaren git.

cd /home/git

Ladda ner GitLabs källkod, vi laddar här ner version 7.5-stable som i skrivande stund är den senaste. Men du kan ladda ner vilken du känner för, du bör dock inte använda master på en produktionsmaskin.

sudo -u git -H git clone https://gitlab.com/gitlab-org/gitlab-ce.git -b 7-5-stable gitlab

cd gitlab

Skapa konfigurationsfilen.

sudo -u git -H cp config/gitlab.yml.example config/gitlab.yml

Öppna filen.

sudo joe config/gitlab.yml

I början av filen, på rad 20 närmare bestämt, har du värdet för host som vi ska ändra.

host: localhost 

Ändra localhost till adressen för din server, till exempel www.example.com. Sedan går vi till rad 45.

email_from: example@example.com

Ändra example@example.com till den mailadress som du vill att mailen ska ha som avsändare.

Nu ändrar vi lite rättigheter för en del av filerna och ställer in lite inställningar för git.

cd /home/git/gitlab

sudo chown -R git log/

sudo chown -R git tmp/

sudo chmod -R u+rwX  log/

sudo chmod -R u+rwX  tmp/

sudo -u git -H mkdir /home/git/gitlab-satellites

sudo chmod u+rwx,g=rx,o-rwx /home/git/gitlab-satellites

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/

sudo -u git -H mkdir public/uploads

sudo chmod -R u+rwX  public/uploads

sudo -u git -H cp config/unicorn.rb.example config/unicorn.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

sudo -u git cp config/database.yml.mysql config/database.yml

För mig säger den att tmp/pids, tmp/sockets och public/uploads redan finns men de får ligga kvar här ifall de inte finns för dig.

Ändra inställningarna för databasen genom att öppna config/databse.yml

sudo joe config/database.yml

Rad 9, 11 - 13 innehåller följande som vi ändrar efter vår databasmiljö. På rad elva får vi ta bort # framför host för att vi ska kunna ställa in vilken maskin som databasen ligger på.

database: gitlabhq_production

 

username: git

password: "secure password"

# host: localhost

Spara och stäng sedan filen därefter ändrar vi rättigheterna på filen så att användare på servern inte kan läsa vårat lösenord.

sudo -u git -H chmod o-rwx config/database.yml

Installera bundler, GitLab Shell mm

Nu installerar vi lite mer saker som behövs.

Observerera att det fjärde kommandot säger "without" alltså utan postgresql, skulle vi använda postgresql istället så hade kommandot sett ut så här "sudo -u git -H bundle install --deployment --without development test mysql aws". Det här var en sak som jag missade först vilket gjorde att installationen av GitLab Shell misslyckades på grund av att pg_config saknades, vilket är för postgresql.

Vi installerar även biblioteken för mysql klienten eftersom att mysql inte är installerat på den här maskinen, skulle databasen ligga på samma maskin så är det redan installerat.

sudo gem install bundler

sudo apt-get install libmysqlclient-dev

gem install mysql2 -v '0.3.16'

sudo -u git -H bundle install --deployment --without development test postgres aws

 sudo -u git -H bundle exec rake gitlab:shell:install[v2.2.0] REDIS_URL=redis://localhost:6379 RAILS_ENV=production

Så konfigurerar vi GitLab shell

sudo joe /home/git/gitlab-shell/config.yml

Kontrollera så att gitlab_url är samma som adressen till servern därefter sparar och stänger vi filen.

Eftersom att vi är tvungna att lägga Nginx på en annan port än standard så får vi inte glömma att ta med det i adressen här. Så om adressen till din maskin är gitlab.example.com och porten som du anvädner till Nginx är 8181 så ska rad 3 se ut enligt följande.

gitlab_url: http://gitlab.example.com:8181/

Nu skapar vi tabellerna i databasen.

sudo -u git -H bundle exec rake gitlab:setup RAILS_ENV=production 

Den kommer nu att meddela att den kommer att skapa alla tabeller och att om det finns några tabeller så kommer de att raderas. Eftersom att vi precis har skapat databasen så är den tom vilket betyder att det är bara att svara yes.

This will create the necessary database tables and seed the database.

You will lose any previous data stored in the database.

Do you want to continue (yes/no)? 

När scriptet är klart så kommer inloggningsuppgifterna för administratören.  

Administrator account created:

login.........root

password......5iveL!fe

Nu installerar vi init-scripten som ser till så att GitLab startar när vi startar datorn.

sudo cp lib/support/init.d/gitlab /etc/init.d/gitlab

sudo update-rc.d gitlab defaults 21

Aktivera log-rotation.

sudo cp lib/support/logrotate/gitlab /etc/logrotate.d/gitlab

Kontrollera så att installationen har gått rätt till.

sudo -u git -H bundle exec rake gitlab:env:info RAILS_ENV=production

Resultatet bör se ut ungefär såhär.

System information

System:         Ubuntu 14.04

Current User:   git

Using RVM:      no

Ruby Version:   2.1.5p273

Gem Version:    2.2.2

Bundler Version:1.7.9

Rake Version:   10.3.2

Sidekiq Version:2.17.0

 

GitLab information

Version:        7.5.3

Revision:       b656b85

Directory:      /home/git/gitlab

DB Adapter:     mysql2

URL:            http://gitlab.example.com

HTTP Clone URL: http://gitlab.example.com/some-project.git

SSH Clone URL:  git@gitlab.example.com:some-project.git

Using LDAP:     no

Using Omniauth: no

 

GitLab Shell

Version:        1.9.4

Repositories:   /home/git/repositories/

Hooks:          /home/git/gitlab-shell/hooks/

Git:            /usr/bin/git

Kompilera assets.

sudo -u git -H bundle exec rake assets:precompile RAILS_ENV=production

Konfigurera Git inställningarna för git användaren. Se till ändra mailadress i user.email till samma som i config/gitlab.yml.

sudo -u git -H git config --global user.name "GitLab"

sudo -u git -H git config --global user.email "gitlab@example.com"

sudo -u git -H git config --global core.autocrlf input

Dags att starta GitLab.

sudo service gitlab start

Installera och konfigurera Nginx till GitLab

Tyvärr stödjer inte GitLab Apache som webbserver vilket betyder att vi måste använda oss av Nginx, som är den enda webbservern som stöds. Eftersom Apache redan använder port 80 på den här maskinen så kommer vi att konfigurera Nginx till en annan port och därefter lägga till en virtuell värd i Apache som agerar forward proxy till Nginx. Det betyder att vi när vi surfar in till våran GitLab installation så är det Apache som webbläsaren kommer att begära sidan ifrån, Apache kommer sedan att hämta den begärda sidan från Nginx webbservern och därefter skicka den till webbläsaren.

Vi börjar således med att installera Nginx.

sudo apt-get install nginx

Kopiera exempelkonfigurationen från GitLab till Nginx, ta bort standard värden och aktivera gitlab värden.

sudo cp lib/support/nginx/gitlab /etc/nginx/sites-available/gitlab

sudo rm /etc/nginx/sites-enabled/default

Därefter konfigurerar värden för gitlab.

sudo joe /etc/nginx/sites-available/gitlab

Med början på rad 37 har vi nedanstående.

listen 0.0.0.0:80 default_server;

listen [::]:80 default_server;

server_name YOUR_SERVER_FQDN;

Första två raderna talar om för Nginx vilket ip-nummer och vilken port den ska lyssna på. Eftersom att port 80 är upptagen av Apache så ändrar vi det till 8181. Sista raden ändrar vi YOUR_SERVER_FQDN med adressen till våran server, gitlab.example.com.

Så här ska det alltså se ut när vi är klara.

listen 0.0.0.0:8181 default_server;

listen [::]:8181 default_server;

server_name gitlab.example.com;

Spara och stäng filen när du är klar.

Därefter aktiverar vi gitlab värden och startar om Nginx för att aktivera GitLab. 

cd /etc/nginx/sites-enabled

sudo ln -s ../sites-available/gitlab gitlab 

sudo service nginx restart

Installera med deb paket 

Ibland vill man bara installera snabbt och enkelt, då är det färdiga paketet jättebra. Det underlättar även vid uppgraderingar, enklare att bara köra apt-get upgrade. Därför lägger jag här till hur installationen går till med pakethanteraren, det innebär att lägga till gitlabs repository och installera paketet.

Med Ubuntu 12.04 och 14.04 så är det bara att köra scriptet från Gitlabs nerladdningssida. Tyvärr fungerar det inte om man kör andra versioner, till exempel Ubuntu 15.04 som jag kör just nu. Då får man göra lite manuella åtgärder efteråt för att det ska fungera.

Börja med att köra scriptet från Gitlab

$ curl https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.deb.sh | sudo bash

Om du kör någon annan version än 12.04 och 14.04 så får man ändra följande rader i  /etc/apt/sources.list.d/gitlab_gitlab-ce.list

deb https://packages.gitlab.com/gitlab/gitlab-ce/ubuntu/ vivid main
deb-src https://packages.gitlab.com/gitlab/gitlab-ce/ubuntu/ vivid main

TIll

deb https://packages.gitlab.com/gitlab/gitlab-ce/ubuntu/ trusty main
deb-src https://packages.gitlab.com/gitlab/gitlab-ce/ubuntu/ trusty main

Det vi gör här är att vi säger till apt att hämta paketen som är gjorda till trusty (Ubuntu 12.04) istället. Problemet är nämligen att annars försöker den hämta paketen till vivid ( Ubuntu 15.04 ) som inte finns.

Därefter kan vi installera

$ sudo apt-get update

$ sudo apt-get install gitlab-ce

När installationen är klar så konfigurerar vi gitlab med 

$ sudo gitlab-ctl reconfigure

Nu ska det fungera att logga in på installationen. För att ändra portar och använda externa databas och liknande så redigerar man inställningarna i /etc/gitlab/gitlab.rb. 

Observera att Community Edition endast stödjer Postgre SQL som databas vid paketinstallationen.  Mycket möjligt att det går att ändra och använda mysql istället men för mig var det enklare att konvertera databasen från MySQL till Postgre istället i samband med ett serverbyte som föranlede bytet till pakethanteringen.

Kontrollera installationen och testa i webbläsaren

Innan vi testar med webbläsaren om det fungerar så kollar vi så att installationen fungerar.

cd /home/git/gitlab

sudo -u git -H bundle exec rake gitlab:check RAILS_ENV=production

Om alla tester är gröna eller lila så är allting ok.

Annars är det dags att felsöka. Om GitLab API access svarar med Error 404 eller (Errno::ECONNREFUSED) så ligger problemet i Nginx. Där hade jag problme i början eftersom att jag första gången glömde bort att ange rätt port i /home/git/gitlab-shell/config.yml

Dags att testa om det går att surfa in på webbsidan. Öppna webbläsaren och skriv in addressen till din server, glöm inte att ange rätt port till Nginx. I mitt exempel här ska vi ange gitlab.example.com:8181.

Om allting fungerar som det ska så kommer du att se följande bild.

Första starten av GitLab

Logga in med uppgifter som vi fick under installationen. Om du inte heller skrev upp de så är det:

Användar namn: root

Lösenord: 5iveL!fe

Efter inloggning kommer följande bild där vi måste byta lösenord. Ange först det nuvarande lösenordet (5iveL!fe) därefter anger du det nya som du vill använda 2 gånger. När lösenordet är bytt så blir du utloggad och du får då logga in igen med det nya lösenordet.

man måste byta lösenordet första gången man loggar in i GitLab

Konfigurerar Apache som reverse proxy för GitLab

Nu fungerar GitLab och allt är frid fröjd, eller? Nja eftersom att Nginx svarar på port 8181 så är installationen inte riktigt optimal. Visst du kanske kommer ihåg att ange porten varje gång du ska ansluta men anledningen till att man installerar GitLab är ju oftast för att man ska vara flera som arbetar med samma kod. För att slippa standard frågan att det inte fungerar för att de har glömt att ange :8181 när de försöker ansluta så konfigurerar vi Apache som en reverse proxy som då svarar på port 80 och därefter hämtar Apache sidorna från Nginx server för att slutligen skicka sidan till besökaren.

Jag utgår ifrån att Apache redan är installerad och är igång och rullar. För att aktivera reverse proxy så behöver vi installera paketet libapache2-mod-proxy-html som innehåller modulerna som behövs. Därefter aktiverar vi de moduler som behövs och startar om webbservern så vi ser att allt fungerar. 

sudo apt-get install libapache2-mod-proxy-html

sudo a2enmod  proxy

sudo a2enmod proxy_http

sudo a2enmod headers

sudo service apache2 restart

Därefter skapar vi configurations filen för den nya "hemsidan", som vanligt använder jag joe för att redigera filer men du kan självklar använda din favorit. Ändra filnamnet till en som passar din domän.

cd /etc/apache2/sites-available/

sudo joe gitlab.example.com.conf

I konfigufationsfilen skapar vi först den nya virtuella värden, observera att jag hoppar över direktivet för DocumentRoot eftersom att vi inte kommer att hantera några filer på den här adressen utan alla förfrågningar skickas vidare till Nginx servern. Ändra gitlab.example.com till adressen för din server. 

<VirtualHost *:80>

        ProxyRequests off

        ServerName gitlab.example.com

        ServerAdmin webmaster@example.com

        ErrorLog ${APACHE_LOG_DIR}/gitlab.example.com.error.log

        CustomLog ${APACHE_LOG_DIR}/gitlab.example.com.access.log combined

        ProxyPreserveHost On

        ProxyPass / http://localhost:8181/

        ProxyPassReverse / http://gitlab.example.com:8181/

</VirtualHost>

De mesta direktiven är standard för att aktivera en ny virtuell värd, skillnaden är de sista 2 raderna och att vi saknar DocumentRoot.

ProxyPass  Anger vilken adress på den här servern som ska hämtas från en annan server. Så om vi istället för / anger /gitlab/ så skickas bara begäran till den katagogen vidare till den adressen vi anger. Istället för http://localhost:8181/ kan vi ange i princip vilken adress som helst som den här servern kan ansluta till. Tänk dock på att om det första direktivet slutar med / så måste även det andra göra det.
ProxyPassReverse Den här ändrar svars huvudet från servern så att webbläsaren ser det som att sidan kommer från gitlab.example.com istället för värdnamnet för localhost. Det ser 

Aktivera nya värden.

sudo a2ensite gitlab.example.com

sudo service apache2 restart

Testa slutligen att det fungerar genom att gå in på gitlab.example.com, du ska nu se din gitlab server.

Om du använder SSL till gitlab.example.com så ska <VirtualHost gitlab.example.com:80> ändras till <VirtualHost gitlab.example.com:443>. Därefter behöver följande rader läggas till.

SSLEngine On

SSLCertificateFile /etc/apache2/ssl/file.pem

Nu ska du ha din egna GitLab server installerad och klar. Bara att börja använda.