diff --git a/wordpress/.helmignore b/wordpress/.helmignore new file mode 100644 index 0000000..6b8710a --- /dev/null +++ b/wordpress/.helmignore @@ -0,0 +1 @@ +.git diff --git a/wordpress/Chart.yaml b/wordpress/Chart.yaml new file mode 100644 index 0000000..fd879a1 --- /dev/null +++ b/wordpress/Chart.yaml @@ -0,0 +1,20 @@ +name: wordpress +version: 0.6.12 +appVersion: 4.8.1 +description: Web publishing platform for building blogs and websites. +icon: https://bitnami.com/assets/stacks/wordpress/img/wordpress-stack-220x234.png +keywords: +- wordpress +- cms +- blog +- http +- web +- application +- php +home: http://www.wordpress.com/ +sources: +- https://github.com/bitnami/bitnami-docker-wordpress +maintainers: +- name: bitnami-bot + email: containers@bitnami.com +engine: gotpl diff --git a/wordpress/README.md b/wordpress/README.md new file mode 100644 index 0000000..b4d8c4d --- /dev/null +++ b/wordpress/README.md @@ -0,0 +1,103 @@ +# WordPress + +[WordPress](https://wordpress.org/) is one of the most versatile open source content management systems on the market. A publishing platform for building blogs and websites. + +## TL;DR; + +```console +$ helm install stable/wordpress +``` + +## Introduction + +This chart bootstraps a [WordPress](https://github.com/bitnami/bitnami-docker-wordpress) deployment on a [Kubernetes](http://kubernetes.io) cluster using the [Helm](https://helm.sh) package manager. + +## Prerequisites + +- Kubernetes 1.4+ with Beta APIs enabled +- PV provisioner support in the underlying infrastructure + +## Installing the Chart + +To install the chart with the release name `my-release`: + +```console +$ helm install --name my-release stable/wordpress +``` + +The command deploys WordPress on the Kubernetes cluster in the default configuration. The [configuration](#configuration) section lists the parameters that can be configured during installation. + +> **Tip**: List all releases using `helm list` + +## Uninstalling the Chart + +To uninstall/delete the `my-release` deployment: + +```console +$ helm delete my-release +``` + +The command removes all the Kubernetes components associated with the chart and deletes the release. + +## Configuration + +The following tables lists the configurable parameters of the WordPress chart and their default values. + +| Parameter | Description | Default | +| ------------------------------- | ------------------------------- | ---------------------------------------------------------- | +| `image` | WordPress image | `bitnami/wordpress:{VERSION}` | +| `imagePullPolicy` | Image pull policy | `IfNotPresent` | +| `wordpressUsername` | User of the application | `user` | +| `wordpressPassword` | Application password | _random 10 character long alphanumeric string_ | +| `wordpressEmail` | Admin email | `user@example.com` | +| `wordpressFirstName` | First name | `FirstName` | +| `wordpressLastName` | Last name | `LastName` | +| `wordpressBlogName` | Blog name | `User's Blog!` | +| `allowEmptyPassword` | Allow DB blank passwords | `yes` | +| `smtpHost` | SMTP host | `nil` | +| `smtpPort` | SMTP port | `nil` | +| `smtpUser` | SMTP user | `nil` | +| `smtpPassword` | SMTP password | `nil` | +| `smtpUsername` | User name for SMTP emails | `nil` | +| `smtpProtocol` | SMTP protocol [`tls`, `ssl`] | `nil` | +| `serviceType` | Kubernetes Service type | `LoadBalancer` | +| `healthcheckHttps` | Use https for liveliness and readiness | `false` | +| `ingress.enabled` | Enable ingress controller resource | `false` | +| `ingress.hostname` | URL to address your WordPress installation | `wordpress.local` | +| `ingress.tls` | Ingress TLS configuration | `[]` | +| `persistence.enabled` | Enable persistence using PVC | `true` | +| `persistence.storageClass` | PVC Storage Class | `nil` (uses alpha storage class annotation) | +| `persistence.accessMode` | PVC Access Mode | `ReadWriteOnce` | +| `persistence.size` | PVC Storage Request | `10Gi` | | + +The above parameters map to the env variables defined in [bitnami/wordpress](http://github.com/bitnami/bitnami-docker-wordpress). For more information please refer to the [bitnami/wordpress](http://github.com/bitnami/bitnami-docker-wordpress) image documentation. + +Specify each parameter using the `--set key=value[,key=value]` argument to `helm install`. For example, + +```console +$ helm install stable/wordpress \ + --name my-release \ + --set wordpressUsername=admin \ + --set wordpressPassword=password +``` + +The above command sets the WordPress administrator account username and password to `admin` and `password` respectively. + +Alternatively, a YAML file that specifies the values for the above parameters can be provided while installing the chart. For example, + +```console +$ helm install --name my-release -f values.yaml stable/wordpress +``` + +> **Tip**: You can use the default [values.yaml](values.yaml) + +## Persistence + +The [Bitnami WordPress](https://github.com/bitnami/bitnami-docker-wordpress) image stores the WordPress data and configurations at the `/bitnami` path of the container. + +Persistent Volume Claims are used to keep the data across deployments. This is known to work in GCE, AWS, and minikube. +See the [Configuration](#configuration) section to configure the PVC or to disable persistence. + +## Ingress + +This chart provides support for Ingress resource. If you have available an Ingress Controller such as Nginx or Traefik you maybe want to set up `ingress.enabled` to true and choose a `ingress.hostname` for the URL. Then, you should be able to access the installation using that address. diff --git a/wordpress/templates/NOTES.txt b/wordpress/templates/NOTES.txt new file mode 100644 index 0000000..9e91606 --- /dev/null +++ b/wordpress/templates/NOTES.txt @@ -0,0 +1,37 @@ +1. Get the WordPress URL: + +{{- if .Values.ingress.enabled }} + + You should be able to access your new WordPress installation through + + http://{{- .Values.ingress.hostname }}/admin + +{{- else if contains "LoadBalancer" .Values.serviceType }} + + NOTE: It may take a few minutes for the LoadBalancer IP to be available. + Watch the status with: 'kubectl get svc --namespace {{ .Release.Namespace }} -w {{ template "fullname" . }}' + + export SERVICE_IP=$(kubectl get svc --namespace {{ .Release.Namespace }} {{ template "fullname" . }} -o jsonpath='{.status.loadBalancer.ingress[0].ip}') + echo http://$SERVICE_IP/admin +{{- else if contains "ClusterIP" .Values.serviceType }} + + export POD_NAME=$(kubectl get pods --namespace {{ .Release.Namespace }} -l "app={{ template "fullname" . }}" -o jsonpath="{.items[0].metadata.name}") + echo http://127.0.0.1:8080/admin + kubectl port-forward $POD_NAME 8080:80 + +{{- end }} + +{{- if contains "NodePort" .Values.serviceType }} + + Or running: + + export NODE_PORT=$(kubectl get --namespace {{ .Release.Namespace }} -o jsonpath="{.spec.ports[0].nodePort}" services {{ template "fullname" . }}) + export NODE_IP=$(kubectl get nodes --namespace {{ .Release.Namespace }} -o jsonpath="{.items[0].status.addresses[0].address}") + echo http://$NODE_IP:$NODE_PORT/admin + +{{- end }} + +2. Login with the following credentials to see your blog + + echo Username: {{ .Values.wordpressUsername }} + echo Password: $(kubectl get secret --namespace {{ .Release.Namespace }} {{ template "fullname" . }} -o jsonpath="{.data.wordpress-password}" | base64 --decode) diff --git a/wordpress/templates/_helpers.tpl b/wordpress/templates/_helpers.tpl new file mode 100644 index 0000000..f0d83d2 --- /dev/null +++ b/wordpress/templates/_helpers.tpl @@ -0,0 +1,16 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Expand the name of the chart. +*/}} +{{- define "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). +*/}} +{{- define "fullname" -}} +{{- $name := default .Chart.Name .Values.nameOverride -}} +{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" -}} +{{- end -}} diff --git a/wordpress/templates/deployment.yaml b/wordpress/templates/deployment.yaml new file mode 100644 index 0000000..4f57542 --- /dev/null +++ b/wordpress/templates/deployment.yaml @@ -0,0 +1,131 @@ +apiVersion: extensions/v1beta1 +kind: Deployment +metadata: + name: {{ template "fullname" . }} + labels: + app: {{ template "fullname" . }} + chart: "{{ .Chart.Name }}-{{ .Chart.Version }}" + release: "{{ .Release.Name }}" + heritage: "{{ .Release.Service }}" +spec: + replicas: 1 + template: + metadata: + labels: + app: {{ template "fullname" . }} + spec: + containers: + - name: {{ template "fullname" . }} + image: "{{ .Values.image }}" + imagePullPolicy: {{ default "" .Values.imagePullPolicy | quote }} + env: + - name: ALLOW_EMPTY_PASSWORD + {{- if .Values.allowEmptyPassword }} + value: "yes" + {{- else }} + value: "no" + {{- end }} + - name: MARIADB_HOST + valueFrom: + secretKeyRef: + name: {{ template "fullname" . }}-mysql-secret + key: host + - name: MARIADB_PORT_NUMBER + valueFrom: + secretKeyRef: + name: {{ template "fullname" . }}-mysql-secret + key: port + - name: WORDPRESS_DATABASE_NAME + valueFrom: + secretKeyRef: + name: {{ template "fullname" . }}-mysql-secret + key: database + - name: WORDPRESS_DATABASE_USER + valueFrom: + secretKeyRef: + name: {{ template "fullname" . }}-mysql-secret + key: username + - name: WORDPRESS_DATABASE_PASSWORD + valueFrom: + secretKeyRef: + name: {{ template "fullname" . }}-mysql-secret + key: password + - name: WORDPRESS_USERNAME + value: {{ default "" .Values.wordpressUsername | quote }} + - name: WORDPRESS_PASSWORD + valueFrom: + secretKeyRef: + name: {{ template "fullname" . }} + key: wordpress-password + - name: WORDPRESS_EMAIL + value: {{ default "" .Values.wordpressEmail | quote }} + - name: WORDPRESS_FIRST_NAME + value: {{ default "" .Values.wordpressFirstName | quote }} + - name: WORDPRESS_LAST_NAME + value: {{ default "" .Values.wordpressLastName | quote }} + - name: WORDPRESS_BLOG_NAME + value: {{ default "" .Values.wordpressBlogName | quote }} + - name: SMTP_HOST + value: {{ default "" .Values.smtpHost | quote }} + - name: SMTP_PORT + value: {{ default "" .Values.smtpPort | quote }} + - name: SMTP_USER + value: {{ default "" .Values.smtpUser | quote }} + - name: SMTP_PASSWORD + valueFrom: + secretKeyRef: + name: {{ template "fullname" . }} + key: smtp-password + - name: SMTP_USERNAME + value: {{ default "" .Values.smtpUsername | quote }} + - name: SMTP_PROTOCOL + value: {{ default "" .Values.smtpProtocol | quote }} + ports: + - name: http + containerPort: 80 + - name: https + containerPort: 443 + livenessProbe: + httpGet: + path: /wp-login.php + {{- if not .Values.healthcheckHttps }} + port: http + {{- else }} + port: https + scheme: HTTPS + {{- end }} + initialDelaySeconds: 120 + timeoutSeconds: 5 + failureThreshold: 6 + readinessProbe: + httpGet: + path: /wp-login.php + {{- if not .Values.healthcheckHttps }} + port: http + {{- else }} + port: https + scheme: HTTPS + {{- end }} + initialDelaySeconds: 30 + timeoutSeconds: 3 + periodSeconds: 5 + volumeMounts: + - mountPath: /bitnami/apache + name: wordpress-data + subPath: apache + - mountPath: /bitnami/wordpress + name: wordpress-data + subPath: wordpress + - mountPath: /bitnami/php + name: wordpress-data + subPath: php + resources: +{{ toYaml .Values.resources | indent 10 }} + volumes: + - name: wordpress-data + {{- if .Values.persistence.enabled }} + persistentVolumeClaim: + claimName: {{ template "fullname" . }} + {{- else }} + emptyDir: {} + {{ end }} diff --git a/wordpress/templates/ingress.yaml b/wordpress/templates/ingress.yaml new file mode 100644 index 0000000..ebd91c0 --- /dev/null +++ b/wordpress/templates/ingress.yaml @@ -0,0 +1,28 @@ +{{- if .Values.ingress.enabled -}} +apiVersion: extensions/v1beta1 +kind: Ingress +metadata: + name: {{ template "fullname" . }} + labels: + app: {{ template "fullname" . }} + chart: "{{ .Chart.Name }}-{{ .Chart.Version }}" + release: "{{ .Release.Name }}" + heritage: "{{ .Release.Service }}" + annotations: + {{- range $key, $value := .Values.ingress.annotations }} + {{ $key }}: {{ $value | quote }} + {{- end }} +spec: + rules: + - host: {{ .Values.ingress.hostname }} + http: + paths: + - path: / + backend: + serviceName: {{ template "fullname" . }} + servicePort: 80 +{{- if .Values.ingress.tls }} + tls: +{{ toYaml .Values.ingress.tls | indent 4 }} +{{- end -}} +{{- end -}} diff --git a/wordpress/templates/mysql-credential.yaml b/wordpress/templates/mysql-credential.yaml new file mode 100644 index 0000000..3a23d26 --- /dev/null +++ b/wordpress/templates/mysql-credential.yaml @@ -0,0 +1,13 @@ +apiVersion: servicecatalog.k8s.io/v1alpha1 +kind: ServiceInstanceCredential +metadata: + name: {{ template "fullname" . }}-mysql-credential + labels: + app: {{ template "fullname" . }} + chart: "{{ .Chart.Name }}-{{ .Chart.Version }}" + release: "{{ .Release.Name }}" + heritage: "{{ .Release.Service }}" +spec: + instanceRef: + name: {{ template "fullname" . }}-mysql-instance + secretName: {{ template "fullname" . }}-mysql-secret diff --git a/wordpress/templates/mysql-instance.yaml b/wordpress/templates/mysql-instance.yaml new file mode 100644 index 0000000..c3de5ae --- /dev/null +++ b/wordpress/templates/mysql-instance.yaml @@ -0,0 +1,16 @@ +apiVersion: servicecatalog.k8s.io/v1alpha1 +kind: ServiceInstance +metadata: + name: {{ template "fullname" . }}-mysql-instance + labels: + app: {{ template "fullname" . }} + chart: "{{ .Chart.Name }}-{{ .Chart.Version }}" + release: "{{ .Release.Name }}" + heritage: "{{ .Release.Service }}" +spec: + serviceClassName: azure-mysqldb + planName: basic50 + parameters: + location: eastus + resourceGroup: demo + sslEnforcement: disabled diff --git a/wordpress/templates/pvc.yaml b/wordpress/templates/pvc.yaml new file mode 100644 index 0000000..99c8268 --- /dev/null +++ b/wordpress/templates/pvc.yaml @@ -0,0 +1,24 @@ +{{- if .Values.persistence.enabled -}} +kind: PersistentVolumeClaim +apiVersion: v1 +metadata: + name: {{ template "fullname" . }} + labels: + app: {{ template "fullname" . }} + chart: "{{ .Chart.Name }}-{{ .Chart.Version }}" + release: "{{ .Release.Name }}" + heritage: "{{ .Release.Service }}" +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 -}} diff --git a/wordpress/templates/secrets.yaml b/wordpress/templates/secrets.yaml new file mode 100644 index 0000000..80a28d7 --- /dev/null +++ b/wordpress/templates/secrets.yaml @@ -0,0 +1,17 @@ +apiVersion: v1 +kind: Secret +metadata: + name: {{ template "fullname" . }} + labels: + app: {{ template "fullname" . }} + chart: "{{ .Chart.Name }}-{{ .Chart.Version }}" + release: "{{ .Release.Name }}" + heritage: "{{ .Release.Service }}" +type: Opaque +data: + {{ if .Values.wordpressPassword }} + wordpress-password: {{ default "" .Values.wordpressPassword | b64enc | quote }} + {{ else }} + wordpress-password: {{ randAlphaNum 10 | b64enc | quote }} + {{ end }} + smtp-password: {{ default "" .Values.smtpPassword | b64enc | quote }} diff --git a/wordpress/templates/svc.yaml b/wordpress/templates/svc.yaml new file mode 100644 index 0000000..6736e04 --- /dev/null +++ b/wordpress/templates/svc.yaml @@ -0,0 +1,20 @@ +apiVersion: v1 +kind: Service +metadata: + name: {{ template "fullname" . }} + labels: + app: {{ template "fullname" . }} + chart: "{{ .Chart.Name }}-{{ .Chart.Version }}" + release: "{{ .Release.Name }}" + heritage: "{{ .Release.Service }}" +spec: + type: {{ .Values.serviceType }} + ports: + - name: http + port: 80 + targetPort: http + - name: https + port: 443 + targetPort: https + selector: + app: {{ template "fullname" . }} diff --git a/wordpress/values.yaml b/wordpress/values.yaml new file mode 100644 index 0000000..7736b14 --- /dev/null +++ b/wordpress/values.yaml @@ -0,0 +1,107 @@ +## Bitnami WordPress image version +## ref: https://hub.docker.com/r/bitnami/wordpress/tags/ +## +image: bitnami/wordpress:4.8.1-r1 + +## Specify a imagePullPolicy +## ref: http://kubernetes.io/docs/user-guide/images/#pre-pulling-images +## +imagePullPolicy: IfNotPresent + +## User of the application +## ref: https://github.com/bitnami/bitnami-docker-wordpress#environment-variables +## +wordpressUsername: user + +## Application password +## Defaults to a random 10-character alphanumeric string if not set +## ref: https://github.com/bitnami/bitnami-docker-wordpress#environment-variables +## +# wordpressPassword: + +## Admin email +## ref: https://github.com/bitnami/bitnami-docker-wordpress#environment-variables +## +wordpressEmail: user@example.com + +## First name +## ref: https://github.com/bitnami/bitnami-docker-wordpress#environment-variables +## +wordpressFirstName: FirstName + +## Last name +## ref: https://github.com/bitnami/bitnami-docker-wordpress#environment-variables +## +wordpressLastName: LastName + +## Blog name +## ref: https://github.com/bitnami/bitnami-docker-wordpress#environment-variables +## +wordpressBlogName: User's Blog! + +## Set to `yes` to allow the container to be started with blank passwords +## ref: https://github.com/bitnami/bitnami-docker-wordpress#environment-variables +allowEmptyPassword: yes + +## SMTP mail delivery configuration +## ref: https://github.com/bitnami/bitnami-docker-wordpress/#smtp-configuration +## +# smtpHost: +# smtpPort: +# smtpUser: +# smtpPassword: +# smtpUsername: +# smtpProtocol: + +## Kubernetes configuration +## For minikube, set this to NodePort, elsewhere use LoadBalancer +## +serviceType: LoadBalancer + +## Allow health checks to be pointed at the https port +healthcheckHttps: false + +## Configure ingress resource that allow you to access the +## Wordpress instalation. Set up the URL +## ref: http://kubernetes.io/docs/user-guide/ingress/ +## +ingress: + enabled: false + hostname: wordpress.local + + ## Ingress annotations + ## + # annotations: + # kubernetes.io/ingress.class: nginx + + ## Ingress TLS configuration + ## Secrets must be manually created in the namespace + ## + # tls: + # - secretName: wordpress.local-tls + # hosts: + # - wordpress.local + +## Enable persistence using Persistent Volume Claims +## ref: http://kubernetes.io/docs/user-guide/persistent-volumes/ +## +persistence: + enabled: true + ## wordpress data Persistent Volume Storage Class + ## If defined, storageClassName: + ## If set to "-", storageClassName: "", which disables dynamic provisioning + ## If undefined (the default) or set to null, no storageClassName spec is + ## set, choosing the default provisioner. (gp2 on AWS, standard on + ## GKE, AWS & OpenStack) + ## + # storageClass: "-" + accessMode: ReadWriteOnce + size: 10Gi + +## Configure resource requests and limits +## ref: http://kubernetes.io/docs/user-guide/compute-resources/ +## +resources: + requests: + memory: 512Mi + cpu: 300m