diff --git a/.github/workflows/docker-image-preprod.yml b/.github/workflows/docker-image-preprod.yml
deleted file mode 100644
index 8bf33ff..0000000
--- a/.github/workflows/docker-image-preprod.yml
+++ /dev/null
@@ -1,42 +0,0 @@
-name: Build Image Preprod
-
-on:
- push:
- branches:
- - preprod
-
-jobs:
- Build-Images:
- runs-on: ubuntu-latest
- steps:
- -
- name: Checkout
- uses: actions/checkout@v4
- -
- name: Set up QEMU
- uses: docker/setup-qemu-action@v3
- -
- name: Set up Docker Buildx
- uses: docker/setup-buildx-action@v3
- -
- name: Login to Registery
- uses: docker/login-action@v3
- with:
- registry: ${{ secrets.REGISTRY_URL }}
- username: ${{ secrets.REGISTRY_USERNAME }}
- password: ${{ secrets.REGISTRY_TOKEN }}
- -
- name: Build and push
- uses: docker/build-push-action@v6
- with:
- context: .
- push: true
- tags: ${{ secrets.REGISTRY_URL }}/clientxcms/docsclientxcms:preprod
-
- - name: Restart docker-compose via ssh
- uses: D3rHase/ssh-command-action@v0.2.2
- with:
- host: ${{ secrets.VPS_HOST }}
- user: ${{ secrets.VPS_USER }}
- private_key: ${{ secrets.SSH_PRIVATE_KEY }}
- command: ${{ secrets.COMMAND_PREPROD }}
diff --git a/.github/workflows/docker-images.yml b/.github/workflows/docker-images.yml
deleted file mode 100644
index aa60c13..0000000
--- a/.github/workflows/docker-images.yml
+++ /dev/null
@@ -1,42 +0,0 @@
-name: Build Image
-
-on:
- push:
- branches:
- - V2
-
-jobs:
- Build-Images:
- runs-on: ubuntu-latest
- steps:
- -
- name: Checkout
- uses: actions/checkout@v4
- -
- name: Set up QEMU
- uses: docker/setup-qemu-action@v3
- -
- name: Set up Docker Buildx
- uses: docker/setup-buildx-action@v3
- -
- name: Login to Registery
- uses: docker/login-action@v3
- with:
- registry: ${{ secrets.REGISTRY_URL }}
- username: ${{ secrets.REGISTRY_USERNAME }}
- password: ${{ secrets.REGISTRY_TOKEN }}
- -
- name: Build and push
- uses: docker/build-push-action@v6
- with:
- context: .
- push: true
- tags: ${{ secrets.REGISTRY_URL }}/clientxcms/docsclientxcms:latest
-
- - name: Restart docker-compose via ssh
- uses: D3rHase/ssh-command-action@v0.2.2
- with:
- host: ${{ secrets.VPS_HOST }}
- user: ${{ secrets.VPS_USER }}
- private_key: ${{ secrets.SSH_PRIVATE_KEY }}
- command: ${{ secrets.COMMAND_PROD }}
diff --git a/.github/workflows/test-build-pr.yml b/.github/workflows/test-build-pr.yml
index 6107180..5daa230 100644
--- a/.github/workflows/test-build-pr.yml
+++ b/.github/workflows/test-build-pr.yml
@@ -20,7 +20,7 @@ jobs:
- name: Set up Node.js
uses: actions/setup-node@v3
with:
- node-version: '20'
+ node-version: '24'
- name: Install dependencies
run: npm install
diff --git a/blog/2025-05-31-mise-en-opensource.md b/blog/2025-05-31-mise-en-opensource.md
index eabe4e9..6a21220 100644
--- a/blog/2025-05-31-mise-en-opensource.md
+++ b/blog/2025-05-31-mise-en-opensource.md
@@ -120,7 +120,7 @@ We will focus our efforts on:
* and valuing ideas from the community.
đ For this, we have launched a dedicated site:
-đ [ideas.clientxcms.com](https://ideas.clientxcms.com)
+đ [clientxcms.com/ideas](https://clientxcms.com/ideas)
A space where you can connect via Discord, **vote for extension ideas**, propose new ones, and follow their evolution. The goal is clear: to co-build a tool as close as possible to real needs.

diff --git a/blog/2025-09-05-lancement-opensource.md b/blog/2025-09-05-lancement-opensource.md
index efedea3..dfc3900 100644
--- a/blog/2025-09-05-lancement-opensource.md
+++ b/blog/2025-09-05-lancement-opensource.md
@@ -25,7 +25,7 @@ You can also find more than 30 repositories related to CLIENTXCMS on our GitHub
Feel free to:
- Give a â on the repository to support the project
- Create your issues and pull requests
-- Share your ideas via [ideas.clientxcms.com](https://ideas.clientxcms.com)
+- Share your ideas via [clientxcms.com/ideas](https://clientxcms.com/ideas)
- Join our [forum](https://forum.clientxcms.com) to exchange with the community
## đ ïž New Extensions Interface & Marketplace
diff --git a/blog/2025-12-31-bonne-annee-2026.md b/blog/2025-12-31-bonne-annee-2026.md
index 7fd8d25..209f340 100644
--- a/blog/2025-12-31-bonne-annee-2026.md
+++ b/blog/2025-12-31-bonne-annee-2026.md
@@ -91,7 +91,7 @@ Version v2.15 (mid-February 2026) will integrate **three new payment platforms**
These solutions enrich the ecosystem and facilitate the adoption of ClientXCMS in different contexts.
-Feel free to suggest payment platforms via the [idea platform](https://ideas.clientxcms.com).
+Feel free to suggest payment platforms via the [idea platform](https://clientxcms.com/ideas).

@@ -144,7 +144,7 @@ Among the expected extensions and new features:
Finally, one of our major objectives for this new year is the development of **CMS internationalization**, to propel ClientXCMS beyond French borders and reach a global community.
-đ Proposals are open at **https://ideas.clientxcms.com**
+đ Proposals are open at **https://clientxcms.com/ideas**
## A Final Word
diff --git a/docs/developpers/extensions/create.md b/docs/developpers/extensions/create.md
index c5c1e58..9ba884a 100644
--- a/docs/developpers/extensions/create.md
+++ b/docs/developpers/extensions/create.md
@@ -19,6 +19,33 @@ When executing this command, several questions will be asked, including:
- **Use of controllers**: Indicate if controllers are needed.
- **Use of a database**: Specify if the extension requires database usage.
+### Creation via CLI with options
+
+To create an extension without going through the interactive questions, you can use the following command:
+
+```bash
+php artisan clientxcms:create-extension \
+ --name="My extension" \
+ --uuid="my-extension" \
+ --type="addon" \
+ --routes=1 \
+ --controllers=1 \
+ --database=1 \
+ --views=1 \
+ --lang=1
+```
+
+#### Option details
+
+* `--name`: displayed extension name.
+* `--uuid`: unique extension identifier.
+* `--type`: extension type. Possible values: `addon` or `module`.
+* `--routes`: creates route files.
+* `--controllers`: creates controllers.
+* `--database`: creates database-related files, such as migrations and seeders.
+* `--views`: creates extension views.
+* `--lang`: creates translation files.
+
#### Structure of an addon
Here is an example of the structure of an addon, based on the `fund` extension:
diff --git a/docs/developpers/themes/create-theme.md b/docs/developpers/themes/create-theme.md
index 7f4b42a..41d9a40 100644
--- a/docs/developpers/themes/create-theme.md
+++ b/docs/developpers/themes/create-theme.md
@@ -44,6 +44,38 @@ php artisan clientxcms:create-theme
```
The command will ask you for the theme name and will create the theme structure for you based on your answers.

+
+### Creation via CLI with options
+
+To create a theme without going through the interactive questions, you can use the following command:
+
+```bash
+php artisan clientxcms:create-theme \
+ --name="My theme" \
+ --uuid="my-theme" \
+ --parent="default" \
+ --description="Theme description" \
+ --author-name="ClientXCMS" \
+ --author-email="contact@clientxcms.com" \
+ --css=1 \
+ --js=1 \
+ --config=1 \
+ --lang=1
+```
+
+#### Option details
+
+* `--name`: displayed theme name.
+* `--uuid`: unique theme identifier.
+* `--parent`: parent theme used as a base. Possible values: `default` or `bootstrap`.
+* `--description`: theme description.
+* `--author-name`: author name.
+* `--author-email`: author email address.
+* `--css`: creates the main CSS file for the theme.
+* `--js`: creates the main JavaScript file for the theme.
+* `--config`: creates the theme configuration files.
+* `--lang`: creates the theme language files.
+
## Theme File
The `theme.json` file is the theme configuration file. It contains the theme information.
```json
diff --git a/docs/extensions/addons/late_fees.md b/docs/extensions/addons/late_fees.md
new file mode 100644
index 0000000..b19ec54
--- /dev/null
+++ b/docs/extensions/addons/late_fees.md
@@ -0,0 +1,74 @@
+# Late Fees
+
+The **Late Fees** extension allows you to automate the application of additional charges on unpaid invoices after their due date. It offers great flexibility to configure fixed or percentage amounts, manage grace periods, and even exempt certain customers.
+
+:::info
+Penalty processing is performed automatically every day at **06:00 AM** via a scheduled task.
+:::
+
+## Global Configuration
+
+To configure late fees, go to **Settings > Billing > Late Fees Settings**.
+
+
+
+### Available Parameters:
+
+| Parameter | Description |
+| :--- | :--- |
+| **Enable Late Fees** | Globally enable or disable automatic processing. |
+| **Fee Type** | Choose between a fixed amount or a percentage of the invoice amount. |
+| **Fee Amount** | The value to apply (e.g., 10 for 10% or 5.00 for $5). |
+| **Maximum Fee Cap** | (Optional) Defines the maximum amount a penalty can reach. |
+| **Grace Period (days)** | Number of days after the due date before the penalty is applied. |
+| **Warning Days Before** | Number of days before the due date to send a warning email. |
+| **Recurring Fees** | If enabled, the penalty will be reapplied periodically if the invoice remains unpaid. |
+| **Recurring Interval (days)** | Frequency at which the recurring penalty is applied. |
+| **Legal Text** | Text displayed on the invoice to justify the penalty (available in multiple languages). |
+| **Notifications** | Ability to send a warning email before application and an email once the penalty is applied. |
+
+## Customer Exemptions
+
+It is possible to exclude certain customers from the automatic application of penalties (for example, for VIP customers or institutional accounts).
+
+Access the **Customer Exemptions** section at the bottom of the settings page.
+
+
+
+1. Search for the customer to exempt in the **Customer** field.
+2. Provide a **Reason** (optional) for record-keeping.
+3. Click **Add Exemption**.
+
+## Late Fees Management
+
+You can track all applied penalties on the **Late Fees** page accessible via the administration menu.
+
+
+
+This page displays global statistics:
+- **Total Applied**: Number of penalties generated.
+- **Total Amount**: Cumulative value of penalties.
+- **Total Collected**: Amount of penalties paid by customers.
+- **Outstanding**: Amount remaining to be collected.
+
+You can filter the list by status (Pending, Applied, Paid, Cancelled), by customer, or by date.
+
+## Manual Application
+
+If you need to add a one-time penalty to a specific invoice, you can do so manually using the **Apply Manual Fee** button.
+
+
+
+Simply select the concerned invoice and indicate the fee amount to apply immediately. The penalty will then be added to the invoice (or created separately depending on your configuration).
+
+## Detail and Cancellation
+
+By clicking on **Show** for a specific penalty, you can access its details and cancel it if necessary.
+
+
+
+To cancel (waive) a penalty:
+1. Provide a reason in the **Notes** field.
+2. Click **Cancel Late Fee**.
+
+Once cancelled, the status will change to **Cancelled** and the amount will no longer be due.
diff --git a/docs/extensions/addons/pack.md b/docs/extensions/addons/pack.md
new file mode 100644
index 0000000..dfa5724
--- /dev/null
+++ b/docs/extensions/addons/pack.md
@@ -0,0 +1,86 @@
+---
+translated: true
+---
+
+# Service Pack
+
+The **Service Pack** add-on lets you sell several services in a single offer. The customer orders a pack product, then ClientXCMS automatically creates the services included in that pack.
+
+Packs are useful for bundled offers, such as web hosting with a game server, a reseller service with included options, or any combination of products that should renew together.
+
+
+
+## How it works
+
+A pack contains several product rows. Each row can be configured in one of two ways:
+
+* **Required product**: the product is defined directly in the pack. The customer does not choose this service, it is added automatically during the order.
+* **Customer choice**: you define several possible products, then the customer chooses the one they want during the order.
+
+The customer only pays for and renews the main pack product. When this product is renewed, the services included in the pack are renewed automatically.
+
+:::info
+Included services remain linked to the pack product. Renewal, suspension, or expiration should therefore be managed from the main pack service.
+:::
+
+## Create a pack product
+
+In the administration panel, create a new product and select the **Pack Of Products** type.
+
+Then configure the usual product information:
+
+* The pack name.
+* The product group.
+* The available stock.
+* The description.
+* The pack price.
+
+The price displayed to the customer corresponds to the pack product. Included products are not renewed separately by the customer.
+
+
+
+## Configure included products
+
+After creating the pack product, open the offer configuration. You can add content displayed in the global panel, then define the included product rows.
+
+Each row represents either a required product or a choice left to the customer.
+
+
+
+### Required product
+
+Use **Required product** when a service must always be included in the pack. Select the relevant product: it will be created automatically for every pack order.
+
+Example: a "Web Reseller" pack can always include a predefined reseller hosting product.
+
+### Customer choice
+
+Use **Customer choice** when the customer must choose between several products during the order.
+
+Example: a pack can include a game service and let the customer choose between several Minecraft offers. The configuration options of the selected product remain available during the order.
+
+## Customer order
+
+During the order, the customer selects the pack billing period, then configures the included products.
+
+Required products are displayed as included. **Customer choice** rows display a list of available products, then the options associated with the selected product.
+
+
+
+## Renewal
+
+The customer only renews the main pack service. During renewal, ClientXCMS automatically renews the other services linked to the pack.
+
+This avoids having several separate invoices or due dates for included products. The pack keeps a single commercial due date, even if it contains several technical services.
+
+:::warning
+Avoid manually renewing an included service separately from the pack, except for a specific support case. The main pack service should remain the billing reference.
+:::
+
+## Best practices
+
+* Create a clear pack product with a description listing the included services.
+* Use **Required product** for services that must always be provided.
+* Use **Customer choice** only when the customer should actually compare several products.
+* Check that included products are active, configured, and orderable before publishing the pack.
+* Test a complete order with the same options as your customers before putting the offer into production.
diff --git a/docs/installation/ansible.md b/docs/installation/ansible.md
index c79f485..5d0ca4e 100644
--- a/docs/installation/ansible.md
+++ b/docs/installation/ansible.md
@@ -3,7 +3,7 @@ sidebar_position: 5
translated: true
---
-# Automated Deployment with Ansible
+# Ansible
**Ansible** enables fully automated deployment of ClientXCMS, from prerequisite installation to production deployment. This method is recommended for production environments and multi-server deployments.
diff --git a/docs/installation/docker.md b/docs/installation/docker.md
index c72a101..b5eb3c8 100644
--- a/docs/installation/docker.md
+++ b/docs/installation/docker.md
@@ -1,75 +1,301 @@
---
-sidebar_position: 5
+sidebar_position: 6
translated: true
---
# Docker
-You can install ClientXCMS via Docker by following the steps below.
+This page explains how to install ClientXCMS with Docker Compose. This method prepares the required services in containers and keeps data persistent after a server restart.
+
+:::info
+The example below is based on Ubuntu/Debian. Commands may vary depending on your distribution.
+:::
## Prerequisites
Before you begin, make sure you have the following:
-- A server with Docker and Docker Compose installed. You can follow the installation instructions for:
- - [Docker](https://docs.docker.com/get-docker/)
- - [Docker Compose](https://docs.docker.com/compose/install/)
-- A domain name pointing to your server.
-Run the following commands to install Docker and Docker Compose on an Ubuntu server:
+- A clean Linux server with SSH access and a user that can run `sudo`.
+- Ports `80` and `443` open if you use a domain name and HTTPS.
+- A domain name pointing to your server for a production installation.
+- Your ClientXCMS OAuth credentials, available from your license management page in the [customer area](https://clientxcms.com/client/services/).
+
+## Docker installation
+
+First, update the server and install the base tools:
+
```bash
-docker compose build
+sudo apt update
+sudo apt upgrade -y
+sudo apt install git nano curl -y
```
+
+Then install Docker with the official script:
+
```bash
-docker compose up -d
+curl -fsSL https://get.docker.com -o get-docker.sh
+sudo sh get-docker.sh
```
-## Installation
+Check that Docker Compose is available:
-1. Create a directory for ClientXCMS and navigate to it:
```bash
-mkdir /var/www
-cd /var/www
+docker compose version
```
-2. Clone the ClientXCMS Git repository:
+## Retrieving ClientXCMS
+
+Create the installation folder, then clone the official repository:
+
```bash
-git clone https://github.com/ClientXCMS/clientxcms.git
+sudo mkdir -p /var/www
+cd /var/www
+sudo git clone https://github.com/ClientXCMS/ClientXCMS.git clientxcms
cd clientxcms
```
-3. Copy the example Docker Compose configuration file:
+Prepare the configuration files from the provided examples:
+
```bash
-cp docker-compose.example.yml docker-compose.yml
+sudo cp docker-compose.example.yml docker-compose.yml
+sudo cp .env.example .env
```
-4. Edit the environment file to configure the necessary variables, including the database connection and domain name:
+## Environment configuration
+
+Open the `.env` file:
+
+```bash
+sudo nano .env
+```
+
+At minimum, fill in your installation URL and the OAuth credentials for your license:
+
+```env
+APP_ENV=production
+APP_URL=https://your-domain.com
+
+OAUTH_CLIENT_ID=your_client_id
+OAUTH_CLIENT_SECRET=your_client_secret
+```
+
+Keep the database values intended for Docker, because the application service connects to the MySQL container through Docker's internal network:
+
+```env
+DB_CONNECTION=mysql
+DB_HOST=database
+DB_PORT=3306
+DB_DATABASE=clientxcms
+DB_USERNAME=clientxcms
+DB_PASSWORD=clientxcms
+```
+
+:::tip
+In `nano`, use `Ctrl + X`, then `Y`, then `Enter` to save and quit.
+:::
+
+## Docker Compose file check
+
+Before starting the containers, open the `docker-compose.yml` file:
+
```bash
-cp .env.example .env
-nano .env
+sudo nano docker-compose.yml
```
-You can modify variables such as the domain:
+Check that `APP_URL` is injected from the `.env` file, without a hardcoded default value:
+
+```yaml
+environment:
+ APP_URL: "${APP_URL}"
+ APP_ENV: "${APP_ENV:-production}"
+```
+
+:::warning
+Do not define `APP_URL` in two different places. The value used by ClientXCMS must come from the `.env` file, otherwise you may run into license, session, or OAuth authentication errors.
+:::
+
+If you use custom modules or extensions, also check that the modules volume points to the correct folder inside the container:
+
+```yaml
+services:
+ app:
+ volumes:
+ - ./modules:/app/modules
+ - ./storage:/var/www/html/storage
+```
+
+If your installation has module permission issues after a restart, you can add an `entrypoint` that fixes permissions before starting the application:
+
+```yaml
+services:
+ app:
+ entrypoint: ["/bin/sh", "-c", "chmod -R 777 /app/modules && chown -R www-data:www-data /app/modules && exec /bin/ash .github/docker/entrypoint.sh supervisord -n -c /etc/supervisord.conf"]
+```
+
+:::info
+The application folder inside the container is `/app` for modules. The volume must therefore point to `/app/modules`, not `/var/www/html/modules`.
+:::
+
+## Domain and SSL configuration
+
+If the `docker-compose.yml` file contains a Let's Encrypt configuration, set your email address in the proxy environment variables:
+
+```yaml
+- LETSENCRYPT_EMAIL=admin@your-domain.com
+```
+
+Your `APP_URL` must match the domain used by the proxy, for example:
+
```env
APP_URL=https://your-domain.com
-OAUTH_CLIENT_ID="XX"
-OAUTH_CLIENT_SECRET="XX"
```
-As well as your API keys, database connection, etc.
+:::warning
+For a production installation, avoid using a direct IP address. Use a domain name with HTTPS so session cookies work correctly.
+:::
+
+## Starting the containers
+
+Start ClientXCMS and the related services in the background:
+
+```bash
+sudo docker compose up -d
+```
+
+On the first startup, wait about 30 seconds so the database can initialize correctly. You can check the container status with:
+
+```bash
+sudo docker compose ps
+```
+
+## ClientXCMS initialization
+
+Then run the Laravel commands inside the `app` container:
+
+```bash
+sudo docker compose exec app php artisan key:generate
+sudo docker compose exec app php artisan optimize:clear
+sudo docker compose exec app php artisan clientxcms:install-admin
+```
+
+The last command creates the administrator account. Follow the instructions displayed in your terminal.
+
+If the application key is not written automatically to `.env`, display it and add it manually to the `APP_KEY` variable:
+
+```bash
+sudo docker compose exec app php artisan key:generate --show
+```
+
+:::info
+If your `docker-compose.yml` file uses another service name instead of `app`, replace `app` with the name displayed by `sudo docker compose ps`.
+:::
+
+## Panel access
+
+Once the installation is complete, open the address configured in `APP_URL`, then access the admin panel:
+
+```text
+https://your-domain.com/admin/login
+```
+
+Log in with the administrator account created earlier. The OAuth credentials entered in the `.env` file allow ClientXCMS to validate your license.
+
+## Installing a custom module
+
+Copy the module folder into the `modules` folder of your installation:
+
+```bash
+cd /var/www/clientxcms
+sudo mkdir -p modules
+```
+
+Then check that the module is visible from the container:
+
+```bash
+sudo docker compose exec app ls /app/modules
+```
+
+Then regenerate the autoload files and clear the caches:
+
+```bash
+sudo docker compose exec app composer dump-autoload
+sudo docker compose exec app php artisan optimize:clear
+```
+
+You can now activate it from the ClientXCMS administration panel.
+## Updating the installation
+
+To update the code and restart the containers:
+
+```bash
+cd /var/www/clientxcms
+sudo git pull
+sudo docker compose pull
+sudo docker compose up -d --build
+sudo docker compose exec app php artisan optimize:clear
+```
+
+## Troubleshooting
+
+### Local or IP address login
+
+If you install ClientXCMS without a domain name, for example with an `http://` URL, your browser may block session cookies. This can cause a `419 Page Expired` error when logging in.
+
+In that case, use a local configuration in `.env`:
+
+```env
+APP_ENV=local
+APP_URL=http://your-ip
+SESSION_DRIVER=cookie
+SESSION_SECURE_COOKIE=false
+SESSION_SECURE=false
+```
+
+If these variables are not passed to the container, add them to the `environment` section of the `app` service in `docker-compose.yml`:
-Docker will generate the SSL certificate via Let's Encrypt automatically by adding the email in the docker-compose.yml file:
```yaml
-- LETSENCRYPT_EMAIL=your_email@example.com
+environment:
+ APP_URL: "${APP_URL}"
+ SESSION_DRIVER: "${SESSION_DRIVER:-file}"
+ SESSION_SECURE_COOKIE: "${SESSION_SECURE_COOKIE:-false}"
+ SESSION_SECURE: "${SESSION_SECURE:-false}"
```
-5. Launch the Docker containers:
+Then restart the containers:
+
```bash
-docker-compose up --build -d
+sudo docker compose up -d
```
-6. Add an administrator account:
+If you changed `.env` after starting the container and the changes are not taken into account, copy the file into the container and clear the Laravel configuration:
+
```bash
-docker exec -it clientxcms_app-1 php artisan clientxcms:install-admin
+sudo docker compose cp .env app:/var/www/html/.env
+sudo docker compose exec app php artisan optimize:clear
```
-7. Access your domain name in a web browser to complete the installation by confirming license access.
+### "Token has been revoked" error
+
+This error usually means the OAuth credentials are missing, invalid, or Laravel is still using old configuration values.
+
+First, check the `.env` file:
+
+```env
+OAUTH_CLIENT_ID=your_client_id
+OAUTH_CLIENT_SECRET=your_client_secret
+```
+
+Then reload the configuration:
+
+```bash
+sudo docker compose exec app php artisan config:clear
+sudo docker compose exec app php artisan cache:clear
+```
+
+### Viewing logs
+
+If there is a problem during startup or installation, view the logs:
+
+```bash
+sudo docker compose logs -f
+```
diff --git a/docs/installation/installation.md b/docs/installation/installation.md
index 052b190..76deb8a 100644
--- a/docs/installation/installation.md
+++ b/docs/installation/installation.md
@@ -24,6 +24,8 @@ The cloud offering is available for all Premium and Enterprise licenses. You can
Self-hosted installation is more complex and requires validated accreditation. You will need a web server, a database, and PHP. You can follow the self-hosted installation instructions [here](./selfhosted).
+For a fully automated setup, the [installation script](./script) installs and configures the entire stack on a fresh server in a single command.
+
:::warning
Self-hosted installation requires system administration knowledge. If you are not confident, we recommend opting for Cloud installation.
:::
diff --git a/docs/installation/requis.md b/docs/installation/requis.md
index c2ea066..063fd6d 100644
--- a/docs/installation/requis.md
+++ b/docs/installation/requis.md
@@ -33,10 +33,6 @@ The corresponding plans are available on the following page:
- **Disk Space**: minimum **25 GB** required
- **RAM**: minimum **2 GB** (4 GB recommended)
-:::info CTXHosting
-You can rent a **preconfigured and optimized** virtual machine for ClientXCMS.
-We recommend checking out our [CTXHosting](https://ctxhosting.fr) project.
-:::
### PHP
diff --git a/docs/installation/script.md b/docs/installation/script.md
new file mode 100644
index 0000000..20643ac
--- /dev/null
+++ b/docs/installation/script.md
@@ -0,0 +1,134 @@
+---
+sidebar_position: 2
+translated: true
+---
+
+# Installation Script
+
+The **installation script** sets up a complete ClientXCMS stack on a fresh Linux
+server with a single command. It installs PHP 8.3, MariaDB, Nginx, Redis and
+Node.js, downloads ClientXCMS, configures everything and (optionally) obtains a
+Let's Encrypt certificate - then hands over to the web installer for license
+activation.
+
+It is the fastest way to self-host. If you prefer to install each component
+manually, see [Self-hosted](./selfhosted); for multi-server deployments, see
+[Ansible](./ansible).
+
+:::info Community script
+This script is community-maintained and distributed separately from the
+ClientXCMS core. Always review a script before running it as root. Source:
+[github.com/alexwrite/clientxcms-installer](https://github.com/alexwrite/clientxcms-installer)
+:::
+
+## Requirements
+
+- A **fresh server** with root access (or `sudo`).
+- A valid **Community** (or higher) license - see [Requirements](./requis).
+- One of the supported operating systems below.
+
+| Distribution | Versions |
+|--------------|----------|
+| Debian | 11, 12, 13 |
+| Ubuntu | 22.04, 24.04 |
+| Rocky Linux / AlmaLinux | 8, 9 |
+
+Architectures: `x86_64` and `arm64`. Minimum 2 GB RAM and 25 GB disk.
+
+:::warning
+Run the script on a **dedicated** server. It installs and configures system-wide
+services (Nginx, MariaDB, PHP-FPM, Redis); existing sites using these could be
+affected.
+:::
+
+## Quick start
+
+Run as root (or with `sudo`):
+
+```bash
+bash <(curl -sSL https://raw.githubusercontent.com/alexwrite/clientxcms-installer/main/install.sh)
+```
+
+Choose **Install ClientXCMS**, then answer the prompts. The script prints a
+summary and asks for confirmation before doing anything.
+
+## What it installs
+
+| Step | Detail |
+|------|--------|
+| Dependencies | PHP 8.3 + required extensions (Sury on Debian, ondrej PPA on Ubuntu, Remi on Rocky/Alma), MariaDB, Nginx, Redis, Node.js 20, Composer, Git |
+| Application | `git clone` of ClientXCMS into `/var/www/clientxcms`, `composer install`, `npm run build` |
+| Configuration | Writes `.env`, generates `APP_KEY`, wires the database and (optional) Redis drivers |
+| Database | Creates the database and user, runs `php artisan migrate --force --seed` and `storage:link` |
+| Services | Nginx vhost, scheduler cron, optional systemd queue worker |
+| Security | Optional firewall rules and a Let's Encrypt certificate via certbot |
+
+## Interactive options
+
+During the run you will be asked for:
+
+- the **domain name** (FQDN) pointing to the server (or an IP for a local test);
+- the default **locale** (`fr` / `en`);
+- the **database** name, user and password (leave the password empty to generate a strong one);
+- whether to use **Redis** for cache, sessions and queue;
+- whether to install a persistent **queue worker** (systemd service);
+- whether to open the **firewall** ports 22, 80 and 443;
+- whether to obtain a **Let's Encrypt** certificate (the domain must already resolve to the server).
+
+:::info
+If obtaining the Let's Encrypt certificate fails (DNS not propagated, ports
+closed), the installation still completes - the site stays on HTTP and the
+script shows the command to retry certbot later.
+:::
+
+## After the script: finish in the browser
+
+Like every self-hosted installation, ClientXCMS is finalised through the **web
+installer**, which activates your license online. Once the script completes:
+
+1. Open `http(s)://your-domain`.
+2. Follow the wizard: settings â license â admin account.
+3. Enter your **OAuth Client ID / Secret** from
+ [clientxcms.com/client/services](https://clientxcms.com/client/services/).
+
+## Unattended installation
+
+Every prompt has an environment-variable equivalent, so the installer module can
+run non-interactively (CI, provisioning):
+
+```bash
+env FQDN=panel.example.com APP_LOCALE=fr \
+ MYSQL_DB=clientxcms MYSQL_USER=clientxcms \
+ USE_REDIS=true CONFIGURE_WORKER=true \
+ CONFIGURE_LETSENCRYPT=true email=admin@example.com \
+ bash <(curl -sSL https://raw.githubusercontent.com/alexwrite/clientxcms-installer/main/installers/clientxcms.sh)
+```
+
+Leave `MYSQL_PASSWORD` unset to auto-generate one. Other overridable variables
+include `INSTALL_DIR`, `CLIENTXCMS_BRANCH`, `PHP_VERSION` and `NODE_VERSION`.
+
+## Updating
+
+Update an existing install to the latest version. Re-run the entrypoint and
+choose **Update**, or run it directly:
+
+```bash
+bash <(curl -sSL https://raw.githubusercontent.com/alexwrite/clientxcms-installer/main/installers/update.sh)
+```
+
+It follows the [Git upgrade procedure](./upgrade): maintenance mode, a database
+backup (saved to `storage/backups/`), `git pull`, `composer install`, migrations
+and extension updates, cache clear, asset rebuild, then it lifts maintenance and
+runs the post-update hook. Set `SKIP_BACKUP=true` to skip the backup.
+
+## Uninstall
+
+Re-run the entrypoint and choose **Uninstall**, or run it directly:
+
+```bash
+bash <(curl -sSL https://raw.githubusercontent.com/alexwrite/clientxcms-installer/main/installers/uninstall.sh)
+```
+
+It removes the application, its services, vhost and cron, and asks before
+dropping the database or deleting the files. A final opt-in step can also purge
+the whole stack (PHP, MariaDB, Nginx, Redis, Node).
diff --git a/docs/installation/selfhosted.md b/docs/installation/selfhosted.md
index 5f4cecb..1e8b7fb 100644
--- a/docs/installation/selfhosted.md
+++ b/docs/installation/selfhosted.md
@@ -8,283 +8,163 @@ import TabItem from '@theme/TabItem';
# Self-hosted
-This page will guide you through the installation of ClientXCMS Next Gen for self-hosted versions. Cloud offers are automatically installed on CLIENTXCMS servers. Cloud installation is available [here](./cloud).
+This page guides you through installing ClientXCMS Next Gen on a VPS or dedicated server. It targets a Debian 12 installation with PHP 8.3, MariaDB, and an Apache or Nginx web server.
+Self-hosting is recommended if you want to manage the server, updates, backups, and system configuration yourself. If you want a more automated installation, see the [Cloud](./cloud), [Plesk](./plesk), or [Docker](./docker) installation instead.
-## Download
+:::info
+This page complements the [technical requirements](./requis). The commands below are intended for Debian 12 and may vary depending on your distribution.
+:::
-You can download the latest version of ClientXCMS NextGen from the [Download area](https://clientxcms.com/client/downloads) or directly from GitHub: [https://github.com/ClientXCMS/ClientXCMS](https://github.com/ClientXCMS/ClientXCMS)
-Remember to check the [technical requirements](./requis) before starting the installation and to have a valid license. (see [here](https://clientxcms.com/pricing) to order a license)
+## Prerequisites
-
+Before you begin, make sure you have the following:
-:::info
-The example below is based on Debian 12, but commands may vary depending on your distribution.
-:::
-## Installation folder
-Create an installation folder for your CMS if you don't already have a web server. You can do this using the following command:
-```bash
-mkdir /var/www/clientxcms
-```
-## Downloading the source code
+- A Debian 12 VPS or dedicated server with SSH access.
+- A user that can run `sudo`.
+- A domain name pointing to the server.
+- An SSL certificate to use ClientXCMS over HTTPS.
+- A valid ClientXCMS license.
+- Your ClientXCMS OAuth credentials, available from your license management page in the [customer area](https://clientxcms.com/client/services/).
+- At least 100 MB of disk space available for the application, excluding backups and customer files.
-
-
-Download the latest version of ClientXCMS NextGen directly from GitHub:
-```bash
-curl -L -o clientxcms.zip https://github.com/ClientXCMS/ClientXCMS/releases/latest
-```
+## Server preparation
-Then extract the archive to the installation folder:
-```bash
-unzip clientxcms.zip -d /var/www/clientxcms
-mv /var/www/clientxcms/ClientXCMS-master/* /var/www/clientxcms
-rm -r /var/www/clientxcms/ClientXCMS-master
-```
+Update the server and install the base tools:
-:::info
-If you haven't installed ZIP, you can install it with the following command:
```bash
-sudo apt-get install zip unzip
-```
-:::
-
-
-If you prefer working with Git, clone the official repository directly:
-```bash
-cd /var/www
-git clone https://github.com/ClientXCMS/ClientXCMS.git clientxcms
-cd /var/www/clientxcms
+sudo apt update
+sudo apt upgrade -y
+sudo apt install ca-certificates apt-transport-https software-properties-common wget curl git unzip nano lsb-release -y
```
-You can then update your instance very easily:
+Install PHP 8.3 and the required extensions:
+
```bash
-git pull origin master
+curl -sSL https://packages.sury.org/php/README.txt | sudo bash -x
+sudo apt update
+sudo apt install php8.3 php8.3-fpm php8.3-cli php8.3-common php8.3-curl php8.3-bcmath php8.3-intl php8.3-mbstring php8.3-mysql php8.3-gd php8.3-xml php8.3-zip php8.3-fileinfo php8.3-opcache -y
```
-
-
-## Environment setup
-Create a `.env` file using the following command:
+Check the installed version:
+
```bash
- nano /var/www/clientxcms/.env
+php -v
```
-Then copy the content available [in this example file](https://cdn.clientxcms.com/ressources/docs/environment.example.txt) into the `.env` file.
-
-## PHP 8.3 Installation
-### Adding the Ondrej repository (Ubuntu/Debian)
+Install Composer:
-
-
+```bash
+php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
+php composer-setup.php
+sudo mv composer.phar /usr/local/bin/composer
+php -r "unlink('composer-setup.php');"
+```
-To install PHP 8.3 on Ubuntu/Debian, first add the Ondrej repository:
+Install Node.js LTS with NVM:
```bash
-# System update and prerequisites installation
-sudo apt update
-sudo apt install -y software-properties-common ca-certificates apt-transport-https wget curl lsb-release
-
-# Adding the Ondrej repository for PHP 8.3
-sudo add-apt-repository ppa:ondrej/php -y
-sudo apt update
+curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.0/install.sh | bash
+source ~/.bashrc
+nvm install --lts
+nvm use --lts
```
-### PHP 8.3 and extensions installation
-
-Install PHP 8.3 with all extensions required by ClientXCMS:
+Check the available versions:
```bash
-# PHP 8.3 and essential extensions installation
-sudo apt install -y php8.3 php8.3-fpm php8.3-cli php8.3-common \
- php8.3-bcmath php8.3-curl php8.3-dom php8.3-gd php8.3-intl \
- php8.3-libxml php8.3-mbstring php8.3-openssl php8.3-pdo \
- php8.3-pdo-mysql php8.3-simplexml php8.3-xml php8.3-zip \
- php8.3-opcache
+node -v
+npm -v
+composer --version
```
-
-
+## Retrieving the source code
-For CentOS, RHEL, or Rocky Linux, use the Remi repository:
+Create the installation folder:
```bash
-# Prerequisites and Remi repository installation
-sudo dnf install -y epel-release
-sudo dnf install -y https://rpms.remirepo.net/enterprise/remi-release-8.rpm
-
-# Enabling PHP 8.3 module
-sudo dnf module reset php -y
-sudo dnf module enable php:remi-8.3 -y
-
-# PHP 8.3 and extensions installation
-sudo dnf install -y php php-fpm php-common php-bcmath php-curl \
- php-dom php-gd php-intl php-libxml php-mbstring php-openssl \
- php-pdo php-pdo-mysql php-simplexml php-xml php-zip php-opcache
+sudo mkdir -p /var/www/clientxcms
+sudo chown -R $USER:www-data /var/www/clientxcms
+cd /var/www/clientxcms
```
-
-
+
+
-### Verifying the installation
+Download the latest ClientXCMS archive from the [download area](https://clientxcms.com/client/downloads), then upload it to your server, for example to `/tmp/clientxcms.zip`.
-Verify that PHP 8.3 is correctly installed:
+Then extract the archive into the installation folder:
```bash
-php --version
+unzip /tmp/clientxcms.zip -d /tmp/clientxcms-release
+cd /tmp/clientxcms-release/ClientXCMS-*
+cp -R . /var/www/clientxcms/
+cd /var/www/clientxcms
```
-You should see output similar to:
-```
-PHP 8.3.x (cli) (built: ...)
-```
+:::info
+The release archive is recommended for production installations because it matches a published version.
+:::
-### Recommended PHP configuration
+
+
-Modify the PHP configuration file to optimize performance:
+If you prefer working with Git, clone the official repository:
```bash
-# For PHP-FPM
-sudo nano /etc/php/8.3/fpm/php.ini
-
-# For PHP-CLI
-sudo nano /etc/php/8.3/cli/php.ini
+cd /var/www
+git clone https://github.com/ClientXCMS/ClientXCMS.git clientxcms
+cd /var/www/clientxcms
```
-Recommended settings:
-```ini
-memory_limit = 512M
-upload_max_filesize = 64M
-post_max_size = 64M
-max_execution_time = 300
-max_input_vars = 3000
-opcache.enable = 1
-opcache.memory_consumption = 128
-opcache.max_accelerated_files = 10000
-```
-
-## Composer Installation
-To install Composer, you can use the following command:
-```bash
-php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
-php composer-setup.php
-php -r "unlink('composer-setup.php');"
-```
-You can now install the project dependencies using the following command:
+You can then update the instance with:
+
```bash
-./composer.phar install --optimize-autoloader --no-dev
+git fetch --all --prune
+git checkout master
+git pull origin master
```
-## MySQL Setup
-:::info
-We will install MariaDB, which is an enhanced version of MySQL.
+:::warning
+This method follows the repository's main branch. For production use, prefer a stable release archive.
:::
-To install the MySQL server, you can use the following command:
-```bash
-sudo apt-get install mariadb-server
-```
-When prompted, confirm the installation by typing Y, then ENTER.
+
+
-Once the installation is complete, it is recommended to run a security script, pre-installed with MySQL. This script will remove some insecure default settings and lock down access to your database system. Run the interactive script by executing:
-```bash
-sudo mysql_secure_installation
-```
-Answer the following questions according to your needs:
-- Press Enter if you haven't set one previously
-- Set a root password for MySQL
-- Remove anonymous user > Y
-- Disallow remote login to the database > Y
-- Remove test database > Y
-- Reload privileges > Y
+## Web server configuration
-You can now connect to MySQL using the following command:
-```bash
-mysql -u root -p
-```
-## Web server setup
+The web server must point to the ClientXCMS `public` folder. The examples below do not replace SSL configuration: in production, configure HTTPS with your certificate before finalizing the installation.
-
-:::info
-Here, we do not cover how to install an SSL certificate.
-:::
+
- To install Apache, you can use the following command:
-```bash
-sudo apt-get install apache2 libapache2-mod-php
-```
-To enable the rewrite module, you can use the following command:
-```bash
-sudo a2enmod rewrite
-```
-To add a virtual host, you can use the following command:
-```bash
-sudo nano /etc/apache2/sites-available/clientxcms.conf
-```
-#### Configuration file example
-```bash
-
- ServerAdmin webmaster@localhost
- DocumentRoot /var/www/clientxcms/public
- ServerName domain.fr
- ServerAlias www.domain.fr
-
-
- Options FollowSymLinks
- AllowOverride All
-
-
- Options FollowSymLinks MultiViews
- Options -Indexes
- AllowOverride All
- Order allow,deny
- allow from all
-
-
- LogLevel debug
- ErrorLog ${APACHE_LOG_DIR}/error.log
- CustomLog ${APACHE_LOG_DIR}/access.log combined
+Install Nginx:
-
-```
-To enable the vhost, you can use the following command:
-```bash
-sudo a2ensite clientxcms.conf
-```
-To make sure the configuration file is correct, you can use the following command:
-```bash
-sudo apache2ctl configtest
-```
-To restart Apache, you can use the following command:
-```bash
-sudo systemctl restart apache2
-```
-
-
-:::info
-Here, we do not cover how to install an SSL certificate.
-:::
- To install Nginx, you can use the following command:
```bash
-sudo apt-get install nginx php8.3-fpm
+sudo apt install nginx -y
```
-To add a virtual host, you can use the following command:
+
+Create the vhost:
+
```bash
sudo nano /etc/nginx/sites-available/clientxcms.conf
```
-#### Configuration file example
-```bash
+
+Configuration example:
+
+```nginx
server {
listen 80;
- server_name domain.fr www.domain.fr;
+ server_name your-domain.com www.your-domain.com;
root /var/www/clientxcms/public;
- index index.php index.html index.htm;
+ index index.php index.html;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
+
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php8.3-fpm.sock;
@@ -297,149 +177,203 @@ server {
}
}
```
-To enable the vhost, you can use the following command:
+
+Enable the site, then reload Nginx:
+
```bash
-sudo ln -s /etc/nginx/sites-available/clientxcms.conf /etc/nginx/sites-enabled/
+sudo ln -s /etc/nginx/sites-available/clientxcms.conf /etc/nginx/sites-enabled/clientxcms.conf
+sudo nginx -t
+sudo systemctl reload nginx
```
-To make sure the configuration file is correct, you can use the following command:
+
+
+
+
+Install Apache and the PHP module:
+
```bash
-sudo nginx -t
+sudo apt install apache2 libapache2-mod-php8.3 -y
+sudo a2enmod rewrite
```
-To restart Nginx, you can use the following command:
+
+Create the vhost:
+
```bash
-sudo systemctl restart nginx
+sudo nano /etc/apache2/sites-available/clientxcms.conf
+```
+
+Configuration example:
+
+```apache
+
+ ServerName your-domain.com
+ ServerAlias www.your-domain.com
+ DocumentRoot /var/www/clientxcms/public
+
+
+ Options FollowSymLinks
+ AllowOverride All
+ Require all granted
+
+
+ ErrorLog ${APACHE_LOG_DIR}/clientxcms-error.log
+ CustomLog ${APACHE_LOG_DIR}/clientxcms-access.log combined
+
+```
+
+Enable the site, then reload Apache:
+
+```bash
+sudo a2ensite clientxcms.conf
+sudo apache2ctl configtest
+sudo systemctl reload apache2
```
+
-## Database configuration
-To configure the database, you can use the following command:
+## Database
+
+Install MariaDB:
+
```bash
-mysql -u root -p
+sudo apt install mariadb-server -y
+sudo mysql_secure_installation
```
-Create a database and user using the following commands. We recommend replacing the password with a more secure one:
-```sql
-CREATE DATABASE clientxcms;
-CREATE USER clientxcms@localhost IDENTIFIED BY 'password';
-GRANT ALL PRIVILEGES ON clientxcms.* TO clientxcms@localhost;
-FLUSH PRIVILEGES;
+
+Connect to MariaDB:
+
+```bash
+sudo mysql
```
-You can now exit MySQL using the following command:
+
+Create the database and user:
+
```sql
-exit
+CREATE DATABASE clientxcms CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
+CREATE USER 'clientxcms'@'localhost' IDENTIFIED BY 'replace_this_password';
+GRANT ALL PRIVILEGES ON clientxcms.* TO 'clientxcms'@'localhost';
+FLUSH PRIVILEGES;
+EXIT;
```
-You can now modify the database connection information in the `.env` file using the following command:
+:::warning
+Replace `replace_this_password` with a strong password and keep it for the `.env` file.
+:::
+
+## Environment configuration
+
+Copy the example file:
+
```bash
+cd /var/www/clientxcms
+cp .env.example .env
nano .env
```
-Then modify the database connection information:
+Fill in the main values:
+
```env
+APP_ENV=production
+APP_URL=https://your-domain.com
+
+OAUTH_CLIENT_ID=your_client_id
+OAUTH_CLIENT_SECRET=your_client_secret
+
DB_CONNECTION=mysql
DB_HOST=localhost
DB_PORT=3306
DB_DATABASE=clientxcms
DB_USERNAME=clientxcms
-DB_PASSWORD=password
-```
+DB_PASSWORD=replace_this_password
-## Other configurations
-To generate an application key, you can use the following command:
-```bash
-php artisan key:generate
-```
-To migrate the database, you can use the following command:
-```bash
-php artisan migrate --force --seed
-```
-To link the storage folder, you can use the following command:
-```bash
-php artisan storage:link
-```
-To add the correct permissions, you can use the following command:
-```bash
-sudo chmod -R 775 storage bootstrap/cache
+QUEUE_CONNECTION=database
+CACHE_STORE=file
+SESSION_DRIVER=file
```
-## Assets
-:::info
-The first part covers Node.js installation, but if you already have it installed, you can skip to compiling the assets.
+Also configure the mail variables according to your SMTP provider so ClientXCMS can send transactional emails.
+
+:::tip
+In `nano`, use `Ctrl + X`, then `Y`, then `Enter` to save and quit.
:::
-First, we need to install NVM, which is a Node.js version manager. To do this, run the following command:
+## ClientXCMS installation
+
+Install the PHP dependencies:
+
```bash
-curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.0/install.sh | bash
+cd /var/www/clientxcms
+composer install --optimize-autoloader --no-dev
```
-Then, you can download and install Node.js (you may need to restart the terminal):
+Initialize Laravel:
+
```bash
-nvm install 18
+php artisan key:generate
+php artisan migrate --force --seed
+php artisan storage:link
+php artisan optimize:clear
```
-Now verify that the correct version of Node.js is installed with this command:
+Apply the required permissions for the web server:
+
```bash
-node -v
+sudo chown -R www-data:www-data /var/www/clientxcms/storage /var/www/clientxcms/bootstrap/cache
+sudo chmod -R 775 /var/www/clientxcms/storage /var/www/clientxcms/bootstrap/cache
```
-This should display `v18.20.4`, which is the current LTS version of Node.js version 18.
-
+## Asset compilation
+
+Install the JavaScript dependencies, then compile the assets:
-To compile the assets, you can use the following commands:
```bash
+cd /var/www/clientxcms
npm install
npm run build
```
-## Scheduled tasks
-To configure scheduled tasks, you can use the following command:
-```bash
-crontab -e
-```
-Then add the following line:
-```bash
-* * * * * php /var/www/clientxcms/artisan schedule:run >> /dev/null 2>&1
-```
-
+:::info
+If you install or activate a theme later, run `npm run build` again.
+:::
-## Laravel Queues Configuration
+## Scheduled tasks and queues
-Laravel uses a queue system to execute tasks in the background, which improves performance by avoiding synchronous processing.
-In your `.env` file, configure the queue driver according to your environment:
+Add the Laravel scheduler to the web server user's crontab:
-```env
-QUEUE_CONNECTION=database
+```bash
+sudo crontab -u www-data -e
```
-Available options are:
-- `sync`: Executes jobs immediately (not in background).
-- `database`: Uses the database to store jobs.
-- `redis`: Uses Redis for more performant queue management.
-- `sqs`: Uses Amazon SQS.
+Add this line:
-Make sure your application uses the correct driver.
+```bash
+* * * * * php /var/www/clientxcms/artisan schedule:run >> /dev/null 2>&1
+```
-If you want to ensure the worker always runs, use `supervisor`. Install it first:
+To process background tasks, install Supervisor:
```bash
-sudo apt update
-sudo apt install supervisor
+sudo apt install supervisor -y
+sudo nano /etc/supervisor/conf.d/clientxcms-worker.conf
```
-Then, create a configuration file `/etc/supervisor/conf.d/clientxcms-worker.conf`:
+Add the following configuration:
```ini
[program:clientxcms-worker]
process_name=%(program_name)s_%(process_num)02d
command=php /var/www/clientxcms/artisan queue:work --sleep=3 --tries=3 --timeout=90
+directory=/var/www/clientxcms
autostart=true
autorestart=true
+user=www-data
numprocs=1
redirect_stderr=true
stdout_logfile=/var/log/clientxcms-worker.log
```
-Reload and start Supervisor:
+Reload Supervisor:
```bash
sudo supervisorctl reread
@@ -447,78 +381,81 @@ sudo supervisorctl update
sudo supervisorctl start clientxcms-worker:*
```
-## ClientXCMS Configuration
-
-1. Go to your customer area address. You should see an installation page similar to this one:
- 
+## Finalization
-2. Replace "CLIENTXCMS" with your hosting company trade name.
+Open your browser at the URL configured in `APP_URL`:
-3. To find the **Client ID** and **Client Secret**, go to the ClientXCMS customer area: [https://clientxcms.com/client/services/](https://clientxcms.com/client/services/), in the management of the relevant NextGen license.
- 
- The "**OAuth Client ID**" and "**OAuth Secret**" credentials are required to connect the ClientXCMS license to your site. Then click the "Login" button on your instance.
+```text
+https://your-domain.com
+```
+Follow the installation wizard, enter your hosting company name, then connect your license with the OAuth credentials retrieved from the [ClientXCMS customer area](https://clientxcms.com/client/services/).
## Extension purchase
-If you purchase extensions in the meantime and get the following error message when you want to activate them:
+
+If you purchase an extension and the following message appears during activation:
> **"The composer.json file was not found."**
-You can download the extension archive from the download page of the customer area. You can then extract it to your ClientXCMS instance.
+Download the extension archive from the customer area, then extract it on your ClientXCMS instance.
+

-:::info
-For themes, you need to run the `npm run build` command again to activate them.
-:::
## Migration from a cloud version
-If you want to migrate a cloud installation to your server, you can follow these steps:
-1. Download a backup of your database from the PHPMyAdmin interface on the database page of the administration.
+
+If you want to migrate a cloud installation to your server:
+
+1. Download a database backup from the administration or PHPMyAdmin.
2. Open a support request to obtain the encryption key of your cloud instance.
3. Import the backup into your local database.
-4. Modify the `.env` file to match your encryption key with the encryption key of your cloud instance.
-5. Run the command `php artisan migrate --force --seed` to update your database.
-6. Run the command `php artisan storage:link` to link the storage folder.
-7. Create a `storage/installed` file to indicate that the installation is complete.
-8. You can now access your local instance.
+4. Replace the encryption key in your `.env` file with the cloud instance encryption key.
+5. Run `php artisan migrate --force --seed`.
+6. Run `php artisan storage:link`.
+7. Create the `storage/installed` file if the installation wizard should not run again.
## Common problems
-### Interface not found Jsonable
+### Jsonable interface not found
+
+If you get the `Interface "DragonCode/Contracts/Support/Jsonable" not found` error, install the missing dependency:
-If you get the following error:
-"Interface "DragonCode/Contracts/Support/Jsonable" not found"
-You can fix it by running the command:
```bash
composer require dragon-code/contracts
+php artisan optimize:clear
```
-### Theme activated but not displayed on the interface
+### Theme activated but not displayed
+
+If an activated theme is not displayed, add this variable to `.env`:
-If you have activated a theme but it is not displayed on the interface, you can add the following variable in the `.env` file:
```env
APP_REVERSE_PATHS=true
```
-This is because PHP doesn't read files the same way on every server. This variable fixes this issue.
-
-
-### Logo not displaying on the interface
+Then clear the caches:
-If you don't get an error when adding your logo, you may have a permission issue on the storage folder. You can fix this issue by running the following command:
```bash
-sudo chmod -R 775 storage
+php artisan optimize:clear
```
-If you have issues from one day to the next, you probably have a cache problem. You can fix it by running the following command:
+### Logo or uploaded files not displayed
+
+Check the storage link and permissions:
+
```bash
+php artisan storage:link
+sudo chown -R www-data:www-data storage bootstrap/cache
+sudo chmod -R 775 storage bootstrap/cache
php artisan cache:clear
```
-or you can check the permissions of your cache folder (storage/framework/cache).
-### Permission issues on the logs folder
-If you regularly have permission issues in the logs folder, this is probably because you ran commands with a different user than the one used by the web server (www-data on Debian/Ubuntu). To fix this issue, you can run the following command to set the correct permissions:
+### Permission issues in logs
+
+If log files are created with the wrong user, reapply permissions:
+
```bash
+sudo chown -R www-data:www-data storage/logs
sudo chmod -R 775 storage/logs
```
-This can also come from cron jobs running with a different user. Make sure permissions are correctly set for all users who might access these files.
+Also make sure cron tasks and Supervisor run as the `www-data` user.
diff --git a/docusaurus.config.ts b/docusaurus.config.ts
index e6c9071..01a136a 100644
--- a/docusaurus.config.ts
+++ b/docusaurus.config.ts
@@ -139,7 +139,7 @@ const config: Config = {
{ to: '/api', label: 'API', position: 'left' },
{ to: 'https://clientxcms.com/resources', label: 'Resources', position: 'left' },
{ to: 'https://clientxcms.com/changelogs', label: 'Changelog', position: 'left' },
- { to: 'https://ideas.clientxcms.com', label: 'Submit an idea', position: 'left' },
+ { to: 'https://clientxcms.com/ideas', label: 'Submit an idea', position: 'left' },
{
href: 'https://clientxcms.com',
label: 'Back to website',
@@ -214,7 +214,7 @@ const config: Config = {
},
{
label: 'Submit an idea',
- href: 'https://ideas.clientxcms.com',
+ href: 'https://clientxcms.com/ideas',
},
{
label: 'Submit an extension',
diff --git a/i18n/fr/docusaurus-plugin-content-blog/2025-05-31-mise-en-opensource.md b/i18n/fr/docusaurus-plugin-content-blog/2025-05-31-mise-en-opensource.md
index b382fe7..f11d2a6 100644
--- a/i18n/fr/docusaurus-plugin-content-blog/2025-05-31-mise-en-opensource.md
+++ b/i18n/fr/docusaurus-plugin-content-blog/2025-05-31-mise-en-opensource.md
@@ -119,7 +119,7 @@ Nous allons concentrer nos efforts sur :
* et la valorisation des idées émanant de la communauté.
đ Pour cela, nous avons lancĂ© un site dĂ©diĂ© :
-đ [ideas.clientxcms.com](https://ideas.clientxcms.com)
+đ [clientxcms.com/ideas](https://clientxcms.com/ideas)
Un espace oĂč vous pouvez vous connecter via Discord, **voter pour les idĂ©es d'extensions**, en proposer de nouvelles, et suivre leur Ă©volution. L'objectif est clair : co-construire un outil au plus prĂšs des besoins rĂ©els.

diff --git a/i18n/fr/docusaurus-plugin-content-blog/2025-09-05-lancement-opensource.md b/i18n/fr/docusaurus-plugin-content-blog/2025-09-05-lancement-opensource.md
index 53b105d..2a7f797 100644
--- a/i18n/fr/docusaurus-plugin-content-blog/2025-09-05-lancement-opensource.md
+++ b/i18n/fr/docusaurus-plugin-content-blog/2025-09-05-lancement-opensource.md
@@ -24,7 +24,7 @@ Vous pouvez également plus de 30 dépÎts liés à CLIENTXCMS sur notre organis
N'hésitez pas à :
- Mettre une â sur le dĂ©pĂŽt pour soutenir le projet
- Créer vos issues et pull requests
-- Partager vos idées via [ideas.clientxcms.com](https://ideas.clientxcms.com)
+- Partager vos idées via [clientxcms.com/ideas](https://clientxcms.com/ideas)
- Rejoindre notre [forum](https://forum.clientxcms.com) pour échanger avec la communauté
## đ ïž Nouvelle interface des extensions & Marketplace
diff --git a/i18n/fr/docusaurus-plugin-content-blog/2025-12-31-bonne-annee-2026.md b/i18n/fr/docusaurus-plugin-content-blog/2025-12-31-bonne-annee-2026.md
index 6103ac2..1d302a2 100644
--- a/i18n/fr/docusaurus-plugin-content-blog/2025-12-31-bonne-annee-2026.md
+++ b/i18n/fr/docusaurus-plugin-content-blog/2025-12-31-bonne-annee-2026.md
@@ -90,7 +90,7 @@ La v2.15 (mi-février 2026) intÚgrera **trois nouvelles plateformes de paiement
Ces solutions viennent enrichir l'écosystÚme et faciliter l'adoption de ClientXCMS dans différents contextes.
-N'hésitez pas à suggérer des plateformes de paiement via la [plateforme d'idée](https://ideas.clientxcms.com).
+N'hésitez pas à suggérer des plateformes de paiement via la [plateforme d'idée](https://clientxcms.com/ideas).

@@ -143,7 +143,7 @@ Parmi les extensions et nouveautés attendues :
Enfin, nous un de nos objectifs majeurs pour cette nouvelle année est le développement de **l'internationalisation du CMS**, afin de propulser ClientXCMS au-delà des frontiÚres françaises et de toucher une communauté mondiale.
-đ Les propositions sont ouvertes sur **https://ideas.clientxcms.com**
+đ Les propositions sont ouvertes sur **https://clientxcms.com/ideas**
## Un mot pour finir
diff --git a/i18n/fr/docusaurus-plugin-content-docs/current/developpers/extensions/create.md b/i18n/fr/docusaurus-plugin-content-docs/current/developpers/extensions/create.md
index 0e147e2..71a382b 100644
--- a/i18n/fr/docusaurus-plugin-content-docs/current/developpers/extensions/create.md
+++ b/i18n/fr/docusaurus-plugin-content-docs/current/developpers/extensions/create.md
@@ -18,6 +18,30 @@ Lors de l'exécution de cette commande, plusieurs questions vous seront posées,
- **Utilisation des contrÎleurs** : Indiquer si des contrÎleurs sont nécessaires.
- **Utilisation d'une base de données** : Préciser si l'extension nécessite l'utilisation d'une base de données.
+### Création via CLI avec options
+Pour créer une extension sans passer par les questions interactives, vous pouvez utiliser la commande suivante :
+
+```bash
+php artisan clientxcms:create-extension \
+ --name="Mon extension" \
+ --uuid="mon-extension" \
+ --type="addon" \
+ --routes=1 \
+ --controllers=1 \
+ --database=1 \
+ --views=1 \
+ --lang=1
+```
+#### Détail des options
+--name : nom affichĂ© de lâextension.
+--uuid : identifiant unique de lâextension.
+--type : type de lâextension. Valeurs possibles : addon ou module.
+--routes : crée les fichiers de routes.
+--controllers : crée les contrÎleurs.
+--database : crée les fichiers liés à la base de données, comme les migrations et seeders.
+--views : crĂ©e les vues de lâextension.
+--lang : crée les fichiers de traduction.
+
#### Structure d'un addon
Voici un exemple de la structure d'un addon, basé sur l'extension `fund` :
diff --git a/i18n/fr/docusaurus-plugin-content-docs/current/developpers/themes/create-theme.md b/i18n/fr/docusaurus-plugin-content-docs/current/developpers/themes/create-theme.md
index 504b177..94162ab 100644
--- a/i18n/fr/docusaurus-plugin-content-docs/current/developpers/themes/create-theme.md
+++ b/i18n/fr/docusaurus-plugin-content-docs/current/developpers/themes/create-theme.md
@@ -43,6 +43,39 @@ php artisan clientxcms:create-theme
```
La commande vous demandera le nom du thÚme et créera la structure du thÚme pour vous selon vos réponses.

+
+
+### Création via CLI avec options
+
+Pour créer un thÚme sans passer par les questions interactives, vous pouvez utiliser la commande suivante :
+
+```bash
+php artisan clientxcms:create-theme \
+ --name="Mon thĂšme" \
+ --uuid="mon-theme" \
+ --parent="default" \
+ --description="Description du thĂšme" \
+ --author-name="ClientXCMS" \
+ --author-email="contact@clientxcms.com" \
+ --css=1 \
+ --js=1 \
+ --config=1 \
+ --lang=1
+```
+
+#### Détail des options
+
+* `--name` : nom affiché du thÚme.
+* `--uuid` : identifiant unique du thĂšme.
+* `--parent` : thÚme parent utilisé comme base. Valeurs possibles : `default` ou `bootstrap`.
+* `--description` : description du thĂšme.
+* `--author-name` : nom de lâauteur.
+* `--author-email` : adresse e-mail de lâauteur.
+* `--css` : crée le fichier CSS principal du thÚme.
+* `--js` : crée le fichier JavaScript principal du thÚme.
+* `--config` : crée les fichiers de configuration du thÚme.
+* `--lang` : crée les fichiers de langue du thÚme.
+
## Fichier du thĂšme
Le fichier `theme.json` est le fichier de configuration du thĂšme. Il contient les informations du thĂšme.
```json
diff --git a/i18n/fr/docusaurus-plugin-content-docs/current/extensions/addons/late_fees.md b/i18n/fr/docusaurus-plugin-content-docs/current/extensions/addons/late_fees.md
new file mode 100644
index 0000000..e0a3f49
--- /dev/null
+++ b/i18n/fr/docusaurus-plugin-content-docs/current/extensions/addons/late_fees.md
@@ -0,0 +1,74 @@
+# Pénalités de retard
+
+L'extension **PĂ©nalitĂ©s de retard** vous permet d'automatiser l'application de frais supplĂ©mentaires sur les factures impayĂ©es aprĂšs leur date d'Ă©chĂ©ance. Elle offre une grande flexibilitĂ© pour configurer des montants fixes ou en pourcentage, gĂ©rer des pĂ©riodes de grĂące et mĂȘme excepter certains clients.
+
+:::info
+Le traitement des pénalités s'effectue automatiquement chaque jour à **06:00** via une tùche planifiée.
+:::
+
+## Configuration globale
+
+Pour configurer les pénalités de retard, rendez-vous dans **ParamÚtres > Facturation > ParamÚtres des pénalités**.
+
+
+
+### ParamĂštres disponibles :
+
+| ParamĂštre | Description |
+| :--- | :--- |
+| **Activer les pénalités de retard** | Active ou désactive globalement le traitement automatique. |
+| **Type de pénalité** | Choisissez entre un montant fixe ou un pourcentage du montant de la facture. |
+| **Montant de la pĂ©nalitĂ©** | La valeur Ă appliquer (ex: 10 pour 10% ou 5.00 pour 5âŹ). |
+| **Plafond maximal** | (Optionnel) Définit le montant maximum qu'une pénalité peut atteindre. |
+| **Délai de grùce (jours)** | Nombre de jours aprÚs la date d'échéance avant que la pénalité ne soit appliquée. |
+| **Jours d'avertissement avant** | Nombre de jours avant l'échéance pour envoyer un email d'avertissement. |
+| **Pénalités récurrentes** | Si activé, la pénalité sera réappliquée périodiquement si la facture reste impayée. |
+| **Intervalle de récurrence (jours)** | Fréquence à laquelle la pénalité récurrente est appliquée. |
+| **Texte légal** | Texte affiché sur la facture pour justifier la pénalité (disponible en plusieurs langues). |
+| **Notifications** | Possibilité d'envoyer un email d'avertissement avant application et un email une fois la pénalité appliquée. |
+
+## Exemptions clients
+
+Il est possible d'exclure certains clients de l'application automatique des pénalités (par exemple pour des clients VIP ou des comptes institutionnels).
+
+Accédez à la section **Exemptions clients** en bas de la page des paramÚtres.
+
+
+
+1. Recherchez le client Ă excepter dans le champ **Client**.
+2. Indiquez une **Raison** (optionnel) pour conserver une trace.
+3. Cliquez sur **Ajouter une exemption**.
+
+## Gestion des pénalités
+
+Vous pouvez suivre l'ensemble des pénalités appliquées dans la page **Pénalité de retard** accessible via le menu d'administration.
+
+
+
+Cette page affiche des statistiques globales :
+- **Total appliquées** : Nombre de pénalités générées.
+- **Montant total** : Valeur cumulée des pénalités.
+- **Total encaissé** : Montant des pénalités payées par les clients.
+- **En attente** : Montant restant Ă percevoir.
+
+Vous pouvez filtrer la liste par statut (En attente, Appliquée, Payée, Annulée), par client ou par date.
+
+## Application manuelle
+
+Si vous avez besoin d'ajouter une pénalité ponctuelle à une facture spécifique, vous pouvez le faire manuellement en utilisant le bouton **Appliquer une pénalité manuelle**.
+
+
+
+Il suffit de sélectionner la facture concernée et d'indiquer le montant de la pénalité à appliquer immédiatement. La pénalité sera alors ajoutée à la facture (ou créée séparément selon votre configuration).
+
+## Détail et annulation
+
+En cliquant sur **Afficher** pour une pénalité spécifique, vous accédez à ses détails et pouvez l'annuler si nécessaire.
+
+
+
+Pour annuler une pénalité :
+1. Indiquez une raison dans le champ **Notes**.
+2. Cliquez sur **Annuler la pénalité**.
+
+Une fois annulée, le statut passera à **Annulée** et le montant ne sera plus dû.
diff --git a/i18n/fr/docusaurus-plugin-content-docs/current/extensions/addons/pack.md b/i18n/fr/docusaurus-plugin-content-docs/current/extensions/addons/pack.md
new file mode 100644
index 0000000..b94417c
--- /dev/null
+++ b/i18n/fr/docusaurus-plugin-content-docs/current/extensions/addons/pack.md
@@ -0,0 +1,82 @@
+# Pack de service
+
+L'add-on **Pack de service** permet de vendre plusieurs services dans une seule offre. Le client commande un produit de type pack, puis ClientXCMS crée automatiquement les services inclus dans ce pack.
+
+Le pack est utile pour proposer des offres groupées, par exemple un hébergement web avec un serveur de jeu, un service revendeur avec des options incluses, ou toute combinaison de produits que vous souhaitez renouveler ensemble.
+
+
+
+## Fonctionnement
+
+Un pack contient plusieurs lignes de produits. Chaque ligne peut ĂȘtre configurĂ©e de deux façons :
+
+* **Produit obligatoire** : le produit est défini directement dans le pack. Le client ne choisit pas ce service, il est ajouté automatiquement lors de la commande.
+* **Choix client** : vous définissez plusieurs produits possibles, puis le client choisit celui qu'il veut pendant la commande.
+
+Le client paie et renouvelle uniquement le produit principal du pack. Quand ce produit est renouvelé, les services inclus dans le pack sont renouvelés automatiquement.
+
+:::info
+Les services inclus restent liĂ©s au produit pack. Le renouvellement, la suspension ou l'expiration doivent donc ĂȘtre gĂ©rĂ©s depuis le service principal du pack.
+:::
+
+## Créer un produit pack
+
+Dans l'administration, créez un nouveau produit puis sélectionnez le type **Pack Of Products**.
+
+Configurez ensuite les informations classiques du produit :
+
+* Le nom du pack.
+* Le groupe du produit.
+* Le stock disponible.
+* La description.
+* Le prix du pack.
+
+Le prix affiché au client correspond au produit pack. Les produits inclus ne sont pas renouvelés séparément par le client.
+
+
+
+## Configurer les produits inclus
+
+AprÚs la création du produit pack, ouvrez la configuration de l'offre. Vous pouvez ajouter un contenu affiché dans le panel global, puis définir les lignes de produits incluses.
+
+Chaque ligne représente soit un produit imposé, soit un choix laissé au client.
+
+
+
+### Produit obligatoire
+
+Utilisez le mode **Produit obligatoire** lorsqu'un service doit toujours ĂȘtre inclus dans le pack. SĂ©lectionnez le produit concernĂ© : il sera créé automatiquement Ă chaque commande du pack.
+
+Exemple : un pack "Revendeur Web" peut toujours inclure un produit d'hébergement revendeur défini d'office.
+
+### Choix client
+
+Utilisez le mode **Choix client** lorsque le client doit choisir entre plusieurs produits au moment de la commande.
+
+Exemple : un pack peut inclure un service de jeu et laisser le client choisir entre plusieurs offres Minecraft. Les options de configuration du produit choisi restent disponibles pendant la commande.
+
+## Commande cÎté client
+
+Pendant la commande, le client sélectionne la période de facturation du pack, puis configure les produits inclus.
+
+Les produits obligatoires sont affichés comme inclus. Les lignes en **Choix client** affichent une liste de produits disponibles, puis les options associées au produit choisi.
+
+
+
+## Renouvellement
+
+Le client renouvelle uniquement le service principal du pack. Lors du renouvellement, ClientXCMS renouvelle automatiquement les autres services liés au pack.
+
+Ce fonctionnement Ă©vite d'avoir plusieurs factures ou Ă©chĂ©ances sĂ©parĂ©es pour les produits inclus. Le pack garde une seule Ă©chĂ©ance commerciale, mĂȘme s'il contient plusieurs services techniques.
+
+:::warning
+Ăvitez de renouveler manuellement un service inclus sĂ©parĂ©ment du pack, sauf cas de support prĂ©cis. Le service principal du pack doit rester la rĂ©fĂ©rence de facturation.
+:::
+
+## Bonnes pratiques
+
+* Créez un produit pack clair, avec une description qui liste les services inclus.
+* Utilisez **Produit obligatoire** pour les services qui doivent toujours ĂȘtre fournis.
+* Utilisez **Choix client** uniquement lorsque le client doit réellement comparer plusieurs produits.
+* Vérifiez que les produits inclus sont actifs, configurés et commandables avant de publier le pack.
+* Testez une commande complĂšte avec les mĂȘmes options que vos clients avant de mettre l'offre en production.
diff --git a/i18n/fr/docusaurus-plugin-content-docs/current/installation/ansible.md b/i18n/fr/docusaurus-plugin-content-docs/current/installation/ansible.md
index 28a8929..1e22c38 100644
--- a/i18n/fr/docusaurus-plugin-content-docs/current/installation/ansible.md
+++ b/i18n/fr/docusaurus-plugin-content-docs/current/installation/ansible.md
@@ -2,7 +2,7 @@
sidebar_position: 5
---
-# Déploiement automatisé avec Ansible
+# Ansible
**Ansible** permet un déploiement entiÚrement automatisé de ClientXCMS, de l'installation des prérequis jusqu'à la mise en production. Cette méthode est recommandée pour les environnements de production et les déploiements multi-serveurs.
diff --git a/i18n/fr/docusaurus-plugin-content-docs/current/installation/docker.md b/i18n/fr/docusaurus-plugin-content-docs/current/installation/docker.md
index 0be8f45..97f09df 100644
--- a/i18n/fr/docusaurus-plugin-content-docs/current/installation/docker.md
+++ b/i18n/fr/docusaurus-plugin-content-docs/current/installation/docker.md
@@ -1,59 +1,300 @@
+---
+sidebar_position: 6
+---
+
# Docker
-Vous pouvez installer ClientXCMS via Docker en suivant les étapes ci-dessous.
+Cette page vous guide pour installer ClientXCMS avec Docker Compose. Cette méthode prépare les services nécessaires dans des conteneurs et conserve les données aprÚs un redémarrage du serveur.
+
+:::info
+L'exemple ci-dessous est basé sur Ubuntu/Debian. Les commandes peuvent varier selon votre distribution.
+:::
+
## Prérequis
-Avant de commencer, assurez-vous d'avoir les éléments suivants :
-- Un serveur avec Docker et Docker Compose installés. Vous pouvez suivre les instructions d'installation de
- - [Docker](https://docs.docker.com/get-docker/)
- - [Docker Compose](https://docs.docker.com/compose/install/)
-- Un nom de domaine pointant vers votre serveur.
-Lancer les commandes suivantes pour installer Docker et Docker Compose sur un serveur Ubuntu :
+Avant de commencer, vérifiez que vous disposez des éléments suivants :
+
+- Un serveur Linux propre, avec un accÚs SSH et un utilisateur pouvant exécuter `sudo`.
+- Les ports `80` et `443` ouverts si vous utilisez un nom de domaine et HTTPS.
+- Un nom de domaine pointant vers votre serveur pour une installation en production.
+- Vos identifiants OAuth ClientXCMS, disponibles dans la gestion de votre licence sur [l'espace client](https://clientxcms.com/client/services/).
+
+## Installation de Docker
+
+Mettez d'abord le serveur Ă jour et installez les outils de base :
+
```bash
-docker compose build
+sudo apt update
+sudo apt upgrade -y
+sudo apt install git nano curl -y
```
+
+Installez ensuite Docker avec le script officiel :
+
```bash
-docker compose up -d
+curl -fsSL https://get.docker.com -o get-docker.sh
+sudo sh get-docker.sh
```
-## Installation
-1. Créez un répertoire pour ClientXCMS et accédez-y :
+Vérifiez que Docker Compose est disponible :
+
```bash
-mkdir /var/www
-cd /var/www
+docker compose version
```
-2. Clonez le dépÎt Git de ClientXCMS :
+
+## Récupération de ClientXCMS
+
+Créez le dossier d'installation puis clonez le dépÎt officiel :
+
```bash
-git clone https://github.com/ClientXCMS/clientxcms.git
+sudo mkdir -p /var/www
+cd /var/www
+sudo git clone https://github.com/ClientXCMS/ClientXCMS.git clientxcms
cd clientxcms
```
-3. Copiez le fichier d'exemple de configuration Docker Compose :
+
+Préparez les fichiers de configuration à partir des exemples fournis :
+
+```bash
+sudo cp docker-compose.example.yml docker-compose.yml
+sudo cp .env.example .env
+```
+
+## Configuration de l'environnement
+
+Ouvrez le fichier `.env` :
+
```bash
-cp docker-compose.example.yml docker-compose.yml
+sudo nano .env
+```
+
+Renseignez au minimum l'URL de votre installation et les identifiants OAuth de votre licence :
+
+```env
+APP_ENV=production
+APP_URL=https://votre-domaine.com
+
+OAUTH_CLIENT_ID=votre_client_id
+OAUTH_CLIENT_SECRET=votre_secret_client
+```
+
+Conservez les valeurs de base de données prévues pour Docker, car le service applicatif se connecte au conteneur MySQL via le réseau interne Docker :
+
+```env
+DB_CONNECTION=mysql
+DB_HOST=database
+DB_PORT=3306
+DB_DATABASE=clientxcms
+DB_USERNAME=clientxcms
+DB_PASSWORD=clientxcms
```
-4. Modifiez le fichier d'environnement pour configurer les variables nécessaires, notamment la connexion à la base de données et le nom de domaine :
+
+:::tip
+Dans `nano`, utilisez `Ctrl + X`, puis `Y` ou `O`, puis `Entrée` pour sauvegarder et quitter.
+:::
+
+## Vérification du fichier Docker Compose
+
+Avant de lancer les conteneurs, ouvrez le fichier `docker-compose.yml` :
+
```bash
-cp .env.example .env
-nano .env
+sudo nano docker-compose.yml
+```
+
+Vérifiez que `APP_URL` est injectée depuis le fichier `.env`, sans valeur par défaut codée en dur :
+
+```yaml
+environment:
+ APP_URL: "${APP_URL}"
+ APP_ENV: "${APP_ENV:-production}"
+```
+
+:::warning
+Ne définissez pas `APP_URL` à deux endroits différents. La valeur utilisée par ClientXCMS doit venir du fichier `.env`, sinon vous risquez des erreurs de licence, de session ou d'authentification OAuth.
+:::
+
+Si vous utilisez des modules ou extensions personnalisés, vérifiez aussi que le volume des modules pointe vers le bon dossier dans le conteneur :
+
+```yaml
+services:
+ app:
+ volumes:
+ - ./modules:/app/modules
+ - ./storage:/var/www/html/storage
+```
+
+Si votre installation rencontre des problÚmes de permissions sur les modules aprÚs un redémarrage, vous pouvez ajouter un `entrypoint` qui corrige les droits avant de lancer l'application :
+
+```yaml
+services:
+ app:
+ entrypoint: ["/bin/sh", "-c", "chmod -R 777 /app/modules && chown -R www-data:www-data /app/modules && exec /bin/ash .github/docker/entrypoint.sh supervisord -n -c /etc/supervisord.conf"]
+```
+
+:::info
+Le dossier de l'application dans le conteneur est `/app` pour les modules. Le volume doit donc pointer vers `/app/modules`, et non vers `/var/www/html/modules`.
+:::
+
+## Configuration du domaine et du SSL
+
+Si le fichier `docker-compose.yml` contient une configuration Let's Encrypt, renseignez votre adresse email dans les variables d'environnement du proxy :
+
+```yaml
+- LETSENCRYPT_EMAIL=admin@votre-domaine.com
```
-Vous pouvez modifier les variables comme le domaine :
+
+Votre `APP_URL` doit correspondre au domaine utilisé par le proxy, par exemple :
+
```env
APP_URL=https://votre-domaine.com
-OAUTH_CLIENT_ID="XX"
-OAUTH_CLIENT_SECRET="XX"
```
-Ainsi que vos clés API, la connexion à la base de données, etc.
-Le docker se chargera de générer le certificat SSL via Let's Encrypt automatiquement en rajoutant l'email dans le fichier docker-compose.yml :
+:::warning
+Pour une installation en production, évitez d'utiliser une adresse IP directe. Utilisez un nom de domaine avec HTTPS afin que les cookies de session fonctionnent correctement.
+:::
+
+## Lancement des conteneurs
+
+Démarrez ClientXCMS et les services associés en arriÚre-plan :
+
+```bash
+sudo docker compose up -d
+```
+
+Lors du premier lancement, patientez environ 30 secondes afin que la base de données s'initialise correctement. Vous pouvez vérifier l'état des conteneurs avec :
+
+```bash
+sudo docker compose ps
+```
+
+## Initialisation de ClientXCMS
+
+Exécutez ensuite les commandes Laravel dans le conteneur `app` :
+
+```bash
+sudo docker compose exec app php artisan key:generate
+sudo docker compose exec app php artisan optimize:clear
+sudo docker compose exec app php artisan clientxcms:install-admin
+```
+
+La derniÚre commande permet de créer le compte administrateur. Suivez les instructions affichées dans votre terminal.
+
+Si la clé d'application n'est pas écrite automatiquement dans `.env`, affichez-la puis ajoutez-la manuellement à la variable `APP_KEY` :
+
+```bash
+sudo docker compose exec app php artisan key:generate --show
+```
+
+:::info
+Si votre fichier `docker-compose.yml` utilise un autre nom de service que `app`, remplacez `app` par le nom affiché dans `sudo docker compose ps`.
+:::
+
+## AccĂšs au panel
+
+Une fois l'installation terminée, ouvrez l'adresse configurée dans `APP_URL` puis accédez au panel administrateur :
+
+```text
+https://votre-domaine.com/admin/login
+```
+
+Connectez-vous avec le compte administrateur créé précédemment. Les identifiants OAuth renseignés dans le fichier `.env` permettent à ClientXCMS de valider votre licence.
+
+## Installer un module personnalisé
+
+Copiez le dossier du module dans le dossier `modules` de votre installation :
+
+```bash
+cd /var/www/clientxcms
+sudo mkdir -p modules
+```
+
+Vérifiez ensuite que le module est visible depuis le conteneur :
+
+```bash
+sudo docker compose exec app ls /app/modules
+```
+
+Régénérez ensuite l'autoload et videz les caches :
+
+```bash
+sudo docker compose exec app composer dump-autoload
+sudo docker compose exec app php artisan optimize:clear
+```
+
+Vous pouvez maintenant l'activer depuis le panel d'administration de ClientXCMS.
+## Mettre Ă jour l'installation
+
+Pour mettre à jour le code et redémarrer les conteneurs :
+
+```bash
+cd /var/www/clientxcms
+sudo git pull
+sudo docker compose pull
+sudo docker compose up -d --build
+sudo docker compose exec app php artisan optimize:clear
+```
+
+## Dépannage
+
+### Connexion en local ou avec une adresse IP
+
+Si vous installez ClientXCMS sans nom de domaine, par exemple avec une URL en `http://`, votre navigateur peut bloquer les cookies de session. Cela peut provoquer une erreur `419 Page Expired` Ă la connexion.
+
+Dans ce cas, utilisez une configuration locale dans `.env` :
+
+```env
+APP_ENV=local
+APP_URL=http://votre-ip
+SESSION_DRIVER=cookie
+SESSION_SECURE_COOKIE=false
+SESSION_SECURE=false
+```
+
+Si ces variables ne sont pas transmises au conteneur, ajoutez-les dans la section `environment` du service `app` de `docker-compose.yml` :
+
```yaml
-- LETSENCRYPT_EMAIL=your_email@example.com
+environment:
+ APP_URL: "${APP_URL}"
+ SESSION_DRIVER: "${SESSION_DRIVER:-file}"
+ SESSION_SECURE_COOKIE: "${SESSION_SECURE_COOKIE:-false}"
+ SESSION_SECURE: "${SESSION_SECURE:-false}"
+```
+
+Redémarrez ensuite les conteneurs :
+
+```bash
+sudo docker compose up -d
+```
+
+Si vous avez modifié `.env` aprÚs le démarrage du conteneur et que les changements ne sont pas pris en compte, copiez le fichier dans le conteneur puis videz la configuration Laravel :
+
+```bash
+sudo docker compose cp .env app:/var/www/html/.env
+sudo docker compose exec app php artisan optimize:clear
+```
+
+### Erreur "Token has been revoked"
+
+Cette erreur indique généralement que les identifiants OAuth sont absents, invalides ou que la configuration Laravel utilise encore d'anciennes valeurs.
+
+Vérifiez d'abord le fichier `.env` :
+
+```env
+OAUTH_CLIENT_ID=votre_client_id
+OAUTH_CLIENT_SECRET=votre_secret_client
```
-5. Lancez les conteneurs Docker :
+
+Rechargez ensuite la configuration :
+
```bash
-docker-compose up --build -d
+sudo docker compose exec app php artisan config:clear
+sudo docker compose exec app php artisan cache:clear
```
-6. Ajouter un compte administrateur :
+
+### Consulter les logs
+
+En cas de problĂšme au lancement ou pendant l'installation, consultez les logs :
+
```bash
-docker exec -it clientxcms_app-1 php artisan clientxcms:install-admin
+sudo docker compose logs -f
```
-7. Accédez à votre nom de domaine dans un navigateur web pour terminer l'installation en confirmation l'accÚs à la licence
diff --git a/i18n/fr/docusaurus-plugin-content-docs/current/installation/installation.md b/i18n/fr/docusaurus-plugin-content-docs/current/installation/installation.md
index b374fbb..b43456b 100644
--- a/i18n/fr/docusaurus-plugin-content-docs/current/installation/installation.md
+++ b/i18n/fr/docusaurus-plugin-content-docs/current/installation/installation.md
@@ -15,6 +15,9 @@ Vous pouvez interchanger vos extensions Ă tout moment depuis votre espace clien
L'offre cloud est disponible pour toutes les licences Premium et Entreprise. Vous pouvez retrouver plus d'information sur les offres cloud [ici](https://clientxcms.com/pricing).
## Autohébergement
L'installation en autohébergement est plus complexe nécessitant une accreditation validée. Pour cela, vous devez disposer d'un serveur web, d'une base de données et de PHP. Vous pouvez suivre les instructions d'installation en autohébergement [ici](./selfhosted).
+
+Pour une mise en place entiÚrement automatisée, le [script d'installation](./script) installe et configure toute la stack sur un serveur vierge en une seule commande.
+
:::warning
L'installation en autohĂ©bergement nĂ©cessite des connaissances en administration systĂšme. Si vous n'ĂȘtes pas sĂ»r de vous, nous vous recommandons d'opter pour l'installation Cloud.
:::
diff --git a/i18n/fr/docusaurus-plugin-content-docs/current/installation/script.md b/i18n/fr/docusaurus-plugin-content-docs/current/installation/script.md
new file mode 100644
index 0000000..021ca62
--- /dev/null
+++ b/i18n/fr/docusaurus-plugin-content-docs/current/installation/script.md
@@ -0,0 +1,137 @@
+---
+sidebar_position: 2
+---
+
+# Script d'installation
+
+Le **script d'installation** met en place une stack ClientXCMS complĂšte sur un
+serveur Linux vierge en une seule commande. Il installe PHP 8.3, MariaDB, Nginx,
+Redis et Node.js, télécharge ClientXCMS, configure le tout et (au choix) obtient
+un certificat Let's Encrypt, puis passe la main Ă l'installateur web pour
+l'activation de la licence.
+
+C'est la maniÚre la plus rapide de s'autohéberger. Si vous préférez installer
+chaque composant à la main, consultez l'[Autohébergement](./selfhosted) ; pour
+un déploiement multi-serveurs, voir [Ansible](./ansible).
+
+:::info Script communautaire
+Ce script est maintenu par la communautĂ© et distribuĂ© sĂ©parĂ©ment du cĆur de
+ClientXCMS. Relisez toujours un script avant de l'exécuter en root. Source :
+[github.com/alexwrite/clientxcms-installer](https://github.com/alexwrite/clientxcms-installer)
+:::
+
+## Prérequis
+
+- Un **serveur vierge** avec un accĂšs root (ou `sudo`).
+- Une licence **Community** (ou supérieure) valide - voir [Prérequis](./requis).
+- L'un des systÚmes d'exploitation supportés ci-dessous.
+
+| Distribution | Versions |
+|--------------|----------|
+| Debian | 11, 12, 13 |
+| Ubuntu | 22.04, 24.04 |
+| Rocky Linux / AlmaLinux | 8, 9 |
+
+Architectures : `x86_64` et `arm64`. Minimum 2 Go de RAM et 25 Go de disque.
+
+:::warning
+Lancez le script sur un serveur **dédié**. Il installe et configure des services
+au niveau systĂšme (Nginx, MariaDB, PHP-FPM, Redis) ; des sites existants qui les
+utilisent pourraient ĂȘtre impactĂ©s.
+:::
+
+## Démarrage rapide
+
+Ă lancer en root (ou avec `sudo`) :
+
+```bash
+bash <(curl -sSL https://raw.githubusercontent.com/alexwrite/clientxcms-installer/main/install.sh)
+```
+
+Choisissez **Install ClientXCMS**, puis répondez aux questions. Le script affiche
+un récapitulatif et demande confirmation avant toute action.
+
+## Ce qu'il installe
+
+| Ătape | DĂ©tail |
+|------|--------|
+| Dépendances | PHP 8.3 + extensions requises (Sury sur Debian, PPA ondrej sur Ubuntu, Remi sur Rocky/Alma), MariaDB, Nginx, Redis, Node.js 20, Composer, Git |
+| Application | `git clone` de ClientXCMS dans `/var/www/clientxcms`, `composer install`, `npm run build` |
+| Configuration | Ăcrit le `.env`, gĂ©nĂšre l'`APP_KEY`, configure la base de donnĂ©es et (au choix) les drivers Redis |
+| Base de données | Crée la base et l'utilisateur, exécute `php artisan migrate --force --seed` et `storage:link` |
+| Services | Vhost Nginx, tùche planifiée (cron), worker de file systemd optionnel |
+| Sécurité | RÚgles de pare-feu optionnelles et certificat Let's Encrypt via certbot |
+
+## Options interactives
+
+Pendant l'exécution, il vous sera demandé :
+
+- le **nom de domaine** (FQDN) pointant vers le serveur (ou une IP pour un test local) ;
+- la **langue** par défaut (`fr` / `en`) ;
+- le nom, l'utilisateur et le mot de passe de la **base de données** (laissez le mot de passe vide pour en générer un robuste) ;
+- l'utilisation de **Redis** pour le cache, les sessions et la file ;
+- l'installation d'un **worker** de file persistant (service systemd) ;
+- l'ouverture des ports **pare-feu** 22, 80 et 443 ;
+- l'obtention d'un certificat **Let's Encrypt** (le domaine doit déjà résoudre vers le serveur).
+
+:::info
+Si l'obtention du certificat Let's Encrypt échoue (DNS non propagé, ports
+fermĂ©s), l'installation se termine quand mĂȘme - le site reste en HTTP et le
+script affiche la commande pour relancer certbot plus tard.
+:::
+
+## AprĂšs le script : finaliser dans le navigateur
+
+Comme toute installation en autohébergement, ClientXCMS se finalise via
+l'**installateur web**, qui active votre licence en ligne. Une fois le script
+terminé :
+
+1. Ouvrez `http(s)://votre-domaine`.
+2. Suivez l'assistant : paramĂštres â licence â compte administrateur.
+3. Renseignez votre **OAuth Client ID / Secret** depuis
+ [clientxcms.com/client/services](https://clientxcms.com/client/services/).
+
+## Installation non-interactive
+
+Chaque question a un équivalent en variable d'environnement, ce qui permet de
+lancer le module d'installation sans interaction (CI, provisioning) :
+
+```bash
+env FQDN=panel.example.com APP_LOCALE=fr \
+ MYSQL_DB=clientxcms MYSQL_USER=clientxcms \
+ USE_REDIS=true CONFIGURE_WORKER=true \
+ CONFIGURE_LETSENCRYPT=true email=admin@example.com \
+ bash <(curl -sSL https://raw.githubusercontent.com/alexwrite/clientxcms-installer/main/installers/clientxcms.sh)
+```
+
+Laissez `MYSQL_PASSWORD` vide pour en générer un automatiquement. Parmi les
+autres variables surchargeables : `INSTALL_DIR`, `CLIENTXCMS_BRANCH`,
+`PHP_VERSION` et `NODE_VERSION`.
+
+## Mise Ă jour
+
+Mettez Ă jour une installation existante vers la derniĂšre version. Relancez le
+point d'entrée et choisissez **Update**, ou lancez-le directement :
+
+```bash
+bash <(curl -sSL https://raw.githubusercontent.com/alexwrite/clientxcms-installer/main/installers/update.sh)
+```
+
+Il suit la [procédure de mise à jour Git](./upgrade) : mode maintenance,
+sauvegarde de la base de données (dans `storage/backups/`), `git pull`,
+`composer install`, migrations et mises Ă jour d'extensions, vidage des caches,
+recompilation des assets, puis sortie du mode maintenance et exécution du hook
+de post-mise à jour. Définissez `SKIP_BACKUP=true` pour ignorer la sauvegarde.
+
+## Désinstallation
+
+Relancez le point d'entrée et choisissez **Uninstall**, ou lancez-le directement :
+
+```bash
+bash <(curl -sSL https://raw.githubusercontent.com/alexwrite/clientxcms-installer/main/installers/uninstall.sh)
+```
+
+Il retire l'application, ses services, le vhost et le cron, et demande
+confirmation avant de supprimer la base de données ou les fichiers. Une derniÚre
+étape optionnelle peut aussi purger toute la stack (PHP, MariaDB, Nginx, Redis,
+Node).
diff --git a/i18n/fr/docusaurus-plugin-content-docs/current/installation/selfhosted.md b/i18n/fr/docusaurus-plugin-content-docs/current/installation/selfhosted.md
index 0c955ee..fb3d7e1 100644
--- a/i18n/fr/docusaurus-plugin-content-docs/current/installation/selfhosted.md
+++ b/i18n/fr/docusaurus-plugin-content-docs/current/installation/selfhosted.md
@@ -7,283 +7,163 @@ import TabItem from '@theme/TabItem';
# Autohébergement
-Cette page vous guidera dans l'installation de ClientXCMS Next Gen pour les versions autohébergées. Les offres Cloud sont installées automatiquement sur les serveurs de CLIENTXCMS. L'installation est disponible [ici](./cloud).
+Cette page vous guide dans l'installation de ClientXCMS Next Gen sur un VPS ou un serveur dédié. Elle cible une installation Debian 12 avec PHP 8.3, MariaDB et un serveur web Apache ou Nginx.
+L'autohĂ©bergement est recommandĂ© si vous voulez gĂ©rer vous-mĂȘme le serveur, les mises Ă jour, les sauvegardes et la configuration systĂšme. Si vous voulez une installation plus automatisĂ©e, consultez plutĂŽt l'installation [Cloud](./cloud), [Plesk](./plesk) ou [Docker](./docker).
-## Téléchargement
+:::info
+Cette page complÚte les [prérequis techniques](./requis). Les commandes ci-dessous sont prévues pour Debian 12 et peuvent varier selon votre distribution.
+:::
-Vous pouvez télécharger la derniÚre version de ClientXCMS NextGen depuis [L'espace téléchargement](https://clientxcms.com/client/downloads) ou depuis github directement : [https://github.com/ClientXCMS/ClientXCMS](https://github.com/ClientXCMS/ClientXCMS)
-N'oubliez pas de vérifier les [prérequis techniques](./requis) avant de commencer l'installation aini que d'avoir une licence valide. (voir [ici](https://clientxcms.com/pricing) pour commander une licence)
+## Prérequis
-
+Avant de commencer, vérifiez que vous disposez des éléments suivants :
-:::info
-L'exemple ci-dessous est basé sur Debian 12, mais les commandes peuvent varier en fonction de votre distribution.
-:::
-## Dossier d'installation
-Créez un dossier d'installation pour votre CMS si vous n'avez pas encore de serveur web. Vous pouvez le faire en utilisant la commande suivante :
-```bash
-mkdir /var/www/clientxcms
-```
-## Téléchargement du code source
+- Un VPS ou serveur dédié Debian 12 avec accÚs SSH.
+- Un utilisateur pouvant exécuter `sudo`.
+- Un nom de domaine pointant vers le serveur.
+- Un certificat SSL pour utiliser ClientXCMS en HTTPS.
+- Une licence ClientXCMS valide.
+- Vos identifiants OAuth ClientXCMS, disponibles dans la gestion de votre licence sur [l'espace client](https://clientxcms.com/client/services/).
+- Au moins 100 Mo d'espace disque disponible pour l'application, hors sauvegardes et fichiers clients.
-
-
-Téléchargez la derniÚre version de ClientXCMS NextGen directement depuis GitHub :
-```bash
-curl -L -o clientxcms.zip https://github.com/ClientXCMS/ClientXCMS/releases/latest
-```
-
-Puis extrayez l'archive dans le dossier d'installation :
-```bash
-unzip clientxcms.zip -d /var/www/clientxcms
-mv /var/www/clientxcms/ClientXCMS-master/* /var/www/clientxcms
-rm -r /var/www/clientxcms/ClientXCMS-master
-```
+## Préparation du serveur
+
+Mettez Ă jour le serveur et installez les outils de base :
-:::info
-Si vous n'avez pas installé ZIP, vous pouvez l'installer avec la commande suivante :
```bash
-sudo apt-get install zip unzip
+sudo apt update
+sudo apt upgrade -y
+sudo apt install ca-certificates apt-transport-https software-properties-common wget curl git unzip nano lsb-release -y
```
-:::
-
-
-Si vous préférez travailler avec Git, clonez directement le dépÎt officiel :
+
+Installez PHP 8.3 et les extensions nécessaires :
+
```bash
-cd /var/www
-git clone https://github.com/ClientXCMS/ClientXCMS.git clientxcms
-cd /var/www/clientxcms
+curl -sSL https://packages.sury.org/php/README.txt | sudo bash -x
+sudo apt update
+sudo apt install php8.3 php8.3-fpm php8.3-cli php8.3-common php8.3-curl php8.3-bcmath php8.3-intl php8.3-mbstring php8.3-mysql php8.3-gd php8.3-xml php8.3-zip php8.3-fileinfo php8.3-opcache -y
```
-Vous pourrez ensuite mettre Ă jour votre instance trĂšs simplement :
-```bash
-git pull origin master
-```
-
-
+Vérifiez la version installée :
-## Mise en place de l'environnement
-Créez un fichier `.env` en utilisant la commande suivante :
```bash
- nano /var/www/clientxcms/.env
+php -v
```
-Puis copiez le contenu disponible [dans ce fichier d'exemple](https://cdn.clientxcms.com/ressources/docs/environment.example.txt) dans le fichier `.env`.
-
-## Installation de PHP 8.3
-### Ajout du dépÎt Ondrej (Ubuntu/Debian)
+Installez Composer :
-
-
+```bash
+php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
+php composer-setup.php
+sudo mv composer.phar /usr/local/bin/composer
+php -r "unlink('composer-setup.php');"
+```
-Pour installer PHP 8.3 sur Ubuntu/Debian, ajoutez d'abord le dépÎt Ondrej :
+Installez Node.js LTS avec NVM :
```bash
-# Mise à jour du systÚme et installation des prérequis
-sudo apt update
-sudo apt install -y software-properties-common ca-certificates apt-transport-https wget curl lsb-release
-
-# Ajout du dépÎt Ondrej pour PHP 8.3
-sudo add-apt-repository ppa:ondrej/php -y
-sudo apt update
+curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.0/install.sh | bash
+source ~/.bashrc
+nvm install --lts
+nvm use --lts
```
-### Installation de PHP 8.3 et extensions
-
-Installez PHP 8.3 avec toutes les extensions requises par ClientXCMS :
+Vérifiez les versions disponibles :
```bash
-# Installation de PHP 8.3 et des extensions essentielles
-sudo apt install -y php8.3 php8.3-fpm php8.3-cli php8.3-common \
- php8.3-bcmath php8.3-curl php8.3-dom php8.3-gd php8.3-intl \
- php8.3-libxml php8.3-mbstring php8.3-openssl php8.3-pdo \
- php8.3-pdo-mysql php8.3-simplexml php8.3-xml php8.3-zip \
- php8.3-opcache
+node -v
+npm -v
+composer --version
```
-
-
+## Récupération du code source
-Pour CentOS, RHEL ou Rocky Linux, utilisez le dépÎt Remi :
+Créez le dossier d'installation :
```bash
-# Installation des prérequis et du dépÎt Remi
-sudo dnf install -y epel-release
-sudo dnf install -y https://rpms.remirepo.net/enterprise/remi-release-8.rpm
-
-# Activation du module PHP 8.3
-sudo dnf module reset php -y
-sudo dnf module enable php:remi-8.3 -y
-
-# Installation de PHP 8.3 et des extensions
-sudo dnf install -y php php-fpm php-common php-bcmath php-curl \
- php-dom php-gd php-intl php-libxml php-mbstring php-openssl \
- php-pdo php-pdo-mysql php-simplexml php-xml php-zip php-opcache
+sudo mkdir -p /var/www/clientxcms
+sudo chown -R $USER:www-data /var/www/clientxcms
+cd /var/www/clientxcms
```
-
-
+
+
-### Vérification de l'installation
+Téléchargez la derniÚre archive de ClientXCMS depuis [l'espace téléchargement](https://clientxcms.com/client/downloads), puis envoyez-la sur votre serveur, par exemple dans `/tmp/clientxcms.zip`.
-Vérifiez que PHP 8.3 est correctement installé :
+Extrayez ensuite l'archive dans le dossier d'installation :
```bash
-php --version
+unzip /tmp/clientxcms.zip -d /tmp/clientxcms-release
+cd /tmp/clientxcms-release/ClientXCMS-*
+cp -R . /var/www/clientxcms/
+cd /var/www/clientxcms
```
-Vous devriez voir une sortie similaire Ă :
-```
-PHP 8.3.x (cli) (built: ...)
-```
+:::info
+L'archive release est recommandée pour une installation de production, car elle correspond à une version publiée.
+:::
-### Configuration PHP recommandée
+
+
-Modifiez le fichier de configuration PHP pour optimiser les performances :
+Si vous préférez travailler avec Git, clonez le dépÎt officiel :
```bash
-# Pour PHP-FPM
-sudo nano /etc/php/8.3/fpm/php.ini
-
-# Pour PHP-CLI
-sudo nano /etc/php/8.3/cli/php.ini
+cd /var/www
+git clone https://github.com/ClientXCMS/ClientXCMS.git clientxcms
+cd /var/www/clientxcms
```
-ParamÚtres recommandés :
-```ini
-memory_limit = 512M
-upload_max_filesize = 64M
-post_max_size = 64M
-max_execution_time = 300
-max_input_vars = 3000
-opcache.enable = 1
-opcache.memory_consumption = 128
-opcache.max_accelerated_files = 10000
-```
-
-## Installation de Composer
-Pour installer Composer, vous pouvez utiliser la commande suivante :
-```bash
-php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
-php composer-setup.php
-php -r "unlink('composer-setup.php');"
-```
-Vous pouvez maintenant installer les dépendances du projet en utilisant la commande suivante :
+Vous pourrez ensuite mettre Ă jour l'instance avec :
+
```bash
-./composer.phar install --optimize-autoloader --no-dev
+git fetch --all --prune
+git checkout master
+git pull origin master
```
-## Mise en place de MySQL
-:::info
-Nous allons installer MariaDB, qui est une version améliorée de MySQL.
+:::warning
+Cette méthode suit la branche principale du dépÎt. Pour une utilisation en production, préférez une archive release stable.
:::
-Pour installer le serveur MySQL, vous pouvez utiliser la commande suivante :
-```bash
-sudo apt-get install mariadb-server
-```
-Lorsque vous y ĂȘtes invitĂ©, confirmez lâinstallation en tapant Y, puis ENTRĂE.
+
+
-Une fois lâinstallation terminĂ©e, il est recommandĂ© dâexĂ©cuter un script de sĂ©curitĂ©, prĂ©installĂ© avec MySQL. Ce script supprimera certains paramĂštres par dĂ©faut peu sĂ»rs et verrouillera lâaccĂšs Ă votre systĂšme de base de donnĂ©es. Lancez le script interactif en exĂ©cutant :
-```bash
-sudo mysql_secure_installation
-```
-Répondez aux questions suivantes en fonction de vos besoins :
-- Appuyez sur la touche entrĂ©e si vous nâen avez pas dĂ©fini prĂ©cĂ©demment
-- Définissez un mot de passe root pour MySQL
-- Supprimez lâutilisateur anonyme > Y
-- Interdisez la connexion à distance à la base de données > Y
-- Supprimez la base de données de test > Y
-- Rechargez les privilĂšges > Y
+## Configuration du serveur web
-Vous pouvez maintenant vous connecter Ă MySQL en utilisant la commande suivante :
-```bash
-mysql -u root -p
-```
-## Mise en place du serveur web
+Le serveur web doit pointer vers le dossier `public` de ClientXCMS. Les exemples ci-dessous ne remplacent pas la configuration SSL : en production, configurez HTTPS avec votre certificat avant de finaliser l'installation.
-
-:::info
-Ici, nous ne présentons pas comment installer un certificat SSL.
-:::
+
- Pour installer Apache, vous pouvez utiliser la commande suivante :
-```bash
-sudo apt-get install apache2 libapache2-mod-php
-```
-Pour activer le module rewrite, vous pouvez utiliser la commande suivante :
-```bash
-sudo a2enmod rewrite
-```
-Pour ajouter un hĂŽte virtuel, vous pouvez utiliser la commande suivante :
-```bash
-sudo nano /etc/apache2/sites-available/clientxcms.conf
-```
-#### Exemple de fichier de configuration
-```bash
-
- ServerAdmin webmaster@localhost
- DocumentRoot /var/www/clientxcms/public
- ServerName domain.fr
- ServerAlias www.domain.fr
-
-
- Options FollowSymLinks
- AllowOverride All
-
-
- Options FollowSymLinks MultiViews
- Options -Indexes
- AllowOverride All
- Order allow,deny
- allow from all
-
-
- LogLevel debug
- ErrorLog ${APACHE_LOG_DIR}/error.log
- CustomLog ${APACHE_LOG_DIR}/access.log combined
+Installez Nginx :
-
-```
-Pour activer le vhost, vous pouvez utiliser la commande suivante :
```bash
-sudo a2ensite clientxcms.conf
+sudo apt install nginx -y
```
-Pour vous assurer que le fichier de configuration est correct, vous pouvez utiliser la commande suivante :
-```bash
-sudo apache2ctl configtest
-```
-Pour redémarrer Apache, vous pouvez utiliser la commande suivante :
-```bash
-sudo systemctl restart apache2
-```
-
-
-:::info
-Ici, nous ne présentons pas comment installer un certificat SSL.
-:::
- Pour installer Nginx, vous pouvez utiliser la commande suivante :
-```bash
-sudo apt-get install nginx php8.3-fpm
-```
-Pour ajouter un hĂŽte virtuel, vous pouvez utiliser la commande suivante :
+
+Créez le vhost :
+
```bash
sudo nano /etc/nginx/sites-available/clientxcms.conf
```
-#### Exemple de fichier de configuration
-```bash
+
+Exemple de configuration :
+
+```nginx
server {
listen 80;
- server_name domain.fr www.domain.fr;
+ server_name votre-domaine.com www.votre-domaine.com;
root /var/www/clientxcms/public;
- index index.php index.html index.htm;
+ index index.php index.html;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
+
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php8.3-fpm.sock;
@@ -296,149 +176,203 @@ server {
}
}
```
-Pour activer le vhost, vous pouvez utiliser la commande suivante :
+
+Activez le site puis redémarrez Nginx :
+
```bash
-sudo ln -s /etc/nginx/sites-available/clientxcms.conf /etc/nginx/sites-enabled/
+sudo ln -s /etc/nginx/sites-available/clientxcms.conf /etc/nginx/sites-enabled/clientxcms.conf
+sudo nginx -t
+sudo systemctl reload nginx
```
-Pour vous assurer que le fichier de configuration est correct, vous pouvez utiliser la commande suivante :
+
+
+
+
+Installez Apache et le module PHP :
+
```bash
-sudo nginx -t
+sudo apt install apache2 libapache2-mod-php8.3 -y
+sudo a2enmod rewrite
```
-Pour redémarrer Nginx, vous pouvez utiliser la commande suivante :
+
+Créez le vhost :
+
```bash
-sudo systemctl restart nginx
+sudo nano /etc/apache2/sites-available/clientxcms.conf
```
+
+Exemple de configuration :
+
+```apache
+
+ ServerName votre-domaine.com
+ ServerAlias www.votre-domaine.com
+ DocumentRoot /var/www/clientxcms/public
+
+
+ Options FollowSymLinks
+ AllowOverride All
+ Require all granted
+
+
+ ErrorLog ${APACHE_LOG_DIR}/clientxcms-error.log
+ CustomLog ${APACHE_LOG_DIR}/clientxcms-access.log combined
+
+```
+
+Activez le site puis redémarrez Apache :
+
+```bash
+sudo a2ensite clientxcms.conf
+sudo apache2ctl configtest
+sudo systemctl reload apache2
+```
+
-## Configuration de la base de données
-Pour configurer la base de données, vous pouvez utiliser la commande suivante :
+## Base de données
+
+Installez MariaDB :
+
```bash
-mysql -u root -p
+sudo apt install mariadb-server -y
+sudo mysql_secure_installation
```
-Créez une base de données et un utilisateur en utilisant les commandes suivantes. Nous vous recommandons de remplacer le mot de passe par un mot de passe plus sécurisé :
-```sql
-CREATE DATABASE clientxcms;
-CREATE USER clientxcms@localhost IDENTIFIED BY 'password';
-GRANT ALL PRIVILEGES ON clientxcms.* TO clientxcms@localhost;
-FLUSH PRIVILEGES;
+
+Connectez-vous Ă MariaDB :
+
+```bash
+sudo mysql
```
-Vous pouvez maintenant quitter MySQL en utilisant la commande suivante :
+
+Créez la base de données et l'utilisateur :
+
```sql
-exit
+CREATE DATABASE clientxcms CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
+CREATE USER 'clientxcms'@'localhost' IDENTIFIED BY 'remplacez_ce_mot_de_passe';
+GRANT ALL PRIVILEGES ON clientxcms.* TO 'clientxcms'@'localhost';
+FLUSH PRIVILEGES;
+EXIT;
```
-Vous pouvez maintenant modifier les informations de connexion à la base de données dans le fichier `.env` en utilisant la commande suivante :
+:::warning
+Remplacez `remplacez_ce_mot_de_passe` par un mot de passe robuste et conservez-le pour le fichier `.env`.
+:::
+
+## Configuration de l'environnement
+
+Copiez le fichier d'exemple :
+
```bash
+cd /var/www/clientxcms
+cp .env.example .env
nano .env
```
-Puis modifiez les informations de connexion à la base de données :
+Renseignez les valeurs principales :
+
```env
+APP_ENV=production
+APP_URL=https://votre-domaine.com
+
+OAUTH_CLIENT_ID=votre_client_id
+OAUTH_CLIENT_SECRET=votre_secret_client
+
DB_CONNECTION=mysql
DB_HOST=localhost
DB_PORT=3306
DB_DATABASE=clientxcms
DB_USERNAME=clientxcms
-DB_PASSWORD=password
-```
+DB_PASSWORD=remplacez_ce_mot_de_passe
-## Autres configurations
-Pour générer une clé d'application, vous pouvez utiliser la commande suivante :
-```bash
-php artisan key:generate
-```
-Pour migrer la base de données, vous pouvez utiliser la commande suivante :
-```bash
-php artisan migrate --force --seed
-```
-Pour lier le dossier de stockage, vous pouvez utiliser la commande suivante :
-```bash
-php artisan storage:link
-```
-Pour ajouter les bonnes permissions, vous pouvez utiliser la commande suivante :
-```bash
-sudo chmod -R 775 storage bootstrap/cache
+QUEUE_CONNECTION=database
+CACHE_STORE=file
+SESSION_DRIVER=file
```
-## Assets
-:::info
-La premiÚre partie va concerner l'installation de nodejs, mais si vous l'avez déjà installé, vous pouvez passer à la compilation des assets.
+Configurez aussi les variables mail selon votre fournisseur SMTP afin que ClientXCMS puisse envoyer les emails transactionnels.
+
+:::tip
+Dans `nano`, utilisez `Ctrl + X`, puis `Y` ou `O`, puis `Entrée` pour sauvegarder et quitter.
:::
-Pour commencer, nous devons installer NVM, qui est un gestionnaire de versions de Node.js. Pour ce faire, exécutez la commande suivante :
+## Installation de ClientXCMS
+
+Installez les dépendances PHP :
+
```bash
-curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.0/install.sh | bash
+cd /var/www/clientxcms
+composer install --optimize-autoloader --no-dev
```
-Ensuite, vous pouvez tĂ©lĂ©charger et installer Node.js (il peut ĂȘtre nĂ©cessaire de redĂ©marrer le terminal) :
+Initialisez Laravel :
+
```bash
-nvm install 18
+php artisan key:generate
+php artisan migrate --force --seed
+php artisan storage:link
+php artisan optimize:clear
```
-Vérifiez maintenant que la bonne version de Node.js est installée via cette commande :
+Appliquez les permissions nécessaires au serveur web :
+
```bash
-node -v
+sudo chown -R www-data:www-data /var/www/clientxcms/storage /var/www/clientxcms/bootstrap/cache
+sudo chmod -R 775 /var/www/clientxcms/storage /var/www/clientxcms/bootstrap/cache
```
-Celle-ci devrait afficher `v18.20.4`, qui est la version LTS actuelle de Node.js version 18.
-
+## Compilation des assets
+
+Installez les dépendances JavaScript puis compilez les assets :
-Pour compiler les assets, vous pouvez utiliser les commandes suivantes :
```bash
+cd /var/www/clientxcms
npm install
npm run build
```
-## Taches planifiées
-Pour configurer les tùches planifiées, vous pouvez utiliser la commande suivante :
-```bash
-crontab -e
-```
-Puis ajoutez la ligne suivante :
-```bash
-* * * * * php /var/www/clientxcms/artisan schedule:run >> /dev/null 2>&1
-```
-
+:::info
+Si vous installez ou activez un thĂšme plus tard, relancez `npm run build`.
+:::
-## Configuration des Queues Laravel
+## Taches planifiées et queues
-Laravel utilise un systÚme de files d'attente (queues) pour exécuter des tùches en arriÚre-plan, ce qui améliore les performances en évitant le traitement synchrone.
-Dans votre fichier `.env`, configurez le driver de file d'attente en fonction de votre environnement :
+Ajoutez le scheduler Laravel dans la crontab de l'utilisateur du serveur web :
-```env
-QUEUE_CONNECTION=database
+```bash
+sudo crontab -u www-data -e
```
-Les options disponibles sont :
-- `sync` : Exécute les jobs immédiatement (pas en arriÚre-plan).
-- `database` : Utilise la base de données pour stocker les jobs.
-- `redis` : Utilise Redis pour une gestion plus performante des queues.
-- `sqs` : Utilise Amazon SQS.
+Ajoutez cette ligne :
-Assurez-vous que votre application utilise le bon driver.
+```bash
+* * * * * php /var/www/clientxcms/artisan schedule:run >> /dev/null 2>&1
+```
-Si vous voulez vous assurer que le worker tourne toujours, utilisez `supervisor`. Installez-le d'abord :
+Pour traiter les tĂąches en arriĂšre-plan, installez Supervisor :
```bash
-sudo apt update
-sudo apt install supervisor
+sudo apt install supervisor -y
+sudo nano /etc/supervisor/conf.d/clientxcms-worker.conf
```
-Ensuite, créez un fichier de configuration `/etc/supervisor/conf.d/clientxcms-worker.conf` :
+Ajoutez la configuration suivante :
```ini
[program:clientxcms-worker]
process_name=%(program_name)s_%(process_num)02d
command=php /var/www/clientxcms/artisan queue:work --sleep=3 --tries=3 --timeout=90
+directory=/var/www/clientxcms
autostart=true
autorestart=true
+user=www-data
numprocs=1
redirect_stderr=true
stdout_logfile=/var/log/clientxcms-worker.log
```
-Recharge et démarre Supervisor :
+Rechargez Supervisor :
```bash
sudo supervisorctl reread
@@ -446,78 +380,81 @@ sudo supervisorctl update
sudo supervisorctl start clientxcms-worker:*
```
-## Configuration de ClientXCMS
+## Finalisation
-1. Rendez-vous sur l'adresse de votre espace client. Vous devriez voir une page d'installation similaire Ă celle-ci :
- 
+Ouvrez votre navigateur sur l'URL configurée dans `APP_URL` :
-2. Remplacez "CLIENTXCMS" par votre nom commercial d'hébergeur.
-
-3. Pour trouver l'**ID client** et le **Secret client**, allez sur l'espace client ClientXCMS : [https://clientxcms.com/client/services/](https://clientxcms.com/client/services/), dans la gestion de la licence NextGen concernée.
- 
- Les identifiants "**OAuth Client ID**" et "**OAuth Secret**" sont nécessaires pour connecter la licence ClientXCMS à votre site. Cliquez ensuite sur le bouton "Se connecter" sur votre instance.
+```text
+https://votre-domaine.com
+```
+Suivez l'assistant d'installation, renseignez le nom de votre hébergeur, puis connectez votre licence avec les identifiants OAuth récupérés depuis [l'espace client ClientXCMS](https://clientxcms.com/client/services/).
## Achat d'extension
-Si vous achetez des extensions entre-temps et que vous avez le message d'erreur suivant lorsque vous souhaitez les activer :
+
+Si vous achetez une extension et que le message suivant apparaĂźt lors de l'activation :
> **"Le fichier composer.json n'a pas été trouvé."**
-Vous pouvez télécharger l'archive de l'extension via la page de téléchargement de l'espace client. Vous pouvez ensuite l'extraire sur votre instance ClientXCMS.
+Téléchargez l'archive de l'extension depuis l'espace client, puis extrayez-la sur votre instance ClientXCMS.
+

-:::info
-Pour les thĂšmes vous devez relancer la commande `npm run build` pour les activer.
-:::
## Migration depuis une version cloud
-Si vous souhaitez reprendre une installation cloud sur votre serveur, vous pouvez suivre les étapes suivantes :
-1. Téléchargez une sauvegarde de votre base de données depuis l'interface PHPMyAdmin depuis la page base de données de l'administration.
-2. Ouvrir une demande d'aide pour obtenir la clé d'encryption de votre instance cloud.
+
+Si vous souhaitez reprendre une installation cloud sur votre serveur :
+
+1. Téléchargez une sauvegarde de la base de données depuis l'administration ou PHPMyAdmin.
+2. Ouvrez une demande d'aide pour obtenir la clé d'encryption de votre instance cloud.
3. Importez la sauvegarde dans votre base de données locale.
-4. Modifiez le fichier `.env` pour correspondre votre clé d'encryption avec la clé d'encryption de votre instance cloud.
-5. Exécutez la commande `php artisan migrate --force --seed` pour mettre à jour votre base de données.
-6. Exécutez la commande `php artisan storage:link` pour lier le dossier de stockage.
-7. Créez un fichier `storage/installed` pour indiquer que l'installation est terminée.
-8. Vous pouvez maintenant accéder à votre instance locale.
+4. Remplacez la clé d'encryption de votre fichier `.env` par celle de l'instance cloud.
+5. Exécutez `php artisan migrate --force --seed`.
+6. Exécutez `php artisan storage:link`.
+7. Créez le fichier `storage/installed` si l'assistant d'installation ne doit pas se relancer.
## ProblĂšmes courants
-### Interface introuvable Jsonable
+### Interface Jsonable introuvable
+
+Si vous obtenez l'erreur `Interface "DragonCode/Contracts/Support/Jsonable" not found`, installez la dépendance manquante :
-Si vous avez l'erreur suivante :
-"Interface "DragonCode/Contracts/Support/Jsonable" not found"
-Vous pouvez la régler en executant la commande :
```bash
composer require dragon-code/contracts
+php artisan optimize:clear
```
-### ThÚme activé mais non affiché sur l'interface
+### ThÚme activé mais non affiché
+
+Si un thÚme activé ne s'affiche pas, ajoutez cette variable dans `.env` :
-Si vous avez activé un thÚme mais qu'il n'est pas affiché sur l'interface, vous pouvez ajouter la variable suivante dans le fichier `.env` :
```env
APP_REVERSE_PATHS=true
```
-Cela vient du fait que PHP ne lit pas les fichiers de la mĂȘme maniĂšre sur chaque serveur. Cette variable permet de corriger ce problĂšme.
+Videz ensuite les caches :
-
-### Logo non affichage sur l'interface
-
-Si vous avez pas d'erreur Ă l'ajoĂ»t de votre logo, vous avez peut-ĂȘtre un problĂšme de permission sur le dossier de stockage. Vous pouvez rĂ©gler ce problĂšme en executant la commande suivante :
```bash
-sudo chmod -R 775 storage
+php artisan optimize:clear
```
-Si vous avez des problÚmes du jour au lendemain, vous avez problablement un problÚme de cache. Vous pouvez le régler en executant la commande suivante :
+### Logo ou fichiers uploadés non affichés
+
+Vérifiez le lien de stockage et les permissions :
+
```bash
+php artisan storage:link
+sudo chown -R www-data:www-data storage bootstrap/cache
+sudo chmod -R 775 storage bootstrap/cache
php artisan cache:clear
```
-ou vous pouvez vérifier les permissions de votre dossier de cache (storage/framework/cache).
-### ProblĂšme de permissions sur le dossier de logs
-Si vous avez réguliÚrement des problÚmes de permissions dans le dossier de logs, cela vient problablement que vous avez executer des commandes avec un utilisateur différent de celui utilisé par le serveur web (www-data sur Debian/Ubuntu). Pour régler ce problÚme, vous pouvez exécuter la commande suivante pour donner les bonnes permissions :
-```bash
+### ProblĂšmes de permissions dans les logs
+
+Si les fichiers de logs sont créés avec le mauvais utilisateur, réappliquez les permissions :
+
+```bash
+sudo chown -R www-data:www-data storage/logs
sudo chmod -R 775 storage/logs
```
-Cela peut également venir des cron jobs qui s'exécutent avec un utilisateur différent. Assurez-vous que les permissions sont correctement définies pour tous les utilisateurs qui pourraient accéder à ces fichiers.
+Assurez-vous aussi que les tùches cron et Supervisor s'exécutent avec l'utilisateur `www-data`.
diff --git a/i18n/fr/docusaurus-theme-classic/footer.json b/i18n/fr/docusaurus-theme-classic/footer.json
index 69c02d1..eb7427d 100644
--- a/i18n/fr/docusaurus-theme-classic/footer.json
+++ b/i18n/fr/docusaurus-theme-classic/footer.json
@@ -45,7 +45,7 @@
},
"link.item.label.Submit an idea": {
"message": "Soumettre une idée",
- "description": "The label of footer link with label=Submit an idea linking to https://ideas.clientxcms.com"
+ "description": "The label of footer link with label=Submit an idea linking to https://clientxcms.com/ideas"
},
"link.item.label.Submit an extension": {
"message": "Soumettre une extension",
diff --git a/static/img/next_gen/extensions/addons/late_fees/add_manual_late_fees.png b/static/img/next_gen/extensions/addons/late_fees/add_manual_late_fees.png
new file mode 100644
index 0000000..0baaf4f
Binary files /dev/null and b/static/img/next_gen/extensions/addons/late_fees/add_manual_late_fees.png differ
diff --git a/static/img/next_gen/extensions/addons/late_fees/admin_settings.png b/static/img/next_gen/extensions/addons/late_fees/admin_settings.png
new file mode 100644
index 0000000..48c2d24
Binary files /dev/null and b/static/img/next_gen/extensions/addons/late_fees/admin_settings.png differ
diff --git a/static/img/next_gen/extensions/addons/late_fees/admin_show_late_fees.png b/static/img/next_gen/extensions/addons/late_fees/admin_show_late_fees.png
new file mode 100644
index 0000000..ce118d4
Binary files /dev/null and b/static/img/next_gen/extensions/addons/late_fees/admin_show_late_fees.png differ
diff --git a/static/img/next_gen/extensions/addons/late_fees/cancel_fees.png b/static/img/next_gen/extensions/addons/late_fees/cancel_fees.png
new file mode 100644
index 0000000..9ccca7d
Binary files /dev/null and b/static/img/next_gen/extensions/addons/late_fees/cancel_fees.png differ
diff --git a/static/img/next_gen/extensions/addons/late_fees/exceptions_client.png b/static/img/next_gen/extensions/addons/late_fees/exceptions_client.png
new file mode 100644
index 0000000..1334259
Binary files /dev/null and b/static/img/next_gen/extensions/addons/late_fees/exceptions_client.png differ
diff --git a/static/img/next_gen/extensions/addons/late_fees/invoice_show.png b/static/img/next_gen/extensions/addons/late_fees/invoice_show.png
new file mode 100644
index 0000000..00d18f9
Binary files /dev/null and b/static/img/next_gen/extensions/addons/late_fees/invoice_show.png differ
diff --git a/static/img/next_gen/extensions/addons/late_fees/setting_tab.png b/static/img/next_gen/extensions/addons/late_fees/setting_tab.png
new file mode 100644
index 0000000..2248f29
Binary files /dev/null and b/static/img/next_gen/extensions/addons/late_fees/setting_tab.png differ
diff --git a/static/img/next_gen/extensions/addons/pack/config_product.png b/static/img/next_gen/extensions/addons/pack/config_product.png
new file mode 100644
index 0000000..040af80
Binary files /dev/null and b/static/img/next_gen/extensions/addons/pack/config_product.png differ
diff --git a/static/img/next_gen/extensions/addons/pack/create_product.png b/static/img/next_gen/extensions/addons/pack/create_product.png
new file mode 100644
index 0000000..a3d54e6
Binary files /dev/null and b/static/img/next_gen/extensions/addons/pack/create_product.png differ
diff --git a/static/img/next_gen/extensions/addons/pack/product_config.png b/static/img/next_gen/extensions/addons/pack/product_config.png
new file mode 100644
index 0000000..40c2056
Binary files /dev/null and b/static/img/next_gen/extensions/addons/pack/product_config.png differ