Назад | Перейти на главную страницу

Как сделать так, чтобы веб-сайт и докеризованная веб-почта работали вместе на одном сервере

У меня новая машина VPS, где:

  1. Установите nginx на основном хосте для обслуживания моего веб-сайта домена (например, example.com) на портах 80 443. example.com conf на хосте nginx:

    server {
        server_name example.com www.example.com;
        root /var/www/www.example.com;
        listen 80;
        listen 443 ssl http2;
        listen [::]:443 ssl http2;
        ssl_certificate     /etc/ssl/certs/example.com_by_cloudflare.pem;
        ssl_certificate_key /etc/ssl/private/example.com_by_cloudflare.key;
    }
    
  2. Установлен контейнерный почтовый сервер (Poste.io2 docker) для обслуживания писем @ exmaple.com. Имя хоста почтового сервера: mail.example.com. Он также использует nginx на портах 80, 443 для обслуживания портала веб-почты. (Poste.io2 устанавливается с помощью этой команды:

    sudo docker run \
          --net=host \
          -e TZ=Etc/UTC \
          -v /var/posteiodata:/data \
          --name "posteiomailserver" \
          -h "mail.example.com" \
          -t analogic/poste.io
    

Проблема в том, что я хочу, чтобы работали и веб-сайт (example.com), и веб-почта (mail.example.com). Я не уверен, можно ли с этим справиться через DNS, nginx / обратный прокси на хосте / докере? или это невозможно, и я должен что-то изменить.

Буду признателен, если у вас есть совет.

P.S DNS под управлением Cloudflare, записи DNS выглядят так:

mail.example.com.  1    IN  A           <server_ip_address>
example.com.       1    IN  A           <server_ip_address>
www.example.com.   1    IN  CNAME       example.com.
example.com.       1    IN  MX      0   mail.example.com.

Мне кажется, обратный прокси-сервер - лучший вариант. Он прослушивает 80 и 443 для обоих поддоменов и пересылает запрос на один из серверов. Оба сервера будут открывать другие порты, например, 8080, 8443 для веб-сервера и 9090, 9443 для почтового сервера.

Я решил проблему следующим образом:

  1. Запустите докер с переменными среды HTTP_PORT = 5080 и HTTPS_PORT = 4433. Это заставит контейнерный nginx работать на портах 5080, 4433:
sudo docker run \
       --net=host \
       -e TZ=UTC \
       -e "HTTP_PORT=5080" \
       -e "HTTPS_PORT=4433" \
       -v /var/posteiodata:/data \
       --name "posteiomailserver" 
       -h "mail.example.com" \
       -t analogic/poste.io
  1. Откройте порты 4433, 5080 на хост-машине:
sudo iptables -A INPUT -p tcp --dport 4433 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 5080 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
sudo service iptables save
  1. Создан nginx conf для пересылки 443 на 4433 при открытии mail.example.com:

sudo nano /etc/nginx/sites-available/mail.example.com

server {
  listen 443 ssl http2;
  listen [::]:443 ssl http2;
  server_name mail.example.com;
  ssl_certificate     /etc/ssl/certs/example.com_by_cloudflare.pem;
  ssl_certificate_key /etc/ssl/private/example.com_by_cloudflare.key;

  location / {
    proxy_pass https://127.0.0.1:4433;
  }
}
  1. Включите новую конфигурацию и запустите nginx:
sudo ln -s /etc/nginx/sites-available/mail.example.com.conf /etc/nginx/sites-enabled/
sudo nginx -t
sudo service nginx start

Теперь я могу просматривать свой сайт на example.com и электронную почту на mail.example.com, вуаля!