{ "module": "n8n", "version": "1", "capabilities": [ "container-runtime" ], "requires": [ "postgres-database", "route" ], "contributes": { "postgres-database": { "name": "n8n" }, "route": { "label": "n8n", "endpoint": "web" } }, "binds": { "postgres-database": "${dir:state}/database.json", "route": "${dir:state}/route.json" }, "secrets": { "postgres-database": "${dir:state}/database.secret" }, "accesses": [ { "id": "media", "mode": "read-write" } ], "config": { "media-gid": { "type": "number", "description": "The number of the group that owns the media library on this machine, which the server joins as a supplementary group so a workflow can file into the library (novox/hq ADR 0480 clause 7). Set per machine; until the container takes it from the media library itself (issue 1618) nothing writes a default, so a machine that does not say it refuses n8n by name.", "minimum": 1, "required": true, "trusted": true } }, "listens": [ { "name": "web", "port": 5678, "protocol": "tcp", "from": "mesh", "why": "the n8n editor, its REST API and the webhook endpoints workflows are triggered through; a public name is the route's" } ], "data": { "own": [ { "id": "data", "path": "${dir:data}", "class": "valuable", "why": "the instance's encryption key, settings and binary data; workflows are in the database" }, { "id": "cache", "path": "${dir:cache}", "class": "cache", "why": "scratch space" } ] }, "resources": [ { "id": "state", "type": "directory", "mode": "0700", "place": ".", "unknown": "program" }, { "id": "data", "type": "directory", "mode": "0700", "owner": "1000:1000", "unknown": "program" }, { "id": "cache", "type": "directory", "mode": "0700", "owner": "999:999", "unknown": "program" }, { "id": "database-secret", "type": "file", "path": "${dir:state}/n8n-database.secret", "mode": "0400", "owner": "1000:1000", "template": "files/n8n-database.secret" }, { "id": "server-env", "type": "file", "path": "${dir:state}/server.env", "mode": "0600", "template": "files/server.env" }, { "id": "uuid", "type": "archive", "path": "${dir:state}/uuid", "artifact": "uuid", "unknown": "program" }, { "id": "net", "type": "network", "name": "n8n" }, { "id": "server", "type": "container", "health": { "kind": "http", "endpoint": "web", "path": "/healthz/readiness", "status": 200, "needs": "postgres-database" }, "name": "n8n", "artifact": "server", "network": "n8n", "env-file": [ "${dir:state}/server.env" ], "ports": [ "5678" ], "volumes": [ "${dir:data}:/home/node/.n8n", "${dir:state}/n8n-database.secret:/run/secrets/database:ro", "${dir:state}/uuid:/usr/local/lib/node_modules/uuid:ro", "${access:media}:/media-library" ], "groups": [ "${config:media-gid}" ] }, { "id": "cache-server", "type": "container", "name": "n8n-redis", "image": "redis@sha256:8a1efc5f479551822b47424ccae982026b633f28818eab0387348120a61e10e2", "network": "n8n", "args": [ "redis-server", "--appendonly", "yes" ], "volumes": [ "${dir:cache}:/data" ] }, { "id": "browser", "type": "container", "name": "n8n-selenium", "image": "selenium/standalone-chrome@sha256:9ae1c78e9b2ca9fe4b22e57873b5ee34aeb8e814e3122293eef4c3abe4c5f448", "network": "n8n", "env": { "SE_ENABLE_TRACING": "false", "SE_NODE_MAX_SESSIONS": "5", "SE_NODE_OVERRIDE_MAX_SESSIONS": "true" } } ], "build": { "artifacts": [ { "name": "server", "kind": "upstream", "from": "n8nio/n8n@sha256:4846eb2f4b874ab04cde7fc1e249d2ddaec66e9aea64439beb2972cfea88e3c0" }, { "name": "uuid", "kind": "archive", "url": "https://registry.npmjs.org/uuid/-/uuid-14.0.1.tgz", "sha256": "e062c57ed120ea135478f305da04802bf69eab23fbc0ca2bae6989b6855390c4", "version": "14.0.1", "within": "package", "names-on-purpose": { "registry.npmjs.org": "the npm registry publishes the uuid package there; the build seat fetches it once, by its pinned sha256 (novox/hq ADR 0316 §2, ADR 0480 §8)" } }, { "name": "files", "kind": "archive", "from": "files" } ] } }