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
Другие вопросы по тегам