diff --git a/roles/web-app-magento/Administration.md b/roles/web-app-magento/Administration.md index 13fcceec..0b9fd70c 100644 --- a/roles/web-app-magento/Administration.md +++ b/roles/web-app-magento/Administration.md @@ -4,7 +4,7 @@ ```bash cd {{ PATH_DOCKER_COMPOSE_INSTANCES }}magento/ docker compose down -docker volume rm magento_data +docker volume rm MAGENTO_VOLUME cd {{ PATH_DOCKER_COMPOSE_INSTANCES }} && rm -vR {{ PATH_DOCKER_COMPOSE_INSTANCES }}magento ``` diff --git a/roles/web-app-magento/Installation.md b/roles/web-app-magento/Installation.md deleted file mode 100644 index dd1e582e..00000000 --- a/roles/web-app-magento/Installation.md +++ /dev/null @@ -1,30 +0,0 @@ -# ⚙️ Installation & First Run - -## 1) Prepare DNS & Ports -Ensure a canonical domain is mapped (e.g. `shop.{{ PRIMARY_DOMAIN }}`) and a free localhost port in `group_vars/all/10_ports.yml`: -``` -web-app-magento: 80xx -``` - -## 2) Seed Credentials -Provide (at minimum) an admin password in your inventory (vault recommended): -```yaml -applications: - web-app-magento: - credentials: - admin_password: "use-a-strong-secret" -``` -The admin username/email are taken from `users.administrator.*`. - -## 3) Deploy -Run the Infinito.Nexus playbook for your host(s). The role will: -- Start OpenSearch (single node) -- Start MariaDB (if `central_database` is disabled, the app-local DB is used instead) -- Start Magento application container -- Wire environment via `templates/env.j2` - -## 4) Verify -Open your domain (e.g. `https://shop.{{ PRIMARY_DOMAIN }}`) and complete any remaining onboarding steps in the admin panel. - -**Admin Panel:** `{{ domains | get_url('web-app-magento', WEB_PROTOCOL) }}/admin` -(Default path can vary; set a custom `ADMINURI` later via `bin/magento setup:config:set` if desired.) diff --git a/roles/web-app-magento/Upgrade.md b/roles/web-app-magento/Upgrade.md index 92a72dcb..48c02c20 100644 --- a/roles/web-app-magento/Upgrade.md +++ b/roles/web-app-magento/Upgrade.md @@ -1,6 +1,6 @@ # 🔼 Upgrade -> Always back up the database and the `magento_data` volume before upgrades. +> Always back up the database and the `MAGENTO_VOLUME` volume before upgrades. 1. Update images/versions in the application config (`roles/web-app-magento/config/main.yml` or inventory overrides). 2. Recreate containers: diff --git a/roles/web-app-magento/User_Administration.md b/roles/web-app-magento/User_Administration.md deleted file mode 100644 index 5b17ff04..00000000 --- a/roles/web-app-magento/User_Administration.md +++ /dev/null @@ -1,15 +0,0 @@ -# 👤 User Administration - -- Access the admin panel at: - `{{ domains | get_url('web-app-magento', WEB_PROTOCOL) }}/admin` - *(or your custom admin path if configured)* - -- New admin accounts can be created via the web UI or CLI: - ```bash - docker compose exec -it application bin/magento admin:user:create \ - --admin-user="john" \ - --admin-password="SuperSecret_12345" \ - --admin-email="john@example.com" \ - --admin-firstname="John" \ - --admin-lastname="Doe" - ``` diff --git a/roles/web-app-magento/config/main.yml b/roles/web-app-magento/config/main.yml index e306b5fd..2b1c99d9 100644 --- a/roles/web-app-magento/config/main.yml +++ b/roles/web-app-magento/config/main.yml @@ -19,19 +19,19 @@ server: docker: services: application: - image: "bitnami/magento" - version: "latest" - name: "magento" + image: "ghcr.io/alexcheng1982/docker-magento2" + version: "2.4.6-p3" + name: "magento" backup: no_stop_required: true database: - enabled: true # Central DB recommended; if disabled, app-local DB is created + enabled: true # Central DB recommended; if disabled, app-local DB is created redis: - enabled: true + enabled: true search: - enabled: true - image: "opensearchproject/opensearch" - version: "latest" - name: "magento-opensearch" + enabled: true + image: "opensearchproject/opensearch" + version: "latest" + name: "magento-opensearch" volumes: - data: "magento_data" + data: "magento_data" diff --git a/roles/web-app-magento/schema/main.yml b/roles/web-app-magento/schema/main.yml index f7b3e748..8b137891 100644 --- a/roles/web-app-magento/schema/main.yml +++ b/roles/web-app-magento/schema/main.yml @@ -1,6 +1 @@ -credentials: - admin_password: - description: "Password for the initial Magento admin account" - algorithm: "alphanumeric" - validation: - min_length: 12 + diff --git a/roles/web-app-magento/tasks/01_core.yml b/roles/web-app-magento/tasks/01_core.yml index 91a7fc3a..fdea7f91 100644 --- a/roles/web-app-magento/tasks/01_core.yml +++ b/roles/web-app-magento/tasks/01_core.yml @@ -1,6 +1,32 @@ - name: "load docker, db/redis/proxy for {{ application_id }}" include_role: name: sys-stk-full-stateful + vars: + docker_compose_flush_handlers: true -- name: flush docker service - meta: flush_handlers +- name: "Run Magento setup:install (in container)" + command: > + docker compose exec -T application bash -lc " + cd /var/www/html && bin/magento setup:install \ + --base-url='{{ MAGENTO_URL }}/' \ + --db-host=\"$MYSQL_HOST\" \ + --db-name=\"$MYSQL_DATABASE\" \ + --db-user=\"$MYSQL_USER\" \ + --db-password=\"$MYSQL_PASSWORD\" \ + --search-engine='opensearch' \ + --opensearch-host=\"$OPENSEARCH_HOST\" \ + --opensearch-port=\"$OPENSEARCH_PORT_NUMBER\" \ + --admin-firstname=\"$MAGENTO_ADMIN_FIRSTNAME\" \ + --admin-lastname=\"$MAGENTO_ADMIN_LASTNAME\" \ + --admin-email=\"$MAGENTO_ADMIN_EMAIL\" \ + --admin-user=\"$MAGENTO_ADMIN_USERNAME\" \ + --admin-password=\"$MAGENTO_ADMIN_PASSWORD\"" + args: + chdir: "{{ docker_compose.directories.instance }}" + register: magento_install + changed_when: > + (magento_install.stdout is defined and + ('Magento installation complete' in magento_install.stdout + or 'successfully installed' in magento_install.stdout)) + +- include_tasks: utils/run_once.yml \ No newline at end of file diff --git a/roles/web-app-magento/tasks/main.yml b/roles/web-app-magento/tasks/main.yml index 5a67c6c1..5db3a071 100644 --- a/roles/web-app-magento/tasks/main.yml +++ b/roles/web-app-magento/tasks/main.yml @@ -2,8 +2,3 @@ - name: "construct {{ role_name }}" include_tasks: 01_core.yml when: run_once_web_app_magento is not defined - -- name: run the docker magento tasks once - set_fact: - run_once_web_app_magento: true - when: run_once_web_app_magento is not defined diff --git a/roles/web-app-magento/templates/docker-compose.yml.j2 b/roles/web-app-magento/templates/docker-compose.yml.j2 index d8c63a74..ba0fc858 100644 --- a/roles/web-app-magento/templates/docker-compose.yml.j2 +++ b/roles/web-app-magento/templates/docker-compose.yml.j2 @@ -1,34 +1,33 @@ {% include 'roles/docker-compose/templates/base.yml.j2' %} application: -{% set container_port = 8080 %} +{% set container_port = 80 %} {% include 'roles/docker-container/templates/base.yml.j2' %} - image: "{{ magento_image }}:{{ magento_version }}" - container_name: "{{ magento_name }}" + image: "{{ MAGENTO_IMAGE }}:{{ MAGENTO_VERSION }}" + container_name: "{{ MAGENTO_CONTAINER }}" ports: - "127.0.0.1:{{ ports.localhost.http[application_id] }}:{{ container_port }}" volumes: - - "data:/bitnami/magento" + - "data:/var/www/html" {% include 'roles/docker-container/templates/depends_on/dmbs_excl.yml.j2' %} - depends_on: - - search +# search: +# condition: service_healthy {% include 'roles/docker-container/templates/healthcheck/tcp.yml.j2' %} {% include 'roles/docker-container/templates/networks.yml.j2' %} search: {% set container_port = 9200 %} - image: "{{ magento_search_image }}:{{ magento_search_version }}" - container_name: "{{ magento_search_name }}" + image: "{{ MAGENTO_SEARCH_IMAGE }}:{{ MAGENTO_SEARCH_VERSION }}" + container_name: "{{ MAGENTO_SEARCH_NAME }}" {% include 'roles/docker-container/templates/base.yml.j2' %} environment: - discovery.type=single-node - - plugins.security.disabled=true - OPENSEARCH_JAVA_OPTS=-Xms512m -Xmx512m {% include 'roles/docker-container/templates/healthcheck/tcp.yml.j2' %} {% include 'roles/docker-container/templates/networks.yml.j2' %} {% include 'roles/docker-compose/templates/volumes.yml.j2' %} data: - name: {{ magento_data }} + name: {{ MAGENTO_VOLUME }} {% include 'roles/docker-compose/templates/networks.yml.j2' %} diff --git a/roles/web-app-magento/templates/env.j2 b/roles/web-app-magento/templates/env.j2 index 15ea9bd3..bf29bdfa 100644 --- a/roles/web-app-magento/templates/env.j2 +++ b/roles/web-app-magento/templates/env.j2 @@ -3,30 +3,32 @@ # - https://github.com/bitnami/containers/tree/main/bitnami/magento # Host & URLs -MAGENTO_HOST="{{ domains | get_domain(application_id) }}" -MAGENTO_BASE_URL="{{ domains | get_url(application_id, WEB_PROTOCOL) }}/" -MAGENTO_ENABLE_HTTPS={{ (WEB_PORT == 443) | string | lower }} +MAGENTO_URL="{{ MAGENTO_URL }}" +MAGENTO_BACKEND_FRONTNAME="admin" +MAGENTO_USE_SECURE={{ (WEB_PORT == 443) | ternary('1','0') }} +MAGENTO_BASE_URL_SECURE={{ (WEB_PORT == 443) | ternary('1','0') }} +MAGENTO_USE_SECURE_ADMIN={{ (WEB_PORT == 443) | ternary('1','0') }} # Admin (seed from global administrator) -MAGENTO_USERNAME="{{ users.administrator.username }}" -MAGENTO_PASSWORD="{{ applications | get_app_conf(application_id, 'credentials.admin_password') }}" -MAGENTO_EMAIL="{{ users.administrator.email }}" -MAGENTO_FIRST_NAME="{{ users.administrator.firstname | default('Admin') }}" -MAGENTO_LAST_NAME="{{ users.administrator.lastname | default('User') }}" +MAGENTO_ADMIN_USERNAME="{{ users.administrator.username }}" +MAGENTO_ADMIN_PASSWORD="{{ users.administrator.password }}" +MAGENTO_ADMIN_EMAIL="{{ users.administrator.email }}" +MAGENTO_ADMIN_FIRSTNAME="{{ users.administrator.firstname | default('Admin') }}" +MAGENTO_ADMIN_LASTNAME="{{ users.administrator.lastname | default('User') }}" # Database (central DB preferred) -MARIADB_HOST="{{ database_host }}" -MARIADB_PORT_NUMBER="{{ database_port }}" -MAGENTO_DATABASE_USER="{{ database_username }}" -MAGENTO_DATABASE_PASSWORD="{{ database_password }}" -MAGENTO_DATABASE_NAME="{{ database_name }}" +MYSQL_HOST="{{ database_host }}" +MYSQL_PORT="{{ database_port }}" +MYSQL_USER="{{ database_username }}" +MYSQL_PASSWORD="{{ database_password }}" +MYSQL_DATABASE="{{ database_name }}" # Search (Magento 2.4+) -MAGENTO_SEARCH_ENGINE="opensearch" OPENSEARCH_HOST="search" OPENSEARCH_PORT_NUMBER="9200" +OPENSEARCH_INITIAL_ADMIN_PASSWORD="{{ users.administrator.password }}" -# SMTP +# SMTP (post-install you’ll wire these in Magento admin or env.php) SMTP_HOST="{{ SYSTEM_EMAIL.HOST }}" SMTP_PORT="{{ SYSTEM_EMAIL.PORT }}" SMTP_USER="{{ users['no-reply'].email }}" @@ -34,6 +36,6 @@ SMTP_PASSWORD="{{ users['no-reply'].mailu_token }}" SMTP_PROTOCOL={{ SYSTEM_EMAIL.TLS | ternary('tls','ssl') }} # Misc -ALLOW_EMPTY_PASSWORD="no" -BITNAMI_DEBUG="false" -PHP_MEMORY_LIMIT="1024M" +PHP_MEMORY_LIMIT="768M" + +APACHE_SERVERNAME={{ MAGENTO_DOMAIN }} \ No newline at end of file diff --git a/roles/web-app-magento/vars/main.yml b/roles/web-app-magento/vars/main.yml index c374b67b..7d8b3ac6 100644 --- a/roles/web-app-magento/vars/main.yml +++ b/roles/web-app-magento/vars/main.yml @@ -3,15 +3,14 @@ application_id: "web-app-magento" database_type: "mariadb" # Magento (application container) -magento_version: "{{ applications | get_app_conf(application_id, 'docker.services.application.version', True) | default('latest') }}" -magento_image: "{{ applications | get_app_conf(application_id, 'docker.services.application.image', True) | default('bitnami/magento') }}" -magento_name: "{{ applications | get_app_conf(application_id, 'docker.services.application.name', True) | default('magento') }}" -magento_data: "{{ applications | get_app_conf(application_id, 'docker.volumes.data', True) | default('magento_data') }}" +MAGENTO_DOMAIN: "{{ domains | get_domain(application_id) }}" +MAGENTO_URL: "{{ domains | get_url(application_id, WEB_PROTOCOL) }}" +MAGENTO_VERSION: "{{ applications | get_app_conf(application_id, 'docker.services.application.version') }}" +MAGENTO_IMAGE: "{{ applications | get_app_conf(application_id, 'docker.services.application.image') }}" +MAGENTO_CONTAINER: "{{ applications | get_app_conf(application_id, 'docker.services.application.name') }}" +MAGENTO_VOLUME: "{{ applications | get_app_conf(application_id, 'docker.volumes.data') }}" # Search (OpenSearch) -magento_search_version: "{{ applications | get_app_conf(application_id, 'docker.services.search.version', True) | default('latest') }}" -magento_search_image: "{{ applications | get_app_conf(application_id, 'docker.services.search.image', True) | default('opensearchproject/opensearch') }}" -magento_search_name: "{{ applications | get_app_conf(application_id, 'docker.services.search.name', True) | default('magento-opensearch') }}" - -# Docker helpers -docker_compose_flush_handlers: true +MAGENTO_SEARCH_VERSION: "{{ applications | get_app_conf(application_id, 'docker.services.search.version') }}" +MAGENTO_SEARCH_IMAGE: "{{ applications | get_app_conf(application_id, 'docker.services.search.image') }}" +MAGENTO_SEARCH_NAME: "{{ applications | get_app_conf(application_id, 'docker.services.search.name') }}"