Skip to content

Commit

Permalink
wordpress 6 init
Browse files Browse the repository at this point in the history
  • Loading branch information
Buburoi committed Mar 14, 2023
1 parent 63ea52e commit 7ff301b
Show file tree
Hide file tree
Showing 7 changed files with 487 additions and 0 deletions.
193 changes: 193 additions & 0 deletions wordpress/6-apache/Dockerfile
@@ -0,0 +1,193 @@

FROM php:8.1-apache

LABEL vendor="Artifakt" \
author="engineering@artifakt.io" \
stage="alpha"

HEALTHCHECK --interval=1m --timeout=30s --retries=3 CMD curl --fail http://localhost || exit 1
# persistent dependencies
RUN set -eux; \
apt-get update; \
apt-get install -y --no-install-recommends \
# Ghostscript is required for rendering PDF previews
ghostscript \
; \
rm -rf /var/lib/apt/lists/*

# install the PHP extensions we need (https://make.wordpress.org/hosting/handbook/handbook/server-environment/#php-extensions)
RUN set -ex; \
\
savedAptMark="$(apt-mark showmanual)"; \
\
apt-get update; \
apt-get install -y --no-install-recommends \
libfreetype6-dev \
libjpeg-dev \
libmagickwand-dev \
libpng-dev \
libwebp-dev \
libzip-dev \
; \
\
docker-php-ext-configure gd \
--with-freetype \
--with-jpeg \
--with-webp \
; \
docker-php-ext-install -j "$(nproc)" \
bcmath \
exif \
gd \
mysqli \
zip \
; \
# https://pecl.php.net/package/imagick
pecl install imagick-3.6.0; \
docker-php-ext-enable imagick; \
rm -r /tmp/pear; \
\
# some misbehaving extensions end up outputting to stdout 🙈 (https://github.com/docker-library/wordpress/issues/669#issuecomment-993945967)
out="$(php -r 'exit(0);')"; \
[ -z "$out" ]; \
err="$(php -r 'exit(0);' 3>&1 1>&2 2>&3)"; \
[ -z "$err" ]; \
\
extDir="$(php -r 'echo ini_get("extension_dir");')"; \
[ -d "$extDir" ]; \
# 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 "$extDir"/*.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/*; \
\
! { ldd "$extDir"/*.so | grep 'not found'; }; \
# check for output like "PHP Warning: PHP Startup: Unable to load dynamic library 'foo' (tried: ...)
err="$(php --version 3>&1 1>&2 2>&3)"; \
[ -z "$err" ]

# set recommended PHP.ini settings
# see https://secure.php.net/manual/en/opcache.installation.php
RUN set -eux; \
docker-php-ext-enable opcache; \
{ \
echo 'opcache.memory_consumption=128'; \
echo 'opcache.interned_strings_buffer=8'; \
echo 'opcache.max_accelerated_files=4000'; \
echo 'opcache.revalidate_freq=2'; \
echo 'opcache.fast_shutdown=1'; \
} > /usr/local/etc/php/conf.d/opcache-recommended.ini
# https://wordpress.org/support/article/editing-wp-config-php/#configure-error-logging
RUN { \
# https://www.php.net/manual/en/errorfunc.constants.php
# https://github.com/docker-library/wordpress/issues/420#issuecomment-517839670
echo 'error_reporting = E_ERROR | E_WARNING | E_PARSE | E_CORE_ERROR | E_CORE_WARNING | E_COMPILE_ERROR | E_COMPILE_WARNING | E_RECOVERABLE_ERROR'; \
echo 'display_errors = Off'; \
echo 'display_startup_errors = Off'; \
echo 'log_errors = On'; \
echo 'error_log = /dev/stderr'; \
echo 'log_errors_max_len = 1024'; \
echo 'ignore_repeated_errors = On'; \
echo 'ignore_repeated_source = Off'; \
echo 'html_errors = Off'; \
} > /usr/local/etc/php/conf.d/error-logging.ini

RUN set -eux; \
a2enmod rewrite expires; \
\
# https://httpd.apache.org/docs/2.4/mod/mod_remoteip.html
a2enmod remoteip; \
{ \
echo 'RemoteIPHeader X-Forwarded-For'; \
# these IP ranges are reserved for "private" use and should thus *usually* be safe inside Docker
echo 'RemoteIPTrustedProxy 10.0.0.0/8'; \
echo 'RemoteIPTrustedProxy 172.16.0.0/12'; \
echo 'RemoteIPTrustedProxy 192.168.0.0/16'; \
echo 'RemoteIPTrustedProxy 169.254.0.0/16'; \
echo 'RemoteIPTrustedProxy 127.0.0.0/8'; \
} > /etc/apache2/conf-available/remoteip.conf; \
a2enconf remoteip; \
# https://github.com/docker-library/wordpress/issues/383#issuecomment-507886512
# (replace all instances of "%h" with "%a" in LogFormat)
find /etc/apache2 -type f -name '*.conf' -exec sed -ri 's/([[:space:]]*LogFormat[[:space:]]+"[^"]*)%h([^"]*")/\1%a\2/g' '{}' +

RUN set -eux; \
version='6.1.1'; \
sha1='80f0f829645dec07c68bcfe0a0a1e1d563992fcb'; \
\
curl -o wordpress.tar.gz -fL "https://wordpress.org/wordpress-$version.tar.gz"; \
echo "$sha1 *wordpress.tar.gz" | sha1sum -c -; \
\
# upstream tarballs include ./wordpress/ so this gives us /usr/src/wordpress
tar -xzf wordpress.tar.gz -C /usr/src/; \
rm wordpress.tar.gz; \
\
# https://wordpress.org/support/article/htaccess/
[ ! -e /usr/src/wordpress/.htaccess ]; \
{ \
echo '# BEGIN WordPress'; \
echo ''; \
echo 'RewriteEngine On'; \
echo 'RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]'; \
echo 'RewriteBase /'; \
echo 'RewriteRule ^index\.php$ - [L]'; \
echo 'RewriteCond %{REQUEST_FILENAME} !-f'; \
echo 'RewriteCond %{REQUEST_FILENAME} !-d'; \
echo 'RewriteRule . /index.php [L]'; \
echo ''; \
echo '# END WordPress'; \
} > /usr/src/wordpress/.htaccess; \
\
chown -R www-data:www-data /usr/src/wordpress; \
# pre-create wp-content (and single-level children) for folks who want to bind-mount themes, etc so permissions are pre-created properly instead of root:root
# wp-content/cache: https://github.com/docker-library/wordpress/issues/534#issuecomment-705733507
mkdir wp-content; \
for dir in /usr/src/wordpress/wp-content/*/ cache; do \
dir="$(basename "${dir%/}")"; \
mkdir "wp-content/$dir"; \
done; \
chown -R www-data:www-data wp-content; \
chmod -R 777 wp-content

#VOLUME /var/www/html

#COPY --chown=www-data:www-data wp-config-docker.php /usr/src/wordpress/
#COPY docker-entrypoint.sh /usr/local/bin/

#ENTRYPOINT ["docker-entrypoint.sh"]
#CMD ["apache2-foreground"]

################################### END OF OFFICIAL WORDPRESS ###

# Force HTTPS on mode
ENV HTTPS=on

# hadolint ignore=SC2016
RUN echo 'SetEnv HTTPS on' > /etc/apache2/conf-enabled/force-ssl.conf

# Install composer
ARG COMPOSER_VERSION=2.3.7
RUN curl -sS https://getcomposer.org/installer | \
php -- --version=${COMPOSER_VERSION} --install-dir=/usr/local/bin --filename=composer

# Install WP CLI
RUN curl -O https://raw.githubusercontent.com/wp-cli/builds/gh-pages/phar/wp-cli.phar && \
chmod +x wp-cli.phar && \
mv wp-cli.phar /usr/local/bin/wp

# hadolint ignore=DL3045
# Add default configuration files
COPY --chown=www-data:www-data etc/wp-config.php /var/www/html/

COPY docker-entrypoint.sh /usr/local/bin/

ENTRYPOINT ["/usr/local/bin/docker-entrypoint.sh"]
CMD ["apache2-foreground"]
16 changes: 16 additions & 0 deletions wordpress/6-apache/artifakt_scripts/apt_get_install.sh
@@ -0,0 +1,16 @@
#!/bin/bash

echo "CHECKING if more dependencies need to be installed"

if [ -n "$APT_GET_INSTALL" ]; then
echo "Depedencies found. Installing $APT_GET_INSTALL"
apt-get update --fix-missing
for i in $APT_GET_INSTALL; do
echo "Install $i"
sudo apt-get install -y "$i"
done
rm -rf /var/lib/apt/lists/*
echo "Install done."
else
echo "No dependencies to add."
fi
7 changes: 7 additions & 0 deletions wordpress/6-apache/artifakt_scripts/composer_setup.sh
@@ -0,0 +1,7 @@
#!/bin/bash

if [ -z "$ARTIFAKT_COMPOSER_VERSION" ]; then ARTIFAKT_COMPOSER_VERSION="2.3.7"; fi
curl -sS https://getcomposer.org/installer | \
php -- --version="${ARTIFAKT_COMPOSER_VERSION}" --install-dir=/usr/local/bin --filename=composer

mkdir -p /var/www/.composer && chown www-data:www-data -R /var/www/.composer
38 changes: 38 additions & 0 deletions wordpress/6-apache/artifakt_scripts/wordpress_install.sh
@@ -0,0 +1,38 @@
#!/bin/bash

if [ -z "$WORDPRESS_VERSION" ]; then WORDPRESS_VERSION="6.1.1"; fi

sha1='80f0f829645dec07c68bcfe0a0a1e1d563992fcb';
curl -o wordpress.tar.gz -fL "https://wordpress.org/wordpress-$WORDPRESS_VERSION.tar.gz";
echo "$sha1 *wordpress.tar.gz" | sha1sum -c -;

# upstream tarballs include ./wordpress/ so this gives us /usr/src/wordpress
tar -xzf wordpress.tar.gz -C /usr/src/;
rm wordpress.tar.gz;

# https://wordpress.org/support/article/htaccess/
[ ! -e /usr/src/wordpress/.htaccess ];
{
echo '# BEGIN WordPress'; \
echo ''; \
echo 'RewriteEngine On'; \
echo 'RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]'; \
echo 'RewriteBase /'; \
echo 'RewriteRule ^index\.php$ - [L]'; \
echo 'RewriteCond %{REQUEST_FILENAME} !-f'; \
echo 'RewriteCond %{REQUEST_FILENAME} !-d'; \
echo 'RewriteRule . /index.php [L]'; \
echo ''; \
echo '# END WordPress'; \
} > /usr/src/wordpress/.htaccess;

chown -R www-data:www-data /usr/src/wordpress;
# pre-create wp-content (and single-level children) for folks who want to bind-mount themes, etc so permissions are pre-created properly instead of root:root
# wp-content/cache: https://github.com/docker-library/wordpress/issues/534#issuecomment-705733507
mkdir wp-content;
for dir in /usr/src/wordpress/wp-content/*/ cache; do
dir="$(basename "${dir%/}")";
mkdir "wp-content/$dir";
done;
chown -R www-data:www-data wp-content;
chmod -R 777 wp-content
19 changes: 19 additions & 0 deletions wordpress/6-apache/docker-entrypoint.sh
@@ -0,0 +1,19 @@
#!/bin/bash
set -e

PERSISTENT_FOLDER_LIST=('wp-content/cache' 'wp-content/uploads' 'wp-content/backups' 'wp-content/backup-db' 'wp-content/upgrade')

for persistent_folder in "${PERSISTENT_FOLDER_LIST[@]}"; do
echo "Mount $persistent_folder directory"
rm -rf "/var/www/html/$persistent_folder" && \
mkdir -p "/data/$persistent_folder" && \
ln -sfn "/data/$persistent_folder" "/var/www/html/$persistent_folder" && \
chown -h www-data:www-data "/var/www/html/$persistent_folder" "/data/$persistent_folder"
done

# first arg is `-f` or `--some-option`
if [ "${1#-}" != "$1" ]; then
set -- apache2-foreground "$@"
fi

exec "$@"
84 changes: 84 additions & 0 deletions wordpress/6-apache/etc/wp-config.php
@@ -0,0 +1,84 @@
<?php
/**
* The base configuration for WordPress
*
* The wp-config.php creation script uses this file during the
* installation. You don't have to use the web site, you can
* copy this file to "wp-config.php" and fill in the values.
*
* This file contains the following configurations:
*
* * MySQL settings
* * Secret keys
* * Database table prefix
* * ABSPATH
*
* @link https://wordpress.org/support/article/editing-wp-config-php/
*
* @package WordPress
*/

// ** MySQL settings - You can get this info from your web host ** //
/** The name of the database for WordPress */
define( 'DB_NAME', $_ENV['ARTIFAKT_MYSQL_DATABASE_NAME'] );

/** MySQL database username */
define( 'DB_USER', $_ENV['ARTIFAKT_MYSQL_USER'] );

/** MySQL database password */
define( 'DB_PASSWORD', $_ENV['ARTIFAKT_MYSQL_PASSWORD'] );

/** MySQL hostname */
define( 'DB_HOST', $_ENV['ARTIFAKT_MYSQL_HOST'] );

/** Database Charset to use in creating database tables. */
define( 'DB_CHARSET', 'utf8' );

/** The Database Collate type. Don't change this if in doubt. */
define( 'DB_COLLATE', '' );

/**#@+
* Authentication Unique Keys and Salts.
*
* Change these to different unique phrases!
* You can generate these using the {@link https://api.wordpress.org/secret-key/1.1/salt/ WordPress.org secret-key service}
* You can change these at any point in time to invalidate all existing cookies. This will force all users to have to log in again.
*
* @since 2.6.0
*/
include "/data/secret-key.php";

/**#@-*/

/**
* WordPress Database Table prefix.
*
* You can have multiple installations in one database if you give each
* a unique prefix. Only numbers, letters, and underscores please!
*/
$table_prefix = ($_ENV['TABLE_PREFIX'] != '') ? $_ENV['TABLE_PREFIX'] : 'wp_';

/**
* For developers: WordPress debugging mode.
*
* Change this to true to enable the display of notices during development.
* It is strongly recommended that plugin and theme developers use WP_DEBUG
* in their development environments.
*
* For information on other constants that can be used for debugging,
* visit the documentation.
*
* @link https://wordpress.org/support/article/debugging-in-wordpress/
*/
define( 'WP_DEBUG', ($_ENV['WP_DEBUG'] != '') ? $_ENV['WP_DEBUG'] : false);
define( 'WP_DEBUG_LOG', '/var/log/artifakt/wp-errors.log' );

/* That's all, stop editing! Happy publishing. */

/** Absolute path to the WordPress directory. */
if ( ! defined( 'ABSPATH' ) ) {
define( 'ABSPATH', __DIR__ . '/' );
}

/** Sets up WordPress vars and included files. */
require_once ABSPATH . 'wp-settings.php';

0 comments on commit 7ff301b

Please sign in to comment.