Жизнь системного администратора или разработчика сегодня сложно представить без системы контроля версий. Даже если ты один пишешь небольшой скрипт, довольно сложно вспомнить изменения в его содержимом спустя несколько месяцев, а система контроля версий очень хорошо компенсирует недостатки памяти. Если же над проектом работаю несколько людей, система контроля версий просто необходима.
В этой заметке речь пойдет про 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 и на экране можно увидеть предложение задать пароль. После установки пароля и авторизации попадаешь в веб-интерфейс и панель администратора.


