в docker, GitLab, nginx

Поднимаем Gitlab в docker-контейнерах за Nginx


Мы уже упоминали о GitLab — одной из самых популярных систем контроля версий и управления Git-репозиториями с открытым исходным кодом и очень широкой функциональностью. Рассматривались варианты переноса GitLab в docker-установку и организация процесса CI с помощью docker-compose.

Еще один довольно часто встречающийся вариант установки — размещение Gitlab в docker-контейнерах за веб-сервером Nginx, выступающим в качестве фронтенда. Давайте разберемся!

Считаем, что все необходимые для работы установлены и настроены. Действия производятся на:

lsb_release -a
No LSB modules are available.
Distributor ID: Debian
Description:    Debian GNU/Linux 8.7 (jessie)
Release:        8.7
Codename:       jessie

Версия веб-сервера Nginx:

nginx -v
nginx version: nginx/1.11.9

Версия docker:

docker version
Client:
 Version:      17.03.1-ce
 API version:  1.27
 Go version:   go1.7.5
 Git commit:   c6d412e
 Built:        Mon Mar 27 17:07:28 2017
 OS/Arch:      linux/amd64

Server:
 Version:      17.03.1-ce
 API version:  1.27 (minimum version 1.12)
 Go version:   go1.7.5
 Git commit:   c6d412e
 Built:        Mon Mar 27 17:07:28 2017
 OS/Arch:      linux/amd64
 Experimental: false

Версия docker-compose:

docker-compose -v
docker-compose version 1.11.2, build dfed245

Примечание. В нашем примере Nginx установлен в хост-системе, однако веб-сервер также можно разместить в docker-контейнере.

Для веб-сервера получены и подключены бесплатные SSL-сертификаты от Let’s Encrypt (о том как это сделать читайте здесь или здесь).

Конфигурационные файлы Nginx расположены в каталоге /etc/nginx и выглядят следующим образом:

файл /etc/nginx/conf.d/gitlab.conf:

server {
    listen 80;
    server_name gitlab.example.com;

    return 301 https://gitlab.example.com$request_uri;
}

server {
    listen 443 ssl http2;
    server_name  gitlab.example.com;

    server_tokens off;
    client_max_body_size 200m;

    include /etc/nginx/ssl/ssl.conf;
    include /etc/nginx/ssl/acme.conf;

#    access_log off;
    access_log /var/log/nginx/gitlab.access.log;
    error_log  /var/log/nginx/gitlab.error.log error;

  location / {
        ## If you use HTTPS make sure you disable gzip compression
        ## to be safe against BREACH attack.
        gzip off;

        ## https://github.com/gitlabhq/gitlabhq/issues/694
        ## Some requests take more than 30 seconds.
        proxy_read_timeout      600;
        proxy_send_timeout      600;
        proxy_connect_timeout   600;
        send_timeout            600;
        proxy_redirect          off;

        proxy_set_header    Host                $http_host;
        proxy_set_header    X-Real-IP           $remote_addr;
        proxy_set_header    X-Forwarded-Ssl     on;
        proxy_set_header    X-Forwarded-For     $proxy_add_x_forwarded_for;
        proxy_set_header    X-Forwarded-Proto   $scheme;
        proxy_set_header    X-Frame-Options     SAMEORIGIN;

        proxy_pass http://gitlab.example.com:10080;
    }
}

файл /etc/nginx/ssl/ssl.conf:

ssl_certificate /etc/letsencrypt/live/gitlab.example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/gitlab.example.com/privkey.pem;
ssl_trusted_certificate /etc/letsencrypt/live/gitlab.example.com/chain.pem;

ssl_protocols TLSv1.2;
ssl_prefer_server_ciphers on;
ssl_dhparam /etc/nginx/ssl/dhparam.pem;
ssl_ciphers EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;
ssl_session_timeout 1h;
ssl_session_cache shared:SSL:128m;
ssl_stapling on;
ssl_stapling_verify on;

add_header Strict-Transport-Security max-age=15768000;
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-Xss-Protection "1; mode=block" always;
add_header X-Content-Type-Options "nosniff" always;

resolver 8.8.8.8 valid=300s;
resolver_timeout 10s;

файл /etc/nginx/ssl/acme.conf:

# Lets Encrypt Webroot
location /.well-known {
    root /var/www/le;
}

Gitlab будем поднимать с помощью инструмента docker-compose, инструкции для которого описаны в конфигурационном файле docker-compose.yml и выглядят следующим образом:

version: '2'
services:
  redis:
    container_name: gitlab-redis
    restart: always
    image: sameersbn/redis:latest
    command:
    - --loglevel warning
    volumes:
    - /srv/redis:/var/lib/redis:Z
    networks:
    - mynet

  postgresql:
    container_name: gitlab-postgres
    restart: always
    image: sameersbn/postgresql:9.6-2
    volumes:
    - /srv/postgresql:/var/lib/postgresql:Z
    environment:
    - DB_USER=gitlab
    - DB_PASS=password
    - DB_NAME=gitlabhq_production
    - DB_EXTENSION=pg_trgm
    networks:
    - mynet

  gitlab:
    container_name: gitlab
    restart: always
    image: sameersbn/gitlab:9.0.2
    depends_on:
    - redis
    - postgresql
    ports:
    - "10080:80"
    - "10022:22"
    volumes:
    - /srv/gitlab/data:/home/git/data:Z
    - /srv/gitlab/logs:/var/log/gitlab
    - /srv/certs:/certs
    environment:
    - DEBUG=false

    - DB_ADAPTER=postgresql
    - DB_HOST=postgresql
    - DB_PORT=5432
    - DB_USER=gitlab
    - DB_PASS=password
    - DB_NAME=gitlabhq_production

    - REDIS_HOST=redis
    - REDIS_PORT=6379
    - GITLAB_SSH_PORT=10022
    - GITLAB_PORT=443
    - GITLAB_HTTPS=true
    - GITLAB_HOST=gitlab.example.com

    - GITLAB_SECRETS_SECRET_KEY_BASE=<случайная строка длиной 64 символа>
    - GITLAB_SECRETS_OTP_KEY_BASE=<случайная строка длиной 64 символа>
    - GITLAB_SECRETS_DB_KEY_BASE=<случайная строка длиной 64 символа>

    - GITLAB_EMAIL=gitlab@test.example.com
    - SMTP_ENABLED=true
    - SMTP_DOMAIN=test.example.com
    - SMTP_HOST=smtp.yandex.ru
    - SMTP_PORT=587
    - SMTP_USER=gitlab@test.example.com
    - SMTP_PASS=supersecretpassword
    - SMTP_STARTTLS=true
    - SMTP_AUTHENTICATION=login

    networks:
     mynet:
      aliases:
      - gitlab.example.com

networks:
  mynet:

Сгенерировать случайные значения для параметров GITLAB_SECRETS_SECRET_KEY_BASE, GITLAB_SECRETS_OTP_KEY_BASE и GITLAB_SECRETS_DB_KEY_BASE можно с помощью утилиты pwgen, например так:

pwgen -Bsv1 64

После этого, находясь в каталоге с файлом docker-compose.yml выполняем команду:

docker-compose up -d

Как только docker-контейнеры запустятся, можно будет залогиниться в веб-интерфейс GitLab по адресу gitlab.example.com. По умолчанию используется имя пользователя root и пароль 5iveL!fe.

Добавить комментарий