{ "module": "mesh-mail", "version": "1", "slug": "mail", "seats": [ { "name": "mail-store", "scope": "mesh", "serves": ["accounts", "search", "read", "send"] }, { "name": "mail-webclient", "scope": "mesh", "serves": ["open", "status"] }, { "name": "mail-notifier", "scope": "node", "needs": ["node-notifier"], "serves": ["status"] } ], "claims": [ { "name": "mail-store", "scope": "mesh", "serves": ["accounts", "search", "read", "send"] } ], "requires": [ "postgres-database", "s3-bucket" ], "contributes": { "postgres-database": { "name": "mail" } }, "binds": { "postgres-database": "${dir:state}/database.json", "s3-bucket": "${dir:state}/store-binding.json" }, "secrets": { "postgres-database": "${dir:state}/database.secret", "s3-bucket": "${dir:state}/store.secret" }, "own-secrets": { "mail-credential-*": { "path": "${dir:state}/mail-credential-*.secret", "issued-by": "outside", "prompt": "the password of the mail account {member}" } }, "config": { "accounts": { "type": "object", "description": "The mail accounts, each by a lower-case name that names it on the bus and its secret: its kind (imap), address, incoming and outgoing servers (host, port, security tls or starttls), and optionally the folders watched and the user it signs in as; no password, which is the own secret mail-credential- (novox/hq ADR 0359 §5).", "trusted": true, "default": {} }, "grants": { "type": "object", "description": "Per account, who may read its mail and who may send from it: a module's name (on every machine), ., or person.. Nobody by default; it restricts the stream MAIL and the tools mail_search, mail_read and mail_send alike (novox/hq ADR 0359 §4).", "trusted": true, "default": {} } }, "tools": [ "mail_accounts", "mail_search", "mail_read", "mail_health", "mail_send", "mail_send_status", "mail-store.accounts", "mail-store.search", "mail-store.read", "mail-store.send" ], "uses": [ "operator-channel" ], "state": [ "sends" ], "streams": [ { "name": "mail", "events": [ "mail.*.message.added", "mail.*.message.changed", "mail.*.message.removed" ], "max-age-days": 7, "grant": { "config": "grants", "events": "mail.{key}.**" } } ], "resources": [ { "id": "state", "type": "directory", "mode": "0700", "place": "." }, { "id": "database-url", "type": "file", "path": "${dir:state}/database.url", "mode": "0600", "template": "files/database-url" }, { "id": "store", "type": "file", "path": "${dir:state}/store.json", "mode": "0600", "template": "files/store.json" }, { "id": "accounts", "trusted": true, "type": "file", "path": "${dir:state}/accounts.json", "mode": "0600", "merge": "json", "template": "files/accounts.json", "takes-config": [ "accounts" ] }, { "id": "grants", "trusted": true, "type": "file", "path": "${dir:state}/grants.json", "mode": "0600", "merge": "json", "template": "files/grants.json", "takes-config": [ "grants" ] }, { "id": "prepare", "type": "process", "name": "mesh-mail-prepare", "artifact": "tools", "run": [ "./mesh-mail", "prepare" ], "run-once": true, "env": { "DATABASE_URL_FILE": "${dir:state}/database.url" }, "restart-on": [ "database-url" ] }, { "id": "keep", "type": "process", "name": "mesh-mail-keep", "artifact": "tools", "run": [ "./mesh-mail", "keep" ], "env": { "DATABASE_URL_FILE": "${dir:state}/database.url", "MESH_MAIL_ACCOUNTS": "${dir:state}/accounts.json", "MESH_MAIL_SECRETS": "${dir:state}", "MESH_MAIL_STORE": "${dir:state}/store.json" }, "restart-on": [ "database-url", "store", "accounts" ], "health": { "kind": "unit" } }, { "id": "watch", "type": "process", "name": "mesh-mail-watch", "artifact": "tools", "run": [ "./mesh-mail", "watch" ], "user": "${machine:account}", "env": { "DATABASE_URL_FILE": "${dir:state}/database.url", "MESH_MAIL_ACCOUNTS": "${dir:state}/accounts.json", "MESH_MAIL_SECRETS": "${dir:state}", "MESH_MAIL_STATUS": "${dir:state}/health.json" }, "restart-on": [ "database-url", "accounts" ], "health": { "kind": "tool", "tool": "mail_health", "needs": "postgres-database", "interval": "60s", "timeout": "10s", "looks": 2, "grace": "180s" } } ], "build": { "artifacts": [ { "name": "tools", "kind": "bundle", "language": "go", "system": "arch", "from": "cmd/mesh-mail", "binary": "mesh-mail", "loads": [ "mesh-mail" ], "env": { "DATABASE_URL_FILE": "${dir:state}/database.url", "MESH_MAIL_ACCOUNTS": "${dir:state}/accounts.json", "MESH_MAIL_GRANTS": "${dir:state}/grants.json", "MESH_MAIL_SECRETS": "${dir:state}", "MESH_MAIL_STORE": "${dir:state}/store.json", "MESH_MAIL_STATUS": "${dir:state}/health.json" } }, { "name": "files", "kind": "archive", "from": "files" } ] } }