diff --git a/.semaphore/tests.yml b/.semaphore/tests.yml index 1698675..1679e7d 100644 --- a/.semaphore/tests.yml +++ b/.semaphore/tests.yml @@ -25,7 +25,11 @@ blocks: - docker-compose up -d - for i in {1..20}; do if [[ $(docker inspect postal | jq -r '.[].State.Health.Status') == "healthy" ]]; then break; elif [[ $i -eq 20 ]]; then exit 1; else sleep 15; fi; done; promotions: - - name: Default Promotion - pipeline_file: upload.yml + - name: Upload to Production + pipeline_file: upload-production.yml auto_promote: - when: result = 'passed' + when: result = 'passed' and branch = 'master' + - name: Dummy Upload + pipeline_file: upload-dummy.yml + auto_promote: + when: result = 'passed' and branch != 'master' diff --git a/.semaphore/upload-dummy.yml b/.semaphore/upload-dummy.yml new file mode 100644 index 0000000..d6fd0b4 --- /dev/null +++ b/.semaphore/upload-dummy.yml @@ -0,0 +1,20 @@ +version: v1.0 +name: Docker Image Upload +agent: + machine: + type: e1-standard-2 + os_image: ubuntu1804 +global_job_config: + secrets: + - name: DOCKER_GITHUB + - name: DOCKER_HUB +blocks: + - name: Upload + task: + jobs: + - name: 'Alpine Upload' + commands: + - artifact yank workflow postal-alpine-container.tar + - name: 'Ubuntu Upload' + commands: + - artifact yank workflow postal-ubuntu-container.tar diff --git a/.semaphore/upload.yml b/.semaphore/upload-production.yml similarity index 100% rename from .semaphore/upload.yml rename to .semaphore/upload-production.yml diff --git a/README.md b/README.md index 34dcd28..e3ecc75 100644 --- a/README.md +++ b/README.md @@ -46,6 +46,9 @@ Port mappings may change (as they have in the past). If SMTP/HTTP(s) is not work The initial design for the container was to be simple, minimal, and customizable, so Spamassassin and ClamAV are not included by default. Feel free to fork and add to the Dockerfile (though you must set docker-compose.yml to build from Dockerfile and not pull an image), or add them by linking additional containers. ### Updates +- v3.1.0 + * Fixed username/password injection problem during user creation by adding sleep inbetween entries + * Missed mount - v3.0.0 * Move to Gitlab with automated testing * Add user creation system for more reliability diff --git a/alpine/src/docker-entrypoint.sh b/alpine/src/docker-entrypoint.sh index e35992e..54948f4 100755 --- a/alpine/src/docker-entrypoint.sh +++ b/alpine/src/docker-entrypoint.sh @@ -4,13 +4,16 @@ rm -rf /opt/postal/tmp/pids/* rm -rf /tmp/postal -## Check if existing config -if [ $(ls /storage | wc -l) > 0 ]; then - cp /storage/* /opt/postal/config/* -fi +## Wait for MySQL and RabbitMQ to start up +echo "== Waiting for MySQL and RabbitMQ to start up ==" +dockerize -timeout 60m -wait tcp://mysql:3306 -wait tcp://rabbitmq:5672 -## Generate config -if [ ! -f /opt/postal/config/postal.yml ] || [[ $(cat /opt/postal/config/postal.yml | wc -l) < 2 ]]; then +echo "== Building Config ==" +echo "postal.yml" +if [ -f /storage/postal.yml ]; then + rm -f /opt/postal/config/postal.yml + ln -s /storage/postal.yml /opt/postal/config/postal.yml +elif [ ! -f /opt/postal/config/postal.yml ] || [[ $(cat /opt/postal/config/postal.yml | wc -l) < 2 ]]; then ## Build Jinja2 Template p2 -t /templates/postal.example.yml.j2 -o /opt/postal/config/postal.example.yml ## Add in secret key building @@ -18,21 +21,49 @@ if [ ! -f /opt/postal/config/postal.yml ] || [[ $(cat /opt/postal/config/postal. echo " secret_key: {{secretkey}}" >> /opt/postal/config/postal.example.yml ## Generate config and keys /opt/postal/bin/postal initialize-config - ## Wait for MySQL and RabbitMQ to start up - echo "== Waiting for MySQL and RabbitMQ to start up ==" - dockerize -timeout 60m -wait tcp://mysql:3306 -wait tcp://rabbitmq:5672 /opt/postal/bin/postal initialize /create-user.sh ## Copy over config to persistent storage - cp /opt/postal/config/postal.yml /storage/postal.yml - cp /opt/postal/config/fast_server.cert /storage/fast_server.cert - cp /opt/postal/config/fast_server.key /storage/fast_server.key - cp /opt/postal/config/lets_encrypt.pem /storage/lets_encrypt.pem - cp /opt/postal/config/signing.key /storage/signing.key -else - ## Wait for MySQL and RabbitMQ to start up - echo "== Waiting for MySQL and RabbitMQ to start up ==" - dockerize -timeout 60m -wait tcp://mysql:3306 -wait tcp://rabbitmq:5672 + cp -p /opt/postal/config/postal.yml /storage/postal.yml + rm /opt/postal/config/postal.yml + ln -s /storage/postal.yml /opt/postal/config/postal.yml fi +echo "fast_server.cert" +if [ -f /storage/fast_server.cert ]; then + rm -f /opt/postal/config/fast_server.cert + ln -s /storage/fast_server.cert /opt/postal/config/fast_server.cert +elif [ -f /opt/postal/config/fast_server.cert ] && [ ! -L /opt/postal/config/fast_server.cert ]; then + cp -p /opt/postal/config/fast_server.cert /storage/fast_server.cert + rm /opt/postal/config/fast_server.cert + ln -s /storage/fast_server.cert /opt/postal/config/fast_server.cert +fi +echo "fast_server.key" +if [ -f /storage/fast_server.key ]; then + rm -f /opt/postal/config/fast_server.key + ln -s /storage/fast_server.key /opt/postal/config/fast_server.key +elif [ -f /opt/postal/config/fast_server.key ] && [ ! -L /opt/postal/config/fast_server.key ]; then + cp -p /opt/postal/config/fast_server.key /storage/fast_server.key + rm /opt/postal/config/fast_server.key + ln -s /storage/fast_server.key /opt/postal/config/fast_server.key +fi +echo "lets_encrypt.pem" +if [ -f /storage/lets_encrypt.pem ]; then + rm -f /opt/postal/config/lets_encrypt.pem + ln -s /storage/lets_encrypt.pem /opt/postal/config/lets_encrypt.pem +elif [ -f /opt/postal/config/lets_encrypt.pem ] && [ ! -L /opt/postal/config/lets_encrypt.pem ]; then + cp -p /opt/postal/config/lets_encrypt.pem /storage/lets_encrypt.pem + rm /opt/postal/config/lets_encrypt.pem + ln -s /storage/lets_encrypt.pem /opt/postal/config/lets_encrypt.pem +fi +echo "signing.key" +if [ -f /storage/signing.key ]; then + rm -f /opt/postal/config/signing.key + ln -s /storage/signing.key /opt/postal/config/signing.key +elif [ -f /opt/postal/config/signing.key ] && [ ! -L /opt/postal/config/signing.key ]; then + cp -p /opt/postal/config/signing.key /storage/signing.key + rm /opt/postal/config/signing.key + ln -s /storage/signing.key /opt/postal/config/signing.key +fi + ## Start Postal /opt/postal/bin/postal "$@" diff --git a/ubuntu/src/docker-entrypoint.sh b/ubuntu/src/docker-entrypoint.sh index e35992e..6f6edab 100755 --- a/ubuntu/src/docker-entrypoint.sh +++ b/ubuntu/src/docker-entrypoint.sh @@ -4,13 +4,17 @@ rm -rf /opt/postal/tmp/pids/* rm -rf /tmp/postal -## Check if existing config -if [ $(ls /storage | wc -l) > 0 ]; then - cp /storage/* /opt/postal/config/* -fi +## Wait for MySQL and RabbitMQ to start up +echo "== Waiting for MySQL and RabbitMQ to start up ==" +dockerize -timeout 60m -wait tcp://mysql:3306 -wait tcp://rabbitmq:5672 ## Generate config -if [ ! -f /opt/postal/config/postal.yml ] || [[ $(cat /opt/postal/config/postal.yml | wc -l) < 2 ]]; then +echo "== Building Config ==" +echo "postal.yml" +if [ -f /storage/postal.yml ]; then + rm -f /opt/postal/config/postal.yml + ln -s /storage/postal.yml /opt/postal/config/postal.yml +elif [ ! -f /opt/postal/config/postal.yml ] || [[ $(cat /opt/postal/config/postal.yml | wc -l) < 2 ]]; then ## Build Jinja2 Template p2 -t /templates/postal.example.yml.j2 -o /opt/postal/config/postal.example.yml ## Add in secret key building @@ -25,14 +29,45 @@ if [ ! -f /opt/postal/config/postal.yml ] || [[ $(cat /opt/postal/config/postal. /create-user.sh ## Copy over config to persistent storage cp /opt/postal/config/postal.yml /storage/postal.yml - cp /opt/postal/config/fast_server.cert /storage/fast_server.cert - cp /opt/postal/config/fast_server.key /storage/fast_server.key - cp /opt/postal/config/lets_encrypt.pem /storage/lets_encrypt.pem - cp /opt/postal/config/signing.key /storage/signing.key -else - ## Wait for MySQL and RabbitMQ to start up - echo "== Waiting for MySQL and RabbitMQ to start up ==" - dockerize -timeout 60m -wait tcp://mysql:3306 -wait tcp://rabbitmq:5672 + rm /opt/postal/config/postal.yml + ln -s /storage/postal.yml /opt/postal/config/postal.yml fi +echo "fast_server.cert" +if [ -f /storage/fast_server.cert ]; then + rm -f /opt/postal/config/fast_server.cert + ln -s /storage/fast_server.cert /opt/postal/config/fast_server.cert +elif [ -f /opt/postal/config/fast_server.cert ] && [ ! -L /opt/postal/config/fast_server.cert ]; then + cp -p /opt/postal/config/fast_server.cert /storage/fast_server.cert + rm /opt/postal/config/fast_server.cert + ln -s /storage/fast_server.cert /opt/postal/config/fast_server.cert +fi +echo "fast_server.key" +if [ -f /storage/fast_server.key ]; then + rm -f /opt/postal/config/fast_server.key + ln -s /storage/fast_server.key /opt/postal/config/fast_server.key +elif [ -f /opt/postal/config/fast_server.key ] && [ ! -L /opt/postal/config/fast_server.key ]; then + cp -p /opt/postal/config/fast_server.key /storage/fast_server.key + rm /opt/postal/config/fast_server.key + ln -s /storage/fast_server.key /opt/postal/config/fast_server.key +fi +echo "lets_encrypt.pem" +if [ -f /storage/lets_encrypt.pem ]; then + rm -f /opt/postal/config/lets_encrypt.pem + ln -s /storage/lets_encrypt.pem /opt/postal/config/lets_encrypt.pem +elif [ -f /opt/postal/config/lets_encrypt.pem ] && [ ! -L /opt/postal/config/lets_encrypt.pem ]; then + cp -p /opt/postal/config/lets_encrypt.pem /storage/lets_encrypt.pem + rm /opt/postal/config/lets_encrypt.pem + ln -s /storage/lets_encrypt.pem /opt/postal/config/lets_encrypt.pem +fi +echo "signing.key" +if [ -f /storage/signing.key ]; then + rm -f /opt/postal/config/signing.key + ln -s /storage/signing.key /opt/postal/config/signing.key +elif [ -f /opt/postal/config/signing.key ] && [ ! -L /opt/postal/config/signing.key ]; then + cp -p /opt/postal/config/signing.key /storage/signing.key + rm /opt/postal/config/signing.key + ln -s /storage/signing.key /opt/postal/config/signing.key +fi + ## Start Postal /opt/postal/bin/postal "$@"