feat: setup websockify

This change makes it possible
to connect the client over WebSocket.
Running `websocat wss://example.org/imap`
connects to the IMAP
and running `websocat wss://example.org/smtp`
connects to SMTP (submission service, not port 25).

Connecting from a web client will still need a CORS policy
for clients not running on the same domain,
but for non-web clients this is already usable.
This commit is contained in:
link2xt
2026-07-29 20:38:53 +00:00
parent 14f829003d
commit 02c7d3da58
5 changed files with 59 additions and 0 deletions
+2
View File
@@ -32,6 +32,7 @@ from .external.deployer import ExternalTlsDeployer
from .filtermail.deployer import FiltermailDeployer from .filtermail.deployer import FiltermailDeployer
from .mtail.deployer import MtailDeployer from .mtail.deployer import MtailDeployer
from .nginx.deployer import NginxDeployer from .nginx.deployer import NginxDeployer
from .websockify.deployer import WebsockifyDeployer
from .opendkim.deployer import OpendkimDeployer from .opendkim.deployer import OpendkimDeployer
from .postfix.deployer import PostfixDeployer from .postfix.deployer import PostfixDeployer
from .selfsigned.deployer import SelfSignedTlsDeployer 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), PostfixDeployer(config, disable_mail),
FcgiwrapDeployer(), FcgiwrapDeployer(),
NginxDeployer(config), NginxDeployer(config),
WebsockifyDeployer(config),
MtailDeployer(config.mtail_address), MtailDeployer(config.mtail_address),
GithashDeployer(), GithashDeployer(),
] ]
+14
View File
@@ -140,6 +140,20 @@ http {
proxy_pass http://127.0.0.1:3340; proxy_pass http://127.0.0.1:3340;
proxy_http_version 1.1; 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 # Redirect www. to non-www
@@ -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")
@@ -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
@@ -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