메뉴 닫기

[Ubuntu 22.04] docker-mailserver 구축하기(docker-compose)

docker-mailserver를 통해 Ubuntu 서버에 간단하게 도커로 메일서버를 설치하는 방법을 소개한다.

docker 및 docker-compose는 설치되어 있는 환경이라고 가정한다.

  1. 메일서버를 설치할 서버가 필요하다. 본인은 oracle cloud 인스턴스를 활용하여 진행할 예정이다.
  • 구성환경 : OC A1 인스턴스 (Ubuntu 22.04)
  1. 도메인 및 DNS에 대한 레코드 수정 권한이 있어야 한다.
  2. 최소한의 도메인을 설정해야 한다. 예를 들어 test@example.com 형태의 메일주소를 사용하고 싶다면 mail.example.com 과 같이 MX 레코드와 A 레코드 등을 설정해주어야 한다.
  3. 아래 명령어로 compose.yaml 파일 및 mailserver.env 파일을 받아온다.
DMS_GITHUB_URL="https://raw.githubusercontent.com/docker-mailserver/docker-mailserver/master"
wget "${DMS_GITHUB_URL}/compose.yaml"
wget "${DMS_GITHUB_URL}/mailserver.env"

추가적으로 본인은 docker-compose.yml 같은 파일이름이 편해서 compose.yaml 파일 이름을 바꿔주었다.

  1. yaml 파일을 열어서 원하는 내용을 수정한다.

[공식사이트] https://docker-mailserver.github.io/docker-mailserver/latest/usage/

services:
  mailserver:
    image: ghcr.io/docker-mailserver/docker-mailserver:latest
    container_name: mailserver
    # Provide the FQDN of your mail server here (Your DNS MX record should point to this value)
    hostname: mail.[doamin.com]
    domainname: [doamin.com]
    env_file: mailserver.env
    # More information about the mail-server ports:
    # https://docker-mailserver.github.io/docker-mailserver/latest/config/security/understanding-the-ports/
    # To avoid conflicts with yaml base-60 float, DO NOT remove the quotation marks.
    ports:
      - "25:25"    # SMTP  (explicit TLS => STARTTLS, Authentication is DISABLED => use port 465/587 instead)
      - "143:143"  # IMAP4 (explicit TLS => STARTTLS)
      - "465:465"  # ESMTP (implicit TLS)
      - "587:587"  # ESMTP (explicit TLS => STARTTLS)
      - "993:993"  # IMAP4 (implicit TLS)
    volumes:
      - [mail_path]/dms/mail-data/:/var/mail/
      - [mail_path]/dms/mail-state/:/var/mail-state/
      - [mail_path]/dms/mail-logs/:/var/log/mail/
      - [mail_path]/dms/config/:/tmp/docker-mailserver/
      - [certbot_path]/conf:/etc/letsencrypt/
      - /etc/localtime:/etc/localtime:ro
    restart: always
    stop_grace_period: 1m
    # Uncomment if using `ENABLE_FAIL2BAN=1`:
    cap_add:
      - NET_ADMIN
    healthcheck:
      test: "ss --listening --tcp | grep -P 'LISTEN.+:smtp' || exit 1"
      timeout: 3s
      retries: 0

----------------------ssl 인증서 발급을 위한 부분---------------------
  nginx:
    image: nginx:latest
    container_name: nginx
    restart: always
    volumes:
      - [nginx_path]/www/mail:/var/www/mail
      - [nginx_path]/conf.d:/etc/nginx/conf.d
      - [certbot_path]/conf:/etc/nginx/ssl
      - [certbot_path]/data:/var/www/certbot
    ports:
      - 80:80
      - 443:443

  certbot:
    image: certbot/certbot:latest
    container_name: certbot
    command: certonly --webroot --webroot-path=/var/www/certbot -d mail.[domain.com]
    volumes:
      - [certbot_path]/conf:/etc/letsencrypt
      - [certbot_path]/logs:/var/log/letsencrypt
      - [certbot_path]/data:/var/www/certbot
  1. volumes: 부분과 hostname 부분을 수정해준다. volumes 부분은 ssl 인증서 추가를 위해 경로를 맞추어 수정해야 한다.
  2. mailserver.env 파일을 수정한다. 본인이 수정한 부분은 아래와 같다. 추가적으로 수정할 부분은 변경하면 된다.
SSL_TYPE=letsencrypt
SSL_CERT_PATH=/etc/letsencrypt/[인증서경로]
SSL_KEY_PATH=/etc/letsencrypt/[개인키경로]
ENABLE_FAIL2BAN=1
TZ=Asia/Seoul
  1. 그리고 certbot 도커를 사용해 webroot 방식으로 ssl 인증서를 발급받기 위해 아래 내용을 nginx/conf.d/[domain].conf 에 추가해준다.
server {
     listen [::]:80;
     listen 80;

     server_name mail.[domain.com];
     server_tokens off;

     location ~ /.well-known/acme-challenge {
         allow all;
         root /var/www/certbot;
     }
}
  1. 설정이 완료되면 docker-compose.yml이 있는 위치에서 docker-compose up -d ; docker-compose logs -f 명령어로 실행 상태 및 로그를 확인한다.
nginx       | [notice] 1#1: start worker process 30
nginx       | [notice] 1#1: start worker process 31
certbot     | Saving debug log to letsencrypt.log
certbot     | Requesting a certificate for mail.domain.com
mailserver  | [   INF   ]  Welcome to docker-mailserver v13.3.1
mailserver  | [   INF   ]  Checking configuration
mailserver  | [   INF   ]  Configuring mail server

nginx       | 23.xxx.xxx.107 - - "GET /.well-known/acme-challenge/abcdefg123456 HTTP/1.1" 200 87 "-" "Mozilla/5.0 (compatible; Let's Encrypt; +https://www.letsencrypt.org)" "-"
nginx       | 34.xxx.xxx.51 - - "GET /.well-known/acme-challenge/abcdefg123456 HTTP/1.1" 200 87 "-" "Mozilla/5.0 (compatible; Let's Encrypt; +https://www.letsencrypt.org)" "-"
nginx       | 18.xxx.xxx.104 - - "GET /.well-known/acme-challenge/abcdefg123456 HTTP/1.1" 200 87 "-" "Mozilla/5.0 (compatible; Let's Encrypt; +https://www.letsencrypt.org)" "-"
certbot     |
certbot     | Successfully received certificate.
  1. 위와 같이 “Successfully received certificate.” 가 뜨면 위에 설정한 ssl config 디렉터리에 인증서가 생성되어 있을 것이다.
    (발급이 정상적으로 안되는 경우 방화벽 설정을 확인해서 nginx로 들어오는 인증 요청이 막히지 않는지 확인해야 한다)
  2. 마지막으로 아래 명령어로 docker-mailserver의 이메일 계정을 생성한다.
docker exec -it <CONTAINER NAME> setup email add user@domain.com
  1. 이후 썬더버드같은 MUA를 설치하고 계정설정을 진행한다.
  1. 수신 서버와 송신 서버 정보를 입력하여 설정한다. 위에서 pop3 또는 imap으로 설정한 내용으로 설정하면된다.

0 0 votes
Article Rating
구독
Notify of
guest

0 Comments
Inline Feedbacks
View all comments
0
Would love your thoughts, please comment.x