Bytebase
Database change management for teams. Plan, review and roll out schema changes to Postgres, MySQL and 20-odd other databases with a full history, or query them from a web SQL editor.
Database / Development
Visual builder for AI agents and workflows: drag together models, prompts, tools, vector stores and MCP servers on a canvas, chat with the result in a playground, then call it as an API or serve it as an MCP server.
It isn't in the main Portainer Templates list yet, so use this one. Portainer takes one URL at a time, so it swaps out whatever list you had before.
In Portainer, head to Settings --> App Templates, paste this in as the URL and save.
https://raw.githubusercontent.com/NotAFlightRisk/portainer-templates-extras/main/templates.json http://<your-server>:7860 in a browser.The same file Portainer deploys. It reads its settings from a .env next to it.
services:
langflow:
image: langflowai/langflow:latest
restart: unless-stopped
ports:
- "${LANGFLOW_PORT:-7860}:7860"
environment:
LANGFLOW_SUPERUSER_PASSWORD: ${LANGFLOW_ADMIN_PASSWORD:?Set an admin password}
LANGFLOW_DATABASE_URL: postgresql://langflow:${LANGFLOW_DB_PASSWORD:?Set a database password}@postgres:5432/langflow
LANGFLOW_CONFIG_DIR: /app/langflow
DO_NOT_TRACK: ${LANGFLOW_TELEMETRY_OFF:-false}
volumes:
- langflow-data:/app/langflow
depends_on:
postgres:
condition: service_healthy
postgres:
image: postgres:17-alpine
restart: unless-stopped
environment:
POSTGRES_DB: langflow
POSTGRES_USER: langflow
POSTGRES_PASSWORD: ${LANGFLOW_DB_PASSWORD:?Set a database password}
volumes:
- postgres-data:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U langflow -d langflow"]
interval: 10s
timeout: 5s
retries: 5
volumes:
langflow-data:
postgres-data:
Fill in the blanks, as Langflow won't start without them.
# Admin password (required) - For signing in as langflow. Only used to create the account on the very first start.
LANGFLOW_ADMIN_PASSWORD=
# Database password (required) - Letters and numbers only, since it goes into a database URL. Generate one with: openssl rand -hex 32
LANGFLOW_DB_PASSWORD=
# Host port for the web UI
LANGFLOW_PORT=7860 Grab the file and start it.
mkdir langflow && cd langflow
curl -fsSL -o compose.yml https://raw.githubusercontent.com/NotAFlightRisk/portainer-templates-extras/main/apps/langflow/compose.yml
# save the .env tab here as .env first
docker compose up -d Set both passwords before you deploy, since the stack won't start without them. The first start takes a couple of minutes, then open http://<your-host>:7860 (or whichever port you picked) and sign in as langflow with your admin password. Changing that password on the form later does nothing. Add your AI provider's key under Settings --> Model Providers (Ollama works too). The sign-up link makes accounts that stay locked until an admin switches them on, and the open-source version only does that through its API, so treat it as a one-person app. Any account can run its own Python on the server, so only switch on people you trust. Langflow sends anonymous usage stats to its makers. To stop it, add LANGFLOW_TELEMETRY_OFF set to true to the stack's environment variables and redeploy. Uploaded files and its generated keys live in the langflow-data volume, your flows and settings in postgres-data. Docs: docs.langflow.org
What the Portainer form asks for. With compose they go in the .env file instead.
| Variable | What it's for | Default |
|---|---|---|
LANGFLOW_ADMIN_PASSWORD | Admin password (required) For signing in as langflow. Only used to create the account on the very first start. | Needs filling in |
LANGFLOW_DB_PASSWORD | Database password (required) Letters and numbers only, since it goes into a database URL. Generate one with: openssl rand -hex 32 | Needs filling in |
LANGFLOW_PORT | Host port for the web UI | 7860 |
The containers this stack runs, with ports as they come out of the box.
| Service | Image | Ports |
|---|---|---|
langflow | langflowai/langflow:latest | 7860:7860 |
postgres | postgres:17-alpine | Internal only |