Skip to content

ChiefOnboarding

Employee onboarding automation platform. ChiefOnboarding lets HR teams define onboarding sequences for new hires — assigning tasks, collecting documents, sending introductions, and integrating with tools like Slack and Google Workspace. All onboarding data and workflow definitions are stored in PostgreSQL.

Key Features

  • Onboarding sequences — ordered tasks, automated triggers, and conditional workflows
  • Integrations — Slack, Google Workspace, email notifications, and webhook support
  • Multi-role access — admin, manager, and buddy role assignments
  • PostgreSQL backend — bundled subchart or external database
  • Django application — secure SECRET_KEY management for sessions and CSRF protection
  • Ingress support — TLS via cert-manager with configurable ingress class

Installation

HTTPS repository:

helm repo add helmforge https://repo.helmforge.dev
helm repo update
helm install chiefonboarding helmforge/chiefonboarding

OCI registry:

helm install chiefonboarding oci://ghcr.io/helmforgedev/helm/chiefonboarding

Deployment Examples

# values.yaml — ChiefOnboarding with bundled PostgreSQL (default)
chiefonboarding:
  baseUrl: 'https://onboarding.example.com'
  secretKey: 'a-random-50-char-django-secret-key-here-replace-me'

postgresql:
  enabled: true
  auth:
    password: 'postgres-password'

ingress:
  enabled: true
  ingressClassName: traefik
  hosts:
    - host: onboarding.example.com
      paths:
        - path: /
          pathType: Prefix
# values.yaml — ChiefOnboarding with external PostgreSQL
chiefonboarding:
  baseUrl: 'https://onboarding.example.com'
  secretKey: 'a-random-50-char-django-secret-key-here-replace-me'

postgresql:
  enabled: false

database:
  external:
    host: postgresql.database.svc
    port: '5432'
    name: chiefonboarding
    username: chiefonboarding
    password: 'db-password'

ingress:
  enabled: true
  ingressClassName: traefik
  hosts:
    - host: onboarding.example.com
      paths:
        - path: /
          pathType: Prefix
# values.yaml — Production setup with secrets, TLS, and Slack integration
chiefonboarding:
  baseUrl: 'https://onboarding.example.com'
  existingSecret: chiefonboarding-secret
  existingSecretKey: secret-key
  extraEnv:
    # Slack integration
    - name: SLACK_APP_TOKEN
      valueFrom:
        secretKeyRef:
          name: chiefonboarding-integrations
          key: slack-app-token
    - name: SLACK_BOT_TOKEN
      valueFrom:
        secretKeyRef:
          name: chiefonboarding-integrations
          key: slack-bot-token

postgresql:
  enabled: false

database:
  external:
    host: postgresql.production.svc
    port: '5432'
    name: chiefonboarding
    username: chiefonboarding
    existingSecret: chiefonboarding-db-secret
    existingSecretPasswordKey: password

ingress:
  enabled: true
  ingressClassName: traefik
  annotations:
    cert-manager.io/cluster-issuer: letsencrypt-prod
  hosts:
    - host: onboarding.example.com
      paths:
        - path: /
          pathType: Prefix
  tls:
    - secretName: chiefonboarding-tls
      hosts:
        - onboarding.example.com

Configuration Reference

Core

ParameterTypeDefaultDescription
nameOverridestring""Override the chart name.
fullnameOverridestring""Override the full release name.
commonLabelsobject{}Extra labels added to all resources.

Image

ParameterTypeDefaultDescription
image.repositorystringdocker.io/chiefonboarding/chiefonboardingChiefOnboarding container image.
image.tagstring"v2.4.1"Image tag.
image.pullPolicystringIfNotPresentImage pull policy.
imagePullSecretsarray[]Pull secrets for private registries.

ChiefOnboarding Configuration

ParameterTypeDefaultDescription
chiefonboarding.portinteger8000Internal HTTP port (Django development server).
chiefonboarding.baseUrlstring""Public base URL of the instance (e.g. https://onboarding.example.com).
chiefonboarding.secretKeystring""Django SECRET_KEY for session signing and CSRF protection.
chiefonboarding.existingSecretstring""Existing Kubernetes Secret containing the Django secret key.
chiefonboarding.existingSecretKeystringsecret-keyKey inside the existing secret holding the Django SECRET_KEY.
chiefonboarding.extraEnvarray[]Extra environment variables for integrations and advanced configuration.
Set baseUrl to your public URL

chiefonboarding.baseUrl must be set to your actual public URL before deploying. Django uses this value to generate links in email notifications and onboarding task messages. Without it, all links sent to new hires will be empty or incorrect.

Always set secretKey explicitly

If chiefonboarding.secretKey is empty, a Django SECRET_KEY is auto-generated at startup. If the pod is recreated with a new key, all user sessions are invalidated, all pending password reset links expire, and all CSRF tokens become invalid. Always provide a stable, explicit key or use chiefonboarding.existingSecret.

Integrations via extraEnv

ChiefOnboarding integrations (Slack, Google Workspace, email) are configured via environment variables. Use chiefonboarding.extraEnv with secretKeyRef to inject integration tokens securely. See the ChiefOnboarding integration documentation for the full list of required variables per integration.

Database — Embedded Subchart

ParameterTypeDefaultDescription
postgresql.enabledbooleantrueDeploy a bundled PostgreSQL subchart for ChiefOnboarding.
postgresql.architecturestringstandalonePostgreSQL deployment architecture.
postgresql.auth.databasestringchiefonboardingDatabase name created by the subchart.
postgresql.auth.usernamestringchiefonboardingDatabase username created by the subchart.
postgresql.auth.passwordstring""Database password (auto-generated if empty).

Database — External

ParameterTypeDefaultDescription
database.external.hoststring""External PostgreSQL hostname or IP.
database.external.portstring"5432"External PostgreSQL port.
database.external.namestringchiefonboardingDatabase name on the external server.
database.external.usernamestringchiefonboardingUsername for the external database.
database.external.passwordstring""Password for the external database (plain text — prefer secret).
database.external.existingSecretstring""Existing secret containing the database password.
database.external.existingSecretPasswordKeystringpasswordKey inside the existing secret for the password.

Service

ParameterTypeDefaultDescription
service.typestringClusterIPKubernetes service type.
service.portinteger80Service port exposed to the cluster.
service.annotationsobject{}Annotations for the Service.

Ingress

ParameterTypeDefaultDescription
ingress.enabledbooleanfalseEnable an Ingress resource.
ingress.ingressClassNamestringtraefikIngress class name.
ingress.annotationsobject{}Annotations for the Ingress (e.g. cert-manager).
ingress.hostsarray[]Ingress host and path rules.
ingress.tlsarray[]TLS configuration (secret name and hosts).

Probes

ParameterTypeDefaultDescription
probes.startup.enabledbooleantrueEnable startup probe.
probes.startup.initialDelaySecondsinteger10Startup probe initial delay.
probes.startup.periodSecondsinteger5Startup probe period.
probes.startup.timeoutSecondsinteger3Startup probe timeout.
probes.startup.failureThresholdinteger30Startup probe failure threshold.
probes.liveness.enabledbooleantrueEnable liveness probe.
probes.liveness.initialDelaySecondsinteger0Liveness probe initial delay.
probes.liveness.periodSecondsinteger15Liveness probe period.
probes.liveness.timeoutSecondsinteger5Liveness probe timeout.
probes.liveness.failureThresholdinteger3Liveness probe failure threshold.
probes.readiness.enabledbooleantrueEnable readiness probe.
probes.readiness.initialDelaySecondsinteger0Readiness probe initial delay.
probes.readiness.periodSecondsinteger10Readiness probe period.
probes.readiness.timeoutSecondsinteger5Readiness probe timeout.
probes.readiness.failureThresholdinteger3Readiness probe failure threshold.

Resources and Security

ParameterTypeDefaultDescription
resourcesobject{}CPU and memory requests and limits.
podSecurityContextobject{}Pod-level security context.
securityContextobject{}Container-level security context.

Service Account

ParameterTypeDefaultDescription
serviceAccount.createbooleanfalseCreate a dedicated ServiceAccount.
serviceAccount.namestring""Override the ServiceAccount name.
serviceAccount.annotationsobject{}Annotations for the ServiceAccount.

Scheduling

ParameterTypeDefaultDescription
nodeSelectorobject{}Node selector for scheduling.
tolerationsarray[]Tolerations for scheduling.
affinityobject{}Affinity rules.
topologySpreadConstraintsarray[]Topology spread constraints.
priorityClassNamestring""PriorityClass for the pod.
terminationGracePeriodSecondsinteger30Termination grace period.
podLabelsobject{}Extra labels for the pod.
podAnnotationsobject{}Extra annotations for the pod.

Extra

ParameterTypeDefaultDescription
extraVolumesarray[]Extra volumes to attach to the pod.
extraVolumeMountsarray[]Extra volume mounts for the container.
extraManifestsarray[]Extra Kubernetes manifests deployed alongside the chart.

Common Issues

Users cannot log in after upgrade

If users cannot log in after a Helm upgrade, the Django SECRET_KEY may have changed. Check that chiefonboarding.secretKey or chiefonboarding.existingSecret is set and matches the value used during the previous deployment.

Create the first admin user

ChiefOnboarding does not ship with a default admin account. After the first deployment, access the instance and complete the initial setup wizard to create your admin credentials. The setup wizard is only shown when no admin account exists.

More Information