Compare commits

..

1 Commits

Author SHA1 Message Date
holger krekel
ca763960e5 streamline account creation and add tests
also incorporates nine.testrun.org user policies
2023-11-01 20:30:12 +01:00
8 changed files with 28 additions and 128 deletions

View File

@@ -1,61 +1,26 @@
# Chatmail instances optimized for Delta Chat apps
# Chat Mail server configuration
This repository helps to setup a ready-to-use chatmail instance
This repository setups a ready-to-go chatmail instance
comprised of a minimal setup of the battle-tested
[postfix smtp](https://www.postfix.org) and [dovecot imap](https://www.dovecot.org) services.
[postfix smtp server](https://www.postfix.org) and [dovecot imap server](https://www.dovecot.org).
The setup is designed and optimized for providing chatmail accounts
for use by [Delta Chat apps](https://delta.chat).
## Getting started
Chatmail accounts are automatically created by a first login,
after which the initially specified password is required for using them.
## Getting Started deploying your own chatmail instance
1. Prepare your local (presumably Linux) system:
1. prepare your local system:
scripts/init.sh
2. Setup a domain with `A` and `AAAA` records for your chatmail server.
2. setup a domain with `A` and `AAAA` records for your chatmail server
3. Set environment variable to the chatmail domain you want to setup:
3. set environment variable to the chatmail domain you want to setup:
export CHATMAIL_DOMAIN=c1.testrun.org # replace with your host
4. Deploy the chat mail instance to your chatmail server:
4. run the deploy of the chat mail instance:
scripts/deploy.sh
This script uses `pyinfra` and `ssh` to setup packages and configure
the chatmail instance on your remote server.
5. Run `scripts/generate-dns-zone.sh` and
transfer the generated DNS records at your DNS provider
6. Start a Delta Chat app and create a new account
by typing an e-mail address with an arbitrary username
and `@<your-chatmail-domain>` appended.
Use an at least 10-character random password.
### Ports
Postfix listens on ports 25 (smtp) and 587 (submission) and 465 (submissions).
Dovecot listens on ports 143(imap) and 993 (imaps).
Delta Chat will, however, discover all ports and configurations
automatically by reading the `autoconfig.xml` file from the chatmail instance.
## Emergency Commands to disable automatic account creation
If you need to stop account creation,
e.g. because some script is wildly creating accounts, run:
touch /etc/chatmail-nocreate
While this file is present, account creation will be blocked.
5. run `scripts/generate-dns-zone.sh` and create the generated DNS records at your DNS provider
## Running tests and benchmarks (offline and online)
@@ -70,26 +35,28 @@ While this file is present, account creation will be blocked.
scripts/bench.sh
## Running tests (offline and online)
## Development Background for chatmail instances
```
## Dovecot/Postfix configuration
This repository drives the development of "chatmail instances",
comprised of minimal setups of
### Ports
- [postfix smtp server](https://www.postfix.org)
- [dovecot imap server](https://www.dovecot.org)
Postfix listens on ports 25 (smtp) and 587 (submission) and 465 (submissions).
Dovecot listens on ports 143(imap) and 993 (imaps).
as well as two custom services that are integrated with these two:
## DNS
- `chatmaild/src/chatmaild/dictproxy.py` implements
create-on-login account creation semantics and is used
by Dovecot during login authentication and by Postfix
which in turn uses Dovecot SASL to authenticate users
to send mails for them.
- `chatmaild/src/chatmaild/filtermail.py` prevents
unencrypted e-mail from leaving the chatmail instance
and is integrated into postfix's outbound mail pipelines.
For DKIM you must add a DNS entry as found in /etc/opendkim/selector.txt on your chatmail instance.
The above `scripts/deploy.sh` prints out the DKIM selector and DNS entry you
need to setup with your DNS provider.
## Emergency Commands
If you need to stop account creation,
e.g. because some script is wildly creating accounts,
just run `touch /tmp/nocreate`.
You can remove the file
as soon as the attacker was banned
by different means.

View File

@@ -202,7 +202,7 @@ def _configure_nginx(domain: str, debug: bool = False) -> bool:
need_restart = False
main_config = files.template(
src=importlib.resources.files(__package__).joinpath("nginx/nginx.conf.j2"),
src=importlib.resources.files(__package__).joinpath("nginx.conf.j2"),
dest="/etc/nginx/nginx.conf",
user="root",
group="root",
@@ -212,7 +212,7 @@ def _configure_nginx(domain: str, debug: bool = False) -> bool:
need_restart |= main_config.changed
autoconfig = files.template(
src=importlib.resources.files(__package__).joinpath("nginx/autoconfig.xml.j2"),
src=importlib.resources.files(__package__).joinpath("autoconfig.xml.j2"),
dest="/var/www/html/.well-known/autoconfig/mail/config-v1.1.xml",
user="root",
group="root",
@@ -277,12 +277,6 @@ def deploy_chatmail(mail_domain: str, mail_server: str, dkim_selector: str) -> N
opendkim_need_restart = _configure_opendkim(mail_domain, dkim_selector)
nginx_need_restart = _configure_nginx(mail_domain)
# deploy web pages and info if we have them
pkg_root = importlib.resources.files(__package__)
www_path = pkg_root.joinpath(f"../../../www/{mail_domain}").resolve()
if www_path.is_dir():
files.rsync(f"{www_path}/", "/var/www/html", flags=["-avz"])
systemd.service(
name="Start and enable OpenDKIM",
service="opendkim.service",

Binary file not shown.

Before

Width:  |  Height:  |  Size: 96 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 66 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 163 KiB

View File

@@ -1,61 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>nine.testrun.org - Experimenting with the Future of Email</title>
<meta name="viewport" content="width=device-width, initial-scale=1">
<style>
.wrapper {
width: 100%;
max-width: 596px;
margin: 0 auto;
}
.section {
width: 100%;
max-width: 596px;
}
.text {
box-sizing: border-box;
padding: 9px;
font-size: 18px;
font-family: "Courier New", monospace;
color: white;
background-position: left top;
background-image: url(collage-bg.png);
background-repeat: no-repeat;
background-size: 100% 100%;
}
h1, h2, h3 {
font-size: 16px;
font-weight: bold;
}
</style>
</head>
<body>
<div class="wrapper">
<img class="section" src="collage-top.png" />
<div class="section text">
<h1>welcome to nine.testrun.org</h1>
<p>
to get an account,
invent a word with <i>exactly</i> nine characters
and append @nine.testrun.org to it.
eg. <b>hellofits@nine.testrun.org</b>
</p>
<p>
if the email address is not yet taken, you'll get that account.
the first login sets your password.
that's it.
</p>
</div>
<img class="section" src="collage-down.png" />
<div class="section text">
<h1>faq</h1>
<p><i>why are other email providers 1000 times more complicated?</i></p>
<p>because they want to for $reasons</p>
</div>
</div>
</body>
</html>