Self Hosting
Setting up an External Database

Setting up Hatchet with an external database

Connecting to Postgres

To connect to an external Postgres instance, set postgres.enabled to false in the values.yaml file. This will disable the internal Postgres instance and allow you to connect to an external database. You should then add the following configuration for the hatchet-stack or hatchet-ha charts:

sharedConfig:
  env:
    DATABASE_URL: "postgres://<user>:<password>@<host>:5432/<db-name>?sslmode=disable"
    DATABASE_POSTGRES_HOST: "<host>"
    DATABASE_POSTGRES_PORT: "5432"
    DATABASE_POSTGRES_USERNAME: "<user>"
    DATABASE_POSTGRES_PASSWORD: "<password>"
    DATABASE_POSTGRES_DB_NAME: "<db-name>"
    DATABASE_POSTGRES_SSL_MODE: "disable"

Mounting environment variables

Environment variables can also be mounted from secrets or configmaps via the deploymentEnvFrom field, which corresponds to the envFrom field in a Kubernetes deployment. For example, to mount the DATABASE_URL environment variable from a secret, you can use the following configuration:

hatchet-api:
  deploymentEnvFrom:
    - secretRef:
        name: hatchet-api-secrets
        key: DATABASE_URL
 
hatchet-engine:
  deploymentEnvFrom:
    - secretRef:
        name: hatchet-api-secrets
        key: DATABASE_URL

For more information on mounting environment variables from secrets, refer to the Kubernetes documentation (opens in a new tab).

Migrations

In order for migrations to run, the database user requires permissions to write and modify schemas on a clean database. It is therefore recommended to create a separate database instance where Hatchet can run and grant permissions on this database to the Hatchet user. For example, to create a new database and user hatchet in Postgres, run the following commands (warning: change the username/password for production usage):

create database hatchet;
 
create role hatchet
with
    login password 'hatchet';
 
grant hatchet to postgres;
 
alter database hatchet owner to hatchet;