From f24ff692b6dc92ea2b44724f7ebf05cd299d3a35 Mon Sep 17 00:00:00 2001 From: Ido S <50456099+idoio@users.noreply.github.com> Date: Sat, 11 Dec 2021 18:52:11 +0200 Subject: [PATCH] iRedMail - Open Source Mail Server (#577) * iRedMail - Open Source Mail Server * Formatted with prettier^2.0.5 * Local Check - iredmail.yml Co-authored-by: Ido s --- public/v4/apps/iredmail.yml | 203 +++++++++++++++++++++++++++++++++++ public/v4/logos/iredmail.png | Bin 0 -> 17610 bytes 2 files changed, 203 insertions(+) create mode 100644 public/v4/apps/iredmail.yml create mode 100644 public/v4/logos/iredmail.png diff --git a/public/v4/apps/iredmail.yml b/public/v4/apps/iredmail.yml new file mode 100644 index 0000000..8d506a5 --- /dev/null +++ b/public/v4/apps/iredmail.yml @@ -0,0 +1,203 @@ +captainVersion: 4 +services: + $$cap_appname: + ports: + - '25:25' + - '110:110' + - '143:143' + - '465:465' + - '587:587' + - '993:993' + - '995:995' + volumes: + - /etc/localtime:/etc/localtime + - $$cap_appname-data-backup-mysql:/var/vmail/backup/mysql + - $$cap_appname-data-mailboxes:/var/vmail/vmail1 + - $$cap_appname-data-mlmmj:/var/vmail/mlmmj + - $$cap_appname-data-mlmmj-archive:/var/vmail/mlmmj-archive + - $$cap_appname-data-imapsieve-copy:/var/vmail/imapsieve_copy + - $$cap_appname-data-custom:/opt/iredmail/custom + - $$cap_appname-data-ssl:/opt/iredmail/ssl + - $$cap_appname-data-mysql:/var/lib/mysql + - $$cap_appname-data-clamav:/var/lib/clamav + - $$cap_appname-data-sa-rules:/var/lib/spamassassin + - $$cap_appname-data-postfix-queue:/var/spool/postfix + restart: always + caproverExtra: + dockerfileLines: + - ARG VERSION=stable + - FROM iredmail/mariadb:$VERSION + - WORKDIR /iredmail + - ARG FIRST_MAIL_DOMAIN + - ARG HOSTNAME=mail.$FIRST_MAIL_DOMAIN + - ARG FIRST_MAIL_DOMAIN_ADMIN_PASSWORD=1234 + - ARG MLMMJADMIN_API_TOKEN + - ARG ROUNDCUBE_DES_KEY + - ARG ADMIN_VIRSION=NoChange + - ENV ADMIN_VIRSION=$ADMIN_VIRSION + - ENV FIRST_MAIL_DOMAIN=$FIRST_MAIL_DOMAIN + - ENV HOSTNAME=$HOSTNAME + - ENV FIRST_MAIL_DOMAIN_ADMIN_PASSWORD=$FIRST_MAIL_DOMAIN_ADMIN_PASSWORD + - ENV MLMMJADMIN_API_TOKEN=$MLMMJADMIN_API_TOKEN + - ENV ROUNDCUBE_DES_KEY=ROUNDCUBE_DES_KEY + - >- + RUN echo "if [\"$ADMIN_VIRSION\" != \"NoChange\" && \"$ADMIN_VIRSION\" + != \"\$(ls /opt/www/ | grep 'iRedAdmin-' | cut -d'-' -f2)\"]; then + wget -c -q + https://github.com/iredmail/iRedAdmin/archive/$ADMIN_VIRSION.tar.gz && + tar xzf $ADMIN_VIRSION.tar.gz -C /opt/www && rm -f + $ADMIN_VIRSION.tar.gz && cp -R -f /opt/www/iRedAdmin-$ADMIN_VIRSION/* + /opt/www/iredadmin && sleep 1; rm -r + /opt/www/iRedAdmin-$ADMIN_VIRSION; fi" >> build.sh + - RUN sh build.sh && rm build.sh + - >- + RUN cat /opt/www/iredadmin/templates/default/layout.html | replace + '
  • Webmail
  • - + ARG fix_http="\"server { listen 80; server_name _; include + /etc/nginx/templates/roundcube.tmpl; location ~ ^/iredadmin/(.*) + {return 301 /;}location = /iredadmin {return 301 /;} location / { + proxy_pass http://0.0.0.0:8080/; add_header Content-Security-Policy + \\\"\\\"; } location ~ \.php$ { root /opt/www/roundcubemail; include + /etc/nginx/templates/fastcgi_php.tmpl; fastcgi_param SCRIPT_FILENAME + /opt/www/roundcubemail\$fastcgi_script_name; } location ~ + ^/(bin|config|installer|logs|SQL|temp|vendor)/.* { deny all; } + location ~ + ^/(CHANGELOG|composer.json|INSTALL|jsdeps.json|LICENSE|README|UPGRADING)$ + { deny all; } location ~ ^/plugins/.*/config.inc.php.* { deny all; } + location ~ ^/plugins/enigma/home(\$|/.*) { deny all; } }\"" + - >- + ARG full_Script="rm /etc/nginx/sites-enabled/00-default-ssl.conf \\n + echo -e $fix_http >> /etc/nginx/sites-enabled/00-default-ssl.conf \\n + cd /opt/www/iredadmin \\n python3 iredadmin.py & disown" + - RUN echo $full_Script >> /docker/entrypoints/nginx.sh + - >- + RUN echo "\$config['force_https'] = false;" >> + /opt/www/roundcubemail/config/config.inc.php + - >- + ENV addHTML="\n
    \n

    MX record

    \n \n + \n \n + \n \n + \n \n \n + \n \n + \n \n + \n \n + \n \n \n \n + \n \n >\n \n \n + \n + \n \n + \n \n + \n
    NAMEPRIORITYTTLTYPEDATA
    {{ cur_domain }}1014400mx
    autodiscover.{{ cur_domain + }}1014400mx
    autoconfig.{{ cur_domain }}1014400mx
    \n

    SPF record

    \n \n + \n \n \n + \n \n \n + \n \n + \n \n \n \n
    NAMETTLTYPEDATA
    {{ cur_domain }}3600TXT\"v=spf1 mx + -all\"
    \n

    DKIM + record

    \n \n \n + \n \n + \n \n \n + \n {%set get_dns=dns_data()%}\n + \n \n \n + \n \n
    NAMETTLTYPEDATA
    dkim._domainkey.{{ cur_domain }}{{ + get_dns[0] }}{{ get_dns[1] }}{{ get_dns[2] }}
    \n

    SRV + record for Jabber/XMPP service

    \n \n + \n \n \n + \n \n + \n \n + \n \n \n + \n + \n \n + \n \n + \n \n + \n \n \n \n + \n \n + \n \n \n \n
    NAMETTLPORTPRIORITYWEIGHTTYPEDATA
    _xmpp-client._tcp.{{ cur_domain }}18000522205SRV
    _xmpp-server._tcp.{{ cur_domain + }}18000526905SRV
    \n

    *You + also need to setup reverse PTR record for server IP address. Documentation.

    \n \n
    " + - >- + RUN cat /opt/www/iredadmin/templates/default/sql/domain/profile.html | + replace 'id=\"profile_general\">' 'id="profile_general">addHTML' | tee + /opt/www/iredadmin/templates/default/sql/domain/profile.html + - >- + RUN echo "import os\nf = + open('/opt/www/iredadmin/templates/default/sql/domain/profile.html', + 'r')\nprint(f.read().replace('addHTML', + os.environ['addHTML'].replace('\\\\\\\n', '\\\\n')))\nf.close()" >> + buildHTML.py + - >- + RUN python3 buildHTML.py | tee + /opt/www/iredadmin/templates/default/sql/domain/profile2.html + - RUN rm buildHTML.py + - >- + RUN cat /opt/www/iredadmin/templates/default/sql/domain/profile2.html + | tee /opt/www/iredadmin/templates/default/sql/domain/profile.html && + rm /opt/www/iredadmin/templates/default/sql/domain/profile2.html + - ENV addHTML='' + - >- + RUN cat /opt/www/iredadmin/libs/iredbase.py | replace 'jinja_env_vars + = {' "$(echo 'def dns_data():\n all_keys = os.popen("amavisd-new -c + /etc/amavis/conf.d/50-user + showkeys").read().split(".")[-1].strip()\n next__ = + all_keys.split(" ")\n text_with_remove = " + ".join(next__[3:]).strip()[:-1]\n text__ = "".join(map(lambda x: + x.strip(), text_with_remove.split("\"")))\n return [next__[0], + next__[1], text__]\njinja_env_vars = {"dns_data":dns_data,' | sed -e + $'s/\\\\n/\\\n/g')" | tee /opt/www/iredadmin/libs/iredbase.py + - RUN apt install -y amavisd-new + - EXPOSE 80 443 25 465 587 110 995 143 993 + containerHttpPort: '80' + environment: + VERSION: $$cap_iredmail_version + MLMMJADMIN_API_TOKEN: $$cap_gen_random_hex(32) + ROUNDCUBE_DES_KEY: $$cap_gen_random_hex(24) + FIRST_MAIL_DOMAIN: $$cap_root_domain + HOSTNAME: $$cap_appname.$$cap_root_domain + ADMIN_VIRSION: $$cap_iredmail_admin_version + FIRST_MAIL_DOMAIN_ADMIN_PASSWORD: $$cap_iredmail_default_password +caproverOneClickApp: + variables: + - id: $$cap_iredmail_version + label: iRedMail version tag + description: >- + Check out their Docker page for the valid tags + https://hub.docker.com/r/iredmail/mariadb/tag + defaultValue: stable + - id: $$cap_iredmail_admin_version + label: iRedMail Admin version tag + description: >- + Set 'NoChange' to stay by the docker image version + OR + Check out their GitHub page for the newest version + https://github.com/iredmail/iRedAdmin/releases + defaultValue: NoChange + - id: $$cap_iredmail_default_password + label: First Password + description: >- + Password for the admin login (you can change that later from the admin panel) + defaultValue: $$cap_gen_random_hex(8) + instructions: + start: >- + iRedMail is a free, open-source and full-featured mail server that allows you to host your own mail server at no cost. + SMTP + IMAP + POP3 + Antispam & Antivirus + Web administration. + Recommended: Use 'mail' as the App Name. + end: >- + You **should** enable https to access the Admin panel and the Webmail safely. + Admin panel: [$$cap_appname.$$cap_root_domain](//$$cap_appname.$$cap_root_domain), Webmail: [$$cap_appname.$$cap_root_domain/mail](//$$cap_appname.$$cap_root_domain/mail) + Credentials: postmaster@$$cap_root_domain/$$cap_iredmail_default_password + The deployment can take up to 5 minutes. + displayName: iRedMail + isOfficial: false + description: iRedMail - Open Source Mail Server, built in one container + documentation: Read the iRedMail documentation -> https://docs.iredmail.org/ diff --git a/public/v4/logos/iredmail.png b/public/v4/logos/iredmail.png new file mode 100644 index 0000000000000000000000000000000000000000..5d350112c192f0029ae857ce942877fe769bc13e GIT binary patch literal 17610 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 E19J43EdT%j literal 0 HcmV?d00001