selfhostedworld.com logoselfhostedworld.com

Try describing what you need:

flowctl logo

flowctl

★ 340
Apache License 2.0Open Source — No Paywall4 Containers — 4 containers — moderate hosting footprintDocker · Compose · BinaryNeeds Postgres6+ active committers (12mo)

About

Flowctl is a self-service workflow execution platform designed for teams that need controlled access to operational or business workflows. It positions itself as domain-agnostic, with example uses...

Community Ratings

No ratings yet

Features

  • YAML/HUML workflow definitions
  • OIDC single sign-on
  • approvals
  • teams and isolated namespaces
  • built-in RBAC
  • remote SSH execution
  • encrypted secrets storage
  • real-time streaming logs
  • cron-based scheduling

Details

Last Updated
Oct 12, 2026
Created
Oct 30, 2025
Install Methods
dockerdocker-composebinary
Requirements
PostgreSQL databaseDocker
Authentication
oidc-sso
Runtime / Stack
GoDocker
Privacy & Independence
No Cloud Required
User Model
Multi-User
Deployment

Deployment: Docker Compose ✓4 Containers — moderate hosting footprintRuns as 4 containers

Run flowctl with Docker Compose

Compose file from the flowctl project repository.

4 services · database: postgres · infra: postgres · 1 unclassified (dex)

no resource limits declared

needs persistent storage (4 volumes)

docker-compose.yaml · @ d55e591 · scanned Sep 23, 2026

x-flowctl-env: &flowctl-env
  # Database configuration
  FLOWCTL_DB__HOST: postgres
  FLOWCTL_DB__PORT: 5432
  FLOWCTL_DB__USER: ${POSTGRES_USER:-flowctl}
  FLOWCTL_DB__PASSWORD: ${POSTGRES_PASSWORD:-flowctl}
  FLOWCTL_DB__DBNAME: ${POSTGRES_DB:-flowctl}

  # App configuration
  FLOWCTL_APP__ADMIN_USERNAME: ${ADMIN_USERNAME:-flowctl_admin}
  FLOWCTL_APP__ADMIN_PASSWORD: ${ADMIN_PASSWORD:-flowctl_password}
  FLOWCTL_APP__FLOWS_DIRECTORY: /app/flows
  FLOWCTL_APP__ROOT_URL: ${ROOT_URL:-http://localhost:7000}
  FLOWCTL_APP__ADDRESS: :7000
  FLOWCTL_APP__USE_TLS: ${USE_TLS:-false}
  FLOWCTL_APP__MAX_FILE_UPLOAD_SIZE: ${MAX_FILE_UPLOAD_SIZE:-104857600}

  # Keystore configuration
  FLOWCTL_KEYSTORE__KEEPER_URL: ${KEYSTORE_KEEPER_URL:-base64key://2M-MkchieLohxn0jlmSfbuh4KE4EZz9tWrhcY9DZ8bE=}

  # OIDC configuration
  FLOWCTL_OIDC__NAME: ${OIDC_NAME:-oidc}
  FLOWCTL_OIDC__CLIENT_ID: ${OIDC_CLIENT_ID:-flowctl}
  FLOWCTL_OIDC__CLIENT_SECRET: ${OIDC_CLIENT_SECRET:-secret}
  FLOWCTL_OIDC__ISSUER: ${OIDC_ISSUER:-http://dex:5556/dex}
  FLOWCTL_OIDC__AUTH_URL: ${OIDC_AUTH_URL:-http://localhost:5556/dex/auth}
  FLOWCTL_OIDC__TOKEN_URL: ${OIDC_TOKEN_URL:-http://dex:5556/dex/token}
  FLOWCTL_OIDC__REDIRECT_URL: ${OIDC_REDIRECT_URL:-http://localhost:7000/auth/callback}

  # Scheduler configuration
  FLOWCTL_SCHEDULER__BACKEND: ${SCHEDULER_BACKEND:-}
  FLOWCTL_SCHEDULER__CRON_SYNC_INTERVAL: ${SCHEDULER_CRON_SYNC_INTERVAL:-5m0s}
  FLOWCTL_SCHEDULER__WORKERS: ${SCHEDULER_WORKERS:-20}
  FLOWCTL_SCHEDULER__FLOW_EXECUTION_TIMEOUT: ${SCHEDULER_FLOW_EXECUTION_TIMEOUT:-1h}
  FLOWCTL_SCHEDULER__DEFAULT_TIMEZONE: UTC

  # Logger configuration
  FLOWCTL_LOGGER__BACKEND: ${LOG_BACKEND:-file}
  FLOWCTL_LOGGER__LOG_DIRECTORY: ${LOG_DIRECTORY:-/var/log/flowctl}
  FLOWCTL_LOGGER__MAX_SIZE_BYTES: ${LOG_MAX_SIZE_BYTES:-0}
  FLOWCTL_LOGGER__RETENTION_TIME: ${LOG_RETENTION_TIME:-0s}
  FLOWCTL_LOGGER__SCAN_INTERVAL: ${LOG_SCAN_INTERVAL:-1h0m0s}

  # Metrics configuration
  FLOWCTL_METRICS__ENABLED: ${METRICS_ENABLED:-true}
  FLOWCTL_METRICS__PATH: ${METRICS_PATH:-/metrics}

  # Email configuration
  FLOWCTL_MESSENGERS__EMAIL__ENABLED: ${EMAIL_ENABLED:-false}
  FLOWCTL_MESSENGERS__EMAIL__HOST: ${EMAIL_HOST:-localhost}
  FLOWCTL_MESSENGERS__EMAIL__PORT: ${EMAIL_PORT:-587}
  FLOWCTL_MESSENGERS__EMAIL__USERNAME: ${EMAIL_USERNAME:-}
  FLOWCTL_MESSENGERS__EMAIL__PASSWORD: ${EMAIL_PASSWORD:-}
  FLOWCTL_MESSENGERS__EMAIL__FROM_ADDRESS: ${EMAIL_FROM_ADDRESS:-flowctl@flowctl.internal}
  FLOWCTL_MESSENGERS__EMAIL__FROM_NAME: ${EMAIL_FROM_NAME:-}
  FLOWCTL_MESSENGERS__EMAIL__MAX_CONNS: ${EMAIL_MAX_CONNS:-10}
  FLOWCTL_MESSENGERS__EMAIL__SSL: ${EMAIL_SSL:-none}

  # Debug
  DEBUG_LOG: ${DEBUG_LOG:-false}

services:
  postgres:
    image: docker.io/postgres:17.0-alpine3.20
    restart: unless-stopped
    environment:
      - POSTGRES_PASSWORD=${POSTGRES_PASSWORD:-flowctl}
      - POSTGRES_USER=${POSTGRES_USER:-flowctl}
      - POSTGRES_DB=${POSTGRES_DB:-flowctl}
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER:-flowctl}"]
      interval: 10s
      timeout: 5s
      retries: 6
    volumes:
      - type: volume
        source: flowctl-db-data
        target: /var/lib/postgresql/data

  dex:
    image: dexidp/dex:v2.44.0-alpine
    ports:
      - "5556:5556"
    configs:
      - source: dex-config
        target: /etc/dex/config.yml
    command: ["dex", "serve", "/etc/dex/config.yml"]

  flowctl-migrate:
    image: ghcr.io/cvhariharan/flowctl:latest
    environment:
      <<: *flowctl-env
    command: ["install"]
    depends_on:
      postgres:
        condition: service_healthy
      dex:
        condition: service_started
    restart: "no"

  flowctl:
    image: ghcr.io/cvhariharan/flowctl:latest
    ports:
      - "7000:7000"
    environment:
      <<: *flowctl-env
    command: ["start"]
    volumes:
      - flowctl-flows:/app/flows
      # This is required for docker executor
      - /var/run/docker.sock:/var/run/docker.sock
      # This is a workaround to get tmp mounts in executors working
      - /tmp:/tmp
    depends_on:
      flowctl-migrate:
        condition: service_completed_successfully
    restart: unless-stopped

volumes:
  flowctl-db-data:
  flowctl-flows:

configs:
  dex-config:
    content: |
      issuer: http://dex:5556/dex
      issuerRotation:
        - issuer: http://localhost:5556/dex

      storage:
        type: sqlite3
        config:
          file: /var/dex/dex.db

      web:
        http: 0.0.0.0:5556

      staticClients:
        - id: flowctl
          redirectURIs:
            - "http://localhost:7000/auth/callback"
          name: flowctl
          secret: secret

      oauth2:
        skipApprovalScreen: true

      enablePasswordDB: true

      staticPasswords:
        - email: "user@flowctl.internal"
          # Password - flowctl
          hash: "$2y$10$76VGxsIYbm7U2WRLkCsqVeBeMKdH3F6qLH88cmqDE6r9c17ZQEVEC"
          username: "user"
          userID: "4ec61291-40f3-4b0e-8090-99c67190758d"

This file may be out of date. Check the flowctl documentation for current setup steps.

Track your self-hosted stack

Bookmark software to try, rate tools you've used, and keep your collection in one place.

Metadata extracted from README on May 30, 2026

Related Software

Cronmaster logo

Cronmaster

1.4k
A web-based cron manager for viewing, creating, cloning, and deleting cron jobs and scripts, with system information, logging, and authentication.
Automation ToolsTask RunnersScheduling and Bookings+3
Details
Cronicle logo

Cronicle

5.8k
A multi-server task scheduler and runner with a web-based UI for scheduled, repeating, and on-demand jobs.
Automation ToolsTask RunnersScheduling and Bookings+2
Details
gocron logo

gocron

606
A Go and Vue.js task scheduler for defining recurring jobs in a YAML configuration file and running commands on cron schedules.
Automation ToolsPermissive LicenseTask Runners+2
Details
Ctfreak logo

Ctfreak

IT task scheduler with mobile-friendly web UI to schedule concurrent, remote and chained execution of Bash / Powershell / SQL scripts, Webhooks, and more.
Automation ToolsTask RunnersScheduling and Bookings+1
Details
Infisical logo

Infisical

29.7k
Infisical is an open-source secret management platform for centralizing application secrets, configs, and internal PKI.
Secret ManagementPermissive LicenseSelf Hosting Solutions+3
FOSS with Issues
Details
Infisical Community Edition logo

Infisical Community Edition

29.7k
Infisical is an open-source secret management platform for syncing secrets and configs across teams and infrastructure, with support for PKI, KMS, SSH certificates, and secret leak prevention.
Miscellaneous ToolsSecret ManagementSelf Hosting Solutions+4
FOSS with Issues
Details
Dagu logo

Dagu

4.3k
Dagu is a lightweight workflow orchestrator with a web UI that runs DAG-based automation from declarative YAML.
Automation ToolsTask RunnersScheduling and Bookings+2
Single ContainerOpen Core
Details
Bitwarden logo

Bitwarden

20.3k
Bitwarden Server provides the backend APIs, database, and core infrastructure for Bitwarden client applications.
Password ManagersCopyleft LicenseFOSS with Issues+4
3 ContainersFOSS with Issues
Details
Rallly logo

Rallly

5.3k
Rallly is a self-hostable meeting poll app for scheduling group meetings by collecting participants' availability.
Scheduling and BookingsPolls and EventsCopyleft License+2
Details
openGym logo

openGym

10.6k
A self-hosted gym and body-weight tracker for planning workouts, logging sets and body weight, and syncing across devices with passkey login.
Health & FitnessSelf Hosting SolutionsAuthentication Services+1
3 Containers
Details
Bitpoll logo

Bitpoll

316
Bitpoll is a Django-based poll application for dates, times, and general questions.
Polls and EventsCopyleft LicenseScheduling and Bookings+3
2 ContainersFully FOSS
Details
Teleport logo

Teleport

21.0k
Teleport is an identity-aware access platform for securing and auditing access to infrastructure, applications, databases, Kubernetes, and cloud services.
Miscellaneous ToolsRemote AccessAuthentication Services+3
Open Core
Details