Se rendre au contenu

Installer Odoo 19 CE sur un VPS Ubuntu 24.04 — pas à pas

Ce tutoriel installe un Odoo 19 Community Edition prêt pour la production : PostgreSQL, moteur PDF, reverse proxy Nginx avec WebSocket, certificat SSL Let's Encrypt et dossier de modules personnalisés. Chaque étape donne les commandes à copier et sa vérification. Pressé ? Le script automatique fait tout en une fois.

Maturité : 🟡 procédure v2 corrigée, en attente de validation complète sur serveur vierge — voir la méthode. Remplacez exemple.fr par votre domaine dans toutes les commandes.

Prérequis

  • Un VPS Ubuntu 24.04 LTS avec accès SSH et droits sudo
  • Un nom de domaine dont l'enregistrement DNS A (et www) pointe vers l'IP du VPS
  • Ports 80 et 443 ouverts

Option express — le script automatique

Toutes les étapes ci-dessous, en une commande. Le script est idempotent : relancé sur un serveur déjà installé, il ne refait que ce qui manque.

wget https://netetic.fr/telechargements/installOdoo_v2.sh
chmod +x installOdoo_v2.sh
sudo ./installOdoo_v2.sh

Il demande votre domaine, puis pose la question de la mise à jour automatique — lisez l'avertissement de l'étape 8 avant de répondre. La suite du tutoriel détaille ce que fait chaque étape, pour installer à la main ou comprendre le script.

Étape 1 — Mettre à jour le système et installer les dépendances

PostgreSQL est la base de données d'Odoo ; Nginx servira de reverse proxy ; Certbot fournira le certificat SSL.

sudo apt update && sudo apt upgrade -y
sudo apt install postgresql python3-phonenumbers nginx certbot python3-certbot-nginx wget gpg -y

Vérification :

psql --version
nginx -v

Étape 2 — Installer wkhtmltopdf (rendu PDF des factures)

Odoo génère ses PDF avec wkhtmltopdf 0.12.6, qui dépend de libssl1.1 — retirée d'Ubuntu 24.04. Le numéro de révision du paquet change à chaque correctif de sécurité : la première commande détecte automatiquement la dernière version disponible (une URL épinglée casse tôt ou tard).

cd /tmp
LIBSSL_DEB=$(wget -qO- http://security.ubuntu.com/ubuntu/pool/main/o/openssl/ \
  | grep -o 'libssl1\.1_1\.1\.1f-1ubuntu2\.[0-9]*_amd64\.deb' | sort -V | tail -1)
wget "http://security.ubuntu.com/ubuntu/pool/main/o/openssl/$LIBSSL_DEB"
sudo dpkg -i "$LIBSSL_DEB"

wget https://github.com/wkhtmltopdf/packaging/releases/download/0.12.6-1/wkhtmltox_0.12.6-1.bionic_amd64.deb
sudo dpkg -i wkhtmltox_0.12.6-1.bionic_amd64.deb
sudo apt install -f -y

Si le dépôt Ubuntu est inaccessible, les deux paquets sont disponibles sur notre miroir. Vérification :

wkhtmltopdf --version

Étape 3 — Installer Odoo 19 CE

Installation en paquet système depuis le dépôt officiel : Odoo arrive préconfiguré (service systemd odoo, configuration /etc/odoo/odoo.conf, utilisateur PostgreSQL créé automatiquement).

wget -q -O - https://nightly.odoo.com/odoo.key | sudo gpg --dearmor -o /usr/share/keyrings/odoo-archive-keyring.gpg
echo "deb [signed-by=/usr/share/keyrings/odoo-archive-keyring.gpg] https://nightly.odoo.com/19.0/nightly/deb/ ./" | sudo tee /etc/apt/sources.list.d/odoo.list
sudo apt update && sudo apt install odoo -y

Vérification — le service doit être active (running) et répondre en local :

sudo systemctl status odoo
curl -s -o /dev/null -w "%{http_code}\n" http://localhost:8069

Étape 4 — Configurer Nginx en reverse proxy

Créez le fichier de configuration :

sudo nano /etc/nginx/sites-available/odoo.cfg

Contenu (remplacez exemple.fr) — noter le bloc location /websocket : depuis Odoo 17, le chat et les notifications passent par WebSocket. Beaucoup de tutoriels recopient encore /longpolling, qui ne sert plus à rien en Odoo 19 — son absence dégrade silencieusement le temps réel.

upstream odoo { server 127.0.0.1:8069; }
upstream odoochat { server 127.0.0.1:8072; }

server {
    listen 80;
    server_name exemple.fr www.exemple.fr;

    proxy_read_timeout 720s;
    proxy_set_header X-Forwarded-Host $host;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_set_header X-Real-IP $remote_addr;

    # Odoo 17+ : canal temps réel via WebSocket (remplace /longpolling)
    location /websocket {
        proxy_pass http://odoochat;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "Upgrade";
    }

    location / { proxy_pass http://odoo; }

    # Sécurité : ne pas exposer la liste des modules installés
    location = /website/info { deny all; return 404; }
}

Activez le site, autorisez les uploads volumineux et rechargez :

sudo ln -s /etc/nginx/sites-available/odoo.cfg /etc/nginx/sites-enabled/
sudo rm -f /etc/nginx/sites-enabled/default
grep -q "client_max_body_size" /etc/nginx/nginx.conf || sudo sed -i '/http {/a \    client_max_body_size 100M;' /etc/nginx/nginx.conf
sudo nginx -t
sudo systemctl reload nginx

Étape 5 — Configurer Odoo : proxy_mode et modules personnalisés

proxy_mode = True est obligatoire derrière un reverse proxy : c'est lui qui fait lire à Odoo les en-têtes X-Forwarded-* — sans lui, URLs générées et redirections sont incorrectes. On crée aussi le dossier des modules personnalisés.

sudo mkdir -p /opt/odoo/custom_addons
sudo chown -R odoo:odoo /opt/odoo/
sudo sed -i 's|addons_path = .*|addons_path = /usr/lib/python3/dist-packages/odoo/addons,/opt/odoo/custom_addons|' /etc/odoo/odoo.conf
grep -q "^proxy_mode" /etc/odoo/odoo.conf || echo "proxy_mode = True" | sudo tee -a /etc/odoo/odoo.conf
sudo systemctl restart odoo

Étape 6 — Activer le SSL avec Let's Encrypt

Un seul certificat pour le domaine et son www. Choisissez la redirection HTTP → HTTPS quand Certbot la propose.

sudo certbot --nginx -d exemple.fr -d www.exemple.fr -m admin@exemple.fr --agree-tos

Vérification du renouvellement automatique :

sudo certbot renew --dry-run

Étape 7 — Vérifications finales

Ouvrez https://exemple.fr : Odoo propose la création de la première base. Contrôles complémentaires :

# La route sensible doit répondre 404
curl -s -o /dev/null -w "%{http_code}\n" https://exemple.fr/website/info

# Le certificat et la redirection
curl -sI http://exemple.fr | grep -i location

Pensez ensuite aux sauvegardes (pg_dump + filestore) — voir le pilotage — et à la checklist des pièges connus.

Étape 8 (optionnelle) — Mise à jour automatique

⚠️ À décider en connaissance de cause. Cette option met à jour Odoo depuis les builds nightly et redémarre le serveur chaque nuit à 04:00, sans intervention humaine. Risque documenté : la mise à jour du paquet ne migre pas les schémas des bases (l'équivalent d'un -u n'est pas exécuté) — une désynchronisation code/base peut apparaître au réveil. Le script la laisse désactivée par défaut ; réservez-la aux instances dont vous acceptez ce compromis.
sudo apt install unattended-upgrades -y
sudo tee /etc/apt/apt.conf.d/50unattended-upgrades <<'EOF'
Unattended-Upgrade::Origins-Pattern {
    "origin=Ubuntu,archive=${distro_codename}";
    "origin=Ubuntu,archive=${distro_codename}-security";
    "origin=Ubuntu,archive=${distro_codename}-updates";
    "site=nightly.odoo.com";
};
Unattended-Upgrade::Automatic-Reboot "true";
Unattended-Upgrade::Automatic-Reboot-Time "04:00";
EOF
echo 'APT::Periodic::Unattended-Upgrade "0";' | sudo tee /etc/apt/apt.conf.d/20auto-upgrades
(sudo crontab -l 2>/dev/null | grep -v "/usr/bin/unattended-upgrade"; echo "0 4 * * * /usr/bin/unattended-upgrade -d") | sudo crontab -

Téléchargements

Le script complet et les deux paquets .deb en miroir (l'URL officielle de libssl1.1 change à chaque correctif de sécurité).

FichierRôleCommande
installOdoo_v2.sh Script d'installation / mise à jour wget https://netetic.fr/telechargements/installOdoo_v2.sh
libssl1.1_amd64.deb Dépendance de wkhtmltopdf (miroir) wget https://netetic.fr/telechargements/libssl1.1_amd64.deb
wkhtmltox_0.12.6-1.bionic_amd64.deb Moteur de rendu PDF (miroir) wget https://netetic.fr/telechargements/wkhtmltox_0.12.6-1.bionic_amd64.deb

Paquets redistribués sous leurs licences d'origine (OpenSSL / LGPL). Le miroir libssl1.1 est figé : il ne sert qu'au rendu PDF de wkhtmltopdf, pas aux services exposés du serveur.

Méthode IA&TIC — © 2026 IA&TIC — Freddy Maillard & Fabrice-Loïc Barbier — CC BY-SA 4.0