diff --git a/.gitignore b/.gitignore index 776a5c69f4db2a3349d33c40a8bd9c9b3358c7d8..d1977dd9c25c736f483458eeae5b2877b5f26860 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ -.sw? +.*.sw? .env -etc/ +postfix/ +sympa/ diff --git a/docker-compose.yml b/docker-compose.yml index 90c7999b9f2b3255c3aa2989530532b8fcd65d6a..29192f93bcf4614cce9347c9893ae270f9973bea 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -2,10 +2,10 @@ version: "3" services: sympa: - build: ./docker + build: ./docker/sympa restart: always volumes: - - "./etc:/etc/sympa" + - "./sympa:/etc/sympa" - "spool_sympa:/var/spool/sympa" - "spool_nullmailer:/var/spool/nullmailer" - "lib_sympa:/var/lib/sympa" @@ -26,6 +26,20 @@ services: ports: - '8081:80' + postfix: + build: ./docker/postfix + volumes: + - "./sympa/shared:/etc/sympa/shared" + - "./postfix/log:/var/log/postfix" + - "spool_postfix:/var/spool/postfix" + environment: + POSTFIX_VIRTUAL_DOMAINS: + MAILNAME: + MY_NETWORKS: + ROOT_ALIAS: + MY_DESTINATION: + + pgsql: image: postgres restart: always @@ -39,5 +53,6 @@ services: volumes: pgdata: spool_sympa: + spool_postfix: spool_nullmailer: lib_sympa: diff --git a/docker/entrypoint.sh b/docker/entrypoint.sh deleted file mode 100755 index 00918dc6cb545aae4ab9dcea02b75a53327f4889..0000000000000000000000000000000000000000 --- a/docker/entrypoint.sh +++ /dev/null @@ -1,31 +0,0 @@ -#!/bin/bash - -# Populate volume -if [ -z "$(ls /etc/sympa/)" ]; then - cp -pr /etc/sympa.sample/* /etc/sympa/ -fi - -# Replace configurations by env -conf_file=/etc/sympa/sympa/sympa.conf -for var in $(env | grep '^SYMPA'); do - config=$(echo $var | sed 's/^SYMPA_\([^=]*\).*/\L\1/') - value=$(echo $var | sed 's/^[^=]*=\(.*\)/\1/') - sed -i -e "s#^$config\t.*#$config\t$value#" $conf_file - if [ -z "$(grep "^$config" $conf_file)" ]; - then - echo -e "$config\t$value" >> $conf_file - fi -done - -# Fix permissions -chown -R sympa:sympa /etc/sympa/ - -/bin/mkdir -p /run/sympa -/bin/chown sympa:sympa /run/sympa - -# Launch services -syslogd - -sudo -u sympa /usr/lib/sympa/bin/sympa_msg.pl -/usr/bin/sympa --health_check -exec apache2ctl -DFOREGROUND diff --git a/docker/postfix/Dockerfile b/docker/postfix/Dockerfile new file mode 100644 index 0000000000000000000000000000000000000000..cce82f4540c1bc4e41c2d400ebf698615ea4b284 --- /dev/null +++ b/docker/postfix/Dockerfile @@ -0,0 +1,12 @@ +# Dockerfile inspired from https://github.com/cloyne/docker-postfix +FROM tozd/postfix:ubuntu-focal + +VOLUME /etc/sympa/shared + +RUN apt-get update -q -q && \ + apt-get install adduser openssh-client --yes --force-yes && \ + adduser --system --group mailpipe --no-create-home --home /nonexistent && \ + cp /etc/postfix/main.cf /etc/postfix/main.cf.orig && \ + cp /etc/postfix/master.cf /etc/postfix/master.cf.orig + +COPY ./etc /etc diff --git a/docker/postfix/etc/aliases b/docker/postfix/etc/aliases new file mode 100644 index 0000000000000000000000000000000000000000..7e5a8121dec20ac421b4970d76c3de79c705198f --- /dev/null +++ b/docker/postfix/etc/aliases @@ -0,0 +1,16 @@ +# You probably want to edit /etc/postfix/global_alias instead, +# that file is used for e-mail coming externally. + +mailer-daemon: postmaster +postmaster: root +nobody: root +hostmaster: root +usenet: root +news: root +webmaster: root +www: webmaster +ftp: root +abuse: root +noc: root +security: root +postfix: root diff --git a/docker/postfix/etc/postfix/global_alias b/docker/postfix/etc/postfix/global_alias new file mode 100644 index 0000000000000000000000000000000000000000..bbb3322fb299d57836f10777968dd2316896b597 --- /dev/null +++ b/docker/postfix/etc/postfix/global_alias @@ -0,0 +1 @@ +/^(mailer-daemon|postmaster|nobody|hostmaster|usenet|news|webmaster|www|ftp|abuse|noc|security|postfix|root)@/ root diff --git a/docker/postfix/etc/postfix/main.cf.append b/docker/postfix/etc/postfix/main.cf.append new file mode 100644 index 0000000000000000000000000000000000000000..e0ad4b530662a4115dd82e8b9a1d96196fb31c00 --- /dev/null +++ b/docker/postfix/etc/postfix/main.cf.append @@ -0,0 +1,22 @@ + +# main.cf.append is appended to main.cf when running a Docker image. +# To modify everything below here modify main.cf.append and run a Docker +# image again. + +virtual_mailbox_domains = POSTFIX_VIRTUAL_DOMAINS + +virtual_minimum_uid = 65534 +virtual_uid_maps = static:65534 +virtual_gid_maps = static:65534 +virtual_mailbox_base = /tmp + +virtual_alias_maps = + regexp:/etc/postfix/global_alias + regexp:/etc/sympa/shared/sympa_rewrite +transport_maps = + regexp:/etc/sympa/shared/sympa_transport + +sympa_destination_recipient_limit = 1 +sympadomain_destination_recipient_limit = 1 +sympabounce_destination_recipient_limit = 1 +sympabouncedomain_destination_recipient_limit = 1 diff --git a/docker/postfix/etc/postfix/master.cf.append b/docker/postfix/etc/postfix/master.cf.append new file mode 100644 index 0000000000000000000000000000000000000000..fd0c6cc1e774c0000268aae2050c74f2f2d2a265 --- /dev/null +++ b/docker/postfix/etc/postfix/master.cf.append @@ -0,0 +1,16 @@ +# master.cf.append is appended to master.cf when running a Docker image. +# To modify everything below here modify master.cf.append and run a Docker +# image again. + +sympa unix - n n - - pipe + -o soft_bounce=yes + flags=RF user=mailpipe:mailpipe argv=/usr/bin/ssh -i /etc/sympa/shared/id_rsa -o UserKnownHostsFile=/etc/sympa/shared/known_hosts -T sympa@sympa queue ${recipient} +sympadomain unix - n n - - pipe + -o soft_bounce=yes + flags=RF user=mailpipe:mailpipe argv=/usr/bin/ssh -i /etc/sympa/shared/id_rsa -o UserKnownHostsFile=/etc/sympa/shared/known_hosts -T sympa@sympa queue sympa@${domain} +sympabounce unix - n n - - pipe + -o soft_bounce=yes + flags=RF user=mailpipe:mailpipe argv=/usr/bin/ssh -i /etc/sympa/shared/id_rsa -o UserKnownHostsFile=/etc/sympa/shared/known_hosts -T sympa@sympa bouncequeue ${user}@${domain} +sympabouncedomain unix - n n - - pipe + -o soft_bounce=yes + flags=RF user=mailpipe:mailpipe argv=/usr/bin/ssh -i /etc/sympa/shared/id_rsa -o UserKnownHostsFile=/etc/sympa/shared/known_hosts -T sympa@sympa bouncequeue sympa@${domain} diff --git a/docker/postfix/etc/service/postfix/run.config b/docker/postfix/etc/service/postfix/run.config new file mode 100644 index 0000000000000000000000000000000000000000..6459d8431632eed9ce6f04d7f84226b9683241e6 --- /dev/null +++ b/docker/postfix/etc/service/postfix/run.config @@ -0,0 +1,2 @@ +sed "s/POSTFIX_VIRTUAL_DOMAINS/$POSTFIX_VIRTUAL_DOMAINS/g" /etc/postfix/main.cf.append > /etc/postfix/main.cf +cat /etc/postfix/master.cf.orig /etc/postfix/master.cf.append > /etc/postfix/master.cf diff --git a/docker/postfix/etc/service/postfix/run.initialization b/docker/postfix/etc/service/postfix/run.initialization new file mode 100644 index 0000000000000000000000000000000000000000..c710aa3c74a4762385bf711ecfe5466a04703328 --- /dev/null +++ b/docker/postfix/etc/service/postfix/run.initialization @@ -0,0 +1,3 @@ +if [ -e /etc/sympa/shared/id_rsa ]; then + chown mailpipe /etc/sympa/shared/id_rsa* +fi diff --git a/docker/Dockerfile b/docker/sympa/Dockerfile similarity index 92% rename from docker/Dockerfile rename to docker/sympa/Dockerfile index a2344fe0b088f69a66f52b923e7c8dee1f7f9423..837456f10ba492ef1c74e35c02be89b6e47f54fa 100644 --- a/docker/Dockerfile +++ b/docker/sympa/Dockerfile @@ -10,6 +10,7 @@ RUN apt-get -y install \ libapache2-mod-fcgid \ libdbd-pg-perl \ libfcgi-perl \ + openssh-server \ sudo RUN apt-get -y install --no-install-recommends sympa @@ -24,6 +25,8 @@ RUN echo "local1.* -/var/log/sympa.log" >> /etc/syslog.conf RUN cp -r /etc/sympa /etc/sympa.sample +COPY run.sh /opt/sympa_run.sh + COPY entrypoint.sh /entrypoint ENTRYPOINT /entrypoint diff --git a/docker/sympa/entrypoint.sh b/docker/sympa/entrypoint.sh new file mode 100755 index 0000000000000000000000000000000000000000..37acf304655f17f25382d92d5f780318d3e38c64 --- /dev/null +++ b/docker/sympa/entrypoint.sh @@ -0,0 +1,58 @@ +#!/bin/bash + +# Populate volume +if [ -z "$(ls /etc/sympa/)" ]; then + cp -pr /etc/sympa.sample/* /etc/sympa/ +fi + +# Replace configurations by env +conf_file=/etc/sympa/sympa/sympa.conf +for var in $(env | grep '^SYMPA'); do + config=$(echo $var | sed 's/^SYMPA_\([^=]*\).*/\L\1/') + value=$(echo $var | sed 's/^[^=]*=\(.*\)/\1/') + sed -i -e "s#^$config\t.*#$config\t$value#" $conf_file + if [ -z "$(grep "^$config" $conf_file)" ]; + then + echo -e "$config\t$value" >> $conf_file + fi +done + +cp /opt/sympa_run.sh /etc/sympa/run.sh +chmod +x /etc/sympa/run.sh +# Fix permissions +chown -R sympa:sympa /etc/sympa/ + +/bin/mkdir -p /run/sympa +/bin/chown sympa:sympa /run/sympa + +# Launch services +syslogd + +# So that Postfix can connect into us to deliver e-mail to mailing lists. /etc/sympa/shared is a +# volume shared with the Postfix container which contains the SSH key that container should use +# when connecting to this container. +mkdir -p /etc/sympa/shared +# If SSH keys do not exist, create them. +if [ ! -e /etc/sympa/shared/id_rsa ]; then + ssh-keygen -t rsa -f /etc/sympa/shared/id_rsa -N '' +fi + +rm -f /etc/sympa/shared/known_hosts +echo -n 'sympa ' > /etc/sympa/shared/known_hosts +cat /etc/ssh/ssh_host_rsa_key.pub >> /etc/sympa/shared/known_hosts +# Allow sympa user to ssh +usermod -s /bin/sh sympa + +mkdir -p /var/lib/sympa/.ssh +echo -n 'no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty,command="/etc/sympa/run.sh" ' > /var/lib/sympa/.ssh/authorized_keys +cat /etc/sympa/shared/id_rsa.pub >> /var/lib/sympa/.ssh/authorized_keys + +# Remove any stale config binaries. +rm -f /etc/sympa/*/*.bin + +sudo -u sympa /usr/lib/sympa/bin/sympa_automatic.pl --foreground 2>&1 & +sudo -u sympa /usr/lib/sympa/bin/sympa_msg.pl +/usr/bin/sympa --health_check +mkdir -p /var/run/sshd +/usr/sbin/sshd -D -e & +exec apache2ctl -DFOREGROUND