From f60218d2657fabbfebf7ed4f23eae23908e34c83 Mon Sep 17 00:00:00 2001 From: Emad Rad Date: Wed, 27 Nov 2024 11:49:13 +0330 Subject: [PATCH] feat: wordpress instance management --- .github/workflows/release.yml | 2 +- .github/workflows/test.yml | 11 +- CHANGELOG.md | 9 ++ README.rst | 97 ++++++++----- images/openedx-sync-plugin-settings.png | Bin 44490 -> 45226 bytes setup.py | 18 +-- tutorwordpress/patches/caddyfile | 5 + tutorwordpress/patches/k8s-deployments | 51 +++++++ tutorwordpress/patches/k8s-jobs | 21 +++ tutorwordpress/patches/k8s-services | 13 ++ tutorwordpress/patches/k8s-volumes | 14 ++ .../local-docker-compose-caddy-aliases | 1 + .../patches/local-docker-compose-dev-services | 11 ++ .../local-docker-compose-jobs-services | 7 + .../patches/local-docker-compose-services | 16 +++ tutorwordpress/plugin.py | 135 ++++++++++++++++-- .../wordpress/build/wordpress/Dockerfile | 30 ++++ .../templates/wordpress/tasks/mysql/init.sh | 4 + 18 files changed, 388 insertions(+), 57 deletions(-) create mode 100644 tutorwordpress/patches/caddyfile create mode 100644 tutorwordpress/patches/k8s-deployments create mode 100644 tutorwordpress/patches/k8s-jobs create mode 100644 tutorwordpress/patches/k8s-services create mode 100644 tutorwordpress/patches/k8s-volumes create mode 100644 tutorwordpress/patches/local-docker-compose-caddy-aliases create mode 100644 tutorwordpress/patches/local-docker-compose-dev-services create mode 100644 tutorwordpress/patches/local-docker-compose-jobs-services create mode 100644 tutorwordpress/patches/local-docker-compose-services create mode 100644 tutorwordpress/templates/wordpress/build/wordpress/Dockerfile create mode 100644 tutorwordpress/templates/wordpress/tasks/mysql/init.sh diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 5eebcda..d1dec62 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -25,7 +25,7 @@ jobs: # https://github.com/actions/setup-python uses: actions/setup-python@v5 with: - python-version: 3.8 + python-version: 3.9 cache: "pip" - name: Upgrade pip and setuptools # https://pypi.org/project/pip/ diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 0049a5d..31fcb21 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -9,7 +9,7 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - python-version: ['3.8', '3.12'] + python-version: ['3.7', '3.12'] steps: - uses: actions/checkout@v4 - name: Set up Python ${{ matrix.python-version }} @@ -20,6 +20,15 @@ jobs: run: python -m pip install --upgrade pip - name: Install dependencies run: | + if [ "${{ matrix.python-version }}" = "3.7" ]; then + pip install "tutor==15.0.0" pylint black mypy types-setuptools + else + pip install -U tutor + fi + echo "Installing tutor-contrib-wordpress" pip install .[dev] + echo "Enable wordpress plugin and save configuration" + tutor plugins enable wordpress + tutor config save - name: Test lint, types, and format run: make test diff --git a/CHANGELOG.md b/CHANGELOG.md index 1bcf62a..fce434d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,13 @@ + +## v1.1.0 (2024-11-27) + +- [Feature] Added comprehensive WordPress integration for Open edX including: + - Full WordPress installation and configuration management + - Integration with Open edX Commerce WordPress Plugin and WooCommerce + - Configurable WordPress settings including version, host, ports, and database options + (by @CodeWithEmad) + ## v1.0.1 (2024-07-27) diff --git a/README.rst b/README.rst index e572c28..9459160 100644 --- a/README.rst +++ b/README.rst @@ -10,28 +10,23 @@ WordPress Plugin for `Tutor`_ :target: https://www.gnu.org/licenses/agpl-3.0.en.html Overview --------- +******** -This is a `Tutor`_ plugin for integrating the `Open edX Commerce WordPress Plugin`_ with your Open edX instance. -The plugin allows seamless synchronization and interaction between your WordPress site and Open edX platform, -providing a cohesive e-commerce experience. If you don't know how to install the WordPress plugin, check out -this `installation guide`_. +This is a `Tutor`_ plugin that provides complete WordPress integration with your Open edX instance. It includes: -Before you start ----------------- +- Full WordPress installation and management +- Integration with the `Open edX Commerce WordPress Plugin`_ -This plugin does **not** create or manage a WordPress instance at the moment. It is designed to assist with the -configuration and integration of the Open edX platform with an existing WordPress site. If you need this feature, -feel free to open an issue or better yet, a PR. +If you need help installing the WordPress plugin, check out this `installation guide`_. Prerequisites -------------- +************* -- A running WordPress site with the `Open edX Commerce WordPress Plugin`_ installed. -- Installation of Tutor version >= 15.0.0. +- Installation of Tutor version >= 15.0.0 +- MySQL database (can use the same one as Open edX) Installation ------------- +************ Ensure you are using Tutor v15+ (Olive onwards). First, install the plugin by running: @@ -51,59 +46,95 @@ Alternatively, if you already have a running Open edX instance, just run the nec .. code-block:: bash tutor dev|local|k8s do init --limit=wordpress + tutor dev|local|k8s start wordpress Configuration -------------- +************* -Inside your WordPress admin panel, you will need to configure the following values: +The plugin automatically installs WordPress with the Open edX Commerce and Woocommerce plugins. Inside your WordPress +admin panel, go to Settings -> Open edX Sync plugin, and configure: - **Open edX Domain** - **Client ID** - **Client Secret** +To verify the connection, click on "Generate JWT Token". If the process is successful, a new token will be generated. + .. image:: https://raw.githubusercontent.com/codewithemad/tutor-contrib-wordpress/master/images/openedx-sync-plugin-settings.png :alt: Open edX Sync Plugin Settings in your WordPress Settings - You can retrieve these configuration values by running: .. code-block:: bash - tutor wordpress config + tutor dev|local|k8s do wordpress config +This command will output the current configurations, including the Client ID, Client Secret, Open edX Domain, +and WordPress Domain. Here is an example of the output: .. code-block:: text =============================================== - WordPress Plugin Configurations + WordPress Plugin Configurations =============================================== - Open edX Domain: http://local.edly.io - Client ID: qjCayDktffXrU09N17NrslKyWQ2EwzWn - Client ID (dev): JDx6Uy0hN67VUfacxKcLyYQz7HK9liVx - Client Secret: P4w82huaZQdyz4qolknsIHYneGEoIggc + Client ID: vvpTamiepPwjZhr0uOQGr5PhYBzp2hQw + Client ID (dev): MlbXk1V3wB7nWPAAyLF3McyfBBMqExa4 + Client Secret: MdrgbtU8Q94He3gejF6Zf5MDookoeozO + Open edX Domain: http://local.edly.io:8000 + Wordpress Domain: http://site.local.edly.io:8080 -Or by using Tutor to print them individually: +Variables +********* -.. code-block:: bash +The plugin supports the following configuration variables: + +- ``WORDPRESS_VERSION``: Plugin version +- ``WORDPRESS_HOST``: WordPress site hostname +- ``WORDPRESS_PORT``: WordPress port (default: 8080) +- ``WORDPRESS_DOCKER_IMAGE``: Docker image for WordPress +- ``WORDPRESS_OPENEDX_PLUGIN``: URL to the Open edX Commerce plugin +- ``WORDPRESS_WOOCOMMERCE_PLUGIN``: (default: "https://downloads.wordpress.org/plugin/woocommerce.9.4.2.zip") + The WooCommerce plugin zip file URL. You can specify a different version if needed. +- ``WORDPRESS_OFFICIAL_IMAGE``: (default: "wordpress:6.7.1-php8.1") + The official WordPress Docker image used as the base for building the plugin's custom image. + This image includes PHP and Apache server. You can specify a different version or PHP variant + if needed. + +Database Settings +================= + +- ``WORDPRESS_MYSQL_HOST``: MySQL host +- ``WORDPRESS_MYSQL_PORT``: MySQL port +- ``WORDPRESS_MYSQL_DATABASE``: Database name (default: wordpress) +- ``WORDPRESS_MYSQL_USERNAME``: Database username +- ``WORDPRESS_MYSQL_PASSWORD``: Database password (auto-generated) +- ``WORDPRESS_TABLE_PREFIX``: Table prefix (default: wp_) - tutor config printvalue LMS_HOST - tutor config printvalue WORDPRESS_OAUTH2_SECRET - tutor config printvalue WORDPRESS_OAUTH2_KEY_SSO - tutor config printvalue WORDPRESS_OAUTH2_KEY_SSO_DEV +Storage Settings +================ + +- ``WORDPRESS_DATA_VOLUME_SIZE``: Size of WordPress persistent volume (default: 5Gi) + +OAuth2 Settings +=============== + +- ``WORDPRESS_OAUTH2_SECRET``: OAuth2 secret key (auto-generated) +- ``WORDPRESS_OAUTH2_KEY_SSO``: OAuth2 client ID (auto-generated) +- ``WORDPRESS_OAUTH2_KEY_SSO_DEV``: OAuth2 development client ID (auto-generated) Contributing ------------- +************ -We welcome all contributions! Feel free to open a Pull Request. +We welcome all contributions! Feel free to open a Pull Request or an Issue. License -------- +******* This software is licensed under the terms of the `AGPLv3`_. .. _Tutor: https://docs.tutor.edly.io -.. _installation guide: https://docs.openedx.org/projects/wordpress-ecommerce-plugin/en/latest/plugin_quickstart.html .. _Open edX Commerce WordPress Plugin: https://github.com/openedx/openedx-wordpress-ecommerce .. _AGPLv3: https://github.com/codewithemad/tutor-contrib-wordpress/blob/master/LICENSE.txt +.. _installation guide: https://docs.openedx.org/projects/wordpress-ecommerce-plugin/en/latest/plugin_quickstart.html diff --git a/images/openedx-sync-plugin-settings.png b/images/openedx-sync-plugin-settings.png index 9a4726abecf6cff39855b071f96dd8f1f85d4197..9e224d95798d9d75b1e0e8b2904b2a3ed10e712f 100644 GIT binary patch literal 45226 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%0Ab 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 literal 44490 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 diff --git a/setup.py b/setup.py index 4fae30f..c3e2feb 100644 --- a/setup.py +++ b/setup.py @@ -36,29 +36,29 @@ def load_about(): license="AGPLv3", author="Emad Rad", author_email="codewithemad@gmail.com", - description="Tutor plugin for WooCommerce", + description="Tutor plugin for WordPress.", long_description=load_readme(), long_description_content_type="text/x-rst", packages=find_packages(exclude=["tests*"]), include_package_data=True, - python_requires=">=3.8", - install_requires=["tutor>=14.0.0,<19.0.0"], + python_requires=">=3.7", + install_requires=[ + "tutor>=15.0.0,<19.0.0", + "importlib_resources", # for older versions of tutor + ], extras_require={ "dev": [ - "tutor[dev]>=14.0.0,<19.0.0", - ] - }, - entry_points={ - "tutor.plugin.v1": [ - "wordpress = tutorwordpress.plugin" + "tutor[dev]>=15.0.0,<19.0.0", ] }, + entry_points={"tutor.plugin.v1": ["wordpress = tutorwordpress.plugin"]}, classifiers=[ "Development Status :: 3 - Alpha", "Intended Audience :: Developers", "License :: OSI Approved :: GNU Affero General Public License v3", "Operating System :: OS Independent", "Programming Language :: Python", + "Programming Language :: Python :: 3.7", "Programming Language :: Python :: 3.8", "Programming Language :: Python :: 3.9", "Programming Language :: Python :: 3.10", diff --git a/tutorwordpress/patches/caddyfile b/tutorwordpress/patches/caddyfile new file mode 100644 index 0000000..b5de133 --- /dev/null +++ b/tutorwordpress/patches/caddyfile @@ -0,0 +1,5 @@ +# WordPress +{{ WORDPRESS_HOST }}{$default_site_port} { + + import proxy "wordpress:{{ WORDPRESS_PORT }}" +} diff --git a/tutorwordpress/patches/k8s-deployments b/tutorwordpress/patches/k8s-deployments new file mode 100644 index 0000000..ead8451 --- /dev/null +++ b/tutorwordpress/patches/k8s-deployments @@ -0,0 +1,51 @@ +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: wordpress + labels: + app.kubernetes.io/name: wordpress +spec: + selector: + matchLabels: + app.kubernetes.io/name: wordpress + template: + metadata: + labels: + app.kubernetes.io/name: wordpress + spec: + initContainers: + - name: init-wordpress + image: {{ WORDPRESS_DOCKER_IMAGE }} + command: ['sh', '-c', 'chown -R www-data:www-data /var/www/html/wp-content'] + volumeMounts: + - name: wordpress-data + mountPath: /var/www/html/wp-content + securityContext: + runAsUser: 0 + containers: + - name: wordpress + image: {{ WORDPRESS_DOCKER_IMAGE }} + ports: + - containerPort: 8080 + env: + - name: WORDPRESS_DB_HOST + value: {{ WORDPRESS_MYSQL_HOST }} + - name: WORDPRESS_DB_USER + value: {{ WORDPRESS_MYSQL_USERNAME }} + - name: WORDPRESS_DB_PASSWORD + value: {{ WORDPRESS_MYSQL_PASSWORD }} + - name: WORDPRESS_DB_NAME + value: {{ WORDPRESS_MYSQL_DATABASE }} + - name: WORDPRESS_TABLE_PREFIX + value: {{ WORDPRESS_TABLE_PREFIX }} + volumeMounts: + - name: wordpress-data + mountPath: /var/www/html/wp-content + securityContext: + runAsUser: 33 + runAsGroup: 33 + volumes: + - name: wordpress-data + persistentVolumeClaim: + claimName: wordpress-data diff --git a/tutorwordpress/patches/k8s-jobs b/tutorwordpress/patches/k8s-jobs new file mode 100644 index 0000000..baad901 --- /dev/null +++ b/tutorwordpress/patches/k8s-jobs @@ -0,0 +1,21 @@ +--- +apiVersion: batch/v1 +kind: Job +metadata: + name: wordpress-job + labels: + app.kubernetes.io/component: job +spec: + template: + spec: + restartPolicy: Never + containers: + - name: wordpress + image: {{ WORDPRESS_DOCKER_IMAGE }} + volumeMounts: + - name: wordpress-data + mountPath: /var/www/html/wp-content + volumes: + - name: wordpress-data + persistentVolumeClaim: + claimName: wordpress-data diff --git a/tutorwordpress/patches/k8s-services b/tutorwordpress/patches/k8s-services new file mode 100644 index 0000000..2387e5a --- /dev/null +++ b/tutorwordpress/patches/k8s-services @@ -0,0 +1,13 @@ +--- +apiVersion: v1 +kind: Service +metadata: + name: wordpress +spec: + type: ClusterIP + ports: + - port: {{ WORDPRESS_PORT }} + targetPort: 8080 + protocol: TCP + selector: + app.kubernetes.io/name: wordpress diff --git a/tutorwordpress/patches/k8s-volumes b/tutorwordpress/patches/k8s-volumes new file mode 100644 index 0000000..90bafcb --- /dev/null +++ b/tutorwordpress/patches/k8s-volumes @@ -0,0 +1,14 @@ +--- +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + name: wordpress-data + labels: + app.kubernetes.io/component: volume + app.kubernetes.io/name: wordpress-data +spec: + accessModes: + - ReadWriteOnce + resources: + requests: + storage: {{ WORDPRESS_DATA_VOLUME_SIZE }} diff --git a/tutorwordpress/patches/local-docker-compose-caddy-aliases b/tutorwordpress/patches/local-docker-compose-caddy-aliases new file mode 100644 index 0000000..ab50070 --- /dev/null +++ b/tutorwordpress/patches/local-docker-compose-caddy-aliases @@ -0,0 +1 @@ +- "{{ WORDPRESS_HOST }}" diff --git a/tutorwordpress/patches/local-docker-compose-dev-services b/tutorwordpress/patches/local-docker-compose-dev-services new file mode 100644 index 0000000..6d08116 --- /dev/null +++ b/tutorwordpress/patches/local-docker-compose-dev-services @@ -0,0 +1,11 @@ +wordpress: + stdin_open: true + tty: true + ports: + - {{ WORDPRESS_PORT }}:8080 + environment: + WORDPRESS_DEBUG: 1 + WORDPRESS_CONFIG_EXTRA: | + define('WP_DEBUG', true); + define('WP_DEBUG_LOG', true); + define('WP_DEBUG_DISPLAY', true); diff --git a/tutorwordpress/patches/local-docker-compose-jobs-services b/tutorwordpress/patches/local-docker-compose-jobs-services new file mode 100644 index 0000000..03d85b3 --- /dev/null +++ b/tutorwordpress/patches/local-docker-compose-jobs-services @@ -0,0 +1,7 @@ +wordpress-job: + image: {{ WORDPRESS_DOCKER_IMAGE }} + volumes: + - ../../data/wordpress:/var/www/html/wp-content + depends_on: + - lms + {% if RUN_MYSQL %}- mysql{% endif %} diff --git a/tutorwordpress/patches/local-docker-compose-services b/tutorwordpress/patches/local-docker-compose-services new file mode 100644 index 0000000..63309d6 --- /dev/null +++ b/tutorwordpress/patches/local-docker-compose-services @@ -0,0 +1,16 @@ +wordpress: + image: {{ WORDPRESS_DOCKER_IMAGE }} + restart: unless-stopped + environment: + WORDPRESS_DB_HOST: {{ WORDPRESS_MYSQL_HOST }} + WORDPRESS_DB_USER: {{ WORDPRESS_MYSQL_USERNAME }} + WORDPRESS_DB_PASSWORD: {{ WORDPRESS_MYSQL_PASSWORD }} + WORDPRESS_DB_NAME: {{ WORDPRESS_MYSQL_DATABASE }} + WORDPRESS_TABLE_PREFIX: {{ WORDPRESS_TABLE_PREFIX }} + volumes: + - ../../data/wordpress/wp-content:/var/www/html/wp-content + {%- if RUN_MYSQL %} + depends_on: + - mysql + {% endif -%} + diff --git a/tutorwordpress/plugin.py b/tutorwordpress/plugin.py index 03c3d12..9721047 100644 --- a/tutorwordpress/plugin.py +++ b/tutorwordpress/plugin.py @@ -1,32 +1,59 @@ from __future__ import annotations +from glob import glob import os import sys +import typing as t import click -from tutor import fmt, hooks, config as tutor_config +from tutor import fmt, hooks as tutor_hooks, config as tutor_config +from tutor.__about__ import __version_suffix__ from .__about__ import __version__ +# Support for older Python versions if sys.version_info >= (3, 9): - from importlib.resources import files as importlib_resources_files + import importlib_resources else: import pkg_resources +# Handle version suffix in nightly mode, just like tutor core +if __version_suffix__: + __version__ += "-" + __version_suffix__ + ############### # CONFIGURATION ############### -hooks.Filters.CONFIG_DEFAULTS.add_items( +tutor_hooks.Filters.CONFIG_DEFAULTS.add_items( [ - # Add your new settings that have default values here. - # Each new setting is a pair: (setting_name, default_value). - # Prefix your setting names with 'WORDPRESS_'. ("WORDPRESS_VERSION", __version__), + ("WORDPRESS_HOST", "site.{{ LMS_HOST }}"), + ("WORDPRESS_PORT", "8080"), + # https://hub.docker.com/_/wordpress/ + ("WORDPRESS_OFFICIAL_IMAGE", "wordpress:6.7.1-php8.1"), + ( + "WORDPRESS_DOCKER_IMAGE", + "docker.io/codewithemad/tutor-wordpress:{{ WORDPRESS_VERSION }}", + ), + ("WORDPRESS_MYSQL_HOST", "{{ MYSQL_HOST }}"), + ("WORDPRESS_MYSQL_PORT", "{{ MYSQL_PORT }}"), + ("WORDPRESS_MYSQL_DATABASE", "wordpress"), + ("WORDPRESS_MYSQL_USERNAME", "wordpress"), + ("WORDPRESS_TABLE_PREFIX", "wp_"), + ("WORDPRESS_DATA_VOLUME_SIZE", "5Gi"), + ( + "WORDPRESS_OPENEDX_PLUGIN", + "https://github.com/openedx/openedx-wordpress-ecommerce/releases/download/v2.0.7/openedx-commerce.zip", + ), + ( + "WORDPRESS_WOOCOMMERCE_PLUGIN", + "https://downloads.wordpress.org/plugin/woocommerce.9.4.2.zip", + ), ] ) -hooks.Filters.CONFIG_UNIQUE.add_items( +tutor_hooks.Filters.CONFIG_UNIQUE.add_items( [ # Add settings that don't have a reasonable default for all users here. # For instance: passwords, secret keys, etc. @@ -35,6 +62,7 @@ ("WORDPRESS_OAUTH2_SECRET", "{{ 32|random_string }}"), ("WORDPRESS_OAUTH2_KEY_SSO", "{{ 32|random_string }}"), ("WORDPRESS_OAUTH2_KEY_SSO_DEV", "{{ 32|random_string }}"), + ("WORDPRESS_MYSQL_PASSWORD", "{{ 32|random_string }}"), ] ) @@ -44,13 +72,14 @@ MY_INIT_TASKS: list[tuple[str, tuple[str, ...]]] = [ ("lms", ("wordpress", "tasks", "lms", "init.sh")), + ("mysql", ("wordpress", "tasks", "mysql", "init.sh")), ] def get_template_full_path(package_name: str, *template_path: str) -> str: if sys.version_info >= (3, 9): return str( - importlib_resources_files(package_name) + importlib_resources.files(package_name) / os.path.join("templates", *template_path) ) else: @@ -62,7 +91,78 @@ def get_template_full_path(package_name: str, *template_path: str) -> str: full_path: str = get_template_full_path("tutorwordpress", *template_path) with open(full_path, encoding="utf-8") as init_task_file: init_task: str = init_task_file.read() - hooks.Filters.CLI_DO_INIT_TASKS.add_item((service, init_task)) + tutor_hooks.Filters.CLI_DO_INIT_TASKS.add_item((service, init_task)) + + +######################### +# DOCKER IMAGE MANAGEMENT +######################### + +tutor_hooks.Filters.IMAGES_BUILD.add_item( + ( + "wordpress", + ("plugins", "wordpress", "build", "wordpress"), + "{{ WORDPRESS_DOCKER_IMAGE }}", + (), + ) +) +tutor_hooks.Filters.IMAGES_PULL.add_items( + [ + ( + "wordpress", + "{{ WORDPRESS_DOCKER_IMAGE }}", + ), + ] +) +tutor_hooks.Filters.IMAGES_PUSH.add_item( + ( + "wordpress", + "{{ WORDPRESS_DOCKER_IMAGE }}", + ) +) + +#################### +# TEMPLATE RENDERING +#################### + +tutor_hooks.Filters.ENV_TEMPLATE_ROOTS.add_items( + # Root paths for template files, relative to the project root. + [ + str(get_template_full_path("tutorwordpress", "")), + ] +) + +tutor_hooks.Filters.ENV_TEMPLATE_TARGETS.add_items( + # For each pair (source_path, destination_path): + # templates at ``source_path`` (relative to your ENV_TEMPLATE_ROOTS) will be + # rendered to ``source_path/destination_path`` (relative to your Tutor environment). + # For example, ``tutorwordpress/templates/wordpress/build`` + # will be rendered to ``$(tutor config printroot)/env/plugins/wordpress/build``. + [ + ("wordpress/build", "plugins"), + ("wordpress/apps", "plugins"), + ], +) + + +################ +# PATCH LOADING +################ + +# For each file in tutorwordpress/patches, +# apply a patch based on the file's name and contents. +if sys.version_info >= (3, 9): + glob_pattern = str(importlib_resources.files("tutorwordpress") / "patches" / "*") +else: + glob_pattern = os.path.join( + pkg_resources.resource_filename("tutorwordpress", "patches"), "*" + ) + +for path in glob(glob_pattern): + with open(path, encoding="utf-8") as patch_file: + tutor_hooks.Filters.ENV_PATCHES.add_item( + (os.path.basename(path), patch_file.read()) + ) ##################### # CUSTOM CLI COMMANDS @@ -74,7 +174,7 @@ def wordpress() -> None: pass -hooks.Filters.CLI_COMMANDS.add_item(wordpress) +tutor_hooks.Filters.CLI_COMMANDS.add_item(wordpress) @wordpress.command() @@ -84,13 +184,22 @@ def config(context: click.Context) -> None: Print out the configurations used in WordPress plugin. """ config = tutor_config.load(context.obj.root) - protocol = "https" if config["ENABLE_HTTPS"] else "http" + https_enabled = config["ENABLE_HTTPS"] + protocol = "https" if https_enabled else "http" lms_host = f"{protocol}://{config['LMS_HOST']}" + wordpress_host = f"{protocol}://{config['WORDPRESS_HOST']}" + if not https_enabled: + lms_host += ":8000" + wordpress_host += f":{config['WORDPRESS_PORT']}" + click.echo(fmt.title("WordPress Plugin Configurations")) - fmt.echo_info( + info_text = ( "\n" - f"Open edX Domain: {lms_host} \n" f"Client ID: {config['WORDPRESS_OAUTH2_KEY_SSO']} \n" f"Client ID (dev): {config['WORDPRESS_OAUTH2_KEY_SSO_DEV']} \n" f"Client Secret: {config['WORDPRESS_OAUTH2_SECRET']} \n" + "\n" + f"Open edX Domain: {lms_host} \n" + f"Wordpress Domain: {wordpress_host}" ) + fmt.echo_info(info_text) diff --git a/tutorwordpress/templates/wordpress/build/wordpress/Dockerfile b/tutorwordpress/templates/wordpress/build/wordpress/Dockerfile new file mode 100644 index 0000000..40857ba --- /dev/null +++ b/tutorwordpress/templates/wordpress/build/wordpress/Dockerfile @@ -0,0 +1,30 @@ +# Use the official WordPress image +FROM {{ WORDPRESS_OFFICIAL_IMAGE }} + +# Install necessary utilities +RUN apt-get update && \ + apt-get install -y wget unzip && \ + rm -rf /var/lib/apt/lists/* + +# Download and install WooCommerce +RUN wget {{ WORDPRESS_WOOCOMMERCE_PLUGIN }} -O /tmp/woocommerce.zip && \ + unzip -o /tmp/woocommerce.zip -d /usr/src/wordpress/wp-content/plugins/ && \ + rm /tmp/woocommerce.zip + +# Download and install the OpenEdX WordPress plugin +RUN wget {{ WORDPRESS_OPENEDX_PLUGIN }} -O /tmp/openedx-commerce.zip && \ + unzip -o /tmp/openedx-commerce.zip -d /usr/src/wordpress/wp-content/plugins/ && \ + rm /tmp/openedx-commerce.zip + +# Set proper permissions +RUN chown -R www-data:www-data /usr/src/wordpress/wp-content/plugins/ + +# Clean up +RUN apt-get purge -y wget unzip && \ + apt-get autoremove -y + +# Add ServerName directive to suppress Apache warning +RUN echo "ServerName localhost" >> /etc/apache2/apache2.conf + +# Configure Apache to listen on port 8080 +RUN sed -i 's/80/8080/g' /etc/apache2/ports.conf /etc/apache2/sites-available/000-default.conf diff --git a/tutorwordpress/templates/wordpress/tasks/mysql/init.sh b/tutorwordpress/templates/wordpress/tasks/mysql/init.sh new file mode 100644 index 0000000..0857f03 --- /dev/null +++ b/tutorwordpress/templates/wordpress/tasks/mysql/init.sh @@ -0,0 +1,4 @@ +mysql -u {{ MYSQL_ROOT_USERNAME }} --password="{{ MYSQL_ROOT_PASSWORD }}" --host "{{ MYSQL_HOST }}" --port {{ MYSQL_PORT }} -e "CREATE DATABASE IF NOT EXISTS {{ WORDPRESS_MYSQL_DATABASE }};" +mysql -u {{ MYSQL_ROOT_USERNAME }} --password="{{ MYSQL_ROOT_PASSWORD }}" --host "{{ MYSQL_HOST }}" --port {{ MYSQL_PORT }} -e "CREATE USER IF NOT EXISTS '{{ WORDPRESS_MYSQL_USERNAME }}';" +mysql -u {{ MYSQL_ROOT_USERNAME }} --password="{{ MYSQL_ROOT_PASSWORD }}" --host "{{ MYSQL_HOST }}" --port {{ MYSQL_PORT }} -e "ALTER USER '{{ WORDPRESS_MYSQL_USERNAME }}'@'%' IDENTIFIED BY '{{ WORDPRESS_MYSQL_PASSWORD }}';" +mysql -u {{ MYSQL_ROOT_USERNAME }} --password="{{ MYSQL_ROOT_PASSWORD }}" --host "{{ MYSQL_HOST }}" --port {{ MYSQL_PORT }} -e "GRANT ALL PRIVILEGES ON {{ WORDPRESS_MYSQL_DATABASE }}.* TO '{{ WORDPRESS_MYSQL_USERNAME }}'@'%';"