Deploy Flowise on Pethost in one click
Build AI agents and LLM workflows visually, then call them over an API or embed them as a chat widget
What happens
- You sign in to Pethost or make an account, with a passkey, GitHub or Google.
- No machine yet? You pick a plan, and we prepare one for you. The link waits in your browser until it is ready.
- New project opens at the app. You fill in what it asks for and click Create project: Email, Admin password.
- In a minute or two the app is live at its own address with HTTPS. Its secrets are made for it at random, and its data is in the nightly backup.
- It is a project like any other: its compose.yaml, its .env, its logs and a terminal are in the panel, and your agent can change it, roll it back or restore it.
First steps
Sign in with the email and the admin password you gave: the template registers that owner at the first start. Add a credential for your model's provider, then build a chatflow or an agentflow.
What it runs
The template is this compose.yaml and the variables it writes into the project’s .env. Pethost runs the file as it is written.
services:
flowise:
image: flowiseai/flowise:3.1.3
restart: unless-stopped
environment:
PORT: "3000"
APP_URL: ${URL}
JWT_AUTH_TOKEN_SECRET: ${JWT_AUTH_TOKEN_SECRET}
JWT_REFRESH_TOKEN_SECRET: ${JWT_REFRESH_TOKEN_SECRET}
EXPRESS_SESSION_SECRET: ${EXPRESS_SESSION_SECRET}
TOKEN_HASH_SECRET: ${TOKEN_HASH_SECRET}
NUMBER_OF_PROXIES: "1"
ADMIN_EMAIL: ${ADMIN_EMAIL}
ADMIN_PASSWORD: ${ADMIN_PASSWORD}
# Flowise lets its first visitor register the owner. The first start runs it on a port no
# route reaches, registers the email and password given there, then serves it on 3000.
entrypoint: ["/bin/sh", "-c"]
command:
- |
PORT=3001 flowise start &
setup=$$!
node -e '
const base = "http://127.0.0.1:3001/api/v1";
const body = JSON.stringify({ user: { name: "Admin", email: process.env.ADMIN_EMAIL, credential: process.env.ADMIN_PASSWORD } });
const wait = (ms) => new Promise((done) => setTimeout(done, ms));
(async () => {
for (let tries = 0; tries < 300; tries++) {
try {
const ping = await fetch(base + "/ping");
if (ping.ok) break;
} catch {}
await wait(1000);
}
const answer = await fetch(base + "/account/register", { method: "POST", headers: { "Content-Type": "application/json" }, body });
const text = await answer.text();
if (answer.ok || /only have one organization/.test(text)) return;
console.error("registering the owner failed:", answer.status, text);
process.exit(1);
})();
' || exit 1
kill $$setup
wait $$setup
exec flowise start
volumes:
- data:/home/node
volumes:
data:
