@ -0,0 +1,23 @@ | |||
# 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/ |
@ -0,0 +1,28 @@ | |||
apiVersion: v2 | |||
name: healthchecks | |||
description: A healthchecks Helm chart for Kubernetes | |||
# A chart can be either an 'application' or a 'library' chart. | |||
# | |||
# Application charts are a collection of templates that can be packaged into versioned archives | |||
# to be deployed. | |||
# | |||
# Library charts provide useful utilities or functions for the chart developer. They're included as | |||
# a dependency of application charts to inject those utilities and functions into the rendering | |||
# pipeline. Library charts do not define any templates and therefore cannot be deployed. | |||
type: application | |||
# This is the chart version. This version number should be incremented each time you make changes | |||
# to the chart and its templates, including the app version. | |||
# Versions are expected to follow Semantic Versioning (https://semver.org/) | |||
version: 0.1.0 | |||
# This is the version number of the application being deployed. This version number should be | |||
# incremented each time you make changes to the application. Versions are not expected to | |||
# follow Semantic Versioning. They should reflect the version the application is using. | |||
appVersion: 1.21.0 | |||
dependencies: | |||
- name: postgresql | |||
version: ~10.3.13 | |||
repository: "@bitnami" |
@ -0,0 +1,34 @@ | |||
# Running with Helm | |||
This is a sample configuration for running Healthchecks with kubernetes and helm | |||
**Note: The Helm configuration is a recent addition, and, for the time being, | |||
should be considered as highly experimental**. | |||
Note: For the sake of simplicity, the sample configuration starts a single database | |||
pod and a single web server pod, both on the same namespace. | |||
## Getting Started | |||
* Add your configuration in the `/docker/helm/healthchecks/values.yaml` file. | |||
As a minimum, set the following fields: | |||
* `env.DEFAULT_FROM_EMAIL` – the "From:" address for outbound emails | |||
* `env.EMAIL_HOST` – the SMTP server | |||
* `env.EMAIL_HOST_PASSWORD` – the SMTP password | |||
* `env.EMAIL_HOST_USER` – the SMTP username | |||
* `postgresql.postgresqlPassword` – set to a random value | |||
* 'ingress.host: healthchecks.example.com' | |||
* Deploy to k8s with helm: | |||
``` | |||
helm repo add bitnami https://charts.bitnami.com/bitnami | |||
helm repo update | |||
helm dependency update docker/helm/healthchecks | |||
helm install healthchecks docker/helm/healthchecks --create-namespace -n healthchecks | |||
``` | |||
* Open https://healthchecks.example.com in your browser and log in with | |||
the credentials from the previous step. | |||
@ -0,0 +1,21 @@ | |||
1. Get the application URL by running these commands: | |||
{{- if .Values.ingress.enabled }} | |||
{{- range $host := .Values.ingress.hosts }} | |||
{{- range .paths }} | |||
http{{ if $.Values.ingress.tls }}s{{ end }}://{{ $host.host }}{{ . }} | |||
{{- end }} | |||
{{- end }} | |||
{{- else if contains "NodePort" .Values.service.type }} | |||
export NODE_PORT=$(kubectl get --namespace {{ .Release.Namespace }} -o jsonpath="{.spec.ports[0].nodePort}" services {{ include "healthchecks.fullname" . }}) | |||
export NODE_IP=$(kubectl get nodes --namespace {{ .Release.Namespace }} -o jsonpath="{.items[0].status.addresses[0].address}") | |||
echo http://$NODE_IP:$NODE_PORT | |||
{{- else if contains "LoadBalancer" .Values.service.type }} | |||
NOTE: It may take a few minutes for the LoadBalancer IP to be available. | |||
You can watch the status of by running 'kubectl get --namespace {{ .Release.Namespace }} svc -w {{ include "healthchecks.fullname" . }}' | |||
export SERVICE_IP=$(kubectl get svc --namespace {{ .Release.Namespace }} {{ include "healthchecks.fullname" . }} --template "{{"{{ range (index .status.loadBalancer.ingress 0) }}{{.}}{{ end }}"}}") | |||
echo http://$SERVICE_IP:{{ .Values.service.port }} | |||
{{- else if contains "ClusterIP" .Values.service.type }} | |||
export POD_NAME=$(kubectl get pods --namespace {{ .Release.Namespace }} -l "app.kubernetes.io/name={{ include "healthchecks.name" . }},app.kubernetes.io/instance={{ .Release.Name }}" -o jsonpath="{.items[0].metadata.name}") | |||
echo "Visit http://127.0.0.1:8080 to use your application" | |||
kubectl --namespace {{ .Release.Namespace }} port-forward $POD_NAME 8080:80 | |||
{{- end }} |
@ -0,0 +1,62 @@ | |||
{{/* | |||
Expand the name of the chart. | |||
*/}} | |||
{{- define "healthchecks.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 "healthchecks.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 "healthchecks.chart" -}} | |||
{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" }} | |||
{{- end }} | |||
{{/* | |||
Common labels | |||
*/}} | |||
{{- define "healthchecks.labels" -}} | |||
helm.sh/chart: {{ include "healthchecks.chart" . }} | |||
{{ include "healthchecks.selectorLabels" . }} | |||
{{- if .Chart.AppVersion }} | |||
app.kubernetes.io/version: {{ .Chart.AppVersion | quote }} | |||
{{- end }} | |||
app.kubernetes.io/managed-by: {{ .Release.Service }} | |||
{{- end }} | |||
{{/* | |||
Selector labels | |||
*/}} | |||
{{- define "healthchecks.selectorLabels" -}} | |||
app.kubernetes.io/name: {{ include "healthchecks.name" . }} | |||
app.kubernetes.io/instance: {{ .Release.Name }} | |||
{{- end }} | |||
{{/* | |||
Create the name of the service account to use | |||
*/}} | |||
{{- define "healthchecks.serviceAccountName" -}} | |||
{{- if .Values.serviceAccount.create }} | |||
{{- default (include "healthchecks.fullname" .) .Values.serviceAccount.name }} | |||
{{- else }} | |||
{{- default "default" .Values.serviceAccount.name }} | |||
{{- end }} | |||
{{- end }} |
@ -0,0 +1,81 @@ | |||
apiVersion: apps/v1 | |||
kind: Deployment | |||
metadata: | |||
name: {{ include "healthchecks.fullname" . }} | |||
labels: | |||
{{- include "healthchecks.labels" . | nindent 4 }} | |||
spec: | |||
replicas: {{ .Values.replicaCount }} | |||
selector: | |||
matchLabels: | |||
{{- include "healthchecks.selectorLabels" . | nindent 6 }} | |||
template: | |||
metadata: | |||
{{- with .Values.podAnnotations }} | |||
annotations: | |||
{{- toYaml . | nindent 8 }} | |||
{{- end }} | |||
labels: | |||
{{- include "healthchecks.selectorLabels" . | nindent 8 }} | |||
spec: | |||
serviceAccountName: {{ include "healthchecks.serviceAccountName" . }} | |||
securityContext: | |||
{{- toYaml .Values.podSecurityContext | nindent 8 }} | |||
containers: | |||
- name: {{ .Chart.Name }} | |||
securityContext: | |||
{{- toYaml .Values.securityContext | nindent 12 }} | |||
image: "{{ .Values.image.repository }}:v{{ .Values.image.tag | default .Chart.AppVersion }}" | |||
imagePullPolicy: {{ .Values.image.pullPolicy }} | |||
command: | |||
- "bash" | |||
- "-c" | |||
- "while !</dev/tcp/{{ template "common.names.fullname" . }}-postgresql/5432; do sleep 1; done; {{.Values.command}}" | |||
env: | |||
- name: "DB" | |||
value: "postgres" | |||
- name: "DB_CONN_MAX_AGE" | |||
value: "0" | |||
- name: "DB_HOST" | |||
value: "{{ template "common.names.fullname" . }}-postgresql" | |||
- name: "DB_NAME" | |||
value: "postgres" | |||
- name: "DB_PASSWORD" | |||
value: {{.Values.postgresql.postgresqlPassword | quote}} | |||
- name: "DB_PORT" | |||
value: {{.Values.postgresql.service.port |quote}} | |||
- name: "DB_SSLMODE" | |||
value: "prefer" | |||
- name: "DB_TARGET_SESSION_ATTRS" | |||
value: "read-write" | |||
- name: "DB_USER" | |||
value: {{.Values.postgresql.postgresqlUsername | quote }} | |||
- name: "PING_ENDPOINT" | |||
value: "{{ if .Values.ingress.tls }}https://{{ else }}http://{{ end }}{{.Values.ingress.host }}/ping/" | |||
- name: "PING_EMAIL_DOMAIN" | |||
value: "{{.Values.ingress.host }}" | |||
- name: "SITE_ROOT" | |||
value: "{{ if .Values.ingress.tls }}https://{{ else }}http://{{ end }}{{.Values.ingress.host }}" | |||
- name: "SECRET_KEY" | |||
valueFrom: | |||
secretKeyRef: | |||
name: secret-key | |||
key: secret-key | |||
{{- range $envName, $envValue := $.Values.env }} | |||
- name: {{ $envName | quote }} | |||
value: {{ $envValue | quote }} | |||
{{- end }} | |||
resources: | |||
{{- toYaml .Values.resources | nindent 12 }} | |||
{{- with .Values.nodeSelector }} | |||
nodeSelector: | |||
{{- toYaml . | nindent 8 }} | |||
{{- end }} | |||
{{- with .Values.affinity }} | |||
affinity: | |||
{{- toYaml . | nindent 8 }} | |||
{{- end }} | |||
{{- with .Values.tolerations }} | |||
tolerations: | |||
{{- toYaml . | nindent 8 }} | |||
{{- end }} |
@ -0,0 +1,31 @@ | |||
{{- $fullName := include "healthchecks.fullname" . -}} | |||
{{- $svcPort := .Values.service.port -}} | |||
{{- 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 "healthchecks.labels" . | nindent 4 }} | |||
{{- with .Values.ingress.annotations }} | |||
annotations: | |||
{{- toYaml . | nindent 4 }} | |||
{{- end }} | |||
spec: | |||
{{- if .Values.ingress.tls }} | |||
tls: | |||
- hosts: | |||
- {{.Values.ingress.host | quote}} | |||
secretName: tls | |||
{{- end }} | |||
rules: | |||
- host: {{ .Values.ingress.host | quote }} | |||
http: | |||
paths: | |||
- path: / | |||
backend: | |||
serviceName: {{ include "healthchecks.fullname" . }} | |||
servicePort: {{ .Values.service.port }} |
@ -0,0 +1,10 @@ | |||
apiVersion: v1 | |||
kind: Secret | |||
metadata: | |||
name: secret-key | |||
data: | |||
{{- if .Release.IsInstall }} | |||
secret-key: {{ randAlphaNum 20 | b64enc }} | |||
{{ else }} | |||
secret-key: {{ index (lookup "v1" "Secret" .Release.Namespace "secret-key").data "secret-key" }} | |||
{{ end }} |
@ -0,0 +1,14 @@ | |||
apiVersion: v1 | |||
kind: Service | |||
metadata: | |||
name: {{ include "healthchecks.fullname" . }} | |||
labels: | |||
{{- include "healthchecks.labels" . | nindent 4 }} | |||
spec: | |||
type: {{ .Values.service.type }} | |||
ports: | |||
- port: {{ .Values.service.port }} | |||
protocol: TCP | |||
name: http | |||
selector: | |||
{{- include "healthchecks.selectorLabels" . | nindent 4 }} |
@ -0,0 +1,12 @@ | |||
{{- if .Values.serviceAccount.create -}} | |||
apiVersion: v1 | |||
kind: ServiceAccount | |||
metadata: | |||
name: {{ include "healthchecks.serviceAccountName" . }} | |||
labels: | |||
{{- include "healthchecks.labels" . | nindent 4 }} | |||
{{- with .Values.serviceAccount.annotations }} | |||
annotations: | |||
{{- toYaml . | nindent 4 }} | |||
{{- end }} | |||
{{- end }} |
@ -0,0 +1,15 @@ | |||
apiVersion: v1 | |||
kind: Pod | |||
metadata: | |||
name: "{{ include "healthchecks.fullname" . }}-test-connection" | |||
labels: | |||
{{- include "healthchecks.labels" . | nindent 4 }} | |||
annotations: | |||
"helm.sh/hook": test-success | |||
spec: | |||
containers: | |||
- name: wget | |||
image: busybox | |||
command: ['wget'] | |||
args: ['{{ include "healthchecks.fullname" . }}:{{ .Values.service.port }}'] | |||
restartPolicy: Never |
@ -0,0 +1,122 @@ | |||
# Default values for healthchecks. | |||
# This is a YAML-formatted file. | |||
# Declare variables to be passed into your templates. | |||
replicaCount: 1 | |||
image: | |||
repository: healthchecks/healthchecks | |||
pullPolicy: IfNotPresent | |||
# Overrides the image tag whose default is the chart appVersion. | |||
tag: "" | |||
command: uwsgi /opt/healthchecks/docker/uwsgi.ini | |||
nameOverride: "" | |||
fullnameOverride: "" | |||
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: 2000 | |||
securityContext: {} | |||
# capabilities: | |||
# drop: | |||
# - ALL | |||
# readOnlyRootFilesystem: true | |||
# runAsNonRoot: true | |||
# runAsUser: 1000 | |||
service: | |||
type: ClusterIP | |||
port: 8000 | |||
ingress: | |||
annotations: | |||
kubernetes.io/ingress.class: nginx | |||
kubernetes.io/tls-acme: "true" | |||
cert-manager.io/cluster-issuer: letsencrypt-prod | |||
host: healthchecks.example.com | |||
tls: true | |||
resources: | |||
limits: | |||
cpu: 500m | |||
memory: 512Mi | |||
requests: | |||
cpu: 150m | |||
memory: 512Mi | |||
nodeSelector: {} | |||
tolerations: [] | |||
affinity: {} | |||
env: | |||
ALLOWED_HOSTS: "*" | |||
APPRISE_ENABLED: "False" | |||
DEBUG: "False" | |||
DEFAULT_FROM_EMAIL: [email protected] | |||
DISCORD_CLIENT_ID: | |||
DISCORD_CLIENT_SECRET: | |||
EMAIL_HOST: | |||
EMAIL_HOST_PASSWORD: | |||
EMAIL_HOST_USER: | |||
EMAIL_PORT: 587 | |||
EMAIL_USE_TLS: "True" | |||
EMAIL_USE_VERIFICATION: "True" | |||
LINENOTIFY_CLIENT_ID: | |||
LINENOTIFY_CLIENT_SECRET: | |||
MASTER_BADGE_LABEL: Mychecks | |||
MATRIX_ACCESS_TOKEN: | |||
MATRIX_HOMESERVER: | |||
MATRIX_USER_ID: | |||
MATTERMOST_ENABLED: "True" | |||
MSTEAMS_ENABLED: "True" | |||
OPSGENIE_ENABLED: "True" | |||
PAGERTREE_ENABLED: "True" | |||
PD_APP_ID: | |||
PD_ENABLED: "True" | |||
PD_VENDOR_KEY: | |||
PING_BODY_LIMIT: 10000 | |||
PROMETHEUS_ENABLED: "True" | |||
PUSHBULLET_CLIENT_ID: | |||
PUSHBULLET_CLIENT_SECRET: | |||
PUSHOVER_API_TOKEN: | |||
PUSHOVER_EMERGENCY_EXPIRATION: 86400 | |||
PUSHOVER_EMERGENCY_RETRY_DELAY: 300 | |||
PUSHOVER_SUBSCRIPTION_URL: | |||
REGISTRATION_OPEN: "False" | |||
REMOTE_USER_HEADER: | |||
RP_ID: | |||
SHELL_ENABLED: "False" | |||
SIGNAL_CLI_ENABLED: "False" | |||
SITE_NAME: Mychecks | |||
SLACK_CLIENT_ID: | |||
SLACK_CLIENT_SECRET: | |||
SLACK_ENABLED: "False" | |||
SPIKE_ENABLED: "False" | |||
TELEGRAM_BOT_NAME: ExampleBot | |||
TELEGRAM_TOKEN: | |||
TRELLO_APP_KEY: | |||
TWILIO_ACCOUNT: | |||
TWILIO_AUTH: | |||
TWILIO_FROM: | |||
TWILIO_USE_WHATSAPP: "False" | |||
USE_PAYMENTS: "False" | |||
VICTOROPS_ENABLED: "False" | |||
WEBHOOKS_ENABLED: "True" | |||
ZULIP_ENABLED: "False" | |||
postgresql: | |||
postgresqlPassword: replacemerandompassword |