Installer et configurer PrestaShop sur un VPS IONOS

Credit : Logo officiel

Installer et configurer PrestaShop sur un VPS IONOS

Dylan D. — Agent Support Technique Serveur PrestaShop 1858 mots 10 min de lecture

Installer et configurer PrestaShop sur un VPS IONOS

La cliente m'envoie un message un jeudi : sa boutique PrestaShop hébergée en mutualisé rame. Le panier prend 8 secondes à s'afficher, le tunnel de commande échoue une fois sur trois sous charge. Audit rapide : un Black Friday qui approche, des centaines de produits, du multi-langue, et un mutualisé qui s'effondre dès qu'on dépasse 10 visiteurs simultanés. Solution : migrer sur un VPS IONOS et la réinstaller proprement avec une stack performante. Voici exactement la procédure que j'ai suivie, applicable à toute installation neuve de PrestaShop 8.1 sur Debian 12.

Prérequis

Avant de commencer, vérifiez que vous avez :

Si vous n'avez pas encore sécurisé l'accès SSH, faites-le avant de poser la moindre brique applicative. Voir Sécuriser SSH avec sshd_config.

1. Mettre à jour le système

apt update && apt upgrade -y
apt install curl wget unzip git ufw -y
timedatectl set-timezone Europe/Paris

Vérifiez la version :

lsb_release -a
Distributor ID: Debian
Description:    Debian GNU/Linux 12 (bookworm)
Release:        12

2. Installer la stack LEMP

Nginx

apt install nginx -y
systemctl enable --now nginx
nginx -v

MariaDB

PrestaShop 8 fonctionne avec MariaDB 10.11 ou MySQL 8. Sur Debian 12, MariaDB 10.11 est le défaut.

apt install mariadb-server mariadb-client -y
systemctl enable --now mariadb
mysql_secure_installation

Répondez :

Switch to unix_socket authentication: n
Change the root password: y
Remove anonymous users: y
Disallow root login remotely: y
Remove test database: y
Reload privilege tables: y

PHP 8.3

Debian 12 fournit PHP 8.2, mais PrestaShop 8.1 supporte officiellement PHP 8.3 qui est plus rapide. J'utilise le dépôt Sury :

apt install lsb-release apt-transport-https ca-certificates -y
wget -qO /etc/apt/trusted.gpg.d/php.gpg https://packages.sury.org/php/apt.gpg
echo "deb https://packages.sury.org/php/ $(lsb_release -sc) main" > /etc/apt/sources.list.d/php.list
apt update
apt install php8.3-fpm php8.3-mysql php8.3-curl php8.3-gd php8.3-intl \
  php8.3-mbstring php8.3-xml php8.3-zip php8.3-bcmath php8.3-soap \
  php8.3-imagick php8.3-redis php8.3-opcache -y

3. Configurer PHP pour PrestaShop

PrestaShop est gourmand. Éditez /etc/php/8.3/fpm/php.ini :

memory_limit = 512M
upload_max_filesize = 64M
post_max_size = 64M
max_execution_time = 300
max_input_vars = 10000
allow_url_fopen = On
date.timezone = Europe/Paris
opcache.enable = 1
opcache.memory_consumption = 256
opcache.max_accelerated_files = 20000
opcache.validate_timestamps = 1
opcache.revalidate_freq = 60
realpath_cache_size = 4096K
realpath_cache_ttl = 600

Pour le pool FPM, éditez /etc/php/8.3/fpm/pool.d/www.conf :

pm = dynamic
pm.max_children = 30
pm.start_servers = 5
pm.min_spare_servers = 5
pm.max_spare_servers = 10
pm.max_requests = 500

Redémarrez :

systemctl restart php8.3-fpm
systemctl status php8.3-fpm

4. Créer la base de données

mysql -u root -p
CREATE DATABASE prestashop CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'ps_user'@'localhost' IDENTIFIED BY 'M0t-DeP@sse-S3cure!';
GRANT ALL PRIVILEGES ON prestashop.* TO 'ps_user'@'localhost';
FLUSH PRIVILEGES;
EXIT;

Vérifiez la connexion :

mysql -u ps_user -p prestashop -e "SHOW TABLES;"

5. Télécharger PrestaShop 8.1

cd /var/www
mkdir maboutique.fr
cd maboutique.fr
wget https://github.com/PrestaShop/PrestaShop/releases/download/8.1.7/prestashop_8.1.7.zip
unzip prestashop_8.1.7.zip
unzip prestashop.zip
rm prestashop_8.1.7.zip prestashop.zip Install_PrestaShop.html
chown -R www-data:www-data /var/www/maboutique.fr

La structure attendue :

/var/www/maboutique.fr/
├── admin/
├── classes/
├── controllers/
├── img/
├── install/
├── modules/
├── themes/
└── index.php

6. Configurer le vhost Nginx

Créez /etc/nginx/sites-available/maboutique.fr :

server {
    listen 80;
    server_name maboutique.fr www.maboutique.fr;
    root /var/www/maboutique.fr;
    index index.php;

    client_max_body_size 64M;

    access_log /var/log/nginx/maboutique-access.log;
    error_log /var/log/nginx/maboutique-error.log;

    # Compatibilite multi-stores et URL friendly
    rewrite ^/api/?(.*)$ /webservice/dispatcher.php?url=$1 last;
    rewrite ^/([a-z]{2})/?(.*)$ /index.php?isolang=$1&$args last;
    rewrite ^/c/([0-9]+)(-[_a-zA-Z0-9-]*)?(/[_a-zA-Z0-9-]*)?$ /index.php?controller=category&id_category=$1 last;

    location / {
        try_files $uri $uri/ /index.php?$args;
    }

    # Assets statiques avec cache long
    location ~* \.(jpg|jpeg|gif|png|css|js|ico|svg|woff|woff2|webp|avif)$ {
        expires 30d;
        access_log off;
        add_header Cache-Control "public, no-transform";
    }

    # PHP-FPM
    location ~ \.php$ {
        try_files $uri =404;
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/run/php/php8.3-fpm.sock;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_read_timeout 300;
        fastcgi_buffer_size 128k;
        fastcgi_buffers 4 256k;
        fastcgi_busy_buffers_size 256k;
    }

    # Bloquer fichiers sensibles
    location ~ /\. {
        deny all;
    }
    location ~* \.(tpl|log|conf|sql|md|yml|json|lock)$ {
        deny all;
    }
    location ~ ^/(app|src|var|vendor|bin|tests)/ {
        deny all;
    }

    gzip on;
    gzip_vary on;
    gzip_proxied any;
    gzip_comp_level 6;
    gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
}

Activez et rechargez :

ln -s /etc/nginx/sites-available/maboutique.fr /etc/nginx/sites-enabled/
nginx -t
systemctl reload nginx

7. Installer le certificat SSL

apt install certbot python3-certbot-nginx -y
certbot --nginx -d maboutique.fr -d www.maboutique.fr \
  --agree-tos --email admin@maboutique.fr --no-eff-email

Certbot modifie automatiquement votre vhost pour ajouter HTTPS et la redirection HTTP→HTTPS. Vérifiez le renouvellement automatique :

systemctl status certbot.timer
certbot renew --dry-run

Pour aller plus loin, voir Configurer HTTPS partout : guide SSL/TLS.

8. Installation en ligne de commande

PrestaShop supporte une installation 100% CLI, idéale en headless :

cd /var/www/maboutique.fr
php install/index_cli.php \
  --domain=maboutique.fr \
  --db_server=localhost \
  --db_name=prestashop \
  --db_user=ps_user \
  --db_password='M0t-DeP@sse-S3cure!' \
  --prefix=ps_ \
  --email=admin@maboutique.fr \
  --password='Adm1nS3cur3!' \
  --name='Ma Boutique' \
  --language=fr \
  --country=fr \
  --timezone=Europe/Paris \
  --ssl=1

La sortie attendue :

[OK] Database created
[OK] Database tables installed
[OK] Default settings populated
[OK] Theme classic installed
[OK] Modules installed
Installation finished in 87 seconds

9. Sécurisation post-installation

Supprimer le dossier d'installation

rm -rf /var/www/maboutique.fr/install

Obligatoire : sans cela PrestaShop refuse de fonctionner.

Renommer le dossier admin

Le nom admin est trop prévisible pour les bots :

mv /var/www/maboutique.fr/admin /var/www/maboutique.fr/admin-7xK2

Notez le nouveau chemin : il sera votre URL d'admin (https://maboutique.fr/admin-7xK2).

Corriger les permissions

find /var/www/maboutique.fr -type d -exec chmod 755 {} \;
find /var/www/maboutique.fr -type f -exec chmod 644 {} \;
chown -R www-data:www-data /var/www/maboutique.fr
chmod 600 /var/www/maboutique.fr/app/config/parameters.php

Le fichier parameters.php contient les credentials base de données : il doit rester strictement privé.

Pare-feu

ufw allow OpenSSH
ufw allow 'Nginx Full'
ufw enable
ufw status

10. Optimisation : cache et performance

Dans le back-office sous Paramètres avancés > Performances, activez :

Pour la mise en cache backend, installez Redis :

apt install redis-server -y
systemctl enable --now redis-server

Dans app/config/parameters.php, configurez le cache Redis. PrestaShop supporte Memcached et Redis nativement.

Pour aller plus loin sur l'optimisation e-commerce, voir PrestaShop : optimiser les performances et le SEO.

11. Configurer le cron PrestaShop

PrestaShop utilise un système de tâches planifiées (relances panier, exports comptables, mise à jour de devises, etc.). Le module CronJobs natif s'appuie sur des hits HTTP, ce qui est peu fiable. Préférez un cron système :

crontab -e -u www-data
# PrestaShop cron jobs
*/30 * * * * cd /var/www/maboutique.fr && /usr/bin/php8.3 ./bin/console prestashop:cron:execute >> /var/log/prestashop-cron.log 2>&1
# Mise a jour des devises et taux de change
0 6 * * * cd /var/www/maboutique.fr && /usr/bin/php8.3 ./bin/console prestashop:exchange-rate:update >> /var/log/prestashop-cron.log 2>&1

12. Surveillance et logs

Pour suivre la santé de la boutique en temps réel :

# Erreurs PHP
tail -f /var/log/php8.3-fpm.log

# Erreurs Nginx
tail -f /var/log/nginx/maboutique-error.log

# Logs PrestaShop
tail -f /var/www/maboutique.fr/var/logs/prod.log

# Requetes lentes MariaDB
tail -f /var/log/mysql/slow.log

Activez les slow query logs dans /etc/mysql/mariadb.conf.d/50-server.cnf :

slow_query_log = 1
slow_query_log_file = /var/log/mysql/slow.log
long_query_time = 1
log_queries_not_using_indexes = 1

13. Sauvegardes automatiques

Un script bash basique :

#!/bin/bash
DATE=$(date +%F)
BACKUP_DIR=/backups/prestashop
mkdir -p $BACKUP_DIR

# Base de donnees
mysqldump -u ps_user -p'M0t-DeP@sse-S3cure!' prestashop | gzip > $BACKUP_DIR/db-$DATE.sql.gz

# Fichiers
tar -czf $BACKUP_DIR/files-$DATE.tar.gz -C /var/www maboutique.fr

# Garder 14 jours
find $BACKUP_DIR -name "*.gz" -mtime +14 -delete

Cron quotidien :

0 3 * * * /usr/local/bin/backup-prestashop.sh

Pour une approche complète, voir Automatiser ses backups en bash + cron.

14. Premiers pas dans le back-office

Une fois la boutique installée, quelques actions à faire avant d'ouvrir au public :

  1. Paramètres > Trafic > Maintenance : activer le mode maintenance pendant la configuration.
  2. Paramètres > Coordonnées > Magasins : mettre les coordonnées légales (obligatoire pour la TVA).
  3. International > Localisation > Taxes : vérifier que les taux français sont activés (5,5%, 10%, 20%).
  4. International > Livraison > Transporteurs : configurer Mondial Relay, Colissimo, Chronopost selon vos besoins.
  5. Paiement > Modules de paiement : installer Stripe, PayPal ou les modules IONOS pour CB.
  6. Modules > Sélection : désactiver les modules inutiles (Facebook, statistiques natives lourdes).

Dans Paramètres avancés > Information, vérifiez le diagnostic système :

Version PHP: 8.3.7 - OK
Maximum size of post data: 64M - OK
Memory limit: 512M - OK
Maximum execution time: 300 - OK
Maximum upload file size: 64M - OK
GD library: enabled - OK
cURL: enabled - OK
Zip: enabled - OK

Tout doit être au vert.

Erreurs courantes et leur fix

500 Internal Server Error après installation

Cause : permissions cassées ou OPcache qui garde une ancienne version en mémoire.

Solution :

chown -R www-data:www-data /var/www/maboutique.fr
rm -rf /var/www/maboutique.fr/var/cache/*
systemctl reload php8.3-fpm

Page blanche en back-office

Cause : memory_limit PHP trop bas pour charger les modules.

Solution : passez à memory_limit = 1024M dans /etc/php/8.3/fpm/php.ini et redémarrez PHP-FPM.

Fatal error: max_input_vars exceeded

Cause : un formulaire admin (configuration, traductions) envoie plus de 10 000 champs.

Solution : passez max_input_vars = 20000 puis redémarrez PHP-FPM.

Erreur 404 sur les URL réécrites (catégories, produits)

Cause : la réécriture d'URL n'est pas active dans Nginx, ou non activée dans le BO PrestaShop.

Solution : vérifiez que les rewrite du vhost sont présents, et dans le BO Paramètres > Trafic > SEO et URL, activez "Friendly URL" et régénérez le .htaccess (même sur Nginx, pour la cohérence).

Database connection error

Cause : le mot de passe contient un caractère spécial mal échappé, ou MariaDB n'écoute pas en local.

Solution :

ss -tlnp | grep 3306
mysql -u ps_user -p prestashop -e "SELECT 1;"

Échappez les $, !, " dans parameters.php ou utilisez des mots de passe sans caractères pénibles.

Pour aller plus loin

Une boutique PrestaShop solide en 90 minutes

De l'OS vierge à la boutique en HTTPS, comptez 90 minutes la première fois, 30 minutes une fois la procédure rodée. Les points qui font la différence : PHP 8.3 avec OPcache bien dimensionné, MariaDB sur le même serveur (pas de latence réseau), Nginx avec gzip et cache statiques agressif. Avec cette stack, ma cliente a passé son Black Friday à 90 commandes/heure sans broncher, là où le mutualisé tombait à 10 visiteurs simultanés.

# Articles similaires

Sur les memes sujets et plus loin