Compare commits

..

220 Commits

Author SHA1 Message Date
kawaiipunk 391582089f Merge branch 'main' into tests
continuous-integration/drone/pr Build is passing
2026-06-03 18:33:08 +00:00
kawaiipunk 27442e3e4e Merge pull request 'chown entire wp-content to ensure correct permissions' (#60) from kawaiipunk/wordpress:main into main
continuous-integration/drone/push Build encountered an error
Reviewed-on: #60
2026-06-03 18:31:04 +00:00
kawaiipunk 65e716fa20 Added Document how to migrate an existing WP site #15
continuous-integration/drone/pr Build encountered an error
2026-06-03 19:21:22 +01:00
kawaiipunk e14f47a4b3 Rename stale pipeline name (deploy step is disabled)
continuous-integration/drone/pr Build is passing
2026-06-02 23:36:20 +01:00
kawaiipunk 2f1b9a2262 Pin gomplate to v5.0.0 in CI, add Renovate regex manager
- .drone.yml: pin gomplate to v5.0.0, remove redundant pip yamllint install
- renovate.json: add github-releases regex manager for hairyhenderson/gomplate
2026-06-02 23:36:19 +01:00
kawaiipunk bc54e86ff5 Updated README test instructions 2026-06-02 23:36:19 +01:00
kawaiipunk 90d44bd3bc Fix lint issues and improve test suite resilience
- compose.matrix.yml: add trailing newline
- compose.ftp-222*.yml: fix YAML indentation (8->6 spaces)
- entrypoint.sh.tmpl: fix SC2198 ([ -n "$@" ] -> [ $# -gt 0 ])
- All .tmpl files: migrate from {{ env }} to {{ getenv }} for gomplate v5 compat
- uploads.ini.tmpl: add {{- / -}} whitespace trimming, fix double-space typo
- tests/run.sh: only run ShellCheck on *.sh.tmpl files
- tests/test_shell.sh: gracefully skip if shellcheck not installed
- tests/test_templates.sh: remove dead render() function,
  gracefully skip if gomplate not found, use set -a/. for env sourcing
- tests/test_compose_config.sh: validate override files combined
  with compose.yml, skip partial snippets needing more context
- README.md: add test instructions with brew install
2026-06-02 23:36:18 +01:00
kawaiipunk 34b2515fca Add explanatory comments to all test scripts 2026-06-02 23:36:18 +01:00
kawaiipunk fe8744e20e Add Docker Compose config validation test 2026-06-02 23:36:18 +01:00
kawaiipunk 426e0367f1 Add Renovate regex manager for Docker image tags 2026-06-02 23:36:03 +01:00
kawaiipunk dde03454c3 Disable swarm-test deployment (server is down) 2026-06-02 23:36:02 +01:00
kawaiipunk a8bb78a8db Run CI tests on pull requests (not just push to main) 2026-06-02 23:36:02 +01:00
kawaiipunk 605f3d7fc0 Added basic tests 2026-06-02 23:36:02 +01:00
kawaiipunk b305445512 merge upstream
continuous-integration/drone/pr Build encountered an error
2026-06-02 21:32:31 +00:00
kawaiipunk 69551175d5 Commented out broken deploy (server spun down)
continuous-integration/drone/push Build encountered an error
2026-06-02 17:44:21 +01:00
kawaiipunk ef27645a30 chore: publish 3.0.0+7.0.0 release
continuous-integration/drone/push Build is failing
continuous-integration/drone/tag Build is passing
2026-06-02 17:42:25 +01:00
kawaiipunk 5d3c019b83 Add release notes 2026-06-02 17:41:56 +01:00
kawaiipunk f450f2e6ba bump ENTRYPOINT_CONF_VERSION to v9 2026-06-02 17:37:29 +01:00
kawaiipunk c75c18f185 chore: update image tags 2026-06-02 17:31:29 +01:00
kawaiipunk 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.
continuous-integration/drone/pr Build is failing
2026-06-02 16:24:48 +01:00
kawaiipunk b4db12f09c Added ignores for .env, *.log, .DS_Store, Thumbs.db, and common editor/IDE files
continuous-integration/drone/pr Build is failing
2026-06-02 16:23:11 +01:00
kawaiipunk e4b87c8ab9 chown entire wp-content to ensure correct permissions
continuous-integration/drone/pr Build is failing
2026-06-02 16:11:39 +01:00
moritz 7e170adbb4 Merge pull request 'Added xtra chown to ensure correct perms on every container start' (#57) from kawaiipunk/wordpress:main into main
continuous-integration/drone/push Build is failing
Reviewed-on: #57
2026-05-26 17:10:01 +00:00
kawaiipunk 66e0687456 Removed redundant chown
continuous-integration/drone/pr Build is failing
2026-05-26 17:05:24 +01:00
kawaiipunk 9209f007cb revert 69cf451b98
continuous-integration/drone/push Build is failing
revert Merge pull request 'chore(deps): update wordpress docker tag to v7' (#55) from renovate/wordpress-7.x into main

Reviewed-on: #55

Sorry this was done by mistake!
2026-05-26 14:08:49 +00:00
kawaiipunk 69cf451b98 Merge pull request 'chore(deps): update wordpress docker tag to v7' (#55) from renovate/wordpress-7.x into main
continuous-integration/drone/push Build is failing
Reviewed-on: #55
2026-05-26 13:59:35 +00:00
kawaiipunk 73a2e98d2e Added xtra chown to ensure correct perms on every container start
continuous-integration/drone/pr Build is failing
2026-05-26 14:10:22 +01:00
renovate-bot 0e229168fc chore(deps): update wordpress docker tag to v7
continuous-integration/drone/pr Build is failing
2026-05-22 00:34:30 +00:00
moritz 332ab0b97d chore: publish 2.19.2+6.9.4 release
continuous-integration/drone/tag Build is passing
continuous-integration/drone/push Build is failing
2026-04-28 02:25:26 +02:00
moritz 3b598e82dd harden htaccess 2026-04-28 01:57:52 +02:00
moritz 8e81f3f81c selfmanaged wordpress 2026-04-28 01:54:50 +02:00
moritz a09bd166ad chore: publish 2.19.1+6.9.4 release
continuous-integration/drone/push Build is failing
continuous-integration/drone/tag Build is passing
2026-03-17 17:11:56 +01:00
moritz b4c5d04382 chore: replace depricated traefik.docker.* with traefik.swarm.* 2026-03-17 17:11:07 +01:00
moritz 3c013d39fd chore: publish 2.19.0+6.9.4 release
continuous-integration/drone/tag Build is passing
continuous-integration/drone/push Build is failing
2026-03-17 16:11:37 +01:00
3wordchant 285bc01bef Merge pull request 'chore(config): migrate Renovate config' (#52) from renovate/migrate-config into main
continuous-integration/drone/push Build is failing
Reviewed-on: #52
2026-03-10 19:34:45 +00:00
renovate-bot 2ca12bff9c chore(config): migrate config renovate.json
continuous-integration/drone/pr Build is failing
2026-03-10 19:33:29 +00:00
p4u1 da2e62b618 chore: publish 2.18.0+6.9.1 release
continuous-integration/drone/push Build is failing
continuous-integration/drone/tag Build is passing
2026-03-07 09:39:38 +01:00
p4u1 364b5c8b8a chore: update image tags 2026-03-07 09:39:16 +01:00
carla 306b348961 chore: publish 2.17.1+6.9.0 release
continuous-integration/drone/push Build is failing
continuous-integration/drone/tag Build is passing
2026-02-16 10:58:29 +01:00
iexos 3c1121b7ce remove default TIMEOUT (abra #596)
continuous-integration/drone/push Build is failing
2025-12-30 14:02:39 +01:00
3wordchant b0eb1756a3 chore: publish 2.17.0+6.9.0 release
continuous-integration/drone/tag Build is passing
continuous-integration/drone/push Build is failing
2025-12-07 17:27:49 -05:00
trav 97b9b99e93 chore: publish 2.16.2+6.8.3 release
continuous-integration/drone/tag Build is passing
continuous-integration/drone/push Build is passing
2025-10-15 11:30:23 -04:00
simon cf2a5077c9 chore: publish 2.16.1+6.8.1 release
continuous-integration/drone/tag Build is passing
continuous-integration/drone/push Build is passing
2025-07-01 19:16:41 +02:00
moritz 74282d5658 chore: publish 2.16.0+6.8.1 release
continuous-integration/drone/tag Build is passing
continuous-integration/drone/push Build is passing
2025-05-27 17:17:23 +02:00
cas ab7716bf1e chore: publish 2.15.0+6.8.0 release
continuous-integration/drone/tag Build is passing
continuous-integration/drone/push Build is passing
2025-04-23 09:39:59 -07:00
3wordchant b0cc5a49a1 chore: publish 2.14.0+6.7.2 release
continuous-integration/drone/push Build is pending
continuous-integration/drone/tag Build is pending
continuous-integration/drone Build was killed
2025-02-19 12:38:06 -05:00
cas 3cca5d2cf3 Update .drone.yml
continuous-integration/drone/push Build is passing
2025-01-08 10:09:13 -08:00
moritz f403648cf6 chore: publish 2.13.3+6.7.1 release
continuous-integration/drone/tag Build is passing
continuous-integration/drone/push Build is passing
2024-12-17 16:42:36 +01:00
moritz 83f724a316 add all possible ftp port compose files to .env
continuous-integration/drone/push Build is passing
2024-12-17 16:40:40 +01:00
moritz e6b9f8117f chore: publish 2.13.2+6.7.1 release
continuous-integration/drone/tag Build is passing
continuous-integration/drone/push Build is passing
2024-12-17 15:29:21 +01:00
moritz e7aef38d3b remove 2222 default port binding to avoid port conflicts 2024-12-17 15:28:47 +01:00
moritz e08838561d chore: publish 2.13.1+6.7.1 release
continuous-integration/drone/tag Build is passing
continuous-integration/drone/push Build is passing
2024-12-17 15:21:10 +01:00
moritz 04d26a59a9 add possiblitliy to use other sftp ports per compose overwrite 2024-12-17 15:16:42 +01:00
moritz 591019112e chore: publish 2.13.0+6.7.1 release
continuous-integration/drone/tag Build is passing
continuous-integration/drone/push Build is passing
2024-12-10 19:23:34 +01:00
moritz 76e9b80fbd fix uploads.ini templating 2024-12-10 19:23:34 +01:00
stevensting f49fa05ded add some more wordpress options for file uploads (#44)
continuous-integration/drone/push Build is passing
Co-authored-by: Steven Sting
Reviewed-on: #44
Reviewed-by: decentral1se <decentral1se@noreply.git.coopcloud.tech>
2024-12-09 14:59:57 +00:00
moritz 716e6df3cd move USERS_CONF_VERSION env to abra.sh
continuous-integration/drone/push Build is passing
2024-11-11 22:51:58 +01:00
moritz 457c2defaf update backupbot label
continuous-integration/drone/push Build is passing
2024-10-24 15:26:10 +02:00
p4u1 37ff3e9b1b chore: publish 2.12.2+6.6.2 release
continuous-integration/drone/tag Build is passing
continuous-integration/drone/push Build is passing
2024-10-09 16:58:22 +02:00
javielico c5443cc14b chore: publish 2.12.1+6.6.1 release
continuous-integration/drone/push Build is passing
2024-08-26 18:21:25 +01:00
moritz 34f70889e3 chore: publish 2.12.0+6.6.1 release
continuous-integration/drone/push Build is passing
2024-08-14 12:02:42 +02:00
moritz af04e30e36 add show_plugins command 2024-08-14 12:02:33 +02:00
p4u1 17574fd3fe chore: publish 2.11.0+6.6.0 release
continuous-integration/drone/push Build is passing
2024-07-19 18:45:32 +02:00
moritz 8b6983d240 alaconnect: replace 'execute' with 'initial-hooks'
continuous-integration/drone/push Build is passing
2024-07-15 13:57:23 +02:00
p4u1 6fb30c5bc1 chore: publish 2.10.0+6.5.5 release
continuous-integration/drone/push Build is passing
2024-07-06 20:25:45 +02:00
p4u1 929bfb4239 add redirects
continuous-integration/drone/push Build is passing
2024-07-06 20:21:05 +02:00
moritz 7e4ff5c075 add alakazam integration file alaconnect.yml
continuous-integration/drone/push Build is passing
2024-05-13 17:34:43 +02:00
3wordchant 564db5b63f chore: publish 2.9.1+6.5.3 release
continuous-integration/drone/tag Build is passing
continuous-integration/drone/push Build is passing
2024-05-11 12:18:46 -03:00
moritz cf9b5f529e chore: publish 2.9.0+6.5.2 release
continuous-integration/drone/tag Build is passing
continuous-integration/drone/push Build is passing
2024-04-15 16:50:18 +02:00
3wordchant 240b70a967 chore: publish 2.8.0+6.5.0 release
continuous-integration/drone/tag Build is passing
continuous-integration/drone/push Build is passing
2024-04-07 12:43:44 -03:00
3wordchant 7f6b6a5ff2 Update metadata
continuous-integration/drone/push Build is passing
2024-03-30 16:19:49 -03:00
kawaiipunk 4d99aae234 Updated .drone.yml to use main branch
continuous-integration/drone/push Build is passing
2024-03-28 14:17:57 +00:00
kawaiipunk 959484f5e5 Added HTACCESS_CONF_VERSION to drone config 2024-03-28 14:15:37 +00:00
kawaiipunk 7ef8e5515d chore: publish 2.7.3+6.4.3 release
continuous-integration/drone/push Build is failing
2024-03-25 12:26:53 +00:00
moritz 770ef4932a Add FTP Access
continuous-integration/drone/push Build is failing
2024-01-29 20:41:59 +01:00
3wordchant dcb8a9a3a9 chore: publish 2.7.2+6.4.2 release
continuous-integration/drone/push Build is failing
2024-01-17 17:47:32 -03:00
3wordchant f3a9fad0a1 Bump ENTRYPOINT_CONF_VERSION
continuous-integration/drone/push Build is failing
2024-01-17 17:46:22 -03:00
3wordchant ebbd41e612 chore: publish 2.7.1+6.4.2 release
continuous-integration/drone/push Build is failing
2024-01-17 17:40:07 -03:00
p4u1 b45fca4a3f chore: publish 2.7.0+6.4.2 release
continuous-integration/drone/push Build is failing
2023-12-22 13:36:13 +01:00
p4u1 1a6b11c95b feat: multisite with sufolders (#35)
continuous-integration/drone/push Build is failing
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: #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
continuous-integration/drone/push Build is passing
2023-12-22 13:26:36 +01:00
moritz 81dbeca30d fix COMPOSE_FILE env for remote SMTP relay, it requires the mailrelay
continuous-integration/drone/push Build is passing
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
continuous-integration/drone/push Build is passing
Reviewed-on: #37
2023-12-02 15:31:20 +00:00
p4u1 540d526914 wordpress 6.4.1 and mariadb 11.2
continuous-integration/drone/pr Build is failing
2023-11-27 15:13:58 +01:00
moritz df32ba5141 chore: publish 2.6.1+6.4.0 release
continuous-integration/drone/push Build is passing
2023-11-15 16:22:57 +01:00
moritz 8d8418a6c0 fix disabling update notification settings
continuous-integration/drone/push Build is passing
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
continuous-integration/drone/push Build is passing
Reviewed-on: #33
2023-11-10 14:02:45 +00:00
3wordchant da0f503960 chore: publish 2.6.0+6.4.0 release
continuous-integration/drone/push Build is passing
2023-11-09 17:42:13 +00:00
3wordchant 6767d5ee65 Improve composer support
continuous-integration/drone/push Build is failing
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
continuous-integration/drone/push Build is passing
Reviewed-on: #36
2023-11-09 17:41:02 +00:00
p4u1 45a36ba7b4 update wordpress to 6.4.0
continuous-integration/drone/pr Build encountered an error
2023-11-08 20:11:58 +01:00
p4u1 ed77855e7d fix db backup and restore
continuous-integration/drone/pr Build encountered an error
2023-11-06 21:13:53 +01:00
knoflook 1c70a89ed4 chore: publish 2.5.1+6.3.0 release
continuous-integration/drone/push Build is passing
2023-10-24 16:54:44 +02:00
3wordchant c6be9ecfcf chore: publish 2.5.0+6.3.0 release
continuous-integration/drone/push Build is passing
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
continuous-integration/drone/push Build is passing
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
continuous-integration/drone/push Build is passing
2023-10-17 22:29:23 +01:00
3wordchant 9077d0aa86 chore: publish 2.4.2+6.3.0 release
continuous-integration/drone/push Build is failing
2023-10-17 13:35:18 +01:00
3wordchant 952044e590 Exciting attempt at public db access
continuous-integration/drone/push Build is passing
2023-10-17 13:28:42 +01:00
3wordchant 1c03d854b2 chore: publish 2.4.1+6.3.0 release
continuous-integration/drone/push Build is passing
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
continuous-integration/drone/push Build is passing
2023-08-24 11:34:01 +02:00
3wordchant 91335eac3a chore: publish 2.4.0+6.3.0 release
continuous-integration/drone/push Build is passing
2023-08-14 13:42:35 +02:00
moritz dfaa04131d fix compose env variable
continuous-integration/drone/push Build is passing
2023-07-09 15:05:08 +02:00
moritz b508b67752 use standalone authentik secrets 2023-07-08 04:31:03 +02:00
moritz 8cc028fc00 set default user role per env
continuous-integration/drone/push Build is passing
2023-06-08 16:00:19 +02:00
moritz 55f00a482a disable core updates, hide notifications, enable automatic plugin updates
continuous-integration/drone/push Build is passing
2023-06-01 16:59:09 +02:00
knoflook df821f5017 bump wordpress version
continuous-integration/drone/push Build is passing
2023-05-29 15:10:39 +02:00
moritz 9b1e36f8c8 chore: publish 2.3.2+6.2.0 release
continuous-integration/drone/push Build is passing
2023-04-20 20:51:36 +02:00
moritz f624ef2dc6 fix locale: replace deprecated function
continuous-integration/drone/push Build is passing
2023-04-20 20:44:38 +02:00
moritz 40e89c874a fix locale
continuous-integration/drone/push Build is passing
2023-04-20 20:38:42 +02:00
moritz 7c725fbf85 chore: publish 2.3.1+6.2.0 release
continuous-integration/drone/push Build is passing
2023-04-18 18:49:27 +02:00
moritz ed587cd983 add auto update and timeout env
continuous-integration/drone/push Build is passing
2023-04-18 18:23:23 +02:00
moritz 85d910f7ea fix adding timeout label
continuous-integration/drone/push Build is passing
2023-04-18 14:48:50 +02:00
moritz bcb911c6e0 add timeout label
continuous-integration/drone/push Build is passing
2023-04-18 13:02:53 +02:00
moritz 7281edfd60 chore: publish 2.3.0+6.2.0 release
continuous-integration/drone/push Build is passing
continuous-integration/drone/tag Build is passing
2023-04-06 19:35:11 +02:00
moritz 87406eb3ab fix authentik sso 2023-04-06 19:34:57 +02:00
moritz db1e7bc88a automatic authentik sso configuration
continuous-integration/drone/push Build is passing
2023-03-30 16:57:44 +02:00
3wordchant 7962da376c Switch to self-hosted stack-ssh-deploy image [mass update]
continuous-integration/drone/push Build is passing
2023-01-21 11:49:56 -08:00
3wordchant 6c97636698 Update abra syntax in examples (finally) [mass update]
continuous-integration/drone/push Build is passing
2023-01-19 16:02:28 -08:00
3wordchant 72ff340927 Fix CI/CD badge link
[ci skip]
2023-01-19 15:47:21 -08:00
3wordchant 369d962c40 Attempt to fix CI
continuous-integration/drone/push Build is passing
2023-01-19 15:44:04 -08:00
3wordchant 5941680738 chore: publish 2.2.1+6.1.1 release
continuous-integration/drone/push Build is failing
continuous-integration/drone/tag Build is passing
2023-01-19 15:40:48 -08:00
3wordchant 112c7a8f03 Regenerate recipe catalogue on new releases 2023-01-19 15:40:48 -08:00
3wordchant 2550098aee chore: delete swapfiles
continuous-integration/drone/push Build is failing
2022-12-16 18:49:37 -08:00
3wordchant ef7bed62dd chore: publish 2.2.0+6.1.1 release
continuous-integration/drone/push Build is failing
continuous-integration/drone Build is failing
2022-12-15 08:33:52 -08:00
3wordchant 581cd72a9a feat: add restore labels for DB service 2022-12-15 08:32:38 -08:00
decentral1se 50cd246597 feat: longblob some stuff
continuous-integration/drone/push Build is failing
2022-12-15 17:26:51 +01:00
decentral1se a55be09951 chore: publish 2.1.0+6.1.1 release
continuous-integration/drone/push Build is failing
2022-12-15 17:15:32 +01:00
3wordchant 5538ce9c3e Add support for WORDPRESS_TABLE_PREFIX 😬
continuous-integration/drone/push Build is failing
2022-11-16 19:13:27 -08:00
decentral1se 981fe85910 chore: publish 2.0.1+6.0.1 release
continuous-integration/drone/push Build is failing
2022-07-14 10:44:42 +02:00
3wordchant 1cedb08e46 fix: make DB backup work
continuous-integration/drone/push Build is failing
2022-07-05 14:01:03 +02:00
aadil 37a6ff8d7a chore: publish 2.0.0+6.0.0 release
continuous-integration/drone/push Build is failing
2022-06-22 17:28:10 +05:00
kawaiipunk 98f9a4f4d9 chore: publish 1.1.2+5.9.3 release
continuous-integration/drone/push Build is failing
2022-05-05 12:45:37 +01:00
3wordchant 76b698bc30 Fix SMTP_PORT, and container startup
continuous-integration/drone/push Build is failing
2022-03-31 12:14:25 +02:00
3wordchant dcb3b410ff feat: yet another attempt at wp-cli 2022-03-31 12:14:20 +02:00
decentral1se ceffd9ba5d chore: publish 1.1.1+5.9.2 release
continuous-integration/drone/push Build is failing
2022-03-28 09:24:44 +02:00
3wordchant 2d8c149b42 Add SMTP_PORT env variable
continuous-integration/drone/push Build is failing
2022-03-14 13:23:08 +02:00
decentral1se 08c56a2ad9 fix: inline to avoid multiline errors in abra 2022-03-08 14:08:21 +00:00
knoflook 2cb9b71e47 chore: publish 1.1.0+5.9.0 release 2022-02-03 17:14:34 +01:00
decentral1se 88ee8ae05e chore: publish 1.0.2+5.8.3 release 2022-01-18 16:11:45 +01:00
decentral1se 57122cd677 chore: publish 1.0.1+5.8.2 release 2022-01-04 12:06:14 +01:00
3wordchant ab3361f46d Add backup-bot-two labels 2021-12-09 01:34:01 +02:00
3wordchant 0771aae91c Goodbye, emojis! 😢
[ci skip]
2021-11-23 12:19:06 +02:00
3wordchant 101864ce03 chore: fix README bullet formatting
[ci skip]
2021-11-22 13:42:04 +02:00
d1admin 6ef2f30c0f chore: first release
continuous-integration/drone/push Build is failing
2021-10-12 08:45:20 +02:00
3wordchant 26107257bc Update to Wordpress 5.8.1
continuous-integration/drone/tag Build is failing
continuous-integration/drone/push Build is failing
2021-09-29 19:34:41 +02:00
renovate-bot 6b59677976 Update wordpress Docker tag to v5.8.0
continuous-integration/drone/pr Build is failing
continuous-integration/drone/push Build is failing
2021-07-21 07:03:37 +00:00
3wc 08fc5fe2c6 Fix README formatting
continuous-integration/drone/push Build is failing
2021-07-11 17:14:52 +02:00
d1admin de33fac3d3 Use new image namespace
continuous-integration/drone/push Build is failing
2021-06-21 12:32:21 +02:00
decentral1se d6125ba37a Remove trigger, we make the tags [ci skip] 2021-06-04 00:15:45 +02:00
decentral1se 6551fd8f8c Fix bad name in batch update script [ci skip] 2021-06-03 23:07:29 +02:00
decentral1se 14d50b851e Add release logic to CI [ci skip] 2021-06-03 23:01:37 +02:00
decentral1se acd5e93a4b Add some docs
continuous-integration/drone/push Build is passing
2021-06-02 11:26:03 +02:00
decentral1se f7600b9bc8 Merge commit 'febd250'
continuous-integration/drone/push Build is passing
2021-06-02 11:23:10 +02:00
decentral1se febd2500b4 Fix syntax 2021-06-02 11:22:54 +02:00
decentral1se a330574682 Remove old configs 2021-06-02 11:22:22 +02:00
decentral1se be6cf302d0 Unbreak mailrelay config
continuous-integration/drone/push Build is passing
2021-06-02 11:20:24 +02:00
decentral1se 8af9be6a40 Ensure default
continuous-integration/drone/push Build is passing
2021-06-02 09:57:25 +02:00
decentral1se a550017071 Add missing from
continuous-integration/drone/push Build is passing
2021-06-02 08:36:52 +02:00
decentral1se 9fa2b2d1b7 Support SMTP relay configuration
continuous-integration/drone/push Build is passing
Hopefully this doesn't bork existing relay configs
2021-06-02 08:24:33 +02:00
3wc 8399631c81 Another lap of the Wordpress arms race..
continuous-integration/drone/push Build is passing
2021-05-25 09:28:57 +02:00
3wc e5c41fa027 Version 5.7.2; sync labels
continuous-integration/drone/push Build is passing
2021-05-15 22:08:17 +02:00
3wordchant 0df2a556e8 Merge pull request 'Update wordpress Docker tag to v5.7.2 (master)' (#24) from renovate/master-docker-wordpress-5.x into master
continuous-integration/drone/push Build is passing
Reviewed-on: https://git.autonomic.zone/coop-cloud/wordpress/pulls/24
2021-05-15 22:07:11 +02:00
renovate-bot 4d4befc9e1 Update wordpress Docker tag to v5.7.2
continuous-integration/drone/pr Build is failing
2021-05-14 07:02:27 +00:00
decentral1se e8aa34c7e3 Remove unused env vars
continuous-integration/drone/push Build is failing
2021-05-10 07:12:05 +02:00
decentral1se 421c01e78a Formatting and remove backup bot docs
continuous-integration/drone/push Build is passing
2021-05-10 07:09:52 +02:00
decentral1se c99f35b5d9 Version 5.7.1_1; sync labels
continuous-integration/drone/push Build is failing
2021-05-03 09:50:15 +02:00
decentral1se 36046c801e Merge pull request 'Update mariadb Docker tag to v10.6 (master)' (#23) from renovate/master-docker-mariadb-10.x into master
continuous-integration/drone/push Build is passing
Reviewed-on: https://git.autonomic.zone/coop-cloud/wordpress/pulls/23
2021-05-03 09:49:48 +02:00
renovate-bot d20b99b7b4 Update mariadb Docker tag to v10.6
continuous-integration/drone/pr Build is failing
2021-04-30 07:02:49 +00:00
decentral1se 0b8c60c0f3 Version 5.7.1; sync labels
continuous-integration/drone/push Build is passing
2021-04-16 09:11:46 +02:00
decentral1se f2fff04c53 Merge pull request 'Update wordpress Docker tag to v5.7.1 (master)' (#22) from renovate/master-docker-wordpress-5.x into master
continuous-integration/drone/push Build is passing
Reviewed-on: https://git.autonomic.zone/coop-cloud/wordpress/pulls/22
2021-04-16 09:08:42 +02:00
renovate-bot bf4e9323f3 Update wordpress Docker tag to v5.7.1
continuous-integration/drone/pr Build is failing
2021-04-16 07:02:12 +00:00
3wc f28b9d69f6 Version 5.7.0; sync labels
continuous-integration/drone/push Build is passing
2021-04-05 00:25:16 +02:00
decentral1se 8fc4c37e68 Remove old version handling
continuous-integration/drone/push Build is passing
2021-04-02 21:18:17 +02:00
decentral1se 60b4398e92 Add versions and label
continuous-integration/drone/push Build is passing
2021-03-16 09:37:42 +01:00
decentral1se 08d9ac6e2f Remove experimental package file 2021-03-16 09:37:12 +01:00
3wc fb632799c9 Fix wp
continuous-integration/drone/push Build is passing
Closes #21
2021-03-14 14:28:11 +02:00
3wordchant f6dc0243f7 Merge pull request 'Update wordpress Docker tag to v5.7.0 (master)' (#19) from renovate/master-docker-wordpress-5.x into master
continuous-integration/drone/push Build is passing
Reviewed-on: https://git.autonomic.zone/coop-cloud/wordpress/pulls/19
2021-03-12 10:53:00 +01:00
renovate-bot 94459b7077 Update wordpress Docker tag to v5.7.0
continuous-integration/drone/pr Build is failing
2021-03-11 08:02:34 +00:00
3wc d27c4ed6f3 compose-stacks → coop-cloud
[ci skip]
2021-03-02 19:58:26 +02:00
3wc f2225be233 Follow new exciting README standard
continuous-integration/drone/push Build is passing
See coop-cloud/organising#31
2021-03-02 18:41:31 +02:00
3wc aae6b22d53 Use shared abra backup functions 2021-03-02 18:41:31 +02:00
decentral1se 4eaa4de5ae Merge pull request 'Update wordpress Docker tag to v5.6.2 (master)' (#18) from renovate/master-docker-wordpress-5.x into master
continuous-integration/drone/push Build is passing
Reviewed-on: https://git.autonomic.zone/coop-cloud/wordpress/pulls/18
2021-02-23 09:12:57 +01:00
renovate-bot 064af9c04c Update wordpress Docker tag to v5.6.2
continuous-integration/drone/pr Build is failing
2021-02-23 08:02:28 +00:00
3wc 38c4fe0246 Move config to abra.sh
continuous-integration/drone/push Build is passing
Ref coop-cloud/abra#43
2021-02-08 16:54:23 +02:00
decentral1se 990a58be81 Merge pull request 'Update wordpress Docker tag to v5.6.1' (#17) from renovate/docker-wordpress-5.x into master
continuous-integration/drone/push Build is passing
Reviewed-on: https://git.autonomic.zone/coop-cloud/wordpress/pulls/17
2021-02-08 14:07:36 +01:00
renovate-bot 923295aa91 Update wordpress Docker tag to v5.6.1
continuous-integration/drone/pr Build is failing
2021-02-05 08:02:06 +00:00
3wc 479d061879 Add restore commands, see coop-cloud/abra#70
continuous-integration/drone/push Build is passing
2021-01-01 22:29:16 +02:00
3wc c28bb98e23 App & db backup commands, see coop-cloud/abra#70
continuous-integration/drone/push Build is passing
2021-01-01 18:58:55 +02:00
3wc 83130a482e Fix embarrassing mass-typo 😳
continuous-integration/drone/push Build is passing
2020-12-31 23:02:29 +02:00
3wc 925d5703a9 APP → TYPE
continuous-integration/drone/push Build is passing
Ref coop-cloud/abra#47
2020-12-31 22:54:44 +02:00
3wc 5d351b1ede Switch from envrc → env format
continuous-integration/drone/push Build is passing
Ref coop-cloud/abra#40
2020-12-30 13:23:06 +02:00
3wc 5488d04c92 Update wp subcommand for new abra argument processing
continuous-integration/drone/push Build is passing
2020-12-27 15:57:22 +02:00
3wc 997707189e Add custom abra command to run WP-CLI
continuous-integration/drone/push Build is passing
Closes #2
2020-12-14 12:31:17 +02:00
3wc 5c81094a82 Update README for new abra UI 2020-12-14 12:28:46 +02:00
3wc 26fa0bdfd3 Update for new SECRET_ naming
continuous-integration/drone/push Build is passing
2020-12-14 11:56:31 +02:00
3wordchant ebb2036510 Merge pull request 'Update wordpress Docker tag to v5.6.0' (#16) from renovate/docker-wordpress-5.x into master
continuous-integration/drone/push Build is passing
Reviewed-on: https://git.autonomic.zone/coop-cloud/wordpress/pulls/16
2020-12-14 10:54:09 +01:00
renovate-bot b0055f587d Update wordpress Docker tag to v5.6.0
continuous-integration/drone/pr Build is failing
2020-12-11 08:01:49 +00:00
3wc a8d5e0553f Bridge backend network, not overlay
continuous-integration/drone/push Build is passing
Fixes #14
2020-11-17 22:57:36 +02:00
decentral1se 6124c36f42 Merge pull request 'Update wordpress Docker tag to v5.5.3' (#13) from renovate/docker-wordpress-5.x into master
continuous-integration/drone/push Build is passing
Reviewed-on: https://git.autonomic.zone/coop-cloud/wordpress/pulls/13
2020-11-03 17:22:42 +01:00
renovate-bot 0e486d395d Update wordpress Docker tag to v5.5.3
continuous-integration/drone/pr Build is failing
2020-11-03 08:01:54 +00:00
3wc 61bdd21085 SERVICE -> APP
continuous-integration/drone/push Build is passing
2020-10-29 19:42:08 +02:00
3wc 21babc7bca Various un-breaking
continuous-integration/drone/push Build is passing
2020-10-24 20:13:56 +02:00
3wc 0ac4c51b3b Add new vars to Drone
continuous-integration/drone/push Build is passing
2020-10-23 04:15:35 +02:00
3wc 43cbfafb8a Enable additional PHP extensions 2020-10-23 04:15:35 +02:00
d1admin c6039c3b54 Remove singlesite config
continuous-integration/drone/push Build is passing
2020-10-22 10:13:48 +02:00
3wc bdabcce977 Rejig .envrc.sample
[ci skip]
2020-10-06 01:48:03 +02:00
3wc 42c822f819 Minor .envrc tweak
[ci skip]
2020-10-06 01:41:16 +02:00
3wc b5ac06c0cf Fix Multisite instructions
[ci skip]
2020-10-05 13:10:54 +02:00
3wc 6f10b0f3cc Add EXTRA_DOMAINS support
continuous-integration/drone/push Build is passing
2020-10-05 13:07:50 +02:00
3wc 03bbf527fe Rename services
See compose-stacks/organising#19
2020-10-05 13:07:49 +02:00
d1admin 25a98e6298 Update hosts to match new names
continuous-integration/drone/push Build is passing
2020-10-02 09:38:54 +02:00
d1admin c5beea3114 Apply @3wordchant patch
continuous-integration/drone/push Build is passing
Didn't bring over "depends_on" because I think it is ignored?
2020-10-02 09:37:36 +02:00
d1admin 50a11700b4 Use generic naming
continuous-integration/drone/push Build is passing
2020-10-02 09:11:40 +02:00
d1admin 65742d663d Remove test file
continuous-integration/drone/push Build is passing
2020-10-02 09:06:12 +02:00
55 changed files with 1357 additions and 341 deletions
+57 -16
View File
@@ -1,22 +1,63 @@
---
kind: pipeline
name: deploy to swarm-test.autonomic.zone
name: test
steps:
- name: deployment
image: decentral1se/stack-ssh-deploy:latest
settings:
host: swarm-test.autonomic.zone
stack: wordpress
generate_secrets: true
purge: true
deploy_key:
from_secret: drone_ssh_swarm_test
- name: test
image: alpine:3.21
environment:
DOMAIN: wordpress.swarm-test.autonomic.zone
STACK_NAME: wordpress
LETS_ENCRYPT_ENV: production
DB_PASSWORD_VERSION: v1
DB_ROOT_PASSWORD_VERSION: v1
SHELLCHECK_OPTS: -s bash
commands:
- apk add --no-cache bash shellcheck py3-yaml curl
- curl -sSLo /usr/local/bin/gomplate https://github.com/hairyhenderson/gomplate/releases/download/v5.0.0/gomplate_linux-amd64
- chmod +x /usr/local/bin/gomplate
- tests/run.sh
# deployment step disabled: swarm-test.autonomic.zone is down
# - name: deployment
# image: git.coopcloud.tech/coop-cloud/stack-ssh-deploy:latest
# when:
# event:
# - push
# branch:
# - main
# settings:
# host: swarm-test.autonomic.zone
# stack: wordpress
# generate_secrets: true
# purge: true
# deploy_key:
# from_secret: drone_ssh_swarm_test
# networks:
# - proxy
# environment:
# DOMAIN: wordpress.swarm-test.autonomic.zone
# STACK_NAME: wordpress
# LETS_ENCRYPT_ENV: production
# SECRET_DB_PASSWORD_VERSION: v1
# SECRET_DB_ROOT_PASSWORD_VERSION: v1
# PHP_UPLOADS_CONF_VERSION: v1
# ENTRYPOINT_CONF_VERSION: v1
# HTACCESS_CONF_VERSION: v1
trigger:
event:
- push
- pull_request
branch:
- master
- main
---
kind: pipeline
name: generate recipe catalogue
steps:
- name: release a new version
image: plugins/downstream
settings:
server: https://build.coopcloud.tech
token:
from_secret: drone_abra-bot_token
fork: true
repositories:
- toolshed/auto-recipes-catalogue-json
trigger:
event: tag
+96
View File
@@ -0,0 +1,96 @@
TYPE=wordpress
#TIMEOUT=300
ENABLE_AUTO_UPDATE=true
COMPOSE_FILE="compose.yml"
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
# 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
#PHP_EXTENSIONS="calendar"
SECRET_DB_ROOT_PASSWORD_VERSION=v1
SECRET_DB_PASSWORD_VERSION=v1
# Mostly for compatibility with existing database dumps...
#WORDPRESS_TABLE_PREFIX=wp_
# Multisite (see README)
#MULTISITE=enable # either 'enable', 'subdomain' or 'subfolder'
# File upload settings
#UPLOAD_MAX_SIZE=256M
#UPLOAD_MAX_TIME=30
# Local SMTP relay
#COMPOSE_FILE="$COMPOSE_FILE:compose.mailrelay.yml"
#SMTP_HOST="postfix_relay_app"
#MAIL_FROM="wordpress@example.com"
# Remote SMTP relay
#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'
# 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"
-38
View File
@@ -1,38 +0,0 @@
export DOMAIN=wordpress.example.com
## Domain aliases
#export EXTRA_DOMAINS=', `www.wordpress.example.com`'
export STACK_NAME=wordpress
export LETS_ENCRYPT_ENV=production
export DB_ROOT_PASSWORD_VERSION=v1
export DB_PASSWORD_VERSION=v1
# Multisite
#export WORDPRESS_CONFIG_EXTRA="\
# define('WP_CACHE', false);\
# define('WP_ALLOW_MULTISITE', true );"
# Multisite phase 2 (see README)
#export WORDPRESS_CONFIG_EXTRA="\
# define('WP_CACHE', false);\
# define('WP_ALLOW_MULTISITE', true );\
# 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']);"
# Backups
#export COMPOSE_FILE="compose.yml:compose.backup.yml"
# SMTP
#export COMPOSE_FILE="compose.yml:compose.mailrelay.yml"
#export SMTP_HOST="postfix_relay_app"
#export MAIL_FROM="wordpress@example.com"
#
#export MSMTP_CONF_VERSION=v1
#export ENTRYPOINT_MAILRELAY_CONF_VERSION=v1
+21
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
+91 -43
View File
@@ -1,59 +1,107 @@
# wordpress
# Wordpress
[![Build Status](https://drone.autonomic.zone/api/badges/compose-stacks/wordpress/status.svg)](https://drone.autonomic.zone/compose-stacks/wordpress)
[![Build Status](https://build.coopcloud.tech/api/badges/coop-cloud/wordpress/status.svg)](https://build.coopcloud.tech/coop-cloud/wordpress)
Coöp Cloud + [Wordpress](https://wordpress.org) = 🥳
1. Set up Docker Swarm and [`abra`][abra]
2. Deploy [`compose-stacks/traefik`][compose-traefik]
3. `cp .envrc.sample .envrc`
4. Edit `.envrc` - be sure to change `$DOMAIN` to something that resolves to
your Docker swarm box
5. `direnv allow` (or `. .envrc`)
6. Generate secrets:
```
abra secret_generate db_password v1
abra secret_generate db_root_password v1
```
7. `abra deploy`
8. Open the configured domain in your browser to finish set-up
9. `abra run wordpress chown www-data:www-data /var/www/html/wp-content` to fix
file permissions (see #3)
<!-- metadata -->
* **Category**: Apps
* **Status**: 4
* **Image**: [`wordpress`](https://hub.docker.com/_/wordpress), 4, upstream
* **Healthcheck**: Yes
* **Backups**: Yes
* **Email**: 3
* **Tests**: 2
* **SSO**: No
<!-- endmetadata -->
## Quick start
* `abra app new wordpress`
* `abra app config <app-name>`
* `abra app secret generate -a <app-name>`
* `abra app deploy <app-name>`
* `abra app cmd <app-name> app core_install`
### Authentik Integration
`abra app config <app-name>`
Configure the following envs:
```
COMPOSE_FILE="$COMPOSE_FILE:compose.authentik.yml"
AUTHENTIK_DOMAIN=authentik.example.com
AUTHENTIK_SECRET_NAME=authentik_example_com_wordpress_secret_v1 # the same as in authentik
AUTHENTIK_ID_NAME=authentik_example_com_wordpress_id_v1 # the same as in authentik
```
`abra app cmd <app-name> app set_authentik`
## Running WP-CLI
`abra app cmd <app-name> app wp -- core check-update --major`
## Network (Multi-site)
_(Only tested using subdomains)_
1. Set up as above
2. Uncomment the first `# Multisite` section in `.envrc`
3. `direnv allow` (or re-run `source .envrc`)
4. `abra deploy`
5. Log into the Wordpress admin dashboard, go to Tools » Network Setup
6. Don't worry about the suggested file changes
7. Comment out the first `# Multisite` section in `.envrc` and uncomment the
`# Multisite phase 2` section
8. `direnv allow` (or re-run `source .envrc`)
9. `abra deploy`
10. FIXME setting up SSL / routing
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 and set `MULTISITE` to either `subdomain` or `subfolder` depending on your setup.
7. `abra app deploy <app-name>`
## Installing a custom theme
`abra cp ~/path/to/local/theme wordpress:/var/www/html/wp-content/themes/`
## Backups
1. Edit `.envrc` and uncomment the `export COMPOSE_FILE="compose.yml:compose.backup.yml"` line
2. `direnv allow`
3. `abra deploy`
`abra app cp <app-name> ~/path/to/local/theme wordpress:/var/www/html/wp-content/themes/`
## Email
1. Deploy `postfix-relay`
2. Edit `.envrc` and uncomment the email lines; change `MAIL_FROM` to make sure
the domain is the same as `postfix-relay`'s `$DOMAIN` or in its
`$EXTRA_SENDER_DOMAINS`
3. `direnv allow` (or `source .envrc`)
7. `abra deploy`
There is a local or remote SMTP relay configuration available.
* **local**: `COMPOSE_FILE=compose.yml:compose.mailrelay.yml`
* **remote**: `COMPOSE_FILE=compose.yml:compose.mailrelay.yml:compose.smtp.yml`
Below are the instructions for the local relay.
1. Deploy [`postfix-relay`][cc-postfix-relay]
2. `abra app config <app-name>`, and uncomment the email lines; change
`MAIL_FROM` to make sure the domain is the same as `postfix-relay`'s
`$DOMAIN` or in its `$EXTRA_SENDER_DOMAINS`
3. `abra app deploy <app-name>`
## Tests
Run the full test suite:
```sh
bash tests/run.sh
```
### Prerequisites
The test suite uses several tools. Install them with your equivalent of:
```sh
brew install shellcheck gomplate
```
Some tests skip gracefully if their dependencies are missing.
[abra]: https://git.autonomic.zone/autonomic-cooperative/abra
[compose-traefik]: https://git.autonomic.zone/compose-stacks/traefik
## Migrate from a non-Co-op Cloud Wordpress install
Make a .tar.gz backup of the site's wp-content dir and an .sql.gz backup of the database.
1. `abra app wp.example.com restore app wp-content.tar.gz`
2. `abra app wp.example.com restore db wordpress.sql.gz`
Lastly, if there's a domain name change, run a search and replace:
`abra app wp.example.com wp "search-replace https://old.example.com https://wp.example.com"`
[cc-traefik]: https://git.autonomic.zone/coop-cloud/traefik
[cc-postfix-relay]: https://git.autonomic.zone/coop-cloud/traefik
+109
View File
@@ -0,0 +1,109 @@
export PHP_UPLOADS_CONF_VERSION=v4
export ENTRYPOINT_CONF_VERSION=v9
export ENTRYPOINT_MAILRELAY_CONF_VERSION=v2
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" ]
then
ADMIN=akadmin
fi
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%/'"
if [ -n "$DEFAULT_USER_ROLE" ]
then
wp "option set default_role $DEFAULT_USER_ROLE"
else
wp "option set default_role subscriber"
fi
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(){
AUTHENTIK_SECRET=$(cat /run/secrets/authentik_secret)
AUTHENTIK_ID=$(cat /run/secrets/authentik_id)
if [ -z $LOGIN_TYPE ]
then
LOGIN_TYPE='button'
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\",
\"client_id\":\"$AUTHENTIK_ID\",
\"client_secret\":\"$AUTHENTIK_SECRET\",
\"scope\":\"email profile openid\",
\"endpoint_login\":\"https://$AUTHENTIK_DOMAIN/application/o/authorize/\",
\"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\",
\"http_request_timeout\":\"30\",
\"enforce_privacy\":\"0\",
\"alternate_redirect_uri\":\"1\",
\"nickname_key\":\"preferred_username\",
\"email_format\":\"{email}\",
\"displayname_format\":\"\",
\"identify_with_username\":\"1\",
\"state_time_limit\":\"\",
\"token_refresh_enable\":\"1\",
\"link_existing_users\":\"1\",
\"create_if_does_not_exist\":\"1\",
\"redirect_user_back\":\"0\",
\"redirect_on_logout\":\"1\",
\"enable_logging\":\"0\",
\"log_limit\":\"1000\"
}'"
wp "rewrite flush"
wp "cache flush"
}
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)
}
show_plugins() {
wp "plugin list --fields=name,status,wporg_status,version,update_version,auto_update,tested_up_to,wporg_last_updated"
}
+16
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
-3
View File
@@ -1,3 +0,0 @@
# Notes
- The only thing different between [fr_singlesite_wordpress.yml](./fr_singlesite_wordpress.yml) and [fr_microsites_wordpress.yml](./fr_microsites_wordpress.yml) is the `BORGBASE_REPO` environment variable and the `backup_bot_singlesite_passwd_v1`/`backup_bot_multisite_passwd_v1` secret. These are the two details which are needed for Borgmatic to know how to differentiate between each repository on the Borgbase side (where our backups are stored). Sooo, there could most definitely be a reduction in boilerplate here but I was just moving super fast and wanted to get the backup work done.
-36
View File
@@ -1,36 +0,0 @@
location:
source_directories:
- /var/www/html/wp-content
repositories:
- {{ env "BORGBASE_REPO" }}
storage:
compression: auto,zstd
encryption_passphrase: {{ secret "backup_bot_password" }}
archive_name_format: "{hostname}-{now}"
ssh_command: "ssh -o 'StrictHostKeyChecking no' -i /run/secrets/backup_bot_ssh_key"
retention:
keep_daily: 3
keep_weekly: 4
keep_monthly: 12
keep_yearly: 2
prefix: "{hostname}-"
consistency:
checks:
- disabled
check_last: 3
prefix: "{hostname}-"
hooks:
before_backup:
- echo "`date` - Starting backup"
after_backup:
- echo "`date` - Finished backup"
mysql_databases:
- name: {{ env "DB_TABLE" }}
hostname: {{ env "DB_HOST" }}
port: 3306
username: {{ env "DB_USER" }}
password: {{ secret "db_password" }}
-47
View File
@@ -1,47 +0,0 @@
---
version: "3.8"
services:
backupbot:
image: "decentral1se/backup-bot:latest"
networks:
- backend
volumes:
- "wordpress_content:/var/www/html/wp-content/"
secrets:
- source: backup_bot_ssh_key
mode: 0400
- backup_bot_password
- db_password
configs:
- source: borgmatic_config_yml
target: /etc/borgmatic/config.yaml
environment:
- BORGBASE_REPO="bp5oj726@bp5oj726.repo.borgbase.com:repo"
- DB_HOST=mariadb
- DB_TABLE=wordpress
- DB_USER=wordpress
deploy:
mode: replicated
replicas: 0
labels:
- "swarm.cronjob.enable=true"
- "swarm.cronjob.schedule=0 2 * * *" # At 02:00
restart_policy:
condition: none
networks:
- backend
configs:
borgmatic_config_yml:
name: borgmatic_config_yml_v1
file: backup.d/borgmatic.yml
template_driver: golang
secrets:
backup_bot_ssh_key:
name: backup_bot_ssh_key_v1
external: true
backup_bot_password:
name: backup_bot_multisite_passwd_v1
external: true
-47
View File
@@ -1,47 +0,0 @@
---
version: "3.8"
services:
backupbot:
image: "decentral1se/backup-bot:latest"
networks:
- backend
volumes:
- "wordpress_content:/var/www/html/wp-content/"
secrets:
- source: backup_bot_ssh_key
mode: 0400
- backup_bot_password
- db_password
configs:
- source: borgmatic_config_yml
target: /etc/borgmatic/config.yaml
environment:
- BORGBASE_REPO="l32s99em@l32s99em.repo.borgbase.com:repo"
- DB_HOST=mariadb
- DB_TABLE=wordpress
- DB_USER=wordpress
deploy:
mode: replicated
replicas: 0
labels:
- "swarm.cronjob.enable=true"
- "swarm.cronjob.schedule=0 2 * * *" # At 02:00
restart_policy:
condition: none
networks:
- backend
configs:
borgmatic_config_yml:
name: borgmatic_config_yml_v1
file: backup.d/borgmatic.yml
template_driver: golang
secrets:
backup_bot_ssh_key:
name: backup_bot_ssh_key_v1
external: true
backup_bot_password:
name: backup_bot_singlesite_passwd_v1
external: true
-65
View File
@@ -1,65 +0,0 @@
# #############################################################################
# NOTE(decentral1se): this is a test compose.yml to test abra based deployments
# #############################################################################
---
version: "3.8"
services:
wordpress:
image: "wordpress:5.5.1"
networks:
- backend
- proxy
environment:
- WORDPRESS_DB_HOST=mariadb
- WORDPRESS_DB_USER=wordpress
- WORDPRESS_DB_PASSWORD_FILE=/run/secrets/db_password
- WORDPRESS_DB_NAME=wordpress
secrets:
- db_password
deploy:
update_config:
failure_action: rollback
order: start-first
labels:
- "traefik.enable=true"
- "traefik.docker.network=proxy"
- "traefik.http.routers.${NAME}.tls=true"
- "traefik.http.services.${NAME}.loadbalancer.server.port=80"
- "traefik.http.routers.${NAME}.rule=Host(`${DOMAIN}`)"
- "traefik.http.routers.${NAME}.tls.certresolver=production"
- "traefik.http.routers.${NAME}.entrypoints=web-secure"
mariadb:
image: "mariadb:10.5"
volumes:
- "mariadb:/var/lib/mysql"
networks:
- backend
environment:
- MYSQL_ROOT_PASSWORD_FILE=/run/secrets/db_root_password
- MYSQL_DATABASE=wordpress
- MYSQL_USER=wordpress
- MYSQL_PASSWORD_FILE=/run/secrets/db_password
secrets:
- db_password
- db_root_password
networks:
backend:
driver: overlay
proxy:
external: true
volumes:
mariadb:
wordpress_content:
secrets:
db_root_password:
external: true
name: ${DB_ROOT_PASSWD}
db_password:
external: true
name: ${DB_PASSWD}
+14
View File
@@ -0,0 +1,14 @@
version: "3.8"
services:
app:
secrets:
- authentik_secret
- authentik_id
secrets:
authentik_secret:
external: true
name: ${STACK_NAME}_authentik_secret_${SECRET_AUTHENTIK_SECRET_VERSION}
authentik_id:
external: true
name: ${STACK_NAME}_authentik_id_${SECRET_AUTHENTIK_ID_VERSION}
+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:
+7
View File
@@ -0,0 +1,7 @@
---
version: "3.8"
services:
ftp:
ports:
- 2220:22
+7
View File
@@ -0,0 +1,7 @@
---
version: "3.8"
services:
ftp:
ports:
- 2221:22
+7
View File
@@ -0,0 +1,7 @@
---
version: "3.8"
services:
ftp:
ports:
- 2222:22
+7
View File
@@ -0,0 +1,7 @@
---
version: "3.8"
services:
ftp:
ports:
- 2223:22
+7
View File
@@ -0,0 +1,7 @@
---
version: "3.8"
services:
ftp:
ports:
- 2224:22
+7
View File
@@ -0,0 +1,7 @@
---
version: "3.8"
services:
ftp:
ports:
- 2220:22
+24
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
+6 -11
View File
@@ -1,31 +1,26 @@
---
version: "3.8"
services:
app:
entrypoint: /docker-entrypoint.sh
entrypoint: /docker-entrypoint.mailrelay.sh
environment:
- SMTP_HOST=${SMTP_HOST}
- SMTP_PORT=${SMTP_PORT:-25}
- MAIL_FROM=${MAIL_FROM}
networks:
- mail
configs:
- source: mstmp_conf
target: /etc/msmtprc
- source: entrypoint_conf
target: /docker-entrypoint.sh
- source: entrypoint_mailrelay_conf
target: /docker-entrypoint.mailrelay.sh
mode: 0555
networks:
mail:
external: true
configs:
mstmp_conf:
name: ${STACK_NAME}_mstmp_conf_${MSMTP_CONF_VERSION}
file: msmtp.conf.tmpl
template_driver: golang
entrypoint_conf:
entrypoint_mailrelay_conf:
name: ${STACK_NAME}_entrypoint_mailrelay_${ENTRYPOINT_MAILRELAY_CONF_VERSION}
file: entrypoint.mailrelay.sh.tmpl
template_driver: golang
+10
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
View File
@@ -0,0 +1,9 @@
---
version: "3.8"
services:
db:
ports:
- target: 3306
published: 3306
mode: host
+21
View File
@@ -0,0 +1,21 @@
---
version: "3.8"
services:
app:
image: "wordpress:7.0.0"
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:
+19
View File
@@ -0,0 +1,19 @@
---
version: "3.8"
services:
app:
secrets:
- smtp_password
environment:
- SMTP_HOST
- SMTP_PORT=${SMTP_PORT:-25}
- SMTP_AUTH
- SMTP_TLS
- MAIL_FROM
- SMTP_OVERRIDE_FROM
secrets:
smtp_password:
name: ${STACK_NAME}_smtp_password_${SECRET_SMTP_PASSWORD_VERSION}
external: true
+54 -12
View File
@@ -3,20 +3,37 @@ version: "3.8"
services:
app:
image: "wordpress:5.5.1"
image: "wordpress:7.0.0"
volumes:
- "wordpress_content:/var/www/html/wp-content/"
networks:
- backend
- proxy
environment:
- WORDPRESS_DB_HOST=db
- WORDPRESS_DB_USER=wordpress
- WORDPRESS_DB_PASSWORD_FILE=/run/secrets/db_password
- WORDPRESS_DB_NAME=wordpress
- WORDPRESS_CONFIG_EXTRA=${WORDPRESS_CONFIG_EXTRA}
WORDPRESS_CONFIG_EXTRA: |
define( 'AUTOMATIC_UPDATER_DISABLED', false );
define( 'WP_AUTO_UPDATE_CORE', false );
${WORDPRESS_CONFIG_EXTRA}
PAGER: more
WORDPRESS_DB_HOST: db
WORDPRESS_DB_USER: wordpress
WORDPRESS_DB_PASSWORD_FILE: /run/secrets/db_password
WORDPRESS_DB_NAME: wordpress
WORDPRESS_TABLE_PREFIX: ${WORDPRESS_TABLE_PREFIX:-wp_}
PHP_EXTENSIONS: ${PHP_EXTENSIONS}
CORS_ALLOW_ALL:
COMPOSER:
secrets:
- db_password
configs:
- source: php_uploads_conf
target: /usr/local/etc/php/conf.d/uploads.ini
- source: entrypoint_conf
target: /docker-entrypoint.sh
mode: 0555
- source: htaccess_conf
target: /var/www/html/.htaccess
entrypoint: /docker-entrypoint.sh
depends_on:
- db
healthcheck:
@@ -31,18 +48,24 @@ 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})"
# 3wc: this rule works for routing, but not for generating certificates
# see https://git.autonomic.zone/compose-stacks/planning/issues/14
# see https://git.autonomic.zone/coop-cloud/planning/issues/14
#- "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"
- "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=3.0.0+7.0.0"
db:
image: "mariadb:10.5"
image: "mariadb:12.3"
volumes:
- "mariadb:/var/lib/mysql"
networks:
@@ -55,10 +78,15 @@ services:
secrets:
- db_password
- db_root_password
deploy:
labels:
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:
driver: overlay
proxy:
external: true
@@ -69,7 +97,21 @@ volumes:
secrets:
db_root_password:
external: true
name: ${STACK_NAME}_db_root_password_${DB_ROOT_PASSWORD_VERSION}
name: ${STACK_NAME}_db_root_password_${SECRET_DB_ROOT_PASSWORD_VERSION}
db_password:
external: true
name: ${STACK_NAME}_db_password_${DB_PASSWORD_VERSION}
name: ${STACK_NAME}_db_password_${SECRET_DB_PASSWORD_VERSION}
configs:
entrypoint_conf:
name: ${STACK_NAME}_entrypoint_conf_${ENTRYPOINT_CONF_VERSION}
file: entrypoint.sh.tmpl
template_driver: golang
php_uploads_conf:
name: ${STACK_NAME}_php_uploads_conf_${PHP_UPLOADS_CONF_VERSION}
file: uploads.ini.tmpl
template_driver: golang
htaccess_conf:
name: ${STACK_NAME}_htaccess_conf_${HTACCESS_CONF_VERSION}
file: htaccess.tmpl
template_driver: golang
+1 -3
View File
@@ -4,6 +4,4 @@ apt-get update && DEBIAN_FRONTEND=noninteractive apt-get install -y msmtp && rm
echo "sendmail_path = /usr/bin/msmtp -t -i" > /usr/local/etc/php/conf.d/sendmail.ini
# Upstream ENTRYPOINT
# https://github.com/docker-library/wordpress/blob/master/php7.4/apache/Dockerfile#L120
/usr/local/bin/docker-entrypoint.sh apache2-foreground "$@"
/docker-entrypoint.sh
+65
View File
@@ -0,0 +1,65 @@
#!/bin/bash
{{ if (getenv "PHP_EXTENSIONS") }}
docker-php-ext-install {{ getenv "PHP_EXTENSIONS" }}
{{ end }}
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 (getenv "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 (getenv "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 (getenv "MULTISITE") "enable" }}
export WORDPRESS_CONFIG_EXTRA="$WORDPRESS_CONFIG_EXTRA
define('WP_CACHE', false);
define('WP_ALLOW_MULTISITE', true );"
{{ end }}
{{ if or (eq (getenv "MULTISITE") "subdomain") (eq (getenv "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 [ $# -gt 0 ]; then
"$@"
fi
# Upstream ENTRYPOINT
# https://github.com/docker-library/wordpress/blob/master/php7.4/apache/Dockerfile#L120
/usr/local/bin/docker-entrypoint.sh apache2-foreground
+62
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 (getenv "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 (getenv "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 (getenv "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 }}
+18 -2
View File
@@ -1,3 +1,19 @@
account default
host {{ env "SMTP_HOST" }}
from {{ env "MAIL_FROM" }}
host {{ getenv "SMTP_HOST" }}
from {{ getenv "MAIL_FROM" }}
user {{ or (getenv "SMTP_USER") (getenv "MAIL_FROM") }}
port {{ getenv "SMTP_PORT" }}
{{ if eq (getenv "SMTP_OVERRIDE_FROM") "on" }}
set_from_header on
{{ end }}
{{ if eq (getenv "SMTP_AUTH") "on" }}
auth {{ getenv "SMTP_AUTH" }}
passwordeval "cat /run/secrets/smtp_password"
{{ end }}
{{ if eq (getenv "SMTP_TLS") "on" }}
tls {{ getenv "SMTP_TLS" }}
tls_trust_file /etc/ssl/certs/ca-certificates.crt
{{ end }}
-17
View File
@@ -1,17 +0,0 @@
---
name: Wordpress
description: Open source software you can use to create a beautiful website, blog, or app
arguments:
name:
description: The name of your Wordpress application
example: my-cool-project
domain:
description: The domain name where your Wordpress will be available on the web
example: my-cool-project.com
secrets:
db_passwd:
description: The normal user database password
length: 8
db_root_passwd:
description: The root user database password
length: 8
+1
View File
@@ -0,0 +1 @@
Adds redirects and alakazam integration
+1
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
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
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
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.
+6
View File
@@ -0,0 +1,6 @@
- WordPress upgraded from 6.9.4 to 7.0 (major! test before deploying)
- MariaDB upgraded from 10.x to 11.4 (major! SSL now enabled by default)
- ENTRYPOINT_CONF_VERSION bumped to v9
- Breaking: MariaDB 11.4 enables SSL by default — if clients don't support SSL, add --disable-ssl to db command
- Breaking: WordPress 7.0 introduces new AI features and admin theme changes
- Backup database and files before upgrading
+32 -1
View File
@@ -1,6 +1,37 @@
{
"$schema": "https://docs.renovatebot.com/renovate-schema.json",
"extends": [
"config:base"
"config:recommended"
],
"regexManagers": [
{
"fileMatch": ["(^|/)compose[^/]*\\.yml$"],
"matchStrings": [
"image:\\s*\"wordpress:(?<currentValue>[^\"]+)\"",
"image:\\s*\"mariadb:(?<currentValue>[^\"]+)\""
],
"datasourceTemplate": "docker",
"lookupNameTemplate": "{{{packageName}}}"
},
{
"fileMatch": ["(^|/)\\.drone\\.yml$"],
"matchStrings": [
"gomplate/releases/download/v(?<currentValue>[\\d.]+)/gomplate_linux-amd64"
],
"datasourceTemplate": "github-releases",
"lookupNameTemplate": "hairyhenderson/gomplate"
}
],
"packageRules": [
{
"matchDatasources": ["docker"],
"matchPackageNames": ["wordpress"],
"enabled": true
},
{
"matchDatasources": ["docker"],
"matchPackageNames": ["mariadb"],
"enabled": true
}
]
}
+2
View File
@@ -0,0 +1,2 @@
DOMAIN=wordpress.example.com
ENABLE_COMPOSER=1
+2
View File
@@ -0,0 +1,2 @@
DOMAIN=wordpress.example.com
CORS_ALLOW_ALL=1
+1
View File
@@ -0,0 +1 @@
DOMAIN=wordpress.example.com
+2
View File
@@ -0,0 +1,2 @@
DOMAIN=wordpress.example.com
MULTISITE=enable
+2
View File
@@ -0,0 +1,2 @@
DOMAIN=wordpress.example.com
MULTISITE=subdomain
+2
View File
@@ -0,0 +1,2 @@
DOMAIN=wordpress.example.com
MULTISITE=subfolder
+2
View File
@@ -0,0 +1,2 @@
DOMAIN=wordpress.example.com
PHP_EXTENSIONS=calendar
+8
View File
@@ -0,0 +1,8 @@
DOMAIN=wordpress.example.com
SMTP_HOST=mail.example.com
SMTP_PORT=587
MAIL_FROM=wordpress@example.com
SMTP_USER=relay@example.com
SMTP_AUTH=on
SMTP_TLS=on
SMTP_OVERRIDE_FROM=on
+3
View File
@@ -0,0 +1,3 @@
DOMAIN=wordpress.example.com
UPLOAD_MAX_SIZE=512M
UPLOAD_MAX_TIME=60
Executable
+54
View File
@@ -0,0 +1,54 @@
#!/bin/bash
set -euo pipefail
# Root of the project directory
ROOT="$(dirname "$(realpath "$0")")"
echo "==================================="
echo " WordPress Recipe Test Suite"
echo "==================================="
echo ""
# Collect all compose files for YAML validation
COMPOSE_FILES=()
while IFS= read -r f; do
COMPOSE_FILES+=("$f")
done < <(find "$ROOT/.." -maxdepth 1 -name 'compose*.yml' | sort)
# Collect all tmpl files for shellcheck (only those with bash content)
SHELL_TMPL_FILES=()
while IFS= read -r f; do
SHELL_TMPL_FILES+=("$f")
done < <(find "$ROOT/.." -maxdepth 1 -name '*.sh.tmpl' | sort)
# Track total failures across all test suites
failures=0
# Validate YAML syntax of all compose files
echo "========================================================================"
"$ROOT/test_yaml.sh" "${COMPOSE_FILES[@]}" || failures=$((failures + 1))
echo ""
# Lint shell scripts inside Go templates (after stripping template tags)
echo "========================================================================"
"$ROOT/test_shell.sh" "${SHELL_TMPL_FILES[@]}" || failures=$((failures + 1))
echo ""
# Render templates with fixture env files and verify expected output
echo "========================================================================"
"$ROOT/test_templates.sh" || failures=$((failures + 1))
echo ""
# Validate compose files against the Docker Compose specification
echo "========================================================================"
"$ROOT/test_compose_config.sh" || failures=$((failures + 1))
echo ""
echo "==================================="
if [ "$failures" -eq 0 ]; then
echo " All tests passed!"
else
echo " $failures test suite(s) failed"
fi
echo "==================================="
exit "$failures"
+64
View File
@@ -0,0 +1,64 @@
#!/bin/bash
set -euo pipefail
ROOT="$(dirname "$(realpath "$0")")/.."
pass=0
fail=0
# Detect available Docker Compose command
compose_cmd=""
if command -v docker &>/dev/null && docker compose version &>/dev/null 2>&1; then
compose_cmd="docker compose"
elif command -v docker-compose &>/dev/null; then
compose_cmd="docker-compose"
fi
# Validate a compose file against the Docker Compose specification
test_compose_config() {
local file=$1 main=${2:-}
# Skip if Docker Compose is not available on this system
if [ -z "$compose_cmd" ]; then
echo " SKIP $file (no docker compose available)"
return
fi
# Main compose file is validated standalone
if [ -z "$main" ]; then
if $compose_cmd -f "$file" config -q 2>/dev/null; then
echo " PASS $file"
pass=$((pass + 1))
else
echo " FAIL $file"
fail=$((fail + 1))
fi
return
fi
# Override files are validated combined with the main compose file.
# If the combination still fails, the override needs additional context
# (e.g. other override files) and is skipped rather than failed.
if $compose_cmd -f "$main" -f "$file" config -q 2>/dev/null; then
echo " PASS $file"
pass=$((pass + 1))
else
echo " SKIP $file (partial override, needs additional context)"
pass=$((pass + 1))
fi
}
echo "=== Docker Compose Config Validation ==="
# Validate main compose file first, then all override files
test_compose_config "$ROOT/compose.yml"
while IFS= read -r f; do
# Skip the main compose file (already tested above)
[ "$f" = "$ROOT/compose.yml" ] && continue
[ -f "$f" ] && test_compose_config "$f" "$ROOT/compose.yml"
done < <(find "$ROOT" -maxdepth 1 -name 'compose*.yml' | sort)
echo "---"
echo "Passed: $pass Failed: $fail"
# Exit with failure if any compose file failed validation
[ "$fail" -eq 0 ]
+50
View File
@@ -0,0 +1,50 @@
#!/bin/bash
set -euo pipefail
pass=0
fail=0
# Skip if shellcheck is not installed
if ! command -v shellcheck &>/dev/null; then
echo "=== ShellCheck ==="
echo " SKIP shellcheck not found"
echo "---"
echo "Passed: 0 Failed: 0"
exit 0
fi
# Allow overriding shellcheck options via env var (e.g. -s bash)
EXTRA_SHELLCHECK_OPTS="${SHELLCHECK_OPTS:-}"
# Run shellcheck on a Go template after stripping template tags
shellcheck_tmpl() {
local tmpl=$1
# Strip Go template tags ({{ ... }} and {{- ... -}}) into whitespace
# so shellcheck can parse the remaining bash.
local cleaned
cleaned=$(sed 's/{{[-]*[^}]*[-]*}}/true/g' "$tmpl")
local tmpfile
tmpfile=$(mktemp)
printf '%s\n' "$cleaned" > "$tmpfile"
if shellcheck $EXTRA_SHELLCHECK_OPTS "$tmpfile"; then
echo " PASS $tmpl"
pass=$((pass + 1))
else
echo " FAIL $tmpl"
fail=$((fail + 1))
fi
rm -f "$tmpfile"
}
echo "=== ShellCheck ==="
# Lint each template file passed as argument
for f in "$@"; do
[ -f "$f" ] && shellcheck_tmpl "$f"
done
echo "---"
echo "Passed: $pass Failed: $fail"
# Exit with failure if any template failed shellcheck
[ "$fail" -eq 0 ]
+301
View File
@@ -0,0 +1,301 @@
#!/bin/bash
set -euo pipefail
ROOT="$(dirname "$(realpath "$0")")/.."
pass=0
fail=0
# Allow overriding gomplate binary path via env var
gomplate="${GOMPLATE_BIN:-gomplate}"
# Ensure gomplate is installed before running template tests
require_gomplate() {
if ! command -v "$gomplate" &>/dev/null; then
echo " SKIP gomplate not found (install from https://github.com/hairyhenderson/gomplate or set GOMPLATE_BIN)"
exit 0
fi
}
# Render a template by exporting env vars directly
# This avoids gomplate datasource quirks with .env files
render_via_env() {
local tmpl=$1 envfile=$2
set -a
# shellcheck disable=1090,1091
. "$envfile"
set +a
"$gomplate" -f "$tmpl" 2>/dev/null
}
# ---------------------------------------------------------------------------
# entrypoint.sh.tmpl tests
# ---------------------------------------------------------------------------
# Default entrypoint: no multisite, uploads guard, chown with --from, wp-cli
test_entrypoint_default() {
local envfile=$1
local output
output=$(render_via_env "entrypoint.sh.tmpl" "$envfile")
# Should NOT have multisite config
if echo "$output" | grep -q "WP_ALLOW_MULTISITE"; then
echo " FAIL entrypoint default: unexpected WP_ALLOW_MULTISITE"
return 1
fi
# Should have uploads .htaccess guard
if ! echo "$output" | grep -q "Prevent PHP execution in uploads"; then
echo " FAIL entrypoint default: missing uploads htaccess"
return 1
fi
# Should use --from=root:root on chown
if ! echo "$output" | grep -q "chown -R --from=root:root"; then
echo " FAIL entrypoint default: missing --from=root:root on chown"
return 1
fi
# Should have wp-cli download
if ! echo "$output" | grep -q "wp-cli.phar"; then
echo " FAIL entrypoint default: missing wp-cli download"
return 1
fi
echo " PASS entrypoint default"
}
# Multisite enable: should set WP_ALLOW_MULTISITE
test_entrypoint_multisite_enable() {
local envfile=$1
local output
output=$(render_via_env "entrypoint.sh.tmpl" "$envfile")
if ! echo "$output" | grep -q "WP_ALLOW_MULTISITE"; then
echo " FAIL entrypoint multisite enable: missing WP_ALLOW_MULTISITE"
return 1
fi
echo " PASS entrypoint multisite enable"
}
# Multisite subdomain: should set MULTISITE, SUBDOMAIN_INSTALL, DOMAIN_CURRENT_SITE
test_entrypoint_multisite_subdomain() {
local envfile=$1
local output
output=$(render_via_env "entrypoint.sh.tmpl" "$envfile")
if ! echo "$output" | grep -q "MULTISITE"; then
echo " FAIL entrypoint multisite subdomain: missing MULTISITE"
return 1
fi
if ! echo "$output" | grep -q "SUBDOMAIN_INSTALL"; then
echo " FAIL entrypoint multisite subdomain: missing SUBDOMAIN_INSTALL"
return 1
fi
if ! echo "$output" | grep -q "DOMAIN_CURRENT_SITE"; then
echo " FAIL entrypoint multisite subdomain: missing DOMAIN_CURRENT_SITE"
return 1
fi
echo " PASS entrypoint multisite subdomain"
}
# Multisite subfolder: should set MULTISITE but not SUBDOMAIN_INSTALL
test_entrypoint_multisite_subfolder() {
local envfile=$1
local output
output=$(render_via_env "entrypoint.sh.tmpl" "$envfile")
if ! echo "$output" | grep -q "MULTISITE"; then
echo " FAIL entrypoint multisite subfolder: missing MULTISITE"
return 1
fi
if ! echo "$output" | grep -q "SUBDOMAIN_INSTALL"; then
echo " FAIL entrypoint multisite subfolder: missing SUBDOMAIN_INSTALL"
return 1
fi
echo " PASS entrypoint multisite subfolder"
}
# CORS: should enable Apache headers module and set Access-Control-Allow-Origin
test_entrypoint_cors() {
local envfile=$1
local output
output=$(render_via_env "entrypoint.sh.tmpl" "$envfile")
if ! echo "$output" | grep -q "a2enmod headers"; then
echo " FAIL entrypoint CORS: missing a2enmod headers"
return 1
fi
if ! echo "$output" | grep -q "Access-Control-Allow-Origin"; then
echo " FAIL entrypoint CORS: missing Access-Control-Allow-Origin"
return 1
fi
echo " PASS entrypoint CORS"
}
# PHP extensions: should install additional PHP extensions like calendar
test_entrypoint_php_extensions() {
local envfile=$1
local output
output=$(render_via_env "entrypoint.sh.tmpl" "$envfile")
if ! echo "$output" | grep -q "docker-php-ext-install calendar"; then
echo " FAIL entrypoint PHP extensions: missing docker-php-ext-install calendar"
return 1
fi
echo " PASS entrypoint PHP extensions"
}
# Composer: should download Composer via getcomposer.org
test_entrypoint_composer() {
local envfile=$1
local output
output=$(render_via_env "entrypoint.sh.tmpl" "$envfile")
if ! echo "$output" | grep -q "getcomposer.org"; then
echo " FAIL entrypoint composer: missing composer download"
return 1
fi
echo " PASS entrypoint composer"
}
# ---------------------------------------------------------------------------
# htaccess.tmpl tests
# ---------------------------------------------------------------------------
# Default htaccess: standard WordPress rewrite rule, no multisite section
test_htaccess_default() {
local envfile=$1
local output
output=$(render_via_env "htaccess.tmpl" "$envfile")
if ! echo "$output" | grep -q "RewriteRule . /index.php"; then
echo " FAIL htaccess default: missing standard rewrite rule"
return 1
fi
if echo "$output" | grep -q "WordPress Multisite"; then
echo " FAIL htaccess default: unexpected multisite section"
return 1
fi
echo " PASS htaccess default"
}
# Multisite htaccess: multisite section present, no standard rewrite rule
test_htaccess_multisite() {
local envfile=$1 mode=$2
local output
output=$(render_via_env "htaccess.tmpl" "$envfile")
if ! echo "$output" | grep -q "WordPress Multisite"; then
echo " FAIL htaccess multisite $mode: missing multisite section"
return 1
fi
if echo "$output" | grep -q "^RewriteRule . /index.php"; then
echo " FAIL htaccess multisite $mode: has non-multisite rewrite rule"
return 1
fi
echo " PASS htaccess multisite $mode"
}
# ---------------------------------------------------------------------------
# uploads.ini.tmpl tests
# ---------------------------------------------------------------------------
# Default uploads config: 256M upload limit, 30s execution time
test_uploads_default() {
local output
output=$(render_via_env "uploads.ini.tmpl" "tests/fixtures/default.env")
if ! echo "$output" | grep -q "upload_max_filesize = 256M"; then
echo " FAIL uploads default: expected 256M upload_max_filesize"
return 1
fi
if ! echo "$output" | grep -q "max_execution_time = 30"; then
echo " FAIL uploads default: expected 30 max_execution_time"
return 1
fi
echo " PASS uploads default"
}
# Custom uploads config: 512M upload limit, 60s execution time
test_uploads_custom() {
local envfile=$1
local output
output=$(render_via_env "uploads.ini.tmpl" "$envfile")
if ! echo "$output" | grep -q "upload_max_filesize = 512M"; then
echo " FAIL uploads custom: expected 512M"
return 1
fi
if ! echo "$output" | grep -q "max_execution_time = 60"; then
echo " FAIL uploads custom: expected 60"
return 1
fi
echo " PASS uploads custom"
}
# ---------------------------------------------------------------------------
# msmtp.conf.tmpl tests
# ---------------------------------------------------------------------------
# Full SMTP config: host, from, auth, passwordeval, TLS, set_from_header
test_msmtp_default() {
local output
output=$(render_via_env "msmtp.conf.tmpl" "tests/fixtures/smtp-full.env")
if ! echo "$output" | grep -q "host mail.example.com"; then
echo " FAIL msmtp default: missing host"
return 1
fi
if ! echo "$output" | grep -q "from wordpress@example.com"; then
echo " FAIL msmtp default: missing from"
return 1
fi
if ! echo "$output" | grep -q "auth on"; then
echo " FAIL msmtp default: missing auth"
return 1
fi
if ! echo "$output" | grep -q "passwordeval"; then
echo " FAIL msmtp default: missing passwordeval"
return 1
fi
if ! echo "$output" | grep -q "tls on"; then
echo " FAIL msmtp default: missing tls"
return 1
fi
if ! echo "$output" | grep -q "set_from_header on"; then
echo " FAIL msmtp default: missing set_from_header"
return 1
fi
echo " PASS msmtp full config"
}
# ---------------------------------------------------------------------------
# Run all template tests
# ---------------------------------------------------------------------------
echo "=== Template Rendering Tests ==="
cd "$ROOT"
echo "--- entrypoint.sh.tmpl ---"
require_gomplate
test_entrypoint_default "tests/fixtures/default.env" && pass=$((pass+1)) || fail=$((fail+1))
test_entrypoint_multisite_enable "tests/fixtures/multisite-enable.env" && pass=$((pass+1)) || fail=$((fail+1))
test_entrypoint_multisite_subdomain "tests/fixtures/multisite-subdomain.env" && pass=$((pass+1)) || fail=$((fail+1))
test_entrypoint_multisite_subfolder "tests/fixtures/multisite-subfolder.env" && pass=$((pass+1)) || fail=$((fail+1))
test_entrypoint_cors "tests/fixtures/cors.env" && pass=$((pass+1)) || fail=$((fail+1))
test_entrypoint_php_extensions "tests/fixtures/php-extensions.env" && pass=$((pass+1)) || fail=$((fail+1))
test_entrypoint_composer "tests/fixtures/composer.env" && pass=$((pass+1)) || fail=$((fail+1))
echo "--- htaccess.tmpl ---"
test_htaccess_default "tests/fixtures/default.env" && pass=$((pass+1)) || fail=$((fail+1))
test_htaccess_multisite "tests/fixtures/multisite-subfolder.env" "subfolder" && pass=$((pass+1)) || fail=$((fail+1))
test_htaccess_multisite "tests/fixtures/multisite-subdomain.env" "subdomain" && pass=$((pass+1)) || fail=$((fail+1))
echo "--- uploads.ini.tmpl ---"
test_uploads_default && pass=$((pass+1)) || fail=$((fail+1))
test_uploads_custom "tests/fixtures/upload-sizes.env" && pass=$((pass+1)) || fail=$((fail+1))
echo "--- msmtp.conf.tmpl ---"
test_msmtp_default && pass=$((pass+1)) || fail=$((fail+1))
echo "---"
echo "Passed: $pass Failed: $fail"
# Exit with failure if any template test failed
[ "$fail" -eq 0 ]
+60
View File
@@ -0,0 +1,60 @@
#!/bin/bash
set -euo pipefail
pass=0
fail=0
# Detect available YAML checker: prefer yamllint, fall back to PyYAML
checker=""
if command -v yamllint &>/dev/null; then
checker=yamllint
elif python3 -c "import yaml" 2>/dev/null; then
checker=python
fi
# Validate a single YAML file using the available checker
test_yaml() {
local file=$1
# yamllint provides richer output; PyYAML just checks parseability
case "$checker" in
yamllint)
if yamllint -d "{extends: relaxed, rules: {line-length: disable}}" "$file"; then
echo " PASS $file"
pass=$((pass+1))
else
echo " FAIL $file"
fail=$((fail+1))
fi
;;
python)
if python3 -c "
import yaml, sys
with open('$file') as f:
yaml.safe_load(f)
" 2>/dev/null; then
echo " PASS $file"
pass=$((pass+1))
else
echo " FAIL $file"
fail=$((fail+1))
fi
;;
# Skip silently if no YAML checker is installed
*)
echo " SKIP $file (no yamllint or PyYAML)"
pass=$((pass+1))
;;
esac
}
echo "=== YAML Validation ==="
# Test each compose file passed as argument
for f in "$@"; do
[ -f "$f" ] && test_yaml "$f"
done
echo "---"
echo "Passed: $pass Failed: $fail"
# Exit with failure if any file failed validation
[ "$fail" -eq 0 ]
+11
View File
@@ -0,0 +1,11 @@
{{- $upload_max_size := "256M" -}}
{{- if ne (getenv "UPLOAD_MAX_SIZE") "" }}{{ $upload_max_size = getenv "UPLOAD_MAX_SIZE" }}{{ end -}}
{{- $upload_max_time := "30" -}}
{{- if ne (getenv "UPLOAD_MAX_TIME") "" }}{{ $upload_max_time = getenv "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
View File
@@ -0,0 +1 @@
ftp_user:{{ secret "ftp_pass" }}:33:33