Configure an external PostgreSQL database
Langflow's default database is SQLite, but you can configure Langflow to use PostgreSQL instead.
This guide walks you through setting up an external database for Langflow by replacing the default SQLite connection string sqlite:///./langflow.db
with PostgreSQL, both in local and containerized environments.
In this configuration, all structured application data from Langflow, including flows, message history, and logs, is instead managed by PostgreSQL. PostgreSQL is better suited for production environments due to its robust support for concurrent users, advanced data integrity features, and scalability. Langflow can more efficiently handle multiple users and larger workloads by using PostgreSQL as the database.
Prerequisites
- A PostgreSQL database
Connect Langflow to a local PostgreSQL database
-
If Langflow is running, stop Langflow with Ctrl+C.
-
Find your PostgreSQL database's connection string in the format
postgresql://user:password@host:port/dbname
.The hostname in your connection string depends on how you're running PostgreSQL:
- If you're running PostgreSQL directly on your machine, use
localhost
. - If you're running PostgreSQL in Docker Compose, use the service name, such as
postgres
. - If you're running PostgreSQL in a separate Docker container with
docker run
, use the container's IP address or network alias. - If you're running a cloud-hosted PostgreSQL, your provider will share your connection string, which includes a username and password.
- If you're running PostgreSQL directly on your machine, use
-
Create a Langflow
.env
file:_10touch .envYou can use the
.env.example
file in the Langflow repository as a template for your own.env
file. -
In your
.env
file, setLANGFLOW_DATABASE_URL
to your PostgreSQL connection string:_10LANGFLOW_DATABASE_URL="postgresql://user:password@localhost:5432/dbname" -
Save your changes, and then start Langflow with your
.env
file:_10uv run langflow run --env-file .env -
In Langflow, run any flow to create traffic.
-
Inspect your PostgreSQL database's tables and activity to verify that new tables and traffic were created after you ran a flow.
Deploy Langflow and PostgreSQL containers with docker-compose.yml
Launching Langflow and PostgreSQL containers in the same Docker network ensures proper connectivity between services.
For an example, see the docker-compose.yml
file in the Langflow repository.
The configuration in the example docker-compose.yml
also sets up persistent volumes for both Langflow and PostgreSQL data.
Persistent volumes map directories inside of containers to storage on the host machine, so data persists through container restarts.
Docker Compose creates an isolated network for all services defined in docker-compose.yml
. This ensures that the services can communicate with each other using their service names as hostnames, such as postgres
in the database URL.
In contrast, if you run PostgreSQL separately with docker run
, it launches in a different network than the Langflow container, and this prevents Langflow from connecting to PostgreSQL using the service name.
To start the Langflow and PostgreSQL services with the example Docker Compose file, navigate to the langflow/docker_example
directory, and then run docker-compose up
.
If you're using a different docker-compose.yml
file, run the docker-compose up
command from the same directory as your docker-compose.yml
file.
Deploy multiple Langflow instances with a shared PostgreSQL database
To configure multiple Langflow instances that share the same PostgreSQL database, modify your docker-compose.yml
file to include multiple Langflow services.
This example populates the values in docker-compose.yml
with values from your Langflow .env
file.
This approach means you only have to manage deployment variables in one file, instead of copying values across multiple files.
-
Update your
.env
file with values for your PostgreSQL database:_10POSTGRES_USER=langflow_10POSTGRES_PASSWORD=your_secure_password_10POSTGRES_DB=langflow_10POSTGRES_HOST=postgres_10POSTGRES_PORT=5432_10LANGFLOW_CONFIG_DIR=app/langflow_10LANGFLOW_PORT_1=7860_10LANGFLOW_PORT_2=7861_10LANGFLOW_HOST=0.0.0.0 -
Reference these variables in your
docker-compose.yml
. For example:_46services:_46postgres:_46image: postgres:16_46environment:_46- POSTGRES_USER=${POSTGRES_USER}_46- POSTGRES_PASSWORD=${POSTGRES_PASSWORD}_46- POSTGRES_DB=${POSTGRES_DB}_46ports:_46- "${POSTGRES_PORT}:5432"_46volumes:_46- langflow-postgres:/var/lib/postgresql/data_46_46langflow-1:_46image: langflowai/langflow:latest_46pull_policy: always_46ports:_46- "${LANGFLOW_PORT_1}:7860"_46depends_on:_46- postgres_46environment:_46- LANGFLOW_DATABASE_URL=postgresql://${POSTGRES_USER}:${POSTGRES_PASSWORD}@${POSTGRES_HOST}:${POSTGRES_PORT}/${POSTGRES_DB}_46- LANGFLOW_CONFIG_DIR=${LANGFLOW_CONFIG_DIR}_46- LANGFLOW_HOST=${LANGFLOW_HOST}_46- PORT=7860_46volumes:_46- langflow-data-1:/app/langflow_46_46langflow-2:_46image: langflowai/langflow:latest_46pull_policy: always_46ports:_46- "${LANGFLOW_PORT_2}:7860"_46depends_on:_46- postgres_46environment:_46- LANGFLOW_DATABASE_URL=postgresql://${POSTGRES_USER}:${POSTGRES_PASSWORD}@${POSTGRES_HOST}:${POSTGRES_PORT}/${POSTGRES_DB}_46- LANGFLOW_CONFIG_DIR=${LANGFLOW_CONFIG_DIR}_46- LANGFLOW_HOST=${LANGFLOW_HOST}_46- PORT=7860_46volumes:_46- langflow-data-2:/app/langflow_46_46volumes:_46langflow-postgres:_46langflow-data-1:_46langflow-data-2: -
Deploy the file with
docker-compose up
. You can access the first Langflow instance athttp://localhost:7860
, and the second Langflow instance athttp://localhost:7861
. -
To confirm both instances are using the same database, run the
docker exec
command to startpsql
in your PostgreSQL container. Your container name may vary._10docker exec -it docker-test-postgres-1 psql -U langflow -d langflow -
Query the database for active connections:
_10langflow=# SELECT * FROM pg_stat_activity WHERE datname = 'langflow'; -
Examine the query results for multiple connections with different
client_addr
values, for example172.21.0.3
and172.21.0.4
. Since each Langflow instance runs in its own container on the Docker network, using different incoming IP addresses confirms that both instances are actively connected to the PostgreSQL database. -
To quit psql, type
quit
.