How to deploy Windmill Enterprise via Helm Chart with Qovery

Hi @dalemccrory , good news. I’ve set up the perfect working setup with Qovery (Thanks to the Windmill team). So here is how you can leverage Windmill with Qovery.

Create Postgres DB

With Qovery, create a Postgres database.

  1. Inside your environment, click on New service > Create datasbase.
  2. Select Postgres, give a name and pick Managed mode if it’s for production purposes.
  3. Postgres Version 15 or latest
  4. Accessibility → Private
  5. Click on Continue and Create

Deploy Windmill Helm Chart

Here, we will use the official Windmill Helm Chart.

  1. Add windmill helm repository to Qovery

  1. Create a new Helm service inside your environment

  1. Specify the general config and click Continue

  1. Click on Raw YAML file source (or use Git if you want) to specify your Helm values file.

Here is the yaml content you can copy paste :slight_smile:

postgres:
  enabled: false

windmill:
  databaseUrl: qovery.env.DATABASE_URL
  # -- domain as shown in browser, this variable and `baseProtocol` are used as part of the BASE_URL environment variable in app and worker container and in the ingress resource, if enabled
  baseDomain: qovery.env.BASE_DOMAIN
  # -- protocol as shown in browser, change to https etc based on your endpoint/ingress configuration, this variable and `baseDomain` are used as part of the BASE_URL environment variable in app and worker container
  baseProtocol: http

  # extra worker groups
  workerGroups:
    # workers configuration
    # The default worker group
    - name: "default"
      replicas: 3
      # -- Annotations to apply to the pods
      annotations:
        qovery.annotations.service

      # -- Labels to apply to the pods
      labels: 
        qovery.labels.service

    - name: "native"
      replicas: 4
      # -- Annotations to apply to the pods
      annotations:
        qovery.annotations.service

      # -- Labels to apply to the pods
      labels: 
        qovery.labels.service

  # app configuration
  app:
    # -- Annotations to apply to the pods
    annotations:
      qovery.annotations.service

    # -- Labels to apply to the pods
    labels: 
      qovery.labels.service

  # lsp configuration
  lsp:
    # -- Annotations to apply to the pods
    annotations:
      qovery.annotations.service

    # -- Labels to apply to the pods
    labels: 
      qovery.labels.service

  # multiplayer configuration
  multiplayer:
    # -- Annotations to apply to the pods
    annotations:
      qovery.annotations.service

    # -- Labels to apply to the pods
    labels: 
      qovery.labels.service

ingress:
  enabled: false

serviceAccount:
  # Specifies whether a ServiceAccount should be created
  create: true
  # The name of the ServiceAccount to use.
  # If not set and create is true, a name is generated using the fullname template
  name: ""
  annotations:
    qovery.annotations.service

You should get something like this

Then click on Continue.

  1. Then click on Continue until you can create your Helm Chart

Congrats, your helm chart is created inside Qovery (but not deployed yet).

Reverse proxy with Caddy

Windmill uses 2 services that must be exposed to the same domain to work properly. That’s why we will not use the Qovery Helm Networking part, but we will expose a Caddy container image with the appropriate configuration.

LSP is useful to provide auto-completion into the web windmill IDE - it’s not a mandatory component, but it’s more convenient for the end user.

Caddy Deployment

  1. Go back to your Qovery environment where Windmill helm chart is, and click on New Service and Create Application.

CleanShot 2024-01-08 at 8 .34.15

  1. Complete the general information. Pick the Docker Hub container registry and specify the caddy image and the version 2.5.2-alpine

  1. Click Continue and leave the default Resources values (you can change them afterward if needed).

  2. Add a port 80 and expose it publicly. Then click on Create and Continue.

  1. Then click on Continue (or properly configure the healthcheck - recommend).

  2. And click on Create

Well done; your proxy is now ready to be deployed. But before, we need to configure the environment variables now to interconnect our services.

Env Vars configuration

We must configure some environment variables we defined inside our helm values file. Like:

  • DATABASE_URL → to connect to the Postgres database
  • BASE_DOMAIN → to provide Windmill with the public domain that will be used.
  • CADDY_CONFIG → to provide the reverse proxy configuration to properly route the traffic between the Windmill app and Windmill LSP

DATABASE_URL

  1. Click on your Windmill Variables tab.
  2. Create an Alias DATABASE_URL on QOVERY_POSTGRES_Z..._DATABASE_URL_INTERNAL. Set the scope to service.
  3. Create it.

You should see something like this:

BASE_DOMAIN

  1. Click on your Windmill Variables tab.
  2. Create an Alias BASE_DOMAIN on QOVERY_CONTAINER_Z..._HOST_EXTERNAL. Set the scope to environment.
  3. Create it.

You should see something like this:

CADDY_CONFIG

  1. Click on your Proxy Variables tab.
  2. Create a New Variable as a File.

  1. Complete the fields:
    3.1 Variable → CADDY_CONFIG
    3.2 Path → /etc/caddy/Caddyfile
    3.3 Value →
http:// {
        bind 0.0.0.0
        reverse_proxy /ws/* http://windmill-lsp:3001
        reverse_proxy /* http://windmill-app:8000
}

3.4 Scope → Service

Well done, you’re ready to deploy your environment now.

Deployment

Deploy your environment with Windmill

Once your environment is deployed, you must be able to access the public URL provided by the proxy to access your windmill instance :sunglasses:


Hope it helps :slight_smile:

1 Like