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 }}
|
||||
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:
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -190,6 +190,9 @@ http {
|
||||
{% endif %}
|
||||
{% if ADMIN == 'true' %}
|
||||
location {{ WEB_ADMIN }} {
|
||||
{% if WEB_ADMIN != '/' %}
|
||||
rewrite ^({{ WEB_ADMIN }})$ $1/ permanent;
|
||||
{% endif %}
|
||||
include /etc/nginx/proxy.conf;
|
||||
proxy_pass http://$admin;
|
||||
expires $expires;
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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)
|
||||
|
@ -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
|
||||
|
@ -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)
|
||||
|
@ -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>
|
||||
<div class="form-group">
|
||||
<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/>
|
||||
<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>
|
||||
{% endfor %}
|
||||
</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>
|
||||
<br/>
|
||||
<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>
|
||||
{% endfor %}
|
||||
</select>
|
||||
|
@ -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}
|
||||
|
||||
|
@ -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)
|
||||
|
@ -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)
|
||||
|
@ -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)
|
||||
|
@ -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)
|
||||
|
@ -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:
|
@ -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
|
@ -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)
|
||||
|
@ -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"))
|
||||
|
||||
# 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"):
|
||||
os.system("nginx -s reload")
|
@ -2,13 +2,15 @@ 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
|
||||
access_log off;
|
||||
|
||||
# /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;
|
||||
|
||||
@ -16,19 +18,26 @@ server {
|
||||
client_max_body_size {{ MESSAGE_SIZE_LIMIT|int + 8388608 }};
|
||||
|
||||
location / {
|
||||
try_files $uri /index.php?$query_string;
|
||||
try_files $uri $uri/ /index.php$args;
|
||||
}
|
||||
|
||||
location ~ \.php$ {
|
||||
include /etc/nginx/fastcgi_params;
|
||||
|
||||
fastcgi_split_path_info ^(.+\.php)(/.*)$;
|
||||
|
||||
fastcgi_intercept_errors on;
|
||||
fastcgi_index index.php;
|
||||
|
||||
fastcgi_keep_conn on;
|
||||
include /etc/nginx/fastcgi_params;
|
||||
|
||||
fastcgi_pass unix:/var/run/php7-fpm.sock;
|
||||
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 {
|
@ -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
|
||||
; pool name ('rainloop' here)
|
||||
[rainloop]
|
||||
; pool name ('snappymail' here)
|
||||
[snappymail]
|
||||
|
||||
; 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.
|
@ -1,4 +1,4 @@
|
||||
; RainLoop Webmail configuration file
|
||||
; Snappymail Webmail configuration file
|
||||
|
||||
[webmail]
|
||||
attachment_size_limit = {{ MAX_FILESIZE }}
|
||||
@ -8,10 +8,14 @@ allow_admin_panel = Off
|
||||
|
||||
[labs]
|
||||
allow_gravatar = Off
|
||||
{% if WEB_WEBMAIL == '/' %}
|
||||
custom_login_link='sso.php'
|
||||
{% else %}
|
||||
custom_login_link='{{ WEB_WEBMAIL }}/sso.php'
|
||||
{% endif %}
|
||||
custom_logout_link='/sso/logout'
|
||||
|
||||
[contacts]
|
||||
[defaults]
|
||||
enable = 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("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"])
|
||||
os.execv("/usr/sbin/nginx", ["nginx", "-g", "daemon off;"])
|
Reference in New Issue
Block a user