Merge pull request 'Correcting quick start' (#1) from master into main
Reviewed-on: #1
This commit is contained in:
commit
ca505154b2
1
.gitignore
vendored
Normal file
1
.gitignore
vendored
Normal file
@ -0,0 +1 @@
|
||||
.env
|
10
Dockerfile.wordpress_fpm
Normal file
10
Dockerfile.wordpress_fpm
Normal file
@ -0,0 +1,10 @@
|
||||
# Wordpress - make a copy of wp-includes to compare with existing volumes
|
||||
|
||||
# 'docker-compose exec wordpress bash -c 'cd /var/www/html/wp-includes && grep wp_version version.php'
|
||||
FROM wordpress:6-fpm
|
||||
|
||||
# ancient debian
|
||||
#RUN apt update && apt -y install vim less
|
||||
|
||||
# Using cp rather than mv so the image can easily be rebuilt
|
||||
RUN cp -a /usr/src/wordpress/wp-content /var/www/html/wp-content-new
|
106
README.md
106
README.md
@ -1,3 +1,105 @@
|
||||
# WordPress
|
||||
# ComposePress
|
||||
|
||||
A Docker-based toolkit that streamlines WordPress upgrades using official images. Provides pre-configured docker-compose files, Dockerfiles, and standardized procedures to make WordPress maintenance more predictable and reliable.
|
||||
A Docker-based toolkit that streamlines WordPress upgrades using official images. Provides pre-configured docker-compose files, Dockerfiles, and standardized procedures to make WordPress maintenance more predictable and reliable.
|
||||
|
||||
## Project Configuration
|
||||
|
||||
### Project Name
|
||||
This project requires a project name, which should be defined in an `.env` file:
|
||||
```bash
|
||||
COMPOSE_PROJECT_NAME=test
|
||||
```
|
||||
|
||||
### Database Host Configuration
|
||||
To avoid conflicts, use the following format for the database host:
|
||||
```bash
|
||||
WORDPRESS_DB_HOST=${COMPOSE_PROJECT_NAME}-database-1:3306
|
||||
```
|
||||
|
||||
## Environment Variables
|
||||
|
||||
### Docker Images
|
||||
```bash
|
||||
# Web and Database Images
|
||||
IMAGE_WEB=test_web_staging
|
||||
IMAGE_DATABASE=mariadb:11.5
|
||||
```
|
||||
|
||||
### Let's Encrypt Configuration
|
||||
```bash
|
||||
VIRTUAL_HOST=test.test.org
|
||||
LETSENCRYPT_HOST=test.test.org
|
||||
LETSENCRYPT_EMAIL=test@test.com
|
||||
LETSENCRYPT_TEST=true
|
||||
```
|
||||
|
||||
### Database Configuration
|
||||
```bash
|
||||
WORDPRESS_DB_HOST=${COMPOSE_PROJECT_NAME}-database-1:3306
|
||||
WORDPRESS_DB_PASSWORD=wordpress
|
||||
MYSQL_ROOT_PASSWORD=wordpress
|
||||
MYSQL_DATABASE=wordpress
|
||||
MYSQL_USER=wordpress
|
||||
MYSQL_PASSWORD=wordpress
|
||||
```
|
||||
|
||||
### Volume Configuration
|
||||
```bash
|
||||
# External Volumes
|
||||
DB_VOLUME=test_db_staging
|
||||
CONTENT_VOLUME=test_content_staging
|
||||
|
||||
# Recreated Volumes
|
||||
HTML_VOLUME=test_html_staging
|
||||
```
|
||||
|
||||
## Usage
|
||||
|
||||
### Upgrade Process
|
||||
|
||||
1. Stop the current containers and remove volumes:
|
||||
```bash
|
||||
docker compose down -v
|
||||
```
|
||||
|
||||
2. Update WordPress version:
|
||||
- Modify version in `Dockerfile.wordpress_fpm`
|
||||
- Update `IMAGE_WEB` in `.env` file
|
||||
|
||||
3. Build and test the new environment:
|
||||
```bash
|
||||
# Build initial configuration
|
||||
docker compose -f docker-compose.first.yml build
|
||||
|
||||
# Test the build
|
||||
docker compose -f docker-compose.first.yml up -d
|
||||
|
||||
# Stop test environment
|
||||
docker compose -f docker-compose.first.yml down
|
||||
|
||||
# Start production environment
|
||||
docker compose up -d
|
||||
```
|
||||
|
||||
4. Migrate content:
|
||||
```bash
|
||||
# In the wordpress service, copy new content to production
|
||||
cp -a wp-content-new/* wp-content/
|
||||
|
||||
# Verify permissions on wp-content directory
|
||||
chmod -R [appropriate-permissions] wp-content/
|
||||
```
|
||||
|
||||
5. Optional: Update database if needed:
|
||||
```bash
|
||||
./update-db
|
||||
```
|
||||
|
||||
## Requirements
|
||||
Docker
|
||||
|
||||
## Contributing
|
||||
@bike
|
||||
|
||||
## License
|
||||
[GNU GENERAL PUBLIC LICENSE](LICENSE)
|
||||
|
44
default.conf
Normal file
44
default.conf
Normal file
@ -0,0 +1,44 @@
|
||||
# https://www.nginx.com/resources/wiki/start/topics/recipes/mediawiki/
|
||||
# https://www.nginx.com/resources/wiki/start/topics/recipes/wordpress/
|
||||
|
||||
server {
|
||||
|
||||
listen 80;
|
||||
listen [::]:80;
|
||||
server_name wordpress;
|
||||
root /var/www/html;
|
||||
index index.php;
|
||||
|
||||
#access_log /var/log/nginx/host.access.log main;
|
||||
|
||||
location / {
|
||||
try_files $uri $uri/ /index.php?$args;
|
||||
}
|
||||
|
||||
|
||||
# redirect server error pages to the static page /50x.html
|
||||
#
|
||||
error_page 500 502 503 504 /50x.html;
|
||||
location = /50x.html {
|
||||
root /usr/share/nginx/html;
|
||||
}
|
||||
|
||||
|
||||
# pass the PHP scripts to FastCGI server listening on wordpress2:9000
|
||||
#
|
||||
location ~ \.php$ {
|
||||
#fastcgi_split_path_info ^(.+\.php)(/.+)$;
|
||||
fastcgi_pass wordpress:9000;
|
||||
fastcgi_index index.php;
|
||||
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
|
||||
include fastcgi_params;
|
||||
# fastcgi_param PHP_VALUE "upload_max_filesize=8M";
|
||||
fastcgi_param PHP_VALUE "upload_max_filesize=8M; post_max_size=128M; memory_limit=256M";
|
||||
}
|
||||
|
||||
# location ~* \.(jpg|jpeg|gif|png|css|js|ico)$ {
|
||||
# expires max;
|
||||
# log_not_found off;
|
||||
# }
|
||||
|
||||
}
|
36
docker-compose.first.yml
Normal file
36
docker-compose.first.yml
Normal file
@ -0,0 +1,36 @@
|
||||
# The purpose of this docker compose is just to setup a new /var/www/html volume
|
||||
# from a new version of wordpress, after 'down -v'
|
||||
|
||||
services:
|
||||
|
||||
wordpress:
|
||||
build:
|
||||
context: .
|
||||
dockerfile: Dockerfile.wordpress_fpm
|
||||
image: ${IMAGE_WEB:-web}
|
||||
volumes:
|
||||
- html:/var/www/html
|
||||
environment:
|
||||
- WORDPRESS_DB_HOST=${WORDPRESS_DB_HOST:-database:3306}
|
||||
- WORDPRESS_DB_PASSWORD=${WORDPRESS_DB_PASSWORD:-fake}
|
||||
- VIRTUAL_HOST=${VIRTUAL_HOST:-wordpress}
|
||||
- LETSENCRYPT_HOST=${LETSENCRYPT_HOST:-wordpress}
|
||||
- LETSENCRYPT_EMAIL=${LETSENCRYPT_EMAIL:-me}
|
||||
- LETSENCRYPT_TEST=${LETSENCRYPT_TEST:-true}
|
||||
logging:
|
||||
driver: "json-file"
|
||||
options:
|
||||
max-size: "10m"
|
||||
max-file: "3"
|
||||
restart: always
|
||||
networks:
|
||||
- letsencrypt
|
||||
- default
|
||||
|
||||
volumes:
|
||||
html:
|
||||
name: ${HTML_VOLUME:-html}
|
||||
|
||||
networks:
|
||||
letsencrypt:
|
||||
external: true
|
103
docker-compose.yml
Normal file
103
docker-compose.yml
Normal file
@ -0,0 +1,103 @@
|
||||
# Buildkit to simplify the whole process of upgrading Wordpress with official images
|
||||
#
|
||||
# This version is designed for fpm, using a default.conf which references the wordpress service
|
||||
#
|
||||
# STEPS:
|
||||
|
||||
# Set COMPOSE_PROJECT_NAME in .env
|
||||
# docker compose down -v
|
||||
# Change wordpress version as required in Dockerfile.wordpress_fpm and .env (IMAGE_FIRST)
|
||||
# docker compose -f docker-compose.first.yml build
|
||||
# docker compose -f docker-compose.first.yml up -d
|
||||
# docker compose -f docker-compose.first.yml down
|
||||
# docker compose up -d
|
||||
# at this point manually copy everything from wp-content-new to wp-content: cp -a wp-content-new/* wp-content/
|
||||
#
|
||||
# MAKE SURE PERMISSIONS ARE CORRECT in wp-content
|
||||
# (if you need to) ./update-db
|
||||
|
||||
services:
|
||||
|
||||
database:
|
||||
image: ${IMAGE_DATABASE:-database}
|
||||
volumes:
|
||||
- db:/var/lib/mysql
|
||||
environment:
|
||||
- MYSQL_DATABASE=${MYSQL_DATABASE:-wordpress}
|
||||
- MYSQL_USER=${MYSQL_USER:-wordpress}
|
||||
- MYSQL_PASSWORD=${MYSQL_PASSWORD:-fake}
|
||||
- MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD:-fake}
|
||||
logging:
|
||||
driver: "json-file"
|
||||
options:
|
||||
max-size: "10m"
|
||||
max-file: "3"
|
||||
restart: always
|
||||
networks:
|
||||
- letsencrypt
|
||||
|
||||
wordpress:
|
||||
# build:
|
||||
# context: .
|
||||
# dockerfile: Dockerfile.wordpress_fpm
|
||||
image: ${IMAGE_WEB:-wordpress}
|
||||
volumes:
|
||||
- html:/var/www/html
|
||||
- content:/var/www/html/wp-content
|
||||
- ./wp-config.php:/var/www/html/wp-config.php
|
||||
environment:
|
||||
- WORDPRESS_DB_HOST=${WORDPRESS_DB_HOST:-database:3306}
|
||||
- WORDPRESS_DB_PASSWORD=${WORDPRESS_DB_PASSWORD:-fake}
|
||||
- VIRTUAL_HOST=${VIRTUAL_HOST:-wordpress}
|
||||
- LETSENCRYPT_HOST=${LETSENCRYPT_HOST:-wordpress}
|
||||
- LETSENCRYPT_EMAIL=${LETSENCRYPT_EMAIL:-me}
|
||||
- LETSENCRYPT_TEST=${LETSENCRYPT_TEST:-true}
|
||||
logging:
|
||||
driver: "json-file"
|
||||
options:
|
||||
max-size: "10m"
|
||||
max-file: "3"
|
||||
restart: always
|
||||
command: >
|
||||
bash -c "chown -R www-data:www-data /var/www/html/wp-content && php-fpm"
|
||||
networks:
|
||||
- letsencrypt
|
||||
- default
|
||||
|
||||
# nginx:latest and/or can be customized
|
||||
web:
|
||||
# build:
|
||||
# context: .
|
||||
# dockerfile: Dockerfile.nginx
|
||||
image: nginx:latest
|
||||
restart: always
|
||||
volumes:
|
||||
- html:/var/www/html/
|
||||
- content:/var/www/html/wp-content
|
||||
- ./default.conf:/etc/nginx/conf.d/default.conf
|
||||
- ./nginx.conf:/etc/nginx/nginx.conf
|
||||
environment:
|
||||
- VIRTUAL_HOST=${VIRTUAL_HOST:-wordpress}
|
||||
- LETSENCRYPT_HOST=${LETSENCRYPT_HOST:-wordpress}
|
||||
- LETSENCRYPT_EMAIL=${LETSENCRYPT_EMAIL:-me}
|
||||
- LETSENCRYPT_TEST=${LETSENCRYPT_TEST:-true}
|
||||
networks:
|
||||
- letsencrypt
|
||||
- default
|
||||
|
||||
# No variable substition for volumes in this version
|
||||
volumes:
|
||||
db:
|
||||
external: true
|
||||
name: ${DB_VOLUME:-db}
|
||||
html:
|
||||
name: ${HTML_VOLUME:-html}
|
||||
content:
|
||||
external: true
|
||||
name: ${CONTENT_VOLUME:-content}
|
||||
|
||||
networks:
|
||||
letsencrypt:
|
||||
external: true
|
||||
# default:
|
||||
# name: ${COMPOSE_PROJECT_NAME}_default
|
38
nginx.conf
Normal file
38
nginx.conf
Normal file
@ -0,0 +1,38 @@
|
||||
|
||||
user nginx;
|
||||
worker_processes auto;
|
||||
|
||||
error_log /var/log/nginx/error.log notice;
|
||||
pid /var/run/nginx.pid;
|
||||
|
||||
|
||||
events {
|
||||
worker_connections 1024;
|
||||
}
|
||||
|
||||
|
||||
http {
|
||||
include /etc/nginx/mime.types;
|
||||
default_type application/octet-stream;
|
||||
|
||||
client_max_body_size 100M;
|
||||
client_body_buffer_size 100M;
|
||||
proxy_buffer_size 128k;
|
||||
proxy_buffers 4 256k;
|
||||
proxy_busy_buffers_size 256k;
|
||||
|
||||
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
|
||||
'$status $body_bytes_sent "$http_referer" '
|
||||
'"$http_user_agent" "$http_x_forwarded_for"';
|
||||
|
||||
access_log /var/log/nginx/access.log main;
|
||||
|
||||
sendfile on;
|
||||
#tcp_nopush on;
|
||||
|
||||
keepalive_timeout 65;
|
||||
|
||||
#gzip on;
|
||||
|
||||
include /etc/nginx/conf.d/*.conf;
|
||||
}
|
14
update-db
Executable file
14
update-db
Executable file
@ -0,0 +1,14 @@
|
||||
#!/bin/bash
|
||||
|
||||
source ".env"
|
||||
|
||||
website="https://$VIRTUAL_HOST"
|
||||
command="docker-compose exec database mysql"
|
||||
|
||||
echo $website
|
||||
|
||||
$command -u $MYSQL_USER $MYSQL_DATABASE -p"$WORDPRESS_DB_PASSWORD" -e "UPDATE cf_options SET option_value='$website' WHERE option_name='home';"
|
||||
$command -u $MYSQL_USER $MYSQL_DATABASE -p"$WORDPRESS_DB_PASSWORD" -e "UPDATE cf_options SET option_value='$website' WHERE option_name='siteurl';"
|
||||
|
||||
## Add
|
||||
# /usr/bin/find /var/www/html/wp-content/uploads/ -type d -exec chmod 755 {} \; -o -type f -exec chmod 644 {} \;
|
95
wp-config.php
Normal file
95
wp-config.php
Normal file
@ -0,0 +1,95 @@
|
||||
<?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://codex.wordpress.org/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', 'wordpress');
|
||||
|
||||
/** MySQL database username */
|
||||
define('DB_USER', 'root');
|
||||
|
||||
/** MySQL database password */
|
||||
define('DB_PASSWORD', 'wordpress');
|
||||
|
||||
/** MySQL hostname */
|
||||
define('DB_HOST', getenv('WORDPRESS_DB_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
|
||||
*/
|
||||
define('AUTH_KEY', 'dU_!>D;E$}Z%PQ*S^N@UZj}02GT.ce^%MLLB#4})%P(gVKYG(J5MKl[![Y;nN^%0');
|
||||
define('SECURE_AUTH_KEY', '+-9zk5?X=JazoN|.SfnyDuq*eEha?baAO:,B!XIf+WlhEXbK%30wg/fZ>J;/%n|B');
|
||||
define('LOGGED_IN_KEY', '{#lT+Rq-zLKA?H#_Xu+az9Ae,/rOL {jT%l.o.&CY%IRB+,Jidi?M.@d`f`8NpPE');
|
||||
define('NONCE_KEY', 'uw!r}Koniy9yV}&.w#HT@(L/Wf<6mcFK[OM,Jsot.B`~%T~ShmEai#my/7_Yr}s&');
|
||||
define('AUTH_SALT', '?0(Sm)EJr6J~) $$DJ$-:jo4S}U2s@-(Rg9jROY<EMD~SH]`@YF-=o| P|bU-}C<');
|
||||
define('SECURE_AUTH_SALT', '*nn>S?/e8p1e?:t7vAH99uS)jffX~+3?v+?d+_&!J|9~8oH6wopu_5 1iW{l_XUt');
|
||||
define('LOGGED_IN_SALT', '.Hca|;r-C8c[<]Y@28KX*6&gBT=s:I:1|6Y -DNQ*SD)R-`~8<drS}]*?;&d|[;T');
|
||||
define('NONCE_SALT', '!M@7=}Gsx@4MVX|][e<N--f@BvkG_8,z5*8.G#lPr<Wrl0^0}hEVJef?_gQh-3$G');
|
||||
|
||||
/**#@-*/
|
||||
|
||||
/**
|
||||
* 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 = 'cf_';
|
||||
|
||||
/**
|
||||
* 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', false);
|
||||
|
||||
// If we're behind a proxy server and using HTTPS, we need to alert Wordpress of that fact
|
||||
// see also http://codex.wordpress.org/Administration_Over_SSL#Using_a_Reverse_Proxy
|
||||
if (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] === 'https') {
|
||||
$_SERVER['HTTPS'] = 'on';
|
||||
}
|
||||
|
||||
/* That's all, stop editing! Happy blogging. */
|
||||
|
||||
/** Absolute path to the WordPress directory. */
|
||||
if ( !defined('ABSPATH') )
|
||||
define('ABSPATH', dirname(__FILE__) . '/');
|
||||
|
||||
/** Sets up WordPress vars and included files. */
|
||||
require_once(ABSPATH . 'wp-settings.php');
|
Loading…
x
Reference in New Issue
Block a user