Gitlab в Docker за прокси traefik не удается (обычно)
У меня есть несколько веб-сайтов, работающих в докере с учетными данными LetsEncrypt и маршрутизируемых через traefik. Я хотел бы запустить локальный gitlab-ce в Docker аналогично с LetsEncrypt и traefik.
Поэтому я добавил это в мой файл traefik.toml:
[[acme.domains]]
main = "gitlab.mydomain.com"
И это в config/gitlab.rb:
external_url "http://gitlab.mydomain.com"
И я начинаю gitlab с:
docker run -d --restart=always \
--hostname gitlab.mydomain.com \
--expose 80 \
--volume /srv/gitlab/config:/etc/gitlab \
--volume /srv/gitlab/data:/var/opt/gitlab \
--volume /var/log/gitlab:/var/log/gitlab \
--label traefik.frontend.rule=Host:gitlab.mydomain.com \
--name gitlab gitlab/gitlab-ce:latest
Переходя на https://gitlab.mydomain.com/ я получаю защищенный сайт с сгенерированным сертификатом LetsEncrypt, но сайт не загружается:
Внутренняя ошибка сервера
Когда я перезагружаю страницу, я вижу это в docker logs gitlab -f
:
==> /var/log/gitlab/sshd/current <==
2017-02-12_16:51:31.00446 Bad protocol version identification 'GET / HTTP/1.1' from 172.17.0.8 port 41138
2017-02-12_16:51:31.26238 Bad protocol version identification 'GET /favicon.ico HTTP/1.1' from 172.17.0.8 port 41140
В поисках /error/i
в журналах я вижу несколько вещей, которые могут вызывать проблемы (множество ошибок, о которых сообщалось в zruby/gems/2.3.0/gems/redis-3.2.2z), но нет "дымящегося пистолета" AFAICT.
И чтобы завершить безумие, примерно каждые десять или около того (случайных) раз, когда я бегу docker restart gitlab
сайт подходит идеально. Я испытывал желание просто оставить это, но в этом заключается безумие...
Как я могу заставить это придумать надежно? Или как я могу отладить это более полно?
2 ответа
Этот ответ, вероятно, приходит слишком поздно для вас, но я столкнулся с той же проблемой и смог ее решить.
Важным ключом является то, что ошибки журнала sshd
демон!
По умолчанию Traefik выберет первый порт, предоставляемый контейнером (с помощью Dockerfile, а не портов, которые вы выставляете вручную!). В случае контейнера Gitlab это порт ssh 22.
Таким образом, Traefik направит веб-запросы демону Gitlab SSH.
Чтобы это исправить, вам нужно явно указать порт для Traefik с меткой:
labels:
...
- traefik.port=80
Я использовал docker-compose от Sameersbn и добавил следующий docker-compose.override.yml в тот же каталог.
version: "2"
services:
gitlab:
labels:
- "traefik.frontend.rule=Host:git.schulz.codes"
- "traefik.port=80"
- "traefik.enable=true"
- "traefik.frontend.entryPoints=http,https"
это продолжает работать тихо, хорошо со следующим traefik docker-compose
version: "2"
services:
proxy:
restart: always
image: traefik
container_name: traefik
command: --web --docker --docker.domain=docker.localhost --logLevel=DEBUG
ports:
- "8080:8080"
- "80:80"
- "443:443"
volumes:
- ./traefik.toml:/etc/traefik/traefik.toml
- /var/run/docker.sock:/var/run/docker.sock
- ./data:/etc/traefik/acme:rw
а это трафик.томл
[entryPoints]
[entryPoints.http]
address = ":80"
[entryPoints.http.redirect]
entryPoint = "https"
[entryPoints.https]
address = ":443"
[entryPoints.https.tls]
defaultEntryPoints = ["http", "https"]
[acme]
email = "yourmail@domain.com"
storageFile = "/etc/traefik/acme/acme.json"
entryPoint = "https"
OnHostRule = true
[[acme.domains]]
main = "domain.com"
sans = ["gitlab.domain.com"]
[web]
address = ":8080"
[docker]
endpoint = "unix:///var/run/docker.sock"
domain = "docker.localhost"
watch = true
exposedbydefault = true