-
Products and Features
- How to Create and Manage VPC on CloudRaya
- Getting Started with CloudRaya Container Registry
- How to use Sudo on a CloudRaya Linux VM
- Keeping Your CloudRaya Linux VMs Up-to-Date
- Maximizing StorageRaya with Essential Practices
- Assign Multiple IP Addresses to Virtual Machine
- Generating a CloudRaya API key
- Simplify CloudRaya Management with API
- Deploying a Virtual Machine on CloudRaya
- Deploying a Kubernetes Cluster on KubeRaya
- Using StorageRaya – CloudRaya S3 Object Storage
- Opening Ping Access on Cloud Raya VM Public IP
- Maximize Your Storage Raya Access Speed with Content Delivery Network (CDN)
- How to Create Project Tag in Cloud Raya for More Organized VM Billing Report
- Exporting Cloud Raya VM to outer Cloud Raya's Infrastructure using Acronis Cyber Protect
- SSO Management on Cloud Raya
- Using the SSH key Feature in Cloud Raya Dashboard
- Cloud Raya Load Balancer, Solution to Distribute Load Equally
- Create your own VPN server with DNS-Level AdBlocker using PiVPN
- Fix Broken LetsEncrypt SSL Certificate due to Expired Root CA Certificate
- How to Make a Snapshot and Configure VM Backup in Cloud Raya
- How to Request Services or Licenses Products
- Adding, Attaching, and Resize Root Storage Disk in Cloud Raya VPS
- Managing your DNS Zone with DNS Bucket in Cloud Raya
- Create VM, Custom Package, Reinstall VM, and Adjusting Security Profile
- How to backup Linux VM via Acronis in Cloud Raya
- How to Backup Desktop Linux and Windows via Acronis in Cloud Raya
- Backing-Up Cloud Raya Windows VM Using Acronis Cyber Protect
- Load Balancing in Cloud Raya
- Establishing a VPN in Cloud Raya
- Generating an API Token
- Deploying a Virtual Machine in Cloud Raya
- Show Remaining Articles17 Collapse Articles
-
- How to backup Linux VM via Acronis in Cloud Raya
- How to Backup Desktop Linux and Windows via Acronis in Cloud Raya
-
- Maximizing StorageRaya with Essential Practices
- Using StorageRaya – CloudRaya S3 Object Storage
- Building a Static Website Using Storage Raya S3 Bucket
- Integrating S3 Storage Raya and Strapi for Asset Storage Optimization – Part 4
- Maximize Your Storage Raya Access Speed with Content Delivery Network (CDN)
- Managing Storage Raya from various tools and from various OS
- Binding NextCloud with CloudRaya S3 Object Storage as External Storage Mount
-
- How to use Sudo on a CloudRaya Linux VM
- Keeping Your CloudRaya Linux VMs Up-to-Date
- Implement Multi-Factor Authentication on CloudRaya Linux VM
- Assign Multiple IP Addresses to Virtual Machine
- Deploying a Virtual Machine on CloudRaya
- Configurating cPanel Using Ubuntu 20.04 on CloudRaya – Part 2
- Deploying cPanel Using Ubuntu 20.04 on CloudRaya - Part 1
- Exporting Cloud Raya VM to outer Cloud Raya's Infrastructure using Acronis Cyber Protect
- Using the SSH key Feature in Cloud Raya Dashboard
- Adding, Attaching, and Resize Root Storage Disk in Cloud Raya VPS
- Create VM, Custom Package, Reinstall VM, and Adjusting Security Profile
- How to backup Linux VM via Acronis in Cloud Raya
- Backing-Up Cloud Raya Windows VM Using Acronis Cyber Protect
- Deploying a Virtual Machine in Cloud Raya
-
Integration
- Implement Multi-Factor Authentication on CloudRaya Linux VM
- Accessing KubeRaya Cluster Using the Kubernetes Dashboard
- Building a Static Website Using Storage Raya S3 Bucket
- Integrating S3 Storage Raya and Strapi for Asset Storage Optimization – Part 4
- Integrating Strapi Content to Frontend React - Part 3
- Content Management with Strapi Headless CMS - Part 2
- Strapi Headless CMS Installation in CloudRaya - Part. 1
- Using SSH Key on CloudRaya VM with PuTTY
- Installing Multiple PHP Versions in One VM for More Flexible Web Development
- Replatforming Apps to K8s with RKE and GitLab CI
- OpenAI API Integration: Completions in PHP
- Building an Email Server on CloudRaya Using iRedMail
- Improving Email Delivery with Sendinblue SMTP Relay
- Building a Self Hosted Password Manager Using Passbolt
- How to Install Podman on Almalinux/Rocky Linux 9
- ElkarBackup: GUI Based backup Tools based on Rsync and Rsnapshot
- Improving Webserver Performance with SSL Termination on NGINX Load Balancer
- Using NGINX as an HTTP Load Balancer
- Automating Task with Cronjob
- Upgrade Zimbra and the OS Version
- Deploy Mailu on Rancher Kubernetes
- Export and Import Database in MySQL or MariaDB Using Mysqldump
- Backup & Sync Local and Remote Directories Using RSYNC
- Managing Storage Raya from various tools and from various OS
- Binding NextCloud with CloudRaya S3 Object Storage as External Storage Mount
- Simple monitoring and alerting with Monit on Ubuntu 22.04 LTS
- VS Code on your browser! How to install code-server on a VM
- Implementing Redis HA and Auto-Failover on Cloud Raya
- Using XFCE Desktop Environment on Cloud Raya VM
- Installing Python 3.7-3.9 on Ubuntu 22.04 Jammy LTS using PPA
- Implementing Continuous Integration with Gitlab CI and Continuous Delivery with Rancher Fleet
- Using Collabora Online on Cloud Raya NextCloud's VM
- Installing NextCloud in Cloud Raya- Detail Steps from the Beginning to the Very End
- Set Up High Availability PostgreSQL Cluster Using Patroni on Cloud Raya
- Set Up WAF KEMP in Cloud Raya Part 2
- Set Up WAF KEMP in Cloud Raya Part 1
- Using the SSH key Feature in Cloud Raya Dashboard
- Monitor Your Services Uptime Using Uptime Kuma
- Hosting Static Website with Hugo on Cloud Raya
- Kubernetes Ingress Controller using SSL in CloudRaya
- Reverse Proxy management using Nginx Proxy Manager
- Create your own VPN server with DNS-Level AdBlocker using PiVPN
- How to deploy Portainer on Linux to easily manage your docker containers
- High Availability Kubernetes Using RKE in Cloud Raya Part 3
- High Availability Kubernetes Using RKE in Cloud Raya Part 2
- High Availability Kubernetes Using RKE in Cloud Raya Part 1
- How to backup Linux VM via Acronis in Cloud Raya
- How to Backup Desktop Linux and Windows via Acronis in Cloud Raya
- Deploying Magento on Cloud Raya
- How to Install Nextcloud on Cloud Raya
- How to Install CWP in Cloud Raya
- How to Install Node.js and Launch Your First Node App
- How to install and secure MariaDB on Ubuntu 18.04 and 20.04 on Cloud Raya
- How to Install and Securing MongoDB on Ubuntu 18.04 and 20.04
- Classes: Post Installation on Ansible
- Classes: Install and Configure Ansible
- Classes: Introduction to Ansible for a robust Configuration Management
- How to Setup Active Directory Domain Service & DNS with Cloud Raya
- How to Host Your Own Docker Hub in Cloud Raya
- How to Setup Your Own Laravel with Nginx in Ubuntu 18.04
- How to Deploy Container in Cloud Raya using Docker
- Securing CentOS with iptables
- Install and Configure Squid Proxy in Ubuntu
- Installing Apache and Tomcat: A Quick Way
- Securing Ubuntu with UFW
- Install a Node.js and Launch a Node App on Ubuntu 18.04
- Installing LAMP in Ubuntu
- Installing LEMP Stack on Ubuntu 18.04
- Show Remaining Articles53 Collapse Articles
-
- Articles coming soon
-
- Implement Multi-Factor Authentication on CloudRaya Linux VM
- Configurating cPanel Using Ubuntu 20.04 on CloudRaya – Part 2
- Deploying cPanel Using Ubuntu 20.04 on CloudRaya - Part 1
- Integrating S3 Storage Raya and Strapi for Asset Storage Optimization – Part 4
- Integrating Strapi Content to Frontend React - Part 3
- Content Management with Strapi Headless CMS - Part 2
- Strapi Headless CMS Installation in CloudRaya - Part. 1
- Using SSH Key on CloudRaya VM with PuTTY
- Building an Email Server on CloudRaya Using iRedMail
- Improving Email Delivery with Sendinblue SMTP Relay
- Building a Self Hosted Password Manager Using Passbolt
- ElkarBackup: GUI Based backup Tools based on Rsync and Rsnapshot
- Improving Webserver Performance with SSL Termination on NGINX Load Balancer
- Using NGINX as an HTTP Load Balancer
- Upgrade Zimbra and the OS Version
- Deploy Mailu on Rancher Kubernetes
- Managing Storage Raya from various tools and from various OS
- Binding NextCloud with CloudRaya S3 Object Storage as External Storage Mount
- Simple monitoring and alerting with Monit on Ubuntu 22.04 LTS
- VS Code on your browser! How to install code-server on a VM
- Implementing Redis HA and Auto-Failover on Cloud Raya
- Using XFCE Desktop Environment on Cloud Raya VM
- Implementing Continuous Integration with Gitlab CI and Continuous Delivery with Rancher Fleet
- Using Collabora Online on Cloud Raya NextCloud's VM
- Installing NextCloud in Cloud Raya- Detail Steps from the Beginning to the Very End
- Set Up WAF KEMP in Cloud Raya Part 2
- Set Up WAF KEMP in Cloud Raya Part 1
- Monitor Your Services Uptime Using Uptime Kuma
- Create your own VPN server with DNS-Level AdBlocker using PiVPN
- How to deploy Portainer on Linux to easily manage your docker containers
- High Availability Kubernetes Using RKE in Cloud Raya Part 3
- High Availability Kubernetes Using RKE in Cloud Raya Part 2
- High Availability Kubernetes Using RKE in Cloud Raya Part 1
- How to Install Nextcloud on Cloud Raya
- Classes: Post Installation on Ansible
- Classes: Install and Configure Ansible
- Classes: Introduction to Ansible for a robust Configuration Management
- Connect Windows Active Directory on Cloud Raya with Azure AD
- How to Host Your Own Docker Hub in Cloud Raya
- How to Deploy Container in Cloud Raya using Docker
- Show Remaining Articles25 Collapse Articles
-
- Accessing KubeRaya Cluster Using the Kubernetes Dashboard
- Integrating S3 Storage Raya and Strapi for Asset Storage Optimization – Part 4
- Integrating Strapi Content to Frontend React - Part 3
- Content Management with Strapi Headless CMS - Part 2
- Strapi Headless CMS Installation in CloudRaya - Part. 1
- Creating Interactive Chatbot with OpenAI API in PHP
- Installing Multiple PHP Versions in One VM for More Flexible Web Development
- OpenAI API Integration: Completions in PHP
- Improving Webserver Performance with SSL Termination on NGINX Load Balancer
- Using NGINX as an HTTP Load Balancer
- Automating Task with Cronjob
- How to Deploy Django App on Cloud Raya VM Using Gunicorn, Supervisor, and Nginx
- How to Install Node.js and Launch Your First Node App
- How to Setup Your Own Laravel with Nginx in Ubuntu 18.04
- Install a Node.js and Launch a Node App on Ubuntu 18.04
-
- How to use Sudo on a CloudRaya Linux VM
- Keeping Your CloudRaya Linux VMs Up-to-Date
- Implement Multi-Factor Authentication on CloudRaya Linux VM
- Using SSH Key on CloudRaya VM with PuTTY
- Building a Self Hosted Password Manager Using Passbolt
- Improving Webserver Performance with SSL Termination on NGINX Load Balancer
- Export and Import Database in MySQL or MariaDB Using Mysqldump
- Backup & Sync Local and Remote Directories Using RSYNC
- How to Deploy Django App on Cloud Raya VM Using Gunicorn, Supervisor, and Nginx
- Set Up WAF KEMP in Cloud Raya Part 2
- Set Up WAF KEMP in Cloud Raya Part 1
- Using the SSH key Feature in Cloud Raya Dashboard
- How to backup Linux VM via Acronis in Cloud Raya
- How to Backup Desktop Linux and Windows via Acronis in Cloud Raya
- Securing CentOS with iptables
- Securing Ubuntu with UFW
- Show Remaining Articles1 Collapse Articles
-
- Configurating cPanel Using Ubuntu 20.04 on CloudRaya – Part 2
- Deploying cPanel Using Ubuntu 20.04 on CloudRaya - Part 1
- Integrating S3 Storage Raya and Strapi for Asset Storage Optimization – Part 4
- Integrating Strapi Content to Frontend React - Part 3
- Content Management with Strapi Headless CMS - Part 2
- Strapi Headless CMS Installation in CloudRaya - Part. 1
- Creating Interactive Chatbot with OpenAI API in PHP
- Installing Multiple PHP Versions in One VM for More Flexible Web Development
- Building an Email Server on CloudRaya Using iRedMail
- Building a Self Hosted Password Manager Using Passbolt
- Improving Webserver Performance with SSL Termination on NGINX Load Balancer
- Using NGINX as an HTTP Load Balancer
- Installing Python 3.7-3.9 on Ubuntu 22.04 Jammy LTS using PPA
- Reverse Proxy management using Nginx Proxy Manager
- Install and Configure Squid Proxy in Ubuntu
- Installing Apache and Tomcat: A Quick Way
- Installing LAMP in Ubuntu
- Installing LEMP Stack on Ubuntu 18.04
- Show Remaining Articles3 Collapse Articles
-
- Building a Static Website Using Storage Raya S3 Bucket
- Integrating S3 Storage Raya and Strapi for Asset Storage Optimization – Part 4
- Integrating Strapi Content to Frontend React - Part 3
- Content Management with Strapi Headless CMS - Part 2
- Strapi Headless CMS Installation in CloudRaya - Part. 1
- Creating Interactive Chatbot with OpenAI API in PHP
- Installing Multiple PHP Versions in One VM for More Flexible Web Development
- OpenAI API Integration: Completions in PHP
- Hosting Static Website with Hugo on Cloud Raya
- Deploying Magento on Cloud Raya
- How to Install CWP in Cloud Raya
- How to Setup Active Directory Domain Service & DNS with Cloud Raya
-
- Articles coming soon
Deploy Mailu on Rancher Kubernetes
Mailu is a simple yet comprehensive mail server as a set of Docker images that is very easy to use. Another perks of using mailu is that, it is an open-source mail server, free to use for everyone.
This article would show you easy deployment step of mailu on Rancher Kubernetes.
Prerequisite:
- Please enable DNSSEC on your nameserver and add it to your domain registrar (Reff link to enable DNSSEC on CloudFlare nameserver).
- Set up the Rancher Kubernetes cluster or a single node cluster (adjusting your cluster.yml file).
System Preparation:
- OS: Ubuntu 22.04
- Docker Version: 20.10.x
- RAM: 8GB Memory
- vCPU: 6 Core
- Single node host
K8s Environment Set:
1. Install helm and kubectl on Ubuntu host using Snap package manager
snap install helm --classic -y && snap install kubectl --classic -y
2. Copy the API generated by the RKE (Rancher Kubernetes Engine) Kubernetes cluster to the kubectl config located in /root/.kube/config
(create the config file if necessary). Then verify the kubectl connection.
3. Create a new project namespace on your rancher (e.g. mail-server namespace)
4. Deploy longhorn on the related rancher project and set the replica to 1. Depending on the node in the Kubernetes cluster, you might want to increase the replica to the number of the worker nodes. The longhorn will be used as the storageclass in Rancher Kubernetes Cluster.
Mailu Installation
- Add the repository via:
helm repo add mailu https://mailu.github.io/helm-charts/
- Create a local values file:
helm show values mailu/mailu > values.yaml
- Edit the
values.yaml
to reflect your environment. The full setup example could be seen in the following code:
# Default values for mailu.
# A list of mail hostnames is required. The first will be used as primary mail hostname
hostnames:
- mailu.example.com # Please use your real domain
# The mail domain is required. See https://github.com/Mailu/Mailu/blob/master/docs/faq.rst#what-is-the-difference-between-domain-and-hostnames
domain: example.com # Please use your real domain
# The secret key is required for protecting authentication cookies and must be set individually for each deployment
# secretKey: chang3m3!
secretKey: chang3m3!
# An initial account can automatically be created:
initialAccount:
username: mailadmin
domain: example.com
password: chang3m3!
nameOverride: ""
fullnameOverride: ""
clusterDomain: cluster.local
nodeSelector: {}
# Tolerations for pod assignment
# Ref: https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/
tolerations: {}
# Affinity for pod assignment
# Ref: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#affinity-and-anti-affinity
affinity: {}
database:
# type of the database for mailu (sqlite or mysql)
# default database is an embedded sqlite
# for mysql, see settings below
type: sqlite
# type of the database for roundcube (sqlite or mysql)
# default database is an embedded sqlite
# for mysql, see settings below
roundcubeType: sqlite
# For mysql/mariadb use the following config:
# Set the host to use an external database.
# If not host is set, a database instance is created by this chart.
# type: mysql
mysql: {}
# host: external-db-hostname
# root password for mysql database
# rootPassword: chang3m3! # can only be set for embedded mysql
# settings for mailu (required if mailu database type is "mysql")
# database: mailu
# user: mailu
# password: chang3m3!
# For an external PostgreSQL database, use the following config:
postgresql: {}
# host: external-db-hostname
# database: mailu
# user: mailu
# password: chang3m3!
# settings for roundcube (required if roundcube database type is "mysql" or "postgresql")
# roundcubeDatabase: roundcube
# roundcubeUser: roundcube
# roundcubePassword: chang3m3!
external_relay: {}
# host: "[domain.tld]:port"
# username: username
# password: SECRET
# # username and password can also be stored as secret:
# secretName: external-relay-secret
# usernameKey: username
# passwordKey: password
persistence:
# Setings for a single volume for all apps
# set single_pvc: false to use a per app volume and set the properties in <app>.persistence (ex. admin.persistence)
single_pvc: true
size: 70Gi
accessMode: ReadWriteOnce
#annotations:
# "helm.sh/resource-policy": keep
#hostPath: /path/on/the/host
#existingClaim: name-of-existing.claim
#storageClass: "-"
storageClass: "longhorn"
#claimNameOverride: mailu-pvc
# Change this if you're using different address ranges for pods
subnet: 10.42.0.0/16
# Version of mailu docker images to use when not specified otherwise
mailuVersion: 1.9.26
#mailuVersion: 1.8
# default log level. can be overridden globally or per service
logLevel: WARNING
# local part of the postmaster email address (Mailu will use @$DOMAIN as domain part)
postmaster: postmaster
mail:
messageSizeLimitInMegabytes: 50
# Configuration to prevent brute-force attacks. See the documentation for further information: https://mailu.io/master/configuration.html
authRatelimitIP: 60/hour
authRatelimitIPv4Mask: 24
authRatelimitIPv6Mask: 56
authRatelimitUser: 100/day
authRatelimitExemtionLength: 86400
# authRatelimitExemtion:
# Configuration to reduce outgoing spam in case of an compromised account. See the documentation for further information: https://mailu.io/1.9/configuration.html?highlight=MESSAGE_RATELIMIT
messageRatelimit: 200/day
# messageRatelimitExemption:
# certmanager settings
certmanager:
enabled: true
issuerType: ClusterIssuer
issuerName: letsencrypt
apiVersion: cert-manager.io/v1
# Set ingress and loadbalancer config
ingress:
externalIngress: true
tlsFlavor: cert
className: ""
annotations:
nginx.ingress.kubernetes.io/proxy-body-size: "0"
realIpHeader: X-Forwarded-For
realIpFrom: 0.0.0.0/0
# Frontend load balancer for non-HTTP(s) services
front:
# logLevel: WARNING
image:
repository: mailu/nginx
# tag defaults to mailuVersion
# tag: master
resources:
requests:
memory: 100Mi
cpu: 100m
limits:
memory: 200Mi
cpu: 200m
startupProbe:
periodSeconds: 10
failureThreshold: 30
timeoutSeconds: 5
livenessProbe:
periodSeconds: 10
failureThreshold: 3
timeoutSeconds: 5
readinessProbe:
periodSeconds: 10
failureThreshold: 1
timeoutSeconds: 5
# Deployment or DaemonSet
controller:
kind: Deployment
nodeSelector: {}
# Expose front mail ports via hostPort
hostPort:
enabled: true
# Expose front mail ports via external service (ClusterIP or LoadBalancer)
externalService:
enabled: false
type: ClusterIP
# LoadBalancer
# type: LoadBalancer
# loadBalancerIP:
externalTrafficPolicy: Local
annotations: {}
pop3:
pop3: false
pop3s: true
imap:
imap: false
imaps: true
smtp:
smtp: true
smtps: true
submission: true
admin:
# logLevel: WARNING
image:
repository: mailu/admin
# tag defaults to mailuVersion
# tag: master
persistence:
size: 6Gi
storageClass: ""
accessMode: ReadWriteOnce
claimNameOverride: ""
#annotations:
# "helm.sh/resource-policy": keep
resources:
requests:
memory: 500Mi
cpu: 100m
limits:
memory: 500Mi
cpu: 100m
podAnnotations: {}
startupProbe:
periodSeconds: 10
failureThreshold: 30
timeoutSeconds: 5
livenessProbe:
periodSeconds: 10
failureThreshold: 3
timeoutSeconds: 5
readinessProbe:
periodSeconds: 10
failureThreshold: 1
timeoutSeconds: 5
redis:
image:
repository: redis
tag: 5-alpine
persistence:
size: 6Gi
storageClass: ""
accessMode: ReadWriteOnce
claimNameOverride: ""
#annotations:
# "helm.sh/resource-policy": keep
resources:
requests:
memory: 200Mi
cpu: 100m
limits:
memory: 300Mi
cpu: 200m
startupProbe:
periodSeconds: 10
failureThreshold: 30
timeoutSeconds: 5
livenessProbe:
periodSeconds: 10
failureThreshold: 3
timeoutSeconds: 5
readinessProbe:
periodSeconds: 10
failureThreshold: 1
timeoutSeconds: 5
postfix:
# logLevel: WARNING
image:
repository: mailu/postfix
# tag defaults to mailuVersion
# tag: master
containerSecurityContext: {}
# CRI-O users will need to add the following:
# capabilities:
# add:
# - SYS_CHROOT
persistence:
size: 6Gi
storageClass: ""
accessMode: ReadWriteOnce
claimNameOverride: ""
#annotations:
# "helm.sh/resource-policy": keep
resources:
requests:
memory: 2Gi
cpu: 500m
limits:
memory: 2Gi
cpu: 500m
startupProbe:
periodSeconds: 10
failureThreshold: 30
timeoutSeconds: 5
livenessProbe:
periodSeconds: 10
failureThreshold: 3
timeoutSeconds: 5
readinessProbe:
periodSeconds: 10
failureThreshold: 1
timeoutSeconds: 5
dovecot:
enabled: true
# logLevel: WARNING
image:
repository: mailu/dovecot
# tag defaults to mailuVersion
# tag: master
containerSecurityContext: {}
# CRI-O users will need to add the following:
# capabilities:
# add:
# - SYS_CHROOT
persistence:
size: 6Gi
storageClass: ""
accessMode: ReadWriteOnce
claimNameOverride: ""
#annotations:
# "helm.sh/resource-policy": keep
resources:
requests:
memory: 500Mi
cpu: 500m
limits:
memory: 500Mi
cpu: 500m
startupProbe:
periodSeconds: 10
failureThreshold: 30
timeoutSeconds: 5
livenessProbe:
periodSeconds: 10
failureThreshold: 3
timeoutSeconds: 5
readinessProbe:
periodSeconds: 10
failureThreshold: 1
timeoutSeconds: 5
# enable dovecot overrides
# overrides:
# dovecot.conf: |
# # More info here: https://mailu.io/1.8/kubernetes/mailu/index.html#dovecot
# mail_nfs_index = yes
# mail_nfs_storage = yes
# mail_fsync = always
# mmap_disable = yes
# mail_max_userip_connections=100
# historically rspamd and clamav shared their volumes in this chart
# this isn't needed anymore. to maintain backward compatibility and give users
# some time to migrate we keep this here.
#
# if you want a "shared" volume keep in mind you have to use affinity rules on
# rspamd and clamav pods so that both pods are scheduled on the same node
# to keep RWO volumes working
#
# otherwise set rspamd_clamav_persistence.single_pvc to true and review
# rspamd.persistence and clamav.persistence
rspamd_clamav_persistence:
size: 6Gi
storageClass: ""
accessMode: ReadWriteOnce
claimNameOverride: ""
single_pvc: false
#annotations:
# "helm.sh/resource-policy": keep
rspamd:
# logLevel: WARNING
image:
repository: mailu/rspamd
# tag defaults to mailuVersion
# tag: master
persistence:
size: 1Gi
storageClass: ""
accessMode: ReadWriteOnce
claimNameOverride: ""
#annotations:
# "helm.sh/resource-policy": keep
resources:
requests:
memory: 300Mi
cpu: 300m
limits:
memory: 300Mi
cpu: 300m
startupProbe: # give it 15 minutes for initial rule compilation
periodSeconds: 10
failureThreshold: 90
timeoutSeconds: 5
livenessProbe:
periodSeconds: 10
failureThreshold: 3
timeoutSeconds: 5
readinessProbe:
periodSeconds: 10
failureThreshold: 1
timeoutSeconds: 5
clamav:
enabled: true
# logLevel: WARNING
image:
repository: mailu/clamav
# tag defaults to mailuVersion
# tag: master
persistence:
size: 2Gi
storageClass: ""
accessMode: ReadWriteOnce
claimNameOverride: ""
#annotations:
# "helm.sh/resource-policy": keep
resources:
requests:
memory: 1Gi
cpu: 1000m
limits:
memory: 2Gi
cpu: 1000m
startupProbe: # give it 10 minutes for initial freshclam update
periodSeconds: 10
failureThreshold: 60
timeoutSeconds: 5
livenessProbe:
periodSeconds: 10
failureThreshold: 3
timeoutSeconds: 5
readinessProbe:
periodSeconds: 10
failureThreshold: 1
timeoutSeconds: 5
# clamav must share a volume with rspamd. This is usually enforced by the volume itself (RWO). If you use RWM volumes and want to
# have clamav running on the same node, add the following affinity rule:
# affinity:
# podAffinity:
# requiredDuringSchedulingIgnoredDuringExecution:
# - labelSelector:
# matchExpressions:
# - key: component
# operator: In
# values:
# - rspamd
# topologyKey: kubernetes.io/hostname
roundcube:
enabled: true
# logLevel: WARNING
image:
repository: mailu/roundcube
# tag defaults to mailuVersion
# tag: master
persistence:
size: 6Gi
storageClass: ""
accessMode: ReadWriteOnce
claimNameOverride: ""
#annotations:
# "helm.sh/resource-policy": keep
uri: /roundcube
resources:
requests:
memory: 100Mi
cpu: 100m
limits:
memory: 200Mi
cpu: 200m
startupProbe:
periodSeconds: 10
failureThreshold: 30
timeoutSeconds: 5
livenessProbe:
periodSeconds: 10
failureThreshold: 3
timeoutSeconds: 5
readinessProbe:
periodSeconds: 10
failureThreshold: 1
timeoutSeconds: 5
webdav:
enabled: false
# logLevel: WARNING
image:
repository: mailu/radicale
# tag defaults to mailuVersion
# tag: master
persistence:
size: 6Gi
storageClass: ""
accessMode: ReadWriteOnce
claimNameOverride: ""
#annotations:
# "helm.sh/resource-policy": keep
startupProbe:
periodSeconds: 10
failureThreshold: 30
timeoutSeconds: 5
livenessProbe:
periodSeconds: 10
failureThreshold: 3
timeoutSeconds: 5
readinessProbe:
periodSeconds: 10
failureThreshold: 1
timeoutSeconds: 5
mysql:
image:
repository: library/mariadb
tag: 10.4.10
persistence:
size: 6Gi
storageClass: ""
accessMode: ReadWriteOnce
claimNameOverride: ""
#annotations:
# "helm.sh/resource-policy": keep
resources:
requests:
memory: 256Mi
cpu: 100m
limits:
memory: 512Mi
cpu: 200m
startupProbe:
periodSeconds: 10
failureThreshold: 30
timeoutSeconds: 5
livenessProbe:
periodSeconds: 10
failureThreshold: 3
timeoutSeconds: 5
readinessProbe:
periodSeconds: 10
failureThreshold: 1
timeoutSeconds: 5
fetchmail:
enabled: false
# logLevel: WARNING
image:
repository: mailu/fetchmail
# tag defaults to mailuVersion
# tag: master
persistence:
size: 6Gi
storageClass: ""
accessMode: ReadWriteOnce
claimNameOverride: ""
#annotations:
# "helm.sh/resource-policy": keep
resources:
requests:
memory: 100Mi
cpu: 100m
limits:
memory: 200Mi
cpu: 200m
delay: 600
Key Takeaways
There are three keys that are required to be fulfilled.
Those are the hostname, the domain name, secret key and the initial account
# A list of mail hostnames is required. The first will be used as primary mail hostname
hostnames:
# - mail.example.com
# - imap.example.com
- mailu.example.com # Please use your real domain
# The mail domain is required. See https://github.com/Mailu/Mailu/blob/master/docs/faq.rst#what-is-the-difference-between-domain-and-hostnames
domain: example.com # Please use your real domain
# The secret key is required for protecting authentication cookies and must be set individually for each deployment
# secretKey: chang3m3!
secretKey: chang3m3!
# An initial account can automatically be created:
initialAccount:
username: mailadmin
domain: example.com # Please use your real domain
password: chang3m3!
References:
Functionality Test
- IMAP Sending and Receiving test
Webmail
Thunderbird Mail Client
- POP3 Sending and Receiving Test
Conclusion
There you have deployed a mail server based on a container environment. Now, you have an mail server that has been engaged with future DevOps environments. If you have further questions regarding this tutorial, freely put the questions on the comment section below.
Check other tutorials that might benefits you on our knowledge base, or you can get more of tech insights on Cloud Raya blog.