#!/usr/bin/env bash # Exit if any errors pop up set -e # Exit if setup has already been run if [ -d /var/lib/mysql/${MYVEMAIL_POSTFIXADMIN_DBNAME}/ ] then echo "Setup appears to have already been completed, exiting..." exit 1 fi # Function to wait for mariadb to be ready function wait_for_mariadb_start { until mariadb --user=root --database=mysql -e "show tables;" >/dev/null do sleep 1 done } # Function to wait for mariadb to fully exit function wait_for_mariadb_stop { mariadb --user=root -e "shutdown;" until ! mariadb --user=root --database=mysql -e "show tables;" >/dev/null do sleep 1 done } # Install mariadb if it isn't already installed if [ ! -d /var/lib/mysql/mysql/ ] then /usr/local/bin/install-mariadb fi # Start mariadb server mariadbd --user=root --datadir=/var/lib/mysql/ & wait_for_mariadb_start if [ ! -d /var/lib/mysql/${MYVEMAIL_POSTFIXADMIN_DBNAME}/ ] then # Postfixadmin database mariadb --user=root <<- POSTFIXADMIN CREATE DATABASE ${MYVEMAIL_POSTFIXADMIN_DBNAME}; GRANT ALL PRIVILEGES ON ${MYVEMAIL_POSTFIXADMIN_DBNAME}.* to '${MYVEMAIL_POSTFIXADMIN_DBUSER}'@'localhost' IDENTIFIED BY '${MYVEMAIL_POSTFIXADMIN_DBPASS}'; flush privileges; POSTFIXADMIN fi if ! mariadb --user=root --database=${MYVEMAIL_POSTFIXADMIN_DBNAME} -e "select * from domain;" | grep -q ${MYVEMAIL_DOMAIN} then # Mail username if [ -z ${MYVEMAIL_MAIL_USER} ] then echo -e '\n\e[1;34mType in your email username\e[0m' until [ ${MYVEMAIL_MAIL_USER} ] do read -r -p 'Username: ' MYVEMAIL_MAIL_USER [ ${MYVEMAIL_MAIL_USER} ] || echo -e '\n\e[1;31mUsername cannot be empty, try again\e[0m' done echo -e '\n\e[1;32mMail user '${MYVEMAIL_MAIL_USER}'@'${MYVEMAIL_DOMAIN}' has been saved\e[0m\n' fi # Mail account password echo -e '\e[1;34mCreate a password for your mail account\e[0m' until [ "${MYVEMAIL_MAIL_PASS}" = "${MYVEMAIL_MAIL_PASS2}" -a "${MYVEMAIL_MAIL_PASS}" ] do read -s -r -p 'Mail password: ' MYVEMAIL_MAIL_PASS read -s -r -p $'\nVerify mail password: ' MYVEMAIL_MAIL_PASS2 if [ -z "${MYVEMAIL_MAIL_PASS}" ] then echo -e '\n\n\e[1;31mPassword field cannot be empty, try again\e[0m' elif [ "${MYVEMAIL_MAIL_PASS}" != "${MYVEMAIL_MAIL_PASS2}" ] then echo -e '\n\n\e[1;31mPasswords did not match, try again\e[0m' fi done echo -e '\n\n\e[1;32mMail password has been saved\e[0m\n' # Postfixadmin password echo -e '\e[1;34mCreate a postfixadmin setup password\e[0m' until [ "${MYVEMAIL_POSTFIXADMIN_PASS}" = "${MYVEMAIL_POSTFIXADMIN_PASS2}" -a "${MYVEMAIL_POSTFIXADMIN_PASS}" ] do read -s -r -p 'Postfixadmin password: ' MYVEMAIL_POSTFIXADMIN_PASS read -s -r -p $'\nVerify Postfixadmin password: ' MYVEMAIL_POSTFIXADMIN_PASS2 if [ -z "${MYVEMAIL_POSTFIXADMIN_PASS}" ] then echo -e '\n\n\e[1;31mPassword field cannot be empty, try again\e[0m' elif [ "${MYVEMAIL_POSTFIXADMIN_PASS}" != "${MYVEMAIL_POSTFIXADMIN_PASS2}" ] then echo -e '\n\n\e[1;31mPasswords did not match, try again\e[0m' fi done echo -e '\n\n\e[1;32mPostfixadmin password has been saved\e[0m\n' # Install roundcube and postfixadmin if not already installed if [ ! -d /usr/share/webapps/roundcube ] || [ ! -d /usr/share/webapps/postfixadmin ] then mkdir -p /usr/share/webapps/{roundcube,postfixadmin} wget -q4 https://github.com/postfixadmin/postfixadmin/archive/refs/tags/$(wget -q4O- https://api.github.com/repos/postfixadmin/postfixadmin/releases/latest | grep tag_name | awk '{print $2}' | tr -d '"|,').tar.gz -O postfixadmin.tar.gz wget -q4 $(wget -q4O- https://api.github.com/repos/roundcube/roundcubemail/releases/latest | grep 'complete.tar.gz"$' | awk '{print $2}' | tr -d '"|,') -O roundcubemail.tar.gz tar zxf roundcubemail.tar.gz -C /usr/share/webapps/roundcube --strip-components 1 tar zxf postfixadmin.tar.gz -C /usr/share/webapps/postfixadmin --strip-components 1 # Postfixadmin mkdir /usr/share/webapps/postfixadmin/templates_c/ # Roundcube password plugin sed -e "/^\$config\['password_query'\]/ s/=.*/= 'UPDATE mailbox SET password=%P,modified=NOW() WHERE username=%u';/" \ -e "/^\$config\['password_algorithm'\]/ s/=.*/= 'dovecot';/" \ -e "/^\$config\['password_dovecotpw'\]/ s|=.*|= '/usr/bin/doveadm pw -r 5';|" \ -e "/^\$config\['password_dovecotpw_method'\]/ s/=.*/= 'ARGON2I';/" \ -e "/^\$config\['password_dovecotpw_with_method'\]/ s/=.*/= true;/" \ /usr/share/webapps/roundcube/plugins/password/config.inc.php.dist >/usr/share/webapps/roundcube/plugins/password/config.inc.php # Cleanup rm *.tar.gz /usr/share/webapps/roundcube/installer/ -r fi # Postfixadmin setup echo -e ' '\''postmaster@'${MYVEMAIL_DOMAIN}''\'', '\''eff'\'' => '\''postmaster@'${MYVEMAIL_DOMAIN}''\'', '\''dmarc'\'' => '\''postmaster@'${MYVEMAIL_DOMAIN}''\'', ); $CONF['\''password_validation'\''] = array( # # '\''/regular expression/'\'' => '\''$PALANG key (optional: + parameter)'\'', # '\''/.{5}/'\'' => '\''password_too_short 5'\'', # minimum length 5 characters # '\''/([a-zA-Z].*){3}/'\'' => '\''password_no_characters 3'\'', # must contain at least 3 characters # '\''/([0-9].*){2}/'\'' => '\''password_no_digits 2'\'', # must contain at least 2 digits ); $CONF['\''fetchmail'\''] = '\''NO'\''; $CONF['\''show_footer_text'\''] = '\''NO'\''; $CONF['\''quota'\''] = '\''YES'\''; $CONF['\''domain_quota'\''] = '\''YES'\''; $CONF['\''quota_multiplier'\''] = '\''1024000'\''; $CONF['\''used_quotas'\''] = '\''YES'\''; $CONF['\''new_quota_table'\''] = '\''YES'\''; $CONF['\''aliases'\''] = '\''0'\''; $CONF['\''mailboxes'\''] = '\''0'\''; $CONF['\''maxquota'\''] = '\''0'\''; $CONF['\''domain_quota_default'\''] = '\''0'\''; $CONF['\''password_expiration'\''] = '\''NO'\''; # Postfixadmin hash $CONF['\''setup_password'\''] = '\'$(php -r "echo password_hash('${MYVEMAIL_POSTFIXADMIN_PASS}', PASSWORD_DEFAULT);")\'';' | tee /usr/share/webapps/postfixadmin/config.local.php >/dev/null # Update Postfixadmin databases # https://git.banananet.work/banananetwork/postfixadmin/raw/commit/864065cd37ef34b6dab915206eea4bd2ac4ebaed/config.inc.php su -s /bin/bash ${MYVEMAIL_NGINX_USERGROUP} -c "php /usr/share/webapps/postfixadmin/public/upgrade.php" # Create Postfixadmin domain bash /usr/share/webapps/postfixadmin/scripts/postfixadmin-cli domain add "${MYVEMAIL_DOMAIN}" --aliases 0 --mailboxes 0 --maxquota 0 --quota 0 --active --default-aliases -q # Create Postfixadmin admin bash /usr/share/webapps/postfixadmin/scripts/postfixadmin-cli admin add "postmaster@${MYVEMAIL_DOMAIN}" --superadmin --active --domains "${MYVEMAIL_DOMAIN}" --password "${MYVEMAIL_POSTFIXADMIN_PASS}" --password2 "${MYVEMAIL_POSTFIXADMIN_PASS}" -q # Create Postfixadmin mail users bash /usr/share/webapps/postfixadmin/scripts/postfixadmin-cli mailbox add "postmaster@${MYVEMAIL_DOMAIN}" --active --password "${MYVEMAIL_POSTFIXADMIN_PASS}" --password2 "${MYVEMAIL_POSTFIXADMIN_PASS}" -q bash /usr/share/webapps/postfixadmin/scripts/postfixadmin-cli mailbox add "${MYVEMAIL_MAIL_USER}@${MYVEMAIL_DOMAIN}" --active --password "${MYVEMAIL_MAIL_PASS}" --password2 "${MYVEMAIL_MAIL_PASS}" -q # Create Postfixadmin mail catch-all alias bash /usr/share/webapps/postfixadmin/scripts/postfixadmin-cli alias add "*@${MYVEMAIL_DOMAIN}" --goto "${MYVEMAIL_MAIL_USER}@${MYVEMAIL_DOMAIN}" --active -q # Add extra domains to Postfixadmin domains+=(${MYVEMAIL_ADDMX//,/ }) for domain in ${domains[@]} do bash /usr/share/webapps/postfixadmin/scripts/postfixadmin-cli domain add "${domain}" --aliases 0 --mailboxes 0 --maxquota 0 --quota 0 --active --default-aliases -q >/dev/null done fi