На моем компьютере работают два следующих контейнера докеров:
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