gitlab

Разворачиваем Gitlab на базе Docker


Жизнь системного администратора или разработчика сегодня сложно представить без системы контроля версий. Даже если ты один пишешь небольшой скрипт, довольно сложно вспомнить изменения в его содержимом спустя несколько месяцев, а система контроля версий очень хорошо компенсирует недостатки памяти. Если же над проектом работаю несколько людей, система контроля версий просто необходима.
В этой заметке речь пойдет про . Почему именно , а не svn, mercurial или bazaar? Сравнений систем контроля версий на просторах интернета предостаточно, оставим эту тему за приделами данной заметки. Почему ? Потому что это очень удобный сервер с функциональным веб интерфейсом.
В принципе Gitlab можно довольно удобно поставить в виде пакета Omnibus («все в одном»), который уже включает в себя все необходимые компоненты:

В этой заметке я хочу рассмотреть установку посредством , но использовав отдельные контейнеры под компоненты системы, что мне кажется более правильным и, например, позволит в будущем относительно легко горизонтально масштабировать компоненты системы.

Установка и настройка Docker

Здесь и далее описывается установка на Fedora .

Установка Docker вполне тривиальная задача выполняемая средствами пакетного менеджера:

$ dnf -y install docker

Так же нам понадобится Docker Compose:

$ curl -L https://github.com/docker/compose/releases/download/1.8.0/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
$ chmod +x /usr/local/bin/docker-compose

Установка и настройка Gitlab внутри Docker

Внимание, спойлер! Файл docker compose:

version: '2'
services:
nginx:
restart: always
image: nginx:latest
container_name: nginx
volumes:
- "/export/containers/nginx-conf/nginx.conf:/etc/nginx/nginx.conf:ro"
- "/export/containers/nginx-conf/gitlab-http.conf:/etc/nginx/conf.d/gitlab-http.conf:ro"
- "/export/containers/nginx-logs:/var/log/nginx"
network_mode: ""
ports:
- "8080:80"
depends_on:
- gitlab_app
links:
- gitlab_app
gitlab_app:
restart: always
image: 'gitlab/gitlab-ce:latest'
hostname: 'git'
container_name: gitlab_app
expose:
- "8081"
volumes:
- "/export/containers/gitlab-config:/etc/gitlab"
- "/export/containers/gitlab-data:/var/opt/gitlab"
- "/export/containers/gitlab-logs:/var/log/gitlab"
network_mode: ""
ports:
- "8022:22"
depends_on:
- postgresql
- redis
links:
- postgresql
- redis
postgresql:
restart: always
image: postgres:latest
container_name: postgresql
environment:
- POSTGRES_PASSWORD=T0pS3cr3T
expose:
- "5432"
volumes:
- "/export/containers/postgresql-data:/var/lib/postgresql/data"
network_mode: ""
redis:
restart: always
image: redis:latest
container_name: redis
expose:
- "6379"
volumes:
- "/export/containers/redis-data:/data"
network_mode: ""

Перманентная информация хранится на хосте в каталоге /export/containers.

Создаем контейнеры описанной конфигурации:

$ docker-compose create
Creating redis
Creating postgresql
Creating gitlab_app
Creating nginx

PostgreSQL

Для начала настроим PostgreSQL. Для этого запустим контейнер:

$ docker start postgresql
$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
aeab9cf821a3        postgres:latest     "/docker-entrypoint.s"   57 seconds ago      Up 5 seconds        5432/tcp            postgresql

Создадим необходимых для работы пользователя и БД

$ docker exec -i -t postgresql /bin/bash
$ su - postgres
$ createuser -P git
$ createdb -O git gitlabhq_production
$ echo 'CREATE EXTENSION pg_trgm;' | psql gitlabhq_production

После конфигурации контейнер можно остановить:

$ docker stop postgresql

Nginx

Нам потребуются конфиги nginx, можно использовать готовые:

$ curl https://raw.githubusercontent.com/R4scal/docker-gitlab/master/nginx-conf/nginx.conf > /export/containers/nginx-conf/nginx.conf
$ curl https://raw.githubusercontent.com/R4scal/docker-gitlab/master/nginx-conf/gitlab-http.conf > /export/containers/nginx-conf/gitlab-http.conf

Gitlab

Официальный сайт говорит, что при запуске контейнера конфигурацию можно передать через переменные окружения. Для этого в секцию сервиса gitlab_app необходимо добавить строки вида:

environment:
GITLAB_OMNIBUS_CONFIG: |
external_url 'http://git'

Но для меня такой способ не сработал. При первом запуске происходит создание файла конфигурации gitlab.rb, который необходимо отредактировать вручную указав параметры:

external_url 'http://git'
gitlab_rails['db_adapter'] = "postgresql"
gitlab_rails['db_database'] = "gitlabhq_production"
gitlab_rails['db_username'] = "git"
gitlab_rails['db_password'] = "T0pS3cr3T"
gitlab_rails['db_host'] = "postgresql"
gitlab_rails['db_port'] = 5432
gitlab_rails['redis_host'] = "redis"
gitlab_rails['redis_port'] = 6379
gitlab_rails['redis_database'] = 0
gitlab_workhorse['enable'] = true
gitlab_workhorse['listen_network'] = "tcp"
gitlab_workhorse['listen_addr'] = "0.0.0.0:8081"
gitlab_workhorse['auth_backend'] = "http://localhost:8080"
unicorn['listen'] = '127.0.0.1'
unicorn['port'] = 8080
postgresql['enable'] = false
redis['enable'] = false
nginx['enable'] = false

Запускаем все контейнеры:

$ docker-compose up

После этого все должно работать. Необходимо только открытия в браузере http://<адрес_сервера>:8080 и на экране можно увидеть предложение задать пароль. После установки пароля и авторизации попадаешь в веб-интерфейс и панель администратора.
gitlab initial screen
gitlab first screengitlab admin area