<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Infrastructure Archives - Softify Solutions</title>
	<atom:link href="https://softifysolutions.net/technology/infrastructure/feed/" rel="self" type="application/rss+xml" />
	<link>https://softifysolutions.net/technology/infrastructure/</link>
	<description>Custom software, e-commerce and AI automation, engineered end to end.</description>
	<lastBuildDate>Mon, 31 Aug 2026 07:58:03 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.1</generator>

<image>
	<url>https://softifysolutions.net/wp-content/uploads/2026/08/cropped-logo-square-32x32.png</url>
	<title>Infrastructure Archives - Softify Solutions</title>
	<link>https://softifysolutions.net/technology/infrastructure/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Running n8n in Production Without It Becoming Your Single Point of Failure</title>
		<link>https://softifysolutions.net/running-n8n-in-production-without-it-becoming-your-single-point-of-failure/</link>
					<comments>https://softifysolutions.net/running-n8n-in-production-without-it-becoming-your-single-point-of-failure/#respond</comments>
		
		<dc:creator><![CDATA[imranadmin]]></dc:creator>
		<pubDate>Tue, 25 Aug 2026 11:39:57 +0000</pubDate>
				<category><![CDATA[Uncategorized]]></category>
		<guid isPermaLink="false">http://softify.test/?p=120</guid>

					<description><![CDATA[<p>Self-hosted n8n is easy to stand up and easy to neglect once it's quietly running a client's order pipeline. Here's what we actually do differently: error workflows before anything else, queue mode only when the logs justify it, backups that treat the encryption key as a separate problem from the database, and monitoring that doesn't depend on n8n to tell you n8n is down.</p>
<p>The post <a href="https://softifysolutions.net/running-n8n-in-production-without-it-becoming-your-single-point-of-failure/">Running n8n in Production Without It Becoming Your Single Point of Failure</a> appeared first on <a href="https://softifysolutions.net">Softify Solutions</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Every self-hosted n8n instance we&#8217;ve inherited from a client started the same way: someone stood up a Docker container one weekend to stop copy-pasting leads into a spreadsheet. A year later that instance is syncing Shopify orders to a 3PL, generating invoices, and routing support tickets between Zendesk and Slack. Nobody decided to turn n8n into infrastructure — it happened one workflow at a time, and the operational discipline never caught up to the blast radius.</p>
<p>That&#8217;s the pattern we keep walking into, and it&#8217;s why this post exists. n8n is good software, and self-hosting it is the right call for a lot of our automation work — more on when it isn&#8217;t, further down. But &#8220;it&#8217;s just a workflow tool&#8221; is a dangerous way to think about something that&#8217;s now the only thing standing between a customer&#8217;s order and their inventory system. Here&#8217;s what we do differently once an instance crosses from internal convenience to &#8220;if this goes down, someone&#8217;s business stops.&#8221;</p>
<h3>Error workflows come first, not last</h3>
<p>The first thing we configure on a new instance isn&#8217;t a workflow — it&#8217;s the thing that watches the workflows. n8n lets you assign an Error Workflow, instance-wide or per-workflow, triggered off a dedicated Error Trigger node whenever an execution fails. Most client instances we&#8217;ve inherited never had one set up, so a workflow could fail silently for weeks. Nobody notices until a customer emails asking where their order confirmation went.</p>
<p>Ours is intentionally plain: an Error Trigger node feeding a Slack node with the workflow name, execution ID, failed node, and a link straight back into that execution in the n8n editor.</p>
<pre><code>Workflow failed: {{$json["workflow"]["name"]}}
Execution: {{$json["execution"]["id"]}}
Failed node: {{$json["execution"]["lastNodeExecuted"]}}
Error: {{$json["execution"]["error"]["message"]}}
Link: https://automate.client-domain.com/workflow/{{$json["workflow"]["id"]}}/executions/{{$json["execution"]["id"]}}</code></pre>
<p>No dashboard, no triage bot. One Slack message per failure, in a channel a person actually reads, with enough context to fix it now or let it wait until morning. Twenty minutes to build, and it&#8217;s the difference between catching an API rate limit before the client notices and hearing about it from them.</p>
<h3>Queue mode is a decision, not a default</h3>
<p>Here&#8217;s where we part ways with a lot of n8n forum advice, which tends toward &#8220;just run queue mode, it&#8217;s more production-ready.&#8221; Queue mode is real: <code>EXECUTIONS_MODE=queue</code>, Redis as the Bull broker, separate workers pulling jobs off it. Past a certain volume it&#8217;s genuinely necessary. It&#8217;s also not free — now you&#8217;re monitoring Redis too, and you&#8217;ve traded one container to restart for three services that have to agree with each other.</p>
<p>For most client workloads we run — order sync, lead routing, report generation, a few hundred to a few thousand executions a day — a single well-specced instance in regular mode handles it fine, especially with n8n&#8217;s built-in <code>N8N_CONCURRENCY_PRODUCTION_LIMIT</code> capping concurrent executions without a queue at all. We move a client to queue mode only when the logs show real evidence: webhook responses queuing up, or execution start times drifting behind trigger times. Until then it&#8217;s complexity with no matching benefit, and complexity is exactly what this post argues against.</p>
<p>When we do reach for it — usually high-volume marketplace or multi-channel inventory sync — the shape looks roughly like this:</p>
<pre><code>services:
  n8n-main:
    image: n8nio/n8n:1.68.1
    environment:
      - EXECUTIONS_MODE=queue
      - N8N_ENCRYPTION_KEY=${N8N_ENCRYPTION_KEY}
      - QUEUE_BULL_REDIS_HOST=redis
  n8n-worker:
    image: n8nio/n8n:1.68.1
    command: worker --concurrency=10
    environment:
      - EXECUTIONS_MODE=queue
      - N8N_ENCRYPTION_KEY=${N8N_ENCRYPTION_KEY}
      - QUEUE_BULL_REDIS_HOST=redis
      - QUEUE_HEALTH_CHECK_ACTIVE=true
    deploy:
      replicas: 2
  redis:
    image: redis:7-alpine</code></pre>
<p>Notice the pinned image tag, and the identical encryption key on both services — it has to match exactly or the worker can&#8217;t decrypt credentials the main process encrypted. A fuller setup adds a dedicated <code>n8n webhook</code> process behind the load balancer, so traffic never waits on the process serving the editor UI. Skip <code>QUEUE_HEALTH_CHECK_ACTIVE</code> and the worker exposes no health check — a bad thing to learn mid-incident.</p>
<h3>Backups are two separate problems</h3>
<p>Backing up n8n means backing up two things that have to survive independently: the Postgres database, and the <code>N8N_ENCRYPTION_KEY</code> that encrypts every stored credential. Lose the key and every API token and database password on that instance turns into ciphertext nobody can read, including you. We&#8217;ve watched this happen to a client who migrated servers without carrying the key over: workflows came back fine, and every credential had to be re-entered by hand.</p>
<p>So we back them up separately, in separate places. Postgres gets a nightly dump:</p>
<pre><code>pg_dump -Fc n8n_prod | gzip &gt; n8n-$(date +%F).sql.gz
rclone copy n8n-$(date +%F).sql.gz remote:client-backups/n8n/</code></pre>
<p>The encryption key goes into the client&#8217;s own secrets manager the day the instance goes live, never into the same bucket as the database dump — otherwise anyone with read access to that bucket has both halves of the lock. We also run a weekly <code>n8n export:workflow --all --output=./workflows/</code> into a git repository. That&#8217;s not disaster recovery, Postgres already covers that; it&#8217;s so a workflow change shows up as a diff, the way we&#8217;d review a pull request. Client asks why an order sync started skipping partial refunds? We point at the exact node that changed and when, instead of guessing.</p>
<h3>Monitoring the container isn&#8217;t monitoring n8n</h3>
<p>A green health check tells you the process is running. It tells you nothing about whether the workflows inside it are doing their job, and nothing if the whole box is down. Two things we add on top of the error workflow above:</p>
<ul>
<li><strong>Pruning, from day one.</strong> Without <code>EXECUTIONS_DATA_PRUNE</code> and a sane <code>EXECUTIONS_DATA_MAX_AGE</code>, the executions table grows without limit and Postgres performance degrades months later, right when nobody remembers this instance was ever configured. We set pruning during setup, not after someone notices the editor&#8217;s gotten slow.</li>
<li><strong>A dead man&#8217;s switch that lives outside n8n entirely.</strong> A scheduled workflow pings an external heartbeat service — we use healthchecks.io — every few minutes. If n8n goes down, the ping stops arriving and we hear about it from a system with no dependency on n8n being alive. That&#8217;s the actual answer to this post&#8217;s title: the thing that tells you n8n is down cannot be a workflow running inside n8n.</li>
</ul>
<h3>Secrets stay in the credentials system, not in nodes</h3>
<p>We don&#8217;t paste API keys into HTTP Request node headers as plain text, and we&#8217;ve turned down client requests to do it &#8220;just for now&#8221; more than once. Everything goes through n8n&#8217;s credentials system, encrypted at rest by that same <code>N8N_ENCRYPTION_KEY</code>. n8n also ships <code>N8N_BLOCK_ENV_ACCESS_IN_NODE</code>, which blocks expression and Code-node access to process environment variables entirely, and we turn it on across every client instance — an expression field that can read <code>process.env</code> is one compromised workflow away from leaking every secret on the box.</p>
<p>For clients handling payment data or PII, most of our e-commerce clients, we don&#8217;t run multi-tenant: each client gets its own instance and its own Postgres database, not a shared instance with folder-level permissions. More servers to patch, and we&#8217;ve made peace with that — a leaked credential in one client&#8217;s automation should never reach another client&#8217;s data. n8n&#8217;s External Secrets integration — Vault, AWS Secrets Manager, Azure Key Vault, Infisical — is worth turning on for larger clients on a license tier that includes it. For a five-person e-commerce brand paying us to automate their order flow, it isn&#8217;t: the credentials system plus per-client isolation gets most of the benefit for free.</p>
<h3>A tool we dropped, and where we land</h3>
<p>We used to run Watchtower to auto-pull the latest n8n image on a schedule. We stopped after a minor version bump silently changed a node&#8217;s parameter schema and broke a production workflow overnight, with no warning and nothing to review. Now every image tag is pinned, upgrades get tested against a staging container running a copy of the production database first, and the version bump happens on our schedule, not Docker Hub&#8217;s.</p>
<p>None of this is exotic. It&#8217;s the same discipline you&#8217;d apply to any other piece of production infrastructure — worth writing down only because n8n&#8217;s editor makes it so easy to build a workflow that it&#8217;s easy to forget you&#8217;ve built a dependency. Our advice cuts against our own self-hosting bias: if the automation footprint is small, a handful of internal workflows with no customer-facing failure mode, n8n Cloud is the right call, and we&#8217;ll say so even when it costs us a shorter engagement. Self-hosting earns its keep once there&#8217;s a compliance reason to control the infrastructure, a cost reason at real volume, or data that shouldn&#8217;t leave a client&#8217;s own cloud account. Below that line, the overhead above isn&#8217;t worth either side&#8217;s time.</p>
<p>The post <a href="https://softifysolutions.net/running-n8n-in-production-without-it-becoming-your-single-point-of-failure/">Running n8n in Production Without It Becoming Your Single Point of Failure</a> appeared first on <a href="https://softifysolutions.net">Softify Solutions</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://softifysolutions.net/running-n8n-in-production-without-it-becoming-your-single-point-of-failure/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
