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(etwww) 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
-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é).
| Fichier | Rôle | Commande |
|---|---|---|
| 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