Skip to main content

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

Connect Langflow to a local PostgreSQL database

  1. If Langflow is running, stop Langflow with Ctrl+C.

  2. 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.
  3. Create a Langflow .env file:


    _10
    touch .env

    You can use the .env.example file in the Langflow repository as a template for your own .env file.

  4. In your .env file, set LANGFLOW_DATABASE_URL to your PostgreSQL connection string:


    _10
    LANGFLOW_DATABASE_URL="postgresql://user:password@localhost:5432/dbname"

  5. Save your changes, and then start Langflow with your .env file:


    _10
    uv run langflow run --env-file .env

  6. In Langflow, run any flow to create traffic.

  7. 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.

  1. Update your .env file with values for your PostgreSQL database:


    _10
    POSTGRES_USER=langflow
    _10
    POSTGRES_PASSWORD=your_secure_password
    _10
    POSTGRES_DB=langflow
    _10
    POSTGRES_HOST=postgres
    _10
    POSTGRES_PORT=5432
    _10
    LANGFLOW_CONFIG_DIR=app/langflow
    _10
    LANGFLOW_PORT_1=7860
    _10
    LANGFLOW_PORT_2=7861
    _10
    LANGFLOW_HOST=0.0.0.0

  2. Reference these variables in your docker-compose.yml. For example:


    _46
    services:
    _46
    postgres:
    _46
    image: postgres:16
    _46
    environment:
    _46
    - POSTGRES_USER=${POSTGRES_USER}
    _46
    - POSTGRES_PASSWORD=${POSTGRES_PASSWORD}
    _46
    - POSTGRES_DB=${POSTGRES_DB}
    _46
    ports:
    _46
    - "${POSTGRES_PORT}:5432"
    _46
    volumes:
    _46
    - langflow-postgres:/var/lib/postgresql/data
    _46
    _46
    langflow-1:
    _46
    image: langflowai/langflow:latest
    _46
    pull_policy: always
    _46
    ports:
    _46
    - "${LANGFLOW_PORT_1}:7860"
    _46
    depends_on:
    _46
    - postgres
    _46
    environment:
    _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
    _46
    volumes:
    _46
    - langflow-data-1:/app/langflow
    _46
    _46
    langflow-2:
    _46
    image: langflowai/langflow:latest
    _46
    pull_policy: always
    _46
    ports:
    _46
    - "${LANGFLOW_PORT_2}:7860"
    _46
    depends_on:
    _46
    - postgres
    _46
    environment:
    _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
    _46
    volumes:
    _46
    - langflow-data-2:/app/langflow
    _46
    _46
    volumes:
    _46
    langflow-postgres:
    _46
    langflow-data-1:
    _46
    langflow-data-2:

  3. Deploy the file with docker-compose up. You can access the first Langflow instance at http://localhost:7860, and the second Langflow instance at http://localhost:7861.

  4. To confirm both instances are using the same database, run the docker exec command to start psql in your PostgreSQL container. Your container name may vary.


    _10
    docker exec -it docker-test-postgres-1 psql -U langflow -d langflow

  5. Query the database for active connections:


    _10
    langflow=# SELECT * FROM pg_stat_activity WHERE datname = 'langflow';

  6. Examine the query results for multiple connections with different client_addr values, for example 172.21.0.3 and 172.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.

  7. To quit psql, type quit.

See also

Search