Initial commit
commit
2e36d75bb6
@ -0,0 +1,10 @@
|
|||||||
|
```yml
|
||||||
|
- role: "mailcow"
|
||||||
|
vars:
|
||||||
|
mailcow_repo_dir: "/opt/mailcow-dockerized"
|
||||||
|
mailcow_dockerized_commit: "586b3a2ed1c"
|
||||||
|
mailcow_hostname_fqdn: "mail.strona-czynna.pl"
|
||||||
|
mailcow_storage_dir: "/mnt/juice/mailcow"
|
||||||
|
mailcow_local_http_port: "9001"
|
||||||
|
mailcow_timezone: "Europe/Warsaw"
|
||||||
|
```
|
||||||
@ -0,0 +1,6 @@
|
|||||||
|
mailcow_repo_dir: "/opt/mailcow-dockerized"
|
||||||
|
mailcow_dockerized_commit: "586b3a2ed1c"
|
||||||
|
mailcow_hostname_fqdn: "mail.strona-czynna.pl"
|
||||||
|
mailcow_storage_dir: "/mnt/juice/mailcow"
|
||||||
|
mailcow_local_http_port: "9001"
|
||||||
|
mailcow_timezone: "Europe/Warsaw"
|
||||||
@ -0,0 +1,17 @@
|
|||||||
|
---
|
||||||
|
galaxy_info:
|
||||||
|
author: kuba
|
||||||
|
description: Setup mailcow on a VPS
|
||||||
|
license: MIT
|
||||||
|
min_ansible_version: "2.12"
|
||||||
|
platforms:
|
||||||
|
- name: Debian
|
||||||
|
versions:
|
||||||
|
- bullseye
|
||||||
|
- bookworm
|
||||||
|
- name: Ubuntu
|
||||||
|
versions:
|
||||||
|
- focal
|
||||||
|
- jammy
|
||||||
|
|
||||||
|
dependencies: []
|
||||||
@ -0,0 +1,15 @@
|
|||||||
|
## The playbook first runs the 'backup.yml' from each role
|
||||||
|
- name: create the /backup-dirs file
|
||||||
|
file:
|
||||||
|
path: "/backup-dirs"
|
||||||
|
state: "touch"
|
||||||
|
mode: "0400"
|
||||||
|
changed_when: "true" # we always want ti give roles a chance to register dirs
|
||||||
|
|
||||||
|
- ansible.builtin.lineinfile:
|
||||||
|
path: "/backup-dirs"
|
||||||
|
line: "{{ mailcow_storage_dir }}"
|
||||||
|
|
||||||
|
- ansible.builtin.lineinfile:
|
||||||
|
path: "/backup-dirs"
|
||||||
|
line: "{{ mailcow_repo_dir }}"
|
||||||
@ -0,0 +1,101 @@
|
|||||||
|
- name: Install required system packages # https://docs.mailcow.email/getstarted/install/
|
||||||
|
apt:
|
||||||
|
name:
|
||||||
|
- git
|
||||||
|
- openssl
|
||||||
|
- curl
|
||||||
|
- grep
|
||||||
|
- jq
|
||||||
|
state: latest
|
||||||
|
update_cache: true
|
||||||
|
|
||||||
|
- name: Open the necessary ports
|
||||||
|
community.general.ufw:
|
||||||
|
rule: allow
|
||||||
|
port: "{{item}}"
|
||||||
|
loop:
|
||||||
|
- 25
|
||||||
|
- 465
|
||||||
|
- 587
|
||||||
|
- 143
|
||||||
|
- 993
|
||||||
|
- 110
|
||||||
|
- 995
|
||||||
|
- 4190
|
||||||
|
|
||||||
|
- name: "Make sure that the storage dir exists"
|
||||||
|
file:
|
||||||
|
path: "{{ mailcow_storage_dir }}"
|
||||||
|
state: "directory"
|
||||||
|
|
||||||
|
- name: "Make sure that the storage dir exists for each volume"
|
||||||
|
file:
|
||||||
|
path: "{{ mailcow_storage_dir }}/{{item}}"
|
||||||
|
state: "directory"
|
||||||
|
loop:
|
||||||
|
- vmail-vol-1
|
||||||
|
- vmail-index-vol-1
|
||||||
|
- mysql-vol-1
|
||||||
|
- mysql-socket-vol-1
|
||||||
|
- redis-vol-1
|
||||||
|
- rspamd-vol-1
|
||||||
|
- postfix-vol-1
|
||||||
|
- postfix-tlspol-vol-1
|
||||||
|
- crypt-vol-1
|
||||||
|
- sogo-web-vol-1
|
||||||
|
- sogo-userdata-backup-vol-1
|
||||||
|
- clamd-db-vol-1
|
||||||
|
|
||||||
|
- name: Clone/checkout mailcow repo
|
||||||
|
ansible.builtin.git:
|
||||||
|
repo: "https://github.com/mailcow/mailcow-dockerized"
|
||||||
|
dest: "{{ mailcow_repo_dir }}"
|
||||||
|
version: "{{ mailcow_dockerized_commit }}"
|
||||||
|
update: false
|
||||||
|
|
||||||
|
- name: "Generate the config file"
|
||||||
|
shell:
|
||||||
|
cmd: "MAILCOW_HOSTNAME={{mailcow_hostname_fqdn}} MAILCOW_BRANCH=master MAILCOW_TZ={{mailcow_timezone}} ./generate_config.sh"
|
||||||
|
chdir: "{{ mailcow_repo_dir }}"
|
||||||
|
creates: "{{ mailcow_repo_dir }}/mailcow.conf"
|
||||||
|
|
||||||
|
- name: "Disable mailcow letsencrypt"
|
||||||
|
lineinfile:
|
||||||
|
path: "{{ mailcow_repo_dir }}/mailcow.conf"
|
||||||
|
regexp: "^SKIP_LETS_ENCRYPT="
|
||||||
|
line: SKIP_LETS_ENCRYPT=y
|
||||||
|
|
||||||
|
- name: "Create post-cert script for mailcow"
|
||||||
|
template:
|
||||||
|
src: "post-cert.sh"
|
||||||
|
dest: "{{ mailcow_repo_dir }}/post-cert.sh"
|
||||||
|
mode: "0777"
|
||||||
|
|
||||||
|
- name: "Setup post-cert renewal script to import certs into mailcow"
|
||||||
|
cron:
|
||||||
|
name: "import certs to mailcow"
|
||||||
|
minute: 45
|
||||||
|
hour: 2
|
||||||
|
job: "{{ mailcow_repo_dir }}/post-cert.sh"
|
||||||
|
|
||||||
|
- name: "docker compose down"
|
||||||
|
community.docker.docker_compose_v2:
|
||||||
|
state: "absent"
|
||||||
|
project_src: "{{ mailcow_repo_dir }}"
|
||||||
|
|
||||||
|
- name: Ensure HTTP_REDIRECT is set to 'n'
|
||||||
|
ansible.builtin.lineinfile:
|
||||||
|
path: "{{ mailcow_repo_dir }}/mailcow.conf" # Replace with the actual file path
|
||||||
|
regexp: "^HTTP_REDIRECT="
|
||||||
|
line: "HTTP_REDIRECT=n"
|
||||||
|
|
||||||
|
- name: "Generate docker-compose override"
|
||||||
|
template:
|
||||||
|
src: "docker-compose.override.yml.j2"
|
||||||
|
dest: "{{ mailcow_repo_dir }}/docker-compose.override.yml"
|
||||||
|
|
||||||
|
- name: "docker compose up -d mailcow"
|
||||||
|
community.docker.docker_compose_v2:
|
||||||
|
state: "present"
|
||||||
|
pull: missing
|
||||||
|
project_src: "{{ mailcow_repo_dir }}"
|
||||||
@ -0,0 +1,92 @@
|
|||||||
|
|
||||||
|
services:
|
||||||
|
nginx-mailcow:
|
||||||
|
ports: !override
|
||||||
|
- 127.0.0.1:{{mailcow_local_http_port}}:80
|
||||||
|
|
||||||
|
|
||||||
|
# Don't use the default docker volumes but instead put the data in juicefs
|
||||||
|
volumes:
|
||||||
|
vmail-vol-1:
|
||||||
|
driver: local
|
||||||
|
driver_opts:
|
||||||
|
type: none
|
||||||
|
device: {{ mailcow_storage_dir }}/vmail-vol-1
|
||||||
|
o: bind
|
||||||
|
|
||||||
|
vmail-index-vol-1:
|
||||||
|
driver: local
|
||||||
|
driver_opts:
|
||||||
|
type: none
|
||||||
|
device: {{ mailcow_storage_dir }}/vmail-index-vol-1
|
||||||
|
o: bind
|
||||||
|
|
||||||
|
mysql-vol-1:
|
||||||
|
driver: local
|
||||||
|
driver_opts:
|
||||||
|
type: none
|
||||||
|
device: {{ mailcow_storage_dir }}/mysql-vol-1
|
||||||
|
o: bind
|
||||||
|
|
||||||
|
mysql-socket-vol-1:
|
||||||
|
driver: local
|
||||||
|
driver_opts:
|
||||||
|
type: none
|
||||||
|
device: {{ mailcow_storage_dir }}/mysql-socket-vol-1
|
||||||
|
o: bind
|
||||||
|
|
||||||
|
redis-vol-1:
|
||||||
|
driver: local
|
||||||
|
driver_opts:
|
||||||
|
type: none
|
||||||
|
device: {{ mailcow_storage_dir }}/redis-vol-1
|
||||||
|
o: bind
|
||||||
|
|
||||||
|
rspamd-vol-1:
|
||||||
|
driver: local
|
||||||
|
driver_opts:
|
||||||
|
type: none
|
||||||
|
device: {{ mailcow_storage_dir }}/rspamd-vol-1
|
||||||
|
o: bind
|
||||||
|
|
||||||
|
postfix-vol-1:
|
||||||
|
driver: local
|
||||||
|
driver_opts:
|
||||||
|
type: none
|
||||||
|
device: {{ mailcow_storage_dir }}/postfix-vol-1
|
||||||
|
o: bind
|
||||||
|
|
||||||
|
postfix-tlspol-vol-1:
|
||||||
|
driver: local
|
||||||
|
driver_opts:
|
||||||
|
type: none
|
||||||
|
device: {{ mailcow_storage_dir }}/postfix-tlspol-vol-1
|
||||||
|
o: bind
|
||||||
|
|
||||||
|
crypt-vol-1:
|
||||||
|
driver: local
|
||||||
|
driver_opts:
|
||||||
|
type: none
|
||||||
|
device: {{ mailcow_storage_dir }}/crypt-vol-1
|
||||||
|
o: bind
|
||||||
|
|
||||||
|
sogo-web-vol-1:
|
||||||
|
driver: local
|
||||||
|
driver_opts:
|
||||||
|
type: none
|
||||||
|
device: {{ mailcow_storage_dir }}/sogo-web-vol-1
|
||||||
|
o: bind
|
||||||
|
|
||||||
|
sogo-userdata-backup-vol-1:
|
||||||
|
driver: local
|
||||||
|
driver_opts:
|
||||||
|
type: none
|
||||||
|
device: {{ mailcow_storage_dir }}/sogo-userdata-backup-vol-1
|
||||||
|
o: bind
|
||||||
|
|
||||||
|
clamd-db-vol-1:
|
||||||
|
driver: local
|
||||||
|
driver_opts:
|
||||||
|
type: none
|
||||||
|
device: {{ mailcow_storage_dir }}/clamd-db-vol-1
|
||||||
|
o: bind
|
||||||
@ -0,0 +1,11 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
rm "{{mailcow_repo_dir}}/data/assets/ssl/key.pem"
|
||||||
|
rm "{{mailcow_repo_dir}}/data/assets/ssl/cert.pem"
|
||||||
|
|
||||||
|
cp "/etc/letsencrypt/live/{{mailcow_hostname_fqdn}}/fullchain.pem" "{{mailcow_repo_dir}}/data/assets/ssl/cert.pem"
|
||||||
|
cp "/etc/letsencrypt/live/{{mailcow_hostname_fqdn}}/privkey.pem" "{{mailcow_repo_dir}}/data/assets/ssl/key.pem"
|
||||||
|
|
||||||
|
postfix_c=$(/usr/bin/docker ps -qaf name=postfix-mailcow)
|
||||||
|
dovecot_c=$(/usr/bin/docker ps -qaf name=dovecot-mailcow)
|
||||||
|
nginx_c=$(/usr/bin/docker ps -qaf name=nginx-mailcow)
|
||||||
|
/usr/bin/docker restart ${postfix_c} ${dovecot_c} ${nginx_c}
|
||||||
Loading…
Reference in New Issue