You've already forked Mailu
mirror of
https://github.com/Mailu/Mailu.git
synced 2025-07-15 01:24:34 +02:00
Switch from RainLoop to SnappyMail
This commit is contained in:
12
.github/workflows/CI.yml
vendored
12
.github/workflows/CI.yml
vendored
@ -110,7 +110,7 @@ jobs:
|
|||||||
DOCKER_ORG: ${{ env.DOCKER_ORG }}
|
DOCKER_ORG: ${{ env.DOCKER_ORG }}
|
||||||
run: docker-compose -f tests/build.yml build
|
run: docker-compose -f tests/build.yml build
|
||||||
- name: Save all docker images
|
- 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:
|
test-core:
|
||||||
name: Perform core tests
|
name: Perform core tests
|
||||||
@ -328,8 +328,8 @@ jobs:
|
|||||||
PINNED_MAILU_VERSION: ${{ env.PINNED_MAILU_VERSION }}
|
PINNED_MAILU_VERSION: ${{ env.PINNED_MAILU_VERSION }}
|
||||||
DOCKER_ORG: ${{ env.DOCKER_ORG }}
|
DOCKER_ORG: ${{ env.DOCKER_ORG }}
|
||||||
|
|
||||||
test-rainloop:
|
test-snappymail:
|
||||||
name: Perform rainloop tests
|
name: Perform snappymail tests
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
needs:
|
needs:
|
||||||
- build
|
- build
|
||||||
@ -393,8 +393,8 @@ jobs:
|
|||||||
run: python3 -m pip install -r tests/requirements.txt
|
run: python3 -m pip install -r tests/requirements.txt
|
||||||
- name: Copy all certs
|
- name: Copy all certs
|
||||||
run: sudo -- sh -c 'mkdir -p /mailu && cp -r tests/certs /mailu && chmod 600 /mailu/certs/*'
|
run: sudo -- sh -c 'mkdir -p /mailu && cp -r tests/certs /mailu && chmod 600 /mailu/certs/*'
|
||||||
- name: Test rainloop
|
- name: Test snappymail
|
||||||
run: python tests/compose/test.py rainloop 2
|
run: python tests/compose/test.py snappymail 2
|
||||||
env:
|
env:
|
||||||
MAILU_VERSION: ${{ env.MAILU_VERSION }}
|
MAILU_VERSION: ${{ env.MAILU_VERSION }}
|
||||||
PINNED_MAILU_VERSION: ${{ env.PINNED_MAILU_VERSION }}
|
PINNED_MAILU_VERSION: ${{ env.PINNED_MAILU_VERSION }}
|
||||||
@ -552,7 +552,7 @@ jobs:
|
|||||||
- test-core
|
- test-core
|
||||||
- test-fetchmail
|
- test-fetchmail
|
||||||
- test-filters
|
- test-filters
|
||||||
- test-rainloop
|
- test-snappymail
|
||||||
- test-roundcube
|
- test-roundcube
|
||||||
- test-webdav
|
- test-webdav
|
||||||
steps:
|
steps:
|
||||||
|
@ -11,7 +11,7 @@ RUN apk add --no-cache \
|
|||||||
python3 py3-pip git bash py3-multidict py3-yarl tzdata \
|
python3 py3-pip git bash py3-multidict py3-yarl tzdata \
|
||||||
&& pip3 install --upgrade pip
|
&& 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
|
RUN pip3 install socrate==0.2.0
|
||||||
|
|
||||||
# Shared layer between dovecot and postfix
|
# Shared layer between dovecot and postfix
|
||||||
|
@ -11,7 +11,7 @@ RUN apk add --no-cache \
|
|||||||
python3 py3-pip git bash py3-multidict \
|
python3 py3-pip git bash py3-multidict \
|
||||||
&& pip3 install --upgrade pip
|
&& 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
|
RUN pip3 install socrate==0.2.0
|
||||||
|
|
||||||
# Image specific layers under this line
|
# Image specific layers under this line
|
||||||
|
@ -190,6 +190,9 @@ http {
|
|||||||
{% endif %}
|
{% endif %}
|
||||||
{% if ADMIN == 'true' %}
|
{% if ADMIN == 'true' %}
|
||||||
location {{ WEB_ADMIN }} {
|
location {{ WEB_ADMIN }} {
|
||||||
|
{% if WEB_ADMIN != '/' %}
|
||||||
|
rewrite ^({{ WEB_ADMIN }})$ $1/ permanent;
|
||||||
|
{% endif %}
|
||||||
include /etc/nginx/proxy.conf;
|
include /etc/nginx/proxy.conf;
|
||||||
proxy_pass http://$admin;
|
proxy_pass http://$admin;
|
||||||
expires $expires;
|
expires $expires;
|
||||||
|
@ -12,7 +12,7 @@ RUN apk add --no-cache \
|
|||||||
python3 py3-pip git bash py3-multidict py3-yarl tzdata \
|
python3 py3-pip git bash py3-multidict py3-yarl tzdata \
|
||||||
&& pip3 install --upgrade pip
|
&& 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
|
RUN pip3 install socrate==0.2.0
|
||||||
|
|
||||||
# Shared layer between dovecot and postfix
|
# Shared layer between dovecot and postfix
|
||||||
|
@ -10,7 +10,7 @@ RUN apk add --no-cache \
|
|||||||
python3 py3-pip git bash py3-multidict tzdata \
|
python3 py3-pip git bash py3-multidict tzdata \
|
||||||
&& pip3 install --upgrade pip
|
&& 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
|
RUN pip3 install socrate==0.2.0
|
||||||
|
|
||||||
# Image specific layers under this line
|
# Image specific layers under this line
|
||||||
|
@ -39,16 +39,16 @@ Postfix configuration overrides.
|
|||||||
|
|
||||||
RSpamD configuration overrides.
|
RSpamD configuration overrides.
|
||||||
|
|
||||||
#### Rainloop
|
#### Snappymail
|
||||||
|
|
||||||
- Old path: `/mailu/webmail/_data_/_default_/storage` (part of `/mailu/webmail` mountpoint, shared with Roundcube)
|
- 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`.
|
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
|
#### 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`
|
- New path: `/mailu/config/roundcube/gpg`
|
||||||
|
|
||||||
User configured GPG keys.
|
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.
|
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)
|
- 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.
|
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
|
#### 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)
|
- 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.
|
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
|
├── config
|
||||||
│ ├── dovecot
|
│ ├── dovecot
|
||||||
│ ├── postfix
|
│ ├── postfix
|
||||||
│ ├── rainloop
|
│ ├── snappymail
|
||||||
│ ├── redis
|
│ ├── redis
|
||||||
│ ├── roundcube
|
│ ├── roundcube
|
||||||
│ │ └── gpg
|
│ │ └── gpg
|
||||||
@ -173,7 +173,7 @@ The final layout of the Mailu filesystem will look like:
|
|||||||
│ └── dkim
|
│ └── dkim
|
||||||
├── data
|
├── data
|
||||||
│ ├── admin
|
│ ├── admin
|
||||||
│ ├── rainloop
|
│ ├── snappymail
|
||||||
│ ├── roundcube
|
│ ├── roundcube
|
||||||
│ └── rspamd
|
│ └── rspamd
|
||||||
├── local
|
├── local
|
||||||
|
@ -50,7 +50,7 @@ DISABLE_STATISTICS=False
|
|||||||
# Expose the admin interface (value: true, false)
|
# Expose the admin interface (value: true, false)
|
||||||
ADMIN=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
|
WEBMAIL=none
|
||||||
|
|
||||||
# Dav server implementation (value: radicale, none)
|
# Dav server implementation (value: radicale, none)
|
||||||
|
@ -11,7 +11,7 @@ RUN apk add --no-cache \
|
|||||||
python3 py3-pip git bash py3-multidict tzdata \
|
python3 py3-pip git bash py3-multidict tzdata \
|
||||||
&& pip3 install --upgrade pip
|
&& 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
|
RUN pip3 install socrate==0.2.0
|
||||||
|
|
||||||
# Image specific layers under this line
|
# Image specific layers under this line
|
||||||
|
@ -49,7 +49,7 @@ DISABLE_STATISTICS={{ disable_statistics or 'False' }}
|
|||||||
# Expose the admin interface (value: true, false)
|
# Expose the admin interface (value: true, false)
|
||||||
ADMIN={{ admin_enabled or '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 }}
|
WEBMAIL={{ webmail_type }}
|
||||||
|
|
||||||
# Dav server implementation (value: radicale, none)
|
# Dav server implementation (value: radicale, none)
|
||||||
|
@ -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.<p>
|
the security implications caused by such an increase of attack surface.<p>
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<label>Enable Web email client (and path to the Web email client)</label>
|
<label>Enable Web email client (and path to the Web email client)</label>
|
||||||
<!-- <div class="radio"> -->
|
|
||||||
<!-- {{ macros.radio("webmail_type", "roundcube", "RoundCube", "popular Webmail running on top of PHP") }} -->
|
|
||||||
<!-- {{ macros.radio("webmail_type", "rainloop", "Rainloop", "lightweight Webmail based on PHP, no database") }} -->
|
|
||||||
<!-- </div> -->
|
|
||||||
<br/>
|
<br/>
|
||||||
<select class="btn btn-primary dropdown-toggle" name="webmail_type" id="webmail">
|
<select class="btn btn-primary dropdown-toggle" name="webmail_type" id="webmail">
|
||||||
{% for webmailtype in ["none", "roundcube", "rainloop"] %}
|
{% for webmailtype in ["none", "roundcube", "snappymail"] %}
|
||||||
<option value="{{ webmailtype }}" >{{ webmailtype }}</option>
|
<option value="{{ webmailtype }}" >{{ webmailtype }}</option>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
</select>
|
</select>
|
||||||
|
@ -12,7 +12,7 @@ the security implications caused by such an increase of attack surface.<p>
|
|||||||
<label>Enable Web email client (and path to the Web email client)</label>
|
<label>Enable Web email client (and path to the Web email client)</label>
|
||||||
<br/>
|
<br/>
|
||||||
<select class="btn btn-primary dropdown-toggle" name="webmail_type" id="webmail">
|
<select class="btn btn-primary dropdown-toggle" name="webmail_type" id="webmail">
|
||||||
{% for webmailtype in ["none", "roundcube", "rainloop"] %}
|
{% for webmailtype in ["none", "roundcube", "snappymail"] %}
|
||||||
<option value="{{ webmailtype }}" >{{ webmailtype }}</option>
|
<option value="{{ webmailtype }}" >{{ webmailtype }}</option>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
</select>
|
</select>
|
||||||
|
@ -72,10 +72,10 @@ services:
|
|||||||
args:
|
args:
|
||||||
VERSION: ${PINNED_MAILU_VERSION:-local}
|
VERSION: ${PINNED_MAILU_VERSION:-local}
|
||||||
|
|
||||||
rainloop:
|
snappymail:
|
||||||
image: ${DOCKER_ORG:-mailu}/${DOCKER_PREFIX:-}rainloop:${PINNED_MAILU_VERSION:-local}
|
image: ${DOCKER_ORG:-mailu}/${DOCKER_PREFIX:-}snappymail:${PINNED_MAILU_VERSION:-local}
|
||||||
build:
|
build:
|
||||||
context: ../webmails/rainloop
|
context: ../webmails/snappymail
|
||||||
args:
|
args:
|
||||||
VERSION: ${PINNED_MAILU_VERSION:-local}
|
VERSION: ${PINNED_MAILU_VERSION:-local}
|
||||||
|
|
||||||
|
@ -53,7 +53,7 @@ DISABLE_STATISTICS=False
|
|||||||
# Expose the admin interface (value: true, false)
|
# Expose the admin interface (value: true, false)
|
||||||
ADMIN=true
|
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
|
WEBMAIL=none
|
||||||
|
|
||||||
# Dav server implementation (value: radicale, none)
|
# Dav server implementation (value: radicale, none)
|
||||||
|
@ -53,7 +53,7 @@ DISABLE_STATISTICS=False
|
|||||||
# Expose the admin interface (value: true, false)
|
# Expose the admin interface (value: true, false)
|
||||||
ADMIN=true
|
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
|
WEBMAIL=none
|
||||||
|
|
||||||
# Dav server implementation (value: radicale, none)
|
# Dav server implementation (value: radicale, none)
|
||||||
|
@ -53,7 +53,7 @@ DISABLE_STATISTICS=False
|
|||||||
# Expose the admin interface (value: true, false)
|
# Expose the admin interface (value: true, false)
|
||||||
ADMIN=true
|
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
|
WEBMAIL=none
|
||||||
|
|
||||||
# Dav server implementation (value: radicale, none)
|
# Dav server implementation (value: radicale, none)
|
||||||
|
@ -53,7 +53,7 @@ DISABLE_STATISTICS=False
|
|||||||
# Expose the admin interface (value: true, false)
|
# Expose the admin interface (value: true, false)
|
||||||
ADMIN=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
|
WEBMAIL=roundcube
|
||||||
|
|
||||||
# Dav server implementation (value: radicale, none)
|
# Dav server implementation (value: radicale, none)
|
||||||
|
@ -88,7 +88,7 @@ services:
|
|||||||
|
|
||||||
# Webmail
|
# Webmail
|
||||||
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
|
restart: always
|
||||||
env_file: mailu.env
|
env_file: mailu.env
|
||||||
volumes:
|
volumes:
|
@ -53,8 +53,8 @@ DISABLE_STATISTICS=False
|
|||||||
# Expose the admin interface (value: true, false)
|
# Expose the admin interface (value: true, false)
|
||||||
ADMIN=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=rainloop
|
WEBMAIL=snappymail
|
||||||
|
|
||||||
# Dav server implementation (value: radicale, none)
|
# Dav server implementation (value: radicale, none)
|
||||||
WEBDAV=none
|
WEBDAV=none
|
@ -53,7 +53,7 @@ DISABLE_STATISTICS=False
|
|||||||
# Expose the admin interface (value: true, false)
|
# Expose the admin interface (value: true, false)
|
||||||
ADMIN=true
|
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
|
WEBMAIL=none
|
||||||
|
|
||||||
# Dav server implementation (value: radicale, none)
|
# Dav server implementation (value: radicale, none)
|
||||||
|
@ -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
|
|
@ -1,31 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
$_ENV['RAINLOOP_INCLUDE_AS_API'] = true;
|
|
||||||
if (!defined('APP_VERSION')) {
|
|
||||||
$version = file_get_contents('/data/VERSION');
|
|
||||||
if ($version) {
|
|
||||||
define('APP_VERSION', $version);
|
|
||||||
define('APP_INDEX_ROOT_FILE', __FILE__);
|
|
||||||
define('APP_INDEX_ROOT_PATH', str_replace('\\', '/', rtrim(dirname(__FILE__), '\\/').'/'));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (file_exists(APP_INDEX_ROOT_PATH.'rainloop/v/'.APP_VERSION.'/include.php')) {
|
|
||||||
include APP_INDEX_ROOT_PATH.'rainloop/v/'.APP_VERSION.'/include.php';
|
|
||||||
} else {
|
|
||||||
echo '[105] Missing version directory';
|
|
||||||
exit(105);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Retrieve email and password
|
|
||||||
if (isset($_SERVER['HTTP_X_REMOTE_USER']) && isset($_SERVER['HTTP_X_REMOTE_USER_TOKEN'])) {
|
|
||||||
$email = $_SERVER['HTTP_X_REMOTE_USER'];
|
|
||||||
$password = $_SERVER['HTTP_X_REMOTE_USER_TOKEN'];
|
|
||||||
$ssoHash = \RainLoop\Api::GetUserSsoHash($email, $password);
|
|
||||||
|
|
||||||
// redirect to webmail sso url
|
|
||||||
header('Location: index.php?sso&hash='.$ssoHash);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
header('HTTP/1.0 403 Forbidden');
|
|
||||||
}
|
|
92
webmails/snappymail/Dockerfile
Normal file
92
webmails/snappymail/Dockerfile
Normal file
@ -0,0 +1,92 @@
|
|||||||
|
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 snappymail and roundloop
|
||||||
|
RUN apk add --no-cache \
|
||||||
|
python3 py3-pip tzdata \
|
||||||
|
&& pip3 install socrate==0.2.0
|
||||||
|
|
||||||
|
# https://github.com/the-djmaze/snappymail/wiki/Installation-instructions#requirements
|
||||||
|
# SnappyMail:
|
||||||
|
# SnappyMail requires PHP 7.4 (or a newer version) with the following extensions:
|
||||||
|
#
|
||||||
|
# mbstring php7-mbstring
|
||||||
|
# Zlib built-in OR php7-zip????
|
||||||
|
# json php7-json
|
||||||
|
# libxml php7-xml
|
||||||
|
# dom php7-dom
|
||||||
|
|
||||||
|
# Optional extensions:
|
||||||
|
|
||||||
|
# cURL php7-curl
|
||||||
|
# exif php7-exif
|
||||||
|
# gd, gmagick or imagemagick gd and php7-gd
|
||||||
|
# gnupg gpgme and alpine has no php7-gnupg library :(
|
||||||
|
# iconv php7-iconv
|
||||||
|
# intl php7-intl
|
||||||
|
# ldap we don't use ldap
|
||||||
|
# openssl php7-openssl
|
||||||
|
# PDO (MySQL/PostgreSQL/SQLite) (for contacts) php7-pdo_sqlite and php7-pdo
|
||||||
|
# redis NOT USED
|
||||||
|
# Sodium php7-sodium and libsodium
|
||||||
|
# Tidy php7-tidy
|
||||||
|
# uuid (PECL) php7-pecl-uuid
|
||||||
|
# xxtea (PECL) not found on alpine repo
|
||||||
|
# zip php7-zip
|
||||||
|
#php7-curl php7-iconv php7-json php7-xml php7-simplexml php7-dom php7-openssl php7-pdo php7-pdo_sqlite php7-mbstring \
|
||||||
|
RUN apk add --no-cache \
|
||||||
|
nginx \
|
||||||
|
php7 php7-fpm php7-mbstring php7-zip php7-json php7-xml php7-simplexml \
|
||||||
|
php7-dom php7-curl php7-exif gd php7-gd php7-iconv php7-intl php7-openssl \
|
||||||
|
php7-pdo_sqlite php7-pdo php7-sodium libsodium php7-tidy php7-pecl-uuid \
|
||||||
|
&& rm /etc/nginx/http.d/default.conf \
|
||||||
|
&& rm /etc/php7/php-fpm.d/www.conf \
|
||||||
|
&& mkdir -p /run/nginx \
|
||||||
|
&& mkdir -p /var/www/webmail \
|
||||||
|
&& mkdir -p /config
|
||||||
|
|
||||||
|
# nginx / PHP config files
|
||||||
|
COPY config/nginx-snappymail.conf /config/nginx-snappymail.conf
|
||||||
|
COPY config/php-snappymail.conf /etc/php7/php-fpm.d/snappymail.conf
|
||||||
|
|
||||||
|
# Parsed and 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 Snappymail from source
|
||||||
|
ENV SNAPPYMAIL_URL https://github.com/the-djmaze/snappymail/releases/download/v2.13.4/snappymail-2.13.4.zip
|
||||||
|
|
||||||
|
RUN apk add --no-cache \
|
||||||
|
curl unzip \
|
||||||
|
&& cd /var/www/webmail \
|
||||||
|
&& curl -L -O ${SNAPPYMAIL_URL} \
|
||||||
|
&& unzip -q *.zip \
|
||||||
|
&& rm -f *.zip \
|
||||||
|
&& find . -type d -exec chmod 755 {} \; \
|
||||||
|
&& find . -type f -exec chmod 644 {} \; \
|
||||||
|
&& chown -R nginx:nginx /var/www/webmail \
|
||||||
|
&& apk del unzip
|
||||||
|
|
||||||
|
# SnappyMail login
|
||||||
|
COPY login/include.php /var/www/webmail/include.php
|
||||||
|
COPY login/sso.php /var/www/webmail/sso.php
|
||||||
|
|
||||||
|
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
|
@ -10,6 +10,6 @@ args = os.environ.copy()
|
|||||||
log.basicConfig(stream=sys.stderr, level=args.get("LOG_LEVEL", "WARNING"))
|
log.basicConfig(stream=sys.stderr, level=args.get("LOG_LEVEL", "WARNING"))
|
||||||
|
|
||||||
# Build final configuration paths
|
# Build final configuration paths
|
||||||
conf.jinja("/config/nginx-rainloop.conf", args, "/etc/nginx/http.d/rainloop.conf")
|
conf.jinja("/config/nginx-snappymail.conf", args, "/etc/nginx/http.d/snappymail.conf")
|
||||||
if os.path.exists("/var/run/nginx.pid"):
|
if os.path.exists("/var/run/nginx.pid"):
|
||||||
os.system("nginx -s reload")
|
os.system("nginx -s reload")
|
@ -2,13 +2,15 @@ server {
|
|||||||
listen 80 default_server;
|
listen 80 default_server;
|
||||||
listen [::]:80 default_server;
|
listen [::]:80 default_server;
|
||||||
|
|
||||||
root /var/www/rainloop;
|
root /var/www/webmail;
|
||||||
|
|
||||||
|
include /etc/nginx/mime.types;
|
||||||
|
|
||||||
# /dev/stdout (Default), <path>, off
|
# /dev/stdout (Default), <path>, off
|
||||||
access_log off;
|
access_log off;
|
||||||
|
|
||||||
# /dev/stderr (Default), <path>, debug, info, notice, warn, error, crit, alert, emerg
|
# /dev/stderr (Default), <path>, debug, info, notice, warn, error, crit, alert, emerg
|
||||||
error_log /dev/stderr warn;
|
error_log /dev/stderr notice;
|
||||||
|
|
||||||
index index.php;
|
index index.php;
|
||||||
|
|
||||||
@ -16,19 +18,26 @@ server {
|
|||||||
client_max_body_size {{ MESSAGE_SIZE_LIMIT|int + 8388608 }};
|
client_max_body_size {{ MESSAGE_SIZE_LIMIT|int + 8388608 }};
|
||||||
|
|
||||||
location / {
|
location / {
|
||||||
try_files $uri /index.php?$query_string;
|
try_files $uri $uri/ /index.php$args;
|
||||||
}
|
}
|
||||||
|
|
||||||
location ~ \.php$ {
|
location ~ \.php$ {
|
||||||
|
include /etc/nginx/fastcgi_params;
|
||||||
|
|
||||||
fastcgi_split_path_info ^(.+\.php)(/.*)$;
|
fastcgi_split_path_info ^(.+\.php)(/.*)$;
|
||||||
|
|
||||||
fastcgi_intercept_errors on;
|
fastcgi_intercept_errors on;
|
||||||
fastcgi_index index.php;
|
fastcgi_index index.php;
|
||||||
|
|
||||||
fastcgi_keep_conn on;
|
fastcgi_keep_conn on;
|
||||||
include /etc/nginx/fastcgi_params;
|
|
||||||
fastcgi_pass unix:/var/run/php7-fpm.sock;
|
fastcgi_pass unix:/var/run/php7-fpm.sock;
|
||||||
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
|
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
|
||||||
|
{% if WEB_WEBMAIL == '/' %}
|
||||||
|
fastcgi_param SCRIPT_NAME $fastcgi_script_name;
|
||||||
|
{% else %}
|
||||||
|
fastcgi_param SCRIPT_NAME {{WEB_WEBMAIL}}/$fastcgi_script_name;
|
||||||
|
{% endif %}
|
||||||
}
|
}
|
||||||
|
|
||||||
location ~ /\.ht {
|
location ~ /\.ht {
|
@ -1,7 +1,7 @@
|
|||||||
; Start a new pool named 'rainloop'.
|
; Start a new pool named 'snappymail'.
|
||||||
; the variable $pool can be used in any directive and will be replaced by the
|
; the variable $pool can be used in any directive and will be replaced by the
|
||||||
; pool name ('rainloop' here)
|
; pool name ('snappymail' here)
|
||||||
[rainloop]
|
[snappymail]
|
||||||
|
|
||||||
; Redirect worker stdout and stderr into main error log. If not set, stdout and
|
; Redirect worker stdout and stderr into main error log. If not set, stdout and
|
||||||
; stderr will be redirected to /dev/null according to FastCGI specs.
|
; stderr will be redirected to /dev/null according to FastCGI specs.
|
@ -1,4 +1,4 @@
|
|||||||
; RainLoop Webmail configuration file
|
; Snappymail Webmail configuration file
|
||||||
|
|
||||||
[webmail]
|
[webmail]
|
||||||
attachment_size_limit = {{ MAX_FILESIZE }}
|
attachment_size_limit = {{ MAX_FILESIZE }}
|
||||||
@ -8,10 +8,14 @@ allow_admin_panel = Off
|
|||||||
|
|
||||||
[labs]
|
[labs]
|
||||||
allow_gravatar = Off
|
allow_gravatar = Off
|
||||||
|
{% if WEB_WEBMAIL == '/' %}
|
||||||
custom_login_link='sso.php'
|
custom_login_link='sso.php'
|
||||||
|
{% else %}
|
||||||
|
custom_login_link='{{ WEB_WEBMAIL }}/sso.php'
|
||||||
|
{% endif %}
|
||||||
custom_logout_link='/sso/logout'
|
custom_logout_link='/sso/logout'
|
||||||
|
|
||||||
[contacts]
|
[defaults]
|
||||||
enable = On
|
enable = On
|
||||||
allow_sync = On
|
allow_sync = On
|
||||||
|
|
17
webmails/snappymail/login/sso.php
Normal file
17
webmails/snappymail/login/sso.php
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
$_ENV['SNAPPYMAIL_INCLUDE_AS_API'] = true;
|
||||||
|
require 'index.php';
|
||||||
|
// Retrieve email and password
|
||||||
|
if (isset($_SERVER['HTTP_X_REMOTE_USER']) && isset($_SERVER['HTTP_X_REMOTE_USER_TOKEN'])) {
|
||||||
|
$email = $_SERVER['HTTP_X_REMOTE_USER'];
|
||||||
|
$password = $_SERVER['HTTP_X_REMOTE_USER_TOKEN'];
|
||||||
|
$ssoHash = \RainLoop\Api::CreateUserSsoHash($email, $password);
|
||||||
|
|
||||||
|
// redirect to webmail sso url
|
||||||
|
header('Location: index.php?sso&hash='.$ssoHash);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
header('HTTP/1.0 403 Forbidden');
|
||||||
|
}
|
||||||
|
?>
|
@ -27,7 +27,7 @@ conf.jinja("/defaults/php.ini", os.environ, "/etc/php7/php.ini")
|
|||||||
os.system("php-fpm7")
|
os.system("php-fpm7")
|
||||||
|
|
||||||
os.system("chown -R nginx:nginx /data")
|
os.system("chown -R nginx:nginx /data")
|
||||||
os.system("chmod -R a+rX /var/www/rainloop/")
|
os.system("chmod -R a+rX /var/www/webmail/")
|
||||||
|
|
||||||
subprocess.call(["/config.py"])
|
subprocess.call(["/config.py"])
|
||||||
os.execv("/usr/sbin/nginx", ["nginx", "-g", "daemon off;"])
|
os.execv("/usr/sbin/nginx", ["nginx", "-g", "daemon off;"])
|
Reference in New Issue
Block a user