[{"data":1,"prerenderedAt":171},["ShallowReactive",2],{"seo-verification":3,"blog-install-n8n-on-vps-with-docker-complete-2026-guide-ma-en":6,"promo-bar-likely":170},{"google":4,"bing":5},"EycwPY2XMyTkVzas3n1ygeNJFGAH513qrMjfDljzsMQ","",{"key":7,"data":8},"blog-install-n8n-on-vps-with-docker-complete-2026-guide-ma-en",{"id":9,"slug":10,"slugs":11,"title":15,"excerpt":16,"readTime":17,"views":18,"isPinned":19,"noindex":19,"publishedAt":20,"updatedAt":21,"category":22,"categories":27,"featuredImage":29,"bgImage":30,"posterImage":31,"relatedSolution":32,"intro":35,"sections":36,"ctaTitle":144,"ctaBody":145,"ctaButton":146,"ctaUrl":147,"relatedPosts":148},3,"install-n8n-on-vps-with-docker-complete-2026-guide",{"fr":12,"en":10,"ar":13,"es":14},"installer-n8n-vps","تثبيت-n8n-على-vps-مع-docker-دليل-شامل-2026","instalar-n8n-en-vps-con-docker","Install n8n on VPS with Docker: complete 2026 guide","Deploy n8n on VPS with Docker, reverse proxy and HTTPS. Covers V8 crash, 502 nginx, npm migration and execution security (GHSA-vrv8-j27g-g7cr advisory, August 2026).",19,4,false,"2026-06-05T00:00:00+00:00","2026-11-09T20:55:18+00:00",{"id":23,"name":24,"slug":25,"color":26,"icon":25},2,"Automation","automatisation","bg-brand-action\u002F10 text-brand-action",[28],{"id":23,"name":24,"slug":25,"color":26,"icon":25},null,"\u002Fblog\u002Fcovers\u002Fbg.svg","\u002Fblog\u002Fcovers\u002Finstaller-n8n-vps-poster.svg",{"categorySlug":33,"appSlug":34},"automation-workflows","n8n","n8n is an open source automation orchestrator: it connects your APIs, triggers workflows on events and, when self-hosted, runs without execution limits or cloud subscription. This guide covers the complete installation on VPS with Docker, reverse proxy configuration, critical environment variables, two critical production errors — V8 crash with more than 30 simultaneous workflows and 502 Bad Gateway nginx — migration from npm mode, and securing persisted execution data highlighted by the GHSA-vrv8-j27g-g7cr advisory in August 2026. On a ServOrbit VPS, n8n can be installed as soon as the server is created: the first part of this guide shows where to find its address and how to open it, and the manual installation is kept at the end of the article, as a fallback.",[37,41,57,60,71,74,89,92,95,98,101,104,107,110,113,116,140],{"type":38,"title":39,"body":40},"h2","n8n installed when your VPS is created","If you chose n8n when ordering your ServOrbit VPS, there is nothing to install. When the VPS is created, ServOrbit installs Docker if it is missing, then starts n8n and its PostgreSQL 16 database with Docker Compose. The interface listens on `127.0.0.1:5678`, the server's loopback interface: nothing is published on its IP address, and no domain is attached yet. The four steps below are enough to open it. The manual installation, for another server or to rebuild everything yourself, is described at the end of this article.",{"type":42,"title":43,"steps":44},"steps","Open the n8n installed by ServOrbit",[45,48,51,54],{"title":46,"body":47},"Find the address and access details","The “n8n is installed” email and your VPS page in the client area, under “Installed applications”, tell you how to open the app: its address when a domain is in place, otherwise the SSH tunnel command and the port. You will also find the link to this guide and the “Support” button there.",{"title":49,"body":50},"Open n8n without a domain","From your computer, run `ssh -L 5678:127.0.0.1:5678 root@\u003Cvps-ip>`, keep the session open, then open `http:\u002F\u002Flocalhost:5678`. The port may have been reassigned during installation: use the one shown in your client area, 5678 being only the catalogue default.",{"title":52,"body":53},"Log in for the first time","Do it right away: the first screen creates the owner account (email, name, password of at least 8 characters with one uppercase letter and one digit), and the very first visitor becomes the owner of the instance. Then create your first workflow: a trigger (Webhook, Cron, email…), then the applications to connect.",{"title":55,"body":56},"Publish over HTTPS on a domain","When n8n is installed from your client area with a chosen address — your own domain or a free ServOrbit subdomain — the platform sets up the nginx vhost and the Let's Encrypt certificate. An installation made when the VPS was created, or without an address, is published from the VPS page: the “Attach a domain” button in the app's block (a domain from your account, the free subdomain, or a name you point to the server). Once the domain is in place, add `N8N_HOST=\u003Cdomain>`, `N8N_PROTOCOL=https` and `N8N_WEBHOOK_URL=https:\u002F\u002F\u003Cdomain>\u002F` (`WEBHOOK_URL` before n8n 2.35.0) to the `environment` block of the `n8n` service, in the app's Compose file (`docker compose ls` shows its folder), then run `docker compose up -d`. Without these variables, the webhook URLs n8n generates keep pointing to `localhost` and cannot be reached.",{"type":38,"title":58,"body":59},"Why host n8n on your VPS","The cloud version of n8n charges per execution beyond the plan and limits the number of active workflows. On your VPS, the only cost is that of the server, regardless of the number of automations or API calls. You also keep full control over credentials, webhook payloads and execution history — no data transits through a third-party infrastructure.",{"type":61,"title":62,"items":63},"ul","The concrete benefits of a self-hosted n8n",[64,65,66,67,68,69,70],"No monthly execution cap: no monthly cap, no cost at scale.","Credentials and webhook payloads confined to your server, without external transit.","Access to community nodes and custom code execution without restriction.","Webhooks on your own domain, configurable for each inbound integration.","Predictable cost: a fixed VPS price, independent of automation volume.","Controlled persistence of workflows and history in volumes you back up.","Compatibility with Ollama, Flowise or any other Docker service on the same internal network.",{"type":38,"title":72,"body":73},"Securing persisted executions (advisory GHSA-vrv8-j27g-g7cr)","In August 2026, advisory GHSA-vrv8-j27g-g7cr revealed that three nodes write decrypted credentials into persisted execution data on error: the **Strapi** node (OAuth tokens written in plaintext into `execution_data`), the **SeaTable** node (API keys written into error execution logs) and the **Mailcheck** node (SMTP credentials persisted in `execution_data`). These secrets remain readable by any user with access to execution logs in the n8n interface. On an instance without pruning, they accumulate indefinitely.",{"type":42,"title":75,"steps":76},"Four steps to fix and prevent",[77,80,83,86],{"title":78,"body":79},"Update to the version fixing the advisory","The update is the only complete fix for all three nodes. Check your current version: `docker exec n8n n8n --version`. Pull the latest image and restart: `docker compose pull && docker compose up -d`. On the stable branch, the fix is available from version 2.35.4; on the v1 branch, from version 1.123.73. Confirm the absence of credential leaks in error logs after updating.",{"title":81,"body":82},"Enable execution pruning","Add two variables in the `environment` section of the n8n service: `EXECUTIONS_DATA_PRUNE=true` and `EXECUTIONS_DATA_MAX_AGE=168` (7 days, expressed in hours). Restart the container: `docker compose restart n8n`. Pruning deletes execution data beyond the defined age. It reduces the exposure surface but does not replace the update — data exposed before pruning may already have been read.",{"title":84,"body":85},"Restrict access to execution logs","In multi-user mode, verify in Settings → Users that only administrators can view execution logs. This safeguard limits propagation if sensitive data was persisted before the update. On a single-user instance exposed on a shared server, verify that port 5678 is not directly accessible from outside.",{"title":87,"body":88},"Precautionary measure before updating","On an instance not yet updated: disable or remove workflows using the Strapi, SeaTable or Mailcheck nodes. The issue only triggers on execution errors on these nodes, but the error can occur on a network cut or expired token — conditions outside your direct control.",{"type":38,"title":90,"body":91},"Fatal V8 crash with more than 30 active workflows","**Symptom.** The n8n instance stops abruptly with the error `FATAL ERROR: invalid-mark-compact are transition` in Docker logs. The container restarts if `restart: unless-stopped` is configured, but the crash recurs as soon as load passes the same threshold. No error message in the interface: the container disappears without warning.\n\n**Cause.** This error is a panic of the V8 engine (the JavaScript engine embedded in Node.js) during a garbage collection cycle. It triggers when the V8 heap is saturated — typically from **30 workflows executing simultaneously** on a VPS with less than 2 GB of RAM allocated to the process. Each active workflow maintains an execution context in memory; beyond a threshold, the GC attempts a `mark-compact` transition on an already corrupted heap, causing the fatal crash. The problem has **no** automatic recovery: n8n does not have a graceful degradation mechanism at this level.\n\n**Immediate fix.** Increase the V8 heap limit by adding the following environment variable in the n8n service in your `docker-compose.yaml`: `NODE_OPTIONS=--max-old-space-size=2048`. This allocates 2 GB to the V8 heap. Restart the container: `docker compose restart n8n`. Monitor logs for a few minutes to confirm no crash.\n\n**Structural fix.** The container memory limit must match the V8 limit. If your `docker-compose.yaml` declares `mem_limit: 1g` and you pass `--max-old-space-size=2048`, the OOM killer kills the container before V8 can use it. Rule: allocate **at least 2 GB of RAM to the VM** beyond 30 active workflows, and pass `NODE_OPTIONS=--max-old-space-size=1536` (leave 512 MB for the rest of the system). For installations with more than 50 workflows, prefer **queue mode** (separate Redis worker instance) which decouples executions from the main process and distributes memory load. Source: community.n8n.io thread #308425.",{"type":38,"title":93,"body":94},"Persistent 502 Bad Gateway behind nginx","**Symptom.** Short requests succeed but certain workflows return `502 Bad Gateway` from nginx — particularly workflows that call slow external APIs, process large data volumes or chain many nodes. The 502 occurs exactly 60 seconds after execution starts, even if n8n continues working in the background.\n\n**Cause.** nginx waits by default **60 seconds** for a response from the backend before closing the connection (`proxy_read_timeout` = 60 s). For n8n, the backend is the process executing the workflow: if execution takes more than 60 seconds, nginx closes the connection and returns a 502. n8n continues execution in the background (the workflow completes server-side), but the client never receives the response — making it appear as a failure when the result was actually produced. The behavior is exacerbated with synchronous webhooks that wait for workflow completion before responding (`Respond to Webhook` node at end of flow).\n\n**Fix.** Add these two directives in the `location` block of your nginx configuration that proxies to n8n:\n\n`proxy_read_timeout 300;`\n`proxy_send_timeout 300;`\n\nThe 300 second value (5 minutes) covers the vast majority of long workflows. For exceptionally long workflows (massive data imports, multi-step AI chains), raise to 600 s. Reload nginx: `nginx -t && systemctl reload nginx`. Note that this value does not replace the connection timeout (`proxy_connect_timeout`, keep it at 60 s — it only applies to the initial TCP connection establishment).\n\n**Verification.** Run a deliberately slow workflow (node `Wait` set to 90 s, for example) and verify the response arrives beyond 60 seconds without error. If the 502 persists after modification, verify you edited the correct `location` block — a fragmented nginx configuration in multiple `include` files may have a more specific block that overrides the timeout. Source: community.n8n.io thread #274581.",{"type":38,"title":96,"body":97},"Breaking changes to know (v1.27–v1.31)","Three changes in recent versions can silently break an existing instance.\n\n**Renaming of the OAuth 2.0 parameter in HTTP Request.** The `oauthTokenData` field was renamed in versions 1.27-1.31. Requests authenticated via OAuth 2.0 in the HTTP Request node may stop working without explicit error message — n8n sends an unauthenticated request rather than raising an exception. Check each workflow using this node with OAuth credentials after an update.\n\n**Webhook URL format.** The URL format generated by Webhook nodes changed in this version range. If you hard-coded webhook URLs in third-party services (Stripe, GitHub, Slack…), re-verify them after the update.\n\n**Deprecation of `$item()`.** The `$item()` function available in expressions and the Function node is marked deprecated. Its replacement is `$input.item` for the current item or `$('Node Name').item` for items from a previous node. It still works in v1.x.\n\nThe complete list of breaking changes is available on the \u003Ca href=\"https:\u002F\u002Fdocs.n8n.io\u002Fchangelog\u002Fv30-breaking-changes\">official n8n documentation\u003C\u002Fa>.",{"type":38,"title":99,"body":100},"Troubleshooting common errors","**Port 5678 is unreachable.** Verify the container is running (`docker compose ps`) and that you are listening on `127.0.0.1:5678`. If testing from the local machine, `curl http:\u002F\u002F127.0.0.1:5678\u002F` should respond.\n\n**Webhooks display `localhost` instead of the domain.** The `N8N_WEBHOOK_URL` variable is missing or incorrectly defined. Add `N8N_WEBHOOK_URL=https:\u002F\u002Fn8n.your-domain.com\u002F` (with trailing slash) and restart: `docker compose restart n8n`.\n\n**Missing `N8N_PROXY_HOPS`: 502 error or loop.** Without this variable, n8n rejects or loops on `X-Forwarded-*` headers. Add `N8N_PROXY_HOPS=1` in the container environment.\n\n**Volume permissions error.** The n8n container runs under UID 1000. If the data folder was created by root, permissions are incorrect: `chown -R 1000:1000 \u002Fopt\u002Fn8n\u002Fdata` then `docker compose restart n8n`.\n\n**PostgreSQL database refuses connection.** Verify the postgres service is on the same Docker network as n8n (`docker network inspect \u003Cname>`) and that `DB_POSTGRESDB_HOST`, `DB_POSTGRESDB_USER` and `DB_POSTGRESDB_PASSWORD` match exactly those defined in the postgres service.\n\n**Brutal V8 crash (`FATAL ERROR: invalid-mark-compact`).** The V8 heap is saturated: more than 30 simultaneous workflows with insufficient RAM. Add `NODE_OPTIONS=--max-old-space-size=2048` in the n8n service environment and increase the VPS RAM to 2 GB minimum. See the dedicated section above.\n\n**Persistent 502 Bad Gateway (exactly 60 s).** The nginx `proxy_read_timeout` is at default (60 s). Raise it to 300 s in the nginx `location` block pointing to n8n. See the dedicated section above.\n\n**Credentials visible in execution logs.** You are using one of the Strapi, SeaTable or Mailcheck nodes on a version prior to the GHSA-vrv8-j27g-g7cr advisory fix. Update to the version fixing the advisory and enable execution pruning. See the dedicated section above.\n\n**Silent SQLite rollback under load.** Symptom: missing executions or inconsistent results with no visible error, only under heavy concurrency. Cause: SQLite does not support concurrent writes; beyond a few simultaneous workflows, transactions silently roll back (GitHub issue n8n #32284). Only solution: migrate to PostgreSQL.",{"type":38,"title":102,"body":103},"SQLite or PostgreSQL: the choice that changes everything in production","**SQLite is a testing engine, not a production engine.** It works well for discovering n8n on a local machine or validating a workflow before deployment. As soon as your instance receives real traffic — multiple workflows triggered in parallel, inbound webhooks, simultaneous scheduled executions — SQLite becomes a risk. GitHub issue n8n #32284 documents silent rollbacks under concurrent load: executions disappear from history without error messages, and intermediate results are written partially. The problem is architectural: SQLite does not support concurrent writes, and n8n generates them as soon as it processes multiple workflows in parallel.\n\n**Migrating to PostgreSQL.** The official `docker-compose.yaml` already includes a `postgres` service. The three-step migration preserves all your workflows:\n\n1. Export existing workflows from the running SQLite instance: `n8n export:workflow --all --output=\u002Fopt\u002Fn8n\u002Fworkflows-backup.json`\n2. Edit the `.env` file to switch the engine: `DB_TYPE=postgresdb` with the variables `DB_POSTGRESDB_HOST`, `DB_POSTGRESDB_DATABASE`, `DB_POSTGRESDB_USER` and `DB_POSTGRESDB_PASSWORD` pointing to the `postgres` service in your Compose.\n3. Restart everything (`docker compose up -d`) then import workflows: `n8n import:workflow --input=\u002Fopt\u002Fn8n\u002Fworkflows-backup.json`.\n\n**Independent persistent storage.** The PostgreSQL volume (`pg_data`) must be mounted on persistent storage independent of the host — a named Docker volume (`volumes:` at the bottom of Compose) or a bind mount on a backed-up directory. If the `postgres` container is destroyed and recreated without a named volume or bind, the entire database is lost. Always verify with `docker volume ls` that the volume exists after a `docker compose up -d`.\n\n**Sizing.** PostgreSQL consumes approximately 50 to 100 MB of additional RAM compared to SQLite on a light load. Plan at minimum **2 GB of RAM** for the n8n + PostgreSQL combination on the same VPS; **4 GB** if you regularly run AI workflows or large imports.",{"type":38,"title":105,"body":106},"Four critical configurations for a stable production","These four points concentrate the bulk of incidents reported on community.n8n.io and DEV Community in 2026. Each is independent and can be applied to an existing instance without a full redeployment.\n\n**1. `N8N_WEBHOOK_URL` is mandatory in the `.env`.** Without this variable, n8n rebuilds the webhook URL by combining the container's internal hostname and port 5678. The result looks like `http:\u002F\u002Fn8n_container:5678\u002Fwebhook\u002F…` — a URL unusable from any external service. Worse: the URL changes on every container recreation if you use `docker compose down && docker compose up`. Set `N8N_WEBHOOK_URL=https:\u002F\u002Fn8n.your-domain.com\u002F` (with trailing slash) in your `.env` and never omit it, even on a test deployment accessible from outside.\n\n**2. Minimum 2 GB RAM, recommended 4 to 8 GB.** A 1 GB RAM VPS is insufficient as soon as n8n executes several workflows simultaneously. The Linux OOM killer terminates the Node.js process with no explicit log in n8n — the container disappears and `restart: unless-stopped` relaunches it, creating a crash cycle that is difficult to diagnose. The minimum documented by n8n for production use is 2 GB; 4 to 8 GB are recommended for instances with AI workflows, agents or more than 20 active workflows. If you cannot increase RAM immediately, reduce the number of workers and activate queue mode to isolate long executions.\n\n**3. nginx WebSocket headers are mandatory for the editor.** The n8n interface communicates with the backend via WebSocket for real-time execution and status updates. Without these two headers in the nginx `location` block, the WebSocket connection is rejected and the editor becomes inaccessible or freezes:\n\n`proxy_set_header Upgrade $http_upgrade;`\n`proxy_set_header Connection \"upgrade\";`\n\nThese headers are distinct from the IP forwarding headers described in the manual installation, at the end of this article. Caddy handles them automatically via `reverse_proxy`; with nginx, they must be added explicitly. Typical symptom without them: the editor page loads but executions do not start or the interface disconnects after a few seconds.\n\n**4. Automatic execution history pruning.** Without pruning, the executions table grows indefinitely. On an instance active for several months, it can reach several gigabytes and significantly degrade performance — slow execution list loading, sluggish interface, even disk saturation. Enable automatic pruning with two environment variables:\n\n`EXECUTIONS_DATA_PRUNE=true`\n`EXECUTIONS_DATA_MAX_AGE=168`\n\nThe value 168 corresponds to 7 days expressed in hours. Adjust according to your retention needs — 720 for 30 days, 336 for 14 days. These variables go in the `environment` section of the n8n service and take effect on the next container start.",{"type":38,"title":108,"body":109},"Maintaining and scaling the instance","For updates, two approaches: Watchtower (automatic image monitoring and restart) or a manual cron task (`docker pull n8nio\u002Fn8n:latest && docker compose up -d`). In both cases, read release notes before a major update — the breaking changes listed above are representative of the pace of changes. Keep your workflow exports up to date in a git repository: it is the fastest backup to restore in case of incident.\n\nFor security advisories, follow the \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fn8n-io\u002Fn8n\u002Fsecurity\u002Fadvisories\">GitHub Security Advisories page of the n8n repository\u003C\u002Fa> — stable versions publish critical patches quickly, and each advisory lists the affected versions and the minimum version fixing the issue.",{"type":38,"title":111,"body":112},"Installing by hand (fallback)","The following sections describe installing n8n by hand with Docker Compose: for a server where n8n was not installed by ServOrbit, or to rebuild everything yourself. On a VPS where ServOrbit installed it, you do not need them.",{"type":38,"title":114,"body":115},"Numbered prerequisites","Before starting, verify your VPS meets the following requirements. For moderate usage, **1 vCPU and 1 GB of RAM are sufficient**; plan for **2 vCPU and 2 GB** as soon as you run heavy or concurrent workflows, and **4 GB** if you connect a dedicated PostgreSQL database or integrate a local AI model. Allow 10 GB of disk minimum for Docker, volumes and logs. Port **5678** must not be exposed directly — n8n only listens on `127.0.0.1:5678` and all requests go through the reverse proxy on port **443**. A subdomain (for example `n8n.your-domain.com`) pointing to the VPS IP is required for HTTPS and inbound webhooks. Docker Engine 24+ and Docker Compose v2 are required.",{"type":42,"title":117,"steps":118},"Step-by-step installation",[119,122,125,128,131,134,137],{"title":120,"body":121},"Update the VPS and install Docker","Connect via SSH and update packages: `apt update && apt upgrade -y`. Then install Docker via the official script: `curl -fsSL https:\u002F\u002Fget.docker.com | sh`. Verify the installation: `docker --version && docker compose version`. Create the working directory: `mkdir -p \u002Fopt\u002Fn8n && cd \u002Fopt\u002Fn8n`.",{"title":123,"body":124},"Create the docker-compose.yaml file","Create `docker-compose.yaml` with the n8n service, a named volume for persistence and the essential environment variables. Declare `image: n8nio\u002Fn8n:latest`, `restart: unless-stopped`, and mount `n8n_data:\u002Fhome\u002Fnode\u002F.n8n`. Expose only on `127.0.0.1:5678:5678` to avoid any direct public exposure of the port.",{"title":126,"body":127},"Set critical environment variables","In the service `environment` section, declare at minimum: `N8N_HOST=n8n.your-domain.com`, `N8N_WEBHOOK_URL=https:\u002F\u002Fn8n.your-domain.com\u002F` and `N8N_PROXY_HOPS=1` (so n8n accepts `X-Forwarded-*` headers from the reverse proxy). Access is not set by a variable: basic auth was removed from n8n 1.0, and the built-in user management protects the instance — on first start, you create the owner account. For production use, store these values in an adjacent `.env` file and reference it via `env_file: .env`.",{"title":129,"body":130},"Start the container","Run: `docker compose up -d`. Verify the container is running: `docker compose ps`. Check logs: `docker compose logs -f n8n`. n8n is ready when the line `Editor is now accessible via: http:\u002F\u002Flocalhost:5678\u002F` appears in the logs. The interface is only accessible from `127.0.0.1` at this point — this is intentional.",{"title":132,"body":133},"Configure the reverse proxy with Caddy (recommended)","Caddy is the simplest reverse proxy for n8n: it handles the Let's Encrypt certificate and renewal without additional configuration. Install Caddy (`apt install caddy`) then edit `\u002Fetc\u002Fcaddy\u002FCaddyfile` to add: `n8n.your-domain.com { reverse_proxy localhost:5678 }`. Reload: `systemctl reload caddy`. **With nginx**, add in your `location` block: `proxy_set_header X-Forwarded-Host $host;`, `proxy_set_header X-Forwarded-Proto $scheme;` and `proxy_set_header X-Real-IP $remote_addr;` — without these headers, n8n rebuilds incorrect webhook URLs.",{"title":135,"body":136},"Verify inbound webhooks","In the n8n editor, create a test workflow with a **Webhook** node. The URL displayed in production mode must be exactly `https:\u002F\u002Fn8n.your-domain.com\u002Fwebhook\u002F\u003Cyour-path>`. Trigger the call from your local machine: `curl -X POST https:\u002F\u002Fn8n.your-domain.com\u002Fwebhook\u002Ftest -d '{}'`. If the displayed URL contains `localhost` or port `5678`, the `N8N_WEBHOOK_URL` variable is not being picked up — verify the container restarted after adding the variable.",{"title":138,"body":139},"Connect PostgreSQL for production","SQLite is fine for testing; in production, prefer PostgreSQL. Add a `postgres:15` service to the same `docker-compose.yaml`, with a dedicated `pg_data` volume. In the n8n service, add: `DB_TYPE=postgresdb`, `DB_POSTGRESDB_HOST=postgres`, `DB_POSTGRESDB_DATABASE=n8n`, `DB_POSTGRESDB_USER=n8n`, `DB_POSTGRESDB_PASSWORD=\u003Cpassword>`. Restart everything: `docker compose up -d`. The SQLite database is not automatically migrated — export your workflows before switching.",{"type":141,"title":142,"body":143},"tip","Hardening and queue mode","Three production reflexes: (1) Never expose port 5678 on the public interface — keep the `127.0.0.1:5678` binding. (2) Create the owner account on first start: basic auth was removed from n8n 1.0, the built-in user management protects the instance, and the very first visitor becomes its owner. (3) For AI or long-running workflows, switch to queue mode with a separate `worker` instance and a Redis queue: this isolates long executions from the interface and allows horizontal scaling without reconfiguring webhooks.","Your VPS for n8n","ServOrbit offers Linux VPS with root access, dedicated IPv4 and SSD storage — ready to host Docker and n8n without additional configuration. Visit the developers page to choose the configuration suited to your workflows.","Discover ServOrbit VPS","\u002Fsolutions\u002Fdeveloppeurs",[149],{"id":150,"slug":151,"slugs":152,"title":156,"excerpt":157,"readTime":158,"views":9,"isPinned":19,"noindex":19,"publishedAt":159,"updatedAt":160,"category":161,"categories":166,"featuredImage":29,"bgImage":30,"posterImage":168,"relatedSolution":169},93,"n8n-vs-node-red-which-self-hosted-automation-tool-to-choose",{"fr":153,"en":151,"ar":154,"es":155},"n8n-vs-node-red","n8n-مقابل-node-red-أي-أداة-أتمتة-مستضافة-ذاتيا-تختار","n8n-vs-node-red-que-automatizacion-self-hosted-elegir","n8n vs Node-RED: which self-hosted automation tool to choose?","n8n or Node-RED for your VPS workflows? Complete technical comparison: license, server resources, IoT vs SaaS use cases, migration steps, and Docker deployment.",9,"2026-03-19T00:00:00+00:00","2026-11-08T01:13:15+00:00",{"id":162,"name":163,"slug":164,"color":165,"icon":164},5,"Comparison","comparatif","bg-info\u002F10 text-info",[167],{"id":162,"name":163,"slug":164,"color":165,"icon":164},"\u002Fblog\u002Fcovers\u002Fn8n-vs-node-red-poster.svg",{"categorySlug":33,"appSlug":34},true,1794270434089]