Compare commits

..

83 Commits

Author SHA1 Message Date
cf54575187 restricts ownership changes to files still owned by root (e.g., from the image build). On subsequent restarts, files already owned by www-data are skipped entirely, avoiding a full recursive write cycle. 2026-06-02 16:24:48 +01:00
b4db12f09c Added ignores for .env, *.log, .DS_Store, Thumbs.db, and common editor/IDE files 2026-06-02 16:23:11 +01:00
e4b87c8ab9 chown entire wp-content to ensure correct permissions 2026-06-02 16:11:39 +01:00
7e170adbb4 Merge pull request 'Added xtra chown to ensure correct perms on every container start' (#57) from kawaiipunk/wordpress:main into main
Reviewed-on: coop-cloud/wordpress#57
2026-05-26 17:10:01 +00:00
66e0687456 Removed redundant chown 2026-05-26 17:05:24 +01:00
9209f007cb revert 69cf451b98
revert Merge pull request 'chore(deps): update wordpress docker tag to v7' (#55) from renovate/wordpress-7.x into main

Reviewed-on: coop-cloud/wordpress#55

Sorry this was done by mistake!
2026-05-26 14:08:49 +00:00
69cf451b98 Merge pull request 'chore(deps): update wordpress docker tag to v7' (#55) from renovate/wordpress-7.x into main
Reviewed-on: coop-cloud/wordpress#55
2026-05-26 13:59:35 +00:00
73a2e98d2e Added xtra chown to ensure correct perms on every container start 2026-05-26 14:10:22 +01:00
0e229168fc chore(deps): update wordpress docker tag to v7 2026-05-22 00:34:30 +00:00
332ab0b97d chore: publish 2.19.2+6.9.4 release 2026-04-28 02:25:26 +02:00
3b598e82dd harden htaccess 2026-04-28 01:57:52 +02:00
8e81f3f81c selfmanaged wordpress 2026-04-28 01:54:50 +02:00
a09bd166ad chore: publish 2.19.1+6.9.4 release 2026-03-17 17:11:56 +01:00
b4c5d04382 chore: replace depricated traefik.docker.* with traefik.swarm.* 2026-03-17 17:11:07 +01:00
3c013d39fd chore: publish 2.19.0+6.9.4 release 2026-03-17 16:11:37 +01:00
285bc01bef Merge pull request 'chore(config): migrate Renovate config' (#52) from renovate/migrate-config into main
Reviewed-on: coop-cloud/wordpress#52
2026-03-10 19:34:45 +00:00
2ca12bff9c chore(config): migrate config renovate.json 2026-03-10 19:33:29 +00:00
da2e62b618 chore: publish 2.18.0+6.9.1 release 2026-03-07 09:39:38 +01:00
364b5c8b8a chore: update image tags 2026-03-07 09:39:16 +01:00
306b348961 chore: publish 2.17.1+6.9.0 release 2026-02-16 10:58:29 +01:00
3c1121b7ce remove default TIMEOUT (abra #596) 2025-12-30 14:02:39 +01:00
3wc
b0eb1756a3 chore: publish 2.17.0+6.9.0 release 2025-12-07 17:27:49 -05:00
97b9b99e93 chore: publish 2.16.2+6.8.3 release 2025-10-15 11:30:23 -04:00
cf2a5077c9 chore: publish 2.16.1+6.8.1 release 2025-07-01 19:16:41 +02:00
74282d5658 chore: publish 2.16.0+6.8.1 release 2025-05-27 17:17:23 +02:00
ab7716bf1e chore: publish 2.15.0+6.8.0 release 2025-04-23 09:39:59 -07:00
3wc
b0cc5a49a1 chore: publish 2.14.0+6.7.2 release 2025-02-19 12:38:06 -05:00
3cca5d2cf3 Update .drone.yml 2025-01-08 10:09:13 -08:00
f403648cf6 chore: publish 2.13.3+6.7.1 release 2024-12-17 16:42:36 +01:00
83f724a316 add all possible ftp port compose files to .env 2024-12-17 16:40:40 +01:00
e6b9f8117f chore: publish 2.13.2+6.7.1 release 2024-12-17 15:29:21 +01:00
e7aef38d3b remove 2222 default port binding to avoid port conflicts 2024-12-17 15:28:47 +01:00
e08838561d chore: publish 2.13.1+6.7.1 release 2024-12-17 15:21:10 +01:00
04d26a59a9 add possiblitliy to use other sftp ports per compose overwrite 2024-12-17 15:16:42 +01:00
591019112e chore: publish 2.13.0+6.7.1 release 2024-12-10 19:23:34 +01:00
76e9b80fbd fix uploads.ini templating 2024-12-10 19:23:34 +01:00
f49fa05ded add some more wordpress options for file uploads (#44)
Co-authored-by: Steven Sting
Reviewed-on: coop-cloud/wordpress#44
Reviewed-by: decentral1se <decentral1se@noreply.git.coopcloud.tech>
2024-12-09 14:59:57 +00:00
716e6df3cd move USERS_CONF_VERSION env to abra.sh 2024-11-11 22:51:58 +01:00
457c2defaf update backupbot label 2024-10-24 15:26:10 +02:00
37ff3e9b1b chore: publish 2.12.2+6.6.2 release 2024-10-09 16:58:22 +02:00
c5443cc14b chore: publish 2.12.1+6.6.1 release 2024-08-26 18:21:25 +01:00
34f70889e3 chore: publish 2.12.0+6.6.1 release 2024-08-14 12:02:42 +02:00
af04e30e36 add show_plugins command 2024-08-14 12:02:33 +02:00
17574fd3fe chore: publish 2.11.0+6.6.0 release 2024-07-19 18:45:32 +02:00
8b6983d240 alaconnect: replace 'execute' with 'initial-hooks' 2024-07-15 13:57:23 +02:00
6fb30c5bc1 chore: publish 2.10.0+6.5.5 release 2024-07-06 20:25:45 +02:00
929bfb4239 add redirects 2024-07-06 20:21:05 +02:00
7e4ff5c075 add alakazam integration file alaconnect.yml 2024-05-13 17:34:43 +02:00
3wc
564db5b63f chore: publish 2.9.1+6.5.3 release 2024-05-11 12:18:46 -03:00
cf9b5f529e chore: publish 2.9.0+6.5.2 release 2024-04-15 16:50:18 +02:00
3wc
240b70a967 chore: publish 2.8.0+6.5.0 release 2024-04-07 12:43:44 -03:00
3wc
7f6b6a5ff2 Update metadata 2024-03-30 16:19:49 -03:00
4d99aae234 Updated .drone.yml to use main branch 2024-03-28 14:17:57 +00:00
959484f5e5 Added HTACCESS_CONF_VERSION to drone config 2024-03-28 14:15:37 +00:00
7ef8e5515d chore: publish 2.7.3+6.4.3 release 2024-03-25 12:26:53 +00:00
770ef4932a Add FTP Access 2024-01-29 20:41:59 +01:00
3wc
dcb8a9a3a9 chore: publish 2.7.2+6.4.2 release 2024-01-17 17:47:32 -03:00
3wc
f3a9fad0a1 Bump ENTRYPOINT_CONF_VERSION 2024-01-17 17:46:22 -03:00
3wc
ebbd41e612 chore: publish 2.7.1+6.4.2 release 2024-01-17 17:40:07 -03:00
b45fca4a3f chore: publish 2.7.0+6.4.2 release 2023-12-22 13:36:13 +01:00
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: coop-cloud/wordpress#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
de5455833e chore: publish 2.6.3+6.4.2 release 2023-12-22 13:26:36 +01:00
81dbeca30d fix COMPOSE_FILE env for remote SMTP relay, it requires the mailrelay 2023-12-05 15:29:45 +01:00
245b800439 Merge pull request 'wordpress 6.4.1' (#37) from p4u1/wordpress:6-4-1 into master
Reviewed-on: coop-cloud/wordpress#37
2023-12-02 15:31:20 +00:00
540d526914 wordpress 6.4.1 and mariadb 11.2 2023-11-27 15:13:58 +01:00
df32ba5141 chore: publish 2.6.1+6.4.0 release 2023-11-15 16:22:57 +01:00
8d8418a6c0 fix disabling update notification settings 2023-11-15 16:21:44 +01:00
a8d67b063c Merge pull request 'fix db backup and restore' (#33) from p4u1/wordpress:dix-db-backup-restore into master
Reviewed-on: coop-cloud/wordpress#33
2023-11-10 14:02:45 +00:00
3wc
da0f503960 chore: publish 2.6.0+6.4.0 release 2023-11-09 17:42:13 +00:00
3wc
6767d5ee65 Improve composer support 2023-11-09 17:41:26 +00:00
d5227cc534 Merge pull request 'update wordpress to 6.4.0' (#36) from p4u1/wordpress:wordpress-6-4 into master
Reviewed-on: coop-cloud/wordpress#36
2023-11-09 17:41:02 +00:00
45a36ba7b4 update wordpress to 6.4.0 2023-11-08 20:11:58 +01:00
ed77855e7d fix db backup and restore 2023-11-06 21:13:53 +01:00
1c70a89ed4 chore: publish 2.5.1+6.3.0 release 2023-10-24 16:54:44 +02:00
3wc
c6be9ecfcf chore: publish 2.5.0+6.3.0 release 2023-10-23 12:51:12 +01:00
3wc
f2867c8359 Tidy up settings a little 2023-10-23 12:50:45 +01:00
3wc
4a7c468806 Add composer support 2023-10-23 12:50:31 +01:00
3wc
40d95417e9 Improve SMTP settings 2023-10-23 12:49:47 +01:00
37aa0649b9 chore: publish 2.4.3+6.3.0 release 2023-10-20 00:06:09 +02:00
5723405e51 fix backup label 2023-10-20 00:05:41 +02:00
3wc
650d531ed1 Add CORS_ALLOW_ALL for dev sites 2023-10-17 22:29:23 +01:00
3wc
9077d0aa86 chore: publish 2.4.2+6.3.0 release 2023-10-17 13:35:18 +01:00
3wc
952044e590 Exciting attempt at public db access 2023-10-17 13:28:42 +01:00
31 changed files with 417 additions and 129 deletions

View File

@ -21,9 +21,10 @@ steps:
SECRET_DB_ROOT_PASSWORD_VERSION: v1
PHP_UPLOADS_CONF_VERSION: v1
ENTRYPOINT_CONF_VERSION: v1
HTACCESS_CONF_VERSION: v1
trigger:
branch:
- master
- main
---
kind: pipeline
name: generate recipe catalogue
@ -36,7 +37,7 @@ steps:
from_secret: drone_abra-bot_token
fork: true
repositories:
- coop-cloud/auto-recipes-catalogue-json
- toolshed/auto-recipes-catalogue-json
trigger:
event: tag

View File

@ -1,23 +1,36 @@
TYPE=wordpress
TIMEOUT=300
#TIMEOUT=300
ENABLE_AUTO_UPDATE=true
COMPOSE_FILE="compose.yml"
# Setup Wordpress settings on each deploy:
#POST_DEPLOY_CMDS="app core_install"
ENABLE_BACKUPS=true
DOMAIN=wordpress.example.com
## Domain aliases
#EXTRA_DOMAINS=', `www.wordpress.example.com`'
# Redirects
# All redirect domains have to be added to EXTRA_DOMAINS as well)
# multiple redirects can be added by seperating them with a | character
#REDIRECTS=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"
# Self managed Wordpress for automatic updates
#COMPOSE_FILE="$COMPOSE_FILE:compose.selfmanaged.yml"
#WORDPRESS_DEBUG=true
## Additional extensions
@ -29,13 +42,12 @@ 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 (see README)
#MULTISITE=enable # either 'enable', 'subdomain' or 'subfolder'
# 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']);"
# File upload settings
#UPLOAD_MAX_SIZE=256M
#UPLOAD_MAX_TIME=30
# Local SMTP relay
#COMPOSE_FILE="$COMPOSE_FILE:compose.mailrelay.yml"
@ -43,16 +55,42 @@ 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
# 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'
# 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'
# Matrix .well-known redirect
#COMPOSE_FILE="$COMPOSE_FILE:compose.matrix.yml"
#MATRIX_DOMAIN=matrix.example.com
# 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
# FTP
#COMPOSE_FILE="$COMPOSE_FILE:compose.ftp.yml"
#SECRET_FTP_PASS_VERSION=v1
# You can use a Port between 2220-2225
#COMPOSE_FILE="$COMPOSE_FILE:compose.ftp-2220.yml"
#COMPOSE_FILE="$COMPOSE_FILE:compose.ftp-2221.yml"
#COMPOSE_FILE="$COMPOSE_FILE:compose.ftp-2222.yml"
#COMPOSE_FILE="$COMPOSE_FILE:compose.ftp-2223.yml"
#COMPOSE_FILE="$COMPOSE_FILE:compose.ftp-2224.yml"
#COMPOSE_FILE="$COMPOSE_FILE:compose.ftp-2225.yml"

21
.gitignore vendored
View File

@ -1 +1,22 @@
# direnv
/.envrc
# Environment files (may contain secrets)
.env
# Logs
*.log
# OS metadata
.DS_Store
Thumbs.db
# Editor/IDE
*.swp
*.swo
*~
*.bak
.idea/
.vscode/
.project
.classpath

View File

@ -7,7 +7,7 @@ Coöp Cloud + [Wordpress](https://wordpress.org) = 🥳
<!-- metadata -->
* **Category**: Apps
* **Status**: 3, stable
* **Status**: 4
* **Image**: [`wordpress`](https://hub.docker.com/_/wordpress), 4, upstream
* **Healthcheck**: Yes
* **Backups**: Yes
@ -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

114
abra.sh
View File

@ -1,12 +1,25 @@
export PHP_UPLOADS_CONF_VERSION=v3
export ENTRYPOINT_CONF_VERSION=v3
export PHP_UPLOADS_CONF_VERSION=v4
export ENTRYPOINT_CONF_VERSION=v8
export ENTRYPOINT_MAILRELAY_CONF_VERSION=v2
export MSMTP_CONF_VERSION=v3
export MSMTP_CONF_VERSION=v4
export HTACCESS_CONF_VERSION=v3
export USERS_CONF_VERSION=v1
wp() {
su -p www-data -s /bin/bash -c "/usr/local/bin/wp $@"
}
update() {
wp "core update-db"
wp "plugin update --all"
wp "plugin auto-updates enable --all"
wp "theme update --all"
wp "theme auto-updates enable --all"
wp "language core update"
wp "language plugin update --all"
wp "language theme update --all"
}
core_install(){
ADMIN=admin
if [ -n "$AUTHENTIK_DOMAIN" ]
@ -18,15 +31,27 @@ core_install(){
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'
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' || exit 0
wp "theme auto-updates enable --all"
wp 'plugin auto-updates enable --all' || true
}
enable_auto_updates(){
wp "plugin deactivate disable-update-notifications --allow-root"
wp "plugin uninstall disable-update-notifications --allow-root"
wp "option delete disable_notification_setting --allow-root"
wp "plugin auto-updates enable --all --allow-root"
wp "theme auto-updates enable --all --allow-root"
}
disable_auto_updates(){
wp "plugin install --activate disable-update-notifications"
wp "option update disable_notification_setting --format=json '{\"dpun_setting\":false,\"dwtu_setting\":false,\"dwcun_setting\":true}'"
}
set_authentik(){
@ -38,6 +63,7 @@ set_authentik(){
fi
wp "user create akadmin admin@example.com --role=administrator"
wp "plugin install --activate daggerhart-openid-connect-generic"
wp 'plugin auto-updates enable daggerhart-openid-connect-generic'
wp "option update --format=json openid_connect_generic_settings '
{
\"login_type\":\"$LOGIN_TYPE\",
@ -48,6 +74,8 @@ set_authentik(){
\"endpoint_userinfo\":\"https://$AUTHENTIK_DOMAIN/application/o/userinfo/\",
\"endpoint_token\":\"https://$AUTHENTIK_DOMAIN/application/o/token/\",
\"endpoint_end_session\":\"https://$AUTHENTIK_DOMAIN/application/o/wordpress/end-session/\",
\"endpoint_jwks\":\"https://$AUTHENTIK_DOMAIN/application/o/wordpress/jwks/\",
\"issuer\":\"https://$AUTHENTIK_DOMAIN/application/o/wordpress/\",
\"acr_values\":\"\",
\"identity_key\":\"preferred_username\",
\"no_sslverify\":\"0\",
@ -76,76 +104,6 @@ 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'"
show_plugins() {
wp "plugin list --fields=name,status,wporg_status,version,update_version,auto_update,tested_up_to,wporg_last_updated"
}

16
alaconnect.yml Normal file
View File

@ -0,0 +1,16 @@
authentik:
uncomment:
- compose.authentik.yml
- AUTHENTIK_DOMAIN
- SECRET_AUTHENTIK_SECRET_VERSION
- SECRET_AUTHENTIK_ID_VERSION
- LOGIN_TYPE
inital-hooks:
- app set_authentik
shared_secrets:
wordpress_secret: authentik_secret
wordpress_id: authentik_id
matrix:
uncomment:
- compose.matrix.yml
- MATRIX_DOMAIN

14
compose.composer.yml Normal file
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:

7
compose.ftp-2220.yml Normal file
View File

@ -0,0 +1,7 @@
---
version: "3.8"
services:
ftp:
ports:
- 2220:22

7
compose.ftp-2221.yml Normal file
View File

@ -0,0 +1,7 @@
---
version: "3.8"
services:
ftp:
ports:
- 2221:22

7
compose.ftp-2222.yml Normal file
View File

@ -0,0 +1,7 @@
---
version: "3.8"
services:
ftp:
ports:
- 2222:22

7
compose.ftp-2223.yml Normal file
View File

@ -0,0 +1,7 @@
---
version: "3.8"
services:
ftp:
ports:
- 2223:22

7
compose.ftp-2224.yml Normal file
View File

@ -0,0 +1,7 @@
---
version: "3.8"
services:
ftp:
ports:
- 2224:22

7
compose.ftp-2225.yml Normal file
View File

@ -0,0 +1,7 @@
---
version: "3.8"
services:
ftp:
ports:
- 2220:22

24
compose.ftp.yml Normal file
View File

@ -0,0 +1,24 @@
---
version: "3.8"
services:
ftp:
image: atmoz/sftp:alpine
secrets:
- ftp_pass
volumes:
- "wordpress_content:/home/ftp_user/wp-content"
configs:
- source: users_conf
target: /etc/sftp/users.conf
secrets:
ftp_pass:
name: ${STACK_NAME}_ftp_pass_${SECRET_FTP_PASS_VERSION}
external: true
configs:
users_conf:
name: ${STACK_NAME}_users_conf_${USERS_CONF_VERSION}
file: users.conf.tmpl
template_driver: golang

10
compose.matrix.yml Normal file
View File

@ -0,0 +1,10 @@
---
version: "3.8"
services:
app:
deploy:
labels:
- "traefik.http.routers.${STACK_NAME}.middlewares=${STACK_NAME}-redirect-matrix-well-known"
- "traefik.http.middlewares.${STACK_NAME}-redirect-matrix-well-known.redirectregex.regex=^https://(.*)/.well-known/matrix/(.*)"
- "traefik.http.middlewares.${STACK_NAME}-redirect-matrix-well-known.redirectregex.replacement=https://${MATRIX_DOMAIN}/.well-known/matrix/$$2"

9
compose.public-db.yml Normal file
View File

@ -0,0 +1,9 @@
---
version: "3.8"
services:
db:
ports:
- target: 3306
published: 3306
mode: host

21
compose.selfmanaged.yml Normal file
View File

@ -0,0 +1,21 @@
---
version: "3.8"
services:
app:
image: "wordpress:latest"
volumes:
- "wordpress:/var/www/html/"
environment:
WORDPRESS_CONFIG_EXTRA: |
define( 'AUTOMATIC_UPDATER_DISABLED', false );
define( 'WP_AUTO_UPDATE_CORE', true );
define( 'FS_METHOD', 'direct' );
${WORDPRESS_CONFIG_EXTRA}
ftp:
volumes:
- "wordpress:/home/ftp_user/"
volumes:
wordpress:

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:

View File

@ -3,7 +3,7 @@ version: "3.8"
services:
app:
image: "wordpress:6.3.0"
image: "wordpress:6.9.4"
volumes:
- "wordpress_content:/var/www/html/wp-content/"
networks:
@ -21,6 +21,8 @@ services:
WORDPRESS_DB_NAME: wordpress
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
@ -44,7 +48,7 @@ services:
order: start-first
labels:
- "traefik.enable=true"
- "traefik.docker.network=proxy"
- "traefik.swarm.network=proxy"
- "traefik.http.routers.${STACK_NAME}.tls=true"
- "traefik.http.services.${STACK_NAME}.loadbalancer.server.port=80"
- "traefik.http.routers.${STACK_NAME}.rule=Host(`${DOMAIN}`${EXTRA_DOMAINS})"
@ -53,13 +57,15 @@ services:
#- "traefik.http.routers.${STACK_NAME}.rule=HostRegexp(`{subdomain:.+}.${DOMAIN}`, `${DOMAIN}`)"
- "traefik.http.routers.${STACK_NAME}.tls.certresolver=${LETS_ENCRYPT_ENV}"
- "traefik.http.routers.${STACK_NAME}.entrypoints=web-secure"
- "coop-cloud.${STACK_NAME}.timeout=${TIMEOUT:-120}"
- "backupbot.backup=true"
- "backupbot.backup.path=/var/www/html"
- "coop-cloud.${STACK_NAME}.version=2.4.1+6.3.0"
- "traefik.http.routers.${STACK_NAME}.middlewares=${STACK_NAME}-redirect"
- "traefik.http.middlewares.${STACK_NAME}-redirect.redirectregex.regex=^https://(${REDIRECTS})/(.*)"
- "traefik.http.middlewares.${STACK_NAME}-redirect.redirectregex.replacement=https://${DOMAIN}/$${2}"
- "traefik.http.middlewares.${STACK_NAME}-redirect.redirectregex.permanent=true"
- "coop-cloud.${STACK_NAME}.timeout=${TIMEOUT}"
- "coop-cloud.${STACK_NAME}.version=2.19.2+6.9.4"
db:
image: "mariadb:11.0"
image: "mariadb:12.2"
volumes:
- "mariadb:/var/lib/mysql"
networks:
@ -74,12 +80,10 @@ services:
- db_root_password
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.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.backup: "${ENABLE_BACKUPS:-true}"
backupbot.backup.pre-hook: "mariadb-dump --single-transaction -u root -p\"$$(cat /run/secrets/db_root_password)\" wordpress | gzip > /var/lib/mysql/dump.sql.gz"
backupbot.backup.volumes.mariadb.path: "dump.sql.gz"
backupbot.restore.post-hook: "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:
@ -105,4 +109,9 @@ configs:
template_driver: golang
php_uploads_conf:
name: ${STACK_NAME}_php_uploads_conf_${PHP_UPLOADS_CONF_VERSION}
file: uploads.ini
file: uploads.ini.tmpl
template_driver: golang
htaccess_conf:
name: ${STACK_NAME}_htaccess_conf_${HTACCESS_CONF_VERSION}
file: htaccess.tmpl
template_driver: golang

View File

@ -7,6 +7,55 @@ 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 }}
UPLOADS_HTACCESS=/var/www/html/wp-content/uploads/.htaccess
if [ ! -f "$UPLOADS_HTACCESS" ]; then
mkdir -p /var/www/html/wp-content/uploads
cat > "$UPLOADS_HTACCESS" <<'EOF'
# Prevent PHP execution in uploads directory
<FilesMatch "\.(?i:php|phtml|phar)$">
Require all denied
</FilesMatch>
EOF
fi
chown -R --from=root:root www-data:www-data /var/www/html/wp-content/
if [ -n "$@" ]; then
"$@"
fi

62
htaccess.tmpl Normal file
View File

@ -0,0 +1,62 @@
# Protect sensitive files from direct access
<FilesMatch "^(wp-config\.php|\.htaccess|\.htpasswd|readme\.html|license\.txt)$">
Require all denied
</FilesMatch>
{{ 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 }}

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
release/2.10.0+6.5.5 Normal file
View File

@ -0,0 +1 @@
Adds redirects and alakazam integration

1
release/2.13.2+6.7.1 Normal file
View File

@ -0,0 +1 @@
Breaking change for ftp container: you need to uncomment COMPOSE_FILE="$COMPOSE_FILE:compose.ftp-2222.yml" to open port 2222 again. You can also select between port 2220-2225.

1
release/2.17.1+6.9.0 Normal file
View File

@ -0,0 +1 @@
Breaking change for openid plugin: The issuer must be provided, thus the set_authentik function now includes issuer and endpoint_jwks.

1
release/2.7.0+6.4.2 Normal file
View File

@ -0,0 +1 @@
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.

View File

@ -1,6 +1,6 @@
{
"$schema": "https://docs.renovatebot.com/renovate-schema.json",
"extends": [
"config:base"
"config:recommended"
]
}

View File

@ -1,3 +0,0 @@
file_uploads = On
upload_max_filesize = 256M
post_max_size = 256M

11
uploads.ini.tmpl Normal file
View File

@ -0,0 +1,11 @@
{{ $upload_max_size := "256M" }}
{{ if ne (env "UPLOAD_MAX_SIZE") "" }} {{ $upload_max_size = env "UPLOAD_MAX_SIZE" }} {{ end }}
{{ $upload_max_time := "30" }}
{{ if ne (env "UPLOAD_MAX_TIME") "" }} {{ $upload_max_time = env "UPLOAD_MAX_TIME" }} {{ end }}
file_uploads = On
upload_max_filesize = {{ $upload_max_size }}
post_max_size = {{ $upload_max_size }}
memory_limit = {{ $upload_max_size }}
max_execution_time = {{ $upload_max_time }}
max_input_time = {{ $upload_max_time }}

1
users.conf.tmpl Normal file
View File

@ -0,0 +1 @@
ftp_user:{{ secret "ftp_pass" }}:33:33