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

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

  • PostgreSQL
  • Unicorn
  • Redis
  • Nginx
  • Sidekiq

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

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

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

Установка 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: "bridge"
    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: "bridge"
    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: "bridge"
  redis:
    restart: always
    image: redis:latest
    container_name: redis
    expose:
    - "6379"
    volumes:
     - "/export/containers/redis-data:/data"
    network_mode: "bridge"

Перманентная информация хранится на хосте в каталоге /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