So, welcome everybody new in the room. And yeah, we have a very interesting new guest here,
which is Margo from Star Wars. So, give him a warm welcome and let us learn about it.
Thank you very much.
Yeah. Okay, welcome. First time doing a talking front of a large audience. So, I hope
you go as well.
Okay. Okay.
So, I want to do a brief story about the project. I've been involved with emails for a few
years already. I started with UUCP, download emails with a modern. Then in the late 90s,
I wrote a web mail in C, using CGI 1.0. Then I wrote a mail server in the 2000s and then
another mail server in Java. So, then what happened is that after taking a break to study,
I went back to the email world and I saw that everything was pretty much the same.
Like, there was still post-fix, dog code around. And yeah, and I said, we have something
to be done about that. So, of course, post-fix and dog code are great tools. They're
rock solid. They've been there for decades. But yeah, they haven't changed much.
So, if you want to run a mail server, you need different tools from different providers,
only post-fix and dog code, you also need other tools. I will cover later.
Then, also, you need experience maintaining all these different tools, because they're not from
the same people. Then, yeah, for debugging, you need to go through different types of logs,
also multiple dependencies. Also, no unify administration interface. There's, yeah, of course,
even also post-fix and dog code do not have a UI in it to use their party tools.
And they were not designed for scalability, or modern email protocols. For example,
mail deal, of course, you can make it scale, but it's not, it's not scalable.
Also, with post-fix, they all accuse our local. They're not designed to be running a cluster.
Like, it's one delivery server fails, and other one can take over.
So, then, you have solutions like mail in a box and mail cow, and all those dog surveys,
solutions that bundle multiple tools, but it's just an attempt to simplify, but they don't solve
the long-term problems. So, they're just wrapping the complexity in a box.
So, running a mail server shouldn't be like having a big shopping list that you need,
post-fix, someone says, in post-grade, became the virus.
This was taken from the latest mail in a box, Dockerfile, all the stuff they're downloading.
Okay, so, say we'll buy to complexity and hello to store work.
Okay, store work is an all-in-one mail server.
It includes services. It's a single binary that includes everything you need to run a mail server.
It has S&TP, JMA, PIMA4, POP3, ManageCiv, it has a building, spam and fishing filter.
Well, based admin, it is a scaleable from day one, modern, programmable, secure, and was also
a memory safe, written in Rust. And it's available for Unix, UNBSE, Windows, and also a Docker container.
So, to install, store work is really easy, you just download the script, you install it, and that's it.
And then you go to the admin, you log in, and what you just need to do is enter your main host name.
There's a name of your server, and then you have to have a, well, an acrylic provider.
And it supports different challenge types, TLS, ALPN, zero-one, DNS zero-one, HTTP zero-one.
But I won't spend too much time here. Then you add the domain, and your first account, and you're ready to owe.
You reload the configuration, and that's it, you have the mail server up and running.
So, store work started as a JMAP store, then I'll support for IMAP, Pop3, and it has a competing implementation of JMAP.
The core mail, the draft on the latest draft for seed scripts, web sockets, blog management, quotas, and coming soon this year calendars and contacts.
Then also supports IMAP, the new version of the revision 2, is compatible with revision 1, has the construct, you're receiving access control lists, and many other extensions.
It also supports old protocols like pop3, extensions, the pop3s, and managed seed.
This NTP series is a programmable and scalable MTA. Dynamic configuration rules with expressions that we're going to cover later.
It has seed scripting, so you can run seed scripts, although seed scripts were designed for the mailbox delivery, you can run them at each page of the SMPP session, the data, RCPT and so on.
It supports a filter that was a relic from the send mail area, era, and it supports a modern protocol that should be standardized at some point called MTA hooks, which is an HTTP device.
It's like the JMAP to filter for to IMAP for filtering on it.
It also enveloped rewriting and message notification.
What then includes everything for send error message authentication, the mark, the KEM, SPF, Arc, reverse IP, and the MTA report, but you want support VMAP until the protocol is fixed.
If you have problems, you will tell you what is doing at each page of the email delivery test.
Something goes wrong, you can test and you will tell you what is going on.
Also, you can do DMARC troubleshooting.
You can see what wrong with your own domain and also with external domains.
Those supports strong transport security, ZIN, MTA, STI, TLS reporting.
I know that's automatic analysis of TLS reports that you receive.
You can turn them if you have a failing report or indicate failures.
You can turn them into web hooks or log them to open telemetry or whatever you like.
This is how the MARC and TLS reporting analysis.
So you don't need those online services like the MARC or the MARC tools.
You can do that from store work.
So you can see the reports that you will send and the report you received.
Also, what happened to that?
This is for all TLS and the MARC.
And then the message queue, since NTP server, they're distributed.
So if you run store work in a cluster and once server crashes, another server can take over and keep the delivery in those messages.
This is a shared message queue.
It has enabled an algorithm right limiting to prevent spammer from your side and to prevent attacks also from the outside.
Also, a queue quota, you can say from this domain or from this sender,
only maximum of these megabytes or messages can be the queue at any given time.
Dynamic routing rules.
Also, delay and priority delivery with an extension called MTP priority and virtual queue.
This is how you can manage the queue from the web.
From the web admin, see all the delivery attempts, check the contents and so on.
I also see the delivery history.
The message queue, all the attempts for each session are going, you can see what happened.
Okay.
Something I forgot to mention at the beginning, the server is completely open source under HPL3.
But there are some modules like multi-tenancy that are available to sponsor,
GitHub sponsors and open collective sponsors.
But like 95% is completely free.
So the spam on feature in filter, it was based on R spam D.
So it's a complete solution.
You don't need to run any external spam filters.
So the problem with doing that, using external tool is that,
sorry, the problem with using external tools is that you need to rerun all the tests that store
over this because over a meter you get information about the envelope.
But you don't get unless they look at the headers, you don't get the remark and the team validation data.
They need to redo all the tests and pass the message again.
So as I say, it's a built-in filter that's required in third-party software.
The use rules are a compiler runtime and it avoids regular expression.
Unless you write one, it uses, it warns you and you write your expression because I got scared by looking as spam assassin.
And there were so many.
Also, it has a protection, it's quite effective.
And also, there is a repository where you can update and contribute rules to the filter.
It supports the text, a photographic attacks, fish in attacks on URLs, DNS blocklies,
collaborative data based filtering with Python, for example, trust-presser replies,
send the reputation monitoring to adjust the reputation based on the history.
A great listing of spam trap, although a listing is not used nowadays, it's not pretty effective.
Also, sorry for the term AI, so it means machine learning, access to, it includes the classic base spam filter,
either global and also per user, automatic trading of classifiers when a score is too high or too low,
you can trigger the automatic classification.
Also, it can integrate with LLMs, either self-coaster or cloud for filtering to get an assistant of what the LLMs thought about the context of the message,
because nowadays, most of the spam comes from Google and Microsoft, so you need to, they're passing all checks.
They're not blocked anywhere, so you need to look at the content at some point, it's offering stuff that I don't need, so, and you do that as well.
Also, you can run LLMs from ship scripts to classifier your messages, and this is something that's been evaluated using bird models for spam classification,
because LLMs you might know is quite slow, if you have a heavy server, you will take hours to take process your message queue,
so another alternative is bird, but it requires some training.
Well, Star Wars is also secured, that was an important part.
It's important to not rest.
Something important is that other provided like proton mail or even the op code says the offer,
because it is an encryption address, but you don't hold the packet key, so it doesn't matter,
because when you transfer the message or I map is an encrypted, they can look at it.
I mean, the administrator, at least using a proprietary solution, like a bit more than, they can still look at your, have access to your data.
So, Star Wars is an asymmetric encryption with open BGP or S-mines, so you upload your public key,
and when the message is receiving clear text, it will automatically encrypt it.
So, yeah, and this MS is already encrypted, it won't be encrypted, obviously.
Also, you may ask what happens with the full text search.
Of course, I cannot be encrypted, but you can offer kite using Bloom filters.
Using the internal full text search of Star Wars, you can offer kite the words.
Of course, you can do a dictionary attack and find what are those words, but it's a layer of protection, if you want to lose full text.
Also, yeah, no private keys are stored.
So, an encryption can't read the user data.
This is how it looks, you select your encryption key.
This is a self-service portal, what user view, you paste your key, same changes, and that's it.
And the encryption address is enabled.
Okay, all the security features, as Star Wars has, it has a built-in like fail to run,
if someone is trying to try recipients or try a multiple authentication failures,
or try to scan your server, you will block them.
So, it's not how access to firewall tables, it will just drop the connection, what that IP is blocked.
But you can import the block type piece and add them to your firewall, if you like.
Also, it has rate and concurrency limiting on jima, iMap, everywhere, permission,
for every action that can be done in the server.
And access control list through the iMap ACL extension of the jima, sharing draft.
You can bundle those permissions in rows and assign rows to users, so you have groups.
I mean, it's memory safe for people who are at Rust.
It's not a feature, but I've been a Rust fanboy, I have to list it as a feature Rust.
So, it has a lot of features, also an addition to what I've mentioned.
It has a lot of backends that you can use.
Foundation DV, I don't know if you're familiar with it, it was created by Apple.
They use it internally in clusters of thousands of servers to running infrastructure, so it's very scalable.
It's a bit tricky to implement because it has some limits, but it's a best option you have for running Star Wars in a cluster.
But if you prefer Postgres or Aloy TV, Galera, all those, you can also use them.
For local store, you have ROX TV and SQLite.
This is for the in memory store, ready for the blobs, S3 or Azure, or Minio or Garage.
Or the file system, and elastic cert if you want for full text, and LDAP for authentication.
These are the expressions, this is how you configure a store work.
They're optional, you can also use static values. They're used everywhere.
They're compiled, and they control the different parts of the server, for example, routing of the indication span rules and so on.
This is how it looks, for example, this is to determine the authentication mechanisms for incoming S&TP connection.
Is a port is not 25, so it means not 25 is a submission port.
Those mechanisms will be available.
So it's not a script in language, this is a configuration file in Toml, so there are little bunch sections of code you see there.
This is a sender writing rule, so this is a regular expression to extract parts of the envelope to write the new mail from it.
And this is a dynamic routing rule, if it's basically saying that if you have a failure of the delivery attempt, use a relay host as a full byte.
And this is a TLS rules for out on delivery, so it's the first delivery attempt fails.
If needed to TLS, it will disable accepting valid search, because there are a lot of servers out there, we invalid TLS certificates.
And then if there are more fail attempts, it will just disable start TLS.
But if this is not default rules, there are just examples.
So if the people want to disable TLS, it's up to their own, so this is just an example.
And this is a spam field rule to determine a fake reply, tells what to look in the message.
So it's a feature-rich, it includes also, you need to use elastic search, because a built-in full-text search engine that supports language detection, standing, stop or remove everything in 17 languages.
She's creating supports every single extension of there.
Alias has made in lease, salad dressing, cachaul, auto config, auto discover, act me with all the mechanisms with itenasy.
This code has pertinent, you can manage use RACAPI to manage the server also.
And also, although this is not only for small hosted, you can run stolen distributed environments.
In fact, the server was designed with scalability from day one.
In fact, the first version implemented the raft consensus protocol.
But then later decided to move to foundation dv, because I did not like that with Paxos or this raft.
Also, you need a leader at all times.
So foundation dv is, you can write to any node.
And so you don't have that problem with elections and finding a new leader and so on.
So it was built to scale.
You can load balance and scale store work.
It's a coordinator free architecture.
It has a glossy protocol, UDP, very similar to swim.
If you're familiar with it, you can discover nodes in the cluster automatically,
and also detects field failures.
If something goes with a node crashes, another one can take over and refresh the queue.
Take over requests and so on.
Also, it's a partition tolerance.
If you have some servers that cannot reach each other through this glossy protocol,
you can, it will detect that those servers are alive.
They will consider them.
Also, you can run forward in their Kubernetes.
Also, read the application.
Sure.
And back in.
Okay.
For the authentication features, it's what's open ID.
Both as a provider and you can contact, also authenticate against other open ID connect servers.
It supports all of the code and device flows.
You can also authenticate advanced LDAP, what I said will open ID connect.
SQL is supposed to factor authentication with time one time base password.
Application password also.
This is how the user will look set up their application password.
So to fast work authentication.
Okay.
So it also has a lot of telemetry and observability features.
You can log to open telemetry.
Journality log supports metrics.
Sorry.
That is a logging and tracing value also supports metrics.
It can be sent to open telemetry and promissios.
Web hooks for events alerts, light tracing and metrics.
This is how the log viewer looks like.
This is if you don't use an open telemetry.
This is how it's light tracing.
You can see the logs.
What's happening in real time.
This is using event source.
Or this is a web as mean.
So you can manage everything from the world mean.
You can access.
You need to connect to a server to do anything.
Great user change configuration.
Everything is on from the world.
Also has a self service portal.
It's also developing rust.
It's an SPA.
So runs entirely on the browser.
It's a separate application.
And talk to store what over the rest API.
And yeah.
It's fast and responsive.
So it has a dashboard.
A count of main group management.
Management of cues.
The view in the mark and tele reports.
Both for the positive receive and send.
You can configure everything from there.
And log viewer.
This is how it looks.
Just a quick overview of how it looks like.
I mean, there are a lot of settings everywhere.
You can you can explore this later if you like.
This is how the account management looks like.
So you can go there.
Change authentication.
Quotes.
On.
Memberships.
And this long list of permissions that you can adjust for user.
And you can bundle them also as a as a role.
It's a dashboard.
Of course, this is if you're using open telemetry or
permission for how you can be even better dashboard and customize to you.
But OK.
Thank you.
Thank you for the presentation.
It was amazing.
I have a question.
So let's suppose you start with a single service set up, right?
Which is very simple.
It's a binary and it can be.
If one day you decide to scale it to two,
complexity wise, how hard is it to do it?
If you're not doing this to begin.
Well, it depends on the backend.
I mean, if you start with, for example, PostgresDB.
And you already have the data there.
It's really easy.
But if you have RocksDB.
No, you need to export your data.
You need to import it into the new, in the cluster.
That is because you're using different backend.
So that is a ratio.
To move from one backend to the other, is it a part for, is it?
There is a tool to export the import data.
Yeah.
To export the entire store.
And then import it again.
Yeah.
I'm going to ask you a question about, I'm not going to, I'm not going to,
I'm going to see if you're going to import the key.
I'm going to import it again.
So maybe.
And let's say that, like, where do I import the key?
I don't want to import.
And the main box has 100.
100.
You miss it a lot more.
And they want to delete, like, the $14.
Miss it.
So how do you make the sequence?
I'm going to actually miss it.
Do you like to cache it somehow?
Yeah.
It has cache.
I'm up cache.
And that it has an eviction policy.
So you can configure the amount of memory.
You can, you give to the cache to keep those.
I'm up mailboxes in memory.
But what's up?
It's a million.
No, no.
You limit the cache based on memory.
So you tell, I want to use maximum.
I know two gigabytes of memory, for example.
And then you have the penalty of that story.
And if you recall, you like, don't think much.
Number each time you access the mailbox.
Because it won't be in the cache.
But yeah, it needs to, it's done when the user locks in.
Why am I?
And then it keeps that in memory until they, they leave.
Yeah.
So the question was, how I have specific numbers.
Can we be trained in the foundation database?
I think so.
That's done.
Yeah.
So both the version two and the version six.
Yeah.
So if it's towards a proxy protocol, which is a protocol,
when you run store or be kind of reverse proxy.
And yes, it does.
It's a both version.
I remember there were two and six.
But both of them are supported.
You can use run store or be kind of energy next.
Cali.
And traffic on any other that supports.
The question.
What is your feedback about?
Jay Mat.
Oh, it was a good feeling.
If I was the first thing I implemented.
So it's.
But it's, yeah, it needs more adoption.
It must, you need, someone needs to convince Google to use it.
Yeah.
And the big player.
Because it's hard to get out there.
I need to figure it out in the question.
How do you.
What's the type of agenda?
We will actually have an access session.
It's up to do.
Because there's one talk.
By taking a visit.
So we will have a panel on jam.
Where we might talk a little bit more about that.
And two more.
I think you.
The back.
And then.
Yeah.
I'm wondering how are you able.
And then.
What's the perspective of the.
The example for this.
Or.
Or there.
And then.
You have done.
Or.
You.
But.
Basically.
Oh, if it's.
How.
I can make.
Let me.
We.
We do it.
Yeah.
Well, basically because I have a sea background.
And back in the days, I only have like a make file.
TXT editor and a lot of segmentation faults.
So.
So now with.
Rust is like a monorocative because it has a really good.
I don't know if you're familiar with Rust.
I is very strict.
I remember the first time I call the the mail parcel library.
I spend I don't know how long trying to.
Use references and still that.
You become friends with the reference checker.
You.
Everything fly because you.
It prevents bugs and errors.
A compile time.
You can not compile broken code in many cases.
So that in addition to all the tools that you have in.
Around the Rust ecosystem.
Uh, makes it much easier and also the experience.
Like this is a.
The lessons learned from the the previous two.
My service I wrote in in C and Java.
So I have the experience implementing these protocols.
Uh, before that all their versions.
So he was that and yeah and and Rust.
Yeah.
Okay.
One final test.
Yeah.
And the chance to be able to use.
Uh, much.
It's important.
I'm not in that.
Right.
I guess.
Uh, if it's possible to use the multi-tenancy support in.
Uh, interpret.
No.
No, no, no, no.
That feature is available to sponsors because of those.
A lot of the version has a lot of stars.
Not a lot of people are contributing and to keep the.
Procipes alive.
I, I thought the only way was to.
Uh, make these features available.
You need to be enterprise.
You can be a GitHub or a pent collective sponsor.
Uh.
You