GitLab v8.x konfigurace

1. Požadavky

2. Odkazy

3. Instalace GitLab v8.x

Na internetu můžete najít nespočet variací, jak nainstalovat GitLab na FreeBSD server. Tento návod vychází z postupů ve výše uvedených odkazech a jak poznamenal Charles Newey na svém blogu, nejprve si vždy přečtěte oficiální instalační příručku uvedenou na serveru GitLab.

Následující postup byl vyzkoušen na FreeBSD server s použitím jail. PostgreSQL server byl nainstalován na jiném počítači.

Připojte se pomocí SSH k FreeBSD serveru, připojte se k vytvořenému jail, kde bude GitLab instalován (jexec gitlab tcsh) a nainstalujte základní balíčky pro instalaci GitLab.

jexec gitlab tcsh
pkg update && pkg upgrade
# Install system packages
pkg install sudo bash icu cmake gmake libxslt libxml2 libgit2 pkgconf git rubygem-bundler rubygem-rake node012 logrotate redis krb5 python2
# Install go compiler for gitlab-git-http-server compilation
pkg install go
# For PostgreSQL server on the different machine install only PostgreSQL client package
pkg install postgresql94-client
# When you install PostgreSQL server on the same machine you have to install these packages
# pkg install postgresql94-server postgresql94-contrib

Aktualizujte rubygems a nainstalujte bundler.

gem update --system
gem install bundler --no-ri --no-rdoc

Přidejte/upravte následující řádky do souboru '/etc/rc.conf' pro automatické spouštění požadovaných serverů při startu jail.

# edit in the rc.conf file - Core services
sshd_enable="YES"

# execute in the shell
echo '# GitLab services' >> /etc/rc.conf
echo 'redis_enable="YES"' >> /etc/rc.conf
echo 'gitlab_enable="YES"' >> /etc/rc.conf

4. Vytvoření git uživatele

Vytvoření GitLab uživatele 'git' provedeme pomocí následujích přikazů. Zárověň přidáme tohoto uživatele i do skupiny 'redis' (bude to užitečné později).

pw add user -n git -m -s /usr/local/bin/bash -c "GitLab"
pw user mod git -G redis

5. Nastavení PostgreSQL databáze

Vytvoříme databázového uživatele 'git' a a vytvoříme databázi pro GitLab. Následující přikazy spusťte na počítači, kde je nainstalován PostgreSQL. Nejprve se připojíme k výchozí databázi.

su - pgsql
psql -d template1

Po připojení k databázi vytvoříme GitLab uživatele, potom vytvoříme produkční databázi a následně nastavíme příslušná oprávnění k databází.

CREATE USER git CREATEDB;
ALTER USER git WITH PASSWORD '<your_password>';
CREATE DATABASE gitlabhq_production OWNER git;
\connect gitlabhq_production
CREATE EXTENSION pg_trgm;
\q
  • Poznámka: Pokud nechcete databázi zabezpečovat, příkaz 'ALTER ...' nepoužijte.

Nakonec použijte příkaz 'exit' pro ukončení SQL shell a vyzkoušejte připojení k nově vytvořené databázi jako uživatel git.

exit
su - git
psql -d gitlabhq_production
\q

# exit git user shell
exit

6. Instalace a nastavení Redis

Proveďte zálohu originálního konfiguračního souboru Redis a upravte konfigurační soubor pomocí následujícíh příkazů.

cp /usr/local/etc/redis.conf /usr/local/etc/redis.conf.orig

# Disable Redis listening on TCP by setting 'port' to 0
sed 's/^port .*/port 0/' /usr/local/etc/redis.conf.orig | tee /usr/local/etc/redis.conf

# Enable Redis socket
echo 'unixsocket /usr/local/var/run/redis/redis.sock' | tee -a /usr/local/etc/redis.conf

# Grant permission to the socket to all members of the redis group
echo 'unixsocketperm 770' | tee -a /usr/local/etc/redis.conf

# Create the directory which contains the socket
mkdir -p /usr/local/var/run/redis
chown redis:redis /usr/local/var/run/redis
chmod 755 /usr/local/var/run/redis

# Restart redis
service redis restart

7. Instalace a nastavení GitLab

Přesuňte se do adresáře uživatele git a stáhněte zdrojové soubory GitLab (zkontrolujte poslední verzi na webu Gitlab).

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

cd /home/git/gitlab
sudo -u git -H git fetch --all
sudo -u git -H git checkout -- Gemfile.lock db/schema.rb
sudo -u git -H git checkout LATEST_TAG -b LATEST_TAG
  • Poznámka:
    • Přepište LATEST_TAG na verzi GitLab, kterou chcete použít, např. v8.7.2. Příkaz `git tag -l 'v*.[0-9]' --sort='v:refname'` vypíše seznam všech verzí.
    • Změňte '8-7-stable' na poslední verzi GitLab
    • Můžete změnit '8-7-stable' na 'master' pokud chcete používat vývojovou verzi. Verze 'master' není určena k použití na produkčním serveru!

Přesuňte se do adresáře GitLab a proveďte konfiguraci GitLab.

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

GitLab nemá rád symbolické odkazy a ve FreeBSD adresář '/home/' je odkazem na adresář '/usr/home'. V konfiguraci Gitlab provedeme změny na dvou místech.

sed -i '.bak' 's/usr\/bin\/git/usr\/local\/bin\/git/g' config/gitlab.yml
sed -i '.bak' 's/home\/git/usr\/home\/git/g' config/gitlab.yml

V konfiguračním souboru GitLab změňte položku 'host', která bý měla obsahovat název vaší domény nebo vaši IP adresu, např. "gitlab.mysite.com". V položce 'bin_path' musí být nastavena správná cesta ke spustitelnému souboru git, např. '/usr/local/bin/git'.

vi config/gitlab.yml

Zkopírujte soubor secrets.yml.

sudo -u git -H cp config/secrets.yml.example config/secrets.yml
sudo -u git -H chmod 0600 config/secrets.yml
  • Poznámka: Bezpečně uložte soubor secrets.yml. Soubor obsahuje šifrovací klíče pro jednotlivé relace pro zabezpečení proměnných. Zálohujte soubor secrets.yml na jiném místě, než kde je uložena záloha databáze.

Nastavení odpovídajích oprávnění pro dočasné adresáře a soubory.

# Make sure GitLab can write to the log/ and tmp/ directories
cd /home/git/gitlab
chown -R git log/
chown -R git tmp/
chmod -R u+rwX,go-w log/
chmod -R u+rwX tmp/

# Make sure GitLab can write to the tmp/pids/ and tmp/sockets/ directories
chmod -R u+rwX tmp/pids/
chmod -R u+rwX tmp/sockets/

# Make sure GitLab can write to the public/uploads/ directory
mkdir -p -m 700 public/uploads
mkdir -p -m 755 public/uploads/tmp
chown -R git public/uploads/

Zkopírujte ukázkový konfigurační soubor pro Unicorn a proveďte konfiguraci Unicorn serveru. Pokud očekáváte vysokou zátěž jednotlivých instancí, povolte 'cluster mode' a změňte počet procesů, např. pro 2GB RAM server je odpovídající počet procesů 3. Počet procesů by měl minimálně odpovídat počtu procesorových jader. Nezapoměňte nastavit IP adresu, na které bude Unicorn server odpovídat na požadavky.

sudo -u git -H cp config/unicorn.rb.example config/unicorn.rb

# set listen IP and port of GitLab (choose different port as Redmine)
# listen 127.0.0.1:8080
vi config/unicorn.rb

Zkopírujte ukázkový konfigurační soubor pro Rack a případně si jej upravte podle svých potřeb.

sudo -u git -H cp config/initializers/rack_attack.rb.example config/initializers/rack_attack.rb

Nastavte globální parametry pro Git. Je to užitečné zejména pro práci přes WWW rozhraní. Nastavte proměnnou 'user.email' stejně, jako je nastavena v konfiguračním souboru 'gitlab.yml'.

#sudo -u git -H git config --global user.name "GitLab"
#sudo -u git -H git config --global user.email "example@example.com"
sudo -u git -H git config --global core.autocrlf input

Zkopírujte konfigurační soubor pro Redis a změňte nastavení tak, aby Redis používal unix socket.

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

# Change 'production' line to 'unix:/usr/local/var/run/redis/redis.sock'
sed -i '.bak' "s/production:.*$/production: unix:\/usr\/local\/var\/run\/redis\/redis.sock/g" config/resque.yml
  • Důležitá poznámka:
    • Ujistěte se, že oba konfigurační soubory 'gitlab.yml' a 'unicorn.rb' obsahují stejné hodnoty pro odpovídající parametry.
    • Pokud nastavíte git repositář mimo jail, nastavte cestu k repozitáři v položce 'repos_path' v souboru 'config/gitlab.yml'. Adresář vytvoříte a nastavíte mu potřebná oprávnění pomocí příkazů:
      mkdir -p /mnt/git/repositories/
      chown -R git:git /mnt/git/repositories

8. Konfigurace GitLab databáze

Zkopírujte a nastavte konfigurační soubor GitLab pro postgreSQL databázi. Nastavte stejné heslo a název databáze, které jste použili při vytváření databázového uživatele 'git' v bodu 5).

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

# Make config/database.yml readable to git only
sudo -u git -H chmod o-rwx config/database.yml

# Update database connection. Use section 'production' for changes
#sed -i '.bak' "s/password/\$<your_password>/g" config/database.yml

9. Nastavte GitLab shell

GitLab Shell je software vyvinutý speciálně pro GitLab pro zabezpečený SSH přístup a správu repositářů. Nejprve musíme nainstalovat Ruby Gems.

cd /home/git/gitlab
sudo -u git -H bundle install --deployment --without development test mysql aws
  • Poznámka:
    • Pokud se při instalaci timfel-krb5-auth-0.8.3 objeví chyba, vložte řádek uvedený níže do souboru '.bundle/config'
      BUNDLE_BUILD__TIMFEL-KRB5-AUTH: --with-ldflags=-L. -Wl,-O1 -Wl,--as-needed -fstack-protector -rdynamic -Wl,-export-dynamic -Wl,--no-undefined -lcom_err
    • V případě SSL chyby upravte protokol http na https v souboru 'Gemfile'.
      sed -i '' "s/https/http/g" Gemfile

Pro instalaci gitlab-shell použijeme rake.

sudo -u git -H bundle exec rake gitlab:shell:install[v2.6.5] REDIS_URL=unix:/usr/local/var/run/redis/redis.sock RAILS_ENV=production
sudo -u git -H sed -i '.bak' 's/: \/home\/git/: \/usr\/home\/git/g' /home/git/gitlab-shell/config.yml
cd /home/git/gitlab-shell
sudo -u git -H git fetch
sudo -u git -H git checkout v`cat /home/git/gitlab/GITLAB_SHELL_VERSION` -b v`cat /home/git/gitlab/GITLAB_SHELL_VERSION`
cd /home/git/gitlab
  • Poznámka: version shellu [2.6.5] by měla odpovídat verzi uvedené v souboru '/home/git/gitlab/GITLAB_SHELL_VERSION'

Upravte konfigurační soubor pro gitlab-shell. Změňte parametr 'socket' na '/usr/local/var/run/redis/redis.sock' (viz. konfigurace Redis). Změňte parameter 'gitlab_url' na 'http://127.0.0.1:8080/' (IP adresa a port musí být stejné, jako jsou uvedeny v konfiguračním souboru 'config/unicorn.rb'). Netrapte se nastavováním SSL, protože spojení je používáno pouze interně.

vi /home/git/gitlab-shell/config.yml

#gitlab_url: http://127.0.0.1:8080/
#socket: "/usr/local/var/run/redis/redis.sock"

# exit git user shell
exit

10. Instalace gitlab-git-http-server - OBSOLETE

Nahrazen Gitlab-Workhorse.
cd /home/git
sudo -u git -H git clone https://gitlab.com/gitlab-org/gitlab-git-http-server.git
cd gitlab-git-http-server
sudo -u git -H make

10. Instalace gitlab-workhorse

Gitlab-workhorse je deamon obsluhující Git HTTP datový přenos y unicorn, napsaný v Go. Gitlab-workhorse byl navržen tak, aby ulevil GitHHTP datovým přenosům z GitLab Rails app (Unicorn) jako vlastní daemon. Obsluhuje také stahování 'git archivů' v rámci GitLab. Veškerá autentizační a autorizační logika je stále zaležitostí GitLab Rails app.
cd /home/git
sudo -u git -H git clone https://gitlab.com/gitlab-org/gitlab-workhorse.git
cd gitlab-workhorse
sudo -u git -H git fetch
sudo -u git -H git checkout v`cat /home/git/gitlab/GITLAB_WORKHORSE_VERSION` -b v`cat /home/git/gitlab/GITLAB_WORKHORSE_VERSION`
sudo -u git -H make

11. Inicializace a aktivace databáze

Spusťte následující příkazy pro inicializaci a aktivaci databáze pro GitLab. Odpovězte 'yes' na otázku na vytvoření databáze. Po uspěšné inicializaci se objeví hlášení 'Administrator account created:'.

cd /home/git/gitlab
sudo -u git -H bundle exec rake gitlab:setup RAILS_ENV=production GITLAB_ROOT_PASSWORD="your_password"
  • Poznámka: Administrátorské heslo můžete nastavit pomocí proměnné GITLAB_ROOT_PASSWORD. Pokud heslo nenastavíte, bude použito výchozí adminstrátorské heslo a v tomto případě nepoužívejte GitLab veřejně, dokud toto výchozí heslo nezměníte.

12. Příprava spouštěcího skriptu GitLab

Zkopírujte a případně upravte ukázkový startovací skript GitLab.

cp /home/git/gitlab/lib/support/init.d/gitlab /usr/local/etc/rc.d/gitlab

Při použití ve FreeBSD jsem měl problém s automatickým startem GitLab po restartu počítače. Připojená aktualizace spouštěcího souboru tento problém řeší.

--- gitlab.orig 2015-12-09 11:00:58.000000000 +0100
+++ gitlab  2015-12-09 11:00:56.000000000 +0100
@@ -4,17 +4,11 @@
 # Maintainer: @randx
 # Authors: rovanion.luckey@gmail.com, @randx
 
-### BEGIN INIT INFO
-# Provides:          gitlab
-# Required-Start:    $local_fs $remote_fs $network $syslog redis-server
-# Required-Stop:     $local_fs $remote_fs $network $syslog
-# Default-Start:     2 3 4 5
-# Default-Stop:      0 1 6
-# Short-Description: GitLab git repository management
-# Description:       GitLab git repository management
-# chkconfig: - 85 14
-### END INIT INFO
-
+### FreeBSD INIT INFO
+# PROVIDE: gitlab
+# REQUIRE: LOGIN redis
+# KEYWORD: shutdown
+### END FreeBSD INIT INFO
 
 ###
 # DO NOT EDIT THIS FILE!
@@ -23,9 +17,15 @@
 # An example defaults file can be found in lib/support/init.d/gitlab.default.example
 ###
 
+. /etc/rc.subr
 
-### Environment variables
-RAILS_ENV="production"
+name="gitlab"
+rcvar=gitlab_enable
+extra_commands="reload status"
+
+load_rc_config $name
+
+: ${gitlab_enable:=NO}
 
 # Script variable names should be lower-case not to conflict with
 # internal /bin/sh variables such as PATH, EDITOR or SHELL.
@@ -40,14 +40,20 @@
 gitlab_workhorse_pid_path="$pid_path/gitlab-workhorse.pid"
 gitlab_workhorse_options="-listenUmask 0 -listenNetwork unix -listenAddr $socket_path/gitlab-workhorse.socket -authBackend http://127.0.0.1:8080"
 gitlab_workhorse_log="$app_root/log/gitlab-workhorse.log"
-shell_path="/bin/bash"
+shell_path="/usr/local/bin/bash"
+
+### Environment variables
+RAILS_ENV="production"
+export PATH=$PATH:/usr/local/bin:/usr/local/sbin
 
 # Read configuration variable file if it is present
 test -f /etc/default/gitlab && . /etc/default/gitlab
 
 # Switch to the app_user if it is not he/she who is running the script.
 if [ `whoami` != "$app_user" ]; then
-  eval su - "$app_user" -s $shell_path -c $(echo \")$0 "$@"$(echo \"); exit;
+    eval su - "$app_user" -c $(echo \")service $name "$@"$(echo \"); exit;
+#    eval su - "$app_user" -c $(echo \")$0 "$@"$(echo \"); exit;
+#    eval su - "$app_user" -s $shell_path -c $(echo \")$0 "$@"$(echo \"); exit;
 fi
 
 # Switch to the gitlab path, exit on failure.
@@ -364,30 +370,10 @@
   start_gitlab
 }
 
+start_cmd="start_gitlab"
+stop_cmd="stop_gitlab"
+restart_cmd="restart_gitlab"
+reload_cmd="reload_gitlab"
+status_cmd="print_status"
 
-### Finally the input handling.
-
-case "$1" in
-  start)
-        start_gitlab
-        ;;
-  stop)
-        stop_gitlab
-        ;;
-  restart)
-        restart_gitlab
-        ;;
-  reload|force-reload)
-   reload_gitlab
-        ;;
-  status)
-        print_status
-        exit $gitlab_status
-        ;;
-  *)
-        echo "Usage: service gitlab {start|stop|restart|reload|status}"
-        exit 1
-        ;;
-esac
-
-exit
+run_rc_command "$1"

13. Kontrola konfigurace a nastavení rake assets

Kontrolu správnosti nastavení GitLab provedeme následujícími příkazy.

su - git
cd /home/git/gitlab
bundle exec rake gitlab:env:info RAILS_ENV=production

# exit git user shell
exit

Pokud kontrola nezobrazí chyby, můžemě přistoupit ke kompilaci rake assets pro GitLab. Tato operace může na pomalejších počítačích trvat zhruba 10-15 minut!

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

Pokud opět vše proběhlo správně, můžeme spustit GitLab službu.

service gitlab start

A následujícím příkazem otestovat běžící instanci GitLab.

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

14. Konfigurace Nginx

Nginx je oficiálně podporovaným WWW server pro GitLab a konfigurační soubor pro tento server je uložen jako soubor '/home/git/gitlab/lib/support/nginx/gitlab'. Tento soubor tak můžete použít a upravit následujícím způsobem.

cp /usr/home/git/gitlab/lib/support/nginx/gitlab /usr/local/etc/nginx/gitlab.conf

# Tell nginx where to find the gitlab server.
sed -i ".bak" "s/proxy_pass http:\/\/gitlab;/proxy_pass http:\/\/127.0.0.1:8080;/g" /usr/local/etc/nginx/gitlab.conf

# Disable gzip static. If you compile nginx from ports you can enable gzip. pkg comes with it disabled by default.
sed -i ".bak" "s/gzip_static on;/#gzip_static on;/g" /usr/local/etc/nginx/gitlab.conf

# Edit /usr/local/etc/nginx/nginx.conf and add the following line before the last }
include /usr/local/etc/nginx/gitlab.conf;

# SSL seetup
# see file install_gitlab-ssl.txt

# Check nginx setup
nginx -t

# Restart nginx, and you should be up and running.
service nginx restart

Komentáře