From 3972620852ef02d2d775d250bc9e966c53f85195 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomasz=20D=C4=85browski?= <64841871+dabrt@users.noreply.github.com> Date: Tue, 1 Jul 2025 18:17:04 +0200 Subject: [PATCH 1/5] IBX-10245: Document 5.0 requirements --- .../img/diagram_source/server_setup.xml | 143 +++++++++++++++++ docs/getting_started/install_with_ddev.md | 2 +- docs/getting_started/requirements.md | 6 +- .../cache/persistence_cache.md | 80 +--------- .../clustering/clustering.md | 9 +- .../clustering/clustering_with_ddev.md | 34 ----- .../img/diagram_source/server_setup.xml | 144 +++++++++++++++++- .../img/server_setup.png | Bin 25715 -> 39785 bytes .../performance.md | 15 +- .../sessions.md | 26 +--- .../support_and_maintenance_faq.md | 6 - 11 files changed, 305 insertions(+), 160 deletions(-) create mode 100644 docs/ai_actions/img/diagram_source/server_setup.xml diff --git a/docs/ai_actions/img/diagram_source/server_setup.xml b/docs/ai_actions/img/diagram_source/server_setup.xml new file mode 100644 index 0000000000..09085aed45 --- /dev/null +++ b/docs/ai_actions/img/diagram_source/server_setup.xml @@ -0,0 +1,143 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/getting_started/install_with_ddev.md b/docs/getting_started/install_with_ddev.md index 5fde0081b0..7e8f3af9f0 100644 --- a/docs/getting_started/install_with_ddev.md +++ b/docs/getting_started/install_with_ddev.md @@ -415,7 +415,7 @@ If the local project needs to answer to real production domains (for example, to You can use DDEV to locally simulate a production cluster. -- See [Clustering with DDEV](clustering_with_ddev.md) to add Elasticsearch, Solr, Redis, or Memcached to your DDEV installation. +- See [Clustering with DDEV](clustering_with_ddev.md) to add Elasticsearch, Solr, or Redis to your DDEV installation. - See [DDEV and Ibexa Cloud](ddev_and_ibexa_cloud.md) to locally run an [[= product_name =]] project by using DDEV. ## Stop or remove the project diff --git a/docs/getting_started/requirements.md b/docs/getting_started/requirements.md index 1a0125969b..c37984f83a 100644 --- a/docs/getting_started/requirements.md +++ b/docs/getting_started/requirements.md @@ -17,7 +17,7 @@ The following server requirements cover both running the software on-premise and For running on [[[= product_name_cloud =]]](https://www.ibexa.co/products/ibexa-cloud), where recommended configuration and support is provided out of the box, see separate [[[= product_name_cloud =]] section](#ibexa-cloud-requirements-and-setup) for further reading on its requirements. The minimal setup requires PHP, MySQL/MariaDB, Apache/Nginx, Node.js and `yarn`. -Recommendation for production setups is to use Varnish/Fastly, Redis/Memcached, NFS/EFS/S3 and Solr/Elasticsearch in a [clustered setup](clustering.md). +For production setups it's recommended that you use Varnish/Fastly, Redis, NFS/EFS/S3 and Solr/Elasticsearch in a [clustered setup](clustering.md). !!! caution "Recommended versions" @@ -202,7 +202,7 @@ Recommendation for production setups is to use Varnish/Fastly, Redis/Memcached, === "[[= product_name =]] v5.0" - - `php-redis` or `php-memcached` + - `php-redis` === "[[= product_name =]] v4.6" @@ -287,7 +287,7 @@ Recommendation for production setups is to use Varnish/Fastly, Redis/Memcached, === "[[= product_name =]] v5.0" - Linux NFS or S3/EFS (for IO, aka binary files stored in content repository, not supported with legacy) - - Redis 4.0+ or 5.0+ (separate instances for session and cache, both using a `volatile-*` [eviction policy](https://redis.io/docs/latest/develop/reference/eviction/), session instance configured for persistence) or [Memcached](https://memcached.org/) 1.5 or higher + - Redis 4.0+ or 5.0+ (separate instances for session and cache, both using a `volatile-*` [eviction policy](https://redis.io/docs/latest/develop/reference/eviction/), session instance configured for persistence) - [Varnish](http://varnish-cache.org/) 6.0LTS or 7.1 with [varnish-modules](https://github.com/varnish/varnish-modules/blob/master/README.md) or [Fastly](https://www.fastly.com/) using [the provided bundle](http_cache.md) (for HTTP Cache) If you see a "+" next to the product version, it indicates a recommended version or higher within the same major release. diff --git a/docs/infrastructure_and_maintenance/cache/persistence_cache.md b/docs/infrastructure_and_maintenance/cache/persistence_cache.md index 9cc89155e4..d06630b6cd 100644 --- a/docs/infrastructure_and_maintenance/cache/persistence_cache.md +++ b/docs/infrastructure_and_maintenance/cache/persistence_cache.md @@ -12,7 +12,7 @@ Persistence cache can best be described as an implementation of `SPI\Persistence As shown in the illustration, this is done in the exact same way as the event layer is a custom implementation of `API\Repository` decorating the main repository. In the case of persistence cache, instead of sending events on calls passed on to the decorated implementation, most of the load calls are cached, and calls that perform changes purge the affected caches. -Cache handlers *(for example, Memcached, Redis, or Filesystem)* can be configured using Symfony configuration. +Cache handlers *(for example, Redis, or Filesystem)* can be configured using Symfony configuration. For details on how to reuse this Cache service in your own custom code, see below. ## Transparent cache @@ -47,10 +47,10 @@ To see where and how to contribute additional caches, refer to the [source code] !!! note Current implementation uses Symfony cache. - It technically supports the following cache backends: [APCu, Array, Chain, Doctrine, Filesystem, Memcached, PDO & Doctrine DBAL, Php Array, Proxy, Redis]([[= symfony_doc =]]/components/cache/cache_pools.html#creating-cache-pools). - [[= product_name =]] officially supports only using Filesystem for single server and Redis or Memcached for clustered setups. + It technically supports the following cache backends: [APCu, Array, Chain, Doctrine, Filesystem, PDO & Doctrine DBAL, Php Array, Proxy, Redis]([[= symfony_doc =]]/components/cache/cache_pools.html#creating-cache-pools). + [[= product_name =]] officially supports only using Filesystem for single server and Redis for clustered setups. -Use of Memcached or Redis as shared cache back end is a requirement for use in clustering setup. +Use of Redis as shared cache back end is a requirement for use in clustering setup. For an overview of this feature, see [Clustering](clustering.md). Filesystem adapters, for example, are **not** intended to be used over a shared filesystem. @@ -210,79 +210,9 @@ Several cloud providers have managed services that are easier to set up, handle If you use Platform.sh Enterprise you can benefit from the Redis Sentinel across three nodes for great fault tolerance. Platform.sh Professional and lower versions offer Redis in single instance mode only. -### Memcached - -[Memcached, a distributed caching solution](http://memcached.org/) is a cache solution that is supported for clustering use, as an alternative to Redis. - -See [Memcached Cache Adapter in Symfony documentation]([[= symfony_doc =]]/components/cache/adapters/memcached_adapter.html#configure-the-connection) for information on how to configure Memcached. - - -#### Supported Adapters - -There is one Memcached adapter available out of the box. - -##### `Symfony\Component\Cache\Adapter\MemcachedAdapter` - -**Pros**: Memcached is able to handle much more concurrent load by design (multi threaded), and typically uses far less memory than Redis in general due to a simpler data structure. - -**Cons**: 1.5-2x more lookups to the back-end cache server then `RedisTagAwareAdapter`. -Depending on the number of lookups and latency to cache server this might affect page load time. - -#### Adjusting configuration - -Out of the box in `config/packages/cache_pool/cache.memcached.yaml` you can find a default example that can be used. - -!!! note "[[= product_name_cloud =]]" - - For [[= product_name_cloud =]]/Platform.sh: This is automatically configured in `vendor/ibexa/core/src/bundle/Core/DependencyInjection/IbexaCoreExtension.php` if you have enabled Memcached as `cache` Platform.sh service. - -For anything else, you can enable it with environment variables detected automatically by `vendor/ibexa/core/src/bundle/Core/DependencyInjection/IbexaCoreExtension.php`. -For instance, if you set the following environment variables `export CACHE_POOL="cache.memcached" CACHE_DSN="user:pass@localhost?weight=33"`, it results in config like this: - -``` yaml -services: - cache.memcached: - parent: cache.adapter.memcached - tags: - - name: cache.pool - clearer: cache.app_clearer - provider: 'memcached://user:pass@localhost?weight=33' - # Default CACHE_NAMESPACE value, see bin/config/cache_pool/cache.redis.yaml for usage with e.g. multi repo. - namespace: 'ez' -``` - -See `config/default_parameters.yaml` and `config/cache_pool/cache.memcached.yaml` for further details on `CACHE_POOL`, `CACHE_DSN` and `CACHE_NAMESPACE`. - -!!! caution "Clearing Memcached cache" - - The regular `php bin/console cache:clear` command doesn't clear Memcached persistence cache. - Use a dedicated Symfony command to clear the pool you have configured: `php bin/console cache:pool:clear cache.memcached`. - - -!!! caution "Connection errors issue" - - If Memcached does display connection errors when using the default (ascii) protocol, then switching to binary protocol *(in the configuration and Memcached daemon)* should resolve the issue. - -!!! note - - Memcached must not be bound to the local address if clusters are in use, or user logins fail. - To avoid this, in `/etc/memcached.conf` take a look under `# Specify which IP address to listen on. The default is to listen on all IP addresses` - - For development environments, change the address below this comment in `/etc/memcached.conf` to `-l 0.0.0.0` - - For production environments, follow this more secure instruction from the Memcached man: - - > -l <addr> - - > Listen on <addr>; default to INADDR\_ANY. <addr> may be specified as host:port. - If you don't specify a port number, the value you specified with -p or -U is used. - You may specify multiple addresses separated by comma or by using -l multiple times. - This is an important option to consider as there is no other way to secure the installation. - Binding to an internal or firewalled network interface is suggested. - ## Using cache service -Using the internal cache service allows you to use an interface and without caring whether the system is configured to place the cache in Memcached or on File system. +Using the internal cache service allows you to use an interface and without caring whether the system is configured to place the cache on File system. And as [[= product_name =]] requires that instances use a cluster-aware cache in cluster setup, you can safely assume your cache is shared *(and invalidated)* across all web servers. !!! note diff --git a/docs/infrastructure_and_maintenance/clustering/clustering.md b/docs/infrastructure_and_maintenance/clustering/clustering.md index f7345353b5..9be8af649c 100644 --- a/docs/infrastructure_and_maintenance/clustering/clustering.md +++ b/docs/infrastructure_and_maintenance/clustering/clustering.md @@ -13,12 +13,12 @@ The parts illustrate the different roles needed for a successful cluster setup. ![Server setup for clustering](server_setup.png) -The number of web servers, Memcached/Redis, Solr, Varnish, Database, and NFS servers, but also whether some servers play several of these roles (typically running Memcached/Redis across the web server), is up to you and your performance needs. +The number of web servers, Redis, Solr, Varnish, Database, and NFS servers, but also whether some servers play several of these roles (typically running Redis across the web server), is up to you and your performance needs. The minimal requirements are: - [Shared HTTP cache (using Varnish)](reverse_proxy.md#using-varnish-or-fastly) -- [Shared persistence cache](#shared-persistence-cache) and [sessions](#shared-sessions) (using Redis or Memcached) +- [Shared persistence cache](#shared-persistence-cache) and [sessions](#shared-sessions) (using Redis) - Shared database (using MySQL/MariaDB) - [Shared binary files](#shared-binary-files) (using NFS, or S3) @@ -35,21 +35,20 @@ It's also recommended to use: ### Shared persistence cache Redis is the recommended cache solution for clustering. -An alternative solution is using Memcached. See [persistence cache documentation](persistence_cache.md#persistence-cache-configuration) on information on how to configure them. ### Shared sessions For a [cluster](clustering.md) setup you need to configure sessions to use a back end that is shared between web servers. -The main options out of the box in Symfony are the native PHP Memcached or PHP Redis session handlers, alternatively there is Symfony session handler for PDO (database). +The main option out of the box in Symfony is the PHP Redis session handler, alternatively there is Symfony session handler for PDO (database). To avoid concurrent access to session data from front-end nodes, if possible you should either: - Enable [Session locking](https://www.php.net/manual/en/features.session.security.management.php#features.session.security.management.session-locking) - Use "Sticky Session", aka [Load Balancer Persistence](https://en.wikipedia.org/wiki/Load_balancing_%28computing%29#Persistence) -Session locking is available with `php-memcached`, and with `php-redis` (v4.2.0 and higher). +Session locking is available with `php-redis` (v4.2.0 and higher). On [[= product_name_cloud =]] (and Platform.sh) Redis is preferred and supported. diff --git a/docs/infrastructure_and_maintenance/clustering/clustering_with_ddev.md b/docs/infrastructure_and_maintenance/clustering/clustering_with_ddev.md index fd28fa6b1a..c3f6f07315 100644 --- a/docs/infrastructure_and_maintenance/clustering/clustering_with_ddev.md +++ b/docs/infrastructure_and_maintenance/clustering/clustering_with_ddev.md @@ -120,37 +120,3 @@ You can now check whether Redis works. For example, the `ddev redis-cli MONITOR` command returns outputs, for example, `"SETEX" "ezp:`, `"MGET" "ezp:`, `"SETEX" "PHPREDIS_SESSION:`, or `"GET" "PHPREDIS_SESSION:`, while navigating into the website, in particular the back office. See [Redis commands](https://redis.io/docs/latest/commands/) for more details such as information about the [`MONITOR`](https://redis.io/docs/latest/commands/monitor/) command used in the previous example. - -### Install Memcached - -First, if not already there, append the following [new service](https://doc.ibexa.co/en/latest/infrastructure_and_maintenance/sessions/#handling-sessions-with-memcached) to `config/services.yaml`: - -```yaml - app.session.handler.native_memcached: - class: Ibexa\Bundle\Core\Session\Handler\NativeSessionHandler - arguments: - - '%session.save_path%' - - memcached -``` - -Second, install and set up the add-on. -The following sequence of commands: - -1. Adds the Memcached container. -1. Sets Memcached as the cache pool. -1. Sets Memcached as the session handler. -1. Restarts the DDEV cluster and clears application cache. - -```bash -ddev add-on get ddev/ddev-memcached -ddev config --web-environment-add CACHE_POOL=cache.memcached -ddev config --web-environment-add CACHE_DSN=memcached -ddev config --web-environment-add SESSION_HANDLER_ID=app.session.handler.native_memcached -ddev config --web-environment-add SESSION_SAVE_PATH=memcached:11211 -ddev restart -ddev php bin/console cache:clear -``` - -You can now check whether everything went right. - -For example, the `watch 'ddev exec netcat -w1 memcached 11211 <<< "stats" | grep "cmd_.et "'` command checks whether the `web` service can access the `memcached` service, and displays the increase of `cmd_get` and `cmd_set` while navigating into the website. diff --git a/docs/infrastructure_and_maintenance/img/diagram_source/server_setup.xml b/docs/infrastructure_and_maintenance/img/diagram_source/server_setup.xml index c7080d6a59..09085aed45 100644 --- a/docs/infrastructure_and_maintenance/img/diagram_source/server_setup.xml +++ b/docs/infrastructure_and_maintenance/img/diagram_source/server_setup.xml @@ -1 +1,143 @@ -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 \ No newline at end of file + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/infrastructure_and_maintenance/img/server_setup.png b/docs/infrastructure_and_maintenance/img/server_setup.png index 4d295e60741121ffc73cff53ade38dac4e5bee5f..601f7ac480da9fcb158f30ae735ab9c0975befa1 100644 GIT binary patch literal 39785 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 diff --git a/docs/infrastructure_and_maintenance/performance.md b/docs/infrastructure_and_maintenance/performance.md index a9f29c21cd..6b66fe259c 100644 --- a/docs/infrastructure_and_maintenance/performance.md +++ b/docs/infrastructure_and_maintenance/performance.md @@ -16,7 +16,7 @@ If you're in a hurry, the most important recommendations on this page are: - Dump optimized Composer autoload classmap - Use a full web (Nginx/Apache) server with vhost - Avoid shared filesystems for code (Docker for Mac/Win, VirtualBox/*, Vagrant, and more), or find ways to optimize or work around the issues. -- For clustering (mainly relevant for production/staging), reduce latency to Redis/Memcached, use Varnish and [Solr](solr_overview.md). +- For clustering (mainly relevant for production/staging), reduce latency to Redis, use Varnish and [Solr](solr_overview.md). ## Client @@ -31,7 +31,7 @@ In production setups: - Compared to the built-in Symfony Proxy in PHP Varnish is much faster and is able to queue up requests for the same fresh/invalidated resource. - With [ibexa/http-cache](https://github.com/ibexa/http-cache) support for xkey and grace Varnish provides more stable performance in read/write scenarios. - Set up [[= product_name =]] in [cluster mode](clustering.md) if you need to handle bigger spikes of traffic than a single server can manage. - - See [recommendation for Memcached/Redis](#memcachedredis) and [Search](#search) below. + - See [recommendation for Redis](#redis) and [Search](#search) below. !!! note @@ -61,20 +61,15 @@ In production setups: - Keep Composer up to date. - Always dump optimized class map using `composer dump-autoload --optimize` or relevant flags on `composer install/update`. -### Memcached/Redis +### Redis -!!! note - - Redis is currently recommended over Memcached, as the latter has had big performance issues. - [Symfony v3.4.15](https://github.com/symfony/symfony/pull/28249) may have resolved this. - -- Memcached/Redis can in some cases perform better than filesystem cache even with a single server, as it offers better general performance for operations invalidating cache. +- Redis can in some cases perform better than filesystem cache even with a single server, as it offers better general performance for operations invalidating cache. - However, pure read performance is slower, especially if the next points aren't optimized. - With cache being on different node(s) than web server, make sure to try to tune latency between the two. !!! tip - Check if your cloud provider has native service for Memcached/Redis, as those might be better tuned. + Check if your cloud provider has native service for Redis, as those might be better tuned. - If you use Redis, make sure to tune it for in-memory cache usage. Its persistence feature isn't needed with cache and severely slows down execution time. - [For use with sessions](sessions.md#cluster-setup) however, persistence can be a good fit if you want sessions to survive service interruptions. diff --git a/docs/infrastructure_and_maintenance/sessions.md b/docs/infrastructure_and_maintenance/sessions.md index 9aae0b923d..0aa078c480 100644 --- a/docs/infrastructure_and_maintenance/sessions.md +++ b/docs/infrastructure_and_maintenance/sessions.md @@ -9,7 +9,7 @@ It's further enhanced in [[= product_name =]] with support for SiteAccess-aware !!! note - Use of Memcached, Redis (or experimentally PDO) as session handler is a requirement in a cluster setup, for details [see below](#cluster-setup). For an overview of the clustering feature see [Clustering](clustering.md). + Use of Redis (or experimentally PDO) as session handler is a requirement in a cluster setup, for details [see below](#cluster-setup). For an overview of the clustering feature see [Clustering](clustering.md). ## Configuration @@ -76,30 +76,6 @@ For a single server, the default file handler is preferred. See [shared sessions in the clustering guide](clustering.md#shared-sessions). -##### Handling sessions with Memcached - -To set up [[= product_name =]] using [Memcached](https://pecl.php.net/package/memcached) you need to: - -- [Configure the session save handler settings in `php.ini`](https://www.php.net/manual/en/memcached.sessions.php) -- Set `%ibexa.session.handler_id%` to `~` (null) in `config/packages/ibexa.yaml` - -Alternatively if you need to configure Memcached servers dynamically: - -- Create a Symfony service like this: - -```yaml - app.session.handler.native_memcached: - class: Ibexa\Bundle\Core\Session\Handler\NativeSessionHandler - arguments: - - '%session.save_path%' - - memcached -``` - -- Set `%ibexa.session.handler_id%` (or `SESSION_HANDLER_ID` env var) to `app.session.handler.native_memcached` -- Set `%ibexa.session.save_path%` (or `SESSION_SAVE_PATH` env var) to [`save_path` config for Memcached](https://www.php.net/manual/en/memcached.sessions.php) - -Optionally tweak [`php-memcached` session settings](https://www.php.net/manual/en/memcached.configuration.php) for things like session locking. - ##### Handling sessions with Redis To set up [[= product_name =]] using the [Redis](https://pecl.php.net/package/redis) you need to: diff --git a/docs/infrastructure_and_maintenance/support_and_maintenance_faq.md b/docs/infrastructure_and_maintenance/support_and_maintenance_faq.md index c64b158e55..3445b41af6 100644 --- a/docs/infrastructure_and_maintenance/support_and_maintenance_faq.md +++ b/docs/infrastructure_and_maintenance/support_and_maintenance_faq.md @@ -72,12 +72,6 @@ php bin/console cache:clear --env prod php bin/console cache:pool:clear cache.redis ``` -- clearing Memcached cache - -```bash -php bin/console cache:pool:clear cache.memcached -``` - - clearing the Symfony cache manually ```bash From 72dfebfaf4540eeda060b5a38a128d05b2825a70 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomasz=20D=C4=85browski?= <64841871+dabrt@users.noreply.github.com> Date: Wed, 2 Jul 2025 12:29:58 +0200 Subject: [PATCH 2/5] Update requirements --- docs/getting_started/install_with_ddev.md | 2 +- docs/getting_started/requirements.md | 18 +++++++----------- .../cache/http_cache/content_aware_cache.md | 8 ++++---- docs/resources/new_in_doc.md | 2 +- .../solr_search_engine/install_solr.md | 3 +-- 5 files changed, 14 insertions(+), 19 deletions(-) diff --git a/docs/getting_started/install_with_ddev.md b/docs/getting_started/install_with_ddev.md index 7e8f3af9f0..da68df10db 100644 --- a/docs/getting_started/install_with_ddev.md +++ b/docs/getting_started/install_with_ddev.md @@ -49,7 +49,7 @@ ddev config --database=postgres:14 To use MySQL instead, run the following command: ```bash -ddev config --database=mysql:8.0 +ddev config --database=mysql:8.4 ``` You can also use other versions of MariaDB, Mysql or PostgreSQL. diff --git a/docs/getting_started/requirements.md b/docs/getting_started/requirements.md index c37984f83a..c6ab4f0d57 100644 --- a/docs/getting_started/requirements.md +++ b/docs/getting_started/requirements.md @@ -34,10 +34,7 @@ For production setups it's recommended that you use Varnish/Fastly, Redis, NFS/E |Name|Version| |---|---| - |Debian 10 "Buster" |10.0-10.13+| |Debian 11 "Bullseye"|11.0-11.7+| - |Ubuntu "Focal Fossa" | 20.04 | - |Ubuntu "Jammy Jellyfish"| 22.04 | |Ubuntu "Noble Numbat"| 24.04 | |RHEL / CentOS / CentOS Stream | 8.1-9.5+ | @@ -75,7 +72,7 @@ For production setups it's recommended that you use Varnish/Fastly, Redis, NFS/E === "[[= product_name =]] v5.0" - - Nginx 1.18-1.25+ + - Nginx 1.27+ - Apache 2.4 (with required modules `mod_rewrite`, `mod_env` and recommended: `mod_setenvif`, `mod_expires`; event MPM is recommended, if you need to use prefork you also need the `mod_php` module) @@ -101,8 +98,8 @@ For production setups it's recommended that you use Varnish/Fastly, Redis, NFS/E === "[[= product_name =]] v5.0" - - MariaDB 10.3-10.11+ - - MySQL 8.0 + - MariaDB 10.11+ + - MySQL 8.4 - PostgreSQL 14 If you see a "+" next to the product version, it indicates a recommended version or higher within the same major release. @@ -158,7 +155,6 @@ For production setups it's recommended that you use Varnish/Fastly, Redis, NFS/E - `php-mysql` (`php-mysqlnd`) or `php-pgsql` - `php-xml` - `php-mbstring` - - `php-json` - `php-process` (on RHEL/CentOS) - `php-intl` - `php-curl` @@ -216,7 +212,7 @@ For production setups it's recommended that you use Varnish/Fastly, Redis, NFS/E === "[[= product_name =]] v5.0" - - For content search, Solr 7.7 LTS or Solr 8, recommended 8.11.1 or higher. + - For content search, Solr 8.11.1 or higher. Alternatively, Elasticsearch 7.16.2 or higher 7.x version. - The above solutions require Oracle Java/Open JDK. The minimum requirement is 8 LTS, recommended 11 LTS. Newer versions aren't supported. @@ -287,7 +283,7 @@ For production setups it's recommended that you use Varnish/Fastly, Redis, NFS/E === "[[= product_name =]] v5.0" - Linux NFS or S3/EFS (for IO, aka binary files stored in content repository, not supported with legacy) - - Redis 4.0+ or 5.0+ (separate instances for session and cache, both using a `volatile-*` [eviction policy](https://redis.io/docs/latest/develop/reference/eviction/), session instance configured for persistence) + - Redis 7.2+ (separate instances for session and cache, both using a `volatile-*` [eviction policy](https://redis.io/docs/latest/develop/reference/eviction/), session instance configured for persistence) - [Varnish](http://varnish-cache.org/) 6.0LTS or 7.1 with [varnish-modules](https://github.com/varnish/varnish-modules/blob/master/README.md) or [Fastly](https://www.fastly.com/) using [the provided bundle](http_cache.md) (for HTTP Cache) If you see a "+" next to the product version, it indicates a recommended version or higher within the same major release. @@ -329,7 +325,7 @@ For production setups it's recommended that you use Varnish/Fastly, Redis, NFS/E === "[[= product_name =]] v5.0" - - Composer: recent 2.7 version + - Composer: recent 2.8 version === "[[= product_name =]] v4.6" @@ -343,7 +339,7 @@ For production setups it's recommended that you use Varnish/Fastly, Redis, NFS/E === "[[= product_name =]] v5.0" - - `Node.js` 18+ + - `Node.js` 22+ - `yarn` 1.15.2+ If you see a "+" next to the product version, it indicates a recommended version or higher within the same major release. diff --git a/docs/infrastructure_and_maintenance/cache/http_cache/content_aware_cache.md b/docs/infrastructure_and_maintenance/cache/http_cache/content_aware_cache.md index 6b480745cb..e73493fc6e 100644 --- a/docs/infrastructure_and_maintenance/cache/http_cache/content_aware_cache.md +++ b/docs/infrastructure_and_maintenance/cache/http_cache/content_aware_cache.md @@ -452,7 +452,7 @@ The output for this command should look similar to this: ``` HTTP/1.1 200 OK - Server: nginx/1.20.0 + Server: nginx/1.27.0 Content-Type: application/vnd.fos.user-context-hash Transfer-Encoding: chunked Connection: keep-alive @@ -480,7 +480,7 @@ The output : ``` HTTP/1.1 200 OK -Server: nginx/1.20.0 +Server: nginx/1.27.0 Content-Type: text/html; charset=UTF-8 Transfer-Encoding: chunked Connection: keep-alive @@ -533,7 +533,7 @@ The output is: ``` HTTP/1.1 200 OK -Server: nginx/1.20.0 +Server: nginx/1.27.0 Content-Type: text/html; charset=UTF-8 Transfer-Encoding: chunked Connection: keep-alive @@ -561,7 +561,7 @@ Output: ``` HTTP/1.1 200 OK -Server: nginx/1.20.0 +Server: nginx/1.27.0 Content-Type: text/html; charset=UTF-8 Transfer-Encoding: chunked Connection: keep-alive diff --git a/docs/resources/new_in_doc.md b/docs/resources/new_in_doc.md index 80cea582bf..1c82540fea 100644 --- a/docs/resources/new_in_doc.md +++ b/docs/resources/new_in_doc.md @@ -259,7 +259,7 @@ Enhanced the PHP API with the following new classes and interfaces: ### Infrastructure and maintenance - The upgrade instructions from v3.3 to v4.6 have been expanded with a section describing the [GraphQL changes in v4](https://doc.ibexa.co/en/latest/update_and_migration/from_3.3/to_4.0/#graphql) -- Ubuntu 24.04 has been added to the [list of officialy supported operating systems](https://doc.ibexa.co/en/latest/getting_started/requirements/#operating-system) +- Ubuntu 24.04 has been added to the [list of officially supported operating systems](https://doc.ibexa.co/en/latest/getting_started/requirements/#operating-system) ### PHP API diff --git a/docs/search/search_engines/solr_search_engine/install_solr.md b/docs/search/search_engines/solr_search_engine/install_solr.md index fd619b8ab5..6282f9eba4 100644 --- a/docs/search/search_engines/solr_search_engine/install_solr.md +++ b/docs/search/search_engines/solr_search_engine/install_solr.md @@ -13,11 +13,10 @@ For configuring Solr in other ways, including examples, see [Solr Cores and `sol !!! note "Solr versions" - Supported Solr versions are Solr 7 and 8. Using most recent version of Solr 7.7 or 8.11 is recommended. + Supported Solr version is Solr 8. Using the most recent version of Solr 8.11 is recommended. Download and extract Solr: -- [solr-7.7.2.tgz](http://archive.apache.org/dist/lucene/solr/7.7.2/solr-7.7.2.tgz) or [solr-7.7.2.zip](http://archive.apache.org/dist/lucene/solr/7.7.2/solr-7.7.2.zip) - [solr-8.11.2.tgz](https://www.apache.org/dyn/closer.lua/lucene/solr/8.11.2/solr-8.11.2.tgz) or [solr-8.11.2.zip](https://www.apache.org/dyn/closer.lua/lucene/solr/8.11.2/solr-8.11.2.zip) Copy the necessary configuration files. In the example below from the root of your project to the place you extracted Solr: From c530542e6616e2e29bdff96f9263a5b3a2c8657e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomasz=20D=C4=85browski?= <64841871+dabrt@users.noreply.github.com> Date: Wed, 2 Jul 2025 15:21:38 +0200 Subject: [PATCH 3/5] Apply suggestions from code review MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Marek Nocoń --- docs/getting_started/requirements.md | 2 -- docs/infrastructure_and_maintenance/cache/persistence_cache.md | 2 +- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/docs/getting_started/requirements.md b/docs/getting_started/requirements.md index c6ab4f0d57..f015431ab8 100644 --- a/docs/getting_started/requirements.md +++ b/docs/getting_started/requirements.md @@ -214,8 +214,6 @@ For production setups it's recommended that you use Varnish/Fastly, Redis, NFS/E - For content search, Solr 8.11.1 or higher. Alternatively, Elasticsearch 7.16.2 or higher 7.x version. - - The above solutions require Oracle Java/Open JDK. The minimum requirement is 8 LTS, recommended 11 LTS. - Newer versions aren't supported. === "[[= product_name =]] v4.6" diff --git a/docs/infrastructure_and_maintenance/cache/persistence_cache.md b/docs/infrastructure_and_maintenance/cache/persistence_cache.md index d06630b6cd..d3cdebca6b 100644 --- a/docs/infrastructure_and_maintenance/cache/persistence_cache.md +++ b/docs/infrastructure_and_maintenance/cache/persistence_cache.md @@ -212,7 +212,7 @@ Several cloud providers have managed services that are easier to set up, handle ## Using cache service -Using the internal cache service allows you to use an interface and without caring whether the system is configured to place the cache on File system. +Using the internal cache service allows you to use an interface and without caring whether the system is configured to place the cache in Redis or on File system. And as [[= product_name =]] requires that instances use a cluster-aware cache in cluster setup, you can safely assume your cache is shared *(and invalidated)* across all web servers. !!! note From 783cd4686bc1f1fc024a0432b1c38cb0cf959c08 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomasz=20D=C4=85browski?= <64841871+dabrt@users.noreply.github.com> Date: Wed, 2 Jul 2025 15:25:20 +0200 Subject: [PATCH 4/5] Bump two more product versions --- docs/getting_started/install_with_ddev.md | 2 +- docs/ibexa_cloud/ddev_and_ibexa_cloud.md | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/getting_started/install_with_ddev.md b/docs/getting_started/install_with_ddev.md index da68df10db..cf98c7877c 100644 --- a/docs/getting_started/install_with_ddev.md +++ b/docs/getting_started/install_with_ddev.md @@ -31,7 +31,7 @@ mkdir my-ddev-project && cd my-ddev-project Next, configure your DDEV environment with the following command: ```bash -ddev config --project-type=php --php-version 8.3 --nodejs-version 20 --docroot=public +ddev config --project-type=php --php-version 8.3 --nodejs-version 22 --docroot=public ``` This command sets the project type to PHP, the PHP version to 8.3, the document root to `public` directory, and creates the document root if it doesn't exist. diff --git a/docs/ibexa_cloud/ddev_and_ibexa_cloud.md b/docs/ibexa_cloud/ddev_and_ibexa_cloud.md index a6d2000a3c..e2bbf82766 100644 --- a/docs/ibexa_cloud/ddev_and_ibexa_cloud.md +++ b/docs/ibexa_cloud/ddev_and_ibexa_cloud.md @@ -53,7 +53,7 @@ See [`ibexa_cloud help get`](https://docs.platform.sh/administration/cli.html#3- ```bash ibexa_cloud project:get my-ddev-project && cd my-ddev-project -ddev config --project-type=php --php-version 8.1 --web-environment-add COMPOSER_AUTH='',DATABASE_URL=mysql://db:db@db:3306/db +ddev config --project-type=php --php-version 8.3 --web-environment-add COMPOSER_AUTH='',DATABASE_URL=mysql://db:db@db:3306/db ddev config --web-environment-add IBEXA_PROJECT=,IBEXA_ENVIRONMENT=production,IBEXA_APP=app ddev config --web-environment-add IBEXA_CLI_TOKEN= echo '.ddev/' >> .gitignore @@ -93,7 +93,7 @@ The following sequence of commands: ```bash ibexa_cloud project:get my-ddev-project && cd my-ddev-project -ddev config --project-type=php --php-version 8.1 --docroot=public --web-environment-add DATABASE_URL=mysql://db:db@db:3306/db +ddev config --project-type=php --php-version 8.3 --docroot=public --web-environment-add DATABASE_URL=mysql://db:db@db:3306/db echo '.ddev/' >> .gitignore ddev start ddev composer config --global http-basic.updates.ibexa.co From 90f9692175c130b62c2ad6f08f0ce9a94f6fbc69 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomasz=20D=C4=85browski?= <64841871+dabrt@users.noreply.github.com> Date: Wed, 2 Jul 2025 15:34:07 +0200 Subject: [PATCH 5/5] Redis example fixed --- .../img/diagram_source/server_setup.xml | 143 ------------------ docs/getting_started/requirements.md | 4 +- 2 files changed, 2 insertions(+), 145 deletions(-) delete mode 100644 docs/ai_actions/img/diagram_source/server_setup.xml diff --git a/docs/ai_actions/img/diagram_source/server_setup.xml b/docs/ai_actions/img/diagram_source/server_setup.xml deleted file mode 100644 index 09085aed45..0000000000 --- a/docs/ai_actions/img/diagram_source/server_setup.xml +++ /dev/null @@ -1,143 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/docs/getting_started/requirements.md b/docs/getting_started/requirements.md index f015431ab8..aa6d260070 100644 --- a/docs/getting_started/requirements.md +++ b/docs/getting_started/requirements.md @@ -402,8 +402,8 @@ For production setups it's recommended that you use Varnish/Fastly, Redis, NFS/E For example: - - Platform.sh provides Redis support for versions 3.2, 4.0 and 5.0. [[= product_name =]] supports Redis version 4.0 or higher, and recommends 5.0. - As a result, Redis is supported on [[= product_name_cloud =]] in versions 4.0 and 5.0, but 5.0 is recommended. + - Platform.sh provides Redis support for versions 7.2, 7.0, and 6.2. [[= product_name =]] supports Redis version 7.2. + As a result, Redis is supported on [[= product_name_cloud =]] in versions 7.2. Features or services supported by [[= product_name =]] but not covered by Platform.sh may be possible by means of a [custom integration](#custom-integrations).