## Mở đầu
Nếu bạn đang vận hành một VPS với **Nginx Proxy Manager (NPM)** để quản lý các website dockerized của mình, và đột nhiên muốn cài thêm **Mailcow** để tự host hệ thống email doanh nghiệp, bạn sẽ gặp ngay một vấn đề kinh điển: **Xung đột Port 80 và 443**.
Cả NPM và Mailcow đều muốn chiếm dụng 2 port này để cấp phát SSL và phục vụ web. Hơn nữa, khi đặt Mailcow (vốn tự quản lý SSL rất chặt chẽ) ra sau một Reverse Proxy như NPM, bạn rất dễ gặp lỗi “Too many redirects” hoặc “502/504 Bad Gateway”.
Sau quá trình “vật lộn” cài đặt và debug tại **DPS Media**, mình xin chia sẻ lại quy trình chuẩn để cài đặt 2 ông lớn này hoạt động hòa thuận với nhau.
—
## 1. Chuẩn bị
Bạn cần một VPS đã cài sẵn:
– Docker & Docker Compose.
– Nginx Proxy Manager (đang chạy và chiếm port 80/443).
– Domain (ví dụ: `mail.khaisanfood.vn` và `dpsmedia.vn`).
—
## 2. Cài đặt Mailcow
Đầu tiên, kéo source code về như bình thường:
“`bash
cd /opt
git clone https://github.com/mailcow/mailcow-dockerized
cd mailcow-dockerized
./generate_config.sh
“`
*(Nhập Hostname là `mail.domain-chinh.com`)*.
### Xử lý Xung đột Port (Quan trọng)
Đây là bước quyết định. Bạn cần chỉnh sửa file `mailcow.conf`:
“`bash
nano mailcow.conf
“`
Thực hiện các thay đổi sau:
1. **Tắt Redirect nội bộ của Mailcow**:
Vì NPM đã lo việc chuyển hướng HTTPS, nếu để Mailcow tự làm nữa sẽ gây ra vòng lặp vô tận (Redirect Loop).
“`ini
HTTP_REDIRECT=n
“`
2. **Đổi Port web của Mailcow**:
Tránh xa port 80/443 ra nhé.
“`ini
HTTP_PORT=8080
HTTPS_PORT=8443
“`
3. **Mở Bind Address**:
Để NPM (nằm ở container khác) có thể gọi được vào Mailcow.
“`ini
HTTP_BIND=0.0.0.0
HTTPS_BIND=0.0.0.0
“`
Khởi chạy Mailcow:
“`bash
docker compose up -d
“`
—
## 3. Cấu hình Nginx Proxy Manager
Vào trang quản trị NPM, tạo một Proxy Host mới cho `mail.domain-chinh.com`.
* **Scheme**: `http` (Lưu ý: Chọn HTTP, không phải HTTPS).
* **Forward Hostname/IP**: `172.17.0.1`
*(Đây là IP của Docker Gateway, giúp NPM “nhìn thấy” Mailcow)*.
* **Forward Port**: `8080` (Cái port mình vừa đổi ở trên).
Vào tab **SSL**, xin chứng chỉ Let’s Encrypt và bật **Force SSL**.
Vậy là xong! Bạn có thể truy cập webmail mà không bị lỗi Loop.
—
## 4. Xử lý các lỗi thường gặp
### Lỗi 504 Gateway Time-out
Nếu NPM quay tít rồi báo lỗi 504, nghĩa là Firewall đang chặn kết nối giữa các container.
Cách fix nhanh (nếu dùng UFW):
“`bash
ufw allow from 172.16.0.0/12 to any
“`
### Gmail chặn email (Lỗi 550-5.7.1)
Nếu gửi mail vào Gmail bị báo lỗi “IP not authorized”, bạn cần kiểm tra **PTR Record (Reverse DNS)**.
* Vào trang quản lý VPS, tìm mục PTR Record.
* Trỏ IP của VPS về `mail.domain-chinh.com`.
* *Lưu ý*: Mỗi IP chỉ có 1 PTR. Các domain phụ (`dpsmedia.vn`) vẫn gửi mail được nhờ cơ chế SPF “include”.
—
## 5. Cấu hình Đa TiMiền (Multi-Domain)
Mailcow hỗ trợ nhiều domain trên một server. Ví dụ bạn muốn thêm `@dpsmedia.vn`:
1. Vào Mailcow UI -> **Configuration** -> **Mail Setup** -> **Domains** -> Thêm `dpsmedia.vn`.
2. Vào trang quản lý DNS của `dpsmedia.vn`, trỏ các bản ghi MX, SPF về server chính:
* **MX**: `mail.khaisanfood.vn` (Priority 10).
* **SPF**: `v=spf1 mx include:mail.khaisanfood.vn ~all`.
* **DKIM**: Lấy từ Mailcow UI.
Vậy là bạn có thể dùng chung một hạ tầng Mailcow cho hàng chục domain khác nhau.
—
## Kết luận
Việc chạy Mailcow sau Nginx Proxy Manager không quá phức tạp nếu bạn hiểu rõ cơ chế SSL và Port binding. Hy vọng bài viết này giúp anh em đỡ tốn thời gian debug như mình!
*Bài viết thuộc về đội ngũ kỹ thuật DPS Media.*

Leave a Reply