Short answer: you don’t need to log in for Prefect Server. Point your CLI at your Server, make sure your worker is polling a work pool, then deploy each flow either via CLI or a tiny Python script. Here’s the “how”.
Assumptions: Prefect 3.2.6, Prefect Server via docker-compose, a worker already running.
1) Point your CLI at your Server (no login required)
- If you’re running the CLI on your host:
- Linux/macOS: export PREFECT_API_URL=
http://localhost:4200/api
- PowerShell: $env:PREFECT_API_URL="
http://localhost:4200/api"
- Make it persistent (optional):
- prefect profile create server
- prefect config set PREFECT_API_URL=
http://localhost:4200/api
- prefect profile use server
If you run the CLI inside a container, localhost refers to that container. Use an address your container can reach (e.g.,
http://server:4200/api on the compose network or
http://host.docker.internal:4200/api on Mac/Windows).
2) Ensure a work pool exists and your worker polls it
- Create a pool if you don’t have one:
- prefect work-pool create dev-pool --type process
- Start a worker against that pool (if not already):
- prefect worker start -p dev-pool
3) Option A: Deploy each flow via CLI (one-liners)
From your project root (run prefect init once if you haven’t), deploy each flow file by its entrypoint:
- prefect deploy path/to/flow_a.py:flow_a -n flow-a-dev
- prefect deploy path/to/flow_b.py:flow_b -n flow-b-dev
The command will prompt for choices (e.g., work pool) if not specified; choose your dev-pool. This registers each deployment with your Server—no login involved.
4) Option B: Define multiple deployments in prefect.yaml, then deploy all
- Initialize once:
- prefect init
- In prefect.yaml, add entries under deployments, e.g.:
deployments:
- name: flow-a-dev
entrypoint: flows/flow_a.py:flow_a
work_pool:
name: dev-pool
- name: flow-b-dev
entrypoint: flows/flow_b.py:flow_b
work_pool:
name: dev-pool
- Then deploy them all:
- prefect deploy
5) Option C: Non-interactive Python deployment script
If you want to avoid prompts entirely and script per-flow deploys:
- deploy_all.py
from prefect import deploy
from prefect.deployments import RunnerDeployment
from prefect.runner.storage import LocalStorage
deployments = [
RunnerDeployment(
name="flow-a-dev",
entrypoint="flows/flow_a.py:flow_a",
work_pool_name="dev-pool",
storage=LocalStorage(path="."),
tags=["dev"],
),
RunnerDeployment(
name="flow-b-dev",
entrypoint="flows/flow_b.py:flow_b",
work_pool_name="dev-pool",
storage=LocalStorage(path="."),
tags=["dev"],
),
]
deploy(*deployments)
- Run it with your PREFECT_API_URL set. It will register both deployments against your Server.
6) Run a deployment to test
- prefect deployment run flow-a/flow-a-dev --watch
- prefect deployment run flow-b/flow-b-dev --watch
That’s it. No Cloud login anywhere—just your Server URL. If you share your work pool name and how you’re invoking the CLI (host vs container), I can tailor the exact commands so nothing prompts you unpleasantly like a Vogon.