<!--
  canonical-url: https://www.avonture.be/fr/blog/docker-joomla-restore-jpa
  published:     2024-10-18
  This is a static plain-Markdown mirror generated at build time.
  Visit the canonical URL above for the fully rendered page, with images and interactive components.
-->

# Restaurer une sauvegarde Joomla avec Docker

> Restaurez facilement la sauvegarde de votre site Joomla en local avec Docker, Docker Compose et Akeeba Kickstart. Une simple commande make import suffit.

---
![Restaurer une sauvegarde Joomla avec Docker](/img/v2/joomla.webp)

**TL;DR**

Ce guide explique comment restaurer un site Joomla en local en combinant
Docker, une archive Akeeba Backup et l'utilitaire Akeeba Kickstart. On
configure un environnement sur mesure avec PHP et Apache, puis on lance une
simple commande d'import pour déployer les fichiers et les containers
nécessaires. Le processus se termine dans le navigateur, via l'assistant
Kickstart, pour finaliser la connexion à la base de données et la restauration
du site.

Dans les articles précédents ([Partie 1](/blog/docker-joomla) et [Partie 2](/blog/docker-joomla-part-2)), nous avons vu comment créer un site Joomla de zéro avec Docker : récupérer Joomla, PHP, Apache et MySQL depuis Docker Hub et faire un peu de magie pour obtenir un site local tout neuf sur `http://127.0.0.1:8080`.

Dans cet article, nous allons voir comment restaurer sur notre machine une sauvegarde créée grâce à l'excellent composant **[Akeeba Backup](https://www.akeeba.com/products/akeeba-backup.html)**.

Nous allons réutiliser certains fichiers de la [Partie 2](/blog/docker-joomla-part-2) et les adapter.

À la fin, nous aurons une commande `make import` qui démarrera **[Akeeba Kickstart](https://www.akeeba.com/download.html#kickstart)**.

## Résultat {#result}

Renseignez les informations de base de données affichées dans votre console, et Akeeba Kickstart s'occupe du reste —
d'une sauvegarde `.jpa` brute à un site consultable :

![Akeeba Kickstart](./images/kickstart.webp)

![Restauration de la base de données](./images/database.webp)

![Le site est restauré](./images/site_is_restored.webp)

## Pourquoi ça fonctionne {#why-it-works}

* Nous réutilisons le même trio `compose.yaml`/`.env`/`makefile` que dans la [Partie 2](/blog/docker-joomla-part-2), donc rien de neuf à apprendre là-dessus.
* Le seul vrai changement : comme la sauvegarde **est** déjà un site Joomla complet, les containers n'ont besoin que de PHP et Apache, pas d'une image Joomla fraîche — la base de données est reconstruite depuis la sauvegarde par Akeeba Kickstart, et non par l'installateur de Joomla.

## Créer les fichiers nécessaires {#creating-required-files}

> **Passer l'étape de création des fichiers:**
>
> Dans les chapitres suivants, vous devrez créer plusieurs fichiers par copier/coller. Si vous voulez aller plus vite, lancez simplement les commandes ci-dessous pour récupérer les fichiers depuis mon [repo Github](https://github.com/cavo789/docker_joomla_restore), vous n'aurez ainsi pas à les créer.
>
> ```bash
>   $ mkdir /tmp/joomla_restore && cd $_ $ curl -LOJ --silent
>   https://github.com/cavo789/docker_joomla_restore/archive/refs/tags/1.0.0.tar.gz
>   $ tar -xzvf docker_joomla_restore-1.0.0.tar.gz --strip-components 1 && rm -f
>   docker_joomla_restore-1.0.0.tar.gz $ tar -xzvf docker_joomla_restore.gz
>   --strip-components 1 && rm -f docker_joomla_restore.gz
> ```
>
> En suivant les instructions ci-dessous, vous créerez un dossier xxx dans lequel copier tous les fichiers nécessaires à la restauration d'un site Joomla avec Docker. Vous pouvez alors passer directement au chapitre « Lancer le processus d'importation », les fichiers étant déjà en place.

*Si vous préférez comprendre ce que vous faites et créer les fichiers à la main, poursuivez la lecture ci-dessous.*

Créez un nouveau dossier sur votre machine, par exemple `mkdir /tmp/joomla_restore && cd $_`.

```bash
$ mkdir /tmp/joomla_restore && cd $_
```

Dans ce dossier, vous devrez créer plusieurs fichiers (référez-vous à la [Partie 2](/blog/docker-joomla-part-2) si vous avez besoin de plus d'explications sur ces fichiers).

### Le fichier d'orchestration : compose.yaml {#the-orchestration-file-composeyaml}

Ci-dessous, en surbrillance, les petites différences par rapport au fichier `compose.yaml` vu dans la [Partie 2](/blog/docker-joomla-part-2#updated-composeyaml).

Voici pourquoi : cette fois, nous n'avons pas besoin de télécharger une copie fraîche de Joomla puisque **nous avons déjà un site Joomla** (notre sauvegarde). Ce dont nous avons besoin, c'est de **PHP** et **Apache**. Pas de Joomla, donc nous utiliserons cette fois une image Docker sur mesure, pas une image existante.

À part les lignes en surbrillance, tout le reste est identique à la [Partie 2](/blog/docker-joomla-part-2).

**compose.yaml**

```yaml
name: ${PROJECT_NAME:-your-project-name}

services:
  joomla:
    # highlight-next-line
    build:
      # highlight-next-line
      context: .
      # highlight-next-line
      args:
        # highlight-next-line
        - PHP_VERSION=${PHP_VERSION:-8.3-apache}
    container_name: ${CONTAINER_PREFIX:-joomla}-app
    restart: always
    ports:
      - ${WEB_PORT:-8080}:80
    environment:
      - JOOMLA_DB_HOST=joomladb
      - JOOMLA_DB_NAME=${DB_NAME:-joomla}
      - JOOMLA_DB_PASSWORD=${DB_PASSWORD:-examplepass}
      - JOOMLA_DB_USER=${DB_USER:-joomla}
    depends_on:
      joomladb:
        condition: service_healthy
    user: ${UID:-1000}:${GID:-1000}
    volumes:
      - ./joomla_data:/var/www/html
    networks:
      - joomla_network

  joomladb:
    image: mysql:${MYSQL_VERSION:-latest}
    container_name: ${CONTAINER_PREFIX:-joomla}-db
    restart: always
    ports:
      - ${MYSQL_PORT-:3306}:3306
    environment:
      - MYSQL_DATABASE=${DB_NAME:-joomla}
      - MYSQL_PASSWORD=${DB_PASSWORD:-examplepass}
      - MYSQL_ROOT_PASSWORD=${DB_ROOT_PASSWORD:-rootpass}
      - MYSQL_USER=${DB_USER:-joomla}
    healthcheck:
      test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
      timeout: 20s
      retries: 10
    user: ${UID:-1000}:${GID:-1000}
    volumes:
      - ./db_data:/var/lib/mysql
    networks:
      - joomla_network

  phpmyadmin:
    image: phpmyadmin
    container_name: ${CONTAINER_PREFIX:-joomla}-phpmyadmin
    restart: always
    depends_on:
      joomladb:
        condition: service_healthy
    ports:
      - 8081:80
    environment:
      - PMA_HOST=joomladb
      - PMA_PASSWORD=${DB_ROOT_PASSWORD:-rootpass}
    networks:
      - joomla_network

networks:
  joomla_network:
```

### Le fichier .env {#the-env-file}

Comme indiqué plus haut, nous n'avons plus besoin de Joomla, juste de PHP et Apache. Nous allons donc définir une variable `PHP_VERSION` et l'initialiser à la version voulue.

**.env**

```
CONTAINER_PREFIX=joomla
DB_NAME=joomla
DB_PASSWORD=examplepass
DB_USER=joomla
MYSQL_PORT=3306
MYSQL_VERSION=8.4.2
// highlight-next-line
PHP_VERSION=8.3-apache
PROJECT_NAME=running-joomla-in-docker
WEB_PORT=8080
```

> **Caution:**
>
> Comme nous devons restaurer un site existant, veillez à utiliser la même version de PHP que celle utilisée par votre site.

### Notre makefile {#our-makefile}

Il nous faut une nouvelle action appelée `import` :

**makefile**

```
-include .env

config:
	@UID=$$(id -u) GID=$$(id -g) docker compose config

down: stop
	-@UID=$$(id -u) GID=$$(id -g) docker compose down

log:
	-@UID=$$(id -u) GID=$$(id -g) docker compose logs

reset: down
	-@rm -rf db_data joomla_data

start:
	@clear
	@printf "\033[1;33m%s\033[0m\n\n" "To start your site, please jump to http://127.0.0.1:${WEB_PORT}"
	@printf "\033[1;33m%s\033[0m\n\n" "Go to http://127.0.0.1:${WEB_PORT}/administrator to open your backend."

	@printf "\033[1;104m%s\033[0m\n\n" "Below a summary of your current installation:"

	@printf "\033[1;34m%s\033[0m\n\n" "JOOMLA"
	@printf "\033[1;34m%-30s\033[0m\033[1;104m%s\033[0m\n" "  * Project name" "${PROJECT_NAME}"
	@printf "\033[1;34m%-30s\033[0m\033[1;104m%s\033[0m\n" "  * Version" "${JOOMLA_VERSION}"
	@printf "\033[1;34m%-30s\033[0m\033[1;104m%s\033[0m\n\n" "  * Port" "${WEB_PORT}"

	@printf "\033[1;34m%s\033[0m\n\n" "DATABASE"
	@printf "\033[1;34m%-30s\033[0m\033[1;104m%s\033[0m\n" "  * Host" "joomla-db"
	@printf "\033[1;34m%-30s\033[0m\033[1;104m%s\033[0m\n" "  * User name" "${DB_USER}"
	@printf "\033[1;34m%-30s\033[0m\033[1;104m%s\033[0m\n" "  * Password" "${DB_PASSWORD}"
	@printf "\033[1;34m%-30s\033[0m\033[1;104m%s\033[0m\n" "  * Database name" "${DB_NAME}"
	@printf "\033[1;34m%-30s\033[0m\033[1;104m%s\033[0m\n" "  * Version" "${MYSQL_VERSION}"
	@printf "\033[1;34m%-30s\033[0m\033[1;104m%s\033[0m\n\n" "  * Port" "${MYSQL_PORT}"

stop:
	-@UID=$$(id -u) GID=$$(id -g) docker compose stop

up:
	-@mkdir -p db_data joomla_data
	@UID=$$(id -u) GID=$$(id -g) docker compose up --detach --build

# highlight-next-line
import: reset
    # highlight-next-line
	-@mkdir -p db_data joomla_data
    # highlight-next-line

    # highlight-next-line
	@clear
    # highlight-next-line
	@printf "\033[1;33m%s\033[0m\n" "Copying Akeeba Kickstart to the Docker Joomla container..."
    # highlight-next-line
	@cp en-GB.kickstart.ini ./joomla_data
    # highlight-next-line
	@cp kickstart.php ./joomla_data/kickstart.php
    # highlight-next-line

    # highlight-next-line
	@printf "\033[1;33m%s\033[0m\n\n" "Copying your backup to the Docker Joomla container..."
    # highlight-next-line
	@cp backup.jpa ./joomla_data
    # highlight-next-line

    # highlight-next-line
	@UID=$$(id -u) GID=$$(id -g) docker compose up --detach
    # highlight-next-line

    # highlight-next-line
	@printf "\n\n\033[1;33m%s\033[0m\n\n" "Please now jump to http://127.0.0.1:${WEB_PORT}/kickstart.php to finalize your site restoration."
    # highlight-next-line

    # highlight-next-line
	@printf "\033[1;104m%s\033[0m\n\n" "Below a summary of your current installation:"
    # highlight-next-line

    # highlight-next-line
	@printf "\033[1;34m%s\033[0m\n\n" "JOOMLA"
    # highlight-next-line
	@printf "\033[1;34m%-30s\033[0m\033[1;104m%s\033[0m\n\n" "  * Port" "${WEB_PORT}"
    # highlight-next-line

    # highlight-next-line
	@printf "\033[1;34m%s\033[0m\n\n" "DATABASE"
    # highlight-next-line
	@printf "\033[1;34m%-30s\033[0m\033[1;104m%s\033[0m\n" "  * Host" "joomla-db"
    # highlight-next-line
	@printf "\033[1;34m%-30s\033[0m\033[1;104m%s\033[0m\n" "  * User name" "${DB_USER}"
    # highlight-next-line
	@printf "\033[1;34m%-30s\033[0m\033[1;104m%s\033[0m\n" "  * Password" "${DB_PASSWORD}"
    # highlight-next-line
	@printf "\033[1;34m%-30s\033[0m\033[1;104m%s\033[0m\n" "  * Database name" "${DB_NAME}"
    # highlight-next-line
	@printf "\033[1;34m%-30s\033[0m\033[1;104m%s\033[0m\n" "  * Version" "${MYSQL_VERSION}"
    # highlight-next-line
	@printf "\033[1;34m%-30s\033[0m\033[1;104m%s\033[0m\n\n" "  * Port" "${MYSQL_PORT}"
```

> **Caution:**
>
> Si vous ne savez pas si vous avez déjà `GNU make`, lancez simplement `which make` dans la console. Si vous voyez `make not found`, lancez `sudo apt-get update && sudo apt-get install make` pour procéder à l'installation.
>
> ```bash
> $ which make
> ```
>
> ```bash
> $ sudo apt-get update && sudo apt-get install make
> ```

### Il nous faut aussi un fichier appelé Dockerfile {#we-also-need-a-file-called-dockerfile}

Dans les toutes premières lignes du fichier `compose.yaml`, nous avons ce passage :

**compose.yaml**

```yaml
name: ${PROJECT_NAME:-your-project-name}

services:
  joomla:
    # highlight-next-line
    build:
      # highlight-next-line
      context: .
      # highlight-next-line
      args:
        # highlight-next-line
        - PHP_VERSION=${PHP_VERSION:-8.3-apache}
```

On n'y voit pas d'instruction `image:` mais un `build:`. Cela signifie qu'il nous faut un fichier spécial appelé `Dockerfile`.

Créez un nouveau fichier appelé `Dockerfile` dans votre dossier avec ce contenu :

**Dockerfile**

```docker
ARG PHP_VERSION=8.3-apache

FROM php:${PHP_VERSION:-latest}

RUN set -e -x ; \
    docker-php-ext-install mysqli pdo pdo_mysql && docker-php-ext-enable pdo_mysql
```

Ce fichier est assez simple pour l'instant : il indique qu'il nous faut une image Docker PHP, et qu'il faut aussi installer les drivers `mysqli`.

### Il nous faut une sauvegarde, évidemment {#we-need-a-backup-for-sure}

Placez également une sauvegarde de votre site existant dans le même dossier. Par souci de standardisation, nommez ce fichier `backup.jpa`.

Pour être plus explicite : rendez-vous sur votre site Joomla existant et, avec Akeeba Backup, créez une sauvegarde (format de fichier : `.jpa`) puis téléchargez-la. Renommez le fichier de sauvegarde ainsi : `backup.jpa`.

### Et enfin, il nous faut Akeeba Kickstart {#and-finally-we-need-akeeba-kickstart}

Enfin, il nous faut aussi deux fichiers provenant d'**[Akeeba Kickstart](https://www.akeeba.com/download.html#kickstart)**.

En suivant le lien [Akeeba Kickstart](https://www.akeeba.com/download.html#kickstart), nous pourrons télécharger un fichier `.zip` (appelé `kickstart-core-xxx.zip` où `xxx` est un numéro de version). Téléchargez-le et ouvrez l'archive : elle contient deux fichiers. Copiez-les dans votre dossier.

Les deux fichiers dont nous avons besoin s'appellent `en-GB.kickstart.ini` et `kickstart.php`.

## Avant de démarrer {#before-starting}

Nous sommes prêts. Juste avant de commencer, vérifiez que vous avez bien tous les fichiers nécessaires (lancez `ls -alh`) :

```bash
$ ls -alh

Permissions Size User Group Date Modified Name
drwxr-xr-x - christophe christophe 2024-10-18 13:30 .
drwxrwxrwt - root root 2024-10-18 13:30 ..
.rw-r--r-- 151 christophe christophe 2024-10-18 13:30 .env
.rw-r--r-- 34M christophe christophe 2024-10-18 13:30 backup.jpa
.rw-r--r-- 1.3k christophe christophe 2024-10-18 13:30 compose.yaml
.rw-r--r-- 162 christophe christophe 2024-10-18 13:30 Dockerfile
.rw-r--r-- 11k christophe christophe 2024-10-18 13:30 en-GB.kickstart.ini
.rw-r--r-- 390k christophe christophe 2024-10-18 13:30 kickstart.php
.rw-r--r-- 2.9k christophe christophe 2024-10-18 13:30 makefile
```

> **Passer l'étape de création des fichiers:**
>
> Si vous avez sauté l'étape de création des fichiers plus haut en les téléchargeant depuis mon repo, vous aurez tous les fichiers listés ci-dessus.

> **Caution:**
>
> Rappel : pour les utilisateurs Linux, nous avons besoin de `GNU make` pour pouvoir lancer des commandes comme `make import` ou `make up`. Si vous voyez `make not found`, lancez `sudo apt-get update && sudo apt-get install make` pour procéder à l'installation.

## Lancer le processus d'importation {#run-the-importation-process}

Voilà, vous avez copié pas mal de fichiers. Il est temps de restaurer votre site.

Pour les utilisateurs Linux, profitez simplement de `GNU Make` et lancez l'instruction `make import`.

Pour Windows (Powershell ou DOS), lancez ces commandes :

```bash
mkdir db_data mkdir joomla_data copy en-GB.kickstart.ini joomla_data\ copy
kickstart.php joomla_data\ copy backup.jpa joomla_data\ docker compose up
--detach
```

Dans les deux cas (Linux et Windows), vous obtiendrez une sortie de ce genre dans la console :

```bash
[+] Building 1.4s (7/7) FINISHED                                 docker:default
=> [joomla internal] load build definition from Dockerfile                 0.0s
 => => transferring dockerfile: 200B                                       0.0s
 => [joomla internal] load metadata for docker.io/library/php:8.3-apache   1.2s
 => [joomla internal] load .dockerignore                                   0.0s
 => => transferring context: 2B                                            0.0s
 [...]
 => [joomla] resolving provenance for metadata file                        0.0s

[+] Running 3/3
✔ Network running-joomla-in-docker_joomla_network Created 0.0s
✔ Container joomla-db Healthy 31.0s
✔ Container joomla-app Started 31.3s
```

Une fois terminé, ouvrez votre navigateur et rendez-vous sur `http://127.0.0.1:8080/kickstart.php` pour démarrer la restauration de votre site avec l'assistant **Akeeba Kickstart** — les écrans montrés en haut de cet article.

Lorsque vous devez renseigner les informations de base de données, référez-vous à ce qui s'est affiché dans votre console.

Poursuivez la restauration comme d'habitude ; fermez la fenêtre quand Akeeba Kickstart le demande, puis cliquez sur le bouton *Clean Up* ; ensuite sur *Visit your site's frontend* et profitez.

> **Information:**
>
> Si vous avez utilisé le site de démo fourni, le compte admin est **joomla** et son mot de passe est **joomla\@secured**.

## Conclusion {#conclusion}

Comme nous venons de le voir, restaurer un site Joomla en local est devenu vraiment simple.

Il suffit de récupérer quelques fichiers de configuration, et seul celui nommé `.env` doit être mis à jour avec les versions de PHP et MySQL utilisées sur votre site de production.

Vous téléchargez la sauvegarde locale de votre site et, avec une seule commande (`make import`), votre site est restauré.

```bash
$ make import
```

Peu importe la version de Joomla ou de MySQL que vous utilisez.

Simple comme bonjour, non ?
