0.初めに
自身のドメインを取得を行っていたので念願のメールを構築しようという会
1.使用した技術
- Ubuntu Server 26.04LTS
- Nginx
- cloudflare
- Mailcow
2.手順
1. Mailcow側のポート変更とHTTPSリダイレクト無効化
1-1. mailcow.conf の編集
Mailcowのインストールディレクトリに移動し、設定ファイルを編集します。
cd /opt/mailcow-dockerized
nano mailcow.conf
以下の項目を書き換えます(変更または追記)。
# ホストNginxと競合しないポートへ退避(127.0.0.1にバインド)
HTTP_PORT=8080
HTTP_BIND=127.0.0.1
HTTPS_PORT=8443
HTTPS_BIND=127.0.0.1
# ホストNginx側でSSL終了を行うため、Mailcow自身のリダイレクトを無効化
REDIRECT_TO_HTTPS=n
1-2. Mailcowコンテナの再起動
設定を完全に反映させるため、コンテナを一度落としてから再起動します。
docker compose down
docker compose up -d
2. Let's Encrypt による本番SSL証明書の取得
ホストOS側のCertbotを使用し、DNS(Cloudflare等)を経由した認証で本物の証明書を取得します。
2-1. 証明書の取得コマンド実行
sudo certbot certonly -d mail.reeldev.jp
- 対話画面では
1: Nginx Web Server plugin (nginx)を選択します。 - 画面の指示に従ってメールアドレスの入力と規約への同意(
Y)を行います。
🎉 成功時の保存先パス:
- 証明書:
/etc/letsencrypt/live/mail.reeldev.jp/fullchain.pem- 秘密鍵:
/etc/letsencrypt/live/mail.reeldev.jp/privkey.pem
3. メールコンテナ(Mailcow)への証明書共有
PostfixやDovecotなどのメールシステムにも今取得した本物の証明書を適用するため、シンボリックリンクを作成して共有します。
# Mailcowが自動生成したダミーの自己署名証明書をバックアップ
sudo mv /opt/mailcow-dockerized/data/assets/ssl/cert.pem /opt/mailcow-dockerized/data/assets/ssl/cert.pem.bak
sudo mv /opt/mailcow-dockerized/data/assets/ssl/key.pem /opt/mailcow-dockerized/data/assets/ssl/key.pem.bak
# 本物の証明書へのシンボリックリンクを作成
sudo ln -s /etc/letsencrypt/live/mail.reeldev.jp/fullchain.pem /opt/mailcow-dockerized/data/assets/ssl/cert.pem
sudo ln -s /etc/letsencrypt/live/mail.reeldev.jp/privkey.pem /opt/mailcow-dockerized/data/assets/ssl/key.pem
# メール関連のコンテナを再起動して反映
cd /opt/mailcow-dockerized
docker compose restart postfix-mailcow dovecot-mailcow nginx-mailcow
4. ホストNginxの本番リバースプロキシ設定
外部からの 80(HTTP) および 443(HTTPS) のアクセスをすべてホストのNginxで受け止め、裏に隠れているMailcow(8080)へ流す設定を行います。
4-1. 設定ファイルの作成・編集
sudo nano /etc/nginx/sites-available/mail.reeldev.jp
中身を以下の内容にすべて差し替えます(IPv4 / IPv6のデュアルスタック対応)。
# HTTP (80番) から HTTPS (443番) への強制リダイレクト
server {
listen 80;
listen [::]:80;
server_name mail.reeldev.jp;
return 301 https://$host$request_uri;
}
# SSL証明書を使用したHTTPSリバースプロキシ設定
server {
listen 443 ssl;
listen [::]:443 ssl;
http2 on;
server_name mail.reeldev.jp;
# Let's Encryptから取得した本物の証明書パス
ssl_certificate /etc/letsencrypt/live/mail.reeldev.jp/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/mail.reeldev.jp/privkey.pem;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;
location / {
# ホストOS内部のMailcow (8080ポート) へ転送
proxy_pass [http://127.0.0.1:8080](http://127.0.0.1:8080);
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# Mailcowに余計なHTTPSリダイレクトを起こさせないよう http 固定
proxy_set_header X-Forwarded-Proto http;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade";
client_max_body_size 100m;
}
}
4-2. Nginxの構文チェックと適用
sudo nginx -t
sudo systemctl reload nginx
-
nginx: configuration file /etc/nginx/nginx.conf test is successfulと出ればOK。
5. ファイアウォール(UFW)の開放
OS内部で通信が遮断されないよう、Webポートおよび主要なメール送受信ポートを開放します。(※UFWが inactive の場合でも、今後の有効化に備えて設定を投入)。
sudo ufw allow 'Nginx Full'
sudo ufw allow 25/tc
sudo ufw allow 143/tcp
sudo ufw allow 993/tcp
sudo ufw allow 110/tcp
sudo ufw allow 995/tcp
sudo ufw allow 465/tcp
sudo ufw allow 587/tcp
sudo ufw allow 4190/tcp
3.終わりに
これにて、インストールは完了です。お疲れ様でした。