<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.wilsoz.com/index.php?action=history&amp;feed=atom&amp;title=Postmortems%2F2026-05-07_n8n_HA_Credential_Repair</id>
	<title>Postmortems/2026-05-07 n8n HA Credential Repair - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.wilsoz.com/index.php?action=history&amp;feed=atom&amp;title=Postmortems%2F2026-05-07_n8n_HA_Credential_Repair"/>
	<link rel="alternate" type="text/html" href="https://wiki.wilsoz.com/index.php?title=Postmortems/2026-05-07_n8n_HA_Credential_Repair&amp;action=history"/>
	<updated>2026-07-06T07:06:01Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.43.9</generator>
	<entry>
		<id>https://wiki.wilsoz.com/index.php?title=Postmortems/2026-05-07_n8n_HA_Credential_Repair&amp;diff=21&amp;oldid=prev</id>
		<title>Wikibot: Migrated from postmortems/2026-05-07-n8n-ha-credential-repair.md</title>
		<link rel="alternate" type="text/html" href="https://wiki.wilsoz.com/index.php?title=Postmortems/2026-05-07_n8n_HA_Credential_Repair&amp;diff=21&amp;oldid=prev"/>
		<updated>2026-07-05T18:17:36Z</updated>

		<summary type="html">&lt;p&gt;Migrated from postmortems/2026-05-07-n8n-ha-credential-repair.md&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;&amp;#039;&amp;#039;As of: 2026-07-05 — migrated from `postmortems/2026-05-07-n8n-ha-credential-repair.md`&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
= Postmortem: n8n Credential Failures &amp;amp; HA Workflow Repair =&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Date:&amp;#039;&amp;#039;&amp;#039; 2026-05-07  &lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Duration:&amp;#039;&amp;#039;&amp;#039; ~6 hours of cascading failures (backup alerts since 2026-03-11 DB recovery)  &lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Severity:&amp;#039;&amp;#039;&amp;#039; Medium — silent failures, no data loss, but monitoring blind spots  &lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Status:&amp;#039;&amp;#039;&amp;#039; Resolved&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Summary ==&lt;br /&gt;
&lt;br /&gt;
After the March 2026 n8n SQLite DB recovery, 12 workflows were silently failing due to stale/placeholder credential IDs. Home Assistant workflows had additional issues: wrong credential format, missing entity IDs, and parallel-merge node connections that n8n can&amp;#039;t execute correctly.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Root Causes (in order discovered) ==&lt;br /&gt;
&lt;br /&gt;
=== 1. Stale SSH credential IDs from DB recovery ===&lt;br /&gt;
The March 2026 DB recovery recreated credentials with new IDs, but workflow JSONs stored on disk still had old IDs. When workflows were re-imported they referenced credentials that no longer existed.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;CREDENTIAL_ID&amp;lt;/code&amp;gt; — literal placeholder, never substituted  &lt;br /&gt;
* &amp;lt;code&amp;gt;S2muq5nzJFa5ZydC&amp;lt;/code&amp;gt; — old SSH credential from pre-recovery DB&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Current correct SSH credential ID:&amp;#039;&amp;#039;&amp;#039; &amp;lt;code&amp;gt;2ugS1ibsZu1LQid8&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 2. Missing &amp;lt;code&amp;gt;homeAssistantApi&amp;lt;/code&amp;gt; credential ===&lt;br /&gt;
The &amp;lt;code&amp;gt;homeAssistantApi&amp;lt;/code&amp;gt;-type credential (different from &amp;lt;code&amp;gt;httpHeaderAuth&amp;lt;/code&amp;gt;) was lost in the DB recovery. Eight workflows referenced ID &amp;lt;code&amp;gt;6CIwjyqyUwnvaezn&amp;lt;/code&amp;gt; which no longer existed.&lt;br /&gt;
&lt;br /&gt;
=== 3. Wrong credential &amp;lt;code&amp;gt;host&amp;lt;/code&amp;gt; field format ===&lt;br /&gt;
n8n&amp;#039;s &amp;lt;code&amp;gt;homeAssistantApi&amp;lt;/code&amp;gt; credential uses &amp;#039;&amp;#039;&amp;#039;separate &amp;lt;code&amp;gt;host&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;port&amp;lt;/code&amp;gt; fields&amp;#039;&amp;#039;&amp;#039; — the host is just the IP/hostname with no scheme, no port:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
{&lt;br /&gt;
  &amp;quot;host&amp;quot;: &amp;quot;192.168.0.140&amp;quot;,&lt;br /&gt;
  &amp;quot;port&amp;quot;: 8123,&lt;br /&gt;
  &amp;quot;accessToken&amp;quot;: &amp;quot;...&amp;quot;,&lt;br /&gt;
  &amp;quot;ssl&amp;quot;: false&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Wrong formats tried (and why they fail):&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* &amp;lt;code&amp;gt;&amp;quot;host&amp;quot;: &amp;quot;http://homeassistant.local:8123&amp;quot;&amp;lt;/code&amp;gt; → Docker can&amp;#039;t resolve &amp;lt;code&amp;gt;.local&amp;lt;/code&amp;gt; mDNS names  &lt;br /&gt;
* &amp;lt;code&amp;gt;&amp;quot;host&amp;quot;: &amp;quot;http://192.168.0.140:8123&amp;quot;&amp;lt;/code&amp;gt; → node builds URL as &amp;lt;code&amp;gt;http://http://192.168.0.140:8123&amp;lt;/code&amp;gt; → DNS lookup of literal string &amp;lt;code&amp;gt;&amp;quot;http&amp;quot;&amp;lt;/code&amp;gt; → &amp;lt;code&amp;gt;EAI_AGAIN&amp;lt;/code&amp;gt;  &lt;br /&gt;
* &amp;lt;code&amp;gt;&amp;quot;host&amp;quot;: &amp;quot;192.168.0.140:8123&amp;quot;&amp;lt;/code&amp;gt; → node builds URL as &amp;lt;code&amp;gt;http://192.168.0.140:8123:8123&amp;lt;/code&amp;gt; → &amp;lt;code&amp;gt;ERR_INVALID_URL&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;How discovered:&amp;#039;&amp;#039;&amp;#039; Read the actual compiled source at:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
docker exec n8n find /usr/local/lib/node_modules/n8n -path &amp;quot;*HomeAssistant/GenericFunctions.js&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
URL construction: `&amp;lt;code&amp;gt; &amp;lt;/code&amp;gt;${ssl?&amp;#039;https&amp;#039;:&amp;#039;http&amp;#039;}://${credentials.host}:${credentials.port}/api${resource}&amp;lt;code&amp;gt; &amp;lt;/code&amp;gt;`&lt;br /&gt;
&lt;br /&gt;
=== 4. Missing entity IDs in HA node parameters ===&lt;br /&gt;
The &amp;lt;code&amp;gt;entityId&amp;lt;/code&amp;gt; field was never saved in the original workflow JSONs exported from n8n. All HA state-read nodes had &amp;lt;code&amp;gt;resource: &amp;quot;state&amp;quot;&amp;lt;/code&amp;gt; but no &amp;lt;code&amp;gt;entityId&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Correct entity IDs used:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Node purpose&lt;br /&gt;
! Entity ID&lt;br /&gt;
|-&lt;br /&gt;
| Living room temp&lt;br /&gt;
| &amp;lt;code&amp;gt;sensor.ewelink_snzb_02p_temperature&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Beta sensor temp&lt;br /&gt;
| &amp;lt;code&amp;gt;sensor.temp_sensor_beta_temperature&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Closet/Charlie temp&lt;br /&gt;
| &amp;lt;code&amp;gt;sensor.temp_sensor_charlie_temperature&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Closet/Charlie humidity&lt;br /&gt;
| &amp;lt;code&amp;gt;sensor.temp_sensor_charlie_humidity&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Door sensor&lt;br /&gt;
| &amp;lt;code&amp;gt;binary_sensor.shellydw2_075374_door&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Weather forecast&lt;br /&gt;
| &amp;lt;code&amp;gt;weather.forecast_ronwood&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Phone next alarm&lt;br /&gt;
| &amp;lt;code&amp;gt;sensor.pixel_7_next_alarm&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Announce/TTS&lt;br /&gt;
| &amp;lt;code&amp;gt;media_player.home_assistant_voice_098a64&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| HA notify&lt;br /&gt;
| &amp;lt;code&amp;gt;notify.home_assistant&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== 5. Parallel-merge node connections ===&lt;br /&gt;
Workflows had multiple HA nodes connected in &amp;#039;&amp;#039;&amp;#039;parallel&amp;#039;&amp;#039;&amp;#039; (all from the trigger), all feeding into one downstream code node. n8n runs the downstream node as soon as the first upstream node finishes — so the code crashes with &amp;lt;code&amp;gt;&amp;quot;Node X hasn&amp;#039;t been executed&amp;quot;&amp;lt;/code&amp;gt; when it tries to read data from the still-running nodes.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Pattern causing the bug:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
Trigger ──┬── Get Temp A ──┐&lt;br /&gt;
          ├── Get Temp B ──┼── Analyze  ← runs on first finish, others not done&lt;br /&gt;
          └── Get Temp C ──┘&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Fix — chain them sequentially:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
Trigger → Get Temp A → Get Temp B → Get Temp C → Analyze&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Each node passes its result downstream; the code node then accesses all previous nodes via &amp;lt;code&amp;gt;$(&amp;#039;Get Temp A&amp;#039;).first()&amp;lt;/code&amp;gt; etc.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Affected workflows:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* Server Closet Monitor (Temp + Humidity)&lt;br /&gt;
* Home Temperature Alert (3 temp sensors)&lt;br /&gt;
* Morning Briefing (Weather + Energy Usage)&lt;br /&gt;
* Bedtime Routine (Door check + Weather)&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Diagnostic Approach ==&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;How to find execution errors when the n8n API returns no detail:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# execution_data table has the full run data&lt;br /&gt;
sudo sqlite3 /var/lib/docker/volumes/n8n-app_n8n_data/_data/database.sqlite \&lt;br /&gt;
  &amp;quot;SELECT substr(ed.data,1,5000) FROM execution_entity ee &lt;br /&gt;
   JOIN execution_data ed ON ee.id = ed.executionId &lt;br /&gt;
   WHERE ee.id = &amp;lt;EXEC_ID&amp;gt;;&amp;quot;&lt;br /&gt;
# Then grep for: EAI_AGAIN, ENOTFOUND, ERR_INVALID_URL, &amp;quot;message&amp;quot;, getaddrinfo&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;How to find which credentials are broken:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# Valid credential IDs in DB&lt;br /&gt;
sudo sqlite3 /var/lib/docker/volumes/n8n-app_n8n_data/_data/database.sqlite \&lt;br /&gt;
  &amp;quot;SELECT id, name, type FROM credentials_entity ORDER BY name;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Scan all workflows for IDs not in that list&lt;br /&gt;
# (see the audit script logic used in this session)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;After any credential fix — n8n must be restarted:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo -E sh -c &amp;#039;cd /library/n8n-app &amp;amp;&amp;amp; docker compose restart n8n&amp;#039;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
n8n caches credential validation state. Even after fixing a credential in the DB, workflows show &amp;quot;has issues&amp;quot; until restart.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Current Credential IDs (verified 2026-05-07) ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! ID&lt;br /&gt;
! Name&lt;br /&gt;
! Type&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;2ugS1ibsZu1LQid8&amp;lt;/code&amp;gt;&lt;br /&gt;
| Stronghold SSH (mnw)&lt;br /&gt;
| sshPrivateKey&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;4RowxM0jrmYDnctK&amp;lt;/code&amp;gt;&lt;br /&gt;
| Home Assistant API&lt;br /&gt;
| homeAssistantApi&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;w0gXpM8W793fahAY&amp;lt;/code&amp;gt;&lt;br /&gt;
| ntfy Auth&lt;br /&gt;
| httpHeaderAuth&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;x5tv5aXs5N5nd2aK&amp;lt;/code&amp;gt;&lt;br /&gt;
| Matrix Bot (Zordon)&lt;br /&gt;
| httpHeaderAuth&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;R9LGxXIhmWCRM5Cn&amp;lt;/code&amp;gt;&lt;br /&gt;
| Home Assistant API (old httpHeaderAuth)&lt;br /&gt;
| httpHeaderAuth&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;5MCznsMsxjqOrlhJ&amp;lt;/code&amp;gt;&lt;br /&gt;
| AudioBookshelf API&lt;br /&gt;
| httpHeaderAuth&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;XB0V2UwPdWkRJoWj&amp;lt;/code&amp;gt;&lt;br /&gt;
| OpenAI Bearer&lt;br /&gt;
| httpHeaderAuth&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;NIQrbnzjhpNzBV1P&amp;lt;/code&amp;gt;&lt;br /&gt;
| OpenAi account&lt;br /&gt;
| openAiApi&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;HA credential data format (correct):&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* host: &amp;lt;code&amp;gt;192.168.0.140&amp;lt;/code&amp;gt; (IP only, no scheme, no port)&lt;br /&gt;
* port: &amp;lt;code&amp;gt;8123&amp;lt;/code&amp;gt;&lt;br /&gt;
* ssl: &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;&lt;br /&gt;
* accessToken: from Vaultwarden → &amp;quot;Home Assistant Long-Lived Token&amp;quot;&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Prevention ==&lt;br /&gt;
&lt;br /&gt;
# &amp;#039;&amp;#039;&amp;#039;After any n8n DB recovery:&amp;#039;&amp;#039;&amp;#039; run the credential audit script before assuming workflows work. Check every active workflow&amp;#039;s credential IDs against &amp;lt;code&amp;gt;credentials_entity&amp;lt;/code&amp;gt;.&lt;br /&gt;
# &amp;#039;&amp;#039;&amp;#039;Export workflow JSONs immediately after any credential re-creation&amp;#039;&amp;#039;&amp;#039; so the repo stays in sync.&lt;br /&gt;
# &amp;#039;&amp;#039;&amp;#039;Never use &amp;lt;code&amp;gt;homeassistant.local&amp;lt;/code&amp;gt; in n8n&amp;#039;&amp;#039;&amp;#039; — Docker containers can&amp;#039;t resolve mDNS. Always use &amp;lt;code&amp;gt;192.168.0.140&amp;lt;/code&amp;gt;.&lt;br /&gt;
# &amp;#039;&amp;#039;&amp;#039;n8n parallel-merge pattern is broken&amp;#039;&amp;#039;&amp;#039; — if multiple nodes need to read data before a code node, chain them sequentially, not in parallel.&lt;br /&gt;
# &amp;#039;&amp;#039;&amp;#039;Test workflows after changes&amp;#039;&amp;#039;&amp;#039; — check n8n execution history within 30 min of any credential/workflow change.&lt;/div&gt;</summary>
		<author><name>Wikibot</name></author>
	</entry>
</feed>