diff --git a/.travis.yml b/.travis.yml index 238c818..942918a 100644 --- a/.travis.yml +++ b/.travis.yml @@ -55,7 +55,10 @@ jobs: - ./.travis/test-entrypoint.sh - stage: test images (amd64) - env: VERSION=2020.03-dev VARIANT=fpm-alpine ARCH=amd64 + env: VERSION=2020.03-rc VARIANT=fpm-alpine ARCH=amd64 + - env: VERSION=2020.03-rc VARIANT=fpm ARCH=amd64 + - env: VERSION=2020.03-rc VARIANT=apache ARCH=amd64 + - env: VERSION=2020.03-dev VARIANT=fpm-alpine ARCH=amd64 - env: VERSION=2020.03-dev VARIANT=fpm ARCH=amd64 - env: VERSION=2020.03-dev VARIANT=apache ARCH=amd64 - env: VERSION=2019.12 VARIANT=fpm-alpine ARCH=amd64 @@ -63,7 +66,13 @@ jobs: - env: VERSION=2019.12 VARIANT=apache ARCH=amd64 - stage: test images (full) - env: VERSION=2020.03-dev VARIANT=fpm-alpine ARCH=amd64 + env: VERSION=2020.03-rc VARIANT=fpm-alpine ARCH=amd64 + - env: VERSION=2020.03-rc VARIANT=fpm-alpine ARCH=i386 + - env: VERSION=2020.03-rc VARIANT=fpm ARCH=amd64 + - env: VERSION=2020.03-rc VARIANT=fpm ARCH=i386 + - env: VERSION=2020.03-rc VARIANT=apache ARCH=amd64 + - env: VERSION=2020.03-rc VARIANT=apache ARCH=i386 + - env: VERSION=2020.03-dev VARIANT=fpm-alpine ARCH=amd64 - env: VERSION=2020.03-dev VARIANT=fpm-alpine ARCH=i386 - env: VERSION=2020.03-dev VARIANT=fpm ARCH=amd64 - env: VERSION=2020.03-dev VARIANT=fpm ARCH=i386 diff --git a/2020.03-rc/apache/Dockerfile b/2020.03-rc/apache/Dockerfile new file mode 100644 index 0000000..11b4f43 --- /dev/null +++ b/2020.03-rc/apache/Dockerfile @@ -0,0 +1,141 @@ +# DO NOT EDIT: created by update.sh from Dockerfile-debian.template +FROM php:7.3-apache-stretch + +# 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 \ +# For tini installation + gnupg dirmngr \ + ; \ + rm -rf /var/lib/apt/lists/*; + +# Add tini for reaping processes +ENV TINI_VERSION v0.18.0 +RUN export BUILD_ARCH=$(dpkg-architecture --query DEB_BUILD_ARCH) \ + && curl -L -o /sbin/tini https://github.com/krallin/tini/releases/download/${TINI_VERSION}/tini-${BUILD_ARCH} \ + && curl -L -o /tini.asc https://github.com/krallin/tini/releases/download/${TINI_VERSION}/tini-${BUILD_ARCH}.asc \ + && gpg --batch --keyserver hkp://p80.pool.sks-keyservers.net:80 --recv-keys 595E85A6B1B4779EA4DAAEC70B588DFF0527A9B7 \ + && gpg --batch --verify /tini.asc /sbin/tini \ + && chmod +x /sbin/tini + +# 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 \ + mysql-client \ + bash \ + libpng-dev \ + libjpeg62-turbo-dev \ + libtool \ + libmagick++-dev \ + libmemcached-dev \ + libgraphicsmagick1-dev \ + libfreetype6-dev \ + librsvg2-2 \ + libzip-dev \ + libldap2-dev \ + ; \ + \ + debMultiarch="$(dpkg-architecture --query DEB_BUILD_MULTIARCH)"; \ + \ + docker-php-ext-configure gd \ + --with-gd \ + --with-freetype-dir=/usr/include/ \ + --with-png-dir=/usr/include/ \ + --with-jpeg-dir=/usr/include/ \ + ; \ + docker-php-ext-configure ldap \ + --with-libdir=lib/$debMultiarch/ \ + ; \ + docker-php-ext-install -j "$(nproc)" \ + pdo_mysql \ + gd \ + zip \ + opcache \ + ctype \ + pcntl \ + ldap \ + ; \ + \ +# pecl will claim success even if one install fails, so we need to perform each install separately + pecl install apcu-5.1.18; \ + pecl install memcached-3.1.5; \ + pecl install redis-5.2.0; \ + pecl install imagick-3.4.4; \ + \ + docker-php-ext-enable \ + apcu \ + memcached \ + redis \ + imagick \ + ; \ + \ +# 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/* + +# set recommended PHP.ini settings +RUN set -ex; \ + { \ + echo 'opcache.enable=1' ; \ + echo 'opcache.interned_strings_buffer=8'; \ + echo 'opcache.max_accelerated_files=10000'; \ + echo 'opcache.memory_consumption=128'; \ + echo 'opcache.save_comments=1'; \ + echo 'opcache.revalidte_freq=1'; \ + } > /usr/local/etc/php/conf.d/opcache-recommended.ini; \ + \ + { \ + echo sendmail_path = "/usr/sbin/sendmail -t -i"; \ + } > /usr/local/etc/php/conf.d/sendmail.ini; \ + \ + echo 'apc.enable_cli=1' >> /usr/local/etc/php/conf.d/docker-php-ext-apcu.ini; \ + \ + echo 'memory_limit=512M' > /usr/local/etc/php/conf.d/memory-limit.ini; \ + \ + mkdir /var/www/data; \ + chown -R www-data:root /var/www; \ + chmod -R g=u /var/www + +VOLUME /var/www/html + +RUN set -ex;\ + 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 + +ENV FRIENDICA_VERSION 2020.03-rc +ENV FRIENDICA_ADDONS 2020.03-rc + + +COPY *.sh upgrade.exclude / +COPY config/* /usr/src/friendica/config/ + +ENTRYPOINT ["/entrypoint-dev.sh"] +CMD ["apache2-foreground"] diff --git a/2020.03-rc/apache/config/00apcu.config.php b/2020.03-rc/apache/config/00apcu.config.php new file mode 100644 index 0000000..d6dac4f --- /dev/null +++ b/2020.03-rc/apache/config/00apcu.config.php @@ -0,0 +1,12 @@ + [ + 'cache_driver' => 'apcu', + 'session_handler' => 'cache', + ], +]; diff --git a/2020.03-rc/apache/config/01redis.config.php b/2020.03-rc/apache/config/01redis.config.php new file mode 100644 index 0000000..1a43c95 --- /dev/null +++ b/2020.03-rc/apache/config/01redis.config.php @@ -0,0 +1,15 @@ + [ + 'lock_driver' => 'redis', + 'redis_host' => getenv('REDIS_HOST'), + 'redis_port' => (getenv('REDIS_PORT') ? getenv('REDIS_PORT') : ''), + 'redis_password' => (getenv('REDIS_PW') ? getenv('REDIS_PW') : ''), + 'redis_db' => (getenv('REDIS_DB') ? getenv('REDIS_DB') : 0), + ], + ]; +} else { + return []; +} diff --git a/2020.03-rc/apache/config/zz-docker.config.php b/2020.03-rc/apache/config/zz-docker.config.php new file mode 100644 index 0000000..2d5835d --- /dev/null +++ b/2020.03-rc/apache/config/zz-docker.config.php @@ -0,0 +1,62 @@ + [ + // Necessary because otherwise the daemon isn't working + 'pidfile' => '/var/run/friendica.pid', + + 'logfile' => '/var/www/html/friendica.log', + 'loglevel' => 'notice', + ], + 'storage' => [ + 'filesystem_path' => '/var/www/html/storage', + ], +]; + +if (getenv('FRIENDICA_TZ')) { + $config['config']['timezone'] = getenv('FRIENDICA_TZ'); +} + +if (getenv('FRIENDICA_LANG')) { + $config['config']['language'] = getenv('FRIENDICA_LANG'); +} + +if (getenv('FRIENDICA_ADMIN_MAIL')) { + $config['config']['admin_email'] = getenv('FRIENDICA_ADMIN_MAIL'); +} + +if (getenv('FRIENDICA_SITENAME')) { + $config['config']['sitename'] = getenv('FRIENDICA_SITENAME'); +} + +if (!empty(getenv('FRIENDICA_NO_VALIDATION'))) { + $config['system']['disable_url_validation'] = true; + $config['system']['disable_email_validation'] = true; +} + +if (!empty(getenv('FRIENDICA_DATA'))) { + $config['storage']['class'] = \Friendica\Model\Storage\Filesystem::class; + + if (!empty(getenv('FRIENDICA_DATA_DIR'))) { + $config['storage']['filesystem_path'] = getenv('FRIENDICA_DATA'); + } +} + +if (!empty(getenv('FRIENDICA_DEBUGGING'))) { + $config['system']['debugging'] = true; + if (!empty(getenv('FRIENDICA_LOGFILE'))) { + $config['system']['logfile'] = getenv('FRIENDICA_LOGFILE'); + } + if (!empty(getenv('FRIENDICA_LOGLEVEL'))) { + $config['system']['loglevel'] = getenv('FRIENDICA_LOGLEVEL'); + } +} + +return $config; diff --git a/2020.03-rc/apache/cron.sh b/2020.03-rc/apache/cron.sh new file mode 100755 index 0000000..55be04a --- /dev/null +++ b/2020.03-rc/apache/cron.sh @@ -0,0 +1,13 @@ +#!/bin/sh +trap "break;exit" HUP INT TERM + +while [ ! -f /var/www/html/bin/daemon.php ]; do + sleep 1 +done + +echo "Waiting for MySQL $MYSQL_HOST initialization..." +if php /var/www/html/bin/wait-for-connection "$MYSQL_HOST" "${MYSQL_PORT:-3306}" 300; then + exec /sbin/tini -- php /var/www/html/bin/daemon.php -f start +else + echo "[ERROR] Waited 300 seconds, no response" >&2 +fi diff --git a/2020.03-rc/apache/entrypoint-dev.sh b/2020.03-rc/apache/entrypoint-dev.sh new file mode 100755 index 0000000..55afb80 --- /dev/null +++ b/2020.03-rc/apache/entrypoint-dev.sh @@ -0,0 +1,69 @@ +#!/bin/sh +set -eu + +# checks if the branch and repository exists +check_branch() { + repo=${1:-} + branch=${2:-} + git ls-remote --heads --tags "https://github.com/$repo" | grep -E "refs/(heads|tags)/${branch}$" >/dev/null + [ "$?" -eq "0" ] +} + +# clones the whole develop branch (Friendica and Addons) +clone_develop() { + friendica_git="${FRIENDICA_VERSION}" + addons_git="${FRIENDICA_ADDONS}" + friendica_repo="${FRIENDICA_REPOSITORY:-friendica/friendica}" + friendica_addons_repo="${FRIENDICA_ADDONS_REPO:-friendica/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 + + # Check if the branches exist before wiping the + if check_branch "$friendica_repo" "$friendica_git" && check_branch "$friendica_addons_repo" "$addons_git" ; then + echo "Cloning '${friendica_git}' from GitHub repository '${friendica_repo}' ..." + + # Removing the whole directory first + rm -fr /usr/src/friendica + git clone -q -b ${friendica_git} "https://github.com/${friendica_repo}" /usr/src/friendica + + mkdir /usr/src/friendica/addon + git clone -q -b ${addons_git} "https://github.com/${friendica_addons_repo}" /usr/src/friendica/addon + + echo "Download finished" + + if [ ! -f /usr/src/friendica/VERSION ]; then + echo "Couldn't clone repository" + exit 1 + fi + + /usr/src/friendica/bin/composer.phar install --no-dev -d /usr/src/friendica + return 0 + + else + if check_branch "$friendica_repo" "$friendica_git"; then + echo "$friendica_repo/$friendica_git is not valid." + else + echo "$friendica_addons_repo/$addons_git is not valid." + fi + echo "Using old version." + return 1 + + fi +} + +# just check if we execute apache or php-fpm +if expr "$1" : "apache" 1>/dev/null || [ "$1" = "php-fpm" ]; then + # cloning from git is just possible for develop or Release Candidats + if echo "${FRIENDICA_VERSION}" | grep -Eq '^.*(\-dev|-rc|-RC)' || [ "${FRIENDICA_UPGRADE:-false}" = "true" ] || [ ! -f /usr/src/friendica/VERSION ]; then + # just clone & check if it's a new install or upgrade + clone_develop + fi +fi + +exec /entrypoint.sh "$@" diff --git a/2020.03-rc/apache/entrypoint.sh b/2020.03-rc/apache/entrypoint.sh new file mode 100755 index 0000000..8c4d850 --- /dev/null +++ b/2020.03-rc/apache/entrypoint.sh @@ -0,0 +1,149 @@ +#!/bin/sh +set -eu + +# run an command with the www-data user +run_as() { + set -- -c "cd /var/www/html; $*" + if [ "$(id -u)" -eq 0 ]; then + su - www-data -s /bin/sh "$@" + else + sh "$@" + fi +} + +# checks if the the first parameter is greater than the second parameter +version_greater() { + [ "$(printf '%s\n' "$@" | sort -r -t '-' -k2,2 | sort -t '.' -n -k1,1 -k2,2 -s | head -n 1)" != "$1" ] +} + +setup_ssmtp() { + if [ -n "${SMTP_DOMAIN+x}" ] && [ -n "${SMTP+x}" ] && [ "${SMTP}" != "localhost" ]; then + SITENAME="${FRIENDICA_SITENAME:-Friendica Social Network}" + echo "Setup SSMTP for '$SITENAME' with '$SMTP' ..." + + smtp_from=${SMTP_FROM:-no-reply} + + # Setup SSMTP + usermod --comment "$(echo "$SITENAME" | tr -dc '[:print:]')" root + usermod --comment "$(echo "$SITENAME" | tr -dc '[:print:]')" www-data + + # add possible mail-senders + { + echo "www-data:$smtp_from@$SMTP_DOMAIN:$SMTP" + echo "root::$smtp_from@$SMTP_DOMAIN:$SMTP" + } > /etc/ssmtp/revaliases + + # replace ssmtp.conf settings + { + echo "root=:$smtp_from@$SMTP_DOMAIN" + echo "hostname=$SMTP_DOMAIN" + 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 + + image_version="$(cat /usr/src/friendica/VERSION)" + + # 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)" + exit 1 + fi + + setup_ssmtp + + # check it just in case the version is greater or if we force the upgrade + if version_greater "$image_version" "$installed_version" || [ "${FRIENDICA_UPGRADE:-false}" = "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/ + + # Update docker-based config files, but never delete other config files + rsync $rsync_options --update /usr/src/friendica/config/ /var/www/html/config/ + + # 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}" ] && [ -n "${FRIENDICA_ADMIN_MAIL+x}" ] && [ -n "${FRIENDICA_URL+x}" ]; then + echo "Installation with environment variables" + + FRIENDICA_TZ=${FRIENDICA_TZ:-America/LosAngeles} + FRIENDICA_LANG=${FRIENDICA_LANG:-en} + MYSQL_PORT=${MYSQL_PORT:-3306} + + # shellcheck disable=SC2016 + install_options='-s --dbhost "'$MYSQL_HOST'" --dbport "'$MYSQL_PORT'" --dbdata "'$MYSQL_DATABASE'" --dbuser "'$MYSQL_USER'" --dbpass "'$MYSQL_PASSWORD'"' + + # shellcheck disable=SC2016 + install_options=$install_options' --admin "'$FRIENDICA_ADMIN_MAIL'" --tz "'$FRIENDICA_TZ'" --lang "'$FRIENDICA_LANG'" --url "'$FRIENDICA_URL'"' + install=true + fi + + if [ "$install" = true ]; then + echo "Waiting for MySQL $MYSQL_HOST initialization..." + if run_as "php /var/www/html/bin/wait-for-connection $MYSQL_HOST ${MYSQL_PORT:-3306} 300"; then + + echo "Starting Friendica installation ..." + run_as "php /var/www/html/bin/console.php autoinstall $install_options" + + rm -fr /var/www/html/view/smarty3/compiled + + # load other config files (*.config.php) to the config folder + if [ -d "/usr/src/config" ]; then + rsync $rsync_options --ignore-existing /usr/src/config/ /var/www/html/config/ + fi + + echo "Installation finished" + else + echo "[ERROR] Waited 300 seconds, no response" >&2 + fi + else + echo "Running web-based installer on first connect!" + fi + # upgrade + else + echo "Upgrading Friendica ..." + run_as 'php /var/www/html/bin/console.php dbstructure update' + echo "Upgrading finished" + fi + fi +fi + +exec "$@" diff --git a/2020.03-rc/apache/upgrade.exclude b/2020.03-rc/apache/upgrade.exclude new file mode 100644 index 0000000..2fb6533 --- /dev/null +++ b/2020.03-rc/apache/upgrade.exclude @@ -0,0 +1,10 @@ +/.git/ +/photo/ +/proxy/ +/.htconfig.php +/.htaccess +/home.* +/config/ +/storage/ +/log/ +*.log \ No newline at end of file diff --git a/2020.03-rc/fpm-alpine/Dockerfile b/2020.03-rc/fpm-alpine/Dockerfile new file mode 100644 index 0000000..da5b294 --- /dev/null +++ b/2020.03-rc/fpm-alpine/Dockerfile @@ -0,0 +1,109 @@ +# DO NOT EDIT: created by update.sh from Dockerfile-alpine.template +FROM php:7.3-fpm-alpine + +# entrypoint.sh and cron.sh dependencies +RUN set -ex; \ + apk add --no-cache \ + rsync \ + git \ +# For mail() support + ssmtp \ + shadow \ + tini; + +# install the PHP extensions we need +# see https://friendi.ca/resources/requirements/ +RUN set -ex; \ + \ + apk add --no-cache --virtual .build-deps \ + mysql-client \ + bash \ + $PHPIZE_DEPS \ + libpng-dev \ + libjpeg-turbo-dev \ + imagemagick-dev \ + libtool \ + libmemcached-dev \ + cyrus-sasl-dev \ + libjpeg-turbo-dev \ + freetype-dev \ + librsvg \ + pcre-dev \ + libzip-dev \ + icu-dev \ + openldap-dev \ + ; \ + \ + docker-php-ext-configure gd \ + --with-gd \ + --with-freetype-dir=/usr/include/ \ + --with-png-dir=/usr/include/ \ + --with-jpeg-dir=/usr/include/ \ + ; \ + \ + docker-php-ext-install -j "$(nproc)" \ + pdo_mysql \ + gd \ + zip \ + opcache \ + pcntl \ + ldap \ + ; \ + \ +# pecl will claim success even if one install fails, so we need to perform each install separately + pecl install APCu-5.1.18; \ + pecl install memcached-3.1.5; \ + pecl install redis-5.2.0; \ + pecl install imagick-3.4.4; \ + \ + docker-php-ext-enable \ + apcu \ + memcached \ + redis \ + imagick \ + ; \ + \ + 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 --no-network --virtual .friendica-phpext-rundeps $runDeps; \ + apk del --no-network .build-deps; + +# set recommended PHP.ini settings +RUN set -ex; \ + { \ + echo 'opcache.enable=1' ; \ + echo 'opcache.interned_strings_buffer=8'; \ + echo 'opcache.max_accelerated_files=10000'; \ + echo 'opcache.memory_consumption=128'; \ + echo 'opcache.save_comments=1'; \ + echo 'opcache.revalidte_freq=1'; \ + } > /usr/local/etc/php/conf.d/opcache-recommended.ini; \ + \ + { \ + echo sendmail_path = "/usr/sbin/sendmail -t -i"; \ + } > /usr/local/etc/php/conf.d/sendmail.ini; \ + \ + echo 'apc.enable_cli=1' >> /usr/local/etc/php/conf.d/docker-php-ext-apcu.ini; \ + \ + echo 'memory_limit=512M' > /usr/local/etc/php/conf.d/memory-limit.ini; \ + \ + mkdir /var/www/data; \ + chown -R www-data:root /var/www; \ + chmod -R g=u /var/www + +VOLUME /var/www/html + + +ENV FRIENDICA_VERSION 2020.03-rc +ENV FRIENDICA_ADDONS 2020.03-rc + + +COPY *.sh upgrade.exclude / +COPY config/* /usr/src/friendica/config/ + +ENTRYPOINT ["/entrypoint-dev.sh"] +CMD ["php-fpm"] diff --git a/2020.03-rc/fpm-alpine/config/00apcu.config.php b/2020.03-rc/fpm-alpine/config/00apcu.config.php new file mode 100644 index 0000000..d6dac4f --- /dev/null +++ b/2020.03-rc/fpm-alpine/config/00apcu.config.php @@ -0,0 +1,12 @@ + [ + 'cache_driver' => 'apcu', + 'session_handler' => 'cache', + ], +]; diff --git a/2020.03-rc/fpm-alpine/config/01redis.config.php b/2020.03-rc/fpm-alpine/config/01redis.config.php new file mode 100644 index 0000000..1a43c95 --- /dev/null +++ b/2020.03-rc/fpm-alpine/config/01redis.config.php @@ -0,0 +1,15 @@ + [ + 'lock_driver' => 'redis', + 'redis_host' => getenv('REDIS_HOST'), + 'redis_port' => (getenv('REDIS_PORT') ? getenv('REDIS_PORT') : ''), + 'redis_password' => (getenv('REDIS_PW') ? getenv('REDIS_PW') : ''), + 'redis_db' => (getenv('REDIS_DB') ? getenv('REDIS_DB') : 0), + ], + ]; +} else { + return []; +} diff --git a/2020.03-rc/fpm-alpine/config/zz-docker.config.php b/2020.03-rc/fpm-alpine/config/zz-docker.config.php new file mode 100644 index 0000000..2d5835d --- /dev/null +++ b/2020.03-rc/fpm-alpine/config/zz-docker.config.php @@ -0,0 +1,62 @@ + [ + // Necessary because otherwise the daemon isn't working + 'pidfile' => '/var/run/friendica.pid', + + 'logfile' => '/var/www/html/friendica.log', + 'loglevel' => 'notice', + ], + 'storage' => [ + 'filesystem_path' => '/var/www/html/storage', + ], +]; + +if (getenv('FRIENDICA_TZ')) { + $config['config']['timezone'] = getenv('FRIENDICA_TZ'); +} + +if (getenv('FRIENDICA_LANG')) { + $config['config']['language'] = getenv('FRIENDICA_LANG'); +} + +if (getenv('FRIENDICA_ADMIN_MAIL')) { + $config['config']['admin_email'] = getenv('FRIENDICA_ADMIN_MAIL'); +} + +if (getenv('FRIENDICA_SITENAME')) { + $config['config']['sitename'] = getenv('FRIENDICA_SITENAME'); +} + +if (!empty(getenv('FRIENDICA_NO_VALIDATION'))) { + $config['system']['disable_url_validation'] = true; + $config['system']['disable_email_validation'] = true; +} + +if (!empty(getenv('FRIENDICA_DATA'))) { + $config['storage']['class'] = \Friendica\Model\Storage\Filesystem::class; + + if (!empty(getenv('FRIENDICA_DATA_DIR'))) { + $config['storage']['filesystem_path'] = getenv('FRIENDICA_DATA'); + } +} + +if (!empty(getenv('FRIENDICA_DEBUGGING'))) { + $config['system']['debugging'] = true; + if (!empty(getenv('FRIENDICA_LOGFILE'))) { + $config['system']['logfile'] = getenv('FRIENDICA_LOGFILE'); + } + if (!empty(getenv('FRIENDICA_LOGLEVEL'))) { + $config['system']['loglevel'] = getenv('FRIENDICA_LOGLEVEL'); + } +} + +return $config; diff --git a/2020.03-rc/fpm-alpine/cron.sh b/2020.03-rc/fpm-alpine/cron.sh new file mode 100755 index 0000000..55be04a --- /dev/null +++ b/2020.03-rc/fpm-alpine/cron.sh @@ -0,0 +1,13 @@ +#!/bin/sh +trap "break;exit" HUP INT TERM + +while [ ! -f /var/www/html/bin/daemon.php ]; do + sleep 1 +done + +echo "Waiting for MySQL $MYSQL_HOST initialization..." +if php /var/www/html/bin/wait-for-connection "$MYSQL_HOST" "${MYSQL_PORT:-3306}" 300; then + exec /sbin/tini -- php /var/www/html/bin/daemon.php -f start +else + echo "[ERROR] Waited 300 seconds, no response" >&2 +fi diff --git a/2020.03-rc/fpm-alpine/entrypoint-dev.sh b/2020.03-rc/fpm-alpine/entrypoint-dev.sh new file mode 100755 index 0000000..55afb80 --- /dev/null +++ b/2020.03-rc/fpm-alpine/entrypoint-dev.sh @@ -0,0 +1,69 @@ +#!/bin/sh +set -eu + +# checks if the branch and repository exists +check_branch() { + repo=${1:-} + branch=${2:-} + git ls-remote --heads --tags "https://github.com/$repo" | grep -E "refs/(heads|tags)/${branch}$" >/dev/null + [ "$?" -eq "0" ] +} + +# clones the whole develop branch (Friendica and Addons) +clone_develop() { + friendica_git="${FRIENDICA_VERSION}" + addons_git="${FRIENDICA_ADDONS}" + friendica_repo="${FRIENDICA_REPOSITORY:-friendica/friendica}" + friendica_addons_repo="${FRIENDICA_ADDONS_REPO:-friendica/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 + + # Check if the branches exist before wiping the + if check_branch "$friendica_repo" "$friendica_git" && check_branch "$friendica_addons_repo" "$addons_git" ; then + echo "Cloning '${friendica_git}' from GitHub repository '${friendica_repo}' ..." + + # Removing the whole directory first + rm -fr /usr/src/friendica + git clone -q -b ${friendica_git} "https://github.com/${friendica_repo}" /usr/src/friendica + + mkdir /usr/src/friendica/addon + git clone -q -b ${addons_git} "https://github.com/${friendica_addons_repo}" /usr/src/friendica/addon + + echo "Download finished" + + if [ ! -f /usr/src/friendica/VERSION ]; then + echo "Couldn't clone repository" + exit 1 + fi + + /usr/src/friendica/bin/composer.phar install --no-dev -d /usr/src/friendica + return 0 + + else + if check_branch "$friendica_repo" "$friendica_git"; then + echo "$friendica_repo/$friendica_git is not valid." + else + echo "$friendica_addons_repo/$addons_git is not valid." + fi + echo "Using old version." + return 1 + + fi +} + +# just check if we execute apache or php-fpm +if expr "$1" : "apache" 1>/dev/null || [ "$1" = "php-fpm" ]; then + # cloning from git is just possible for develop or Release Candidats + if echo "${FRIENDICA_VERSION}" | grep -Eq '^.*(\-dev|-rc|-RC)' || [ "${FRIENDICA_UPGRADE:-false}" = "true" ] || [ ! -f /usr/src/friendica/VERSION ]; then + # just clone & check if it's a new install or upgrade + clone_develop + fi +fi + +exec /entrypoint.sh "$@" diff --git a/2020.03-rc/fpm-alpine/entrypoint.sh b/2020.03-rc/fpm-alpine/entrypoint.sh new file mode 100755 index 0000000..8c4d850 --- /dev/null +++ b/2020.03-rc/fpm-alpine/entrypoint.sh @@ -0,0 +1,149 @@ +#!/bin/sh +set -eu + +# run an command with the www-data user +run_as() { + set -- -c "cd /var/www/html; $*" + if [ "$(id -u)" -eq 0 ]; then + su - www-data -s /bin/sh "$@" + else + sh "$@" + fi +} + +# checks if the the first parameter is greater than the second parameter +version_greater() { + [ "$(printf '%s\n' "$@" | sort -r -t '-' -k2,2 | sort -t '.' -n -k1,1 -k2,2 -s | head -n 1)" != "$1" ] +} + +setup_ssmtp() { + if [ -n "${SMTP_DOMAIN+x}" ] && [ -n "${SMTP+x}" ] && [ "${SMTP}" != "localhost" ]; then + SITENAME="${FRIENDICA_SITENAME:-Friendica Social Network}" + echo "Setup SSMTP for '$SITENAME' with '$SMTP' ..." + + smtp_from=${SMTP_FROM:-no-reply} + + # Setup SSMTP + usermod --comment "$(echo "$SITENAME" | tr -dc '[:print:]')" root + usermod --comment "$(echo "$SITENAME" | tr -dc '[:print:]')" www-data + + # add possible mail-senders + { + echo "www-data:$smtp_from@$SMTP_DOMAIN:$SMTP" + echo "root::$smtp_from@$SMTP_DOMAIN:$SMTP" + } > /etc/ssmtp/revaliases + + # replace ssmtp.conf settings + { + echo "root=:$smtp_from@$SMTP_DOMAIN" + echo "hostname=$SMTP_DOMAIN" + 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 + + image_version="$(cat /usr/src/friendica/VERSION)" + + # 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)" + exit 1 + fi + + setup_ssmtp + + # check it just in case the version is greater or if we force the upgrade + if version_greater "$image_version" "$installed_version" || [ "${FRIENDICA_UPGRADE:-false}" = "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/ + + # Update docker-based config files, but never delete other config files + rsync $rsync_options --update /usr/src/friendica/config/ /var/www/html/config/ + + # 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}" ] && [ -n "${FRIENDICA_ADMIN_MAIL+x}" ] && [ -n "${FRIENDICA_URL+x}" ]; then + echo "Installation with environment variables" + + FRIENDICA_TZ=${FRIENDICA_TZ:-America/LosAngeles} + FRIENDICA_LANG=${FRIENDICA_LANG:-en} + MYSQL_PORT=${MYSQL_PORT:-3306} + + # shellcheck disable=SC2016 + install_options='-s --dbhost "'$MYSQL_HOST'" --dbport "'$MYSQL_PORT'" --dbdata "'$MYSQL_DATABASE'" --dbuser "'$MYSQL_USER'" --dbpass "'$MYSQL_PASSWORD'"' + + # shellcheck disable=SC2016 + install_options=$install_options' --admin "'$FRIENDICA_ADMIN_MAIL'" --tz "'$FRIENDICA_TZ'" --lang "'$FRIENDICA_LANG'" --url "'$FRIENDICA_URL'"' + install=true + fi + + if [ "$install" = true ]; then + echo "Waiting for MySQL $MYSQL_HOST initialization..." + if run_as "php /var/www/html/bin/wait-for-connection $MYSQL_HOST ${MYSQL_PORT:-3306} 300"; then + + echo "Starting Friendica installation ..." + run_as "php /var/www/html/bin/console.php autoinstall $install_options" + + rm -fr /var/www/html/view/smarty3/compiled + + # load other config files (*.config.php) to the config folder + if [ -d "/usr/src/config" ]; then + rsync $rsync_options --ignore-existing /usr/src/config/ /var/www/html/config/ + fi + + echo "Installation finished" + else + echo "[ERROR] Waited 300 seconds, no response" >&2 + fi + else + echo "Running web-based installer on first connect!" + fi + # upgrade + else + echo "Upgrading Friendica ..." + run_as 'php /var/www/html/bin/console.php dbstructure update' + echo "Upgrading finished" + fi + fi +fi + +exec "$@" diff --git a/2020.03-rc/fpm-alpine/upgrade.exclude b/2020.03-rc/fpm-alpine/upgrade.exclude new file mode 100644 index 0000000..2fb6533 --- /dev/null +++ b/2020.03-rc/fpm-alpine/upgrade.exclude @@ -0,0 +1,10 @@ +/.git/ +/photo/ +/proxy/ +/.htconfig.php +/.htaccess +/home.* +/config/ +/storage/ +/log/ +*.log \ No newline at end of file diff --git a/2020.03-rc/fpm/Dockerfile b/2020.03-rc/fpm/Dockerfile new file mode 100644 index 0000000..1841e4e --- /dev/null +++ b/2020.03-rc/fpm/Dockerfile @@ -0,0 +1,132 @@ +# DO NOT EDIT: created by update.sh from Dockerfile-debian.template +FROM php:7.3-fpm-stretch + +# 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 \ +# For tini installation + gnupg dirmngr \ + ; \ + rm -rf /var/lib/apt/lists/*; + +# Add tini for reaping processes +ENV TINI_VERSION v0.18.0 +RUN export BUILD_ARCH=$(dpkg-architecture --query DEB_BUILD_ARCH) \ + && curl -L -o /sbin/tini https://github.com/krallin/tini/releases/download/${TINI_VERSION}/tini-${BUILD_ARCH} \ + && curl -L -o /tini.asc https://github.com/krallin/tini/releases/download/${TINI_VERSION}/tini-${BUILD_ARCH}.asc \ + && gpg --batch --keyserver hkp://p80.pool.sks-keyservers.net:80 --recv-keys 595E85A6B1B4779EA4DAAEC70B588DFF0527A9B7 \ + && gpg --batch --verify /tini.asc /sbin/tini \ + && chmod +x /sbin/tini + +# 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 \ + mysql-client \ + bash \ + libpng-dev \ + libjpeg62-turbo-dev \ + libtool \ + libmagick++-dev \ + libmemcached-dev \ + libgraphicsmagick1-dev \ + libfreetype6-dev \ + librsvg2-2 \ + libzip-dev \ + libldap2-dev \ + ; \ + \ + debMultiarch="$(dpkg-architecture --query DEB_BUILD_MULTIARCH)"; \ + \ + docker-php-ext-configure gd \ + --with-gd \ + --with-freetype-dir=/usr/include/ \ + --with-png-dir=/usr/include/ \ + --with-jpeg-dir=/usr/include/ \ + ; \ + docker-php-ext-configure ldap \ + --with-libdir=lib/$debMultiarch/ \ + ; \ + docker-php-ext-install -j "$(nproc)" \ + pdo_mysql \ + gd \ + zip \ + opcache \ + ctype \ + pcntl \ + ldap \ + ; \ + \ +# pecl will claim success even if one install fails, so we need to perform each install separately + pecl install apcu-5.1.18; \ + pecl install memcached-3.1.5; \ + pecl install redis-5.2.0; \ + pecl install imagick-3.4.4; \ + \ + docker-php-ext-enable \ + apcu \ + memcached \ + redis \ + imagick \ + ; \ + \ +# 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/* + +# set recommended PHP.ini settings +RUN set -ex; \ + { \ + echo 'opcache.enable=1' ; \ + echo 'opcache.interned_strings_buffer=8'; \ + echo 'opcache.max_accelerated_files=10000'; \ + echo 'opcache.memory_consumption=128'; \ + echo 'opcache.save_comments=1'; \ + echo 'opcache.revalidte_freq=1'; \ + } > /usr/local/etc/php/conf.d/opcache-recommended.ini; \ + \ + { \ + echo sendmail_path = "/usr/sbin/sendmail -t -i"; \ + } > /usr/local/etc/php/conf.d/sendmail.ini; \ + \ + echo 'apc.enable_cli=1' >> /usr/local/etc/php/conf.d/docker-php-ext-apcu.ini; \ + \ + echo 'memory_limit=512M' > /usr/local/etc/php/conf.d/memory-limit.ini; \ + \ + mkdir /var/www/data; \ + chown -R www-data:root /var/www; \ + chmod -R g=u /var/www + +VOLUME /var/www/html + + +ENV FRIENDICA_VERSION 2020.03-rc +ENV FRIENDICA_ADDONS 2020.03-rc + + +COPY *.sh upgrade.exclude / +COPY config/* /usr/src/friendica/config/ + +ENTRYPOINT ["/entrypoint-dev.sh"] +CMD ["php-fpm"] diff --git a/2020.03-rc/fpm/config/00apcu.config.php b/2020.03-rc/fpm/config/00apcu.config.php new file mode 100644 index 0000000..d6dac4f --- /dev/null +++ b/2020.03-rc/fpm/config/00apcu.config.php @@ -0,0 +1,12 @@ + [ + 'cache_driver' => 'apcu', + 'session_handler' => 'cache', + ], +]; diff --git a/2020.03-rc/fpm/config/01redis.config.php b/2020.03-rc/fpm/config/01redis.config.php new file mode 100644 index 0000000..1a43c95 --- /dev/null +++ b/2020.03-rc/fpm/config/01redis.config.php @@ -0,0 +1,15 @@ + [ + 'lock_driver' => 'redis', + 'redis_host' => getenv('REDIS_HOST'), + 'redis_port' => (getenv('REDIS_PORT') ? getenv('REDIS_PORT') : ''), + 'redis_password' => (getenv('REDIS_PW') ? getenv('REDIS_PW') : ''), + 'redis_db' => (getenv('REDIS_DB') ? getenv('REDIS_DB') : 0), + ], + ]; +} else { + return []; +} diff --git a/2020.03-rc/fpm/config/zz-docker.config.php b/2020.03-rc/fpm/config/zz-docker.config.php new file mode 100644 index 0000000..2d5835d --- /dev/null +++ b/2020.03-rc/fpm/config/zz-docker.config.php @@ -0,0 +1,62 @@ + [ + // Necessary because otherwise the daemon isn't working + 'pidfile' => '/var/run/friendica.pid', + + 'logfile' => '/var/www/html/friendica.log', + 'loglevel' => 'notice', + ], + 'storage' => [ + 'filesystem_path' => '/var/www/html/storage', + ], +]; + +if (getenv('FRIENDICA_TZ')) { + $config['config']['timezone'] = getenv('FRIENDICA_TZ'); +} + +if (getenv('FRIENDICA_LANG')) { + $config['config']['language'] = getenv('FRIENDICA_LANG'); +} + +if (getenv('FRIENDICA_ADMIN_MAIL')) { + $config['config']['admin_email'] = getenv('FRIENDICA_ADMIN_MAIL'); +} + +if (getenv('FRIENDICA_SITENAME')) { + $config['config']['sitename'] = getenv('FRIENDICA_SITENAME'); +} + +if (!empty(getenv('FRIENDICA_NO_VALIDATION'))) { + $config['system']['disable_url_validation'] = true; + $config['system']['disable_email_validation'] = true; +} + +if (!empty(getenv('FRIENDICA_DATA'))) { + $config['storage']['class'] = \Friendica\Model\Storage\Filesystem::class; + + if (!empty(getenv('FRIENDICA_DATA_DIR'))) { + $config['storage']['filesystem_path'] = getenv('FRIENDICA_DATA'); + } +} + +if (!empty(getenv('FRIENDICA_DEBUGGING'))) { + $config['system']['debugging'] = true; + if (!empty(getenv('FRIENDICA_LOGFILE'))) { + $config['system']['logfile'] = getenv('FRIENDICA_LOGFILE'); + } + if (!empty(getenv('FRIENDICA_LOGLEVEL'))) { + $config['system']['loglevel'] = getenv('FRIENDICA_LOGLEVEL'); + } +} + +return $config; diff --git a/2020.03-rc/fpm/cron.sh b/2020.03-rc/fpm/cron.sh new file mode 100755 index 0000000..55be04a --- /dev/null +++ b/2020.03-rc/fpm/cron.sh @@ -0,0 +1,13 @@ +#!/bin/sh +trap "break;exit" HUP INT TERM + +while [ ! -f /var/www/html/bin/daemon.php ]; do + sleep 1 +done + +echo "Waiting for MySQL $MYSQL_HOST initialization..." +if php /var/www/html/bin/wait-for-connection "$MYSQL_HOST" "${MYSQL_PORT:-3306}" 300; then + exec /sbin/tini -- php /var/www/html/bin/daemon.php -f start +else + echo "[ERROR] Waited 300 seconds, no response" >&2 +fi diff --git a/2020.03-rc/fpm/entrypoint-dev.sh b/2020.03-rc/fpm/entrypoint-dev.sh new file mode 100755 index 0000000..55afb80 --- /dev/null +++ b/2020.03-rc/fpm/entrypoint-dev.sh @@ -0,0 +1,69 @@ +#!/bin/sh +set -eu + +# checks if the branch and repository exists +check_branch() { + repo=${1:-} + branch=${2:-} + git ls-remote --heads --tags "https://github.com/$repo" | grep -E "refs/(heads|tags)/${branch}$" >/dev/null + [ "$?" -eq "0" ] +} + +# clones the whole develop branch (Friendica and Addons) +clone_develop() { + friendica_git="${FRIENDICA_VERSION}" + addons_git="${FRIENDICA_ADDONS}" + friendica_repo="${FRIENDICA_REPOSITORY:-friendica/friendica}" + friendica_addons_repo="${FRIENDICA_ADDONS_REPO:-friendica/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 + + # Check if the branches exist before wiping the + if check_branch "$friendica_repo" "$friendica_git" && check_branch "$friendica_addons_repo" "$addons_git" ; then + echo "Cloning '${friendica_git}' from GitHub repository '${friendica_repo}' ..." + + # Removing the whole directory first + rm -fr /usr/src/friendica + git clone -q -b ${friendica_git} "https://github.com/${friendica_repo}" /usr/src/friendica + + mkdir /usr/src/friendica/addon + git clone -q -b ${addons_git} "https://github.com/${friendica_addons_repo}" /usr/src/friendica/addon + + echo "Download finished" + + if [ ! -f /usr/src/friendica/VERSION ]; then + echo "Couldn't clone repository" + exit 1 + fi + + /usr/src/friendica/bin/composer.phar install --no-dev -d /usr/src/friendica + return 0 + + else + if check_branch "$friendica_repo" "$friendica_git"; then + echo "$friendica_repo/$friendica_git is not valid." + else + echo "$friendica_addons_repo/$addons_git is not valid." + fi + echo "Using old version." + return 1 + + fi +} + +# just check if we execute apache or php-fpm +if expr "$1" : "apache" 1>/dev/null || [ "$1" = "php-fpm" ]; then + # cloning from git is just possible for develop or Release Candidats + if echo "${FRIENDICA_VERSION}" | grep -Eq '^.*(\-dev|-rc|-RC)' || [ "${FRIENDICA_UPGRADE:-false}" = "true" ] || [ ! -f /usr/src/friendica/VERSION ]; then + # just clone & check if it's a new install or upgrade + clone_develop + fi +fi + +exec /entrypoint.sh "$@" diff --git a/2020.03-rc/fpm/entrypoint.sh b/2020.03-rc/fpm/entrypoint.sh new file mode 100755 index 0000000..8c4d850 --- /dev/null +++ b/2020.03-rc/fpm/entrypoint.sh @@ -0,0 +1,149 @@ +#!/bin/sh +set -eu + +# run an command with the www-data user +run_as() { + set -- -c "cd /var/www/html; $*" + if [ "$(id -u)" -eq 0 ]; then + su - www-data -s /bin/sh "$@" + else + sh "$@" + fi +} + +# checks if the the first parameter is greater than the second parameter +version_greater() { + [ "$(printf '%s\n' "$@" | sort -r -t '-' -k2,2 | sort -t '.' -n -k1,1 -k2,2 -s | head -n 1)" != "$1" ] +} + +setup_ssmtp() { + if [ -n "${SMTP_DOMAIN+x}" ] && [ -n "${SMTP+x}" ] && [ "${SMTP}" != "localhost" ]; then + SITENAME="${FRIENDICA_SITENAME:-Friendica Social Network}" + echo "Setup SSMTP for '$SITENAME' with '$SMTP' ..." + + smtp_from=${SMTP_FROM:-no-reply} + + # Setup SSMTP + usermod --comment "$(echo "$SITENAME" | tr -dc '[:print:]')" root + usermod --comment "$(echo "$SITENAME" | tr -dc '[:print:]')" www-data + + # add possible mail-senders + { + echo "www-data:$smtp_from@$SMTP_DOMAIN:$SMTP" + echo "root::$smtp_from@$SMTP_DOMAIN:$SMTP" + } > /etc/ssmtp/revaliases + + # replace ssmtp.conf settings + { + echo "root=:$smtp_from@$SMTP_DOMAIN" + echo "hostname=$SMTP_DOMAIN" + 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 + + image_version="$(cat /usr/src/friendica/VERSION)" + + # 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)" + exit 1 + fi + + setup_ssmtp + + # check it just in case the version is greater or if we force the upgrade + if version_greater "$image_version" "$installed_version" || [ "${FRIENDICA_UPGRADE:-false}" = "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/ + + # Update docker-based config files, but never delete other config files + rsync $rsync_options --update /usr/src/friendica/config/ /var/www/html/config/ + + # 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}" ] && [ -n "${FRIENDICA_ADMIN_MAIL+x}" ] && [ -n "${FRIENDICA_URL+x}" ]; then + echo "Installation with environment variables" + + FRIENDICA_TZ=${FRIENDICA_TZ:-America/LosAngeles} + FRIENDICA_LANG=${FRIENDICA_LANG:-en} + MYSQL_PORT=${MYSQL_PORT:-3306} + + # shellcheck disable=SC2016 + install_options='-s --dbhost "'$MYSQL_HOST'" --dbport "'$MYSQL_PORT'" --dbdata "'$MYSQL_DATABASE'" --dbuser "'$MYSQL_USER'" --dbpass "'$MYSQL_PASSWORD'"' + + # shellcheck disable=SC2016 + install_options=$install_options' --admin "'$FRIENDICA_ADMIN_MAIL'" --tz "'$FRIENDICA_TZ'" --lang "'$FRIENDICA_LANG'" --url "'$FRIENDICA_URL'"' + install=true + fi + + if [ "$install" = true ]; then + echo "Waiting for MySQL $MYSQL_HOST initialization..." + if run_as "php /var/www/html/bin/wait-for-connection $MYSQL_HOST ${MYSQL_PORT:-3306} 300"; then + + echo "Starting Friendica installation ..." + run_as "php /var/www/html/bin/console.php autoinstall $install_options" + + rm -fr /var/www/html/view/smarty3/compiled + + # load other config files (*.config.php) to the config folder + if [ -d "/usr/src/config" ]; then + rsync $rsync_options --ignore-existing /usr/src/config/ /var/www/html/config/ + fi + + echo "Installation finished" + else + echo "[ERROR] Waited 300 seconds, no response" >&2 + fi + else + echo "Running web-based installer on first connect!" + fi + # upgrade + else + echo "Upgrading Friendica ..." + run_as 'php /var/www/html/bin/console.php dbstructure update' + echo "Upgrading finished" + fi + fi +fi + +exec "$@" diff --git a/2020.03-rc/fpm/upgrade.exclude b/2020.03-rc/fpm/upgrade.exclude new file mode 100644 index 0000000..2fb6533 --- /dev/null +++ b/2020.03-rc/fpm/upgrade.exclude @@ -0,0 +1,10 @@ +/.git/ +/photo/ +/proxy/ +/.htconfig.php +/.htaccess +/home.* +/config/ +/storage/ +/log/ +*.log \ No newline at end of file diff --git a/generate-stackbrew-library.sh b/generate-stackbrew-library.sh index dcce463..4f8ee37 100755 --- a/generate-stackbrew-library.sh +++ b/generate-stackbrew-library.sh @@ -4,6 +4,7 @@ set -Eeuo pipefail declare -A release_channel=( [stable]='2019.12' [latest]='2019.12' + [rc]='2020.03-rc' ) self="$(basename "$BASH_SOURCE")" diff --git a/update.sh b/update.sh index a9a3c09..b42e05d 100755 --- a/update.sh +++ b/update.sh @@ -95,6 +95,7 @@ variants=( versions=( 2019.12 2020.03-dev + 2020.03-rc ) travisEnv=