From e27da1334397aed6105aeafeb2d344950b9f5da2 Mon Sep 17 00:00:00 2001 From: Philipp Holzer Date: Mon, 20 May 2019 18:59:28 +0200 Subject: [PATCH] Update to 2019.06-rc --- .travis.yml | 9 ++ 2019.06-rc/apache/Dockerfile | 114 +++++++++++++++ 2019.06-rc/apache/cron.sh | 11 ++ 2019.06-rc/apache/entrypoint.sh | 195 ++++++++++++++++++++++++++ 2019.06-rc/apache/upgrade.exclude | 11 ++ 2019.06-rc/fpm-alpine/Dockerfile | 97 +++++++++++++ 2019.06-rc/fpm-alpine/cron.sh | 11 ++ 2019.06-rc/fpm-alpine/entrypoint.sh | 195 ++++++++++++++++++++++++++ 2019.06-rc/fpm-alpine/upgrade.exclude | 11 ++ 2019.06-rc/fpm/Dockerfile | 106 ++++++++++++++ 2019.06-rc/fpm/cron.sh | 11 ++ 2019.06-rc/fpm/entrypoint.sh | 195 ++++++++++++++++++++++++++ 2019.06-rc/fpm/upgrade.exclude | 11 ++ update.sh | 1 + 14 files changed, 978 insertions(+) create mode 100644 2019.06-rc/apache/Dockerfile create mode 100644 2019.06-rc/apache/cron.sh create mode 100644 2019.06-rc/apache/entrypoint.sh create mode 100644 2019.06-rc/apache/upgrade.exclude create mode 100644 2019.06-rc/fpm-alpine/Dockerfile create mode 100644 2019.06-rc/fpm-alpine/cron.sh create mode 100644 2019.06-rc/fpm-alpine/entrypoint.sh create mode 100644 2019.06-rc/fpm-alpine/upgrade.exclude create mode 100644 2019.06-rc/fpm/Dockerfile create mode 100644 2019.06-rc/fpm/cron.sh create mode 100644 2019.06-rc/fpm/entrypoint.sh create mode 100644 2019.06-rc/fpm/upgrade.exclude diff --git a/.travis.yml b/.travis.yml index eaa9f7e..a92f9c7 100644 --- a/.travis.yml +++ b/.travis.yml @@ -59,6 +59,9 @@ jobs: - env: VERSION=2019.06-dev VARIANT=fpm-alpine ARCH=amd64 - env: VERSION=2019.06-dev VARIANT=fpm ARCH=amd64 - env: VERSION=2019.06-dev VARIANT=apache ARCH=amd64 + - env: VERSION=2019.06-rc VARIANT=fpm-alpine ARCH=amd64 + - env: VERSION=2019.06-rc VARIANT=fpm ARCH=amd64 + - env: VERSION=2019.06-rc VARIANT=apache ARCH=amd64 - stage: test images (full) env: VERSION=2019.03 VARIANT=fpm-alpine ARCH=amd64 @@ -73,6 +76,12 @@ jobs: - env: VERSION=2019.06-dev VARIANT=fpm ARCH=i386 - env: VERSION=2019.06-dev VARIANT=apache ARCH=amd64 - env: VERSION=2019.06-dev VARIANT=apache ARCH=i386 + - env: VERSION=2019.06-rc VARIANT=fpm-alpine ARCH=amd64 + - env: VERSION=2019.06-rc VARIANT=fpm-alpine ARCH=i386 + - env: VERSION=2019.06-rc VARIANT=fpm ARCH=amd64 + - env: VERSION=2019.06-rc VARIANT=fpm ARCH=i386 + - env: VERSION=2019.06-rc VARIANT=apache ARCH=amd64 + - env: VERSION=2019.06-rc VARIANT=apache ARCH=i386 - stage: deploy env: SCRIPT=build_and_push.sh diff --git a/2019.06-rc/apache/Dockerfile b/2019.06-rc/apache/Dockerfile new file mode 100644 index 0000000..1be1c34 --- /dev/null +++ b/2019.06-rc/apache/Dockerfile @@ -0,0 +1,114 @@ +# DO NOT EDIT: created by update.sh from Dockerfile-debian.template +FROM php:7.1-apache +LABEL maintainer="Philipp Holzer " + +# entrypoint.sh and cron.sh dependencies +RUN set -ex; \ + \ + apt-get update; \ + apt-get install -y --no-install-recommends \ + rsync \ + bzip2 \ + git \ +# For mail() support + ssmtp \ + ; \ + rm -rf /var/lib/apt/lists/*; + +# install the PHP extensions we need +# see https://friendi.ca/resources/requirements/ +RUN set -ex; \ + \ + savedAptMark="$(apt-mark showmanual)"; \ + \ + apt-get update; \ + apt-get install -y --no-install-recommends \ + libxml2-dev \ + mysql-client \ + bash \ + autoconf \ + g++ \ + make \ + openssl \ + libssl-dev \ + libpng-dev \ + libjpeg62-turbo-dev \ + libtool \ + libmcrypt4 \ + libmcrypt-dev \ + imagemagick \ + libmagick++-dev \ + libmemcached-dev \ + libgraphicsmagick1-dev \ + libfreetype6 \ + libfreetype6-dev \ + librsvg2-2 \ + libcurl4-openssl-dev \ + curl \ + ; \ + \ + debMultiarch="$(dpkg-architecture --query DEB_BUILD_MULTIARCH)"; \ + pecl install imagick-3.4.3; \ + docker-php-ext-enable imagick; \ + pecl clear-cache \ + ; \ + docker-php-ext-configure gd \ + --with-gd \ + --enable-gd-native-ttf \ + --with-freetype-dir=/usr/include/ \ + --with-png-dir=/usr/include/ \ + --with-jpeg-dir=/usr/include/ \ + ; \ + docker-php-ext-install -j 4 curl pdo pdo_mysql xml gd zip opcache mbstring posix ctype json iconv mcrypt \ + ; \ +# pecl will claim success even if one install fails, so we need to perform each install separately + pecl install memcached-3.0.4; \ + pecl install redis-3.1.6; \ + \ + docker-php-ext-enable \ + memcached \ + redis \ + ; \ + \ +# reset apt-mark's "manual" list so that "purge --auto-remove" will remove all build dependencies + apt-mark auto '.*' > /dev/null; \ + apt-mark manual $savedAptMark; \ + ldd "$(php -r 'echo ini_get("extension_dir");')"/*.so \ + | awk '/=>/ { print $3 }' \ + | sort -u \ + | xargs -r dpkg-query -S \ + | cut -d: -f1 \ + | sort -u \ + | xargs -rt apt-mark manual; \ + \ + apt-get purge -y --auto-remove -o APT::AutoRemove::RecommendsImportant=false; \ + rm -rf /var/lib/apt/lists/* + +RUN chown -R www-data:root /var/www; \ + chmod -R g=u /var/www + +VOLUME /var/www/html +WORKDIR /var/www/html + +RUN a2enmod rewrite remoteip ;\ + {\ + echo RemoteIPHeader X-Real-IP ;\ + echo RemoteIPTrustedProxy 10.0.0.0/8 ;\ + echo RemoteIPTrustedProxy 172.16.0.0/12 ;\ + echo RemoteIPTrustedProxy 192.168.0.0/16 ;\ + } > /etc/apache2/conf-available/remoteip.conf;\ + a2enconf remoteip + +RUN {\ + echo sendmail_path = "/usr/sbin/sendmail -t -i" ;\ + } > /usr/local/etc/php/conf.d/sendmail.ini; + +COPY *.sh upgrade.exclude / +RUN chmod +x /*.sh + +ENV FRIENDICA_VERSION 2019.06-rc +ENV FRIENDICA_ADDONS 2019.06-rc + + +ENTRYPOINT ["/entrypoint.sh"] +CMD ["apache2-foreground"] diff --git a/2019.06-rc/apache/cron.sh b/2019.06-rc/apache/cron.sh new file mode 100644 index 0000000..cf1f504 --- /dev/null +++ b/2019.06-rc/apache/cron.sh @@ -0,0 +1,11 @@ +#!/bin/sh +trap "break;exit" HUP INT TERM + +while [ ! -f /var/www/html/config/local.ini.php ] && [ ! -f /var/www/html/config/local.config.php ]; do + sleep 1 +done + +# TODO let the database and the autoinstall time to complete - not winning a beauty contest +sleep 15s + +php /var/www/html/bin/daemon.php -f start diff --git a/2019.06-rc/apache/entrypoint.sh b/2019.06-rc/apache/entrypoint.sh new file mode 100644 index 0000000..8f8c9eb --- /dev/null +++ b/2019.06-rc/apache/entrypoint.sh @@ -0,0 +1,195 @@ +#!/bin/sh +set -eu + +# run an command with the www-data user +run_as() { + if [ "$(id -u)" -eq 0 ]; then + su - www-data -s /bin/sh -c "cd /var/www/html;$1" + else + sh -c "$1" + fi +} + +# checks if the the first parameter is greater than the second parameter +version_greater() { + [ "$(printf '%s\n' "$@" | sort -t '.' -n -k1,1 -k2,2 | head -n 1)" != "$1" ] +} + +# clones the whole develop branch (Friendica and Addons) +clone_develop() { + friendica_git="${FRIENDICA_VERSION}" + addons_git="${FRIENDICA_ADDONS}" + + if echo "{$friendica_git,,}" | grep -Eq '^.*\-dev'; then + friendica_git="develop" + fi + + if echo "{$addons_git,,}" | grep -Eq '^.*\-dev'; then + addons_git="develop" + fi + + echo "Downloading Friendica from GitHub '${friendica_git}' ..." + + # Removing the whole directory first + rm -fr /usr/src/friendica + sh -c "git clone -q -b ${friendica_git} https://github.com/friendica/friendica /usr/src/friendica" + + mkdir /usr/src/friendica/addon + sh -c "git clone -q -b ${addons_git} https://github.com/friendica/friendica-addons /usr/src/friendica/addon" + + echo "Download finished" + + /usr/src/friendica/bin/composer.phar install --no-dev -d /usr/src/friendica +} + +setup_ssmtp() { + if [ -n "${SITENAME+x}" ] && [ -n "${SMTP+x}" ] && [ "${SMTP}" != "localhost" ]; then + echo "Setup SSMTP for '$SITENAME' with '$SMTP' ..." + + smtp_from=${SMTP_FROM:-no-reply} + + # Setup SSMTP + sed -i "s/:root:/:${SITENAME}:/g" /etc/passwd + sed -i "s/:Linux\ User:/:${SITENAME}:/g" /etc/passwd + + # add possible mail-senders + { + echo "www-data:$smtp_from@$HOSTNAME:$SMTP" ; + echo "root::$smtp_from@$HOSTNAME:$SMTP" ; + } > /etc/ssmtp/revaliases; + + # replace ssmtp.conf settings + { + echo "root=:$smtp_from@$HOSTNAME" ; + echo "hostname=$HOSTNAME" ; + echo "mailhub=$SMTP" ; + echo "FromLineOverride=YES" ; + if [ -n "${SMTP_TLS+x}" ]; then echo "UseTLS=$SMTP_TLS"; fi + if [ -n "${SMTP_STARTTLS+x}" ]; then echo "UseSTARTTLS=$SMTP_STARTTLS"; fi + if [ -n "${SMTP_AUTH_USER+x}" ]; then echo "AuthUser=$SMTP_AUTH_USER"; fi + if [ -n "${SMTP_AUTH_PASS+x}" ]; then echo "AuthPass=$SMTP_AUTH_PASS";fi + if [ -n "${SMTP_AUTH_METHOD+x}" ]; then echo "AuthMethod=$SMTP_AUTH_METHOD"; fi + } > /etc/ssmtp/ssmtp.conf + + echo "Setup finished" + fi +} + +# just check if we execute apache or php-fpm +if expr "$1" : "apache" 1>/dev/null || [ "$1" = "php-fpm" ]; then + installed_version="0.0.0.0" + if [ -f /var/www/html/VERSION ]; then + installed_version="$(cat /var/www/html/VERSION)" + fi + + check=false + # cloning from git is just possible for develop or Release Candidats + if echo "${FRIENDICA_VERSION}" | grep -Eq '^.*(\-dev|-rc|-RC)'; then + # just clone & check if it's a new install or upgrade + if [ "$installed_version" = "0.0.0.0" ] || [ "${FRIENDICA_UPGRADE:-false}" = "true" ]; then + clone_develop + image_version="$(cat /usr/src/friendica/VERSION)" + check=true + fi + else + image_version="$(cat /usr/src/friendica/VERSION)" + + # check it just in case the version is greater + if version_greater "$image_version" "$installed_version"; then + check=true + fi + + # no downgrading possible + if version_greater "$installed_version" "$image_version"; then + echo 'Can'\''t copy Friendica sources because the version of the data ('$installed_version') is higher than the docker image ('$image_version')', 0 + exit 1; + fi + fi + + setup_ssmtp + + if [ "$check" = true ]; then + echo "Initializing Friendica $image_version ..." + + if [ "$installed_version" != "0.0.0.0" ]; then + echo "Upgrading Friendica from $installed_version ..." + fi + + if [ "$(id -u)" -eq 0 ]; then + rsync_options="-rlDog --chown=www-data:www-data" + else + rsync_options="-rlD" + fi + + rsync $rsync_options --delete --exclude-from=/upgrade.exclude /usr/src/friendica/ /var/www/html/ + + # In case there is no .htaccess, copy it from the default dist file + if [ ! -f "/var/www/html/.htaccess" ]; then + cp "/var/www/html/.htaccess-dist" "/var/www/html/.htaccess" + fi + + if [ -d /var/www/html/view/smarty3 ]; then + chmod -R 777 /var/www/html/view/smarty3 + fi + echo "Initializing finished" + + # install + if [ "$installed_version" = "0.0.0.0" ]; then + echo "New Friendica instance" + + install=false + if [ -n "${MYSQL_DATABASE+x}" ] && [ -n "${MYSQL_PASSWORD+x}" ] && [ -n "${MYSQL_HOST+x}" ] && [ -n "${MYSQL_USER+x}" -o -n "${MYSQL_USERNAME+x}" ] && [ -n ${FRIENDICA_ADMIN_MAIL+x} ]; then + echo "Installation with environment variables" + + # TODO Bug in PHP Path for automatic installation + #FRIENDICA_PHP_PATH=${FRIENDICA_PHP_PATH:-/usr/local/php} + FRIENDICA_TZ=${FRIENDICA_TZ:-America/LosAngeles} + FRIENDICA_LANG=${FRIENDICA_LANG:-en} + MYSQL_PORT=${MYSQL_PORT:-3306} + if [ -n "${MYSQL_USER+x}" ]; then + MYSQL_USERNAMEFULL=${MYSQL_USER} + else + MYSQL_USERNAMEFULL=${MYSQL_USERNAME} + fi + + # shellcheck disable=SC2016 + install_options='-s --dbhost "'$MYSQL_HOST'" --dbport "'$MYSQL_PORT'" --dbdata "'$MYSQL_DATABASE'" --dbuser "'$MYSQL_USERNAMEFULL'" --dbpass "'$MYSQL_PASSWORD'"' + + # shellcheck disable=SC2016 + install_options=$install_options' --admin "'$FRIENDICA_ADMIN_MAIL'" --tz "'$FRIENDICA_TZ'" --lang "'$FRIENDICA_LANG'"' + install=true + elif [ -f "/usr/src/config/local.config.php" ]; then + echo "Installation with prepared local.config.php" + + install_options="-f /usr/src/local.config.php" + install=true + fi + + if [ "$install" = true ]; then + echo "Starting Friendica installation ..." + # TODO Let the database time to warm up - not winning a beauty contest + sleep 10s + run_as "cd /var/www/html; php /var/www/html/bin/console.php autoinstall $install_options" + + # TODO Workaround because of a strange permission issue + rm -fr /var/www/html/view/smarty3/compiled + + # load other config files (*.config.php) to the config folder (currently only local.config.php and addon.config.php supported) + if [ -d "/usr/src/config" ]; then + rsync $rsync_options --ignore-existing /usr/src/config/ /var/www/html/config/ + fi + + echo "Installation finished" + else + echo "Running web-based installer on first connect!" + fi + # upgrade + else + echo "Upgrading Friendica ..." + run_as 'cd /var/www/html; php /var/www/html/bin/console.php dbstructure update' + echo "Upgrading finished" + fi + fi +fi + +exec "$@" diff --git a/2019.06-rc/apache/upgrade.exclude b/2019.06-rc/apache/upgrade.exclude new file mode 100644 index 0000000..17b8b51 --- /dev/null +++ b/2019.06-rc/apache/upgrade.exclude @@ -0,0 +1,11 @@ +/.git/ +/photo/ +/proxy/ +/.htconfig.php +/.htaccess +/home.* +/config/local.ini.php +/config/addon.ini.php +/config/local.config.php +/config/addon.config.php +/storage/ \ No newline at end of file diff --git a/2019.06-rc/fpm-alpine/Dockerfile b/2019.06-rc/fpm-alpine/Dockerfile new file mode 100644 index 0000000..4fe04b3 --- /dev/null +++ b/2019.06-rc/fpm-alpine/Dockerfile @@ -0,0 +1,97 @@ +# DO NOT EDIT: created by update.sh from Dockerfile-alpine.template +FROM php:7.1-fpm-alpine +LABEL maintainer="Philipp Holzer " + +# entrypoint.sh and cron.sh dependencies +RUN set -ex; \ + apk add --no-cache \ + rsync \ + git \ +# For mail() support + ssmtp; + +# install the PHP extensions we need +# see https://friendi.ca/resources/requirements/ +RUN set -ex; \ + \ + apk add -U --no-cache --virtual .build-deps \ + libxml2-dev \ + mysql-client \ + bash \ + autoconf \ + g++ \ + make \ + openssl \ + openssl-dev \ + libpng \ + libpng-dev \ + libjpeg-turbo-dev \ + imagemagick-dev \ + imagemagick \ + libtool \ + libmcrypt \ + libmcrypt-dev \ + libmemcached-dev \ + cyrus-sasl-dev \ + freetype \ + libpng \ + libjpeg-turbo-dev \ + freetype-dev \ + librsvg \ + libcurl \ + curl \ + curl-dev \ + rsync \ + bzip2 \ + pcre-dev \ + ; \ + pecl install imagick-3.4.3; \ + docker-php-ext-enable imagick; \ + pecl clear-cache; \ + docker-php-ext-configure gd \ + --with-gd \ + --enable-gd-native-ttf \ + --with-freetype-dir=/usr/include/ \ + --with-png-dir=/usr/include/ \ + --with-jpeg-dir=/usr/include/ \ + ; \ + docker-php-ext-install -j 4 curl pdo pdo_mysql xml gd zip opcache mbstring posix ctype json iconv mcrypt; \ + \ +# pecl will claim success even if one install fails, so we need to perform each install separately + pecl install memcached-3.0.4; \ + pecl install redis-3.1.6; \ + \ + docker-php-ext-enable \ + memcached \ + redis \ + ; \ + \ + runDeps="$( \ + scanelf --needed --nobanner --format '%n#p' --recursive /usr/local/lib/php/extensions \ + | tr ',' '\n' \ + | sort -u \ + | awk 'system("[ -e /usr/local/lib" $1 " ]") == 0 { next } { print "so:" $1 }' \ + )"; \ + apk add --virtual .friendica-phpext-rundeps $runDeps; \ + apk del .build-deps; + +RUN chown -R www-data:www-data /var/www; \ + chmod -R g=u /var/www + +VOLUME /var/www/html +WORKDIR /var/www/html + + +RUN {\ + echo sendmail_path = "/usr/sbin/sendmail -t -i" ;\ + } > /usr/local/etc/php/conf.d/sendmail.ini; + +COPY *.sh upgrade.exclude / +RUN chmod +x /*.sh + +ENV FRIENDICA_VERSION 2019.06-rc +ENV FRIENDICA_ADDONS 2019.06-rc + + +ENTRYPOINT ["/entrypoint.sh"] +CMD ["php-fpm"] diff --git a/2019.06-rc/fpm-alpine/cron.sh b/2019.06-rc/fpm-alpine/cron.sh new file mode 100644 index 0000000..cf1f504 --- /dev/null +++ b/2019.06-rc/fpm-alpine/cron.sh @@ -0,0 +1,11 @@ +#!/bin/sh +trap "break;exit" HUP INT TERM + +while [ ! -f /var/www/html/config/local.ini.php ] && [ ! -f /var/www/html/config/local.config.php ]; do + sleep 1 +done + +# TODO let the database and the autoinstall time to complete - not winning a beauty contest +sleep 15s + +php /var/www/html/bin/daemon.php -f start diff --git a/2019.06-rc/fpm-alpine/entrypoint.sh b/2019.06-rc/fpm-alpine/entrypoint.sh new file mode 100644 index 0000000..8f8c9eb --- /dev/null +++ b/2019.06-rc/fpm-alpine/entrypoint.sh @@ -0,0 +1,195 @@ +#!/bin/sh +set -eu + +# run an command with the www-data user +run_as() { + if [ "$(id -u)" -eq 0 ]; then + su - www-data -s /bin/sh -c "cd /var/www/html;$1" + else + sh -c "$1" + fi +} + +# checks if the the first parameter is greater than the second parameter +version_greater() { + [ "$(printf '%s\n' "$@" | sort -t '.' -n -k1,1 -k2,2 | head -n 1)" != "$1" ] +} + +# clones the whole develop branch (Friendica and Addons) +clone_develop() { + friendica_git="${FRIENDICA_VERSION}" + addons_git="${FRIENDICA_ADDONS}" + + if echo "{$friendica_git,,}" | grep -Eq '^.*\-dev'; then + friendica_git="develop" + fi + + if echo "{$addons_git,,}" | grep -Eq '^.*\-dev'; then + addons_git="develop" + fi + + echo "Downloading Friendica from GitHub '${friendica_git}' ..." + + # Removing the whole directory first + rm -fr /usr/src/friendica + sh -c "git clone -q -b ${friendica_git} https://github.com/friendica/friendica /usr/src/friendica" + + mkdir /usr/src/friendica/addon + sh -c "git clone -q -b ${addons_git} https://github.com/friendica/friendica-addons /usr/src/friendica/addon" + + echo "Download finished" + + /usr/src/friendica/bin/composer.phar install --no-dev -d /usr/src/friendica +} + +setup_ssmtp() { + if [ -n "${SITENAME+x}" ] && [ -n "${SMTP+x}" ] && [ "${SMTP}" != "localhost" ]; then + echo "Setup SSMTP for '$SITENAME' with '$SMTP' ..." + + smtp_from=${SMTP_FROM:-no-reply} + + # Setup SSMTP + sed -i "s/:root:/:${SITENAME}:/g" /etc/passwd + sed -i "s/:Linux\ User:/:${SITENAME}:/g" /etc/passwd + + # add possible mail-senders + { + echo "www-data:$smtp_from@$HOSTNAME:$SMTP" ; + echo "root::$smtp_from@$HOSTNAME:$SMTP" ; + } > /etc/ssmtp/revaliases; + + # replace ssmtp.conf settings + { + echo "root=:$smtp_from@$HOSTNAME" ; + echo "hostname=$HOSTNAME" ; + echo "mailhub=$SMTP" ; + echo "FromLineOverride=YES" ; + if [ -n "${SMTP_TLS+x}" ]; then echo "UseTLS=$SMTP_TLS"; fi + if [ -n "${SMTP_STARTTLS+x}" ]; then echo "UseSTARTTLS=$SMTP_STARTTLS"; fi + if [ -n "${SMTP_AUTH_USER+x}" ]; then echo "AuthUser=$SMTP_AUTH_USER"; fi + if [ -n "${SMTP_AUTH_PASS+x}" ]; then echo "AuthPass=$SMTP_AUTH_PASS";fi + if [ -n "${SMTP_AUTH_METHOD+x}" ]; then echo "AuthMethod=$SMTP_AUTH_METHOD"; fi + } > /etc/ssmtp/ssmtp.conf + + echo "Setup finished" + fi +} + +# just check if we execute apache or php-fpm +if expr "$1" : "apache" 1>/dev/null || [ "$1" = "php-fpm" ]; then + installed_version="0.0.0.0" + if [ -f /var/www/html/VERSION ]; then + installed_version="$(cat /var/www/html/VERSION)" + fi + + check=false + # cloning from git is just possible for develop or Release Candidats + if echo "${FRIENDICA_VERSION}" | grep -Eq '^.*(\-dev|-rc|-RC)'; then + # just clone & check if it's a new install or upgrade + if [ "$installed_version" = "0.0.0.0" ] || [ "${FRIENDICA_UPGRADE:-false}" = "true" ]; then + clone_develop + image_version="$(cat /usr/src/friendica/VERSION)" + check=true + fi + else + image_version="$(cat /usr/src/friendica/VERSION)" + + # check it just in case the version is greater + if version_greater "$image_version" "$installed_version"; then + check=true + fi + + # no downgrading possible + if version_greater "$installed_version" "$image_version"; then + echo 'Can'\''t copy Friendica sources because the version of the data ('$installed_version') is higher than the docker image ('$image_version')', 0 + exit 1; + fi + fi + + setup_ssmtp + + if [ "$check" = true ]; then + echo "Initializing Friendica $image_version ..." + + if [ "$installed_version" != "0.0.0.0" ]; then + echo "Upgrading Friendica from $installed_version ..." + fi + + if [ "$(id -u)" -eq 0 ]; then + rsync_options="-rlDog --chown=www-data:www-data" + else + rsync_options="-rlD" + fi + + rsync $rsync_options --delete --exclude-from=/upgrade.exclude /usr/src/friendica/ /var/www/html/ + + # In case there is no .htaccess, copy it from the default dist file + if [ ! -f "/var/www/html/.htaccess" ]; then + cp "/var/www/html/.htaccess-dist" "/var/www/html/.htaccess" + fi + + if [ -d /var/www/html/view/smarty3 ]; then + chmod -R 777 /var/www/html/view/smarty3 + fi + echo "Initializing finished" + + # install + if [ "$installed_version" = "0.0.0.0" ]; then + echo "New Friendica instance" + + install=false + if [ -n "${MYSQL_DATABASE+x}" ] && [ -n "${MYSQL_PASSWORD+x}" ] && [ -n "${MYSQL_HOST+x}" ] && [ -n "${MYSQL_USER+x}" -o -n "${MYSQL_USERNAME+x}" ] && [ -n ${FRIENDICA_ADMIN_MAIL+x} ]; then + echo "Installation with environment variables" + + # TODO Bug in PHP Path for automatic installation + #FRIENDICA_PHP_PATH=${FRIENDICA_PHP_PATH:-/usr/local/php} + FRIENDICA_TZ=${FRIENDICA_TZ:-America/LosAngeles} + FRIENDICA_LANG=${FRIENDICA_LANG:-en} + MYSQL_PORT=${MYSQL_PORT:-3306} + if [ -n "${MYSQL_USER+x}" ]; then + MYSQL_USERNAMEFULL=${MYSQL_USER} + else + MYSQL_USERNAMEFULL=${MYSQL_USERNAME} + fi + + # shellcheck disable=SC2016 + install_options='-s --dbhost "'$MYSQL_HOST'" --dbport "'$MYSQL_PORT'" --dbdata "'$MYSQL_DATABASE'" --dbuser "'$MYSQL_USERNAMEFULL'" --dbpass "'$MYSQL_PASSWORD'"' + + # shellcheck disable=SC2016 + install_options=$install_options' --admin "'$FRIENDICA_ADMIN_MAIL'" --tz "'$FRIENDICA_TZ'" --lang "'$FRIENDICA_LANG'"' + install=true + elif [ -f "/usr/src/config/local.config.php" ]; then + echo "Installation with prepared local.config.php" + + install_options="-f /usr/src/local.config.php" + install=true + fi + + if [ "$install" = true ]; then + echo "Starting Friendica installation ..." + # TODO Let the database time to warm up - not winning a beauty contest + sleep 10s + run_as "cd /var/www/html; php /var/www/html/bin/console.php autoinstall $install_options" + + # TODO Workaround because of a strange permission issue + rm -fr /var/www/html/view/smarty3/compiled + + # load other config files (*.config.php) to the config folder (currently only local.config.php and addon.config.php supported) + if [ -d "/usr/src/config" ]; then + rsync $rsync_options --ignore-existing /usr/src/config/ /var/www/html/config/ + fi + + echo "Installation finished" + else + echo "Running web-based installer on first connect!" + fi + # upgrade + else + echo "Upgrading Friendica ..." + run_as 'cd /var/www/html; php /var/www/html/bin/console.php dbstructure update' + echo "Upgrading finished" + fi + fi +fi + +exec "$@" diff --git a/2019.06-rc/fpm-alpine/upgrade.exclude b/2019.06-rc/fpm-alpine/upgrade.exclude new file mode 100644 index 0000000..17b8b51 --- /dev/null +++ b/2019.06-rc/fpm-alpine/upgrade.exclude @@ -0,0 +1,11 @@ +/.git/ +/photo/ +/proxy/ +/.htconfig.php +/.htaccess +/home.* +/config/local.ini.php +/config/addon.ini.php +/config/local.config.php +/config/addon.config.php +/storage/ \ No newline at end of file diff --git a/2019.06-rc/fpm/Dockerfile b/2019.06-rc/fpm/Dockerfile new file mode 100644 index 0000000..f02a58c --- /dev/null +++ b/2019.06-rc/fpm/Dockerfile @@ -0,0 +1,106 @@ +# DO NOT EDIT: created by update.sh from Dockerfile-debian.template +FROM php:7.1-fpm +LABEL maintainer="Philipp Holzer " + +# entrypoint.sh and cron.sh dependencies +RUN set -ex; \ + \ + apt-get update; \ + apt-get install -y --no-install-recommends \ + rsync \ + bzip2 \ + git \ +# For mail() support + ssmtp \ + ; \ + rm -rf /var/lib/apt/lists/*; + +# install the PHP extensions we need +# see https://friendi.ca/resources/requirements/ +RUN set -ex; \ + \ + savedAptMark="$(apt-mark showmanual)"; \ + \ + apt-get update; \ + apt-get install -y --no-install-recommends \ + libxml2-dev \ + mysql-client \ + bash \ + autoconf \ + g++ \ + make \ + openssl \ + libssl-dev \ + libpng-dev \ + libjpeg62-turbo-dev \ + libtool \ + libmcrypt4 \ + libmcrypt-dev \ + imagemagick \ + libmagick++-dev \ + libmemcached-dev \ + libgraphicsmagick1-dev \ + libfreetype6 \ + libfreetype6-dev \ + librsvg2-2 \ + libcurl4-openssl-dev \ + curl \ + ; \ + \ + debMultiarch="$(dpkg-architecture --query DEB_BUILD_MULTIARCH)"; \ + pecl install imagick-3.4.3; \ + docker-php-ext-enable imagick; \ + pecl clear-cache \ + ; \ + docker-php-ext-configure gd \ + --with-gd \ + --enable-gd-native-ttf \ + --with-freetype-dir=/usr/include/ \ + --with-png-dir=/usr/include/ \ + --with-jpeg-dir=/usr/include/ \ + ; \ + docker-php-ext-install -j 4 curl pdo pdo_mysql xml gd zip opcache mbstring posix ctype json iconv mcrypt \ + ; \ +# pecl will claim success even if one install fails, so we need to perform each install separately + pecl install memcached-3.0.4; \ + pecl install redis-3.1.6; \ + \ + docker-php-ext-enable \ + memcached \ + redis \ + ; \ + \ +# reset apt-mark's "manual" list so that "purge --auto-remove" will remove all build dependencies + apt-mark auto '.*' > /dev/null; \ + apt-mark manual $savedAptMark; \ + ldd "$(php -r 'echo ini_get("extension_dir");')"/*.so \ + | awk '/=>/ { print $3 }' \ + | sort -u \ + | xargs -r dpkg-query -S \ + | cut -d: -f1 \ + | sort -u \ + | xargs -rt apt-mark manual; \ + \ + apt-get purge -y --auto-remove -o APT::AutoRemove::RecommendsImportant=false; \ + rm -rf /var/lib/apt/lists/* + +RUN chown -R www-data:root /var/www; \ + chmod -R g=u /var/www + +VOLUME /var/www/html +WORKDIR /var/www/html + + +RUN {\ + echo sendmail_path = "/usr/sbin/sendmail -t -i" ;\ + } > /usr/local/etc/php/conf.d/sendmail.ini; + +COPY *.sh upgrade.exclude / +RUN chmod +x /*.sh + +ENV FRIENDICA_VERSION 2019.06-rc +ENV FRIENDICA_ADDONS 2019.06-rc + + +ENTRYPOINT ["/entrypoint.sh"] +CMD ["php-fpm"] diff --git a/2019.06-rc/fpm/cron.sh b/2019.06-rc/fpm/cron.sh new file mode 100644 index 0000000..cf1f504 --- /dev/null +++ b/2019.06-rc/fpm/cron.sh @@ -0,0 +1,11 @@ +#!/bin/sh +trap "break;exit" HUP INT TERM + +while [ ! -f /var/www/html/config/local.ini.php ] && [ ! -f /var/www/html/config/local.config.php ]; do + sleep 1 +done + +# TODO let the database and the autoinstall time to complete - not winning a beauty contest +sleep 15s + +php /var/www/html/bin/daemon.php -f start diff --git a/2019.06-rc/fpm/entrypoint.sh b/2019.06-rc/fpm/entrypoint.sh new file mode 100644 index 0000000..8f8c9eb --- /dev/null +++ b/2019.06-rc/fpm/entrypoint.sh @@ -0,0 +1,195 @@ +#!/bin/sh +set -eu + +# run an command with the www-data user +run_as() { + if [ "$(id -u)" -eq 0 ]; then + su - www-data -s /bin/sh -c "cd /var/www/html;$1" + else + sh -c "$1" + fi +} + +# checks if the the first parameter is greater than the second parameter +version_greater() { + [ "$(printf '%s\n' "$@" | sort -t '.' -n -k1,1 -k2,2 | head -n 1)" != "$1" ] +} + +# clones the whole develop branch (Friendica and Addons) +clone_develop() { + friendica_git="${FRIENDICA_VERSION}" + addons_git="${FRIENDICA_ADDONS}" + + if echo "{$friendica_git,,}" | grep -Eq '^.*\-dev'; then + friendica_git="develop" + fi + + if echo "{$addons_git,,}" | grep -Eq '^.*\-dev'; then + addons_git="develop" + fi + + echo "Downloading Friendica from GitHub '${friendica_git}' ..." + + # Removing the whole directory first + rm -fr /usr/src/friendica + sh -c "git clone -q -b ${friendica_git} https://github.com/friendica/friendica /usr/src/friendica" + + mkdir /usr/src/friendica/addon + sh -c "git clone -q -b ${addons_git} https://github.com/friendica/friendica-addons /usr/src/friendica/addon" + + echo "Download finished" + + /usr/src/friendica/bin/composer.phar install --no-dev -d /usr/src/friendica +} + +setup_ssmtp() { + if [ -n "${SITENAME+x}" ] && [ -n "${SMTP+x}" ] && [ "${SMTP}" != "localhost" ]; then + echo "Setup SSMTP for '$SITENAME' with '$SMTP' ..." + + smtp_from=${SMTP_FROM:-no-reply} + + # Setup SSMTP + sed -i "s/:root:/:${SITENAME}:/g" /etc/passwd + sed -i "s/:Linux\ User:/:${SITENAME}:/g" /etc/passwd + + # add possible mail-senders + { + echo "www-data:$smtp_from@$HOSTNAME:$SMTP" ; + echo "root::$smtp_from@$HOSTNAME:$SMTP" ; + } > /etc/ssmtp/revaliases; + + # replace ssmtp.conf settings + { + echo "root=:$smtp_from@$HOSTNAME" ; + echo "hostname=$HOSTNAME" ; + echo "mailhub=$SMTP" ; + echo "FromLineOverride=YES" ; + if [ -n "${SMTP_TLS+x}" ]; then echo "UseTLS=$SMTP_TLS"; fi + if [ -n "${SMTP_STARTTLS+x}" ]; then echo "UseSTARTTLS=$SMTP_STARTTLS"; fi + if [ -n "${SMTP_AUTH_USER+x}" ]; then echo "AuthUser=$SMTP_AUTH_USER"; fi + if [ -n "${SMTP_AUTH_PASS+x}" ]; then echo "AuthPass=$SMTP_AUTH_PASS";fi + if [ -n "${SMTP_AUTH_METHOD+x}" ]; then echo "AuthMethod=$SMTP_AUTH_METHOD"; fi + } > /etc/ssmtp/ssmtp.conf + + echo "Setup finished" + fi +} + +# just check if we execute apache or php-fpm +if expr "$1" : "apache" 1>/dev/null || [ "$1" = "php-fpm" ]; then + installed_version="0.0.0.0" + if [ -f /var/www/html/VERSION ]; then + installed_version="$(cat /var/www/html/VERSION)" + fi + + check=false + # cloning from git is just possible for develop or Release Candidats + if echo "${FRIENDICA_VERSION}" | grep -Eq '^.*(\-dev|-rc|-RC)'; then + # just clone & check if it's a new install or upgrade + if [ "$installed_version" = "0.0.0.0" ] || [ "${FRIENDICA_UPGRADE:-false}" = "true" ]; then + clone_develop + image_version="$(cat /usr/src/friendica/VERSION)" + check=true + fi + else + image_version="$(cat /usr/src/friendica/VERSION)" + + # check it just in case the version is greater + if version_greater "$image_version" "$installed_version"; then + check=true + fi + + # no downgrading possible + if version_greater "$installed_version" "$image_version"; then + echo 'Can'\''t copy Friendica sources because the version of the data ('$installed_version') is higher than the docker image ('$image_version')', 0 + exit 1; + fi + fi + + setup_ssmtp + + if [ "$check" = true ]; then + echo "Initializing Friendica $image_version ..." + + if [ "$installed_version" != "0.0.0.0" ]; then + echo "Upgrading Friendica from $installed_version ..." + fi + + if [ "$(id -u)" -eq 0 ]; then + rsync_options="-rlDog --chown=www-data:www-data" + else + rsync_options="-rlD" + fi + + rsync $rsync_options --delete --exclude-from=/upgrade.exclude /usr/src/friendica/ /var/www/html/ + + # In case there is no .htaccess, copy it from the default dist file + if [ ! -f "/var/www/html/.htaccess" ]; then + cp "/var/www/html/.htaccess-dist" "/var/www/html/.htaccess" + fi + + if [ -d /var/www/html/view/smarty3 ]; then + chmod -R 777 /var/www/html/view/smarty3 + fi + echo "Initializing finished" + + # install + if [ "$installed_version" = "0.0.0.0" ]; then + echo "New Friendica instance" + + install=false + if [ -n "${MYSQL_DATABASE+x}" ] && [ -n "${MYSQL_PASSWORD+x}" ] && [ -n "${MYSQL_HOST+x}" ] && [ -n "${MYSQL_USER+x}" -o -n "${MYSQL_USERNAME+x}" ] && [ -n ${FRIENDICA_ADMIN_MAIL+x} ]; then + echo "Installation with environment variables" + + # TODO Bug in PHP Path for automatic installation + #FRIENDICA_PHP_PATH=${FRIENDICA_PHP_PATH:-/usr/local/php} + FRIENDICA_TZ=${FRIENDICA_TZ:-America/LosAngeles} + FRIENDICA_LANG=${FRIENDICA_LANG:-en} + MYSQL_PORT=${MYSQL_PORT:-3306} + if [ -n "${MYSQL_USER+x}" ]; then + MYSQL_USERNAMEFULL=${MYSQL_USER} + else + MYSQL_USERNAMEFULL=${MYSQL_USERNAME} + fi + + # shellcheck disable=SC2016 + install_options='-s --dbhost "'$MYSQL_HOST'" --dbport "'$MYSQL_PORT'" --dbdata "'$MYSQL_DATABASE'" --dbuser "'$MYSQL_USERNAMEFULL'" --dbpass "'$MYSQL_PASSWORD'"' + + # shellcheck disable=SC2016 + install_options=$install_options' --admin "'$FRIENDICA_ADMIN_MAIL'" --tz "'$FRIENDICA_TZ'" --lang "'$FRIENDICA_LANG'"' + install=true + elif [ -f "/usr/src/config/local.config.php" ]; then + echo "Installation with prepared local.config.php" + + install_options="-f /usr/src/local.config.php" + install=true + fi + + if [ "$install" = true ]; then + echo "Starting Friendica installation ..." + # TODO Let the database time to warm up - not winning a beauty contest + sleep 10s + run_as "cd /var/www/html; php /var/www/html/bin/console.php autoinstall $install_options" + + # TODO Workaround because of a strange permission issue + rm -fr /var/www/html/view/smarty3/compiled + + # load other config files (*.config.php) to the config folder (currently only local.config.php and addon.config.php supported) + if [ -d "/usr/src/config" ]; then + rsync $rsync_options --ignore-existing /usr/src/config/ /var/www/html/config/ + fi + + echo "Installation finished" + else + echo "Running web-based installer on first connect!" + fi + # upgrade + else + echo "Upgrading Friendica ..." + run_as 'cd /var/www/html; php /var/www/html/bin/console.php dbstructure update' + echo "Upgrading finished" + fi + fi +fi + +exec "$@" diff --git a/2019.06-rc/fpm/upgrade.exclude b/2019.06-rc/fpm/upgrade.exclude new file mode 100644 index 0000000..17b8b51 --- /dev/null +++ b/2019.06-rc/fpm/upgrade.exclude @@ -0,0 +1,11 @@ +/.git/ +/photo/ +/proxy/ +/.htconfig.php +/.htaccess +/home.* +/config/local.ini.php +/config/addon.ini.php +/config/local.config.php +/config/addon.config.php +/storage/ \ No newline at end of file diff --git a/update.sh b/update.sh index ffb1bfb..e452d21 100755 --- a/update.sh +++ b/update.sh @@ -41,6 +41,7 @@ variants=( ) versions=( + 2019.06-rc 2019.06-dev 2019.03 )