Документация / GitLab

Настройка SMTP в GitLab (Self-Managed)

GitLab на своём сервере отправляет письма для подтверждения регистрации, сброса пароля, уведомлений о merge request и пайплайнах. Пакет для Linux по умолчанию передаёт почту локальному sendmail, а в Docker-образе почтового сервера нет вовсе, поэтому без SMTP-релея письма либо никуда не уходят, либо уходят без авторизации. Ниже — настройка пакета Linux (Omnibus) и официального Docker-образа, который читает те же параметры, для подключения к fmailer.

ℹ
Логин и пароль можно получить на странице токенов домена.

Параметры подключения

ПараметрЗначение
SMTP-хостsmtp.fmailer.ru
Порт587
ШифрованиеSTARTTLS (соединение переводится в TLS до авторизации)
ЛогинЛогин токена вашего домена
ПарольПароль этого токена — показывается один раз, при создании
ℹ
Каждый режим доступен и на высоком порту: 8465 (SSL/TLS), 8587 (STARTTLS) и 8025 (без шифрования). Многие хостинги и облака блокируют исходящие 25, 465 и 587 — если соединение обрывается по таймауту, используйте соответствующий высокий порт.

Настройка gitlab.rb

Добавьте эти строки в /etc/gitlab/gitlab.rb. С адреса gitlab_email_from приходят все уведомления, поэтому он должен быть на подтверждённом домене:

/etc/gitlab/gitlab.rbruby
# /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:

ruby
# Порт 465 (шифрование с первого байта) вместо 587
gitlab_rails['smtp_port'] = 465
gitlab_rails['smtp_tls'] = true
gitlab_rails['smtp_enable_starttls_auto'] = false

Примените конфигурацию:

bash
sudo gitlab-ctl reconfigure

Docker

Официальный образ принимает любую настройку gitlab.rb через переменную GITLAB_OMNIBUS_CONFIG. Она читается при каждом запуске и в gitlab.rb не записывается, поэтому храните её в compose-файле и после изменений выполняйте docker compose up -d:

docker-compose.yml
# 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):

ruby
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:

bash
sudo gitlab-rake gitlab:smtp:secret:edit EDITOR=vim

# содержимое зашифрованного файла
user_name: '<логин токена>'
password: '<пароль токена>'

Разбор ошибок

СимптомПричина и решение
SSL_connect returned=1 ... wrong version numbersmtp_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 не на подтверждённом домене.

Частые вопросы

Где в GitLab настраивается SMTP?

В установке из пакета Linux (Omnibus) — ключами gitlab_rails['smtp_*'] в файле /etc/gitlab/gitlab.rb. Формы настройки SMTP в Admin area нет. После правки файла выполните sudo gitlab-ctl reconfigure.

Чем smtp_tls отличается от smtp_enable_starttls_auto?

smtp_enable_starttls_auto переводит открытое соединение на TLS командой STARTTLS — это для порта 587. smtp_tls шифрует соединение с первого байта — это для порта 465. Параметры взаимоисключающие: если оба равны true, GitLab отказывается отправлять письма.

Как отправить тестовое письмо из GitLab?

Запустите sudo gitlab-rails console и выполните Notify.test_email('you@example.ru', 'Тема', 'Текст').deliver_now. Ошибка SMTP выводится прямо в консоль — это самый быстрый способ понять, что не так.

Как настроить SMTP для GitLab в Docker?

Передайте те же строки gitlab_rails в переменной окружения GITLAB_OMNIBUS_CONFIG или отредактируйте /etc/gitlab/gitlab.rb внутри контейнера и выполните docker restart gitlab. GITLAB_OMNIBUS_CONFIG читается при каждом запуске и в gitlab.rb не записывается, поэтому держите его в compose-файле.

Почему GitLab выдаёт ошибку «wrong version number»?

Режим TLS не соответствует порту. Порт 587 начинается без шифрования и требует smtp_enable_starttls_auto = true и smtp_tls = false, порт 465 — smtp_tls = true. Исправьте пару и выполните gitlab-ctl reconfigure.

Почему тест проходит, а уведомления из GitLab не приходят?

Большую часть писем GitLab отправляет через Sidekiq из очереди mailers. Если Sidekiq работает на отдельном сервере, в его gitlab.rb нужны те же настройки SMTP. Если заданы правила маршрутизации Sidekiq, убедитесь, что очередь mailers по-прежнему обрабатывается.

Что дальше