diff --git a/roles/web-app-magento/Administration.md b/roles/web-app-magento/Administration.md deleted file mode 100644 index 0b9fd70c..00000000 --- a/roles/web-app-magento/Administration.md +++ /dev/null @@ -1,55 +0,0 @@ -# Administration - -## 🗑️ Cleanup (Remove Instance & Volumes) -```bash -cd {{ PATH_DOCKER_COMPOSE_INSTANCES }}magento/ -docker compose down -docker volume rm MAGENTO_VOLUME -cd {{ PATH_DOCKER_COMPOSE_INSTANCES }} && rm -vR {{ PATH_DOCKER_COMPOSE_INSTANCES }}magento -``` - -## 🔍 Access Container Shell -```bash -docker compose exec -it application /bin/bash -``` - -## 🧰 Common Magento CLI Tasks -```bash -# Reindex -docker compose exec -it application bin/magento indexer:reindex - -# Flush caches -docker compose exec -it application bin/magento cache:flush - -# Enable maintenance mode -docker compose exec -it application bin/magento maintenance:enable - -# Disable maintenance mode -docker compose exec -it application bin/magento maintenance:disable - -# Recompile DI (when switching modes) -docker compose exec -it application bin/magento setup:di:compile - -# Deploy static content (example for English/German) -docker compose exec -it application bin/magento setup:static-content:deploy en_US de_DE -f -``` - -## 🚀 Performance -```bash -# Production mode -docker compose exec -it application bin/magento deploy:mode:set production - -# Developer mode -docker compose exec -it application bin/magento deploy:mode:set developer -``` - -## 🔐 Admin User -```bash -# Create another admin (example) -docker compose exec -it application bin/magento admin:user:create \ - --admin-user="admin2" \ - --admin-password="ChangeMe_12345" \ - --admin-email="{{ users.administrator.email }}" \ - --admin-firstname="Admin" \ - --admin-lastname="User" -``` diff --git a/roles/web-app-magento/Upgrade.md b/roles/web-app-magento/Upgrade.md deleted file mode 100644 index 48c02c20..00000000 --- a/roles/web-app-magento/Upgrade.md +++ /dev/null @@ -1,19 +0,0 @@ -# 🔼 Upgrade - -> 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: - ```bash - cd {{ PATH_DOCKER_COMPOSE_INSTANCES }}magento/ - docker compose pull - docker compose up -d --remove-orphans - ``` -3. Run upgrade routines: - ```bash - docker compose exec -it application bin/magento maintenance:enable - docker compose exec -it application bin/magento setup:upgrade - docker compose exec -it application bin/magento setup:di:compile - docker compose exec -it application bin/magento cache:flush - docker compose exec -it application bin/magento maintenance:disable - ``` diff --git a/roles/web-app-magento/config/main.yml b/roles/web-app-magento/config/main.yml index 2b1c99d9..7fcd6e4b 100644 --- a/roles/web-app-magento/config/main.yml +++ b/roles/web-app-magento/config/main.yml @@ -2,7 +2,7 @@ features: matomo: true css: true desktop: true - central_database: true # Use platform DB (recommended). If false, app-local DB container is enabled. + central_database: false # Impossible to use central database due to strict database checking oidc: false # Magento SSO via OIDC requires extensions; not wired by default logout: true ldap: false @@ -15,17 +15,23 @@ server: - "shop.{{ PRIMARY_DOMAIN }}" aliases: - "magento.{{ PRIMARY_DOMAIN }}" - docker: services: - application: - image: "ghcr.io/alexcheng1982/docker-magento2" - version: "2.4.6-p3" - name: "magento" + php: + image: "markoshust/magento-php" + version: "8.2-fpm" + name: "magento-php" + backup: + no_stop_required: true + nginx: + image: "markoshust/magento-nginx" + version: "latest" + name: "magento-nginx" backup: no_stop_required: true database: - enabled: true # Central DB recommended; if disabled, app-local DB is created + enabled: true + version: "11.4" redis: enabled: true search: diff --git a/roles/web-app-magento/schema/main.yml b/roles/web-app-magento/schema/main.yml index 8b137891..e2a9c94f 100644 --- a/roles/web-app-magento/schema/main.yml +++ b/roles/web-app-magento/schema/main.yml @@ -1 +1,7 @@ - +credentials: + adobe_public_key: + description: "Adobe/Magento Marketplace Public Key" + algorithm: "plain" + adobe_private_key: + description: "Adobe/Magento Marketplace Private Key" + algorithm: "plain" diff --git a/roles/web-app-magento/tasks/01_core.yml b/roles/web-app-magento/tasks/01_core.yml index fdea7f91..c1a741f4 100644 --- a/roles/web-app-magento/tasks/01_core.yml +++ b/roles/web-app-magento/tasks/01_core.yml @@ -2,17 +2,36 @@ include_role: name: sys-stk-full-stateful vars: - docker_compose_flush_handlers: true + docker_compose_flush_handlers: true + +- name: "Bootstrap Magento 2.4.8 source (exact working variant)" + command: > + docker exec + -e COMPOSER_AUTH='{"http-basic":{"repo.magento.com":{"username":"{{ MAGENTO_REPO_PUBLIC_KEY }}","password":"{{ MAGENTO_REPO_PRIVATE_KEY }}"}}}' + -e COMPOSER_HOME=/tmp/composer + -e COMPOSER_CACHE_DIR=/tmp/composer/cache + --user {{ MAGENTO_USER }} + {{ MAGENTO_PHP_CONTAINER }} bash -lc 'set -e + mkdir -p /tmp/composer/cache + cd /var/www/html + composer create-project --no-interaction --no-progress --repository-url=https://repo.magento.com/ magento/project-community-edition=2.4.8 . + mkdir -p var pub/static pub/media app/etc + chmod -R 775 var pub/static pub/media app/etc + ' + args: + creates: "{{ [ (MAGENTO_VOLUME | docker_volume_path), 'bin/magento' ] | path_join }}" - name: "Run Magento setup:install (in container)" command: > - docker compose exec -T application bash -lc " + docker exec --user {{ MAGENTO_USER }} {{ MAGENTO_PHP_CONTAINER }} 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\" \ + --skip-db-validation \ + --db-engine=mysql \ --search-engine='opensearch' \ --opensearch-host=\"$OPENSEARCH_HOST\" \ --opensearch-port=\"$OPENSEARCH_PORT_NUMBER\" \ @@ -22,11 +41,11 @@ --admin-user=\"$MAGENTO_ADMIN_USERNAME\" \ --admin-password=\"$MAGENTO_ADMIN_PASSWORD\"" args: - chdir: "{{ docker_compose.directories.instance }}" + creates: "{{ [ (MAGENTO_VOLUME | docker_volume_path), 'app/etc/env.php' ] | path_join }}" 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 +- include_tasks: utils/run_once.yml diff --git a/roles/web-app-magento/templates/docker-compose.yml.j2 b/roles/web-app-magento/templates/docker-compose.yml.j2 index ba0fc858..13ba0d0e 100644 --- a/roles/web-app-magento/templates/docker-compose.yml.j2 +++ b/roles/web-app-magento/templates/docker-compose.yml.j2 @@ -1,27 +1,37 @@ {% include 'roles/docker-compose/templates/base.yml.j2' %} - - application: + nginx: {% set container_port = 80 %} -{% include 'roles/docker-container/templates/base.yml.j2' %} - image: "{{ MAGENTO_IMAGE }}:{{ MAGENTO_VERSION }}" - container_name: "{{ MAGENTO_CONTAINER }}" - ports: - - "127.0.0.1:{{ ports.localhost.http[application_id] }}:{{ container_port }}" + image: "{{ MAGENTO_NGINX_IMAGE }}:{{ MAGENTO_NGINX_VERSION }}" + container_name: "{{ MAGENTO_NGINX_CONTAINER }}" + depends_on: + - php + - search volumes: - "data:/var/www/html" -{% include 'roles/docker-container/templates/depends_on/dmbs_excl.yml.j2' %} -# search: -# condition: service_healthy + ports: + - "127.0.0.1:{{ ports.localhost.http[application_id] }}:{{ container_port }}" {% include 'roles/docker-container/templates/healthcheck/tcp.yml.j2' %} {% include 'roles/docker-container/templates/networks.yml.j2' %} + php: +{% include 'roles/docker-container/templates/base.yml.j2' %} + image: "{{ MAGENTO_PHP_IMAGE }}:{{ MAGENTO_PHP_VERSION }}" + container_name: "{{ MAGENTO_PHP_CONTAINER }}" + volumes: + - "data:/var/www/html" +{% include 'roles/docker-container/templates/depends_on/dmbs_incl.yml.j2' %} + search: + condition: service_started +{% 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 }}" + container_name: "{{ MAGENTO_SEARCH_CONTAINER }}" {% 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' %} @@ -31,3 +41,4 @@ name: {{ MAGENTO_VOLUME }} {% include 'roles/docker-compose/templates/networks.yml.j2' %} + diff --git a/roles/web-app-magento/vars/main.yml b/roles/web-app-magento/vars/main.yml index 7d8b3ac6..39e2497c 100644 --- a/roles/web-app-magento/vars/main.yml +++ b/roles/web-app-magento/vars/main.yml @@ -3,14 +3,30 @@ application_id: "web-app-magento" database_type: "mariadb" # Magento (application container) + +## Meta +MAGENTO_VOLUME: "{{ applications | get_app_conf(application_id, 'docker.volumes.data') }}" +MAGENTO_USER: "app" + +## Address 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) +## Search (OpenSearch) 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') }}" +MAGENTO_SEARCH_CONTAINER: "{{ applications | get_app_conf(application_id, 'docker.services.search.name') }}" + +## PHP +MAGENTO_PHP_VERSION: "{{ applications | get_app_conf(application_id, 'docker.services.php.version') }}" +MAGENTO_PHP_IMAGE: "{{ applications | get_app_conf(application_id, 'docker.services.php.image') }}" +MAGENTO_PHP_CONTAINER: "{{ applications | get_app_conf(application_id, 'docker.services.php.name') }}" + +## NGINX +MAGENTO_NGINX_VERSION: "{{ applications | get_app_conf(application_id, 'docker.services.nginx.version') }}" +MAGENTO_NGINX_IMAGE: "{{ applications | get_app_conf(application_id, 'docker.services.nginx.image') }}" +MAGENTO_NGINX_CONTAINER: "{{ applications | get_app_conf(application_id, 'docker.services.nginx.name') }}" + +## Credentials +MAGENTO_REPO_PUBLIC_KEY: "{{ applications | get_app_conf(application_id, 'credentials.adobe_public_key') }}" +MAGENTO_REPO_PRIVATE_KEY: "{{ applications | get_app_conf(application_id, 'credentials.adobe_private_key') }}"