Поднимаем Gitlab в docker-контейнерах за Nginx
May 1, 2017 16:22 · 567 words · 3 minute read
Мы уже упоминали о 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
.