Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .env.example
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ SKIP_WP_INIT=false

# Final site URL used by WordPress
# In production this should be: https://<SERVER_NAME>
SITE_URL=http://${SERVER_NAME}:${HTTP_PORT}
SITE_URL=http://${SERVER_NAME}:${HTTP_PORT:-8000}

# Columns to skip during WP-CLI search-replace
# Comma-separated, no spaces (e.g. guid,post_content)
Expand Down
2 changes: 1 addition & 1 deletion Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ db-backup:
@$(COMPOSE_DEV) exec -T db-cli sh /scripts/db-backup/run-db-backup-once.sh

db-restore:
@$(COMPOSE_DEV) exec -T db-cli sh -c "/scripts/db-cli/run-db-restore.sh '$(SQLFILE)'"
@$(COMPOSE_DEV) exec -T db-cli sh -c "/scripts/db-cli/run-db-restore.sh '$(SQL_FILE)'"

# --------------------------------------------------
# Production targets
Expand Down
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -164,7 +164,7 @@ The `Makefile` provides a stable, minimal interface for common operations:

- `make db-backup`: Execute a one-off database backup.

- `make db-restore SQLFILE=x.sql`: Restore a specific dump from the `db/` directory.
- `make db-restore SQL_FILE=x.sql`: Restore a specific dump from the `db/init` directory.

## Architecture & Workflow

Expand Down
33 changes: 18 additions & 15 deletions docker-compose.dev.yml
Original file line number Diff line number Diff line change
@@ -1,3 +1,17 @@
x-mysql-app-env: &mysql-app-env

Check warning on line 1 in docker-compose.dev.yml

View workflow job for this annotation

GitHub Actions / Docker Compose lint

1:1 [document-start] missing document start "---"
MYSQL_HOST: database
MYSQL_PORT: "3306"
MYSQL_DATABASE: ${DATABASE_NAME}
MYSQL_USER: ${DATABASE_USER}
MYSQL_PASSWORD: ${DATABASE_PASSWORD}

x-wordpress-db-env: &wordpress-db-env
WORDPRESS_DB_HOST: database:3306
WORDPRESS_DB_NAME: ${DATABASE_NAME}
WORDPRESS_DB_USER: ${DATABASE_USER}
WORDPRESS_DB_PASSWORD: ${DATABASE_PASSWORD}
WORDPRESS_PATH: /var/www/html

services:
database:
volumes:
Expand All @@ -19,26 +33,20 @@
volumes:
- ./src:/var/www/html/wp-content
- ./scripts:/scripts:ro
entrypoint: ["/scripts/wp-init/entrypoint.sh"]

db-backup:
volumes:
- ./db/backups:/backups
- ./scripts:/scripts:ro
entrypoint: ["/scripts/db-backup/entrypoint.sh"]

wp-cli:
depends_on:
- wordpress
- database
image: wordpress:cli
env_file: .env
image: wordpress:cli-2.10.0
environment:
WORDPRESS_DB_HOST: database:3306
WORDPRESS_DB_NAME: ${DATABASE_NAME}
WORDPRESS_DB_USER: ${DATABASE_USER}
WORDPRESS_DB_PASSWORD: ${DATABASE_PASSWORD}
WORDPRESS_PATH: /var/www/html
<<: *wordpress-db-env
SITE_URL: ${SITE_URL}
volumes:
- ./src:/var/www/html/wp-content
- ./scripts:/scripts:ro
Expand All @@ -51,12 +59,8 @@
depends_on:
- database
image: mysql:8.4.7
env_file: .env
environment:
MYSQL_DATABASE: ${DATABASE_NAME}
MYSQL_USER: ${DATABASE_USER}
MYSQL_PASSWORD: ${DATABASE_PASSWORD}
MYSQL_ROOT_PASSWORD: ${DATABASE_ROOT_PASSWORD}
<<: *mysql-app-env
tmpfs:
- /var/lib/mysql
volumes:
Expand All @@ -72,7 +76,6 @@
- database
image: phpmyadmin:5.2.3
restart: unless-stopped
env_file: .env
environment:
PMA_HOST: database
PMA_PORT: 3306
Expand Down
2 changes: 0 additions & 2 deletions docker-compose.prod.yml
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
x-logging: &default-logging

Check warning on line 1 in docker-compose.prod.yml

View workflow job for this annotation

GitHub Actions / Docker Compose lint

1:1 [document-start] missing document start "---"
logging:
driver: json-file
options:
Expand Down Expand Up @@ -59,7 +59,6 @@
restart: "no"
volumes:
- ./scripts:/scripts:ro
entrypoint: ["/scripts/wp-init/entrypoint.sh"]
deploy:
resources:
limits:
Expand All @@ -72,7 +71,6 @@
volumes:
- ./scripts:/scripts:ro
- db_backups:/backups
entrypoint: ["/scripts/db-backup/entrypoint.sh"]
deploy:
resources:
limits:
Expand Down
54 changes: 29 additions & 25 deletions docker-compose.yml
Original file line number Diff line number Diff line change
@@ -1,12 +1,23 @@
x-mysql-app-env: &mysql-app-env

Check warning on line 1 in docker-compose.yml

View workflow job for this annotation

GitHub Actions / Docker Compose lint

1:1 [document-start] missing document start "---"
MYSQL_HOST: database
MYSQL_PORT: "3306"
MYSQL_DATABASE: ${DATABASE_NAME}
MYSQL_USER: ${DATABASE_USER}
MYSQL_PASSWORD: ${DATABASE_PASSWORD}

x-wordpress-db-env: &wordpress-db-env
WORDPRESS_DB_HOST: database:3306
WORDPRESS_DB_NAME: ${DATABASE_NAME}
WORDPRESS_DB_USER: ${DATABASE_USER}
WORDPRESS_DB_PASSWORD: ${DATABASE_PASSWORD}
WORDPRESS_PATH: /var/www/html

services:
database:
image: mysql:8.4.7
restart: unless-stopped
env_file: .env
environment:
MYSQL_DATABASE: ${DATABASE_NAME}
MYSQL_USER: ${DATABASE_USER}
MYSQL_PASSWORD: ${DATABASE_PASSWORD}
<<: *mysql-app-env
MYSQL_ROOT_PASSWORD: ${DATABASE_ROOT_PASSWORD}
healthcheck:
test:
Expand All @@ -24,12 +35,8 @@
- database
image: wordpress:6.9.0-fpm-alpine
restart: unless-stopped
env_file: .env
environment:
WORDPRESS_DB_HOST: database:3306
WORDPRESS_DB_NAME: ${DATABASE_NAME}
WORDPRESS_DB_USER: ${DATABASE_USER}
WORDPRESS_DB_PASSWORD: ${DATABASE_PASSWORD}
<<: *wordpress-db-env
volumes:
- wordpress:/var/www/html
networks:
Expand All @@ -40,9 +47,8 @@
- wordpress
image: nginx:1.29.2-alpine
restart: unless-stopped
env_file: .env
environment:
- SERVER_NAME=${SERVER_NAME}
SERVER_NAME: ${SERVER_NAME}
volumes:
- wordpress:/var/www/html
networks:
Expand All @@ -52,33 +58,31 @@
depends_on:
- wordpress
- database
image: wordpress:cli
env_file: .env
image: wordpress:cli-2.10.0
environment:
WORDPRESS_DB_HOST: database:3306
WORDPRESS_DB_NAME: ${DATABASE_NAME}
WORDPRESS_DB_USER: ${DATABASE_USER}
WORDPRESS_DB_PASSWORD: ${DATABASE_PASSWORD}
WORDPRESS_PATH: /var/www/html
<<: *wordpress-db-env
SITE_URL: ${SITE_URL}
SKIP_COLUMNS: ${SKIP_COLUMNS}
SKIP_WP_INIT: ${SKIP_WP_INIT}
volumes:
- wordpress:/var/www/html
entrypoint: ["/scripts/wp-init/entrypoint.sh"]
networks:
- internal

db-backup:
depends_on:
- database
image: mysql:8.4.7
env_file: .env
environment:
MYSQL_DATABASE: ${DATABASE_NAME}
MYSQL_USER: ${DATABASE_USER}
MYSQL_PASSWORD: ${DATABASE_PASSWORD}
DB_BACKUP_MAX_FILES: ${DATABASE_BACKUP_MAX_FILES:-3}
DB_BACKUP_INITIAL_DELAY: ${DATABASE_BACKUP_INITIAL_DELAY:-60}
DB_BACKUP_INTERVAL: ${DATABASE_BACKUP_INTERVAL:-3600}
<<: *mysql-app-env
DB_BACKUP_INITIAL_DELAY: ${DATABASE_BACKUP_INITIAL_DELAY}
DB_BACKUP_INTERVAL: ${DATABASE_BACKUP_INTERVAL}
DB_BACKUP_MAX_FILES: ${DATABASE_BACKUP_MAX_FILES}
SKIP_DB_BACKUP: ${SKIP_DB_BACKUP}
tmpfs:
- /var/lib/mysql
entrypoint: ["/scripts/db-backup/entrypoint.sh"]
networks:
- internal

Expand Down
4 changes: 3 additions & 1 deletion scripts/db-backup/entrypoint.sh
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
#!/bin/sh
set -e

if [ "${SKIP_DB_BACKUP}" = "true" ]; then
SKIP_DB_BACKUP="${SKIP_DB_BACKUP:-false}"

if [ "$SKIP_DB_BACKUP" = "true" ]; then
echo "DB backup skipped"
exit 0
fi
Expand Down
7 changes: 5 additions & 2 deletions scripts/db-backup/run-db-backup-once.sh
Original file line number Diff line number Diff line change
Expand Up @@ -4,11 +4,14 @@ set -e
. /scripts/db-common/create-db-client-config.sh
. /scripts/db-backup/lib/backup.sh

DB_NAME="${MYSQL_DATABASE}"
DB_HOST="${MYSQL_HOST:-database}"
DB_PORT="${MYSQL_PORT:-3306}"
DB_NAME="${MYSQL_DATABASE:-wordpress}"

BACKUP_DIR="/backups"

echo "Creating DB client config"
create_db_client_config "${MYSQL_HOST:-}" "${MYSQL_PORT:-}" "${MYSQL_USER}" "${MYSQL_PASSWORD}"
create_db_client_config "$DB_HOST" "$DB_PORT" "${MYSQL_USER}" "${MYSQL_PASSWORD}"

echo "Running one-shot backup..."
do_backup "$DB_NAME" "$BACKUP_DIR"
Expand Down
17 changes: 11 additions & 6 deletions scripts/db-backup/run-db-backup-periodic.sh
Original file line number Diff line number Diff line change
Expand Up @@ -6,15 +6,20 @@ set -e
. /scripts/db-backup/lib/backup.sh
. /scripts/db-backup/lib/rotation.sh

DB_NAME="${MYSQL_DATABASE}"
BACKUP_DIR="/backups"
BACKUP_MAX_FILES="${DB_BACKUP_MAX_FILES}"
DB_HOST="${MYSQL_HOST:-database}"
DB_PORT="${MYSQL_PORT:-3306}"
DB_NAME="${MYSQL_DATABASE:-wordpress}"

BACKUP_INITIAL_DELAY="${DB_BACKUP_INITIAL_DELAY:-60s}"
BACKUP_INTERVAL="${DB_BACKUP_INTERVAL:-3600s}"
BACKUP_MAX_FILES="${DB_BACKUP_MAX_FILES:-3}"

BACKUP_INITIAL_DELAY_SEC=$(parse_interval "${DB_BACKUP_INITIAL_DELAY}")
BACKUP_INTERVAL_SEC=$(parse_interval "${DB_BACKUP_INTERVAL}")
BACKUP_DIR="/backups"
BACKUP_INITIAL_DELAY_SEC=$(parse_interval "$BACKUP_INITIAL_DELAY")
BACKUP_INTERVAL_SEC=$(parse_interval "$BACKUP_INTERVAL")

echo "Creating DB client config"
create_db_client_config "${MYSQL_HOST:-}" "${MYSQL_PORT:-}" "${MYSQL_USER}" "${MYSQL_PASSWORD}"
create_db_client_config "$DB_HOST" "$DB_PORT" "${MYSQL_USER}" "${MYSQL_PASSWORD}"

echo "Initial delay: $(format_interval "$BACKUP_INITIAL_DELAY_SEC")"
sleep "$BACKUP_INITIAL_DELAY_SEC"
Expand Down
10 changes: 8 additions & 2 deletions scripts/db-cli/run-db-restore.sh
Original file line number Diff line number Diff line change
@@ -1,9 +1,10 @@
#!/bin/sh
set -e

. /scripts/utils/check-required-vars.sh
. /scripts/db-common/create-db-client-config.sh

FILE="$1"
FILE="$(basename "$1")"

if [ -z "$FILE" ]; then
echo "Error: no SQL file provided" >&2
Expand All @@ -18,8 +19,13 @@ if [ ! -f "$SQL_PATH" ]; then
exit 1
fi

check_required_vars "MYSQL_DATABASE MYSQL_USER MYSQL_PASSWORD"

DB_HOST="${MYSQL_HOST:-database}"
DB_PORT="${MYSQL_PORT:-3306}"

echo "Creating DB client config"
create_db_client_config "${MYSQL_HOST:-}" "${MYSQL_PORT:-}" "${MYSQL_USER}" "${MYSQL_PASSWORD}"
create_db_client_config "$DB_HOST" "$DB_PORT" "${MYSQL_USER}" "${MYSQL_PASSWORD}"

echo "Restoring $FILE into database $MYSQL_DATABASE..."
mysql "$MYSQL_DATABASE" < "$SQL_PATH"
Expand Down
2 changes: 2 additions & 0 deletions scripts/wp-init/entrypoint.sh
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
#!/bin/sh
set -e

SKIP_WP_INIT="${SKIP_WP_INIT:-false}"

if [ "${SKIP_WP_INIT}" = "true" ]; then
echo "WP initialization skipped"
exit 0
Expand Down
6 changes: 6 additions & 0 deletions scripts/wp-init/site-url/get-current-site-url.sh
Original file line number Diff line number Diff line change
@@ -1,11 +1,17 @@
#!/bin/sh
set -e

. /scripts/utils/check-required-vars.sh
. /scripts/wp-cli/check-wp-path.sh
. /scripts/wp-cli/check-wp-cli.sh
. /scripts/wp-cli/check-wp-installed.sh
. /scripts/db-common/wait-for-db.sh

REQUIRED_VARS="WORDPRESS_DB_HOST WORDPRESS_DB_NAME WORDPRESS_DB_USER WORDPRESS_DB_PASSWORD \
WORDPRESS_PATH"

check_required_vars "$REQUIRED_VARS"

check_wp_path
check_wp_cli

Expand Down
9 changes: 6 additions & 3 deletions scripts/wp-init/site-url/update-site-url.sh
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,10 @@ set -e
. /scripts/wp-cli/check-wp-installed.sh
. /scripts/db-common/wait-for-db.sh

check_required_vars "CURRENT_SITE_URL SITE_URL"
REQUIRED_VARS="WORDPRESS_DB_HOST WORDPRESS_DB_NAME WORDPRESS_DB_USER WORDPRESS_DB_PASSWORD WORDPRESS_PATH \
CURRENT_SITE_URL SITE_URL"

check_required_vars "$REQUIRED_VARS"

check_wp_path
check_wp_cli
Expand All @@ -16,7 +19,7 @@ check_wp_cli
wait_for_db
check_wp_installed || exit 0

echo "Starting site URL update: ${CURRENT_SITE_URL} ${SITE_URL}"
echo "Starting site URL update: ${CURRENT_SITE_URL} -> ${SITE_URL}"

SKIP_COLUMNS_FLAG=""
if [ -n "$SKIP_COLUMNS" ]; then
Expand All @@ -29,7 +32,7 @@ fi

# shellcheck disable=SC2086
if wp search-replace "$CURRENT_SITE_URL" "$SITE_URL" \
$SKIP_COLUMNS_FLAG \
${SKIP_COLUMNS_FLAG} \
--all-tables \
--precise \
--allow-root; then
Expand Down