Назад | Перейти на главную страницу

Настройте nginx для прокси GitLab CE (оба контейнера докеров)

На моем компьютере работают два следующих контейнера докеров:

nginx                     0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp                               nginx
gitlab/gitlab-ce:latest   0.0.0.0:32782->22/tcp, 0.0.0.0:32781->80/tcp, 0.0.0.0:32780->443/tcp   gitlab

На данный момент я не могу понять, как настроить nginx для обратного прокси-сервера запроса пользователя. Если пользователь входит http://gitlab.domain.com моя установка возвращает ошибку 502 Bad Gateway.

Server config:
    server{
        listen 80;
        listen [::]:80;
        server_name gitlab.domain.com www.gitlab.domain.com;

        location / {
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header HOST $http_host;
            proxy_set_header X-NginX-Proxy true;

            proxy_pass http://gitlab:32781;
            proxy_redirect off;
        }
}

У меня работала следующая конфигурация для контейнера jwilder / nginx-proxy.

web:
  image: 'gitlab/gitlab-ce:latest'
  hostname: 'gitlab.it-expert.com.ua'
  environment:
    GITLAB_OMNIBUS_CONFIG: |
      external_url 'https://gitlab.it-expert.com.ua'
      registry_external_url 'https://registry.it-expert.com.ua'
    VIRTUAL_HOST: gitlab.it-expert.com.ua,registry.it-expert.com.ua
    VIRTUAL_PORT: 443
    VIRTUAL_PROTO: https
  volumes:
    - './data/config:/etc/gitlab'
    - './data/logs:/var/log/gitlab'
    - './data/data:/var/opt/gitlab'

Сложной задачей было выяснить, как подключаются контейнеры и кто и кто должен обрабатывать SSL.

Для этой конфигурации вы должны предоставить сертификаты SSL как для контейнеров nginx-proxy, так и для контейнеров gitlab-ce, поскольку для связи между ними также используется SSL. Для gitlab-ce используйте папку ./data/config/ssl.

Вы можете узнать в мой пост в блоге как быстро получить действующий сертификат от Let's encrypt с помощью удобного докер-контейнера certbot.

Вот рабочий docker-compose.yml:

gitlab:                                                                                                                                                                
  image: "gitlab/gitlab-ce:latest"
  container_name: gitlab                                                                                                                            
  volumes:
    - ./gitlab/config:/etc/gitlab
    - ./gitlab/logs:/var/log/gitlab
    - ./gitlab/data:/var/opt/gitlab
    - /home/user/nginx-proxy/certs:/etc/gitlab/ssl/
  environment:
    GITLAB_OMNIBUS_CONFIG: |
      external_url 'https://git.example.org'                                                                                                                    
    VIRTUAL_HOST: git.example.org
    VIRTUAL_PORT: 443
    VIRTUAL_PROTO: https
    LETSENCRYPT_HOST: git.example.org
    LETSENCRYPT_EMAIL: email@example.org
  restart: always

Использование контейнера jwilder / nginx-proxy в качестве ответа Макса Прокопова. Важнейшей частью в моем случае были переменные среды VIRTUAL_PORT и VIRTUAL_PROTO. Не устанавливайте их должным образом, чтобы вызвать ошибку Nginx 400: "The plain HTTP request was sent to HTTPS port".

Вот спинет для части gitlab файла nginx conf.d / default.conf:

upstream git.example.org {
                                ## Can be connect with "bridge" network
                        # gitlab
                        server 172.17.0.4:443;
}
server {
        server_name git.example.org;
        listen 80 ;
        access_log /var/log/nginx/access.log vhost;
        return 301 https://$host$request_uri;
}
server {
        server_name git.example.org;
        listen 443 ssl http2 ;
        access_log /var/log/nginx/access.log vhost;
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
        ssl_ciphers ...;
        ssl_certificate /etc/nginx/certs/git.example.org.crt;
        ssl_certificate_key /etc/nginx/certs/igit.example.org.key;
        ssl_dhparam /etc/nginx/certs/git.example.org.dhparam.pem;
        add_header Strict-Transport-Security "max-age=31536000";
        include /etc/nginx/vhost.d/default;
        location / {
                proxy_pass https://git.example.org;
        }
}

вам не нужно сопоставлять порты контейнера gitlab с портом хоста, потому что контейнер nginx знает другой контейнер, и попробуйте

proxy_pass http://gitlab; 

Вы должны связать контейнер перед командой запуска контейнера nginx

--link gitlab:gitlab