mesh/delivery checking
mesh/merge-gate out of date: judged against trunk fadf5025cc5a, the trunk is now 2edef5a00ae0; judged again on a recheck or when it is merged
mesh/repo-check out of date: judged against trunk fadf5025cc5a, the trunk is now 2edef5a00ae0; judged again on a recheck or when it is merged
ADR 0359 asked for a stream of its own and a bus grant from the module's grants; ADR 0363 built both. The events leave the shared EVENTS stream, and one family pattern per change replaces the literal per-account emits, so a new account changes no manifest.
190 lines
4.6 KiB
JSON
190 lines
4.6 KiB
JSON
{
|
|
"module": "mesh-mail",
|
|
"version": "1",
|
|
"slug": "mail",
|
|
"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"
|
|
}
|
|
},
|
|
"tools": [
|
|
"mail_accounts",
|
|
"mail_search",
|
|
"mail_read",
|
|
"mail_health"
|
|
],
|
|
"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",
|
|
"content": "postgresql://${bound:postgres-database:as}:${secret:postgres-database}@${bound:postgres-database:at}:${bound:postgres-database:port}/${bound:postgres-database:as}\n"
|
|
},
|
|
{
|
|
"id": "store",
|
|
"type": "file",
|
|
"path": "${dir:state}/store.json",
|
|
"mode": "0600",
|
|
"content": "{\n \"scheme\": \"${bound:s3-bucket:scheme}\",\n \"at\": \"${bound:s3-bucket:at}\",\n \"port\": \"${bound:s3-bucket:port}\",\n \"bucket\": \"${bound:s3-bucket:bucket}\",\n \"region\": \"${bound:s3-bucket:region}\",\n \"key\": \"${bound:s3-bucket:as}\",\n \"secret\": \"${secret:s3-bucket}\"\n}\n"
|
|
},
|
|
{
|
|
"id": "accounts",
|
|
"trusted": true,
|
|
"type": "file",
|
|
"path": "${dir:state}/accounts.json",
|
|
"mode": "0600",
|
|
"merge": "json",
|
|
"takes-settings": [
|
|
"accounts"
|
|
],
|
|
"content": "{\n \"accounts\": {}\n}\n"
|
|
},
|
|
{
|
|
"id": "grants",
|
|
"trusted": true,
|
|
"type": "file",
|
|
"path": "${dir:state}/grants.json",
|
|
"mode": "0600",
|
|
"merge": "json",
|
|
"takes-settings": [
|
|
"grants"
|
|
],
|
|
"content": "{\n \"grants\": {}\n}\n"
|
|
},
|
|
{
|
|
"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"
|
|
}
|
|
}
|
|
]
|
|
}
|
|
}
|