{ "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": [ { "path": "/services/media", "mode": "read-write" } ], "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" } ], "resources": [ { "id": "state", "type": "directory", "mode": "0700", "place": "." }, { "id": "data", "type": "directory", "mode": "0700", "owner": "1000:1000" }, { "id": "cache", "type": "directory", "mode": "0700", "owner": "999:999" }, { "id": "database-secret", "type": "file", "path": "${dir:state}/n8n-database.secret", "mode": "0400", "owner": "1000:1000", "content": "${secret:postgres-database}" }, { "id": "server-env", "type": "file", "path": "${dir:state}/server.env", "mode": "0600", "content": "N8N_HOST=${bound:route:name}\nN8N_PORT=5678\nN8N_PROTOCOL=https\nWEBHOOK_URL=https://${bound:route:name}/\nNODE_FUNCTION_ALLOW_BUILTIN=*\nNODE_FUNCTION_ALLOW_EXTERNAL=*\nDB_TYPE=postgresdb\nDB_POSTGRESDB_HOST=${bound:postgres-database:at}\nDB_POSTGRESDB_PORT=${bound:postgres-database:port}\nDB_POSTGRESDB_DATABASE=${bound:postgres-database:as}\nDB_POSTGRESDB_USER=${bound:postgres-database:as}\nDB_POSTGRESDB_PASSWORD_FILE=/run/secrets/database\n" }, { "id": "net", "type": "network", "name": "n8n" }, { "id": "server", "type": "container", "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", "/services/media:/media-library" ] }, { "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": { "on": [ { "arg": "N8N_BASE", "image": "n8nio/n8n@sha256:4846eb2f4b874ab04cde7fc1e249d2ddaec66e9aea64439beb2972cfea88e3c0" } ], "artifacts": [ { "name": "server", "kind": "image", "from": "Dockerfile" } ] } }