Compare commits

...
29 Commits
Author SHA1 Message Date
3wordchant ebbd41e612 chore: publish 2.7.1+6.4.2 release 2024-01-17 17:40:07 -03:00
p4u1 b45fca4a3f chore: publish 2.7.0+6.4.2 release 2023-12-22 13:36:13 +01:00
p4u1 1a6b11c95b feat: multisite with sufolders (#35)
With this commit multisite now also works with subpaths instead of subdomains.

It also simpified the multisite deployment in generall by adding a new MULTISITE environment variable. Depending on its value WORDPRESS_CONFIG_EXTRA gets set in the entrypoint. And the correct .htaccess gets deployed.

Closes #34

I am still new to coopcloud and welcome feedback on my approach. The second commit is not required for #34 so I can remove it again.

Reviewed-on: https://git.coopcloud.tech/coop-cloud/wordpress/pulls/35
Co-authored-by: p4u1 <p4u1_f4u1@riseup.net>
Co-committed-by: p4u1 <p4u1_f4u1@riseup.net>
2023-12-22 12:35:10 +00:00
p4u1 de5455833e chore: publish 2.6.3+6.4.2 release 2023-12-22 13:26:36 +01:00
Moritz 81dbeca30d fix COMPOSE_FILE env for remote SMTP relay, it requires the mailrelay 2023-12-05 15:29:45 +01:00
3wordchant 245b800439 Merge pull request 'wordpress 6.4.1' (#37) from p4u1/wordpress:6-4-1 into master
Reviewed-on: https://git.coopcloud.tech/coop-cloud/wordpress/pulls/37
2023-12-02 15:31:20 +00:00
p4u1 540d526914 wordpress 6.4.1 and mariadb 11.2 2023-11-27 15:13:58 +01:00
Moritz df32ba5141 chore: publish 2.6.1+6.4.0 release 2023-11-15 16:22:57 +01:00
Moritz 8d8418a6c0 fix disabling update notification settings 2023-11-15 16:21:44 +01:00
3wordchant a8d67b063c Merge pull request 'fix db backup and restore' (#33) from p4u1/wordpress:dix-db-backup-restore into master
Reviewed-on: https://git.coopcloud.tech/coop-cloud/wordpress/pulls/33
2023-11-10 14:02:45 +00:00
3wordchant da0f503960 chore: publish 2.6.0+6.4.0 release 2023-11-09 17:42:13 +00:00
3wordchant 6767d5ee65 Improve composer support 2023-11-09 17:41:26 +00:00
3wordchant d5227cc534 Merge pull request 'update wordpress to 6.4.0' (#36) from p4u1/wordpress:wordpress-6-4 into master
Reviewed-on: https://git.coopcloud.tech/coop-cloud/wordpress/pulls/36
2023-11-09 17:41:02 +00:00
p4u1 45a36ba7b4 update wordpress to 6.4.0 2023-11-08 20:11:58 +01:00
p4u1 ed77855e7d fix db backup and restore 2023-11-06 21:13:53 +01:00
knoflook 1c70a89ed4 chore: publish 2.5.1+6.3.0 release 2023-10-24 16:54:44 +02:00
3wordchant c6be9ecfcf chore: publish 2.5.0+6.3.0 release 2023-10-23 12:51:12 +01:00
3wordchant f2867c8359 Tidy up settings a little 2023-10-23 12:50:45 +01:00
3wordchant 4a7c468806 Add composer support 2023-10-23 12:50:31 +01:00
3wordchant 40d95417e9 Improve SMTP settings 2023-10-23 12:49:47 +01:00
Moritz 37aa0649b9 chore: publish 2.4.3+6.3.0 release 2023-10-20 00:06:09 +02:00
Moritz 5723405e51 fix backup label 2023-10-20 00:05:41 +02:00
3wordchant 650d531ed1 Add CORS_ALLOW_ALL for dev sites 2023-10-17 22:29:23 +01:00
3wordchant 9077d0aa86 chore: publish 2.4.2+6.3.0 release 2023-10-17 13:35:18 +01:00
3wordchant 952044e590 Exciting attempt at public db access 2023-10-17 13:28:42 +01:00
3wordchant 1c03d854b2 chore: publish 2.4.1+6.3.0 release 2023-10-16 13:51:11 +01:00
3wordchant 38bc51f516 Set default for WORDPRESS_TABLE_PREFIX instead of requiring it 2023-10-16 13:50:48 +01:00
3wordchant 40cbb7d689 Set default WORDPRESS_TABLE_PREFIX 2023-10-16 13:45:37 +01:00
Moritz 16ca5734d7 fix core_install 2023-08-24 11:34:01 +02:00
12 changed files with 181 additions and 118 deletions
+25 -14
View File
@@ -3,21 +3,26 @@ TIMEOUT=300
ENABLE_AUTO_UPDATE=true
COMPOSE_FILE="compose.yml"
# Setup Wordpress settings on each deploy:
#POST_DEPLOY_CMDS="app core_install"
DOMAIN=wordpress.example.com
## Domain aliases
#EXTRA_DOMAINS=', `www.wordpress.example.com`'
LETS_ENCRYPT_ENV=production
TITLE="My Example Blog"
LOCALE="en_US" # de_DE
ADMIN_EMAIL=admin@example.com
# Setup Wordpress settings on each deploy:
#POST_DEPLOY_CMDS="app core_install"
# Optional settings, otherwise can be set in the installer
# (Required for `app core_install`
#TITLE="My Example Blog"
#LOCALE="en_US" # de_DE
#ADMIN_EMAIL=admin@example.com
# Every new user is per default subscriber, uncomment to change it
#DEFAULT_USER_ROLE=administrator
# PHP composer for plugin installation
#COMPOSE_FILE="$COMPOSE_FILE:compose.composer.yml"
#WORDPRESS_DEBUG=true
## Additional extensions
@@ -29,13 +34,8 @@ SECRET_DB_PASSWORD_VERSION=v1
# Mostly for compatibility with existing database dumps...
#WORDPRESS_TABLE_PREFIX=wp_
# Multisite
#WORDPRESS_CONFIG_EXTRA="\
# define('WP_CACHE', false);\
# define('WP_ALLOW_MULTISITE', true );"
# Multisite phase 2 (see README)
# WORDPRESS_CONFIG_EXTRA="define('MULTISITE', true); define('SUBDOMAIN_INSTALL', true); define('DOMAIN_CURRENT_SITE', '${DOMAIN}'); define('PATH_CURRENT_SITE', '/'); define('SITE_ID_CURRENT_SITE', 1); define('BLOG_ID_CURRENT_SITE', 1); define('FORCE_SSL_ADMIN', true ); define('COOKIE_DOMAIN', \$_SERVER['HTTP_HOST']);"
# Multisite (see README)
#MULTISITE=enable # either 'enable', 'subdomain' or 'subfolder'
# Local SMTP relay
#COMPOSE_FILE="$COMPOSE_FILE:compose.mailrelay.yml"
@@ -43,16 +43,27 @@ SECRET_DB_PASSWORD_VERSION=v1
#MAIL_FROM="wordpress@example.com"
# Remote SMTP relay
#COMPOSE_FILE="$COMPOSE_FILE:compose.smtp.yml"
#COMPOSE_FILE="$COMPOSE_FILE:compose.mailrelay.yml:compose.smtp.yml"
#SMTP_HOST="mail.example.com"
#MAIL_FROM="wordpress@example.com"
#SMTP_USER="wordpress@example.com" # optional, defaults to MAIL_FROM
#SMTP_OVERRIDE_FROM=on # force "From" to MAIL_FROM, usually necessary
#SMTP_PORT=587
#SMTP_AUTH=on
#SMTP_TLS=on
#SECRET_SMTP_PASSWORD_VERSION=v1
# Authentik SSO
#COMPOSE_FILE="$COMPOSE_FILE:compose.authentik.yml"
#AUTHENTIK_DOMAIN=authentik.example.com
#SECRET_AUTHENTIK_SECRET_VERSION=v1
#SECRET_AUTHENTIK_ID_VERSION=v1
#LOGIN_TYPE='auto'
# Allow remote connections to db
# 🚩🚩 dangerous, use only for development sites!
#COMPOSE_FILE="$COMPOSE_FILE:compose.public-db.yml
# Wide-open CORS
# 🚩🚩 dangerous, use only for development sites!
#CORS_ALLOW_ALL=1
+2 -6
View File
@@ -47,16 +47,12 @@ AUTHENTIK_ID_NAME=authentik_example_com_wordpress_id_v1 # the same as in authen
## Network (Multi-site)
_(Only tested using subdomains)_
1. Set up as above
2. `abra app config <app-name>`, and uncomment the first `# Multisite` section
2. `abra app config <app-name>`, and uncomment `#MULTISITE=enable`
3. `abra app deploy <app-name>`
4. Log into the Wordpress admin dashboard, go to Tools » Network Setup
5. Don't worry about the suggested file changes
6. `abra app config <app-name>` again - comment out the first `# Multisite`
section in `.envrc`, uncomment the `# Multisite phase 2` section, and add
your multisite subdomain(s) to `EXTRA_DOMAINS` (beware the weird syntax..)
6. `abra app config <app-name>` again and set `MULTISITE` to either `subdomain` or `subfolder` depending on your setup.
7. `abra app deploy <app-name>`
## Installing a custom theme
+6 -79
View File
@@ -1,7 +1,8 @@
export PHP_UPLOADS_CONF_VERSION=v3
export ENTRYPOINT_CONF_VERSION=v3
export ENTRYPOINT_CONF_VERSION=v6
export ENTRYPOINT_MAILRELAY_CONF_VERSION=v2
export MSMTP_CONF_VERSION=v3
export MSMTP_CONF_VERSION=v4
export HTACCESS_CONF_VERSION=v2
wp() {
su -p www-data -s /bin/bash -c "/usr/local/bin/wp $@"
@@ -13,20 +14,20 @@ core_install(){
then
ADMIN=akadmin
fi
chown www-data:www-data /var/www/html/wp-content
chown www-data:www-data -R /var/www/html/wp-content
wp "core install --url=$DOMAIN --title=\"$TITLE\" --admin_user=$ADMIN --admin_email=$ADMIN_EMAIL --locale=$LOCALE --skip-email"
wp "language core install $LOCALE"
wp "site switch-language $LOCALE"
wp "rewrite structure '/%year%/%monthnum%/%day%/%postname%/'"
wp "plugin install --activate disable-update-notifications"
wp 'option update dwcun_setting on'
wp "option update disable_notification_setting --format=json '{\"dpun_setting\":false,\"dwtu_setting\":false,\"dwcun_setting\":true}'"
if [ -n "$DEFAULT_USER_ROLE" ]
then
wp "option set default_role $DEFAULT_USER_ROLE"
else
wp "option set default_role subscriber"
fi
wp 'plugin auto-updates enable --all'
wp 'plugin auto-updates enable --all' || exit 0
}
set_authentik(){
@@ -75,77 +76,3 @@ set_authentik(){
fix_mysql() {
echo "ALTER TABLE mysql.column_stats MODIFY histogram longblob; ALTER TABLE mysql.column_stats MODIFY hist_type enum('SINGLE_PREC_HB','DOUBLE_PREC_HB','JSON_HB');" | mysql -u root -p$(cat /run/secrets/db_root_password)
}
sub_wp() {
CONTAINER=$(docker container ls -f "Name=${STACK_NAME}_app" --format '{{ .ID }}')
if [ -z "$CONTAINER" ]; then
error "Can't find a container for ${STACK_NAME}_app"
exit
fi
debug "Using Container ID ${CONTAINER}"
# FIXME 3wc: we're fighting the Wordpress image, which recommends a named
# volume for /var/www/html -- this used to work fine using --volumes-from
# because the actual MySQL password was inserted into the generated
# wp-config.php -- but as of Wordpress 5.7.0, wp-config loads data straight
# from the environment, which requires Docker secrets to work, which only work
# in swarm services (not one-off `docker run` commands). Defining a `cli`
# service in compose.yml almost works, but there's no volumes_from: in Compose
# V3, and without it then the `cli` service can't access Wordpress core.
# See https://git.autonomic.zone/coop-cloud/wordpress/issues/21
warning "Slowly looking up MySQL password..."
silence
abra__service_="app"
DB_PASSWORD="$(sub_app_run cat "/run/secrets/db_password")"
unsilence
# shellcheck disable=SC2154,SC2086
docker run -it \
--volumes-from "$CONTAINER" \
--network "container:$CONTAINER" \
-u xfs:xfs \
-e WORDPRESS_DB_HOST=db \
-e WORDPRESS_DB_USER=wordpress \
-e WORDPRESS_DB_PASSWORD="${DB_PASSWORD}" \
-e WORDPRESS_DB_NAME=wordpress \
-e WORDPRESS_CONFIG_EXTRA="${WORDPRESS_CONFIG_EXTRA}" \
wordpress:cli wp ${abra__args_[*]}
}
abra_backup_app() {
_abra_backup_dir "app:/var/www/html/wp-content"
}
abra_backup_db() {
_abra_backup_mysql "db" "wordpress"
}
abra_backup() {
abra_backup_app && abra_backup_db
}
abra_restore_app() {
# shellcheck disable=SC2034
{
abra__src_="-"
abra__dst_="app:/var/www/html/"
}
zcat "$@" | sub_app_cp
success "Restored 'app'"
}
abra_restore_db() {
# 3wc: unlike abra_backup_db, we can assume abra__service_ will be 'db' if we
# got this far..
# shellcheck disable=SC2034
abra___no_tty="true"
DB_ROOT_PASSWORD=$(sub_app_run cat /run/secrets/db_root_password)
zcat "$@" | sub_app_run mysql -u root -p"$DB_ROOT_PASSWORD" wordpress
success "Restored 'db'"
}
+14
View File
@@ -0,0 +1,14 @@
---
version: "3.8"
services:
app:
volumes:
- "composer:/var/www/html/composer"
environment:
- ENABLE_COMPOSER=1
- COMPOSER=composer/composer.json
- COMPOSER_VENDOR_DIR=composer/vendor
volumes:
composer:
+9
View File
@@ -0,0 +1,9 @@
---
version: "3.8"
services:
db:
ports:
- target: 3306
published: 3306
mode: host
+5 -4
View File
@@ -6,11 +6,12 @@ services:
secrets:
- smtp_password
environment:
- SMTP_HOST=${SMTP_HOST}
- SMTP_HOST
- SMTP_PORT=${SMTP_PORT:-25}
- SMTP_AUTH=${SMTP_AUTH}
- SMTP_TLS=${SMTP_TLS}
- MAIL_FROM=${MAIL_FROM}
- SMTP_AUTH
- SMTP_TLS
- MAIL_FROM
- SMTP_OVERRIDE_FROM
secrets:
smtp_password:
+16 -8
View File
@@ -3,7 +3,7 @@ version: "3.8"
services:
app:
image: "wordpress:6.3.0"
image: "wordpress:6.4.2"
volumes:
- "wordpress_content:/var/www/html/wp-content/"
networks:
@@ -19,8 +19,10 @@ services:
WORDPRESS_DB_USER: wordpress
WORDPRESS_DB_PASSWORD_FILE: /run/secrets/db_password
WORDPRESS_DB_NAME: wordpress
WORDPRESS_TABLE_PREFIX: ${WORDPRESS_TABLE_PREFIX}
WORDPRESS_TABLE_PREFIX: ${WORDPRESS_TABLE_PREFIX:-wp_}
PHP_EXTENSIONS: ${PHP_EXTENSIONS}
CORS_ALLOW_ALL:
COMPOSER:
secrets:
- db_password
configs:
@@ -29,6 +31,8 @@ services:
- source: entrypoint_conf
target: /docker-entrypoint.sh
mode: 0555
- source: htaccess_conf
target: /var/www/html/.htaccess
entrypoint: /docker-entrypoint.sh
depends_on:
- db
@@ -56,10 +60,10 @@ services:
- "coop-cloud.${STACK_NAME}.timeout=${TIMEOUT:-120}"
- "backupbot.backup=true"
- "backupbot.backup.path=/var/www/html"
- "coop-cloud.${STACK_NAME}.version=2.4.0+6.3.0"
- "coop-cloud.${STACK_NAME}.version=2.7.1+6.4.2"
db:
image: "mariadb:11.0"
image: "mariadb:11.2"
volumes:
- "mariadb:/var/lib/mysql"
networks:
@@ -75,11 +79,11 @@ services:
deploy:
labels:
backupbot.backup: "true"
backupbot.backup.path: "/tmp/dump.sql.gz"
backupbot.backup.pre-hook: "sh -c 'mysqldump --single-transaction -u root -p\"$$(cat /run/secrets/db_root_password)\" wordpress | gzip > /tmp/dump.sql.gz'"
backupbot.backup.post-hook: "rm -f /tmp/dump.sql.gz"
backupbot.backup.pre-hook: "sh -c 'mariadb-dump --single-transaction -u root -p\"$$(cat /run/secrets/db_root_password)\" wordpress | gzip > /var/lib/mysql/dump.sql.gz'"
backupbot.backup.path: "/var/lib/mysql/dump.sql.gz"
backupbot.backup.post-hook: "rm -f /var/lib/mysql/dump.sql.gz"
backupbot.restore: "true"
backupbot.restore.post-hook: "sh -c 'mysql -u root -p\"$$(cat /run/secrets/db_root_password)\" wordpress < /tmp/dbdump.sql && rm -f /tmp/dbdump.sql'"
backupbot.restore.post-hook: "sh -c 'gzip -d /var/lib/mysql/dump.sql.gz && mariadb -u root -p\"$$(cat /run/secrets/db_root_password)\" wordpress < /var/lib/mysql/dump.sql && rm -f /var/lib/mysql/dump.sql'"
networks:
backend:
@@ -106,3 +110,7 @@ configs:
php_uploads_conf:
name: ${STACK_NAME}_php_uploads_conf_${PHP_UPLOADS_CONF_VERSION}
file: uploads.ini
htaccess_conf:
name: ${STACK_NAME}_htaccess_conf_${HTACCESS_CONF_VERSION}
file: htaccess.tmpl
template_driver: golang
+35
View File
@@ -7,6 +7,41 @@ docker-php-ext-install {{ env "PHP_EXTENSIONS" }}
curl -z /usr/local/bin/wp -o /usr/local/bin/wp https://raw.githubusercontent.com/wp-cli/builds/gh-pages/phar/wp-cli.phar
chmod +x /usr/local/bin/wp
{{ if eq (env "ENABLE_COMPOSER") "1" }}
mkdir -p /var/www/.composer
chown www-data:www-data /var/www/.composer /var/www/html/composer
curl https://getcomposer.org/installer -o /tmp/composer-setup.php
php -r "if (hash_file('sha384', '/tmp/composer-setup.php') === 'e21205b207c3ff031906575712edab6f13eb0b361f2085f1f1237b7126d785e826a450292b6cfd1d64d92e6563bbde02') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"
php /tmp/composer-setup.php
rm /tmp/composer-setup.php
mv /var/www/html/composer.phar /usr/local/bin/composer
{{ end }}
{{ if eq (env "CORS_ALLOW_ALL") "1" }}
a2enmod headers
sed -ri -e 's/^([ \t]*)(<\/VirtualHost>)/\1\tHeader set Access-Control-Allow-Origin "*"\n\1\2/g' /etc/apache2/sites-available/*.conf
{{ end }}
{{ if eq (env "MULTISITE") "enable" }}
export WORDPRESS_CONFIG_EXTRA="$WORDPRESS_CONFIG_EXTRA
define('WP_CACHE', false);
define('WP_ALLOW_MULTISITE', true );"
{{ end }}
{{ if or (eq (env "MULTISITE") "subdomain") (eq (env "MULTISITE") "subfolder") }}
export WORDPRESS_CONFIG_EXTRA="$WORDPRESS_CONFIG_EXTRA
define('MULTISITE', true);
define('SUBDOMAIN_INSTALL', true);
define('DOMAIN_CURRENT_SITE', '${DOMAIN}');
define('PATH_CURRENT_SITE', '/');
define('SITE_ID_CURRENT_SITE', 1);
define('BLOG_ID_CURRENT_SITE', 1);
define('FORCE_SSL_ADMIN', true );
define('COOKIE_DOMAIN', \$_SERVER['HTTP_HOST']);"
{{ end }}
if [ -n "$@" ]; then
"$@"
fi
+57
View File
@@ -0,0 +1,57 @@
{{ if eq (env "MULTISITE") "" -}}
# BEGIN WordPress
RewriteEngine On
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
# END WordPress
{{- end -}}
{{- if eq (env "MULTISITE") "subfolder" -}}
# BEGIN WordPress Multisite
# Using subfolder network type: https://wordpress.org/documentation/article/htaccess/#multisite
RewriteEngine On
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
RewriteBase /
RewriteRule ^index\.php$ - [L]
# add a trailing slash to /wp-admin
RewriteRule ^([_0-9a-zA-Z-]+/)?wp-admin$ $1wp-admin/ [R=301,L]
RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^ - [L]
RewriteRule ^([_0-9a-zA-Z-]+/)?(wp-(content|admin|includes).*) $2 [L]
RewriteRule ^([_0-9a-zA-Z-]+/)?(.*\.php)$ $2 [L]
RewriteRule . index.php [L]
# END WordPress Multisite
{{- end -}}
{{- if eq (env "MULTISITE") "subdomain" -}}
# BEGIN WordPress Multisite
# Using subdomain network type: https://wordpress.org/documentation/article/htaccess/#multisite
RewriteEngine On
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
RewriteBase /
RewriteRule ^index\.php$ - [L]
# add a trailing slash to /wp-admin
RewriteRule ^wp-admin$ wp-admin/ [R=301,L]
RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^ - [L]
RewriteRule ^(wp-(content|admin|includes).*) $1 [L]
RewriteRule ^(.*\.php)$ $1 [L]
RewriteRule . index.php [L]
# END WordPress Multisite
{{- end }}
+5 -1
View File
@@ -1,9 +1,13 @@
account default
host {{ env "SMTP_HOST" }}
from {{ env "MAIL_FROM" }}
user {{ env "MAIL_FROM" }}
user {{ or (env "SMTP_USER") (env "MAIL_FROM") }}
port {{ env "SMTP_PORT" }}
{{ if eq (env "SMTP_OVERRIDE_FROM") "on" }}
set_from_header on
{{ end }}
{{ if eq (env "SMTP_AUTH") "on" }}
auth {{ env "SMTP_AUTH" }}
passwordeval "cat /run/secrets/smtp_password"
+1
View File
@@ -0,0 +1 @@
The authentik secrets need to be inserted again, as wordpress is not sharing the secret with authentik any more.
+1 -1
View File
@@ -1 +1 @@
The authentik secrets need to be inserted again, as wordpress is not sharing the secret with authentik any more.
Multisite now also works with subpaths instead of subdomains. Also Multisite support was simplified. If you are using a subdomain multisite setup you can remove the `WORDPRESS_CONFIG_EXTRA="define('MULTISITE', true);...` from your config and instead set MULTISITE=subdomain.