DockerSelf-HostingAI

Langflow with Docker: visual AI workflows and agents (Linux, Windows, Mac)

Before you start

  • 20 min read
  • 15 to run in terminal
  • 7 file contents

Boxes marked Run in terminal are what you type; plain text explains why. Check what you need first

What you get in one minute#

Langflow is a free, open-source tool where you build AI workflows and agents by dragging blocks onto a canvas, testing them in a chat panel, and then calling them from your own apps through an API.

Langflow official logo

Logo: the official Langflow project (github.com/langflow-ai/langflow)

It suits a chatbot over your own documents, an agent that uses tools, or a quick test of an idea before you write code. Each flow can be exported as JSON or served as an API, and it can use cloud models or a model on your own computer. Be careful: flows run Python code, and the project has a long list of serious security advisories. This guide starts with login on, the image pinned, and the database kept off the network.

WhatValue (official docs, read October 2026)
Current versionLangflow 1.13.0, released 22 October 2026 (marked "Latest")
Image to pinlangflowai/langflow:1.13.0 (tag checked on Docker Hub, amd64 and arm64)
Time neededAbout 20 minutes (our estimate, not measured)
HardwareDocs: at least a dual-core CPU and 2 GB RAM, 4 GB or more recommended. The image is about 785 MB to download. We did not measure the running stack.
Port7860 (Langflow). PostgreSQL stays inside Docker.
LicenceMIT (LICENSE in the repository)
Official docsdocs.langflow.org and the repository

At a glance:

  • What it is: a visual builder plus a runtime. Build in the browser, test in the Playground, call the flow with an API key.
  • Login is the point of this guide. Official Docker images ship with automatic login off, and you must set an admin password. Never turn automatic login on for a server.
  • Platforms: Linux server, or Windows and Mac with Docker Desktop. The same Compose file works on all three. (Langflow Desktop for Windows and macOS also exists; this guide covers Docker.)
  • Local models: works with Ollama. Prompts then stay on your network.
  • Privacy: anonymous usage telemetry is on unless you set DO_NOT_TRACK. Prompts go to whichever model provider you configure.
  • Coming from Flowise? See the short note below.

How it fits together#

You reach Langflow through HTTPS, Langflow stores flows in PostgreSQL and its secret key in a folder on the host, and sends prompts to the model you choose.

Diagram: you in a browser and your own app both reach Caddy on port 443 over HTTPS, Caddy proxies to Langflow on port 7860 with login required, Langflow saves flows and users in PostgreSQL, keeps its secret key and files in a config folder, and sends prompts to Ollama on your own machine or, optionally, to a cloud model provider

Drawn for this guide from the official Docker docs. The Caddy step is optional (dashed). Only prompts sent to a cloud model leave your network.

Moving from Flowise? The Flowise team announced on GitHub that the project would be wound down: code freeze on 29 July 2026, repository archived on 13 August 2026, end of life on 31 August 2026 (the announcement). The Apache 2.0 code stays online and anyone may fork it, but the original team will no longer fix security problems. Langflow is a different, actively released project written in Python. We found no official tool that converts Flowise chatflows, so plan to rebuild your flows by hand and rewrite any custom Node.js code. Do not expect a one-click move.

Before you start#

You need Docker with Compose, a few free GB, and an admin password you choose.

Linux server: Docker Engine with the Compose plugin (x86_64 or arm64). Windows and Mac: Docker Desktop, with PowerShell or Terminal. Check Docker on every system:

Run in terminalbash
docker --version
docker compose version

Checklist:

  • [ ] Docker and Compose installed (the two commands above print versions)
  • [ ] At least 2 GB RAM free for the containers (docs minimum; 4 GB recommended)
  • [ ] Port 7860 free on the machine
  • [ ] A password manager ready for the admin password
  • [ ] Config backed up if you already run Langflow (see "Updates and backups")
  • [ ] For the HTTPS section only: a domain, DNS pointing at the server, ports 80 and 443 free

Tested by DIY Lab Hub: not yet. The commands come from the official Docker docs, the example Compose file and the release files, read in October 2026. We did not run them.

Step 1: Create the folders#

Langflow keeps its secret key and uploaded files in one config folder. The flows live in PostgreSQL. We use ~/docker_volumes/langflow, as all DIY Lab Hub guides do.

Linux#

On Linux, Docker creates a missing bind-mount folder owned by root and Langflow then fails with a PermissionError. The docs say to create it first and give it to user 1000:

Run in terminalbash
mkdir -p ~/docker_volumes/langflow/{data,backups}
sudo chown -R 1000:0 ~/docker_volumes/langflow/data
cd ~/docker_volumes/langflow

Windows (PowerShell)#

Codepowershell
New-Item -ItemType Directory -Force "$HOME\docker_volumes\langflow\data", "$HOME\docker_volumes\langflow\backups"
Set-Location "$HOME\docker_volumes\langflow"

Mac (Terminal)#

Same commands as Linux, without the sudo chown line (the docs only ask for it on Linux):

Run in terminalbash
mkdir -p ~/docker_volumes/langflow/{data,backups}
cd ~/docker_volumes/langflow

Check it worked. The folder data exists inside langflow. On Linux, ls -ld data shows owner 1000.

Tip: Docker Desktop on Windows and Mac only shares some folders. Keep this folder under your home directory, as the docs advise for backups.

Step 2: Create the .env file with your passwords#

The Compose file reads three secrets from .env: the admin password, a secret key that encrypts the API keys you save inside Langflow, and the PostgreSQL password. Langflow's docs recommend setting the secret key yourself. Without the admin password, Langflow refuses to start.

Linux#

Run in terminalbash
cd ~/docker_volumes/langflow
umask 077
printf 'LANGFLOW_SUPERUSER=langflow\nLANGFLOW_SUPERUSER_PASSWORD=<CHOOSE_A_LONG_PASSWORD>\n' > .env
python3 -c "from secrets import token_urlsafe; print(f'LANGFLOW_SECRET_KEY={token_urlsafe(32)}')" >> .env
python3 -c "from secrets import token_hex; print(f'POSTGRES_PASSWORD={token_hex(16)}')" >> .env
nano .env

Replace <CHOOSE_A_LONG_PASSWORD> with a long password from your password manager, save, and leave nano. The secret-key command is the one from the docs.

Windows (PowerShell)#

Codepowershell
Set-Location "$HOME\docker_volumes\langflow"
"LANGFLOW_SUPERUSER=langflow", "LANGFLOW_SUPERUSER_PASSWORD=<CHOOSE_A_LONG_PASSWORD>" | Set-Content -Encoding ascii .env
python -c "from secrets import token_urlsafe; print(f'LANGFLOW_SECRET_KEY={token_urlsafe(32)}')" | Add-Content -Encoding ascii .env
python -c "from secrets import token_hex; print(f'POSTGRES_PASSWORD={token_hex(16)}')" | Add-Content -Encoding ascii .env
notepad .env

If python is missing, install it from python.org or make two random strings of at least 32 letters and digits in your password manager and paste them after LANGFLOW_SECRET_KEY= and POSTGRES_PASSWORD=. Edit the password line in Notepad and save.

Mac (Terminal)#

Same commands as Linux, with python3 (it comes with Apple's command line tools). Use open -e .env instead of nano .env if you prefer a text editor window.

Check it worked. No placeholder is left, and (on Linux and Mac) only you can read the file:

Run in terminalbash
grep -c CHOOSE .env
chmod 600 .env

The first command should print 0. On Windows, your profile folder is private to your account by default; run Select-String CHOOSE .env and expect no output.

Tip: Use letters and digits in the PostgreSQL password. It goes into a connection URL, where characters such as @ or / break the address. The token_hex command above is safe.

Step 3: Write the Compose file and start Langflow#

This is based on the official docker_example file, with five changes: the image is pinned to 1.13.0, the config lives in ./data, port 7860 is published on the local machine only, the PostgreSQL port is not published (the official example publishes 5432 to everyone), and telemetry is switched off. Save it as docker-compose.yml in the langflow folder.

File contentyaml
services:
  langflow:
    image: langflowai/langflow:1.13.0
    container_name: langflow
    restart: unless-stopped
    depends_on:
      - postgres
    ports:
      - "127.0.0.1:7860:7860"
    extra_hosts:
      - "host.docker.internal:host-gateway"
    environment:
      - LANGFLOW_DATABASE_URL=postgresql://langflow:${POSTGRES_PASSWORD}@postgres:5432/langflow
      - LANGFLOW_CONFIG_DIR=/app/langflow
      - LANGFLOW_AUTO_LOGIN=false
      - LANGFLOW_SUPERUSER=${LANGFLOW_SUPERUSER:-langflow}
      - LANGFLOW_SUPERUSER_PASSWORD=${LANGFLOW_SUPERUSER_PASSWORD:?set it in .env}
      - LANGFLOW_SECRET_KEY=${LANGFLOW_SECRET_KEY:?set it in .env}
      - LANGFLOW_ENABLE_SIGNUP=false
      - LANGFLOW_NEW_USER_IS_ACTIVE=false
      - DO_NOT_TRACK=true
    volumes:
      - ./data:/app/langflow

  postgres:
    image: postgres:16-trixie
    container_name: langflow-postgres
    restart: unless-stopped
    environment:
      POSTGRES_USER: langflow
      POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
      POSTGRES_DB: langflow
    volumes:
      - langflow-postgres:/var/lib/postgresql/data

volumes:
  langflow-postgres:

Notes on the file:

  • LANGFLOW_ENABLE_SIGNUP=false and LANGFLOW_NEW_USER_IS_ACTIVE=false come from the docs' "authentication enabled" example. Only the superuser adds users, through the API.
  • PostgreSQL uses a Docker named volume, as in the official example. The backup section dumps it.
  • postgres:16-trixie is the tag the official file pins.
  • extra_hosts lets the container reach a program on the Docker host. Step 4 uses it for Ollama.

Start it:

Linux#

Run in terminalbash
cd ~/docker_volumes/langflow
docker compose up -d
docker compose ps
docker compose logs --tail=50 langflow

Windows (PowerShell)#

Codepowershell
Set-Location "$HOME\docker_volumes\langflow"
docker compose up -d
docker compose ps
docker compose logs --tail=50 langflow

Mac (Terminal)#

Same commands as Linux.

Check it worked. The docs say Langflow can take a few minutes to start the first time. Then the health endpoint answers. The docs show this expected answer:

Run in terminalbash
curl http://127.0.0.1:7860/health_check
File contenttext
{"status":"ok","chat":"ok","db":"ok"}

(Expected output from the official API docs, not captured by us. On Windows use curl.exe.) Open http://localhost:7860; you should see a sign-in page, not the builder.

Tip: Use docker compose up -d to apply changes. If the log says LANGFLOW_SUPERUSER_PASSWORD is not set, .env is in the wrong folder or has a typo.

Step 4: Sign in and run your first flow#

Sign in as langflow with the password from .env.

  1. Click New Flow and choose the Simple Agent template: an Agent block connected to chat input and output, a Calculator and a URL tool.
  2. In the Agent block, click Setup Provider. The docs say to open your profile icon, then Settings, then Model Providers, pick a provider and save. To use a model on your own machine, choose the Ollama provider.
  3. Click Playground and ask: "I want to add 4 and 4." The Playground shows the agent choosing the Calculator.

Using Ollama. If you do not have it yet, follow our Ollama guide. Inside the Langflow container, localhost means the container itself, so enter the Ollama address as http://host.docker.internal:11434. We combined the rest from the Ollama FAQ and Docker's host-gateway docs and did not test it.

Linux#

Ollama listens only on 127.0.0.1 by default, and the container cannot reach that. The Ollama FAQ says to change the bind address with the OLLAMA_HOST variable. Once it listens beyond the loopback address, your firewall decides who can reach it, so allow only the Docker network.

Windows (PowerShell)#

Docker Desktop resolves host.docker.internal itself. Run Ollama on Windows as usual and enter the address above.

Mac (Terminal)#

Same as Windows: Docker Desktop resolves host.docker.internal. Run Ollama on the Mac and enter the address above.

Check it worked. The model list fills in and the agent answers "8". A reply that names Calculator or evaluate_expression in the Playground means the tool call worked.

Tip: Cloud model keys you paste into Langflow are stored encrypted with LANGFLOW_SECRET_KEY. If you lose that key, the saved keys cannot be decrypted. Back up the data folder.

Step 5: Call your flow from an app with an API key#

Langflow API calls need a key. Create one in Settings then Langflow API Keys then Add New, and copy it; it is shown once. The docs' example:

Linux#

Run in terminalbash
export LANGFLOW_API_KEY="<YOUR_KEY>"
curl --request POST \
  --url "http://localhost:7860/api/v1/run/<FLOW_ID>" \
  --header "Content-Type: application/json" \
  --header "x-api-key: $LANGFLOW_API_KEY" \
  --data '{"output_type": "chat", "input_type": "chat", "input_value": "Hello"}'

Windows (PowerShell)#

Codepowershell
$env:LANGFLOW_API_KEY = "<YOUR_KEY>"
Invoke-RestMethod -Method Post -Uri "http://localhost:7860/api/v1/run/<FLOW_ID>" `
  -Headers @{ "x-api-key" = $env:LANGFLOW_API_KEY } -ContentType "application/json" `
  -Body '{"output_type": "chat", "input_type": "chat", "input_value": "Hello"}'

Mac (Terminal)#

Same commands as Linux.

Check it worked. You get a JSON answer. Without the header you get an error: the docs say requests that run a flow need the x-api-key header or query parameter whenever login is on. Find the flow ID in the browser address bar of the flow, or in the flow's API pane.

Tip: Keep the API key in your app's environment, never inside the flow JSON you export or share.

Put it behind HTTPS (with or without Traefik)#

The docs warn: never expose Langflow ports directly to the internet; use a reverse proxy. This section is for a server with a domain. If you only use Langflow on your own computer, skip it. Both routes need a DNS record pointing at the server.

With Traefik#

On a server that already runs Traefik v3 with the Docker provider, add labels and drop the host port.

This assumes an external Docker network called proxy and an entrypoint named https (use yours). Create the network once:

Run in terminalbash
docker network create proxy

In the langflow service of docker-compose.yml, delete the ports: block, add the network and the labels, and declare the network at the bottom of the file:

File contentyaml
    networks:
      - default
      - proxy
    labels:
      - "traefik.enable=true"
      - "traefik.docker.network=proxy"
      - "traefik.http.routers.langflow.rule=Host(`langflow.<your-domain>`)"
      - "traefik.http.routers.langflow.entrypoints=https"
      - "traefik.http.routers.langflow.tls=true"
      - "traefik.http.services.langflow.loadbalancer.server.port=7860"
File contentyaml
networks:
  proxy:
    external: true

Then run docker compose up -d.

Check it worked. curl -I https://langflow.<your-domain>/ returns an HTTP status line over HTTPS and the sign-in page opens with a valid certificate.

Without Traefik: Caddy#

Choose this if you have no Traefik. Caddy gets and renews its own certificates.

Caddy's docs describe automatic Let's Encrypt certificates for a public name, and a local certificate (tls internal) for names that only work at home. Run Caddy as a container on every system. First put Langflow on the shared network: add proxy to the langflow service as above (without the labels), delete its ports: block, and run docker network create proxy.

Run in terminalbash
mkdir -p ~/docker_volumes/caddy/{data,config}
cd ~/docker_volumes/caddy

On Windows use New-Item -ItemType Directory -Force "$HOME\docker_volumes\caddy\data", "$HOME\docker_volumes\caddy\config" and Set-Location "$HOME\docker_volumes\caddy". Save this as docker-compose.yml there (caddy:2.11.7 is the latest Caddy release read in October 2026):

File contentyaml
services:
  caddy:
    image: caddy:2.11.7
    container_name: caddy
    restart: unless-stopped
    ports:
      - "80:80/tcp"
      - "443:443/tcp"
      - "443:443/udp"
    volumes:
      - ./Caddyfile:/etc/caddy/Caddyfile:ro
      - ./data:/data
      - ./config:/config
    networks:
      - proxy

networks:
  proxy:
    external: true

Save this as Caddyfile next to it, for a public domain:

File contenttext
langflow.example.com {
    reverse_proxy langflow:7860
}

For a name that only works at home (it must resolve to the server through your router's DNS or a hosts-file entry), use Caddy's own certificate:

File contenttext
langflow.home.arpa {
    tls internal
    reverse_proxy langflow:7860
}

Start both stacks with docker compose up -d in each folder. A tls internal certificate is trusted only where Caddy's root certificate is installed. Copy it out and install it on each device:

Run in terminalbash
docker exec caddy find /data -name root.crt
docker cp caddy:<path-from-find> ./caddy-root.crt

Installing it is OS-specific and not from the Langflow or Caddy docs: on Windows use "Trusted Root Certification Authorities"; on macOS use Keychain Access with "Always Trust"; on Linux use your distribution's CA store.

Check it worked. curl -I https://langflow.example.com/ returns an HTTP status line over HTTPS (use curl.exe on Windows). For a home-only name the browser shows a padlock only after the root certificate is trusted.

Tip: Let's Encrypt needs ports 80 and 443 to reach the server. A certificate error usually means the name in the Caddyfile differs from the DNS record.

Security and testing#

Langflow executes flows that can contain Python code. Treat anyone who can sign in as someone who can run code on the server.

ControlHow
Login onLANGFLOW_AUTO_LOGIN=false plus a long LANGFLOW_SUPERUSER_PASSWORD. With auto-login on, everyone who can reach the server acts as the superuser.
VersionRun a current release. 1.13.0 is newer than the fixed version of every advisory listed below. Keep updating; new advisories appeared as late as September 2026.
Secret keySet LANGFLOW_SECRET_KEY to a long random value (the command in Step 2 gives 43 characters) and back it up.
AccountsLANGFLOW_ENABLE_SIGNUP=false; only the superuser adds users, through the Users API.
Ports7860 on 127.0.0.1 only, or no host port behind a proxy. PostgreSQL has no host port.
Files.env mode 600; backups hold the secret key, so treat them as secrets.
Reverse proxySet LANGFLOW_RATE_LIMIT_TRUST_PROXY=true only when Langflow sits behind a proxy you control. Docs: never when users can reach Langflow directly.

The advisories that matter, from the project's GitHub security page (read 30 October 2026):

AdvisoryWhat went wrongFixed in
CVE-2025-3248Unauthenticated code injection in /api/v1/validate/code1.3.0
GHSA-vwmf-pq79-vjvxUnauthenticated remote code execution through the public flow build endpoint1.9.0
GHSA-cf6m-vc3m-7cgmFlows could be run without a key through the webhook1.9.1
GHSA-v5ff-9q35-q26fUnauthenticated code execution through Shareable Playgrounds1.9.2
GHSA-w794-rj3p-xv45Any user could run commands through the tool-server settings1.10.3
GHSA-jxw3-mjmx-3pqmWeak encryption key when the secret key had under 32 characters1.10.1

We read the patched versions of these and a few others, not every advisory. Never run a version below 1.10.3.

Quick tests after each change:

Run in terminalbash
cd ~/docker_volumes/langflow
docker compose ps
docker compose logs --tail=100 langflow
curl -I http://127.0.0.1:7860/

On Windows use curl.exe. To prove login is on, call the API without a key; it must refuse.

What leaves the machine. Prompts and any text you feed a flow go to the model provider you configure: nowhere with Ollama on your own network, to the provider's servers with a cloud key. Components such as URL fetch contact the sites you point them at. Langflow sends anonymous usage telemetry through Segment (flow runs, version, platform, database type, auto-login state); the compose file above turns it off with DO_NOT_TRACK=true. Pulling images contacts Docker Hub, and Caddy contacts Let's Encrypt for certificates.

Common mistakes#

These come from the project's security advisories, its issue tracker, the docs' own warnings, and common AI assistant answers.

MistakeWhy it happensDo this instead
Running an old version on a reachable portAdvisory GHSA-vwmf-pq79-vjvx: versions up to 1.8.2 allow unauthenticated code execution; CVE-2025-3248 hit versions below 1.3.0Pin 1.13.0 and update when a new release lands
Turning on auto-login "to skip the sign-in"Older tutorials set LANGFLOW_AUTO_LOGIN=true; the docs say everyone who reaches the server then acts as the superuserLeave it false and set LANGFLOW_SUPERUSER_PASSWORD
Publishing PostgreSQL port 5432The official docker_example file maps 5432:5432 and uses the password langflowDo not publish the port; the file in Step 3 keeps it internal
Recreating the container and losing flowsWithout LANGFLOW_DATABASE_URL or LANGFLOW_SAVE_DB_IN_CONFIG_DIR=true, the SQLite database lives inside the container (docs warning)Keep PostgreSQL on a volume and LANGFLOW_CONFIG_DIR on a mount, as above
PermissionError on a Linux bind mountDocker creates the missing folder as root; Langflow runs as user 1000sudo chown -R 1000:0 data before the first start
Upgrading an auto-login install to 1.13 and being locked out1.13 disables auto-login; the old account has a generated password you never sawFollow the docs' "Upgrade from auto-login" steps before upgrading, and back up first
A short or lost secret keyAdvisory GHSA-jxw3-mjmx-3pqm: keys under 32 characters gave weak encryption (fixed in 1.10.1). Without the original key saved credentials cannot be decryptedSet a 32+ character key, keep it in .env, and back it up
An unpinned postgres imageIssue 9608: the base system changed under an existing database and PostgreSQL logged a collation mismatchUse postgres:16-trixie, as the official file now does
Entering http://localhost:11434 as the Ollama address inside Dockerlocalhost is the Langflow container, not your computer. Issue 12093 (open) also reports trouble with a non-localhost Ollama addressUse http://host.docker.internal:11434 and check the model list loads
AI assistants: a docker run line with :latest, LANGFLOW_AUTO_LOGIN=true and admin/admin, or pip install langflow-base followed by a langflow-base commandAssistants copy older tutorials; the docs say 1.12 langflow-base has no langflow-base executable and that images disable auto-loginUse the Compose file in this guide; check any command against docs.langflow.org

Tip: Before you paste a Langflow command from a forum or a chatbot, look for AUTO_LOGIN=true, latest and a published 5432. Each one weakens this setup.

Tip: After a start, run docker compose logs --tail=100 langflow. The sign-in and database errors print there with the exact text.

Tip: Import only flows and components you have read. A component is Python code that runs with the server's rights.

Troubleshooting#

ProblemSolution
Page does not load right after up -dThe docs say Langflow can take a few minutes to start. Watch docker compose logs -f langflow.
Startup fails about the superuser passwordSet LANGFLOW_SUPERUSER_PASSWORD in .env (same folder as the compose file) and run docker compose up -d again.
PermissionError in the log (Linux)sudo chown -R 1000:0 ~/docker_volumes/langflow/data, then docker compose up -d.
Cannot sign in after an upgrade from auto-loginDo not delete anything. Use the docs' "Recover access after upgrading" steps with a database backup.
JWSSignatureError or "JWT decoding error" in the logReported in issue 9023 (open). The docs say to set the secret key explicitly so every start uses the same key; check LANGFLOW_SECRET_KEY has not changed.
Port 7860 already in useChange the left side of the port mapping, for example 127.0.0.1:7861:7860.
Ollama model list stays emptyTest from inside the container: docker compose exec langflow curl -s http://host.docker.internal:11434/api/tags (adjust the host if your Ollama is elsewhere).

Diagnostic commands: docker compose ps, docker compose logs --tail=200 langflow, docker inspect langflow, and docker stats --no-stream.

Known bugs (open, October 2026)#

  • Issue 12093: the Ollama component cannot fetch the model list from a non-localhost address in Docker. Use host.docker.internal as in Step 4.
  • Issue 9023: a JWT signature error in a Docker deployment. See the table above.

Updates and backups#

Update. Langflow ships a new version almost every week. Read the release notes, back up first, change the tag in docker-compose.yml, then:

Run in terminalbash
cd ~/docker_volumes/langflow
docker compose pull
docker compose up -d
docker compose logs --tail=100 langflow

On Windows run the same three commands in PowerShell after Set-Location "$HOME\docker_volumes\langflow". A newer version can migrate the database on startup, so the docs say to keep a database backup until the new version passes your checks, and to restore it if you roll back.

Back up. Two things matter: the PostgreSQL database and the data folder (it holds the secret key). The dump runs inside the container and is copied out:

Run in terminalbash
cd ~/docker_volumes/langflow
D=$(date +%F)
docker compose exec -T postgres sh -c "pg_dump -U langflow langflow | gzip > /tmp/db.sql.gz"
docker compose cp postgres:/tmp/db.sql.gz "backups/langflow-db-$D.sql.gz"
sudo tar -czf "backups/langflow-data-$D.tar.gz" data
sudo chmod 600 backups/*

To run it nightly at 03:00 on Linux or Mac, put these lines in a script backup.sh and add a crontab entry with crontab -e: 0 3 * * * /home/<you>/docker_volumes/langflow/backup.sh (use your own path; on Mac, /Users/<you>/...).

Windows (PowerShell)#

Codepowershell
Set-Location "$HOME\docker_volumes\langflow"
$d = Get-Date -Format "yyyy-MM-dd"
docker compose exec -T postgres sh -c "pg_dump -U langflow langflow | gzip > /tmp/db.sql.gz"
docker compose cp postgres:/tmp/db.sql.gz "backups\langflow-db-$d.sql.gz"
tar -czf "backups\langflow-data-$d.tar.gz" data

Save those lines as backup.ps1 and schedule it at 03:00 in Task Scheduler, or with schtasks /Create /SC DAILY /ST 03:00 /TN "Langflow backup" /TR "powershell -File $HOME\docker_volumes\langflow\backup.ps1".

Mac (Terminal)#

Same commands as Linux. Replace sudo tar and sudo chmod with plain tar and chmod if you own the folder.

Restore test. Restore the dump into a scratch database, never over the live one:

Run in terminalbash
docker compose cp "backups/langflow-db-<date>.sql.gz" postgres:/tmp/restore.sql.gz
docker compose exec -T postgres createdb -U langflow restoretest
docker compose exec -T postgres sh -c "gunzip -c /tmp/restore.sql.gz | psql -U langflow -d restoretest -q"
docker compose exec -T postgres psql -U langflow -d restoretest -c "\dt"
docker compose exec -T postgres dropdb -U langflow restoretest

The \dt line should list Langflow's tables.

Performance and resources#

The docs give a minimum of a dual-core CPU and 2 GB RAM, with 4 GB or more recommended. They publish no figure for the Docker stack, so we give none; measure your own with docker stats. The download is about 785 MB (amd64) or 710 MB (arm64) per Docker Hub for the 1.13.0 tag.

  • Smaller image: the docs describe a base profile (langflowai/langflow:base-1.13.0, about 670 MB on Docker Hub, without provider extensions) and an extended langflow-all image. Pick the smallest one that holds the components your flows use.
  • Monitor: docker stats langflow langflow-postgres.
  • Local models: large models need their own memory. Langflow's Ollama page says an error like "model requires more system memory than is available" means you need a smaller model.
  • Dev tags: Docker Hub also lists 1.14.0.dev10 and similar. Those are development builds; do not use them.

FAQ#

Is Langflow free to use? Yes. The code is MIT licensed. Cloud model providers charge for their own APIs.

Does it need a GPU? No. The docs list no GPU. A GPU matters only for local models in Ollama.

Does it send my data anywhere? Prompts go to the model provider you set. Anonymous telemetry is on unless DO_NOT_TRACK=true. See "What leaves the machine" above.

Why not leave automatic login on at home? Anyone who can reach the page would be the superuser and could run Python inside the container.

What about Langflow Desktop? The docs offer it for Windows and macOS with dependencies included. Some features, such as Shareable Playground and Voice Mode, are missing there. This guide covers the server route.

Sources#

Checked against the official docs on 2026-10-30.