GitLab на своём сервере отправляет письма для подтверждения регистрации, сброса пароля, уведомлений о merge request и пайплайнах. Пакет для Linux по умолчанию передаёт почту локальному sendmail, а в Docker-образе почтового сервера нет вовсе, поэтому без SMTP-релея письма либо никуда не уходят, либо уходят без авторизации. Ниже — настройка пакета Linux (Omnibus) и официального Docker-образа, который читает те же параметры, для подключения к fmailer.
| Параметр | Значение |
|---|---|
| SMTP-хост | smtp.fmailer.ru |
| Порт | 587 |
| Шифрование | STARTTLS (соединение переводится в TLS до авторизации) |
| Логин | Логин токена вашего домена |
| Пароль | Пароль этого токена — показывается один раз, при создании |
Добавьте эти строки в /etc/gitlab/gitlab.rb. С адреса gitlab_email_from приходят все уведомления, поэтому он должен быть на подтверждённом домене:
# /etc/gitlab/gitlab.rb
gitlab_rails['smtp_enable'] = true
gitlab_rails['smtp_address'] = "smtp.fmailer.ru"
gitlab_rails['smtp_port'] = 587
gitlab_rails['smtp_user_name'] = "<логин токена>"
gitlab_rails['smtp_password'] = "<пароль токена>"
gitlab_rails['smtp_domain'] = "mail.example.ru"
gitlab_rails['smtp_authentication'] = "plain"
gitlab_rails['smtp_enable_starttls_auto'] = true # STARTTLS на порту 587
gitlab_rails['smtp_tls'] = false # true только для порта 465
gitlab_rails['smtp_openssl_verify_mode'] = 'peer'
gitlab_rails['gitlab_email_from'] = 'gitlab@mail.example.ru'
gitlab_rails['gitlab_email_display_name'] = 'GitLab'
gitlab_rails['gitlab_email_reply_to'] = 'noreply@mail.example.ru'587 нужны smtp_enable_starttls_auto = true и smtp_tls = false, для порта 465 — smtp_tls = true. Если оба параметра равны true, GitLab не отправит ни одного письма. И не используйте в пароле одинарную кавычку: документация GitLab предупреждает, что разделители строк Ruby и YAML ломают обработку конфигурации. Для порта 465:
# Порт 465 (шифрование с первого байта) вместо 587
gitlab_rails['smtp_port'] = 465
gitlab_rails['smtp_tls'] = true
gitlab_rails['smtp_enable_starttls_auto'] = falseПримените конфигурацию:
sudo gitlab-ctl reconfigure Официальный образ принимает любую настройку gitlab.rb через переменную GITLAB_OMNIBUS_CONFIG. Она читается при каждом запуске и в gitlab.rb не записывается, поэтому храните её в compose-файле и после изменений выполняйте docker compose up -d:
# docker-compose.yml
services:
gitlab:
image: gitlab/gitlab-ce:latest
hostname: gitlab.example.ru
environment:
GITLAB_OMNIBUS_CONFIG: |
external_url 'https://gitlab.example.ru'
gitlab_rails['smtp_enable'] = true
gitlab_rails['smtp_address'] = "smtp.fmailer.ru"
gitlab_rails['smtp_port'] = 587
gitlab_rails['smtp_user_name'] = "<логин токена>"
gitlab_rails['smtp_password'] = "<пароль токена>"
gitlab_rails['smtp_domain'] = "mail.example.ru"
gitlab_rails['smtp_authentication'] = "plain"
gitlab_rails['smtp_enable_starttls_auto'] = true
gitlab_rails['gitlab_email_from'] = 'gitlab@mail.example.ru' Другой вариант — отредактировать /etc/gitlab/gitlab.rb внутри контейнера (docker exec -it gitlab editor /etc/gitlab/gitlab.rb) и выполнить docker restart gitlab: при запуске GitLab сам применяет конфигурацию.
Кнопки для тестового письма в Admin area нет — используйте консоль Rails (в Docker добавьте перед командой docker exec -it gitlab):
sudo gitlab-rails console
# в консоли
Notify.test_email('you@example.ru', 'Проверка SMTP', 'Работает.').deliver_now Если письмо не пришло, выполните в той же консоли ActionMailer::Base.delivery_method — ответ должен быть :smtp — и ActionMailer::Base.smtp_settings, чтобы увидеть, какие значения GitLab на самом деле загрузил.
Если включена зашифрованная конфигурация, логин и пароль SMTP можно вынести из gitlab.rb в зашифрованный файл. После этого удалите smtp_user_name и smtp_password из gitlab.rb и выполните reconfigure:
sudo gitlab-rake gitlab:smtp:secret:edit EDITOR=vim
# содержимое зашифрованного файла
user_name: '<логин токена>'
password: '<пароль токена>'| Симптом | Причина и решение |
|---|---|
SSL_connect returned=1 ... wrong version number | smtp_tls = true на порту 587. Используйте STARTTLS или перейдите на 465. |
:enable_starttls and :tls are mutually exclusive | Оба флага равны true. Выключите тот, что не подходит к порту. |
Net::OpenTimeout | Хостинг блокирует порт — поставьте в smtp_port8587 или 8465 с smtp_tls. |
535 Authentication failed | Неверный логин или пароль токена. |
| Тест из консоли проходит, уведомлений нет | Внешний Sidekiq без настроек SMTP или правила маршрутизации, которые пропускают очередь mailers. |
| Отправитель отклонён или письма в спаме | gitlab_email_from не на подтверждённом домене. |
В установке из пакета Linux (Omnibus) — ключами gitlab_rails['smtp_*'] в файле /etc/gitlab/gitlab.rb. Формы настройки SMTP в Admin area нет. После правки файла выполните sudo gitlab-ctl reconfigure.
smtp_enable_starttls_auto переводит открытое соединение на TLS командой STARTTLS — это для порта 587. smtp_tls шифрует соединение с первого байта — это для порта 465. Параметры взаимоисключающие: если оба равны true, GitLab отказывается отправлять письма.
Запустите sudo gitlab-rails console и выполните Notify.test_email('you@example.ru', 'Тема', 'Текст').deliver_now. Ошибка SMTP выводится прямо в консоль — это самый быстрый способ понять, что не так.
Передайте те же строки gitlab_rails в переменной окружения GITLAB_OMNIBUS_CONFIG или отредактируйте /etc/gitlab/gitlab.rb внутри контейнера и выполните docker restart gitlab. GITLAB_OMNIBUS_CONFIG читается при каждом запуске и в gitlab.rb не записывается, поэтому держите его в compose-файле.
Режим TLS не соответствует порту. Порт 587 начинается без шифрования и требует smtp_enable_starttls_auto = true и smtp_tls = false, порт 465 — smtp_tls = true. Исправьте пару и выполните gitlab-ctl reconfigure.
Большую часть писем GitLab отправляет через Sidekiq из очереди mailers. Если Sidekiq работает на отдельном сервере, в его gitlab.rb нужны те же настройки SMTP. Если заданы правила маршрутизации Sidekiq, убедитесь, что очередь mailers по-прежнему обрабатывается.