Files
crockery/DESIGN.md

59 lines
1.4 KiB
Markdown

# Crockery design
## Overview
We need:
* SMTP server
* Receive emails -> middlewares -> storage
* https://github.com/emersion/go-smtp ?
* IMAP server
* Receive logins
* HTTP server
* Serve autodiscovery bumpf
* ActiveSync protocol
* Storage
* Give it a home directory. Stores Maildirs + settings DB + TLS
* Accounts
* Passwords!
* Emails
* TLS keys + certificates
* Emails go into Maildirs
* Search emails - some sort of inverted index necessary. One per maildir?
* https://github.com/blevesearch/bleve ?
* Settings DB should be a simple K-V store for accounts, passwords, etc. BoltDB?
* https://github.com/coreos/bbolt
* https://github.com/asdine/storm
## Database structure
I'm not sure what storm does under the hood. It seems clever. We have the
following, though:
* K-V store
* `config/domain`
* `domains/<domain>/config/cert`
* `domains/<domain>/config/key`
* ORM
* `Account`
* `Username`
* `Admin`
* `Wildcard`
* `PasswordHash`
* `Message`
* `ID`
* `Username`
* `Mailbox`
* `Header`
* `Body`
I don't seem to be able to get accounts for a list of usernames very easily, or
indexed-ly.
The message body is being stored inefficiently (json []byte, so base64-encoded)
Message username and mailbox are indexed, but is that good enough? Perhaps we
should have a bucket per mailbox or something?
TODO: rewrite this (and the code) to make Maildir into a thing