Cluster
Kubernetes 1.24+, kubectl context with admin rights, and working Ingress or LoadBalancer.
Cluster
Kubernetes 1.24+, kubectl context with admin rights, and working Ingress or LoadBalancer.
Tooling
Helm 3.x, access to a container registry for custom images, and openssl (or pwgen) for secrets.
LeafLock ships a Helm chart under helm/. All examples assume the repo root as working directory.
The backend refuses to boot without strong secrets. Generate them once per cluster:
kubectl create namespace leaflock
kubectl create secret generic leaflock-secrets \--namespace leaflock \--from-literal=postgres-password=$(openssl rand -base64 32) \--from-literal=redis-password=$(openssl rand -base64 32) \--from-literal=jwt-secret=$(openssl rand -base64 64) \--from-literal=encryption-key=$(openssl rand -base64 32) \--from-literal=admin-password=$(openssl rand -base64 32)Secrets map directly to config.LoadConfig() fields (JWT_SECRET, SERVER_ENCRYPTION_KEY, etc.). Weak values trigger startup failures—check backend logs if pods restart.
helm upgrade --install leaflock ./helm \--namespace leaflock \--set ingress.host=leaflock.example.com \--set backend.jwtSecretFromSecret=leaflock-secrets:jwt-secret \--set backend.encryptionKeyFromSecret=leaflock-secrets:encryption-key \--set database.passwordFromSecret=leaflock-secrets:postgres-password \--set redis.passwordFromSecret=leaflock-secrets:redis-passwordhelm upgrade --install leaflock ./helm \--namespace leaflock \--set database.enabled=false \--set redis.enabled=false \--set backend.databaseUrl="postgres://USER:PASSWORD@db.internal:5432/leaflock?sslmode=require" \--set backend.redisUrl="redis.internal:6379" \--set backend.redisPasswordFromSecret=leaflock-secrets:redis-passwordKey chart values:
backend.replicaCount: default 2; enable HPA via backend.autoscaling.enabled=true.frontend.corsOrigins: must match your HTTPS origin; defaults to https://leaflock.example.com.ingress.className: align with your ingress controller (e.g., nginx, alb).metrics.enabled: set to true to expose /metrics from the backend (requires Prometheus scrape config).Refer to helm/values.yaml for additional flags like share-link TTLs and default admin behaviour.
/api/v1/health/live; readiness → /api/v1/health/ready (checks PostgreSQL + Redis via server/ReadyState)./health served by Caddy.kubectl get pods -n leaflockkubectl port-forward svc/backend 8080:8080 -n leaflockcurl http://localhost:8080/api/v1/health/readyapiVersion: networking.k8s.io/v1kind: Ingressmetadata:name: leaflocknamespace: leaflockannotations: cert-manager.io/cluster-issuer: letsencryptspec:ingressClassName: nginxrules: - host: leaflock.example.com http: paths: - path: / pathType: Prefix backend: service: name: frontend port: number: 80tls: - hosts: - leaflock.example.com secretName: leaflock-tlshelm upgrade leaflock ./helm --set image.tag=v1.6.0 triggers a zero-downtime rolling deployment.backend.autoscaling.targetCPUUtilizationPercentage to match workload.backend.resources.requests.cpu to avoid throttling collaboration broadcasts.kubectl rollout status deploy/backend -n leaflockkubectl autoscale deploy backend --cpu-percent=60 --min=2 --max=10 -n leaflock--set metrics.enabled=true and configure your Prometheus scrape.kubectl logs deploy/backend -n leaflock --tail=200 -f for Go request logs with X-Request-ID.kubectl exec deploy/postgres -n leaflock -- pg_isready -U postgres.Hooking the backend into Grafana Loki? Use the existing structured JSON logs emitted by utils.InfoLogger.
leaflock-secrets./ws upgrades routed to the backend service.backend.readinessProbe.initialDelaySeconds.