Pipedash
Deployment

Docker

The Pipedash web server in the ghcr.io image, with SQLite or PostgreSQL. Covers example stacks, env vars and health.

Pipedash ships a web server as the image ghcr.io/hcavarsan/pipedash-web. It serves the REST API, the WebSocket at /api/v1/ws and the embedded frontend on one port.

Image

Every version tag publishes the image to the GitHub Container Registry for linux/amd64 and linux/arm64.

TagExample for release 0.1.1Note
semver0.1.1Full version
major.minor0.1Moves with each patch release
shasha-<short-commit>One tag per commit
latestlatestSkipped when the tag name contains -beta or -alpha
docker pull ghcr.io/hcavarsan/pipedash-web:latest

The image is a scratch image with CA certificates and one static binary. It declares no exposed port and no user, so the container needs a published port. The binary listens on 127.0.0.1:8080 unless PIPEDASH_BIND_ADDR says otherwise, so a container needs PIPEDASH_BIND_ADDR set to 0.0.0.0:8080.

Environment variables

These are the variables the example compose files set, plus PIPEDASH_CORS_ALLOW_ALL.

VariableValue in examplesMeaning
PIPEDASH_BIND_ADDR0.0.0.0:8080Listen address. Default 127.0.0.1:8080.
PIPEDASH_DATA_DIR/dataData directory. A value starting with /data or /var also selects server mode.
PIPEDASH_METRICS_ENABLED"true"Not read by the current version. general.metrics_enabled in config.toml controls metrics and defaults to true.
PIPEDASH_EMBEDDED_FRONTEND"true"Serves the bundled UI. Default true. Only true or 1 enables it.
PIPEDASH_CONFIG_PATH/config/config.tomlConfig file location.
PIPEDASH_VAULT_PASSWORD<vault-password>Encrypts tokens in storage. Also the API bearer token.
PIPEDASH_POSTGRES_URL<postgres-url>PostgreSQL connection string. Postgres example only.
GITHUB_TOKEN<github-token>Read by ${GITHUB_TOKEN} in config.toml.
PIPEDASH_CORS_ALLOW_ALLnot setAllows any origin, method and header. Default false. Only true or 1 enables it. The TOML key server.cors_allow_all has no effect on the web server.

The sample values in the repo are not secure. A server exposed to a network needs its own vault password, Postgres password and GitHub token in place of the samples.

SQLite stack

examples/sqlite runs one container with a named volume for /data and a read-only config mount.

services:
  pipedash:
    build:
      context: ../..
      dockerfile: docker/Dockerfile
      platforms:
        - linux/amd64
    platform: linux/amd64
    ports:
      - "8080:8080"
    environment:
      PIPEDASH_BIND_ADDR: 0.0.0.0:8080
      PIPEDASH_DATA_DIR: /data
      PIPEDASH_METRICS_ENABLED: "true"
      PIPEDASH_EMBEDDED_FRONTEND: "true"
      PIPEDASH_CONFIG_PATH: /config/config.toml
      PIPEDASH_VAULT_PASSWORD: <vault-password>
      GITHUB_TOKEN: <github-token>
    volumes:
      - ./config.toml:/config/config.toml:ro
      - pipedash-data:/data
    restart: unless-stopped

volumes:
  pipedash-data:

The example config.toml defines 2 GitHub providers with token = "${GITHUB_TOKEN}" and selected repositories. It comments out the providers for GitLab, Buildkite and Jenkins.

mise run examples:sqlite:up
mise run examples:sqlite:down

up builds the image and starts the stack. down stops it and runs docker compose down -v, which deletes the pipedash-data volume.

PostgreSQL stack

examples/postgres adds a postgres:17-alpine service with a health check. The Pipedash service waits until the database reports healthy.

services:
  postgres:
    image: postgres:17-alpine
    platform: linux/amd64
    environment:
      POSTGRES_USER: pipedash
      POSTGRES_PASSWORD: <postgres-password>
      POSTGRES_DB: pipedash
    volumes:
      - postgres-data:/var/lib/postgresql/data
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U pipedash -d pipedash"]
      interval: 5s
      timeout: 5s
      retries: 5
    restart: unless-stopped

  pipedash:
    build:
      context: ../..
      dockerfile: docker/Dockerfile
      platforms:
        - linux/amd64
    platform: linux/amd64
    ports:
      - "8080:8080"
    environment:
      PIPEDASH_BIND_ADDR: 0.0.0.0:8080
      PIPEDASH_DATA_DIR: /data
      PIPEDASH_METRICS_ENABLED: "true"
      PIPEDASH_EMBEDDED_FRONTEND: "true"
      PIPEDASH_CONFIG_PATH: /config/config.toml
      PIPEDASH_VAULT_PASSWORD: <vault-password>
      PIPEDASH_POSTGRES_URL: postgres://pipedash:<postgres-password>@postgres:5432/pipedash
      GITHUB_TOKEN: <github-token>
    volumes:
      - ./config.toml:/config/config.toml:ro
    depends_on:
      postgres:
        condition: service_healthy
    restart: unless-stopped

volumes:
  postgres-data:

Its config.toml sets backend = "postgres" and connection_string = "${PIPEDASH_POSTGRES_URL}". The Postgres password appears twice, so both places need the same change. See storage backends for the backend rules.

mise run examples:postgres:up
mise run examples:postgres:down

Volumes

VolumeMountHolds
pipedash-data/dataSQLite database and data directory. SQLite stack only.
postgres-data/var/lib/postgresql/dataPostgreSQL data. Postgres stack only.
./config.toml/config/config.toml (read-only)Config file.

Health check

GET /api/v1/health needs no authentication and returns JSON with status, version and database.

curl http://localhost:8080/api/v1/health

status is ok when the server is ready and initializing while the token store loads. It is setup_required before the first setup and config_error when the config is invalid. The last two states add a setup_required or config_error field. See the REST API reference for the other routes.