diff --git a/cmdeploy/src/cmdeploy/deployers.py b/cmdeploy/src/cmdeploy/deployers.py index de1100363..4e6925df9 100644 --- a/cmdeploy/src/cmdeploy/deployers.py +++ b/cmdeploy/src/cmdeploy/deployers.py @@ -32,6 +32,7 @@ from .filtermail.deployer import FiltermailDeployer from .mtail.deployer import MtailDeployer from .nginx.deployer import NginxDeployer +from .websockify.deployer import WebsockifyDeployer from .opendkim.deployer import OpendkimDeployer from .postfix.deployer import PostfixDeployer from .selfsigned.deployer import SelfSignedTlsDeployer @@ -565,6 +566,7 @@ def deploy_chatmail(config_path: Path, disable_mail: bool, website_only: bool) - PostfixDeployer(config, disable_mail), FcgiwrapDeployer(), NginxDeployer(config), + WebsockifyDeployer(config), MtailDeployer(config.mtail_address), GithashDeployer(), ] diff --git a/cmdeploy/src/cmdeploy/nginx/nginx.conf.j2 b/cmdeploy/src/cmdeploy/nginx/nginx.conf.j2 index 04ab3643f..9ad20e05f 100644 --- a/cmdeploy/src/cmdeploy/nginx/nginx.conf.j2 +++ b/cmdeploy/src/cmdeploy/nginx/nginx.conf.j2 @@ -140,6 +140,20 @@ http { proxy_pass http://127.0.0.1:3340; proxy_http_version 1.1; } + + location /imap { + proxy_pass http://127.0.0.1:8143; + proxy_http_version 1.1; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection "upgrade"; + } + + location /smtp { + proxy_pass http://127.0.0.1:8587; + proxy_http_version 1.1; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection "upgrade"; + } } # Redirect www. to non-www diff --git a/cmdeploy/src/cmdeploy/websockify/deployer.py b/cmdeploy/src/cmdeploy/websockify/deployer.py new file mode 100644 index 000000000..f3982be7d --- /dev/null +++ b/cmdeploy/src/cmdeploy/websockify/deployer.py @@ -0,0 +1,19 @@ +from pyinfra.operations import apt, server + +from cmdeploy.basedeploy import Deployer + + +class WebsockifyDeployer(Deployer): + def __init__(self, config): + self.config = config + + def install(self): + apt.packages(name="Install websockify", packages=["websockify"]) + + def configure(self): + self.ensure_systemd_unit("websockify/websockify-imap.service") + self.ensure_systemd_unit("websockify/websockify-submission.service") + + def activate(self): + self.ensure_service("websockify-imap.service") + self.ensure_service("websockify-submission.service") diff --git a/cmdeploy/src/cmdeploy/websockify/websockify-imap.service b/cmdeploy/src/cmdeploy/websockify/websockify-imap.service new file mode 100644 index 000000000..c68f06643 --- /dev/null +++ b/cmdeploy/src/cmdeploy/websockify/websockify-imap.service @@ -0,0 +1,12 @@ +[Unit] +Description=WebSocket proxy for IMAP +After=network.target + +[Service] +Type=simple +Restart=always +ExecStart=/usr/bin/websockify 127.0.0.1:8143 localhost:143 +DynamicUser=true + +[Install] +WantedBy=multi-user.target diff --git a/cmdeploy/src/cmdeploy/websockify/websockify-submission.service b/cmdeploy/src/cmdeploy/websockify/websockify-submission.service new file mode 100644 index 000000000..76ba06a21 --- /dev/null +++ b/cmdeploy/src/cmdeploy/websockify/websockify-submission.service @@ -0,0 +1,12 @@ +[Unit] +Description=WebSocket proxy for SMTP +After=network.target + +[Service] +Type=simple +Restart=always +ExecStart=/usr/bin/websockify 127.0.0.1:8587 localhost:587 +DynamicUser=true + +[Install] +WantedBy=multi-user.target