This Helm chart deploys Canine - a modern, open source alternative to Heroku. Canine provides an intuitive web interface for managing application deployments on Kubernetes clusters.
New to self-hosting Canine? Follow the step-by-step cluster mode tutorial to get up and running.
helm repo add canine https://caninehq.github.io/canine
helm repo update
This installs Canine with Traefik ingress, cert-manager for automatic TLS, and a custom domain.
helm install canine canine/canine \
--namespace canine \
--create-namespace \
--set ingress.enabled=true \
--set ingress.hostname=canine.example.com \
--set canine.acmeEmail=you@example.com
After installation, get the external IP of the load balancer:
kubectl get svc -n canine -l "app.kubernetes.io/name=traefik" \
-o jsonpath="{.items[0].status.loadBalancer.ingress[0].ip}"
Some cloud providers assign a hostname instead of an IP:
kubectl get svc -n canine -l "app.kubernetes.io/name=traefik" \
-o jsonpath="{.items[0].status.loadBalancer.ingress[0].hostname}"
Then create a DNS record:
| Type | Name | Value |
|---|---|---|
| A | canine.example.com | <IP from above> |
Or if your provider gave a hostname:
| Type | Name | Value |
|---|---|---|
| CNAME | canine.example.com | <hostname from above> |
Once DNS propagates, cert-manager will automatically issue a Let’s Encrypt TLS certificate. Your site will be live at https://canine.example.com.
If your cluster already has these installed, disable them to avoid conflicts:
helm install canine canine/canine \
--namespace canine \
--create-namespace \
--set ingress.enabled=true \
--set ingress.hostname=canine.example.com \
--set ingress.className=your-existing-ingress-class \
--set canine.acmeEmail=you@example.com \
--set cert-manager.enabled=false \
--set traefik.enabled=false
This is the simplest setup — no ingress, no TLS, just access via port-forward.
helm install canine canine/canine \
--namespace canine \
--create-namespace \
--set ingress.enabled=false \
--set cert-manager.enabled=false \
--set traefik.enabled=false
Access Canine via port-forward:
kubectl port-forward -n canine svc/canine 3000:3000
Then open http://localhost:3000.
| Parameter | Description | Default |
|---|---|---|
replicaCount |
Number of web replicas | 1 |
image.repository |
Image repository | ghcr.io/caninehq/canine |
image.tag |
Image tag | latest |
canine.port |
Application port | 3000 |
canine.bootMode |
Boot mode | cluster |
canine.secretKeyBase |
Rails secret key base | <default> |
canine.allowedHostname |
Allowed hostnames for Rails | * |
canine.acmeEmail |
Email for Let’s Encrypt | admin@example.com |
| Parameter | Description | Default |
|---|---|---|
ingress.enabled |
Enable ingress | false |
ingress.className |
Ingress class name | traefik |
ingress.hosts[0].host |
Hostname | canine.example.com |
ingress.tls[0].secretName |
TLS secret name | canine-tls |
| Parameter | Description | Default |
|---|---|---|
worker.enabled |
Enable background worker | true |
worker.replicaCount |
Number of worker replicas | 1 |
worker.maxThreads |
Maximum worker threads | 5 |
| Parameter | Description | Default |
|---|---|---|
postgresql.enabled |
Enable PostgreSQL | true |
postgresql.auth.username |
Username | postgres |
postgresql.auth.password |
Password | password |
postgresql.auth.database |
Database name | canine_production |
postgresql.primary.persistence.size |
PVC size | 8Gi |
| Parameter | Description | Default |
|---|---|---|
cert-manager.enabled |
Enable cert-manager | true |
cert-manager.crds.enabled |
Install CRDs | true |
| Parameter | Description | Default |
|---|---|---|
traefik.enabled |
Enable Traefik | true |
traefik.ingressClass.name |
IngressClass name | traefik |
helm uninstall canine --namespace canine
kubectl get pods -n canine
kubectl describe pod -n canine -l app.kubernetes.io/name=canine
The web pod will crash-loop until PostgreSQL is ready. This is normal on first install — it will recover automatically.
Check the certificate and challenge status:
kubectl get certificate -n canine
kubectl describe challenge -n canine
Common issues:
MIT License. See LICENSE.