diff --git a/.github/workflows/CI.yml b/.github/workflows/CI.yml index 8348503b..21bc70a6 100644 --- a/.github/workflows/CI.yml +++ b/.github/workflows/CI.yml @@ -110,7 +110,7 @@ jobs: DOCKER_ORG: ${{ env.DOCKER_ORG }} run: docker-compose -f tests/build.yml build - name: Save all docker images - run: docker save ${{ env.DOCKER_ORG }}/admin ${{ env.DOCKER_ORG }}/clamav ${{ env.DOCKER_ORG }}/docs ${{ env.DOCKER_ORG }}/dovecot ${{ env.DOCKER_ORG }}/fetchmail ${{ env.DOCKER_ORG }}/nginx ${{ env.DOCKER_ORG }}/none ${{ env.DOCKER_ORG }}/postfix ${{ env.DOCKER_ORG }}/radicale ${{ env.DOCKER_ORG }}/rainloop ${{ env.DOCKER_ORG }}/roundcube ${{ env.DOCKER_ORG }}/rspamd ${{ env.DOCKER_ORG }}/setup ${{ env.DOCKER_ORG }}/traefik-certdumper ${{ env.DOCKER_ORG }}/unbound -o /images/images.tar.gz + run: docker save ${{ env.DOCKER_ORG }}/admin ${{ env.DOCKER_ORG }}/clamav ${{ env.DOCKER_ORG }}/docs ${{ env.DOCKER_ORG }}/dovecot ${{ env.DOCKER_ORG }}/fetchmail ${{ env.DOCKER_ORG }}/nginx ${{ env.DOCKER_ORG }}/none ${{ env.DOCKER_ORG }}/postfix ${{ env.DOCKER_ORG }}/radicale ${{ env.DOCKER_ORG }}/snappymail ${{ env.DOCKER_ORG }}/roundcube ${{ env.DOCKER_ORG }}/rspamd ${{ env.DOCKER_ORG }}/setup ${{ env.DOCKER_ORG }}/traefik-certdumper ${{ env.DOCKER_ORG }}/unbound -o /images/images.tar.gz test-core: name: Perform core tests @@ -328,8 +328,8 @@ jobs: PINNED_MAILU_VERSION: ${{ env.PINNED_MAILU_VERSION }} DOCKER_ORG: ${{ env.DOCKER_ORG }} - test-rainloop: - name: Perform rainloop tests + test-snappymail: + name: Perform snappymail tests runs-on: ubuntu-latest needs: - build @@ -393,8 +393,8 @@ jobs: run: python3 -m pip install -r tests/requirements.txt - name: Copy all certs run: sudo -- sh -c 'mkdir -p /mailu && cp -r tests/certs /mailu && chmod 600 /mailu/certs/*' - - name: Test rainloop - run: python tests/compose/test.py rainloop 2 + - name: Test snappymail + run: python tests/compose/test.py snappymail 2 env: MAILU_VERSION: ${{ env.MAILU_VERSION }} PINNED_MAILU_VERSION: ${{ env.PINNED_MAILU_VERSION }} @@ -552,7 +552,7 @@ jobs: - test-core - test-fetchmail - test-filters - - test-rainloop + - test-snappymail - test-roundcube - test-webdav steps: diff --git a/core/dovecot/Dockerfile b/core/dovecot/Dockerfile index f6077c58..d424f29c 100644 --- a/core/dovecot/Dockerfile +++ b/core/dovecot/Dockerfile @@ -11,7 +11,7 @@ RUN apk add --no-cache \ python3 py3-pip git bash py3-multidict py3-yarl tzdata \ && pip3 install --upgrade pip -# Shared layer between nginx, dovecot, postfix, postgresql, rspamd, unbound, rainloop, roundcube +# Shared layer between nginx, dovecot, postfix, postgresql, rspamd, unbound, snappymail, roundcube RUN pip3 install socrate==0.2.0 # Shared layer between dovecot and postfix diff --git a/core/nginx/Dockerfile b/core/nginx/Dockerfile index 081321d5..07021429 100644 --- a/core/nginx/Dockerfile +++ b/core/nginx/Dockerfile @@ -11,7 +11,7 @@ RUN apk add --no-cache \ python3 py3-pip git bash py3-multidict \ && pip3 install --upgrade pip -# Shared layer between nginx, dovecot, postfix, postgresql, rspamd, unbound, rainloop, roundcube +# Shared layer between nginx, dovecot, postfix, postgresql, rspamd, unbound, snappymail, roundcube RUN pip3 install socrate==0.2.0 # Image specific layers under this line diff --git a/core/postfix/Dockerfile b/core/postfix/Dockerfile index e7438d04..7cc3fc9d 100644 --- a/core/postfix/Dockerfile +++ b/core/postfix/Dockerfile @@ -12,7 +12,7 @@ RUN apk add --no-cache \ python3 py3-pip git bash py3-multidict py3-yarl tzdata \ && pip3 install --upgrade pip -# Shared layer between nginx, dovecot, postfix, postgresql, rspamd, unbound, rainloop, roundcube +# Shared layer between nginx, dovecot, postfix, postgresql, rspamd, unbound, snappymail, roundcube RUN pip3 install socrate==0.2.0 # Shared layer between dovecot and postfix diff --git a/core/rspamd/Dockerfile b/core/rspamd/Dockerfile index 412d69db..7b89aed0 100644 --- a/core/rspamd/Dockerfile +++ b/core/rspamd/Dockerfile @@ -10,7 +10,7 @@ RUN apk add --no-cache \ python3 py3-pip git bash py3-multidict tzdata \ && pip3 install --upgrade pip -# Shared layer between nginx, dovecot, postfix, postgresql, rspamd, unbound, rainloop, roundcube +# Shared layer between nginx, dovecot, postfix, postgresql, rspamd, unbound, snappymail, roundcube RUN pip3 install socrate==0.2.0 # Image specific layers under this line diff --git a/design/mailu-directory-structure.md b/design/mailu-directory-structure.md index ad75eeaa..5d62c85d 100644 --- a/design/mailu-directory-structure.md +++ b/design/mailu-directory-structure.md @@ -39,16 +39,16 @@ Postfix configuration overrides. RSpamD configuration overrides. -#### Rainloop +#### Snappymail - Old path: `/mailu/webmail/_data_/_default_/storage` (part of `/mailu/webmail` mountpoint, shared with Roundcube) -- New path: `/mailu/config/rainloop` +- New path: `/mailu/config/snappymail` User specific configs. The remaining files under the old `/mailu/webmail` don't need to be persistent. Except for `AddressBook.sqlite`, see `/mailu/data`. #### Roundcube -- Old path: `/mailu/webmail/gpg` (part of `/mailu/webmail` mountpoint, shared with Rainloop) +- Old path: `/mailu/webmail/gpg` (part of `/mailu/webmail` mountpoint, shared with Snappymail) - New path: `/mailu/config/roundcube/gpg` User configured GPG keys. @@ -108,10 +108,10 @@ This move is needed in order to be able to mount the directory without exposing Storage of Bayes and Fuzzy learning SQLite databases and caches. As future optimization we should look into moving all this into Redis. -#### Rainloop +#### SnappyMail - Old path: `/mailu/webmail/_data_/_default_/AddressBook.sqlite` (part of `/mailu/webmail` mountpoint, shared with Roundcube) -- New path: `/mailu/data/rainloop/AddressBook.sqlite` (mount on `rainloop` directory) +- New path: `/mailu/data/snappymail/AddressBook.sqlite` (mount on `snappymail` directory) Addressbook SQLite file. For future replicated deployments this might better be configured to use an external DB. @@ -119,7 +119,7 @@ For this modification, the `AddressBook.sqlite` will need to be moved to a diffe #### Roundcube -- Old path: `/mailu/webmail/roundcube.db` (part of `/mailu/webmail` mountpoint, shared with Rainloop) +- Old path: `/mailu/webmail/roundcube.db` (part of `/mailu/webmail` mountpoint, shared with SnappyMail) - New path: `/mailu/data/roundcube/roundcube.db` (mount on `roundcube` directory) User settings SQLite database file for roundcube. For future replicated deployments this might better be configured to use an external DB. @@ -163,7 +163,7 @@ The final layout of the Mailu filesystem will look like: ├── config │ ├── dovecot │ ├── postfix -│ ├── rainloop +│ ├── snappymail │ ├── redis │ ├── roundcube │ │ └── gpg @@ -173,7 +173,7 @@ The final layout of the Mailu filesystem will look like: │ └── dkim ├── data │ ├── admin -│ ├── rainloop +│ ├── snappymail │ ├── roundcube │ └── rspamd ├── local diff --git a/docs/compose/.env b/docs/compose/.env index 4df73080..fa952270 100644 --- a/docs/compose/.env +++ b/docs/compose/.env @@ -50,7 +50,7 @@ DISABLE_STATISTICS=False # Expose the admin interface (value: true, false) ADMIN=false -# Choose which webmail to run if any (values: roundcube, rainloop, none) +# Choose which webmail to run if any (values: roundcube, snappymail, none) WEBMAIL=none # Dav server implementation (value: radicale, none) diff --git a/optional/unbound/Dockerfile b/optional/unbound/Dockerfile index 11dde920..342ceebc 100644 --- a/optional/unbound/Dockerfile +++ b/optional/unbound/Dockerfile @@ -11,7 +11,7 @@ RUN apk add --no-cache \ python3 py3-pip git bash py3-multidict tzdata \ && pip3 install --upgrade pip -# Shared layer between nginx, dovecot, postfix, postgresql, rspamd, unbound, rainloop, roundcube +# Shared layer between nginx, dovecot, postfix, postgresql, rspamd, unbound, snappymail, roundcube RUN pip3 install socrate==0.2.0 # Image specific layers under this line diff --git a/setup/flavors/compose/mailu.env b/setup/flavors/compose/mailu.env index ed7ecfdd..1d98c528 100644 --- a/setup/flavors/compose/mailu.env +++ b/setup/flavors/compose/mailu.env @@ -49,7 +49,7 @@ DISABLE_STATISTICS={{ disable_statistics or 'False' }} # Expose the admin interface (value: true, false) ADMIN={{ admin_enabled or 'false' }} -# Choose which webmail to run if any (values: roundcube, rainloop, none) +# Choose which webmail to run if any (values: roundcube, snappymail, none) WEBMAIL={{ webmail_type }} # Dav server implementation (value: radicale, none) diff --git a/setup/templates/steps/compose/02_services.html b/setup/templates/steps/compose/02_services.html index 5118c304..a801f807 100644 --- a/setup/templates/steps/compose/02_services.html +++ b/setup/templates/steps/compose/02_services.html @@ -10,13 +10,9 @@ the Web. By exposing a complex application such as a Webmail, you should be awar the security implications caused by such an increase of attack surface.
diff --git a/tests/build.yml b/tests/build.yml
index da351ac8..d693f7d1 100644
--- a/tests/build.yml
+++ b/tests/build.yml
@@ -72,10 +72,10 @@ services:
args:
VERSION: ${PINNED_MAILU_VERSION:-local}
- rainloop:
- image: ${DOCKER_ORG:-mailu}/${DOCKER_PREFIX:-}rainloop:${PINNED_MAILU_VERSION:-local}
+ snappymail:
+ image: ${DOCKER_ORG:-mailu}/${DOCKER_PREFIX:-}snappymail:${PINNED_MAILU_VERSION:-local}
build:
- context: ../webmails/rainloop
+ context: ../webmails/snappymail
args:
VERSION: ${PINNED_MAILU_VERSION:-local}
diff --git a/tests/compose/core/mailu.env b/tests/compose/core/mailu.env
index 254c3c7d..0b034008 100644
--- a/tests/compose/core/mailu.env
+++ b/tests/compose/core/mailu.env
@@ -53,7 +53,7 @@ DISABLE_STATISTICS=False
# Expose the admin interface (value: true, false)
ADMIN=true
-# Choose which webmail to run if any (values: roundcube, rainloop, none)
+# Choose which webmail to run if any (values: roundcube, snappymail, none)
WEBMAIL=none
# Dav server implementation (value: radicale, none)
diff --git a/tests/compose/fetchmail/mailu.env b/tests/compose/fetchmail/mailu.env
index a015eaa8..573acf20 100644
--- a/tests/compose/fetchmail/mailu.env
+++ b/tests/compose/fetchmail/mailu.env
@@ -53,7 +53,7 @@ DISABLE_STATISTICS=False
# Expose the admin interface (value: true, false)
ADMIN=true
-# Choose which webmail to run if any (values: roundcube, rainloop, none)
+# Choose which webmail to run if any (values: roundcube, snappymail, none)
WEBMAIL=none
# Dav server implementation (value: radicale, none)
diff --git a/tests/compose/filters/mailu.env b/tests/compose/filters/mailu.env
index 1b4fb93d..89309641 100644
--- a/tests/compose/filters/mailu.env
+++ b/tests/compose/filters/mailu.env
@@ -53,7 +53,7 @@ DISABLE_STATISTICS=False
# Expose the admin interface (value: true, false)
ADMIN=true
-# Choose which webmail to run if any (values: roundcube, rainloop, none)
+# Choose which webmail to run if any (values: roundcube, snappymail, none)
WEBMAIL=none
# Dav server implementation (value: radicale, none)
diff --git a/tests/compose/roundcube/mailu.env b/tests/compose/roundcube/mailu.env
index 9db7fcbe..7f000f2c 100644
--- a/tests/compose/roundcube/mailu.env
+++ b/tests/compose/roundcube/mailu.env
@@ -53,7 +53,7 @@ DISABLE_STATISTICS=False
# Expose the admin interface (value: true, false)
ADMIN=false
-# Choose which webmail to run if any (values: roundcube, rainloop, none)
+# Choose which webmail to run if any (values: roundcube, snappymail, none)
WEBMAIL=roundcube
# Dav server implementation (value: radicale, none)
diff --git a/tests/compose/rainloop/docker-compose.yml b/tests/compose/snappymail/docker-compose.yml
similarity index 96%
rename from tests/compose/rainloop/docker-compose.yml
rename to tests/compose/snappymail/docker-compose.yml
index ca8d70ba..e92e4522 100644
--- a/tests/compose/rainloop/docker-compose.yml
+++ b/tests/compose/snappymail/docker-compose.yml
@@ -88,7 +88,7 @@ services:
# Webmail
webmail:
- image: ${DOCKER_ORG:-mailu}/${DOCKER_PREFIX:-}rainloop:${PINNED_MAILU_VERSION:-local}
+ image: ${DOCKER_ORG:-mailu}/${DOCKER_PREFIX:-}snappymail:${PINNED_MAILU_VERSION:-local}
restart: always
env_file: mailu.env
volumes:
diff --git a/tests/compose/rainloop/mailu.env b/tests/compose/snappymail/mailu.env
similarity index 97%
rename from tests/compose/rainloop/mailu.env
rename to tests/compose/snappymail/mailu.env
index 944dd376..50271fc7 100644
--- a/tests/compose/rainloop/mailu.env
+++ b/tests/compose/snappymail/mailu.env
@@ -53,8 +53,8 @@ DISABLE_STATISTICS=False
# Expose the admin interface (value: true, false)
ADMIN=false
-# Choose which webmail to run if any (values: roundcube, rainloop, none)
-WEBMAIL=rainloop
+# Choose which webmail to run if any (values: roundcube, snappymail, none)
+WEBMAIL=snappymail
# Dav server implementation (value: radicale, none)
WEBDAV=none
diff --git a/tests/compose/webdav/mailu.env b/tests/compose/webdav/mailu.env
index f1de013d..c2fcc4cf 100644
--- a/tests/compose/webdav/mailu.env
+++ b/tests/compose/webdav/mailu.env
@@ -53,7 +53,7 @@ DISABLE_STATISTICS=False
# Expose the admin interface (value: true, false)
ADMIN=true
-# Choose which webmail to run if any (values: roundcube, rainloop, none)
+# Choose which webmail to run if any (values: roundcube, snappymail, none)
WEBMAIL=none
# Dav server implementation (value: radicale, none)
diff --git a/towncrier/newsfragments/2295.feature b/towncrier/newsfragments/2295.feature
new file mode 100644
index 00000000..e353b692
--- /dev/null
+++ b/towncrier/newsfragments/2295.feature
@@ -0,0 +1 @@
+Switch from RainLoop to SnappyMail. SnappyMail has better performance and is more secure.
diff --git a/webmails/rainloop/Dockerfile b/webmails/rainloop/Dockerfile
deleted file mode 100644
index fd4b7549..00000000
--- a/webmails/rainloop/Dockerfile
+++ /dev/null
@@ -1,79 +0,0 @@
-ARG ARCH=""
-
-# NOTE: only add file if building for arm
-FROM ${ARCH}alpine:3.14
-ARG VERSION
-ONBUILD COPY --from=balenalib/rpi-alpine:3.14 /usr/bin/qemu-arm-static /usr/bin/qemu-arm-static
-
-ENV TZ Etc/UTC
-
-LABEL version=$VERSION
-
-# Shared later between dovecot postfix nginx rspamd rainloop and roundloop
-RUN apk add --no-cache \
- python3 py3-pip tzdata \
- && pip3 install socrate==0.2.0
-
-# https://www.rainloop.net/docs/system-requirements/
-# Rainloop:
-# cURL Builtin
-# iconv php7-iconv
-# json php7-json
-# libxml php7-xml
-# dom php7-dom
-# openssl php7-openssl
-# DateTime Builtin
-# PCRE Builtin
-# SPL Builtin
-# Recommended:
-# php7-fpm FastCGI Process Manager
-# Optional PHP extension (for contacts):
-# php7-pdo Accessing databases in PHP
-# php7-pdo_sqlite Access to SQLite 3 databases
-RUN apk add --no-cache \
- nginx \
- php7 php7-fpm php7-curl php7-iconv php7-json php7-xml php7-simplexml php7-dom php7-openssl php7-pdo php7-pdo_sqlite \
- && rm /etc/nginx/http.d/default.conf \
- && rm /etc/php7/php-fpm.d/www.conf \
- && mkdir -p /run/nginx \
- && mkdir -p /var/www/rainloop \
- && mkdir -p /config
-
-# nginx / PHP config files
-COPY config/nginx-rainloop.conf /config/nginx-rainloop.conf
-COPY config/php-rainloop.conf /etc/php7/php-fpm.d/rainloop.conf
-
-# Rainloop login
-COPY login/include.php /var/www/rainloop/include.php
-COPY login/sso.php /var/www/rainloop/sso.php
-
-# Parsed en moved at startup
-COPY defaults/php.ini /defaults/php.ini
-COPY defaults/application.ini /defaults/application.ini
-COPY defaults/default.ini /defaults/default.ini
-
-# Install Rainloop from source
-ENV RAINLOOP_URL https://github.com/RainLoop/rainloop-webmail/releases/download/v1.16.0/rainloop-community-1.16.0.zip
-
-RUN apk add --no-cache \
- curl unzip \
- && cd /var/www/rainloop \
- && curl -L -O ${RAINLOOP_URL} \
- && unzip -q *.zip \
- && rm -f *.zip \
- && rm -rf data/ \
- && find . -type d -exec chmod 755 {} \; \
- && find . -type f -exec chmod 644 {} \; \
- && chown -R nginx:nginx /var/www/rainloop \
- && apk del unzip
-
-COPY start.py /start.py
-COPY config.py /config.py
-
-EXPOSE 80/tcp
-VOLUME ["/data"]
-
-CMD /start.py
-
-HEALTHCHECK CMD curl -f -L http://localhost/ || exit 1
-RUN echo $VERSION >> /version
diff --git a/webmails/rainloop/config/nginx-rainloop.conf b/webmails/rainloop/config/nginx-rainloop.conf
deleted file mode 100644
index be40e963..00000000
--- a/webmails/rainloop/config/nginx-rainloop.conf
+++ /dev/null
@@ -1,41 +0,0 @@
-server {
- listen 80 default_server;
- listen [::]:80 default_server;
-
- root /var/www/rainloop;
-
- # /dev/stdout (Default),