First working version of the ispconfig roundcube

- Completly rebuild the container startup to be less brute-forcish
- All relevant configs now lie in the external volume
- DB init is only done if a new config is written.
- ENV Vars are only needed if you want to automatically write a config
- Cleaned up everything
This commit is contained in:
Torben Nehmer 2018-10-25 22:10:01 +02:00
parent d3ed55ffb6
commit a62fa88008
4 changed files with 54 additions and 106 deletions

View File

@ -54,13 +54,14 @@ RUN set -ex; \
# expose these volumes # expose these volumes
VOLUME /var/roundcube/config VOLUME /var/roundcube/config
VOLUME /tmp/roundcube-temp
# Define Roundcubemail version # Define Roundcubemail version
ENV ROUNDCUBEMAIL_VERSION 1.3.7 ENV ROUNDCUBEMAIL_VERSION 1.3.7
# Publish the rootfs file into the container # Set the entry point
ADD rootfs.tar.gz /
ENTRYPOINT ["/docker-entrypoint.sh"] ENTRYPOINT ["/docker-entrypoint.sh"]
CMD ["apache2-foreground"] CMD ["apache2-foreground"]
# Finally, publish the rootfs file into the container
# This is done as last step to make docker build caching more efficient.
ADD rootfs.tar.gz /

View File

@ -1,13 +1,15 @@
<?php <?php
# DB Config style taken from the Debian maintainers, making things simpler
# as PHP is easier to manage here than bash substituion magic.
include_once("/var/roundcube/config/db.inc.php"); include_once("/var/roundcube/config/db.inc.php");
switch ($dbtype) { switch ($dbtype) {
case "sqlite": case "sqlite":
$config['db_dsnw'] = "sqlite:///$basepath/$dbname?mode=0640"; $config['db_dsnw'] = "sqlite:///var/roundcube/config/sqlite.db?mode=0640";
break; break;
default: default:
if ($dbport != '') $dbport=":$dbport"; if ($dbport != '') $dbport=":$dbport";
if ($dbserver == '') $dbserver="localhost";
$config['db_dsnw'] = "$dbtype://$dbuser:$dbpass@$dbserver$dbport/$dbname"; $config['db_dsnw'] = "$dbtype://$dbuser:$dbpass@$dbserver$dbport/$dbname";
break; break;
} }

View File

@ -1,101 +1,38 @@
#!/bin/bash #!/bin/bash
# set -ex set -ex
# PWD=`pwd` if [[ "$1" == apache2* ]] || [ "$1" == php-fpm ] || [ "$1" == "testmode" ]; then
if [[ "$1" == apache2* ]] || [ "$1" == php-fpm ]; then # Wait for DB Server
if ! [ -e index.php -a -e bin/installto.sh ]; then if [ "$ROUNDCUBEMAIL_DB_TYPE" == "pgsql" ]; then
/usr/local/sbin/wait-for-it.sh ${ROUNDCUBEMAIL_DB_HOST}:${ROUNDCUBEMAIL_DB_PORT:-5432} -t 30
#### TODO SUPERSEEDED BY container build elif [ "$ROUNDCUBEMAIL_DB_TYPE" == "mysql" ]; then
/usr/local/sbin/wait-for-it.sh ${ROUNDCUBEMAIL_DB_HOST}:${ROUNDCUBEMAIL_DB_PORT:-3306} -t 30
echo >&2 "roundcubemail not found in $PWD - copying now..."
if [ "$(ls -A)" ]; then
echo >&2 "WARNING: $PWD is not empty - press Ctrl+C now if this is an error!"
( set -x; ls -A; sleep 10 )
fi
tar cf - --one-file-system -C /usr/src/roundcubemail . | tar xf -
echo >&2 "Complete! ROUNDCUBEMAIL has been successfully copied to $PWD"
fi fi
if [ ! -z "${!POSTGRES_ENV_POSTGRES_*}" ] || [ "$ROUNDCUBEMAIL_DB_TYPE" == "pgsql" ]; then # Create configuration if required, then init the database.
: "${ROUNDCUBEMAIL_DB_TYPE:=pgsql}" if [ ! -e /var/roundcube/config/config.inc.php ]; then
: "${ROUNDCUBEMAIL_DB_HOST:=postgres}" /usr/local/sbin/write-config.sh
: "${ROUNDCUBEMAIL_DB_USER:=${POSTGRES_ENV_POSTGRES_USER}}" /var/www/html/bin/initdb.sh --dir=/var/www/html/SQL \
: "${ROUNDCUBEMAIL_DB_PASSWORD:=${POSTGRES_ENV_POSTGRES_PASSWORD}}" || echo "initdb.sh failed to execute, please bash into the container and run it manually."
: "${ROUNDCUBEMAIL_DB_NAME:=${POSTGRES_ENV_POSTGRES_DB:-roundcubemail}}"
: "${ROUNDCUBEMAIL_DSNW:=${ROUNDCUBEMAIL_DB_TYPE}://${ROUNDCUBEMAIL_DB_USER}:${ROUNDCUBEMAIL_DB_PASSWORD}@${ROUNDCUBEMAIL_DB_HOST}/${ROUNDCUBEMAIL_DB_NAME}}"
/wait-for-it.sh ${ROUNDCUBEMAIL_DB_HOST}:5432 -t 30
elif [ ! -z "${!MYSQL_ENV_MYSQL_*}" ] || [ "$ROUNDCUBEMAIL_DB_TYPE" == "mysql" ]; then
: "${ROUNDCUBEMAIL_DB_TYPE:=mysql}"
: "${ROUNDCUBEMAIL_DB_HOST:=mysql}"
: "${ROUNDCUBEMAIL_DB_USER:=${MYSQL_ENV_MYSQL_USER:-root}}"
if [ "$ROUNDCUBEMAIL_DB_USER" = 'root' ]; then
: "${ROUNDCUBEMAIL_DB_PASSWORD:=${MYSQL_ENV_MYSQL_ROOT_PASSWORD}}"
else
: "${ROUNDCUBEMAIL_DB_PASSWORD:=${MYSQL_ENV_MYSQL_PASSWORD}}"
fi
: "${ROUNDCUBEMAIL_DB_NAME:=${MYSQL_ENV_MYSQL_DATABASE:-roundcubemail}}"
: "${ROUNDCUBEMAIL_DSNW:=${ROUNDCUBEMAIL_DB_TYPE}://${ROUNDCUBEMAIL_DB_USER}:${ROUNDCUBEMAIL_DB_PASSWORD}@${ROUNDCUBEMAIL_DB_HOST}/${ROUNDCUBEMAIL_DB_NAME}}"
/wait-for-it.sh ${ROUNDCUBEMAIL_DB_HOST}:3306 -t 30
else
# use local SQLite DB in /var/www/html/db
: "${ROUNDCUBEMAIL_DB_TYPE:=sqlite}"
: "${ROUNDCUBEMAIL_DB_DIR:=$PWD/db}"
: "${ROUNDCUBEMAIL_DB_NAME:=sqlite}"
: "${ROUNDCUBEMAIL_DSNW:=${ROUNDCUBEMAIL_DB_TYPE}:///$ROUNDCUBEMAIL_DB_DIR/${ROUNDCUBEMAIL_DB_NAME}.db?mode=0646}"
mkdir -p $ROUNDCUBEMAIL_DB_DIR
chown www-data:www-data $ROUNDCUBEMAIL_DB_DIR
fi
: "${ROUNDCUBEMAIL_DEFAULT_HOST:=localhost}"
: "${ROUNDCUBEMAIL_DEFAULT_PORT:=143}"
: "${ROUNDCUBEMAIL_SMTP_SERVER:=localhost}"
: "${ROUNDCUBEMAIL_SMTP_PORT:=587}"
: "${ROUNDCUBEMAIL_PLUGINS:=archive,zipdownload}"
: "${ROUNDCUBEMAIL_TEMP_DIR:=/tmp/roundcube-temp}"
if [ ! -e config/config.inc.php ]; then
#### TODO SUPERSEEDED BY write-config.sh
ROUNDCUBEMAIL_PLUGINS_PHP=`echo "${ROUNDCUBEMAIL_PLUGINS}" | sed -E "s/[, ]+/', '/g"`
mkdir -p ${ROUNDCUBEMAIL_TEMP_DIR} && chown www-data ${ROUNDCUBEMAIL_TEMP_DIR}
touch config/config.inc.php
echo "Write config to $PWD/config/config.inc.php"
echo "<?php
\$config['db_dsnw'] = '${ROUNDCUBEMAIL_DSNW}';
\$config['db_dsnr'] = '${ROUNDCUBEMAIL_DSNR}';
\$config['default_host'] = '${ROUNDCUBEMAIL_DEFAULT_HOST}';
\$config['default_port'] = '${ROUNDCUBEMAIL_DEFAULT_PORT}';
\$config['smtp_server'] = '${ROUNDCUBEMAIL_SMTP_SERVER}';
\$config['smtp_port'] = '${ROUNDCUBEMAIL_SMTP_PORT}';
\$config['smtp_user'] = '%u';
\$config['smtp_pass'] = '%p';
\$config['temp_dir'] = '${ROUNDCUBEMAIL_TEMP_DIR}';
\$config['plugins'] = ['${ROUNDCUBEMAIL_PLUGINS_PHP}'];
\$config['zipdownload_selection'] = true;
\$config['log_driver'] = 'stdout';
" > config/config.inc.php
for fn in `ls /var/roundcube/config/*.php 2>/dev/null || true`; do
echo "include('$fn');" >> config/config.inc.php
done
# initialize DB if not SQLite
echo "${ROUNDCUBEMAIL_DSNW}" | grep -q 'sqlite:' || bin/initdb.sh --dir=$PWD/SQL || bin/updatedb.sh --dir=$PWD/SQL --package=roundcube || echo "Failed to initialize databse. Please run $PWD/bin/initdb.sh manually."
else
echo "WARNING: $PWD/config/config.inc.php already exists."
echo "ROUNDCUBEMAIL_* environment variables have been ignored."
fi fi
/var/www/html/bin/updatedb.sh --dir=/var/www/html/SQL --package=roundcube \
|| echo "updatedb.sh failed to execute, please bash into the container and run it manually."
# Add Filesize limits to PHP config
if [ ! -z "${ROUNDCUBEMAIL_UPLOAD_MAX_FILESIZE}" ]; then if [ ! -z "${ROUNDCUBEMAIL_UPLOAD_MAX_FILESIZE}" ]; then
echo "upload_max_filesize=${ROUNDCUBEMAIL_UPLOAD_MAX_FILESIZE}" >> /usr/local/etc/php/conf.d/roundcube-override.ini echo "upload_max_filesize=${ROUNDCUBEMAIL_UPLOAD_MAX_FILESIZE}" > /usr/local/etc/php/conf.d/roundcube-filesize.ini
echo "post_max_size=${ROUNDCUBEMAIL_UPLOAD_MAX_FILESIZE}" >> /usr/local/etc/php/conf.d/roundcube-override.ini echo "post_max_size=${ROUNDCUBEMAIL_UPLOAD_MAX_FILESIZE}" >> /usr/local/etc/php/conf.d/roundcube-filesize.ini
fi fi
# Move Dist config files into the volume
cp /var/www/html/config/defaults.inc.php /var/roundcube/config/defaults.inc.php.sample
cp /var/www/html/config/config.inc.php.sample /var/roundcube/config/
cp /var/www/html/plugins/ispconfig3_account/config/config.inc.php.dist /var/roundcube/config/ispconfig3_account.inc.php.sample
fi fi
exec "$@" if [ "$1" == "testmode" ]; then
exec /bin/bash
else
exec "$@"
fi

View File

@ -1,27 +1,35 @@
#!/bin/bash #!/bin/bash
# set -ex set -ex
CONFIG=/var/roundcube/config/config.inc.php DB_CONFIG_FILE=/var/roundcube/config/db.inc.php
MAIN_CONFIG=/var/roundcube/config/config.inc.php
echo "Writing ${DB_CONFIG_FILE}..."
echo "<?php
\$dbuser='${ROUNDCUBEMAIL_DB_USER}';
\$dbpass='${ROUNDCUBEMAIL_DB_PASSWORD}';
\$dbname='${ROUNDCUBEMAIL_DB_NAME}';
\$dbserver='${ROUNDCUBEMAIL_DB_HOST}';
\$dbport='${ROUNDCUBEMAIL_DB_PORT}';
\$dbtype='${ROUNDCUBEMAIL_DB_TYPE}';
?>
" > ${DB_CONFIG_FILE}
ROUNDCUBEMAIL_PLUGINS_PHP=`echo "${ROUNDCUBEMAIL_PLUGINS}" | sed -E "s/[, ]+/', '/g"` ROUNDCUBEMAIL_PLUGINS_PHP=`echo "${ROUNDCUBEMAIL_PLUGINS}" | sed -E "s/[, ]+/', '/g"`
mkdir -p ${ROUNDCUBEMAIL_TEMP_DIR} && chown www-data ${ROUNDCUBEMAIL_TEMP_DIR}
touch $CONFIG
echo "Write config to $PWD/config/config.inc.php" echo "Write config to $PWD/config/config.inc.php"
echo "<?php echo "<?php
\$config['db_dsnw'] = '${ROUNDCUBEMAIL_DSNW}'; include_once('/var/www/html/config/db.inc.php');
\$config['db_dsnr'] = '${ROUNDCUBEMAIL_DSNR}';
\$config['default_host'] = '${ROUNDCUBEMAIL_DEFAULT_HOST}'; \$config['default_host'] = '${ROUNDCUBEMAIL_DEFAULT_HOST}';
\$config['default_port'] = '${ROUNDCUBEMAIL_DEFAULT_PORT}'; \$config['default_port'] = '${ROUNDCUBEMAIL_DEFAULT_PORT}';
\$config['smtp_server'] = '${ROUNDCUBEMAIL_SMTP_SERVER}'; \$config['smtp_server'] = '${ROUNDCUBEMAIL_SMTP_SERVER}';
\$config['smtp_port'] = '${ROUNDCUBEMAIL_SMTP_PORT}'; \$config['smtp_port'] = '${ROUNDCUBEMAIL_SMTP_PORT}';
\$config['smtp_user'] = '%u'; \$config['smtp_user'] = '%u';
\$config['smtp_pass'] = '%p'; \$config['smtp_pass'] = '%p';
\$config['temp_dir'] = '${ROUNDCUBEMAIL_TEMP_DIR}';
\$config['plugins'] = ['${ROUNDCUBEMAIL_PLUGINS_PHP}']; \$config['plugins'] = ['${ROUNDCUBEMAIL_PLUGINS_PHP}'];
\$config['zipdownload_selection'] = true; \$config['zipdownload_selection'] = true;
\$config['log_driver'] = 'stdout'; \$config['log_driver'] = 'stdout';
" > $CONFIG ?>
" > $MAIN_CONFIG