diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..9f11b75 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +.idea/ diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..c73ce0e --- /dev/null +++ b/Dockerfile @@ -0,0 +1,51 @@ +FROM wordpress:php7.4-fpm-alpine AS wordpress-builder + +USER root + +WORKDIR /tmp/build/rootfs + +# Build root filesystem structure (overlay), and copy over neccessary files +RUN mkdir -p usr/local/bin \ + && mkdir -p usr/local/etc/php/conf.d/ \ + && mkdir -p usr/src/ \ + && mv /usr/src/wordpress usr/src/ \ + && mv /usr/local/etc/php/conf.d/error-logging.ini usr/local/etc/php/conf.d/ \ + && mv /usr/local/etc/php/conf.d/opcache-recommended.ini usr/local/etc/php/conf.d/ + + +################################################# APP ################################################################## +FROM nlss/php-nginx + +ENV APK_DEPS "zlib-dev libzip-dev libpng-dev icu-dev imagemagick-dev" +ENV APK_BUILD_DEPS "curl-dev autoconf alpine-sdk" +ENV APK_WP_CLI_DEPS "bash less mysql-client" + +RUN apk add --update --no-cache ${APK_WP_CLI_DEPS} ${APK_DEPS} ${APK_BUILD_DEPS} \ + && docker-php-ext-install -j "$(nproc)" \ + bcmath \ + exif \ + gd \ + mysqli \ + opcache \ + zip \ + intl \ + && pecl install redis apcu imagick-3.4.4 \ + && docker-php-ext-enable redis apcu imagick \ + && apk del ${APK_BUILD_DEPS} \ + && rm /tmp/* -rf + +ADD rootfs / +COPY ["wp-config.php", "/var/www/html"] +COPY --from=wordpress-builder /tmp/build/rootfs / +COPY --from=wordpress:cli-php7.4 /usr/local/bin/wp /usr/local/bin/ + +ENV WP_CONTENT_ID 2bca7d694c6279bb79bbb642ba4305f9 +ENV WP_VERSION 5.3.2 +ENV WP_LOCALE en_GB +ENV CRON_ENABLED true + +RUN echo "* * * * * /usr/local/bin/php /var/www/${WEB_ROOT}/wp-cron.php" >> /etc/crontabs/www-data + +VOLUME ["/var/www/${WEB_ROOT}/wp-content"] + +EXPOSE 80/TCP \ No newline at end of file diff --git a/rootfs/etc/cont-init.d/10-init-wordpress b/rootfs/etc/cont-init.d/10-init-wordpress new file mode 100644 index 0000000..0e393db --- /dev/null +++ b/rootfs/etc/cont-init.d/10-init-wordpress @@ -0,0 +1,16 @@ +#!/usr/bin/with-contenv bash +set -e + +function wp() { + # Running as root in container is OK as long as all security implications are observed and maintained + /usr/local/bin/wp --allow-root "$@" +} + +echo "> Verifying 'Wordpress ${WP_VERSION}' installation..." +if wp core version; +then + echo "> Found 'Wordpress ${WP_VERSION}'" +else + echo "> Downloading 'Wordpress ${WP_VERSION}'..." + wp core download --locale="${WP_LOCALE}" --version="${WP_VERSION}" +fi \ No newline at end of file diff --git a/rootfs/etc/templates/tmpl-app-nginx.conf b/rootfs/etc/templates/tmpl-app-nginx.conf new file mode 100644 index 0000000..6ce2aca --- /dev/null +++ b/rootfs/etc/templates/tmpl-app-nginx.conf @@ -0,0 +1,40 @@ +server { + listen 80; + listen [::]:80; + + server_name {{ getenv "VIRTUAL_HOST" | strings.ReplaceAll "," " " }}; + set $base /var/www; + root $base/{{ getenv "WEB_ROOT" }}; + + # security + include nginxconfig.io/security.conf; + + # logging + access_log /var/log/nginx/app-access.log; + error_log /var/log/nginx/app-error.log warn; + + # index.php + index index.php; + + # index.php fallback + location / { + try_files $uri $uri/ /index.php?$query_string; + } + + #Add trailing slash to */wp-admin requests. + rewrite /wp-admin$ $scheme://$host$uri/ permanent; + + # handle .php + location ~ \.php$ { + fastcgi_intercept_errors on; + include nginxconfig.io/php_fastcgi.conf; + } + + location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ { + expires max; + log_not_found off; + } + + # additional config + include nginxconfig.io/general.conf; +} diff --git a/rootfs/usr/src/.gitkeep b/rootfs/usr/src/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/wp-config.php b/wp-config.php new file mode 100644 index 0000000..5bef1a7 --- /dev/null +++ b/wp-config.php @@ -0,0 +1,113 @@ + + * + * 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://codex.wordpress.org/Editing_wp-config.php + * + * @package WordPress + */ + +/** Not needed behind the nginx-proxy */ +define('FORCE_SSL_ADMIN', false); +define('FORCE_SSL_LOGIN', false); + +/** Disable cron (will be run by system crond) */ +define('DISABLE_WP_CRON', true); + +/** Makes it easier to control in docker environment */ +define('WP_CONTENT_DIR', $_ENV['WORDPRESS_CONTENT_DIR'] ?? (__DIR__ . '/wp-content')); + +/** + * Redis Cache + */ +define('WP_REDIS_HOST', $_ENV['WORDPRESS_REDIS_HOST'] ?? null); +define('WP_CACHE', (bool)($_ENV['WORDPRESS_CACHE'] ?? false)); +define('WP_CACHE_KEY_SALT', $_ENV['WORDPRESS_CACHE_KEY_SALT'] ?? null); + +// ** MySQL settings - You can get this info from your web host ** // +/** The name of the database for WordPress */ +define('DB_NAME', $_ENV['WORDPRESS_DB_NAME'] ?? 'wordpress'); + +/** MySQL database username */ +define('DB_USER', $_ENV['WORDPRESS_DB_USER'] ?? 'wordpress'); + +/** MySQL database password */ +define('DB_PASSWORD', $_ENV['WORDPRESS_DB_PASSWORD'] ?? ''); + +/** MySQL hostname */ +define('DB_HOST', $_ENV['WORDPRESS_DB_HOST'] ?? 'localhost'); + +/** Database Charset to use in creating database tables. */ +define('DB_CHARSET', $_ENV['WORDPRESS_DB_CHARSET'] ?? 'utf8mb4'); + +/** The Database Collate type. Don't change this if in doubt. */ +define('DB_COLLATE', $_ENV['WORDPRESS_DB_COLLATION'] ?? ''); + +/**#@+ + * 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 + */ +define('AUTH_KEY', $_ENV['WORDPRESS_AUTH_KEY'] ?? ''); +define('SECURE_AUTH_KEY', $_ENV['WORDPRESS_SECURE_AUTH_KEY'] ?? ''); +define('LOGGED_IN_KEY', $_ENV['WORDPRESS_LOGGED_IN_KEY'] ?? ''); +define('NONCE_KEY', $_ENV['WORDPRESS_NONCE_KEY'] ?? ''); +define('AUTH_SALT', $_ENV['WORDPRESS_AUTH_SALT'] ?? ''); +define('SECURE_AUTH_SALT', $_ENV['WORDPRESS_SECURE_AUTH_SALT'] ?? ''); +define('LOGGED_IN_SALT', $_ENV['WORDPRESS_LOGGED_IN_SALT'] ?? ''); +define('NONCE_SALT', $_ENV['WORDPRESS_NONCE_SALT'] ?? ''); + +/**#@-*/ + +/** + * 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['WORDPRESS_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 Codex. + * + * @link https://codex.wordpress.org/Debugging_in_WordPress + */ +define('WP_DEBUG', (bool)($_ENV['WORDPRESS_DEBUG'] ?? false)); + +/** + * Other settings + */ +define('FS_METHOD', 'direct'); + +/* That's all, stop editing! Happy blogging. */ + +/** 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'); \ No newline at end of file