Skip to main content

Helm Chart Reference

This guide provides a detailed reference for all configuration options available in the Gyre Helm chart.

Global Parameters

ParameterDescriptionDefault
nameOverrideOverride chart name""
fullnameOverrideOverride fully qualified app name""
replicaCountNumber of replicas (SQLite requires 1)1

Image Configuration

ParameterDescriptionDefault
image.repositoryContainer image repositoryghcr.io/entropy0120/gyre
image.tagContainer image tag (overrides appVersion)""
image.pullPolicyImage pull policyIfNotPresent
imagePullSecretsImage pull secrets[]

Service Account

ParameterDescriptionDefault
serviceAccount.createCreate service accounttrue
serviceAccount.automountAutomount SA tokentrue
serviceAccount.annotationsSA annotations{}
serviceAccount.nameSA name (generated if empty)""

Service Configuration

ParameterDescriptionDefault
service.typeKubernetes service typeClusterIP
service.portService port80
service.targetPortContainer target port3000

Ingress Configuration

ParameterDescriptionDefault
ingress.enabledEnable ingressfalse
ingress.classNameIngress class name""
ingress.annotationsIngress annotations{}
ingress.hostsIngress hosts configurationSee values.yaml
ingress.tlsIngress TLS configuration[]

Persistence

ParameterDescriptionDefault
persistence.enabledEnable persistent storagetrue
persistence.accessModePVC access modeReadWriteOnce
persistence.sizePVC size1Gi
persistence.storageClassStorage class name (blank = default)""
persistence.annotationsPVC annotations{}
persistence.existingClaimUse existing PVC""

Security Context

ParameterDescriptionDefault
podSecurityContext.runAsNonRootRun as non-roottrue
podSecurityContext.runAsUserUser ID1001
podSecurityContext.fsGroupFilesystem group1001
securityContext.allowPrivilegeEscalationAllow privilege escalationfalse
securityContext.capabilities.dropDrop capabilities["ALL"]
securityContext.readOnlyRootFilesystemRead-only root FStrue

Resource Limits

ParameterDescriptionDefault
resources.limits.cpuCPU limit500m
resources.limits.memoryMemory limit512Mi
resources.requests.cpuCPU request100m
resources.requests.memoryMemory request128Mi

Health Checks

ParameterDescriptionDefault
livenessProbe.initialDelaySecondsInitial delay30
livenessProbe.periodSecondsCheck period30
readinessProbe.initialDelaySecondsInitial delay10
readinessProbe.periodSecondsCheck period10

RBAC

ParameterDescriptionDefault
rbac.createCreate RBAC resourcestrue
rbac.clusterRole.createCreate ClusterRoletrue
rbac.clusterRole.rulesAdditional RBAC rules[]

Admin Configuration

ParameterDescriptionDefault
admin.autoGenerateAuto-generate admin passwordtrue
admin.secretNameAdmin password secret namegyre-initial-admin-secret

Metrics & Monitoring

ParameterDescriptionDefault
metrics.enabledEnable application metricstrue
metrics.serviceMonitor.enabledCreate a Prometheus ServiceMonitorfalse
metrics.serviceMonitor.intervalScraping interval30s
metrics.serviceMonitor.pathMetrics path/metrics
metrics.serviceMonitor.additionalLabelsAdditional labels for ServiceMonitor{}

Network Policy

ParameterDescriptionDefault
networkPolicy.enabledEnable NetworkPolicyfalse
networkPolicy.ingress.podSelectorPod selector for ingress rules{}
networkPolicy.ingress.namespaceSelectorNamespace selector for ingress rules{}
networkPolicy.ingress.additionalRulesAdditional ingress rules[]
networkPolicy.egress.additionalRulesAdditional egress rules[]

Application Configuration

ParameterDescriptionDefault
config.createCreate ConfigMap for app configurationtrue
config.logLevelApplication log level (debug/info/warn/error)info
config.sessionTimeoutSession timeout in milliseconds604800000
config.wsPingIntervalWebSocket ping interval in milliseconds30000
config.cacheTtlCache TTL for dashboard data in seconds30
config.additionalConfigAdditional configuration key-value pairs{}

Encryption Configuration

ParameterDescriptionDefault
encryption.gyreKeyKey for encrypting cluster kubeconfigs""
encryption.authKeyKey for encrypting OAuth client secrets""
encryption.existingSecretExisting secret with encryption keys""

Upgrade Procedure

To upgrade Gyre:

# Update Helm repository
helm repo update

# Upgrade release
helm upgrade gyre oci://ghcr.io/entropy0120/charts/gyre \
--namespace flux-system

Upgrade with Backup

# 1. Backup database
POD=$(kubectl get pod -n flux-system -l app.kubernetes.io/name=gyre -o jsonpath='{.items[0].metadata.name}')
kubectl cp flux-system/$POD:/data/gyre.db ./gyre-backup-$(date +%Y%m%d).db

# 2. Perform upgrade
helm upgrade gyre oci://ghcr.io/entropy0120/charts/gyre --namespace flux-system

# 3. Verify
kubectl rollout status deployment/gyre -n flux-system

Rollback

# View history
helm history gyre -n flux-system

# Rollback to previous version
helm rollback gyre -n flux-system

# Rollback to specific revision
helm rollback gyre 2 -n flux-system

Troubleshooting

Common Helm installation issues:

Pod Not Starting

Symptoms: Pod stuck in Pending, CrashLoopBackOff, or ImagePullBackOff

# Check pod status
kubectl get pods -n flux-system -l app.kubernetes.io/name=gyre

# Describe pod for events
kubectl describe pod -n flux-system -l app.kubernetes.io/name=gyre

# Check logs
kubectl logs -n flux-system -l app.kubernetes.io/name=gyre --tail=100

Common Issues:

  • PVC not bound: Check StorageClass and PV availability.
  • Image pull errors: Verify image.repository and imagePullSecrets.
  • Insufficient resources: Check node capacity.

Database Issues

Check PVC status:

kubectl get pvc -n flux-system
kubectl describe pvc gyre-data -n flux-system

RBAC Permission Errors

Test ServiceAccount permissions:

# Check if SA can list FluxCD resources
kubectl auth can-i get gitrepositories.source.toolkit.fluxcd.io
--as=system:serviceaccount:flux-system:gyre
--all-namespaces

Backup and Restore

Automated Backup Script

#!/bin/bash
# backup-gyre.sh

NAMESPACE="flux-system"
BACKUP_DIR="./backups"
DATE=$(date +%Y%m%d-%H%M%S)

mkdir -p $BACKUP_DIR

POD=$(kubectl get pod -n $NAMESPACE -l app.kubernetes.io/name=gyre -o jsonpath='{.items[0].metadata.name}')

if [ -z "$POD" ]; then
echo "Error: No Gyre pod found"
exit 1
fi

echo "Backing up database from pod: $POD"
kubectl cp $NAMESPACE/$POD:/data/gyre.db $BACKUP_DIR/gyre-$DATE.db

echo "Backup completed: $BACKUP_DIR/gyre-$DATE.db"

# Keep only last 10 backups
ls -t $BACKUP_DIR/gyre-*.db | tail -n +11 | xargs -r rm

Restore from Backup

#!/bin/bash
# restore-gyre.sh

NAMESPACE="flux-system"
BACKUP_FILE=$1
PVC_NAME="gyre-data" # Adjust if your PVC name is different

if [ -z "$BACKUP_FILE" ]; then
echo "Usage: $0 <backup-file>"
exit 1
fi

if [ ! -f "$BACKUP_FILE" ]; then
echo "Error: Backup file $BACKUP_FILE not found"
exit 1
fi

# Scale down
echo "Scaling down Gyre deployment..."
kubectl scale deployment gyre -n $NAMESPACE --replicas=0
kubectl wait --for=delete pod -l app.kubernetes.io/name=gyre -n $NAMESPACE --timeout=60s

# Create helper pod to mount the PVC
echo "Creating restore helper pod..."
cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: Pod
metadata:
name: gyre-restore-helper
namespace: $NAMESPACE
spec:
containers:
- name: helper
image: alpine
command: ["sleep", "3600"]
volumeMounts:
- name: data
mountPath: /data
volumes:
- name: data
persistentVolumeClaim:
claimName: $PVC_NAME
EOF

kubectl wait --for=condition=ready pod gyre-restore-helper -n $NAMESPACE --timeout=60s

# Restore database
echo "Copying database file..."
kubectl cp $BACKUP_FILE $NAMESPACE/gyre-restore-helper:/data/gyre.db

# Cleanup helper
echo "Removing helper pod..."
kubectl delete pod gyre-restore-helper -n $NAMESPACE

# Scale up
echo "Scaling up Gyre deployment..."
kubectl scale deployment gyre -n $NAMESPACE --replicas=1
kubectl wait --for=condition=ready pod -l app.kubernetes.io/name=gyre -n $NAMESPACE --timeout=120s

echo "Database restored successfully from: $BACKUP_FILE"