summaryrefslogtreecommitdiff
path: root/charts
diff options
context:
space:
mode:
Diffstat (limited to 'charts')
-rw-r--r--charts/README.md466
-rw-r--r--charts/yacy/.helmignore30
-rw-r--r--charts/yacy/Chart.yaml24
-rw-r--r--charts/yacy/templates/NOTES.txt76
-rw-r--r--charts/yacy/templates/_helpers.tpl62
-rw-r--r--charts/yacy/templates/configmap.yaml11
-rw-r--r--charts/yacy/templates/deployment.yaml122
-rw-r--r--charts/yacy/templates/hpa.yaml32
-rw-r--r--charts/yacy/templates/ingress.yaml61
-rw-r--r--charts/yacy/templates/networkpolicy.yaml26
-rw-r--r--charts/yacy/templates/pdb.yaml13
-rw-r--r--charts/yacy/templates/pvc.yaml25
-rw-r--r--charts/yacy/templates/secret.yaml13
-rw-r--r--charts/yacy/templates/service.yaml19
-rw-r--r--charts/yacy/templates/serviceaccount.yaml12
-rw-r--r--charts/yacy/templates/servicemonitor.yaml26
-rw-r--r--charts/yacy/values.yaml176
17 files changed, 1194 insertions, 0 deletions
diff --git a/charts/README.md b/charts/README.md
new file mode 100644
index 000000000..d85e8b3a1
--- /dev/null
+++ b/charts/README.md
@@ -0,0 +1,466 @@
+# YaCy Helm Chart
+
+<p align="center">
+ <img src="https://yacy.net/images/yacy-logo.png" width="100" alt="YaCy Logo"/>
+</p>
+
+This Helm chart deploys [YaCy](https://yacy.net/) - a distributed peer-to-peer search engine - on Kubernetes.
+
+## Introduction
+
+YaCy is a free, distributed search engine that can operate in two primary modes:
+- **P2P Network Mode**: Connect to the global YaCy network to share search results
+- **Standalone/Intranet Mode**: Run as an independent instance for private document indexing
+
+This Helm chart simplifies deployment and management of YaCy in a Kubernetes environment, with support for various configurations and deployment scenarios.
+
+## Prerequisites
+
+- Kubernetes 1.12+
+- Helm 3.0+
+- PV provisioner support in the underlying infrastructure (for persistence)
+
+## Installation
+
+### Prerequisites Check
+
+Before installing, ensure your Kubernetes cluster meets the requirements:
+
+```bash
+# Check Kubernetes version (requires 1.12+)
+kubectl version --short
+
+# Verify Helm is installed (requires 3.0+)
+helm version
+
+# Check for default StorageClass (for persistence)
+kubectl get storageclass
+```
+
+### Install from Local Chart
+
+```bash
+# Navigate to the Helm chart directory
+cd charts/yacy
+
+# Install with default values
+helm install my-yacy .
+
+# OR install with custom values file
+helm install my-yacy . -f my-values.yaml
+
+# OR override specific values
+helm install my-yacy . \
+ --set service.type=NodePort \
+ --set yacy.adminPassword=mysecurepassword \
+ --set persistence.size=20Gi
+```
+
+### Install from Repository (Future)
+
+Once this chart is published to a Helm repository, you'll be able to install it with:
+
+```bash
+# Add the repository
+helm repo add yacy https://yacy.github.io/helm-charts/
+helm repo update
+
+# Install the chart
+helm install my-yacy yacy/yacy
+```
+
+### Verifying Installation
+
+```bash
+# Check if the pod is running
+kubectl get pods -l "app.kubernetes.io/instance=my-yacy"
+
+# See the deployed service
+kubectl get svc -l "app.kubernetes.io/instance=my-yacy"
+
+# Read installation notes
+helm status my-yacy
+```
+
+## Uninstalling the Chart
+
+To uninstall/delete the `my-yacy` deployment:
+
+```bash
+helm uninstall my-yacy
+```
+
+## Parameters
+
+### Common parameters
+
+| Name | Description | Value |
+|---------------------|----------------------------------------------------|--------|
+| `replicaCount` | Number of YaCy replicas | `1` |
+| `nameOverride` | String to partially override yacy.fullname template | `""` |
+| `fullnameOverride` | String to fully override yacy.fullname template | `""` |
+
+### YaCy Image parameters
+
+| Name | Description | Value |
+|-------------------------|------------------------------------------------|------------------------|
+| `image.useLocal` | Use locally built image instead of repository | `true` |
+| `image.localRepository` | Local image name when useLocal is true | `yacy_search_server` |
+| `image.localTag` | Local image tag when useLocal is true | `local` |
+| `image.repository` | YaCy image repository when useLocal is false | `yacy/yacy_search_server` |
+| `image.tag` | YaCy image tag when useLocal is false | `1.930` |
+| `image.pullPolicy` | YaCy image pull policy when useLocal is false | `IfNotPresent` |
+| `imagePullSecrets` | Specify docker-registry secret names | `[]` |
+
+### Architecture-specific images
+
+| Name | Description | Value |
+|---------------------|----------------------------------------------------|------------------------|
+| `arch.amd64` | Tag for AMD64 architecture | `latest` |
+| `arch.arm64` | Tag for ARM64 architecture | `aarch64-latest` |
+| `arch.arm` | Tag for ARM architecture | `armv7-latest` |
+
+### YaCy configuration parameters
+
+| Name | Description | Value |
+|---------------------------|----------------------------------------------|-----------|
+| `env` | YaCy environment variables | `{}` |
+| `yacy.adminPassword` | YaCy admin password | `"yacy"` |
+| `yacy.settings.maxMemory` | Maximum memory allocation for YaCy | `"600m"` |
+| `yacy.settings.joinP2PNetwork` | Whether to join the YaCy P2P network | `true` |
+
+### Persistence Parameters
+
+| Name | Description | Value |
+|----------------------------|-------------------------------------------------|---------------|
+| `persistence.enabled` | Enable persistence using PVC | `true` |
+| `persistence.existingClaim`| Use an existing PVC to persist data | `""` |
+| `persistence.storageClass` | Storage class of backing PVC | `""` |
+| `persistence.accessMode` | PVC Access Mode | `ReadWriteOnce` |
+| `persistence.size` | Size of data volume | `10Gi` |
+| `persistence.annotations` | Additional annotations for the PVC | `{}` |
+
+### Exposure Parameters
+
+| Name | Description | Value |
+|----------------------------|-------------------------------------------------|---------------|
+| `service.type` | Kubernetes Service type | `ClusterIP` |
+| `service.httpPort` | HTTP Service port | `8090` |
+| `service.httpsPort` | HTTPS Service port | `8443` |
+| `ingress.enabled` | Enable ingress controller resource | `false` |
+| `ingress.className` | IngressClass that will be used | `""` |
+| `ingress.hosts[0].host` | Default host for the ingress resource | `yacy.local` |
+| `ingress.hosts[0].paths` | Paths for the default host | `[{"path":"/","pathType":"Prefix"}]` |
+| `ingress.tls` | TLS configuration | `[]` |
+
+### Other Parameters
+
+| Name | Description | Value |
+|----------------------------|-------------------------------------------------|---------------|
+| `resources` | CPU/Memory resource requests/limits | `{}` |
+| `nodeSelector` | Node labels for pod assignment | `{}` |
+| `tolerations` | Tolerations for pod assignment | `[]` |
+| `affinity` | Affinity for pod assignment | `{}` |
+
+## Building and Publishing Images
+
+YaCy can be deployed using either a locally built Docker image or an official image from Docker Hub.
+
+### Option 1: Using Official Images from Docker Hub
+
+The simplest approach is to use the official YaCy images:
+
+```yaml
+# values.yaml
+image:
+ useLocal: false
+ repository: yacy/yacy_search_server
+ tag: latest # or specific version like "1.930"
+ pullPolicy: IfNotPresent
+```
+
+### Option 2: Building Custom Images
+
+For custom builds or development, you can build your own images:
+
+#### Setting up a Local Docker Registry
+
+1. **Start a local Docker registry**:
+
+ ```bash
+ docker run -d -p 5000:5000 --restart=always --name registry registry:2
+ ```
+
+2. **Build the YaCy Docker image**:
+
+ ```bash
+ # The Dockerfiles are in the ./docker/ directory of the YaCy project
+ cd docker
+
+ # Build for your platform (x86_64/amd64)
+ docker build -t localhost:5000/yacy/yacy_search_server:latest -f Dockerfile ../
+
+ # Push to local registry
+ docker push localhost:5000/yacy/yacy_search_server:latest
+ ```
+
+3. **For multi-architecture support** (optional):
+
+ ```bash
+ # ARM64 architecture
+ docker build -t localhost:5000/yacy/yacy_search_server:aarch64-latest -f Dockerfile.aarch64 ../
+ docker push localhost:5000/yacy/yacy_search_server:aarch64-latest
+
+ # ARMv7 architecture
+ docker build -t localhost:5000/yacy/yacy_search_server:armv7-latest -f Dockerfile.armv7 ../
+ docker push localhost:5000/yacy/yacy_search_server:armv7-latest
+ ```
+
+4. **Create a custom values file** (e.g., `local-registry-values.yaml`):
+
+ ```yaml
+ image:
+ useLocal: false
+ repository: localhost:5000/yacy/yacy_search_server
+ tag: latest
+ pullPolicy: Always
+ ```
+
+5. **Install with your custom values**:
+
+ ```bash
+ helm install my-yacy ./charts/yacy -f local-registry-values.yaml
+ ```
+
+6. **For external Kubernetes clusters**, add registry credentials:
+
+ ```bash
+ # Create a Docker registry secret
+ kubectl create secret docker-registry regcred \
+ --docker-server=localhost:5000 \
+ --docker-username=<your-username> \
+ --docker-password=<your-password>
+
+ # Add to your values file
+ imagePullSecrets:
+ - name: regcred
+ ```
+
+## Deployment Examples
+
+### Quick Start: Using a locally built image
+
+```bash
+# 1. Build the local image (from YaCy source directory)
+cd docker
+docker build -t yacy_search_server:local -f Dockerfile ../
+
+# 2. Install the chart
+helm install my-yacy ./charts/yacy
+```
+
+### Common Configuration Examples
+
+#### Deployment Scenarios
+
+##### 1. Public YaCy Node (P2P Network)
+
+```yaml
+# values.yaml
+yacy:
+ settings:
+ joinP2PNetwork: true
+ maxMemory: "1500m"
+ adminPassword: "secure-password-here"
+
+persistence:
+ enabled: true
+ size: 20Gi
+```
+
+##### 2. Private Intranet Search Engine
+
+```yaml
+# values.yaml
+yacy:
+ settings:
+ joinP2PNetwork: false # Standalone mode
+ maxMemory: "2000m"
+ adminPassword: "secure-password-here"
+
+ # Optional: Add intranet crawler configuration
+ configFile: |
+ network.unit.agent=CompanySearchEngine
+ network.unit.description=Internal Document Search
+ crawler.http.maxDepth=5
+
+persistence:
+ enabled: true
+ size: 50Gi
+```
+
+#### Exposure Options
+
+##### 1. Basic ClusterIP (default)
+
+```yaml
+service:
+ type: ClusterIP
+```
+
+##### 2. NodePort for simple external access
+
+```yaml
+service:
+ type: NodePort
+```
+
+##### 3. Ingress with TLS
+
+```yaml
+ingress:
+ enabled: true
+ className: nginx
+ annotations:
+ cert-manager.io/cluster-issuer: letsencrypt-prod
+ hosts:
+ - host: search.example.com
+ paths:
+ - path: /
+ pathType: Prefix
+ tls:
+ - secretName: yacy-tls
+ hosts:
+ - search.example.com
+```
+
+#### Resource Allocation
+
+```yaml
+# Recommended for production use
+resources:
+ limits:
+ cpu: 2000m
+ memory: 2Gi
+ requests:
+ cpu: 1000m
+ memory: 1Gi
+
+# Set YaCy memory to ~75% of container limit
+yacy:
+ settings:
+ maxMemory: "1500m"
+```
+
+#### Architecture-Specific Deployments
+
+##### ARM64/aarch64 Deployment
+
+```yaml
+image:
+ useLocal: false
+ repository: yacy/yacy_search_server
+ tag: aarch64-latest
+```
+
+##### ARMv7 Deployment
+
+```yaml
+image:
+ useLocal: false
+ repository: yacy/yacy_search_server
+ tag: armv7-latest
+```
+
+## Management
+
+### Backup and Restore
+
+YaCy's data is stored in `/opt/yacy_search_server/DATA` and persisted to a PVC when `persistence.enabled=true`.
+
+#### Backup YaCy Data
+
+```bash
+# 1. Find the pod name
+POD_NAME=$(kubectl get pods -l "app.kubernetes.io/instance=my-yacy" -o jsonpath="{.items[0].metadata.name}")
+
+# 2. Create a backup (two methods)
+# Option A: Direct backup to local machine
+kubectl exec $POD_NAME -- tar -cf - /opt/yacy_search_server/DATA | gzip > yacy-backup-$(date +%Y%m%d).tar.gz
+
+# Option B: Backup within pod first (if pod has sufficient storage)
+kubectl exec $POD_NAME -- bash -c "cd /opt && tar -czf /tmp/yacy-backup.tar.gz yacy_search_server/DATA"
+kubectl cp $POD_NAME:/tmp/yacy-backup.tar.gz ./yacy-backup-$(date +%Y%m%d).tar.gz
+```
+
+#### Restore YaCy Data
+
+```bash
+# First, stop YaCy gracefully (important for index integrity)
+POD_NAME=$(kubectl get pods -l "app.kubernetes.io/instance=my-yacy" -o jsonpath="{.items[0].metadata.name}")
+kubectl exec $POD_NAME -- /opt/yacy_search_server/stopYACY.sh
+
+# Wait for YaCy to fully shut down
+sleep 15
+
+# Restore from backup
+cat yacy-backup.tar.gz | kubectl exec -i $POD_NAME -- bash -c "cd /opt && rm -rf yacy_search_server/DATA/* && tar -xzf -"
+
+# Restart the pod
+kubectl delete pod $POD_NAME
+```
+
+### Troubleshooting
+
+#### Verify Deployment Status
+
+```bash
+# Check if pods are running
+kubectl get pods -l "app.kubernetes.io/instance=my-yacy"
+
+# Verify services
+kubectl get svc -l "app.kubernetes.io/instance=my-yacy"
+
+# Check persistent volume claims
+kubectl get pvc -l "app.kubernetes.io/instance=my-yacy"
+```
+
+#### Check Logs
+
+```bash
+# Follow logs from the YaCy pod
+POD_NAME=$(kubectl get pods -l "app.kubernetes.io/instance=my-yacy" -o jsonpath="{.items[0].metadata.name}")
+kubectl logs -f $POD_NAME
+
+# View YaCy application logs directly
+kubectl exec $POD_NAME -- cat /opt/yacy_search_server/DATA/LOG/yacy00.log
+```
+
+#### Common Issues
+
+1. **YaCy pod crashes immediately**: Check memory settings - container's memory limit should be higher than `yacy.settings.maxMemory`
+
+2. **Can't access YaCy UI**: Verify the service is correctly exposed; try port-forwarding for quick access:
+ ```bash
+ kubectl port-forward svc/my-yacy 8090:8090
+ ```
+
+3. **Slow crawling/indexing**: Increase resource limits and YaCy's memory allocation
+
+4. **Persistence issues**: Check that the PVC is correctly bound and has sufficient space:
+ ```bash
+ kubectl get pvc
+ kubectl describe pvc my-yacy-data
+ ```
+
+## Contributing
+
+Contributions to improve this chart are welcome! To contribute:
+
+1. Fork the repository
+2. Create your feature branch (`git checkout -b feature/amazing-feature`)
+3. Commit your changes (`git commit -m 'Add some amazing feature'`)
+4. Push to the branch (`git push origin feature/amazing-feature`)
+5. Open a Pull Request
+
+Please refer to the YaCy project's [contribution guidelines](https://github.com/yacy/yacy_search_server/blob/master/CONTRIBUTING.md) for more information.
diff --git a/charts/yacy/.helmignore b/charts/yacy/.helmignore
new file mode 100644
index 000000000..d122e936b
--- /dev/null
+++ b/charts/yacy/.helmignore
@@ -0,0 +1,30 @@
+# Patterns to ignore when building packages.
+# This supports shell glob matching, relative path matching, and
+# negation (prefixed with !). Only one pattern per line.
+.DS_Store
+# Common VCS dirs
+.git/
+.gitignore
+.bzr/
+.bzrignore
+.hg/
+.hgignore
+.svn/
+# Common backup files
+*.swp
+*.bak
+*.tmp
+*.orig
+*~
+# Various IDEs
+.project
+.idea/
+*.tmproj
+.vscode/
+# Development/testing files
+*.tgz
+*.lock
+# CI/CD files
+.circleci/
+.github/
+.travis.yml \ No newline at end of file
diff --git a/charts/yacy/Chart.yaml b/charts/yacy/Chart.yaml
new file mode 100644
index 000000000..0b970a1a7
--- /dev/null
+++ b/charts/yacy/Chart.yaml
@@ -0,0 +1,24 @@
+apiVersion: v2
+name: yacy
+description: A Helm chart for YaCy - a distributed peer-to-peer search engine
+type: application
+version: 0.1.0
+appVersion: "1.930"
+icon: https://yacy.net/images/yacy-logo.png
+home: https://yacy.net/
+sources:
+ - https://github.com/yacy/yacy_search_server
+ - https://hub.docker.com/r/yacy/yacy_search_server
+keywords:
+ - search
+ - search-engine
+ - distributed
+ - p2p
+ - web-crawler
+ - intranet-search
+ - indexing
+maintainers:
+ - name: YaCy Community
+ url: https://community.searchlab.eu
+annotations:
+ artifacthub.io/license: GPL-2.0-or-later \ No newline at end of file
diff --git a/charts/yacy/templates/NOTES.txt b/charts/yacy/templates/NOTES.txt
new file mode 100644
index 000000000..fd95987c4
--- /dev/null
+++ b/charts/yacy/templates/NOTES.txt
@@ -0,0 +1,76 @@
+╔════════════════════════════════════════════════════════════════╗
+║ YaCy Search Server Deployed! ║
+╚════════════════════════════════════════════════════════════════╝
+
+Thank you for installing {{ .Chart.Name }} v{{ .Chart.Version }}.
+
+YaCy is a decentralized search engine that can be used for both public P2P search
+and private intranet search scenarios.
+
+GETTING STARTED
+==============================================================================
+
+1. Access YaCy Interface:
+{{- if .Values.ingress.enabled }}
+{{- range $host := .Values.ingress.hosts }}
+ {{- range .paths }}
+ http{{ if $.Values.ingress.tls }}s{{ end }}://{{ $host.host }}{{ .path }}
+ {{- end }}
+{{- end }}
+{{- else if contains "NodePort" .Values.service.type }}
+ kubectl get --namespace {{ .Release.Namespace }} -o jsonpath="{.spec.ports[0].nodePort}" services {{ include "yacy.fullname" . }}
+
+ # Then access:
+ http://<any-node-ip>:$NODE_PORT
+{{- else if contains "LoadBalancer" .Values.service.type }}
+ # It may take a few minutes for the LoadBalancer IP to be available
+ kubectl get --namespace {{ .Release.Namespace }} svc {{ include "yacy.fullname" . }}
+
+ # Then access:
+ http://<EXTERNAL-IP>:{{ .Values.service.httpPort }}
+{{- else if contains "ClusterIP" .Values.service.type }}
+ # Port forward to access YaCy (for development/testing):
+ kubectl port-forward --namespace {{ .Release.Namespace }} svc/{{ include "yacy.fullname" . }} 8090:{{ .Values.service.httpPort }}
+
+ # Then access:
+ http://127.0.0.1:8090
+{{- end }}
+
+2. Login using these credentials:
+ • Username: admin
+ • Password: {{ .Values.yacy.adminPassword | default "yacy" }}
+ IMPORTANT: Change the default password via ConfigAccounts_p.html
+
+3. Check deployment status:
+ kubectl get pods -n {{ .Release.Namespace }} -l "app.kubernetes.io/instance={{ .Release.Name }}"
+
+DATA PERSISTENCE
+==============================================================================
+{{- if .Values.persistence.enabled }}
+• YaCy data is stored in a persistent volume:
+ - PVC: {{ if .Values.persistence.existingClaim }}{{ .Values.persistence.existingClaim }}{{- else }}{{ include "yacy.fullname" . }}-data{{- end }}
+ - Size: {{ .Values.persistence.size }}
+ - Mode: {{ .Values.persistence.accessMode }}
+{{- else }}
+• WARNING: Persistence is disabled! Data will be lost when pods are terminated.
+ To enable persistence, set persistence.enabled=true
+{{- end }}
+
+IMPORTANT NOTES
+==============================================================================
+{{- if eq (.Values.replicaCount | int) 1 }}
+• YaCy is running with a single replica.
+ For production environments, consider enabling:
+ - Multiple replicas with proper shared storage
+ - Ingress with TLS
+ - Resource limits appropriate for your workload
+{{- else }}
+• YaCy is running with {{ .Values.replicaCount }} replicas.
+{{- end }}
+
+RESOURCES
+==============================================================================
+• Documentation: https://yacy.net/
+• Community: https://community.searchlab.eu/
+• Support: https://github.com/yacy/yacy_search_server/issues
+• Helm Chart README: See charts/README.md \ No newline at end of file
diff --git a/charts/yacy/templates/_helpers.tpl b/charts/yacy/templates/_helpers.tpl
new file mode 100644
index 000000000..4ee63adff
--- /dev/null
+++ b/charts/yacy/templates/_helpers.tpl
@@ -0,0 +1,62 @@
+{{/*
+Expand the name of the chart.
+*/}}
+{{- define "yacy.name" -}}
+{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" }}
+{{- end }}
+
+{{/*
+Create a default fully qualified app name.
+We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec).
+If release name contains chart name it will be used as a full name.
+*/}}
+{{- define "yacy.fullname" -}}
+{{- if .Values.fullnameOverride }}
+{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" }}
+{{- else }}
+{{- $name := default .Chart.Name .Values.nameOverride }}
+{{- if contains $name .Release.Name }}
+{{- .Release.Name | trunc 63 | trimSuffix "-" }}
+{{- else }}
+{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" }}
+{{- end }}
+{{- end }}
+{{- end }}
+
+{{/*
+Create chart name and version as used by the chart label.
+*/}}
+{{- define "yacy.chart" -}}
+{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" }}
+{{- end }}
+
+{{/*
+Common labels
+*/}}
+{{- define "yacy.labels" -}}
+helm.sh/chart: {{ include "yacy.chart" . }}
+{{ include "yacy.selectorLabels" . }}
+{{- if .Chart.AppVersion }}
+app.kubernetes.io/version: {{ .Chart.AppVersion | quote }}
+{{- end }}
+app.kubernetes.io/managed-by: {{ .Release.Service }}
+{{- end }}
+
+{{/*
+Selector labels
+*/}}
+{{- define "yacy.selectorLabels" -}}
+app.kubernetes.io/name: {{ include "yacy.name" . }}
+app.kubernetes.io/instance: {{ .Release.Name }}
+{{- end }}
+
+{{/*
+Create the name of the service account to use
+*/}}
+{{- define "yacy.serviceAccountName" -}}
+{{- if .Values.serviceAccount.create }}
+{{- default (include "yacy.fullname" .) .Values.serviceAccount.name }}
+{{- else }}
+{{- default "default" .Values.serviceAccount.name }}
+{{- end }}
+{{- end }} \ No newline at end of file
diff --git a/charts/yacy/templates/configmap.yaml b/charts/yacy/templates/configmap.yaml
new file mode 100644
index 000000000..befd4f9bd
--- /dev/null
+++ b/charts/yacy/templates/configmap.yaml
@@ -0,0 +1,11 @@
+{{- if .Values.yacy.configFile }}
+apiVersion: v1
+kind: ConfigMap
+metadata:
+ name: {{ include "yacy.fullname" . }}-config
+ labels:
+ {{- include "yacy.labels" . | nindent 4 }}
+data:
+ yacy.conf: |-
+ {{- .Values.yacy.configFile | nindent 4 }}
+{{- end }} \ No newline at end of file
diff --git a/charts/yacy/templates/deployment.yaml b/charts/yacy/templates/deployment.yaml
new file mode 100644
index 000000000..6d3174566
--- /dev/null
+++ b/charts/yacy/templates/deployment.yaml
@@ -0,0 +1,122 @@
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+ name: {{ include "yacy.fullname" . }}
+ labels:
+ {{- include "yacy.labels" . | nindent 4 }}
+spec:
+ replicas: {{ .Values.replicaCount }}
+ selector:
+ matchLabels:
+ {{- include "yacy.selectorLabels" . | nindent 6 }}
+ template:
+ metadata:
+ {{- with .Values.podAnnotations }}
+ annotations:
+ {{- toYaml . | nindent 8 }}
+ {{- end }}
+ labels:
+ {{- include "yacy.selectorLabels" . | nindent 8 }}
+ spec:
+ {{- with .Values.imagePullSecrets }}
+ imagePullSecrets:
+ {{- toYaml . | nindent 8 }}
+ {{- end }}
+ serviceAccountName: {{ include "yacy.serviceAccountName" . }}
+ securityContext:
+ {{- toYaml .Values.podSecurityContext | nindent 8 }}
+ containers:
+ - name: {{ .Chart.Name }}
+ securityContext:
+ {{- toYaml .Values.securityContext | nindent 12 }}
+ {{- if .Values.image.useLocal }}
+ image: "{{ .Values.image.localRepository }}:{{ .Values.image.localTag }}"
+ imagePullPolicy: Never
+ {{- else }}
+ image: "{{ .Values.image.repository }}:{{ .Values.image.tag | default .Chart.AppVersion }}"
+ imagePullPolicy: {{ .Values.image.pullPolicy }}
+ {{- end }}
+ env:
+ - name: YACY_ADMINACCOUNT_PASSWORD
+ valueFrom:
+ secretKeyRef:
+ name: {{ include "yacy.fullname" . }}
+ key: admin-password
+ {{- range $key, $value := .Values.env }}
+ - name: {{ $key }}
+ value: {{ $value | quote }}
+ {{- end }}
+ {{- if .Values.yacy.settings.maxMemory }}
+ - name: YACY_JAVASTART_XMXMINIT
+ value: {{ .Values.yacy.settings.maxMemory | quote }}
+ {{- end }}
+ {{- if (not .Values.yacy.settings.joinP2PNetwork) }}
+ - name: YACY_NETWORK_UNIT_INTRANET
+ value: "true"
+ {{- end }}
+ ports:
+ - name: http
+ containerPort: 8090
+ protocol: TCP
+ - name: https
+ containerPort: 8443
+ protocol: TCP
+ startupProbe:
+ httpGet:
+ path: /
+ port: http
+ initialDelaySeconds: 30
+ periodSeconds: 10
+ timeoutSeconds: 5
+ failureThreshold: 12
+ livenessProbe:
+ httpGet:
+ path: /api/status_p.xml
+ port: http
+ initialDelaySeconds: 90
+ periodSeconds: 20
+ timeoutSeconds: 10
+ failureThreshold: 6
+ readinessProbe:
+ httpGet:
+ path: /
+ port: http
+ initialDelaySeconds: 30
+ periodSeconds: 10
+ timeoutSeconds: 5
+ failureThreshold: 6
+ resources:
+ {{- toYaml .Values.resources | nindent 12 }}
+ volumeMounts:
+ - name: data
+ mountPath: /opt/yacy_search_server/DATA
+ {{- if .Values.yacy.configFile }}
+ - name: config
+ mountPath: /opt/yacy_search_server/defaults/yacy.conf
+ subPath: yacy.conf
+ {{- end }}
+ volumes:
+ - name: data
+ {{- if .Values.persistence.enabled }}
+ persistentVolumeClaim:
+ claimName: {{ if .Values.persistence.existingClaim }}{{ .Values.persistence.existingClaim }}{{- else }}{{ include "yacy.fullname" . }}-data{{- end }}
+ {{- else }}
+ emptyDir: {}
+ {{- end }}
+ {{- if .Values.yacy.configFile }}
+ - name: config
+ configMap:
+ name: {{ include "yacy.fullname" . }}-config
+ {{- end }}
+ {{- with .Values.nodeSelector }}
+ nodeSelector:
+ {{- toYaml . | nindent 8 }}
+ {{- end }}
+ {{- with .Values.affinity }}
+ affinity:
+ {{- toYaml . | nindent 8 }}
+ {{- end }}
+ {{- with .Values.tolerations }}
+ tolerations:
+ {{- toYaml . | nindent 8 }}
+ {{- end }} \ No newline at end of file
diff --git a/charts/yacy/templates/hpa.yaml b/charts/yacy/templates/hpa.yaml
new file mode 100644
index 000000000..ff8538b19
--- /dev/null
+++ b/charts/yacy/templates/hpa.yaml
@@ -0,0 +1,32 @@
+{{- if .Values.autoscaling.enabled }}
+apiVersion: autoscaling/v2
+kind: HorizontalPodAutoscaler
+metadata:
+ name: {{ include "yacy.fullname" . }}
+ labels:
+ {{- include "yacy.labels" . | nindent 4 }}
+spec:
+ scaleTargetRef:
+ apiVersion: apps/v1
+ kind: Deployment
+ name: {{ include "yacy.fullname" . }}
+ minReplicas: {{ .Values.autoscaling.minReplicas }}
+ maxReplicas: {{ .Values.autoscaling.maxReplicas }}
+ metrics:
+ {{- if .Values.autoscaling.targetCPUUtilizationPercentage }}
+ - type: Resource
+ resource:
+ name: cpu
+ target:
+ type: Utilization
+ averageUtilization: {{ .Values.autoscaling.targetCPUUtilizationPercentage }}
+ {{- end }}
+ {{- if .Values.autoscaling.targetMemoryUtilizationPercentage }}
+ - type: Resource
+ resource:
+ name: memory
+ target:
+ type: Utilization
+ averageUtilization: {{ .Values.autoscaling.targetMemoryUtilizationPercentage }}
+ {{- end }}
+{{- end }} \ No newline at end of file
diff --git a/charts/yacy/templates/ingress.yaml b/charts/yacy/templates/ingress.yaml
new file mode 100644
index 000000000..840df8790
--- /dev/null
+++ b/charts/yacy/templates/ingress.yaml
@@ -0,0 +1,61 @@
+{{- if .Values.ingress.enabled -}}
+{{- $fullName := include "yacy.fullname" . -}}
+{{- $svcPort := .Values.service.httpPort -}}
+{{- if and .Values.ingress.className (not (semverCompare ">=1.18-0" .Capabilities.KubeVersion.GitVersion)) }}
+ {{- if not (hasKey .Values.ingress.annotations "kubernetes.io/ingress.class") }}
+ {{- $_ := set .Values.ingress.annotations "kubernetes.io/ingress.class" .Values.ingress.className}}
+ {{- end }}
+{{- end }}
+{{- if semverCompare ">=1.19-0" .Capabilities.KubeVersion.GitVersion -}}
+apiVersion: networking.k8s.io/v1
+{{- else if semverCompare ">=1.14-0" .Capabilities.KubeVersion.GitVersion -}}
+apiVersion: networking.k8s.io/v1beta1
+{{- else -}}
+apiVersion: extensions/v1beta1
+{{- end }}
+kind: Ingress
+metadata:
+ name: {{ $fullName }}
+ labels:
+ {{- include "yacy.labels" . | nindent 4 }}
+ {{- with .Values.ingress.annotations }}
+ annotations:
+ {{- toYaml . | nindent 4 }}
+ {{- end }}
+spec:
+ {{- if and .Values.ingress.className (semverCompare ">=1.18-0" .Capabilities.KubeVersion.GitVersion) }}
+ ingressClassName: {{ .Values.ingress.className }}
+ {{- end }}
+ {{- if .Values.ingress.tls }}
+ tls:
+ {{- range .Values.ingress.tls }}
+ - hosts:
+ {{- range .hosts }}
+ - {{ . | quote }}
+ {{- end }}
+ secretName: {{ .secretName }}
+ {{- end }}
+ {{- end }}
+ rules:
+ {{- range .Values.ingress.hosts }}
+ - host: {{ .host | quote }}
+ http:
+ paths:
+ {{- range .paths }}
+ - path: {{ .path }}
+ {{- if and .pathType (semverCompare ">=1.18-0" $.Capabilities.KubeVersion.GitVersion) }}
+ pathType: {{ .pathType }}
+ {{- end }}
+ backend:
+ {{- if semverCompare ">=1.19-0" $.Capabilities.KubeVersion.GitVersion }}
+ service:
+ name: {{ $fullName }}
+ port:
+ number: {{ $svcPort }}
+ {{- else }}
+ serviceName: {{ $fullName }}
+ servicePort: {{ $svcPort }}
+ {{- end }}
+ {{- end }}
+ {{- end }}
+{{- end }} \ No newline at end of file
diff --git a/charts/yacy/templates/networkpolicy.yaml b/charts/yacy/templates/networkpolicy.yaml
new file mode 100644
index 000000000..5a57e0588
--- /dev/null
+++ b/charts/yacy/templates/networkpolicy.yaml
@@ -0,0 +1,26 @@
+{{- if .Values.networkPolicy.enabled }}
+apiVersion: networking.k8s.io/v1
+kind: NetworkPolicy
+metadata:
+ name: {{ include "yacy.fullname" . }}
+ labels:
+ {{- include "yacy.labels" . | nindent 4 }}
+spec:
+ podSelector:
+ matchLabels:
+ {{- include "yacy.selectorLabels" . | nindent 6 }}
+ policyTypes:
+ - Ingress
+ ingress:
+ - from:
+ {{- if .Values.networkPolicy.ingressFrom }}
+ {{- toYaml .Values.networkPolicy.ingressFrom | nindent 8 }}
+ {{- else }}
+ - podSelector: {} # Allow from all pods in the same namespace
+ {{- end }}
+ ports:
+ - protocol: TCP
+ port: 8090
+ - protocol: TCP
+ port: 8443
+{{- end }} \ No newline at end of file
diff --git a/charts/yacy/templates/pdb.yaml b/charts/yacy/templates/pdb.yaml
new file mode 100644
index 000000000..1d4be3c5b
--- /dev/null
+++ b/charts/yacy/templates/pdb.yaml
@@ -0,0 +1,13 @@
+{{- if gt .Values.replicaCount 1.0 }}
+apiVersion: policy/v1
+kind: PodDisruptionBudget
+metadata:
+ name: {{ include "yacy.fullname" . }}
+ labels:
+ {{- include "yacy.labels" . | nindent 4 }}
+spec:
+ selector:
+ matchLabels:
+ {{- include "yacy.selectorLabels" . | nindent 6 }}
+ minAvailable: 1
+{{- end }} \ No newline at end of file
diff --git a/charts/yacy/templates/pvc.yaml b/charts/yacy/templates/pvc.yaml
new file mode 100644
index 000000000..3fe6f8732
--- /dev/null
+++ b/charts/yacy/templates/pvc.yaml
@@ -0,0 +1,25 @@
+{{- if and .Values.persistence.enabled (not .Values.persistence.existingClaim) }}
+kind: PersistentVolumeClaim
+apiVersion: v1
+metadata:
+ name: {{ include "yacy.fullname" . }}-data
+ labels:
+ {{- include "yacy.labels" . | nindent 4 }}
+ {{- with .Values.persistence.annotations }}
+ annotations:
+ {{- toYaml . | nindent 4 }}
+ {{- end }}
+spec:
+ accessModes:
+ - {{ .Values.persistence.accessMode | quote }}
+ resources:
+ requests:
+ storage: {{ .Values.persistence.size | quote }}
+ {{- if .Values.persistence.storageClass }}
+ {{- if (eq "-" .Values.persistence.storageClass) }}
+ storageClassName: ""
+ {{- else }}
+ storageClassName: "{{ .Values.persistence.storageClass }}"
+ {{- end }}
+ {{- end }}
+{{- end }} \ No newline at end of file
diff --git a/charts/yacy/templates/secret.yaml b/charts/yacy/templates/secret.yaml
new file mode 100644
index 000000000..1f9fedc19
--- /dev/null
+++ b/charts/yacy/templates/secret.yaml
@@ -0,0 +1,13 @@
+apiVersion: v1
+kind: Secret
+metadata:
+ name: {{ include "yacy.fullname" . }}
+ labels:
+ {{- include "yacy.labels" . | nindent 4 }}
+type: Opaque
+data:
+ {{- if .Values.yacy.adminPassword }}
+ admin-password: {{ .Values.yacy.adminPassword | b64enc | quote }}
+ {{- else }}
+ admin-password: {{ "yacy" | b64enc | quote }}
+ {{- end }} \ No newline at end of file
diff --git a/charts/yacy/templates/service.yaml b/charts/yacy/templates/service.yaml
new file mode 100644
index 000000000..c35e72b23
--- /dev/null
+++ b/charts/yacy/templates/service.yaml
@@ -0,0 +1,19 @@
+apiVersion: v1
+kind: Service
+metadata:
+ name: {{ include "yacy.fullname" . }}
+ labels:
+ {{- include "yacy.labels" . | nindent 4 }}
+spec:
+ type: {{ .Values.service.type }}
+ ports:
+ - port: {{ .Values.service.httpPort }}
+ targetPort: http
+ protocol: TCP
+ name: http
+ - port: {{ .Values.service.httpsPort }}
+ targetPort: https
+ protocol: TCP
+ name: https
+ selector:
+ {{- include "yacy.selectorLabels" . | nindent 4 }} \ No newline at end of file
diff --git a/charts/yacy/templates/serviceaccount.yaml b/charts/yacy/templates/serviceaccount.yaml
new file mode 100644
index 000000000..b7bd832ae
--- /dev/null
+++ b/charts/yacy/templates/serviceaccount.yaml
@@ -0,0 +1,12 @@
+{{- if .Values.serviceAccount.create -}}
+apiVersion: v1
+kind: ServiceAccount
+metadata:
+ name: {{ include "yacy.serviceAccountName" . }}
+ labels:
+ {{- include "yacy.labels" . | nindent 4 }}
+ {{- with .Values.serviceAccount.annotations }}
+ annotations:
+ {{- toYaml . | nindent 4 }}
+ {{- end }}
+{{- end }} \ No newline at end of file
diff --git a/charts/yacy/templates/servicemonitor.yaml b/charts/yacy/templates/servicemonitor.yaml
new file mode 100644
index 000000000..3bf907e54
--- /dev/null
+++ b/charts/yacy/templates/servicemonitor.yaml
@@ -0,0 +1,26 @@
+{{- if .Values.metrics.serviceMonitor.enabled }}
+apiVersion: monitoring.coreos.com/v1
+kind: ServiceMonitor
+metadata:
+ name: {{ include "yacy.fullname" . }}
+ {{- if .Values.metrics.serviceMonitor.namespace }}
+ namespace: {{ .Values.metrics.serviceMonitor.namespace }}
+ {{- end }}
+ labels:
+ {{- include "yacy.labels" . | nindent 4 }}
+ {{- with .Values.metrics.serviceMonitor.additionalLabels }}
+ {{- toYaml . | nindent 4 }}
+ {{- end }}
+spec:
+ endpoints:
+ - port: http
+ path: {{ .Values.metrics.path }}
+ interval: {{ .Values.metrics.serviceMonitor.interval }}
+ scrapeTimeout: {{ .Values.metrics.serviceMonitor.scrapeTimeout }}
+ namespaceSelector:
+ matchNames:
+ - {{ .Release.Namespace }}
+ selector:
+ matchLabels:
+ {{- include "yacy.selectorLabels" . | nindent 6 }}
+{{- end }} \ No newline at end of file
diff --git a/charts/yacy/values.yaml b/charts/yacy/values.yaml
new file mode 100644
index 000000000..53033f5e7
--- /dev/null
+++ b/charts/yacy/values.yaml
@@ -0,0 +1,176 @@
+# Default values for YaCy Helm chart
+# This is a YAML-formatted file.
+# Declare variables to be passed into your templates.
+
+# -- Number of YaCy pods to run
+# Note: For production use, consider setting up shared storage
+# if running multiple replicas
+replicaCount: 1
+
+# Image configuration
+image:
+ # -- Set to true to use a locally built image
+ # Set to false to pull from a registry
+ useLocal: false
+
+ # -- Local image settings (when useLocal: true)
+ # Build with: docker build -t yacy_search_server:local -f docker/Dockerfile .
+ localRepository: "yacy/yacy_search_server"
+ localTag: "latest"
+
+ # -- Official repository settings (when useLocal: false)
+ repository: yacy/yacy_search_server
+ pullPolicy: Always
+ # -- Overrides the image tag whose default is the chart appVersion
+ tag: "latest"
+
+# -- Architecture-specific image tags
+# Used for multi-architecture deployments with the official repository
+arch:
+ amd64: latest
+ arm64: aarch64-latest
+ arm: armv7-latest
+
+# Optional: Configure image pull secrets if you have authentication for private registries
+# For Docker Hub, create a secret with: kubectl create secret docker-registry regcred --docker-username=<username> --docker-password=<password>
+imagePullSecrets: []
+# - name: regcred
+nameOverride: ""
+fullnameOverride: ""
+
+# YaCy environment variables
+# All settings from yacy.init can be set as environment variables
+# Replace dots with underscores, make uppercase, and prefix with YACY_
+env: {}
+ # YACY_NETWORK_UNIT_AGENT: "MyYaCyPeer"
+ # YACY_ADMINACCOUNT_USER: "admin"
+ # YACY_ADMINACCOUNT_PASSWORD: "yacy" # Default password, change this!
+
+serviceAccount:
+ # Specifies whether a service account should be created
+ create: true
+ # Annotations to add to the service account
+ annotations: {}
+ # The name of the service account to use.
+ # If not set and create is true, a name is generated using the fullname template
+ name: ""
+
+podAnnotations: {}
+
+podSecurityContext:
+ fsGroup: 1000
+
+securityContext:
+ capabilities:
+ drop:
+ - ALL
+ readOnlyRootFilesystem: false
+ runAsNonRoot: true
+ runAsUser: 1000
+
+service:
+ type: ClusterIP
+ httpPort: 8090
+ httpsPort: 8443
+
+ingress:
+ enabled: false
+ className: ""
+ annotations: {}
+ # kubernetes.io/ingress.class: nginx
+ # kubernetes.io/tls-acme: "true"
+ hosts:
+ - host: yacy.local
+ paths:
+ - path: /
+ pathType: Prefix
+ tls: []
+ # - secretName: yacy-tls
+ # hosts:
+ # - yacy.local
+
+resources:
+ limits:
+ cpu: 1000m
+ memory: 1Gi
+ requests:
+ cpu: 500m
+ memory: 512Mi
+
+# Persistence for YaCy DATA directory
+persistence:
+ enabled: true
+ # If defined, use an existing PVC
+ existingClaim: ""
+ # storageClass: ""
+ accessMode: ReadWriteOnce
+ size: 10Gi
+ annotations: {}
+
+nodeSelector: {}
+
+tolerations: []
+
+affinity: {}
+
+# Autoscaling configuration
+autoscaling:
+ enabled: false
+ minReplicas: 1
+ maxReplicas: 5
+ targetCPUUtilizationPercentage: 80
+ targetMemoryUtilizationPercentage: 80
+
+# Network Policy
+networkPolicy:
+ # Enable network policy
+ enabled: false
+ # Custom ingress selectors
+ # ingressFrom: []
+
+# Prometheus metrics configuration
+metrics:
+ # Path for metrics endpoint
+ path: /metrics
+ serviceMonitor:
+ # If true, a ServiceMonitor CRD will be created for a prometheus operator
+ enabled: false
+ # Optional namespace for ServiceMonitor
+ namespace: ""
+ # Default scrape interval
+ interval: 1m
+ # Default scrape timeout
+ scrapeTimeout: 30s
+ # Additional labels for ServiceMonitor
+ additionalLabels: {}
+
+# -- YaCy specific configuration
+yacy:
+ # -- Admin password for the YaCy web interface
+ # IMPORTANT: Change this from the default for security!
+ adminPassword: "yacy"
+
+ # -- Optional: Custom YaCy configuration file content
+ # This will be mounted as a ConfigMap and override default settings
+ configFile: |
+ # YaCy configuration in key=value format
+ # Disable browser auto-opening (avoids xdg-open errors in container environment)
+ browserPopUpPage=
+ browserPopUpWarning=false
+
+ # -- YaCy runtime settings
+ settings:
+ # -- URLs to crawl automatically on startup
+ # Example: ["https://example.com/", "https://yacy.net/"]
+ crawlURLs: []
+
+ # -- Maximum memory allocation for YaCy
+ # Recommendation: Use 60-80% of container memory limit
+ maxMemory: "600m"
+
+ # -- Whether to join the YaCy P2P network
+ # Set to false for private/intranet installations
+ joinP2PNetwork: true
+
+ # -- Additional YaCy settings can be added as environment
+ # variables using the 'env' section