ComposePress
ComposePress is a Docker-based toolkit designed to streamline WordPress upgrades using official images. It provides pre-configured Docker Compose files, Dockerfiles, and standardized procedures to make WordPress maintenance more predictable and reliable.
🚀 Project Configuration
Project Name & WordPress Version
Define a unique project name and WordPress version in the .env
file:
COMPOSE_PROJECT_NAME=test
WORDPRESS_VERSION=6-fpm
🛠 Environment Variables
Docker Images
# Web & Database Images
IMAGE_WEB=test_web_staging
IMAGE_DATABASE=mariadb:11.5
Let's Encrypt Configuration
VIRTUAL_HOST=test.test.org
LETSENCRYPT_HOST=test.test.org
LETSENCRYPT_EMAIL=test@test.com
LETSENCRYPT_TEST=true
Database Configuration
WORDPRESS_DB_PASSWORD=wordpress # Used for MYSQL_PASSWORD AND MYSQL_ROOT_PASSWORD
MYSQL_DATABASE=wordpress
MYSQL_USER=wordpress
TABLE_PREFIX=test # optional
Volume Configuration
# External Volumes (Persist Data)
DB_VOLUME=test_db_staging
CONTENT_VOLUME=test_content_staging
# Recreated Volumes (Rebuild On Setup)
HTML_VOLUME=test_html_staging
📂 Configuration Files
Three important configuration files are available in the project directory:
Nginx (after editing, perform a restart):
./default.conf # generate-compose-nginx.sh respects user added changes
./nginx.conf # Manually customizable configuration
Wordress:
./wp-config.php # generated once by generate-compose-nginx.sh and respects user added changes
🚀 Usage
Initialize a Project with a Unique COMPOSE_PROJECT_NAME
; expects one word
Run the following script to generate the required files:
./generate-compose-nginx.sh
🔄 Upgrade Process
🚀 Automated Upgrade (Recommended)
If you want a fully automated upgrade, use the wp-rocket-launch.sh
script:
./wp-rocket-launch.sh
✅ Automatically cleans up existing containers and volumes
✅ Builds the custom WordPress image
✅ Deploys the new version with minimal manual intervention
✅ Copies new installation files to production and correct permissions
✅ Wordpress salt keys are shuffled
Alternatively, follow the manual upgrade process below.
🚀 Manual Upgrade (Expert Mode)
1️⃣ Stop Containers & Clean Up
docker compose down -v
# Optional: Remove external database & content volume (DANGER: Only do this if you have backups)
grep -E 'DB_VOLUME|CONTENT_VOLUME' .env | cut -d '=' -f2 | xargs -I {} sh -c 'docker volume rm {} 2>/dev/null; docker volume create {}'
# Optional: Remove WordPress Image
docker rmi $(grep IMAGE_WEB .env | cut -d '=' -f2)
2️⃣ Update WordPress Version
Modify the version in .env:
WORDPRESS_VERSION=7-fpm
3️⃣ Build & Deploy
# Build custom WordPress image
docker compose -f docker-compose.first.yml build
# Install or upgrade WordPress volume from custom image
docker compose -f docker-compose.first.yml up -d
# Stop WordPress container (but keep HTML volume)
docker compose -f docker-compose.first.yml down
# Start production environment
docker compose up -d
4️⃣ Migrate Content (Themes, Plugins)
# Copy new content to production
cp -a wp-content-new/* wp-content/
# Verify permissions on the wp-content directory
chmod -R [appropriate-permissions] wp-content/
5️⃣ Optional: Database Updates for web address change
./update-db
or
docker compose exec wpcli_${COMPOSE_PROJECT_NAME} wp option update siteurl "https://mynewwebsite.com"
docker compose exec wpcli_${COMPOSE_PROJECT_NAME} wp option update home "https://mynewwebsite.com"
Tricks of the Trade
Cookie issues prevent login? Add to beginning of wp-config.php.
ob_start();
Change to a different template. Perhaps the current one has broken the site?
UPDATE wp_options SET option_value = 'twentytwentyfive' WHERE option_name = 'template';
UPDATE wp_options SET option_value = 'twentytwentyfive' WHERE option_name = 'stylesheet';
or
docker compose exec wpcli_${COMPOSE_PROJECT_NAME} wp theme activate twentytwentyfive
Disable all plugins
UPDATE wp_options SET option_value = '' WHERE option_name = 'active_plugins';
or
docker compose exec wpcli_${COMPOSE_PROJECT_NAME} wp plugin deactivate --all
📌 Requirements
- Docker
🤝 Contributing
For contributions, reach out to @bike .
📜 License
GNU GENERAL PUBLIC LICENSE