Merge pull request #273 from t3hmrman/add-kubernetes-resource-configs
Add kubernetes NGINX ingress and Mailu resource configmaster
commit
7c483adfbb
@ -0,0 +1,14 @@
|
|||||||
|
# Installing Mailu with Kubernetes #
|
||||||
|
|
||||||
|
# Prerequisites #
|
||||||
|
|
||||||
|
The resource configurations in this folder assume that you have [Kubernetes Ingress](https://kubernetes.io/docs/concepts/services-networking/ingress/) set up for your cluster. If you are not using the [NGINX Ingress Controller for Kubernetes](https://github.com/kubernetes/ingress/tree/master/controllers/nginx), please ensure that the configuration specified in the file matches your set up.
|
||||||
|
|
||||||
|
# How to use #
|
||||||
|
|
||||||
|
Using the resource configurations is simple:
|
||||||
|
|
||||||
|
1. `kubectl apply -f kubernetes-nginx-ingress-controller.yaml` to configure an ingress controller with the proper settings. (If you have one set up already you may need to port the configuration to your own ingress).
|
||||||
|
2. `kubectl apply -f kubernetes-mailu.yaml` to create the resources required to run Mailu.
|
||||||
|
|
||||||
|
Based on the configuration, your Mailu instance should be available at `mail.<hostname>.tld/admin` (note that visiting just `mail.<hostname>.tld` will likely result in a 404.
|
@ -0,0 +1,491 @@
|
|||||||
|
---
|
||||||
|
apiVersion: extensions/v1beta1
|
||||||
|
kind: Ingress
|
||||||
|
metadata:
|
||||||
|
name: mailu-admin-ing
|
||||||
|
labels:
|
||||||
|
app: mailu
|
||||||
|
role: mail
|
||||||
|
tier: backend
|
||||||
|
spec:
|
||||||
|
tls:
|
||||||
|
- hosts:
|
||||||
|
- "mail.example.com"
|
||||||
|
secretName: letsencrypt-certs-all # If unsure how to generate these, check out https://github.com/ployst/docker-letsencrypt
|
||||||
|
rules:
|
||||||
|
- host: "mail.example.com"
|
||||||
|
http:
|
||||||
|
paths:
|
||||||
|
- path: "/admin"
|
||||||
|
backend:
|
||||||
|
serviceName: mailu-admin
|
||||||
|
servicePort: 80
|
||||||
|
|
||||||
|
---
|
||||||
|
apiVersion: extensions/v1beta1
|
||||||
|
kind: Deployment
|
||||||
|
metadata:
|
||||||
|
name: mailu-redis
|
||||||
|
spec:
|
||||||
|
replicas: 1
|
||||||
|
template:
|
||||||
|
metadata:
|
||||||
|
labels:
|
||||||
|
app: mailu-redis
|
||||||
|
role: mail
|
||||||
|
tier: backend
|
||||||
|
spec:
|
||||||
|
containers:
|
||||||
|
- name: redis
|
||||||
|
image: redis:4.0-alpine
|
||||||
|
imagePullPolicy: Always
|
||||||
|
volumeMounts:
|
||||||
|
- mountPath: /data
|
||||||
|
name: redisdata
|
||||||
|
ports:
|
||||||
|
- containerPort: 6379
|
||||||
|
name: redis
|
||||||
|
protocol: TCP
|
||||||
|
volumes:
|
||||||
|
- name: redisdata
|
||||||
|
hostPath:
|
||||||
|
path: /var/data/mailu/redisdata
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
apiVersion: v1
|
||||||
|
kind: Service
|
||||||
|
metadata:
|
||||||
|
name: redis
|
||||||
|
labels:
|
||||||
|
app: mailu-redis
|
||||||
|
role: mail
|
||||||
|
tier: backend
|
||||||
|
spec:
|
||||||
|
selector:
|
||||||
|
app: mailu
|
||||||
|
role: mail
|
||||||
|
tier: backend
|
||||||
|
ports:
|
||||||
|
- name: redis
|
||||||
|
port: 6379
|
||||||
|
protocol: TCP
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
apiVersion: extensions/v1beta1
|
||||||
|
kind: Deployment
|
||||||
|
metadata:
|
||||||
|
name: mailu-imap
|
||||||
|
spec:
|
||||||
|
replicas: 1
|
||||||
|
template:
|
||||||
|
metadata:
|
||||||
|
labels:
|
||||||
|
app: mailu-imap
|
||||||
|
role: mail
|
||||||
|
tier: backend
|
||||||
|
spec:
|
||||||
|
containers:
|
||||||
|
- name: imap
|
||||||
|
image: mailu/dovecot:stable
|
||||||
|
imagePullPolicy: Always
|
||||||
|
env:
|
||||||
|
- name : DOMAIN
|
||||||
|
value : example.com
|
||||||
|
- name : HOSTNAME
|
||||||
|
value : mail.example.com
|
||||||
|
- name : POSTMASTER
|
||||||
|
value : admin
|
||||||
|
volumeMounts:
|
||||||
|
- mountPath: /data
|
||||||
|
name: maildata
|
||||||
|
- mountPath: /mail
|
||||||
|
name: mailstate
|
||||||
|
- mountPath: /overrides
|
||||||
|
name: overrides
|
||||||
|
- mountPath: /certs
|
||||||
|
name: certs
|
||||||
|
readOnly: true
|
||||||
|
ports:
|
||||||
|
- containerPort: 2102
|
||||||
|
- containerPort: 2525
|
||||||
|
- containerPort: 143
|
||||||
|
- containerPort: 993
|
||||||
|
- containerPort: 4190
|
||||||
|
volumes:
|
||||||
|
- name: maildata
|
||||||
|
hostPath:
|
||||||
|
path: /var/data/mailu/maildata
|
||||||
|
- name: mailstate
|
||||||
|
hostPath:
|
||||||
|
path: /var/data/mailu/mailstate
|
||||||
|
- name: overrides
|
||||||
|
hostPath:
|
||||||
|
path: /var/data/mailu/overrides
|
||||||
|
- name: certs
|
||||||
|
secret:
|
||||||
|
items:
|
||||||
|
- key: tls.crt
|
||||||
|
path: cert.pem
|
||||||
|
- key: tls.key
|
||||||
|
path: key.pem
|
||||||
|
secretName: letsencrypt-certs-all
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
apiVersion: v1
|
||||||
|
kind: Service
|
||||||
|
metadata:
|
||||||
|
name: imap
|
||||||
|
labels:
|
||||||
|
app: mailu
|
||||||
|
role: mail
|
||||||
|
tier: backend
|
||||||
|
spec:
|
||||||
|
selector:
|
||||||
|
app: mailu-imap
|
||||||
|
role: mail
|
||||||
|
tier: backend
|
||||||
|
ports:
|
||||||
|
ports:
|
||||||
|
- name: imap-auth
|
||||||
|
port: 2102
|
||||||
|
protocol: TCP
|
||||||
|
- name: imap-transport
|
||||||
|
port: 2525
|
||||||
|
protocol: TCP
|
||||||
|
- name: imap-default
|
||||||
|
port: 143
|
||||||
|
protocol: TCP
|
||||||
|
- name: imap-ssl
|
||||||
|
port: 993
|
||||||
|
protocol: TCP
|
||||||
|
- name: sieve
|
||||||
|
port: 4190
|
||||||
|
protocol: TCP
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
apiVersion: extensions/v1beta1
|
||||||
|
kind: Deployment
|
||||||
|
metadata:
|
||||||
|
name: mailu-smtp
|
||||||
|
spec:
|
||||||
|
replicas: 1
|
||||||
|
template:
|
||||||
|
metadata:
|
||||||
|
labels:
|
||||||
|
app: mailu-smtp
|
||||||
|
role: mail
|
||||||
|
tier: backend
|
||||||
|
spec:
|
||||||
|
containers:
|
||||||
|
- name: smtp
|
||||||
|
image: mailu/postfix:stable
|
||||||
|
imagePullPolicy: Always
|
||||||
|
env:
|
||||||
|
- name : DOMAIN
|
||||||
|
value : example.com
|
||||||
|
- name : HOSTNAME
|
||||||
|
value : mail.example.com
|
||||||
|
- name : MESSAGE_SIZE_LIMIT
|
||||||
|
value : "50000000"
|
||||||
|
- name : RELAYHOST
|
||||||
|
value : ""
|
||||||
|
volumeMounts:
|
||||||
|
- mountPath: /data
|
||||||
|
name: maildata
|
||||||
|
- mountPath: /overrides
|
||||||
|
name: overrides
|
||||||
|
- mountPath: /certs
|
||||||
|
name: certs
|
||||||
|
readOnly: true
|
||||||
|
ports:
|
||||||
|
- name: smtp
|
||||||
|
containerPort: 25
|
||||||
|
protocol: TCP
|
||||||
|
- name: smtp-ssl
|
||||||
|
containerPort: 465
|
||||||
|
protocol: TCP
|
||||||
|
- name: smtp-starttls
|
||||||
|
containerPort: 587
|
||||||
|
protocol: TCP
|
||||||
|
volumes:
|
||||||
|
- name: maildata
|
||||||
|
hostPath:
|
||||||
|
path: /var/data/mailu/maildata
|
||||||
|
- name: overrides
|
||||||
|
hostPath:
|
||||||
|
path: /var/data/mailu/overrides
|
||||||
|
- name: certs
|
||||||
|
secret:
|
||||||
|
items:
|
||||||
|
- key: tls.crt
|
||||||
|
path: cert.pem
|
||||||
|
- key: tls.key
|
||||||
|
path: key.pem
|
||||||
|
secretName: letsencrypt-certs-all
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
apiVersion: v1
|
||||||
|
kind: Service
|
||||||
|
metadata:
|
||||||
|
name: smtp
|
||||||
|
labels:
|
||||||
|
app: mailu
|
||||||
|
role: mail
|
||||||
|
tier: backend
|
||||||
|
spec:
|
||||||
|
selector:
|
||||||
|
app: mailu-smtp
|
||||||
|
role: mail
|
||||||
|
tier: backend
|
||||||
|
ports:
|
||||||
|
- name: smtp
|
||||||
|
port: 25
|
||||||
|
protocol: TCP
|
||||||
|
- name: smtp-ssl
|
||||||
|
port: 465
|
||||||
|
protocol: TCP
|
||||||
|
- name: smtp-starttls
|
||||||
|
port: 587
|
||||||
|
protocol: TCP
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
apiVersion: extensions/v1beta1
|
||||||
|
kind: Deployment
|
||||||
|
metadata:
|
||||||
|
name: mailu-milter
|
||||||
|
spec:
|
||||||
|
replicas: 1
|
||||||
|
template:
|
||||||
|
metadata:
|
||||||
|
labels:
|
||||||
|
app: mailu-milter
|
||||||
|
role: mail
|
||||||
|
tier: backend
|
||||||
|
spec:
|
||||||
|
containers:
|
||||||
|
- name: milter
|
||||||
|
image: mailu/rmilter:stable
|
||||||
|
imagePullPolicy: Always
|
||||||
|
ports:
|
||||||
|
- name: milter
|
||||||
|
containerPort: 9900
|
||||||
|
protocol: TCP
|
||||||
|
volumeMounts:
|
||||||
|
- name: maildata
|
||||||
|
mountPath: /data
|
||||||
|
- name: dkim
|
||||||
|
mountPath: /dkim
|
||||||
|
- name: overrides
|
||||||
|
mountPath: /overrides
|
||||||
|
- name: certs
|
||||||
|
mountPath: /certs
|
||||||
|
readOnly: true
|
||||||
|
volumes:
|
||||||
|
- name: maildata
|
||||||
|
hostPath:
|
||||||
|
path: /var/data/mailu/maildata
|
||||||
|
- name: overrides
|
||||||
|
hostPath:
|
||||||
|
path: /var/data/mailu/overrides
|
||||||
|
- name: dkim
|
||||||
|
hostPath:
|
||||||
|
path: /var/data/mailu/dkim
|
||||||
|
- name: certs
|
||||||
|
secret:
|
||||||
|
items:
|
||||||
|
- key: tls.crt
|
||||||
|
path: cert.pem
|
||||||
|
- key: tls.key
|
||||||
|
path: key.pem
|
||||||
|
secretName: letsencrypt-certs-all
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
apiVersion: v1
|
||||||
|
kind: Service
|
||||||
|
metadata:
|
||||||
|
name: milter
|
||||||
|
labels:
|
||||||
|
app: mailu-milter
|
||||||
|
role: mail
|
||||||
|
tier: backend
|
||||||
|
spec:
|
||||||
|
selector:
|
||||||
|
app: mailu-milter
|
||||||
|
role: mail
|
||||||
|
tier: backend
|
||||||
|
ports:
|
||||||
|
- name: milter
|
||||||
|
port: 9900
|
||||||
|
protocol: TCP
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
apiVersion: extensions/v1beta1
|
||||||
|
kind: Deployment
|
||||||
|
metadata:
|
||||||
|
name: mailu-security
|
||||||
|
spec:
|
||||||
|
replicas: 1
|
||||||
|
template:
|
||||||
|
metadata:
|
||||||
|
labels:
|
||||||
|
app: mailu-security
|
||||||
|
role: mail
|
||||||
|
tier: backend
|
||||||
|
spec:
|
||||||
|
containers:
|
||||||
|
- name: antispam
|
||||||
|
image: mailu/rspamd:stable
|
||||||
|
imagePullPolicy: Always
|
||||||
|
ports:
|
||||||
|
- name: antispam
|
||||||
|
containerPort: 11333
|
||||||
|
protocol: TCP
|
||||||
|
volumeMounts:
|
||||||
|
- name: filter
|
||||||
|
mountPath: /var/lib/rspamd
|
||||||
|
- name: antivirus
|
||||||
|
image: mailu/clamav:stable
|
||||||
|
imagePullPolicy: Always
|
||||||
|
ports:
|
||||||
|
- name: antivirus
|
||||||
|
containerPort: 3310
|
||||||
|
protocol: TCP
|
||||||
|
volumeMounts:
|
||||||
|
- name: filter
|
||||||
|
mountPath: /data
|
||||||
|
volumes:
|
||||||
|
- name: filter
|
||||||
|
hostPath:
|
||||||
|
path: /var/data/mailu/filter
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
apiVersion: v1
|
||||||
|
kind: Service
|
||||||
|
metadata:
|
||||||
|
name: antispam
|
||||||
|
labels:
|
||||||
|
app: mailu-antispam
|
||||||
|
role: mail
|
||||||
|
tier: backend
|
||||||
|
spec:
|
||||||
|
selector:
|
||||||
|
app: mailu-security
|
||||||
|
role: mail
|
||||||
|
tier: backend
|
||||||
|
ports:
|
||||||
|
- name: antispam
|
||||||
|
port: 11333
|
||||||
|
protocol: TCP
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
apiVersion: v1
|
||||||
|
kind: Service
|
||||||
|
metadata:
|
||||||
|
name: antivirus
|
||||||
|
labels:
|
||||||
|
app: mailu-antivirus
|
||||||
|
role: mail
|
||||||
|
tier: backend
|
||||||
|
spec:
|
||||||
|
selector:
|
||||||
|
app: mailu-security
|
||||||
|
role: mail
|
||||||
|
tier: backend
|
||||||
|
ports:
|
||||||
|
- name: antivirus
|
||||||
|
port: 3310
|
||||||
|
protocol: TCP
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
apiVersion: extensions/v1beta1
|
||||||
|
kind: Deployment
|
||||||
|
metadata:
|
||||||
|
name: mailu-admin
|
||||||
|
spec:
|
||||||
|
replicas: 1
|
||||||
|
template:
|
||||||
|
metadata:
|
||||||
|
labels:
|
||||||
|
app: mailu-admin
|
||||||
|
role: mail
|
||||||
|
tier: backend
|
||||||
|
spec:
|
||||||
|
containers:
|
||||||
|
- name: admin
|
||||||
|
image: mailu/admin:stable
|
||||||
|
imagePullPolicy: Always
|
||||||
|
env:
|
||||||
|
- name : DOMAIN
|
||||||
|
value : example.com
|
||||||
|
- name : HOSTNAME
|
||||||
|
value : mail.example.com
|
||||||
|
- name : POSTMASTER
|
||||||
|
value : core
|
||||||
|
- name : SECRET_KEY
|
||||||
|
value : pleasereplacethiswithabetterkey
|
||||||
|
- name : DEBUG
|
||||||
|
value : "True"
|
||||||
|
volumeMounts:
|
||||||
|
- name: maildata
|
||||||
|
mountPath: /data
|
||||||
|
- name: dkim
|
||||||
|
mountPath: /dkim
|
||||||
|
- name: certs
|
||||||
|
mountPath: /certs
|
||||||
|
readOnly: true
|
||||||
|
# - name: docker
|
||||||
|
# mountPath: /var/run/docker.sock
|
||||||
|
# readOnly: true
|
||||||
|
ports:
|
||||||
|
- name: http
|
||||||
|
containerPort: 80
|
||||||
|
protocol: TCP
|
||||||
|
volumes:
|
||||||
|
- name: maildata
|
||||||
|
hostPath:
|
||||||
|
path: /var/data/mailu/maildata
|
||||||
|
- name: dkim
|
||||||
|
hostPath:
|
||||||
|
path: /var/data/mailu/dkim
|
||||||
|
- name: certs
|
||||||
|
secret:
|
||||||
|
items:
|
||||||
|
- key: tls.crt
|
||||||
|
path: cert.pem
|
||||||
|
- key: tls.key
|
||||||
|
path: key.pem
|
||||||
|
secretName: letsencrypt-certs-all
|
||||||
|
# - name: docker
|
||||||
|
# hostPath:
|
||||||
|
# path: /var/run/docker.sock
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
apiVersion: v1
|
||||||
|
kind: Service
|
||||||
|
metadata:
|
||||||
|
name: mailu-admin
|
||||||
|
labels:
|
||||||
|
app: mailu-admin
|
||||||
|
role: mail
|
||||||
|
tier: backend
|
||||||
|
spec:
|
||||||
|
selector:
|
||||||
|
app: mailu-admin
|
||||||
|
role: mail
|
||||||
|
tier: backend
|
||||||
|
ports:
|
||||||
|
- name: http
|
||||||
|
port: 80
|
||||||
|
protocol: TCP
|
@ -0,0 +1,80 @@
|
|||||||
|
---
|
||||||
|
apiVersion: v1
|
||||||
|
kind: ConfigMap
|
||||||
|
metadata:
|
||||||
|
name: nginx-ingress-conf
|
||||||
|
namespace: kube-system
|
||||||
|
labels:
|
||||||
|
k8s-app: nginx-ingress-controller
|
||||||
|
data:
|
||||||
|
25: "default/smtp:25"
|
||||||
|
465: "default/smtp:465"
|
||||||
|
587: "default/smtp:587"
|
||||||
|
143: "default/imap:143"
|
||||||
|
993: "default/imap:993"
|
||||||
|
|
||||||
|
---
|
||||||
|
apiVersion: extensions/v1beta1
|
||||||
|
kind: Deployment
|
||||||
|
metadata:
|
||||||
|
name: nginx-ingress-controller
|
||||||
|
labels:
|
||||||
|
k8s-app: nginx-ingress-controller
|
||||||
|
namespace: kube-system
|
||||||
|
spec:
|
||||||
|
replicas: 1
|
||||||
|
template:
|
||||||
|
metadata:
|
||||||
|
labels:
|
||||||
|
k8s-app: nginx-ingress-controller
|
||||||
|
annotations:
|
||||||
|
prometheus.io/port: '10254'
|
||||||
|
prometheus.io/scrape: 'true'
|
||||||
|
spec:
|
||||||
|
# hostNetwork makes it possible to use ipv6 and to preserve the source IP correctly regardless of docker configuration
|
||||||
|
# however, it is not a hard dependency of the nginx-ingress-controller itself and it may cause issues if port 10254 already is taken on the host
|
||||||
|
# that said, since hostPort is broken on CNI (https://github.com/kubernetes/kubernetes/issues/31307) we have to use hostNetwork where CNI is used
|
||||||
|
# like with kubeadm
|
||||||
|
# hostNetwork: true
|
||||||
|
terminationGracePeriodSeconds: 60
|
||||||
|
containers:
|
||||||
|
- image: gcr.io/google_containers/nginx-ingress-controller:0.9.0-beta.11
|
||||||
|
name: nginx-ingress-controller
|
||||||
|
readinessProbe:
|
||||||
|
httpGet:
|
||||||
|
path: /healthz
|
||||||
|
port: 10254
|
||||||
|
scheme: HTTP
|
||||||
|
livenessProbe:
|
||||||
|
httpGet:
|
||||||
|
path: /healthz
|
||||||
|
port: 10254
|
||||||
|
scheme: HTTP
|
||||||
|
initialDelaySeconds: 10
|
||||||
|
timeoutSeconds: 1
|
||||||
|
ports:
|
||||||
|
- containerPort: 25
|
||||||
|
hostPort: 25
|
||||||
|
- containerPort: 443
|
||||||
|
hostPort: 443
|
||||||
|
- containerPort: 143
|
||||||
|
hostPort: 143
|
||||||
|
- containerPort: 465
|
||||||
|
hostPort: 465
|
||||||
|
- containerPort: 587
|
||||||
|
hostPort: 587
|
||||||
|
- containerPort: 993
|
||||||
|
hostPort: 993
|
||||||
|
env:
|
||||||
|
- name: POD_NAME
|
||||||
|
valueFrom:
|
||||||
|
fieldRef:
|
||||||
|
fieldPath: metadata.name
|
||||||
|
- name: POD_NAMESPACE
|
||||||
|
valueFrom:
|
||||||
|
fieldRef:
|
||||||
|
fieldPath: metadata.namespace
|
||||||
|
args:
|
||||||
|
- /nginx-ingress-controller
|
||||||
|
- --default-backend-service=$(POD_NAMESPACE)/default-http-backend
|
||||||
|
- --tcp-services-configmap=$(POD_NAMESPACE)/nginx-ingress-conf
|
Loading…
Reference in New Issue