Installer GitLab sur Debian
GitLab est un clone libre de GitHub. Interface Web de gestion de dépôts Git. Ce guide facilite son installation depuis les sources sur Debian.
Ce guide est testé sur:
- Debian 7.0 Wheezy
Ce guide est testé avec ces versions de GitLab:
- 6.9.2
Prérequis
Ce guide nécessite :
- Sudo, comme décrit par Configurer Sudo sur Debian.
- Vim, comme décrit par Installer Vim sur Debian.
- Ruby, comme décrit par Installer Ruby sur Debian.
- un serveur Redis, comme décrit par Installer Redis sur Debian.
- a2tools, l'outil d'administration simplifiée d'Apache 2.
- un serveur PostgreSQL, comme décrit par Installer PostgreSQL sur Debian.
- pgsql-tools, l'outil d'administration simplifiée de PostgreSQL sur l'hôte local (et l'hôte du serveur PostgreSQL, si différent).
Paramètres
Renseignez le nom de domaine où sera disponible l'application:
domain="gitlab.example.com"
Renseignez le nom d'hôte du serveur PostgreSQL:
pgsqlHost="localhost"
Si le serveur PostgreSQL n'est pas local, l'outil pgsql-tools essaiera de s'y connecter avec le client PostgreSQL, ou, en cas d'échec de connexion, via une connexion SSH.
Renseignez le nom d'hôte du serveur Redis:
redisHost="localhost"
Renseignez le nom du certificat SSL à utiliser pour chiffrer l'application avec HTTPS (créé via la procédure Créer un certificat SSL / TLS sur Debian) (optionnel, recommandé):
sslKeyName="${domain}"
Paramètres de l'application
Renseignez l'adresse email envoyant les messages générés par GitLab:
fromEmail="gitlab@domain.com"
Renseignez l'adresse email du contact technique:
supportEmail="support@domain.com"
Renseignez l'URL de Redmine, s'il est utilisé en tant qu'outil de gestion de projet:
redmineUrl="https://redmine.domain.com"
Paramètres de Git
Renseignez l'email du compte Git utilisé pour les modifications de fichier par l'interface Web:
gitUserEmail='gitlab@domain.com'
Renseignez l'email du compte Git utilisé pour les modifications de fichier par l'interface Web:
gitUsername='Gitlab'
Installation
Détectez le proxy de commande (command ou sudo):
cmdProxy='command'
command type -f 'sudo' &>'/dev/null' && cmdProxy='sudo'
Déterminez le chemin d'installation:
installPath="/opt/gitlab/${domain}"
Déterminez le chemin des données:
dataPath="/var/lib/gitlab/${domain}"
Déterminez le chemin du cache:
cachePath="/var/cache/gitlab/${domain}"
Déterminez le chemin des journaux:
logPath="/var/log/gitlab/${domain}"
Déterminez les chemins utilisés par l'application:
satellitePath="${installPath}/gitlab-satellites/"
backupsPath="${installPath}/backups"
repositoriesPath="${installPath}/repositories/"
hookPath="${installPath}/gitlab-shell/hooks/"
gitlabShellPath="${dataPath}/gitlab-shell"
Assurez-vous que les dossiers existent:
${cmdProxy} mkdir --parent "${installPath}"
${cmdProxy} mkdir --parent "${dataPath}/gitlab-satellites"
${cmdProxy} mkdir --parent "${dataPath}/repositories"
${cmdProxy} mkdir --parent "${gitlabShellPath}"
${cmdProxy} mkdir --parent "${dataPath}/backups"
${cmdProxy} mkdir --parent "$(dirname "${cachePath}")"
${cmdProxy} mkdir --parent "$(dirname "${logPath}")"
Déterminez le protocole utilisé par l'application:
proto='http'
if [ -n "${sslKeyName}" -a -e "/etc/ssl/private/${sslKeyName}.key" ]; then
proto='https'
fi
Préparation de l'environnement
Installez les logiciels nécessaires:
${cmdProxy} apt-get install build-essential zlib1g-dev \
libyaml-dev libssl-dev libgdbm-dev libreadline-dev libncurses5-dev libffi-dev \
curl openssh-server checkinstall libxml2-dev libxslt-dev \
libcurl4-openssl-dev libicu-dev logrotategit-core libpq-dev \
python-docutils libpod-simple-perl libpod-simple-wiki-perl
Créez l'utilisateur git:
${cmdProxy} adduser --home "${dataPath}"--gecos 'GitLab'
\
--no-create-home --disabled-password \
--system --group git
Ajustez les permissions:
${cmdProxy} chown -R git:git "${dataPath}"
Installez les gemmes Ruby nécessaires:
${cmdProxy} gem install redcarpet RedCloth org-ruby creole wikicloth asciidoc
${cmdProxy} gem install rdoc -v 3.6.1
Création de la base de données
Créez l'utilisateur privilégié :
pgsqlParams="$(command pgsql-tools --server="${pgsqlHost}" --user-prefix="gitlab" \
--db-prefix="gitlab" --create="${domain}" --auto-hosts --createdb)"
Récupérez les paramètres de la nouvelle base de données:
pgsqlDb="$(echo "${pgsqlParams}" | command grep -e "^PGSQL_DB" \ | command cut --delimiter="=" --fields="2-")"
pgsqlUser="$(echo "${pgsqlParams}" | command grep -e "^PGSQL_USER" \ | command cut --delimiter="=" --fields="2-")" pgsqlPassword="$(echo "${pgsqlParams}" | command grep -e "^PGSQL_PASSWORD" \ | command cut --delimiter="=" --fields="2-")" echo "${pgsqlParams}"
Créez un fichier temporaire contenant les paramètres de connexion à la base de données:
pgPassFile="$(command mktemp -t "tmp.XXXXXXXXXX")"
command chmod go-rw "${pgPassFile}"
echo "${pgsqlHost}:*:*:${pgsqlUser}:${pgsqlPassword}" > "${pgPassFile}"
Créez la structure de la base de données:
env PGPASSFILE="${pgPassFile}" psql --host="${pgsqlHost}" --dbname "${pgsqlDb}" \
--username "${pgsqlUser}" --file="${installPath}/structure.sql"
Mise en place du logiciel
Détectez le numéro de la dernière version stable:
version="$(command wget --quiet 'https://gitlab.com/gitlab-org/gitlab-ce/tree/master' -O - \
| command grep -- '-stable' \
| command cut --delimiter='"' --fields=2 \
| command tail -n 1)"
Téléchargez les sources du logiciel:
${cmdProxy} git clone 'https://gitlab.com/gitlab-org/gitlab-ce.git' -b "${version}" "${installPath}"
Ajustez l'emplacement des dossiers:
${cmdProxy} mv "${installPath}/log" "${logPath}"
${cmdProxy} ln -s "${logPath}" "${installPath}/log"
${cmdProxy} mv "${installPath}/tmp" "${cachePath}"
${cmdProxy} ln -s "${cachePath}" "${installPath}/tmp"
${cmdProxy} mv "${installPath}/public/uploads" "${dataPath}"
${cmdProxy} ln -s "${dataPath}/uploads" "${installPath}/public/uploads"
${cmdProxy} mkdir "${dataPath}/assets"
${cmdProxy} ln -s "${dataPath}/assets" "${installPath}/public/assets"
${cmdProxy} mv "${installPath}/vendor" "${dataPath}"
${cmdProxy} ln -s "${dataPath}/vendor" "${installPath}/vendor"
Ajustez les permissions:
${cmdProxy} chown git:git "${installPath}"
${cmdProxy} chown -R git:git "${dataPath}" "${logPath}" "${cachePath}"
${cmdProxy} chmod -R 770 "${dataPath}" "${logPath}" "${cachePath}"
Configuration de GitLab
Créez le fichier de configuration de la base de données:
echo "production:
adapter: postgresql
encoding: unicode
database: ${pgsqlDb}
pool: 10
username: ${pgsqlUser}
password: ${pgsqlPassword}
host: ${pgsqlHost}
port: 5432" > "${installPath}/config/database.yml"
if [[ "${pgsqlHost}" = 'localhost' ]]; then
echo " socket: /var/run/postgresql/.s.PGSQL.5432" >> "${installPath}/config/database.yml"
fi
Créez le fichier de configuration:
${cmdProxy} cp "${installPath}/config/gitlab.yml.example" "${installPath}/config/gitlab.yml"
Ajustez la configuration:
${cmdProxy} sed -i \
-e "s/host: localhost/host: ${domain}/" \
-e "s/ email_from: .*/ email_from: ${fromEmail}/" \
-e "s/ support_email: .*/ support_email: ${supportEmail}/" \
-e "/issues_tracker:/a\\
redmine:\\
title: 'Redmine'\\
project_url: '${redmineUrl}/projects/:issues_tracker_id'\\
issues_url: '${redmineUrl}/issues/:id'\\
new_issue_url: '${redmineUrl}/projects/:issues_tracker_id/issues/new'" \
"${installPath}/config/gitlab.yml"
Ajustez le protocole si nécessaire:
if [ -n "${sslKeyName}" -a -e "/etc/ssl/private/${sslKeyName}.key" ]; then
${cmdProxy} sed -i \
-e 's/port: 80/port: 443/' \
-e 's/https: false/https: true/' \
"${installPath}/config/gitlab.yml"
fi
Configurez les chemins:
${cmdProxy} sed -i \
-e "s|/home/git/gitlab-satellites/|${satellitePath}|" \
-e "s|tmp/backups|${backupsPath}|" \
-e "s|/home/git/repositories/|${repositoriesPath}|" \
-e "s|/home/git/gitlab-shell/hooks/|${hookPath}|" \
-e "s|/home/git/gitlab-shell/|${gitlabShellPath}|" \
-e "s|/usr/bin/git|$(command -v 'git')|" \
"${installPath}/config/gitlab.yml"
Créez le fichier de configuration de Rack Attack:
${cmdProxy} cp "${installPath}/config/initializers/rack_attack.rb.example" "${installPath}/config/initializers/rack_attack.rb"
Créez le fichier de configuration de Resque:
${cmdProxy} cp "${installPath}/config/resque.yml.example" "${installPath}/config/resque.yml"
${cmdProxy} sed -i -e "s/redis.example.com/${redisHost}/" "${installPath}/config/resque.yml"
Configurez l'envoi des emails:
command echo "if Rails.env.production?
Gitlab::Application.config.action_mailer.delivery_method = :smtp
ActionMailer::Base.smtp_settings = {
address: \"localhost\",
port: 25,
enable_starttls_auto: false
}
end" \
| ${cmdProxy} tee "${installPath}/config/initializers/smtp_settings.rb"
Configuration du serveur HTTP Unicorn
GitLab est fournit avec le serveur HTTP Unicorn. Créez le fichier de configuration:
${cmdProxy} cp "${installPath}/config/unicorn.rb.example" "${installPath}/config/unicorn.rb"
Ajustez la configuration:
${cmdProxy} sed -i \
-e "s|/home/git/gitlab/tmp|${cachePath}|" \
-e "s|/home/git/gitlab/log|${logPath}|" \
-e "s|/home/git/gitlab|${installPath}|" \
"${installPath}/config/unicorn.rb"
Remarque: si votre serveur est destiné à supporter de fortes charges et qu'il dispose d'au moins 2Go de mémoire, augmentez le nombre de threads de Unicorn:
# ${cmdProxy} sed -i -e 's|^worker_processes.*$|worker_processes 3|' "${installPath}/config/unicorn.rb"
Configuration de Git
Renseignez l'utilisateur par défaut de Git:
sudo -u 'git' -H git config --global user.name "${gitUsername}"
sudo -u 'git' -H git config --global user.email "${gitUserEmail}"
sudo -u 'git' -H git config --global core.autocrlf input
Installation des dépendances
Installez les dépendances de GitLab:
command pushd "${installPath}"
sudo -u 'git' -H bundle install --deployment --without development test mysql aws
command popd
Installation de GitLab Shell
Détectez la dernière version de l'application:
version="$(command wget --quiet --no-check-certificate "https://github.com/gitlabhq/gitlab-shell" -O - \
| command grep "tree/v" \
| command head -n 1 \
| command sed -e 's|.*/tree/\(v.*\)"|\1|')"
Installez l'application:
command pushd "${installPath}"
sudo -u git -H bundle exec rake gitlab:shell:install[${version}] REDIS_URL="redis://${redisHost}:6379" RAILS_ENV=production
command popd
Initialisation de la base de données
Initialisez le contenu de la base de données:
command pushd "${installPath}"
sudo -u git -H bundle exec rake gitlab:setup RAILS_ENV=production <<< 'yes'
command popd
Important: Notez les informations d'identification de l'administrateur.
Mise en place de la rotation des journaux
Configurez la rotation des journaux:
${cmdProxy} cp "${installPath}/lib/support/logrotate/gitlab" '/etc/logrotate.d/gitlab'
${cmdProxy} sed -i \
-e "s|/home/git/gitlab/log|${logPath}|g" \
-e "s|/home/git/gitlab-shell|${gitlabShellPath}|g" \
'/etc/logrotate.d/gitlab'
Vérification de la configuration
Vérifiez la configuration:
command pushd "${installPath}"
sudo -u git -H bundle exec rake gitlab:env:info RAILS_ENV=production
command popd
Générez les assets:
command pushd "${installPath}"
sudo -u git -H bundle exec rake assets:precompile RAILS_ENV=production
command popd
Mise en place du script init.d
Mettez en place le script init.d:
${cmdProxy} cp "${installPath}/lib/support/init.d/gitlab" '/etc/init.d/gitlab'
${cmdProxy} cp "${installPath}/lib/support/init.d/gitlab.default.example" '/etc/default/gitlab'
Mettez à jour la configuration:
${cmdProxy} sed -i \
-e "s|^app_root=.*|app_root='${installPath}'|" \
-e "s|^pid_path=.*|pid_path='${cachePath}/pids'|" \
-e "s|^socket_path=.*|socket_path='${cachePath}/sockets'|" \
'/etc/default/gitlab'
Ajoutez GitLab au démarrage du système:
${cmdProxy} update-rc.d gitlab defaults 21
Démarrez GitLab:
${cmdProxy} service gitlab start
Configuration du serveur HTTP
Créez la configuration Apache 2 personnalisée:
customVhost=" ProxyPreserveHost On
<Location />
Order deny,allow
Allow from all
ProxyPassReverse http://127.0.0.1:8080
ProxyPassReverse http://${domain}/
</Location>
#apache equivalent of nginx try files
# http://serverfault.com/questions/290784/what-is-apaches-equivalent-of-nginxs-try-files
# http://stackoverflow.com/questions/10954516/apache2-proxypass-for-rails-app-gitlab
RewriteEngine on
RewriteCond %{DOCUMENT_ROOT}/%{REQUEST_FILENAME} "\!"-f
RewriteRule .* http://127.0.0.1:8080%{REQUEST_URI} [P,QSA]
RequestHeader set X_FORWARDED_PROTO '${proto}'
# needed for downloading attachments
DocumentRoot ${installPath}/public
#Set up apache error documents, if back end goes down (i.e. 503 error) then a maintenance/deploy page is thrown up.
ErrorDocument 404 /404.html
ErrorDocument 422 /422.html
ErrorDocument 500 /500.html
ErrorDocument 503 /deploy.html"
Activez les modules Apache nécessaires:
${cmdProxy} a2enmod rewrite proxy proxy_http headers
Créez la configuration Apache 2 de l'outil:
if [ -n "${sslKeyName}" -a -e "/etc/ssl/private/${sslKeyName}.key" ]; then
${cmdProxy} a2tools --template='custom' --ssl="${sslKeyName}" \
"${domain}" "${customVhost}"
${cmdProxy} a2tools --template='redirect' "${domain}" "https://${domain}/"
else
${cmdProxy} a2tools --template='custom' "${domain}" "${customVhost}"
fi
Accédez à l'application via l'URL fournie:
echo "http://${domain}/"
Les identifiants de l'utilisateur d'administration ont été fournis lors de l'initialisation de la base de données.
Sauvegardes
Sauvegardez l'installation avec Backup Manager (voir Installer et configurer Backup Manager sur Debian):
${cmdProxy} backup-manager-tools add "${installPath}"
${cmdProxy} backup-manager-tools add "${dataPath}"
N'oubliez pas de sauvegarder la base de données (voir Installer PostgreSQL sur Debian).
Remerciements
- Merci aux développeurs de GitLab (en).
- Merci aux auteurs du GitLab installation guide (en).