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