[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"blog-self-hosted-n8n-in-docker-einsteiger-guide-fuer-it-verantwortliche":3},{"id":4,"title":5,"author":6,"body":7,"date":1436,"description":1437,"extension":1438,"image":1439,"meta":1440,"navigation":411,"path":1441,"readingTime":315,"seo":1442,"stem":1443,"tags":1444,"__hash__":1451},"content/blog/self-hosted-n8n-in-docker-einsteiger-guide-fuer-it-verantwortliche.md","Self-hosted n8n in Docker: Einsteiger-Guide","KIro",{"type":8,"value":9,"toc":1401},"minimark",[10,14,17,20,25,47,51,54,58,61,141,147,151,189,193,196,201,373,378,382,792,797,801,856,859,863,866,870,932,936,1009,1014,1018,1067,1071,1075,1089,1093,1269,1274,1278,1281,1292,1296,1313,1317,1321,1324,1328,1331,1335,1338,1342,1345,1349,1352,1356,1359,1363,1366,1370,1373,1377,1380,1384,1387,1391,1394,1397],[11,12,13],"p",{},"Sie wollen n8n selbst hosten, aber ohne langes Herumprobieren? Dieser Guide zeigt, wie Sie n8n mit Docker produktionsreif aufsetzen – sicher, wiederholbar und updatefähig.",[11,15,16],{},"Wir bauen eine robuste Basis mit Postgres, richten einen Reverse Proxy mit SSL ein, klären Backup-Strategien und zeigen häufige Stolperfallen. Ideal für IT-Verantwortliche, die technische Kontrolle, Compliance und Skalierbarkeit brauchen.",[11,18,19],{},"Am Ende haben Sie ein betriebsfertiges Setup, das Sie in Minuten reproduzieren und in Stunden produktionsreif machen können.",[21,22,24],"h2",{"id":23},"tldr","TL;DR",[26,27,28,32,35,38,41,44],"ul",{},[29,30,31],"li",{},"Production-Setup: n8n + Postgres in Docker Compose, davor ein Reverse Proxy (HTTPS).",[29,33,34],{},"Unbedingt setzen: N8N_ENCRYPTION_KEY, Basic Auth am Proxy, regelmäßige DB-Backups.",[29,36,37],{},"Webhooks korrekt terminieren: N8N_HOST, N8N_PROTOCOL, WEBHOOK_URL passend zur externen URL.",[29,39,40],{},"Updates: Image taggen, compose pull, compose up -d, vorher Backup.",[29,42,43],{},"Skalierung: Queue Mode mit Redis und Workern; sonst Single-Node reicht fürs MVP.",[29,45,46],{},"Suchintention abgedeckt: „n8n docker guide“, „self hosted n8n“, „n8n installieren auf dem Server“.",[21,48,50],{"id":49},"was-bedeutet-self-hosted-n8n-definition","Was bedeutet self-hosted n8n? (Definition)",[11,52,53],{},"Self-hosted n8n bedeutet, dass Sie die n8n-Automatisierungsplattform in Ihrer eigenen Infrastruktur (z. B. VM oder Bare Metal) betreiben, inklusive Datenhaltung, Security, Updates und Monitoring. Sie behalten damit volle Kontrolle über Datenflüsse, Integrationen und Compliance-Rahmen – im Gegensatz zu SaaS, wo Betrieb und Updates der Anbieter verantwortet.",[21,55,57],{"id":56},"architektur-optionen-im-überblick","Architektur-Optionen im Überblick",[11,59,60],{},"Die passende Betriebsform hängt von Sicherheitsanforderungen, Last und Teamgröße ab.",[62,63,64,86],"table",{},[65,66,67],"thead",{},[68,69,70,74,77,80,83],"tr",{},[71,72,73],"th",{},"Betriebsmodell",[71,75,76],{},"Komponenten",[71,78,79],{},"Eignung",[71,81,82],{},"Vorteile",[71,84,85],{},"Hinweise",[87,88,89,107,124],"tbody",{},[68,90,91,95,98,101,104],{},[92,93,94],"td",{},"Single-Node (Docker)",[92,96,97],{},"n8n-Container + Postgres",[92,99,100],{},"Pilot, kleine Teams",[92,102,103],{},"Schnell, einfach, geringe Kosten",[92,105,106],{},"Downtime bei Updates; Scale-up statt Scale-out",[68,108,109,112,115,118,121],{},[92,110,111],{},"Single-Node hinter Proxy",[92,113,114],{},"n8n + Postgres + Reverse Proxy (Nginx/Traefik/Caddy)",[92,116,117],{},"Produktion",[92,119,120],{},"HTTPS, Header-Security, Routing",[92,122,123],{},"Korrektes URL- und Proxy-Setup nötig",[68,125,126,129,132,135,138],{},[92,127,128],{},"Queue Mode (Skalierung)",[92,130,131],{},"n8n Main + Redis + Worker + Postgres",[92,133,134],{},"Höhere Last, kritische SLAs",[92,136,137],{},"Horizontal skalierbar, isolierte Jobs",[92,139,140],{},"Komplexer Betrieb, zusätzliches Monitoring",[142,143,144],"blockquote",{},[11,145,146],{},"Praxis-Tipp: Starten Sie mit Single-Node, standardisieren Sie Backups und Updates, und wechseln Sie erst bei echter Last in den Queue Mode.",[21,148,150],{"id":149},"voraussetzungen-und-planung","Voraussetzungen und Planung",[26,152,153,167,175],{},[29,154,155,156],{},"Infrastruktur:\n",[26,157,158,161,164],{},[29,159,160],{},"2–4 vCPU, 4–8 GB RAM für den Start (abhängig von Workflows/Integrationen).",[29,162,163],{},"Öffentliche DNS-Domain (z. B. automation.example.com).",[29,165,166],{},"Offene Ports: 80/443 am Proxy, intern 5678 für n8n, 5432 für Postgres.",[29,168,169,170],{},"Software:\n",[26,171,172],{},[29,173,174],{},"Aktuelles Docker und Docker Compose/Compose V2.",[29,176,177,178],{},"Sicherheit/Compliance:\n",[26,179,180,183,186],{},[29,181,182],{},"Secrets Management (z. B. Docker Secrets, Vault).",[29,184,185],{},"Backup- und Restore-Prozess getestet.",[29,187,188],{},"Zugriffsschutz (VPN, IP-Restriktionen, Basic Auth/SSO am Proxy).",[21,190,192],{"id":191},"schritt-für-schritt-n8n-in-docker-installieren","Schritt-für-Schritt: n8n in Docker installieren",[11,194,195],{},"So installieren Sie n8n auf dem Server – kompakt und reproduzierbar.",[197,198,200],"h3",{"id":199},"_1-verzeichnis-und-env-anlegen","1) Verzeichnis und .env anlegen",[202,203,208],"pre",{"className":204,"code":205,"language":206,"meta":207,"style":207},"language-bash shiki shiki-themes github-light github-dark","mkdir -p /opt/n8n && cd /opt/n8n\nopenssl rand -hex 32 > .encryption_key\ncat > .env \u003C\u003C'EOF'\n# Domain und Basis-URL\nN8N_HOST=automation.example.com\nN8N_PROTOCOL=https\nN8N_PORT=5678\nWEBHOOK_URL=https://automation.example.com/\n# Sicherheit\nN8N_ENCRYPTION_KEY=$(cat .encryption_key)\nN8N_BASIC_AUTH_ACTIVE=true\nN8N_BASIC_AUTH_USER=admin\nN8N_BASIC_AUTH_PASSWORD=BitteSetzen123!\n# Datenbank\nPOSTGRES_DB=n8n\nPOSTGRES_USER=n8n\nPOSTGRES_PASSWORD=BitteSetzenDB!\nTZ=Europe/Berlin\nEOF\n","bash","",[209,210,211,238,260,277,283,289,295,301,307,313,319,325,331,337,343,349,355,361,367],"code",{"__ignoreMap":207},[212,213,216,220,224,228,232,235],"span",{"class":214,"line":215},"line",1,[212,217,219],{"class":218},"sScJk","mkdir",[212,221,223],{"class":222},"sj4cs"," -p",[212,225,227],{"class":226},"sZZnC"," /opt/n8n",[212,229,231],{"class":230},"sVt8B"," && ",[212,233,234],{"class":222},"cd",[212,236,237],{"class":226}," /opt/n8n\n",[212,239,241,244,247,250,253,257],{"class":214,"line":240},2,[212,242,243],{"class":218},"openssl",[212,245,246],{"class":226}," rand",[212,248,249],{"class":222}," -hex",[212,251,252],{"class":222}," 32",[212,254,256],{"class":255},"szBVR"," >",[212,258,259],{"class":226}," .encryption_key\n",[212,261,263,266,268,271,274],{"class":214,"line":262},3,[212,264,265],{"class":218},"cat",[212,267,256],{"class":255},[212,269,270],{"class":226}," .env",[212,272,273],{"class":255}," \u003C\u003C",[212,275,276],{"class":226},"'EOF'\n",[212,278,280],{"class":214,"line":279},4,[212,281,282],{"class":226},"# Domain und Basis-URL\n",[212,284,286],{"class":214,"line":285},5,[212,287,288],{"class":226},"N8N_HOST=automation.example.com\n",[212,290,292],{"class":214,"line":291},6,[212,293,294],{"class":226},"N8N_PROTOCOL=https\n",[212,296,298],{"class":214,"line":297},7,[212,299,300],{"class":226},"N8N_PORT=5678\n",[212,302,304],{"class":214,"line":303},8,[212,305,306],{"class":226},"WEBHOOK_URL=https://automation.example.com/\n",[212,308,310],{"class":214,"line":309},9,[212,311,312],{"class":226},"# Sicherheit\n",[212,314,316],{"class":214,"line":315},10,[212,317,318],{"class":226},"N8N_ENCRYPTION_KEY=$(cat .encryption_key)\n",[212,320,322],{"class":214,"line":321},11,[212,323,324],{"class":226},"N8N_BASIC_AUTH_ACTIVE=true\n",[212,326,328],{"class":214,"line":327},12,[212,329,330],{"class":226},"N8N_BASIC_AUTH_USER=admin\n",[212,332,334],{"class":214,"line":333},13,[212,335,336],{"class":226},"N8N_BASIC_AUTH_PASSWORD=BitteSetzen123!\n",[212,338,340],{"class":214,"line":339},14,[212,341,342],{"class":226},"# Datenbank\n",[212,344,346],{"class":214,"line":345},15,[212,347,348],{"class":226},"POSTGRES_DB=n8n\n",[212,350,352],{"class":214,"line":351},16,[212,353,354],{"class":226},"POSTGRES_USER=n8n\n",[212,356,358],{"class":214,"line":357},17,[212,359,360],{"class":226},"POSTGRES_PASSWORD=BitteSetzenDB!\n",[212,362,364],{"class":214,"line":363},18,[212,365,366],{"class":226},"TZ=Europe/Berlin\n",[212,368,370],{"class":214,"line":369},19,[212,371,372],{"class":226},"EOF\n",[142,374,375],{},[11,376,377],{},"Praxis-Tipp: Legen Sie Passwörter in Docker Secrets oder einem Vault ab. Die obige .env ist für Lab-Setups – in Produktion Secrets nie im Klartext versionieren.",[197,379,381],{"id":380},"_2-docker-compose-erstellen-n8n-postgres","2) Docker-Compose erstellen (n8n + Postgres)",[202,383,387],{"className":384,"code":385,"language":386,"meta":207,"style":207},"language-yaml shiki shiki-themes github-light github-dark","# docker-compose.yml\nversion: \"3.9\"\n\nservices:\n  db:\n    image: postgres:15-alpine\n    environment:\n      - POSTGRES_DB=${POSTGRES_DB}\n      - POSTGRES_USER=${POSTGRES_USER}\n      - POSTGRES_PASSWORD=${POSTGRES_PASSWORD}\n      - TZ=${TZ}\n    volumes:\n      - pg_data:/var/lib/postgresql/data\n    healthcheck:\n      test: [\"CMD-SHELL\", \"pg_isready -U $$POSTGRES_USER\"]\n      interval: 10s\n      timeout: 5s\n      retries: 5\n\n  n8n:\n    image: n8nio/n8n:latest\n    depends_on:\n      db:\n        condition: service_healthy\n    ports:\n      - \"5678:5678\"\n    environment:\n      - N8N_HOST=${N8N_HOST}\n      - N8N_PORT=${N8N_PORT}\n      - N8N_PROTOCOL=${N8N_PROTOCOL}\n      - WEBHOOK_URL=${WEBHOOK_URL}\n      - N8N_ENCRYPTION_KEY=${N8N_ENCRYPTION_KEY}\n      - N8N_BASIC_AUTH_ACTIVE=${N8N_BASIC_AUTH_ACTIVE}\n      - N8N_BASIC_AUTH_USER=${N8N_BASIC_AUTH_USER}\n      - N8N_BASIC_AUTH_PASSWORD=${N8N_BASIC_AUTH_PASSWORD}\n      - DB_TYPE=postgresdb\n      - DB_POSTGRESDB_HOST=db\n      - DB_POSTGRESDB_PORT=5432\n      - DB_POSTGRESDB_DATABASE=${POSTGRES_DB}\n      - DB_POSTGRESDB_USER=${POSTGRES_USER}\n      - DB_POSTGRESDB_PASSWORD=${POSTGRES_PASSWORD}\n      - GENERIC_TIMEZONE=${TZ}\n    volumes:\n      - n8n_data:/home/node/.n8n\n    restart: unless-stopped\n\nvolumes:\n  n8n_data:\n  pg_data:\n","yaml",[209,388,389,395,407,413,421,428,438,445,453,460,467,474,481,488,495,515,525,535,545,549,557,567,575,583,594,602,610,617,625,633,641,649,657,665,673,681,689,697,705,713,721,729,737,744,752,763,768,776,784],{"__ignoreMap":207},[212,390,391],{"class":214,"line":215},[212,392,394],{"class":393},"sJ8bj","# docker-compose.yml\n",[212,396,397,401,404],{"class":214,"line":240},[212,398,400],{"class":399},"s9eBZ","version",[212,402,403],{"class":230},": ",[212,405,406],{"class":226},"\"3.9\"\n",[212,408,409],{"class":214,"line":262},[212,410,412],{"emptyLinePlaceholder":411},true,"\n",[212,414,415,418],{"class":214,"line":279},[212,416,417],{"class":399},"services",[212,419,420],{"class":230},":\n",[212,422,423,426],{"class":214,"line":285},[212,424,425],{"class":399},"  db",[212,427,420],{"class":230},[212,429,430,433,435],{"class":214,"line":291},[212,431,432],{"class":399},"    image",[212,434,403],{"class":230},[212,436,437],{"class":226},"postgres:15-alpine\n",[212,439,440,443],{"class":214,"line":297},[212,441,442],{"class":399},"    environment",[212,444,420],{"class":230},[212,446,447,450],{"class":214,"line":303},[212,448,449],{"class":230},"      - ",[212,451,452],{"class":226},"POSTGRES_DB=${POSTGRES_DB}\n",[212,454,455,457],{"class":214,"line":309},[212,456,449],{"class":230},[212,458,459],{"class":226},"POSTGRES_USER=${POSTGRES_USER}\n",[212,461,462,464],{"class":214,"line":315},[212,463,449],{"class":230},[212,465,466],{"class":226},"POSTGRES_PASSWORD=${POSTGRES_PASSWORD}\n",[212,468,469,471],{"class":214,"line":321},[212,470,449],{"class":230},[212,472,473],{"class":226},"TZ=${TZ}\n",[212,475,476,479],{"class":214,"line":327},[212,477,478],{"class":399},"    volumes",[212,480,420],{"class":230},[212,482,483,485],{"class":214,"line":333},[212,484,449],{"class":230},[212,486,487],{"class":226},"pg_data:/var/lib/postgresql/data\n",[212,489,490,493],{"class":214,"line":339},[212,491,492],{"class":399},"    healthcheck",[212,494,420],{"class":230},[212,496,497,500,503,506,509,512],{"class":214,"line":345},[212,498,499],{"class":399},"      test",[212,501,502],{"class":230},": [",[212,504,505],{"class":226},"\"CMD-SHELL\"",[212,507,508],{"class":230},", ",[212,510,511],{"class":226},"\"pg_isready -U $$POSTGRES_USER\"",[212,513,514],{"class":230},"]\n",[212,516,517,520,522],{"class":214,"line":351},[212,518,519],{"class":399},"      interval",[212,521,403],{"class":230},[212,523,524],{"class":226},"10s\n",[212,526,527,530,532],{"class":214,"line":357},[212,528,529],{"class":399},"      timeout",[212,531,403],{"class":230},[212,533,534],{"class":226},"5s\n",[212,536,537,540,542],{"class":214,"line":363},[212,538,539],{"class":399},"      retries",[212,541,403],{"class":230},[212,543,544],{"class":222},"5\n",[212,546,547],{"class":214,"line":369},[212,548,412],{"emptyLinePlaceholder":411},[212,550,552,555],{"class":214,"line":551},20,[212,553,554],{"class":399},"  n8n",[212,556,420],{"class":230},[212,558,560,562,564],{"class":214,"line":559},21,[212,561,432],{"class":399},[212,563,403],{"class":230},[212,565,566],{"class":226},"n8nio/n8n:latest\n",[212,568,570,573],{"class":214,"line":569},22,[212,571,572],{"class":399},"    depends_on",[212,574,420],{"class":230},[212,576,578,581],{"class":214,"line":577},23,[212,579,580],{"class":399},"      db",[212,582,420],{"class":230},[212,584,586,589,591],{"class":214,"line":585},24,[212,587,588],{"class":399},"        condition",[212,590,403],{"class":230},[212,592,593],{"class":226},"service_healthy\n",[212,595,597,600],{"class":214,"line":596},25,[212,598,599],{"class":399},"    ports",[212,601,420],{"class":230},[212,603,605,607],{"class":214,"line":604},26,[212,606,449],{"class":230},[212,608,609],{"class":226},"\"5678:5678\"\n",[212,611,613,615],{"class":214,"line":612},27,[212,614,442],{"class":399},[212,616,420],{"class":230},[212,618,620,622],{"class":214,"line":619},28,[212,621,449],{"class":230},[212,623,624],{"class":226},"N8N_HOST=${N8N_HOST}\n",[212,626,628,630],{"class":214,"line":627},29,[212,629,449],{"class":230},[212,631,632],{"class":226},"N8N_PORT=${N8N_PORT}\n",[212,634,636,638],{"class":214,"line":635},30,[212,637,449],{"class":230},[212,639,640],{"class":226},"N8N_PROTOCOL=${N8N_PROTOCOL}\n",[212,642,644,646],{"class":214,"line":643},31,[212,645,449],{"class":230},[212,647,648],{"class":226},"WEBHOOK_URL=${WEBHOOK_URL}\n",[212,650,652,654],{"class":214,"line":651},32,[212,653,449],{"class":230},[212,655,656],{"class":226},"N8N_ENCRYPTION_KEY=${N8N_ENCRYPTION_KEY}\n",[212,658,660,662],{"class":214,"line":659},33,[212,661,449],{"class":230},[212,663,664],{"class":226},"N8N_BASIC_AUTH_ACTIVE=${N8N_BASIC_AUTH_ACTIVE}\n",[212,666,668,670],{"class":214,"line":667},34,[212,669,449],{"class":230},[212,671,672],{"class":226},"N8N_BASIC_AUTH_USER=${N8N_BASIC_AUTH_USER}\n",[212,674,676,678],{"class":214,"line":675},35,[212,677,449],{"class":230},[212,679,680],{"class":226},"N8N_BASIC_AUTH_PASSWORD=${N8N_BASIC_AUTH_PASSWORD}\n",[212,682,684,686],{"class":214,"line":683},36,[212,685,449],{"class":230},[212,687,688],{"class":226},"DB_TYPE=postgresdb\n",[212,690,692,694],{"class":214,"line":691},37,[212,693,449],{"class":230},[212,695,696],{"class":226},"DB_POSTGRESDB_HOST=db\n",[212,698,700,702],{"class":214,"line":699},38,[212,701,449],{"class":230},[212,703,704],{"class":226},"DB_POSTGRESDB_PORT=5432\n",[212,706,708,710],{"class":214,"line":707},39,[212,709,449],{"class":230},[212,711,712],{"class":226},"DB_POSTGRESDB_DATABASE=${POSTGRES_DB}\n",[212,714,716,718],{"class":214,"line":715},40,[212,717,449],{"class":230},[212,719,720],{"class":226},"DB_POSTGRESDB_USER=${POSTGRES_USER}\n",[212,722,724,726],{"class":214,"line":723},41,[212,725,449],{"class":230},[212,727,728],{"class":226},"DB_POSTGRESDB_PASSWORD=${POSTGRES_PASSWORD}\n",[212,730,732,734],{"class":214,"line":731},42,[212,733,449],{"class":230},[212,735,736],{"class":226},"GENERIC_TIMEZONE=${TZ}\n",[212,738,740,742],{"class":214,"line":739},43,[212,741,478],{"class":399},[212,743,420],{"class":230},[212,745,747,749],{"class":214,"line":746},44,[212,748,449],{"class":230},[212,750,751],{"class":226},"n8n_data:/home/node/.n8n\n",[212,753,755,758,760],{"class":214,"line":754},45,[212,756,757],{"class":399},"    restart",[212,759,403],{"class":230},[212,761,762],{"class":226},"unless-stopped\n",[212,764,766],{"class":214,"line":765},46,[212,767,412],{"emptyLinePlaceholder":411},[212,769,771,774],{"class":214,"line":770},47,[212,772,773],{"class":399},"volumes",[212,775,420],{"class":230},[212,777,779,782],{"class":214,"line":778},48,[212,780,781],{"class":399},"  n8n_data",[212,783,420],{"class":230},[212,785,787,790],{"class":214,"line":786},49,[212,788,789],{"class":399},"  pg_data",[212,791,420],{"class":230},[142,793,794],{},[11,795,796],{},"Praxis-Tipp: Pinnen Sie Images auf geprüfte Versionen (z. B. n8nio/n8n:1.76.x), um Überraschungen bei Minor-Releases zu vermeiden.",[197,798,800],{"id":799},"_3-starten-und-testen","3) Starten und testen",[202,802,804],{"className":204,"code":803,"language":206,"meta":207,"style":207},"docker compose pull\ndocker compose up -d\n# Erreichbarkeit prüfen\ncurl -I https://automation.example.com/ || curl -I http://SERVER_IP:5678\n",[209,805,806,817,829,834],{"__ignoreMap":207},[212,807,808,811,814],{"class":214,"line":215},[212,809,810],{"class":218},"docker",[212,812,813],{"class":226}," compose",[212,815,816],{"class":226}," pull\n",[212,818,819,821,823,826],{"class":214,"line":240},[212,820,810],{"class":218},[212,822,813],{"class":226},[212,824,825],{"class":226}," up",[212,827,828],{"class":222}," -d\n",[212,830,831],{"class":214,"line":262},[212,832,833],{"class":393},"# Erreichbarkeit prüfen\n",[212,835,836,839,842,845,848,851,853],{"class":214,"line":279},[212,837,838],{"class":218},"curl",[212,840,841],{"class":222}," -I",[212,843,844],{"class":226}," https://automation.example.com/",[212,846,847],{"class":255}," ||",[212,849,850],{"class":218}," curl",[212,852,841],{"class":222},[212,854,855],{"class":226}," http://SERVER_IP:5678\n",[11,857,858],{},"Wenn Sie noch keinen Reverse Proxy haben, erreichen Sie n8n vorerst über Port 5678. Für Produktion sollten Sie zwingend einen Proxy mit HTTPS vorschalten.",[21,860,862],{"id":861},"reverse-proxy-und-ssl-nginx-traefik-oder-caddy","Reverse Proxy und SSL (Nginx, Traefik oder Caddy)",[11,864,865],{},"Sie können jeden etablierten Proxy nutzen. Caddy ist für den Schnellstart angenehm, Traefik/Nginx geben maximale Kontrolle.",[197,867,869],{"id":868},"beispiel-caddyfile-auto-https","Beispiel Caddyfile (Auto-HTTPS)",[202,871,875],{"className":872,"code":873,"language":874,"meta":207,"style":207},"language-caddy shiki shiki-themes github-light github-dark","# /etc/caddy/Caddyfile\nautomation.example.com {\n  encode zstd gzip\n  reverse_proxy 127.0.0.1:5678\n  header {\n    Strict-Transport-Security \"max-age=63072000; includeSubDomains; preload\"\n    X-Frame-Options \"DENY\"\n    X-Content-Type-Options \"nosniff\"\n    Referrer-Policy \"no-referrer\"\n  }\n}\n","caddy",[209,876,877,882,887,892,897,902,907,912,917,922,927],{"__ignoreMap":207},[212,878,879],{"class":214,"line":215},[212,880,881],{},"# /etc/caddy/Caddyfile\n",[212,883,884],{"class":214,"line":240},[212,885,886],{},"automation.example.com {\n",[212,888,889],{"class":214,"line":262},[212,890,891],{},"  encode zstd gzip\n",[212,893,894],{"class":214,"line":279},[212,895,896],{},"  reverse_proxy 127.0.0.1:5678\n",[212,898,899],{"class":214,"line":285},[212,900,901],{},"  header {\n",[212,903,904],{"class":214,"line":291},[212,905,906],{},"    Strict-Transport-Security \"max-age=63072000; includeSubDomains; preload\"\n",[212,908,909],{"class":214,"line":297},[212,910,911],{},"    X-Frame-Options \"DENY\"\n",[212,913,914],{"class":214,"line":303},[212,915,916],{},"    X-Content-Type-Options \"nosniff\"\n",[212,918,919],{"class":214,"line":309},[212,920,921],{},"    Referrer-Policy \"no-referrer\"\n",[212,923,924],{"class":214,"line":315},[212,925,926],{},"  }\n",[212,928,929],{"class":214,"line":321},[212,930,931],{},"}\n",[197,933,935],{"id":934},"beispiel-nginx-serverblock-vereinfacht","Beispiel Nginx-Serverblock (vereinfacht)",[202,937,941],{"className":938,"code":939,"language":940,"meta":207,"style":207},"language-nginx shiki shiki-themes github-light github-dark","server {\n  listen 443 ssl http2;\n  server_name automation.example.com;\n\n  ssl_certificate /etc/letsencrypt/live/automation.example.com/fullchain.pem;\n  ssl_certificate_key /etc/letsencrypt/live/automation.example.com/privkey.pem;\n\n  location / {\n    proxy_pass http://127.0.0.1:5678;\n    proxy_set_header Host $host;\n    proxy_set_header X-Forwarded-Proto https;\n    proxy_set_header X-Forwarded-For $remote_addr;\n  }\n}\n","nginx",[209,942,943,948,953,958,962,967,972,976,981,986,991,996,1001,1005],{"__ignoreMap":207},[212,944,945],{"class":214,"line":215},[212,946,947],{},"server {\n",[212,949,950],{"class":214,"line":240},[212,951,952],{},"  listen 443 ssl http2;\n",[212,954,955],{"class":214,"line":262},[212,956,957],{},"  server_name automation.example.com;\n",[212,959,960],{"class":214,"line":279},[212,961,412],{"emptyLinePlaceholder":411},[212,963,964],{"class":214,"line":285},[212,965,966],{},"  ssl_certificate /etc/letsencrypt/live/automation.example.com/fullchain.pem;\n",[212,968,969],{"class":214,"line":291},[212,970,971],{},"  ssl_certificate_key /etc/letsencrypt/live/automation.example.com/privkey.pem;\n",[212,973,974],{"class":214,"line":297},[212,975,412],{"emptyLinePlaceholder":411},[212,977,978],{"class":214,"line":303},[212,979,980],{},"  location / {\n",[212,982,983],{"class":214,"line":309},[212,984,985],{},"    proxy_pass http://127.0.0.1:5678;\n",[212,987,988],{"class":214,"line":315},[212,989,990],{},"    proxy_set_header Host $host;\n",[212,992,993],{"class":214,"line":321},[212,994,995],{},"    proxy_set_header X-Forwarded-Proto https;\n",[212,997,998],{"class":214,"line":327},[212,999,1000],{},"    proxy_set_header X-Forwarded-For $remote_addr;\n",[212,1002,1003],{"class":214,"line":333},[212,1004,926],{},[212,1006,1007],{"class":214,"line":339},[212,1008,931],{},[142,1010,1011],{},[11,1012,1013],{},"Praxis-Tipp: Setzen Sie am Proxy zusätzlich Basic Auth oder IP-Allowlists für den Editor. Webhooks können Sie gezielt per Pfad/IP freigeben.",[21,1015,1017],{"id":1016},"best-practices-für-produktion","Best Practices für Produktion",[26,1019,1020,1034,1045,1056],{},[29,1021,1022,1023],{},"Sicherheit\n",[26,1024,1025,1028,1031],{},[29,1026,1027],{},"Setzen Sie N8N_ENCRYPTION_KEY vor dem ersten Start und ändern Sie ihn nie ohne Migrationsplan.",[29,1029,1030],{},"Aktivieren Sie Basic Auth oder SSO am Proxy; Editor-Zugriff nicht öffentlich indexierbar machen.",[29,1032,1033],{},"Least Privilege: API-Keys und Credentials nur mit notwendigen Scopes.",[29,1035,1036,1037],{},"Stabilität\n",[26,1038,1039,1042],{},[29,1040,1041],{},"Postgres statt SQLite; regelmäßige VACUUM/Auto-VACUUM-Einstellungen beibehalten.",[29,1043,1044],{},"Logs zentralisieren (z. B. Loki/ELK); n8n-Log-Level auf warn/info setzen.",[29,1046,1047,1048],{},"Konfiguration\n",[26,1049,1050,1053],{},[29,1051,1052],{},"N8N_HOST/N8N_PROTOCOL/WEBHOOK_URL konsistent zur externen URL.",[29,1054,1055],{},"Timezone korrekt setzen (GENERIC_TIMEZONE), um Trigger-Zeiten vorhersehbar zu halten.",[29,1057,1058,1059],{},"Observability\n",[26,1060,1061,1064],{},[29,1062,1063],{},"Healthchecks in Compose beibehalten; Uptime-Monitoring auf /healthz bzw. Editor-URL.",[29,1065,1066],{},"Prometheus-/Alerting-Integration je nach Bedarf ergänzen.",[21,1068,1070],{"id":1069},"backups-restore-updates","Backups, Restore, Updates",[197,1072,1074],{"id":1073},"backup-checkliste","Backup-Checkliste",[26,1076,1077,1080,1083,1086],{},[29,1078,1079],{},"Datenbank-Backup (voll + inkrementell je nach Tool).",[29,1081,1082],{},"n8n-App-Daten-Volume (/home/node/.n8n).",[29,1084,1085],{},"Export der .env/.encryption_key (aber nicht im Klartext in VCS).",[29,1087,1088],{},"Test-Restore mindestens auf einer Staging-VM.",[197,1090,1092],{"id":1091},"befehle-beispiele","Befehle (Beispiele)",[202,1094,1096],{"className":204,"code":1095,"language":206,"meta":207,"style":207},"# Postgres-Dump\ndocker exec -t $(docker ps -qf name=_db) \\\n  pg_dump -U ${POSTGRES_USER} ${POSTGRES_DB} > /backup/n8n_$(date +%F).sql\n\n# Restore (vereinfacht)\ncat /backup/n8n_YYYY-MM-DD.sql | docker exec -i $(docker ps -qf name=_db) \\\n  psql -U ${POSTGRES_USER} -d ${POSTGRES_DB}\n\n# Updates\ndocker compose pull n8n\ndocker compose up -d n8n\ndocker image prune -f\n",[209,1097,1098,1103,1133,1165,1169,1174,1206,1222,1226,1231,1243,1256],{"__ignoreMap":207},[212,1099,1100],{"class":214,"line":215},[212,1101,1102],{"class":393},"# Postgres-Dump\n",[212,1104,1105,1107,1110,1113,1116,1118,1121,1124,1127,1130],{"class":214,"line":240},[212,1106,810],{"class":218},[212,1108,1109],{"class":226}," exec",[212,1111,1112],{"class":222}," -t",[212,1114,1115],{"class":230}," $(",[212,1117,810],{"class":218},[212,1119,1120],{"class":226}," ps",[212,1122,1123],{"class":222}," -qf",[212,1125,1126],{"class":226}," name=_db",[212,1128,1129],{"class":230},") ",[212,1131,1132],{"class":222},"\\\n",[212,1134,1135,1138,1141,1144,1147,1150,1153,1156,1159,1162],{"class":214,"line":262},[212,1136,1137],{"class":226},"  pg_dump",[212,1139,1140],{"class":222}," -U",[212,1142,1143],{"class":230}," ${POSTGRES_USER} ${POSTGRES_DB} ",[212,1145,1146],{"class":255},">",[212,1148,1149],{"class":226}," /backup/n8n_",[212,1151,1152],{"class":230},"$(",[212,1154,1155],{"class":218},"date",[212,1157,1158],{"class":226}," +%F",[212,1160,1161],{"class":230},")",[212,1163,1164],{"class":226},".sql\n",[212,1166,1167],{"class":214,"line":279},[212,1168,412],{"emptyLinePlaceholder":411},[212,1170,1171],{"class":214,"line":285},[212,1172,1173],{"class":393},"# Restore (vereinfacht)\n",[212,1175,1176,1178,1181,1184,1187,1189,1192,1194,1196,1198,1200,1202,1204],{"class":214,"line":291},[212,1177,265],{"class":218},[212,1179,1180],{"class":226}," /backup/n8n_YYYY-MM-DD.sql",[212,1182,1183],{"class":255}," |",[212,1185,1186],{"class":218}," docker",[212,1188,1109],{"class":226},[212,1190,1191],{"class":222}," -i",[212,1193,1115],{"class":230},[212,1195,810],{"class":218},[212,1197,1120],{"class":226},[212,1199,1123],{"class":222},[212,1201,1126],{"class":226},[212,1203,1129],{"class":230},[212,1205,1132],{"class":222},[212,1207,1208,1211,1213,1216,1219],{"class":214,"line":297},[212,1209,1210],{"class":226},"  psql",[212,1212,1140],{"class":222},[212,1214,1215],{"class":230}," ${POSTGRES_USER} ",[212,1217,1218],{"class":222},"-d",[212,1220,1221],{"class":230}," ${POSTGRES_DB}\n",[212,1223,1224],{"class":214,"line":303},[212,1225,412],{"emptyLinePlaceholder":411},[212,1227,1228],{"class":214,"line":309},[212,1229,1230],{"class":393},"# Updates\n",[212,1232,1233,1235,1237,1240],{"class":214,"line":315},[212,1234,810],{"class":218},[212,1236,813],{"class":226},[212,1238,1239],{"class":226}," pull",[212,1241,1242],{"class":226}," n8n\n",[212,1244,1245,1247,1249,1251,1254],{"class":214,"line":321},[212,1246,810],{"class":218},[212,1248,813],{"class":226},[212,1250,825],{"class":226},[212,1252,1253],{"class":222}," -d",[212,1255,1242],{"class":226},[212,1257,1258,1260,1263,1266],{"class":214,"line":327},[212,1259,810],{"class":218},[212,1261,1262],{"class":226}," image",[212,1264,1265],{"class":226}," prune",[212,1267,1268],{"class":222}," -f\n",[142,1270,1271],{},[11,1272,1273],{},"Praxis-Tipp: Führen Sie Schema-Änderungen mit Staging-Update + Smoke-Tests (kritische Flows manuell anstoßen) durch. Erst danach Produktion aktualisieren.",[21,1275,1277],{"id":1276},"skalierung-queue-mode-kurzüberblick","Skalierung: Queue Mode (Kurzüberblick)",[11,1279,1280],{},"Wenn Workflows lange laufen oder viele Webhooks gleichzeitig ankommen, nutzen Sie den Queue Mode:",[26,1282,1283,1286,1289],{},[29,1284,1285],{},"Ergänzungen: Redis (Queue) und ein oder mehrere Worker-Container.",[29,1287,1288],{},"Main-Container nimmt Webhooks an, Worker verarbeiten Jobs asynchron.",[29,1290,1291],{},"Achten Sie auf Idempotenz Ihrer Flows und Timeout-/Retry-Strategien am Rand-System.",[21,1293,1295],{"id":1294},"typische-fehler-und-wie-sie-sie-vermeiden","Typische Fehler und wie Sie sie vermeiden",[26,1297,1298,1301,1304,1307,1310],{},[29,1299,1300],{},"Falsche URL-Variablen: Webhooks funktionieren nicht, wenn N8N_HOST/WEBHOOK_URL nicht zur externen Domain passen.",[29,1302,1303],{},"Keine Verschlüsselung: Ohne N8N_ENCRYPTION_KEY sind gespeicherte Credentials ungeschützt.",[29,1305,1306],{},"SQLite in Produktion: Begrenzt robust; wechseln Sie frühzeitig auf Postgres.",[29,1308,1309],{},"Offener Editor im Internet: Immer via Reverse Proxy absichern und Indexierung blocken.",[29,1311,1312],{},"Kein Backup-Test: Backups ohne Restore-Test sind wertlos. Mindestens quartalsweise testen.",[21,1314,1316],{"id":1315},"häufige-fragen-faq","Häufige Fragen (FAQ)",[197,1318,1320],{"id":1319},"wie-sind-die-hardware-anforderungen-für-self-hosted-n8n","Wie sind die Hardware-Anforderungen für self-hosted n8n?",[11,1322,1323],{},"Für ein kleines Team reichen oft 2–4 vCPU und 4–8 GB RAM. Entscheidend sind Anzahl/Komplexität der Workflows und externe API-Limits. Starten Sie klein und beobachten Sie CPU, RAM und I/O, bevor Sie skalieren.",[197,1325,1327],{"id":1326},"kann-ich-n8n-komplett-ohne-internet-betreiben","Kann ich n8n komplett ohne Internet betreiben?",[11,1329,1330],{},"Ja, solange alle genutzten Integrationen On-Prem erreichbar sind. Updates und Container-Images müssen dann über ein internes Registry/Mirror bereitgestellt werden.",[197,1332,1334],{"id":1333},"wie-sichere-ich-den-editor-zugang-am-besten-ab","Wie sichere ich den Editor-Zugang am besten ab?",[11,1336,1337],{},"Reverse Proxy mit HTTPS + Basic Auth ist der Minimalstandard. Zusätzlich eignen sich IP-Allowlists, VPN-Zugang oder SSO am Proxy. In n8n selbst sollten Sie Nutzer- und Rollenverwaltung korrekt konfigurieren.",[197,1339,1341],{"id":1340},"wie-aktualisiere-ich-n8n-ohne-lange-downtime","Wie aktualisiere ich n8n ohne lange Downtime?",[11,1343,1344],{},"Pinnen Sie Versionen, erstellen Sie vor Updates ein DB-Backup und führen Sie ein Rolling-Update durch (compose pull; compose up -d). Bei kritischen Systemen nutzen Sie Blue/Green mit zwei Stacks hinter dem Proxy.",[197,1346,1348],{"id":1347},"welche-datenbank-ist-empfohlen","Welche Datenbank ist empfohlen?",[11,1350,1351],{},"Für Produktion ist Postgres die erste Wahl. SQLite eignet sich für Tests, hat aber Nachteile bei Parallelität und Recovery. MySQL/MariaDB wird teils unterstützt, Postgres ist jedoch am verbreitetsten für n8n.",[197,1353,1355],{"id":1354},"wie-setze-ich-umgebungsvariablen-korrekt","Wie setze ich Umgebungsvariablen korrekt?",[11,1357,1358],{},"Definieren Sie N8N_HOST, N8N_PROTOCOL, N8N_PORT und WEBHOOK_URL konsistent. Stellen Sie DB_* Variablen für Postgres ein und vergeben Sie einen starken N8N_ENCRYPTION_KEY. Nutzen Sie .env/Secrets statt Klartext im Compose.",[197,1360,1362],{"id":1361},"kann-ich-n8n-hinter-einem-vorhandenen-nginxtraefik-betreiben","Kann ich n8n hinter einem vorhandenen Nginx/Traefik betreiben?",[11,1364,1365],{},"Ja. Routen Sie die Domain/den Pfad auf den n8n-Port 5678 und setzen Sie Forwarded-Header korrekt. Denken Sie an WebSockets-Unterstützung und an Security-Header.",[197,1367,1369],{"id":1368},"wie-richte-ich-backups-ein","Wie richte ich Backups ein?",[11,1371,1372],{},"Sichern Sie regelmäßig die Postgres-Datenbank und das n8n-Daten-Volume. Automatisieren Sie Dumps (z. B. täglich) und lagern Sie sie verschlüsselt aus. Testen Sie den Restore-Prozess wiederkehrend.",[197,1374,1376],{"id":1375},"wie-gehe-ich-mit-sensiblen-credentials-um","Wie gehe ich mit sensiblen Credentials um?",[11,1378,1379],{},"Speichern Sie Secrets verschlüsselt (ENCRYPTION_KEY), begrenzen Sie Berechtigungen und rotieren Sie Tokens zyklisch. Nutzen Sie, wenn möglich, einen zentralen Secret Store und binden Sie ihn per Umgebungsvariablen ein.",[197,1381,1383],{"id":1382},"wie-erreiche-ich-bessere-performance-bei-vielen-webhooks","Wie erreiche ich bessere Performance bei vielen Webhooks?",[11,1385,1386],{},"Nutzen Sie den Queue Mode mit Redis und skalieren Sie Worker horizontal. Zusätzlich: Caching, Idempotenz, kurze Timeout-Werte und Backpressure über den Proxy.",[21,1388,1390],{"id":1389},"fazit","Fazit",[11,1392,1393],{},"Mit Docker, Postgres und einem sauberen Proxy-Setup bringen Sie self-hosted n8n schnell und sicher in Produktion. Der Schlüssel sind saubere URL-Variablen, ein gesetzter ENCRYPTION_KEY, konsequente Backups und ein klarer Update-Prozess.",[11,1395,1396],{},"Wenn Sie n8n für Ihr Unternehmen evaluieren oder produktionsreif machen wollen, bieten wir Architektur-Reviews und Workshops für IT-Teams an. Kontaktieren Sie uns für einen kurzen Vorab-Check Ihrer Umgebung – wir liefern Best Practices, Hardening-Empfehlungen und einen skalierbaren Fahrplan.",[1398,1399,1400],"style",{},"html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sJ8bj, html code.shiki .sJ8bj{--shiki-default:#6A737D;--shiki-dark:#6A737D}html pre.shiki code .s9eBZ, html code.shiki .s9eBZ{--shiki-default:#22863A;--shiki-dark:#85E89D}",{"title":207,"searchDepth":240,"depth":240,"links":1402},[1403,1404,1405,1406,1407,1412,1416,1417,1421,1422,1423,1435],{"id":23,"depth":240,"text":24},{"id":49,"depth":240,"text":50},{"id":56,"depth":240,"text":57},{"id":149,"depth":240,"text":150},{"id":191,"depth":240,"text":192,"children":1408},[1409,1410,1411],{"id":199,"depth":262,"text":200},{"id":380,"depth":262,"text":381},{"id":799,"depth":262,"text":800},{"id":861,"depth":240,"text":862,"children":1413},[1414,1415],{"id":868,"depth":262,"text":869},{"id":934,"depth":262,"text":935},{"id":1016,"depth":240,"text":1017},{"id":1069,"depth":240,"text":1070,"children":1418},[1419,1420],{"id":1073,"depth":262,"text":1074},{"id":1091,"depth":262,"text":1092},{"id":1276,"depth":240,"text":1277},{"id":1294,"depth":240,"text":1295},{"id":1315,"depth":240,"text":1316,"children":1424},[1425,1426,1427,1428,1429,1430,1431,1432,1433,1434],{"id":1319,"depth":262,"text":1320},{"id":1326,"depth":262,"text":1327},{"id":1333,"depth":262,"text":1334},{"id":1340,"depth":262,"text":1341},{"id":1347,"depth":262,"text":1348},{"id":1354,"depth":262,"text":1355},{"id":1361,"depth":262,"text":1362},{"id":1368,"depth":262,"text":1369},{"id":1375,"depth":262,"text":1376},{"id":1382,"depth":262,"text":1383},{"id":1389,"depth":240,"text":1390},"2026-05-24","So richten IT-Teams n8n sicher in Docker ein: Setup mit Postgres, Reverse Proxy, SSL, Backups und Updates. Praxisnaher n8n Docker Guide.","md","/images/blog/ki-chatbots-thumbnail.png",{},"/blog/self-hosted-n8n-in-docker-einsteiger-guide-fuer-it-verantwortliche",{"title":5,"description":1437},"blog/self-hosted-n8n-in-docker-einsteiger-guide-fuer-it-verantwortliche",[1445,1446,1447,1448,1449,1450],"n8n Docker Guide","Self-Hosted n8n","n8n Installieren","Docker","DevOps","Postgres","pjwnn6MiKr0MT_11y2XJ2RmQ8MVPNyxsV9DiiaZQ7LE"]