Docker 용 Gitlab 설치 (메일 설정 포함)

Docker 용 Gitlab 설치 (메일 설정 포함)

2022-10-03 last update

8 minutes reading postfix GitLab 도커

환경



호스트 시스템: CentOS Linux release 7.4.1708 (Core)
Docker: Docker version 17.12.1-ce
gitlab: GitLab Community Edition 10.5.3

설치



설치 방법이나 컨테이너 버전의 주의점 등
htps : // / cs. 기 t b. 코 m / 오 니부 s / 도 c 케 r /

공식 이미지를 그대로 사용하여 시작.
[[email protected] ~]# docker run --detach \
    --hostname xxx.xxx.xxx.xxx \
    --publish 443:443 --publish 80:80 --publish 10022:22 \
    --name gitlab \
    --restart always \
    --volume /srv/gitlab/config:/etc/gitlab \
    --volume /srv/gitlab/logs:/var/log/gitlab \
    --volume /srv/gitlab/data:/var/opt/gitlab \
    gitlab/gitlab-ce:latest

# 起動にかなり時間がかかるので、以下のコマンドでウォッチ
[[email protected] ~]# docker logs -f gitlab

기동 후, 브라우저로부터 http://호스트 머신의 IP에 액세스 해 확인.

이메일 알림 설정



이 상태에서는, 신규 유저가 Register했을 때에, 메일로 Confirm해 주세요라고 말해지지만 메일이 오지 않기 때문에, 그 설정을 실시한다.
※root로 로그인해, Admin 화면으로부터 유저의 Confirm를 실시하는 것으로 잠정적으로는 회피할 수 있지만, 귀찮은 것의 제대로 설정한다.

처음에는 Gitlab이 컨테이너이므로 SMTP도 컨테이너로 구축하고 싶었지만, SMTP 컨테이너로서 좋은 것을 발견하지 못하고, 스스로 만들면 CentOS 통째로 되어 무겁기 때문에, 호스트 머신에 디폴트로 들어 있는 postfix를 사용 한다.

postfix 설정


# postfixがインストール、起動されていることの確認
[[email protected] ~]# systemctl status postfix
● postfix.service - Postfix Mail Transport Agent
   Loaded: loaded (/usr/lib/systemd/system/postfix.service; enabled; vendor preset: disabled)
   Active: active (running) since Fri 2018-03-09 19:19:54 JST; 1 weeks 4 days ago
# 他のMTAが存在しない、もしくはpostfixがMTAとして使用される設定になっていることの確認
[[email protected] ~]# alternatives --config mta

There is 1 program that provides 'mta'.

  Selection    Command
-----------------------------------------------
*+ 1           /usr/sbin/sendmail.postfix

Enter to keep the current selection[+], or type selection number:
# メールが送れることの確認
[[email protected] ~]# sendmail <宛先メールアドレス>
From [email protected]
To <宛先メールアドレス>
Subject Test
Test mail for postfix
.
#
# tail -f /var/log/maillog
Mar 21 12:46:32 ddauto postfix/pickup[17124]: A732941A0688: uid=0 from=<root>
Mar 21 12:46:32 ddauto postfix/cleanup[19859]: A732941A0688: message-id=<[email protected]>
Mar 21 12:46:32 ddauto postfix/qmgr[17125]: A732941A0688: from=<[email protected]>, size=307, nrcpt=1 (queue active)
Mar 21 12:46:37 ddauto postfix/smtp[19861]: A732941A0688: to=<宛先メールアドレス>, relay=<リレー先のメールサーバ>:25, delay=24, delays=20/0.01/4.1/0.55, dsn=2.0.0, status=sent (250 2.0.0 w2L3kVDS014160 Message accepted for delivery)
Mar 21 12:46:37 ddauto postfix/qmgr[17125]: A732941A0688: removed

이것으로 MTA로서는 메일을 송신할 수 있는 것을 확인할 수 있었다.
다음으로, 전송을위한 설정이 수행된다.

/etc/postfix/main.cf
myhostname = xxx.yyy.com <メールサーバーのホスト名>
mydomain = yyy.com <メールアドレスのアットマーク以降に現れるドメイン名>
myorigin = $mydomain <このメールサーバーから送信されるメールで利用されるドメイン名>
inet_interfaces = all <メールを受信するネットワークインターフェース>
mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain <送られてきた(受信した)メールのうち、このサーバーで受け取るべきドメイン>

mydestination은 여기에 지정한 대상의 메일이 호스트 시스템에서 수신 (전송하지 않음)이라는 설정이므로 최종 대상 메일 주소의 도메인을 여기에 지정해서는 안됩니다 (여기서 조금 빠졌습니다).
편집 후 postfix 재부팅 필요
[[email protected] ~]# systemctl restart postfix

gitlab 설정


[email protected]:/# vi /etc/gitlab/gitlab.rb
gitlab_rails['smtp_enable'] = true
gitlab_rails['smtp_address'] = "ホストマシンのIPアドレス"
gitlab_rails['smtp_port'] = 25
[email protected]:/# gitlab-ctl reconfigure

gitlab에서 테스트. gitlab의 이미지는 telnet은 커녕 ping조차 사용할 수 없기 때문에, 이하의 방법으로 확인했다.
참고
[email protected]:/# gitlab-rails console production
irb(main):002:0* ActionMailer::Base.smtp_settings
=> {:address=>"10.32.7.40", :port=>25, :openssl_verify_mode=>"none", :ca_file=>"/opt/gitlab/embedded/ssl/certs/cacert.pem"}
irb(main):003:0> Notify.test_email('送信したいメールアドレス', 'Hello', 'test message').deliver_now

Errno::EHOSTUNREACH: No route to host - connect(2) for "10.32.7.40" port 25

실패. CentOS7에서 Firewall이 활성화되어 있기 때문입니다. Firewall 자체를 무효화하면, gitlab 컨테이너가 기동하지 않게 되므로, 25포트만 비운다.
[[email protected] ~]# firewall-cmd --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: ens160
  sources:
  services: dhcpv6-client ssh
  ports: 
  protocols:
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:
# zoneにどのポートやサービスを許可、拒否するか定義し、それをインターフェースに当てはめるという仕組みらしい

[[email protected] ~]# firewall-cmd --permanent --zone=public --add-port=25/tcp
[[email protected] ~]# firewall-cmd --reload
# permanentオプションをつけると再起動でも保持されるが、reloadは必要になる。
[[email protected] ~]# firewall-cmd --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: ens160
  sources:
  services: dhcpv6-client ssh
  ports: 25/tcp
  protocols:
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:

마지막으로 컨테이너 이미지를 다시 시작합니다. 이것을 하지 않으면 왠지 메일을 보낼 수 없었기 때문에.
[[email protected] ~]# docker restart gitlab

개선점



gitlab에서 호스트 머신으로는 외부 IP 주소를 사용하고 있기 때문에 내부 IP 주소가 좋을 것 같습니다.
리소스에 여유가 있다면 SMTP도 컨테이너화하고 싶다.