🎯 Ce que cet article apprend
- Suivre les logs Odoo en temps réel et filtrer les erreurs avec
tail -fcombiné àgrepoujournalctl - Diagnostiquer un worker bloqué et reprendre la main via
ps,lsof,ss,kill - Sécuriser le filestore et le service
systemdaprès unrsyncou un changement d'utilisateur système
Cet article ouvre la série S01 — Boîte à outils Linux du dev Odoo, cinq épisodes consacrés aux fondamentaux Linux, Git, Bash, odoo-bin shell et PostgreSQL appliqués à un environnement Odoo 19. Le présent épisode pose la base système. Les suivants empilent les couches outillage et données.
📦 Paquets optionnels — tree, locate, htop
Trois commandes utilisées dans cet article ne figurent pas dans une installation Ubuntu 24.04 minimale. Si le shell répond command not found, le paquet correspondant s'installe en une ligne :
sudo apt install tree # arborescence visuelle (section 1)
sudo apt install plocate # fournit locate + updatedb (section 3)
sudo apt install htop # moniteur de processus interactif (section 4)
Après l'installation de plocate, lancer sudo updatedb une première fois pour construire l'index du système de fichiers. Les commandes cœur — ls, cd, grep, find, ps, kill, chmod, chown, systemctl, journalctl, ssh, scp, rsync — sont présentes sur toute installation Ubuntu standard, aucun paquet supplémentaire requis.
1. Naviguer et inspecter une arborescence Odoo
Toute sandbox Odoo se résume à trois répertoires clés : les sources du moteur (./odoo/), les addons custom (./addons/), et le filestore par utilisateur système (~/.local/share/Odoo/filestore/). Cinq commandes suffisent à s'y déplacer sans hésitation.
# Se déplacer dans la sandbox
cd ~/odoo-dev
# Lister le contenu avec tailles humaines et fichiers cachés
ls -lah
# Afficher le chemin courant (utile dans les scripts)
pwd
# Afficher l'arborescence sur 2 niveaux
tree -L 2 addons/
# Suivre un fichier de log et naviguer dans le flux
less +F /var/log/odoo/odoo.log
L'option +F de less ouvre le fichier en mode follow, équivalent visuel de tail -f, mais avec la possibilité d'appuyer sur Ctrl+C pour reculer dans l'historique, puis F pour reprendre la lecture. Un gain net quand le log défile vite pendant une install de module volumineux.
📖 Définition — Le filestore Odoo
Le filestore est le répertoire qui stocke les pièces jointes binaires hors base PostgreSQL (images produit, PDF de factures, exports). Sur Ubuntu, son chemin par défaut est ~/.local/share/Odoo/filestore/<nom_base>/. Chaque base de données dispose de son propre sous-répertoire. La table ir_attachment conserve les métadonnées, mais les octets vivent sur disque. Une perte du filestore sans sauvegarde équivaut à une perte des pièces jointes — la base seule ne suffit pas pour une restauration complète.
2. Suivre les logs Odoo en temps réel
Le diagnostic d'une installation de module ratée passe presque toujours par la lecture du log Odoo pendant son exécution. Quatre commandes couvrent l'essentiel des cas, selon que le serveur tourne en service systemd ou en mode dev direct.
# Suivre le log Odoo en temps réel
tail -f /var/log/odoo/odoo.log
# Filtrer ERROR et WARNING à la volée (--line-buffered force le flush ligne par ligne)
tail -f /var/log/odoo/odoo.log | grep --line-buffered "ERROR\|WARNING"
# Suivre via systemd-journal quand Odoo tourne comme service
journalctl -fu odoo.service
# Naviguer librement dans le flux (avant/arrière) avec less
less +F /var/log/odoo/odoo.log
L'option --line-buffered de grep est essentielle : sans elle, la sortie est mise en buffer par bloc de 4 ko et les erreurs apparaissent avec plusieurs secondes de retard. Côté Odoo 19, les options --logfile, --log-web (DEBUG sur odoo.http) et --log-sql (DEBUG sur odoo.sql_db) restent inchangées par rapport à la v18. Activer --log-sql ponctuellement permet de voir chaque requête SQL générée par l'ORM — précieux pour traquer un N+1 dans un compute lent.
tail -f /var/log/odoo/odoo.log | grep --line-buffered "ERROR\|WARNING" en action pendant l'installation d'un module custom. Les lignes INFO sont filtrées, seules les ERROR et WARNING remontent au terminal. Le filtre est appliqué à la volée, sans modifier le fichier source ni redémarrer Odoo.🔧 Nouveauté v19 — Réplique PostgreSQL en lecture
Odoo 19 introduit deux options de configuration : --db_replica_host et --db_replica_port (source : odoo/tools/config.py, lignes 377-381). Elles permettent de brancher une réplique de lecture PostgreSQL pour décharger les requêtes SELECT du primaire. Aucun équivalent en v18. Utile pour les déploiements multi-base à fort trafic ; à laisser vide pour une sandbox dev.
3. Trouver fichiers et chaînes de caractères
Sur une sandbox qui héberge plusieurs dizaines de modules custom et plusieurs centaines de modules cœur Odoo, retrouver le fichier qui définit un champ ou hérite d'un modèle natif demande une routine de recherche fiable. Quatre commandes y suffisent.
# Chercher tous les XML modifiés depuis un marqueur temporel
find . -name "*.xml" -newer /tmp/marker
# Chercher une chaîne récursivement dans les addons (numéro de ligne + nom de fichier)
grep -rn "_inherit = 'res.partner'" addons/
# Chercher un fichier dans toute la machine via la base mlocate
locate odoo.conf
# Trouver le binaire actif dans le PATH
which odoo-bin
La commande grep -rn est le réflexe à acquérir : -r recursive, -n ajoute le numéro de ligne. L'ajout de --include="*.py" limite la recherche aux fichiers Python et accélère sur les gros dépôts. Pour locate, sa base est mise à jour par sudo updatedb, exécuté typiquement une fois par jour via cron — un fichier créé il y a cinq minutes ne sera donc pas trouvé tant que la base n'est pas régénérée. Sur Ubuntu 24.04, le paquet est plocate.
4. Processus et ports — diagnostiquer un worker bloqué
Quand l'interface web ne répond plus, deux pistes à dérouler systématiquement : un worker Python figé, ou le port HTTP occupé par un processus fantôme issu d'un précédent crash. Cinq commandes ouvrent toutes les portes du diagnostic.
# Lister tous les processus liés à Odoo
ps aux | grep odoo
# Vue interactive triée CPU/RAM, filtrable par utilisateur
htop -u odoo
# Tuer proprement un PID (SIGTERM laisse le worker terminer sa transaction)
kill -SIGTERM <PID>
# Trouver le processus qui occupe le port 8069
lsof -i :8069
# Alternative moderne à netstat pour lister les ports en écoute
ss -tulpn | grep 8069
L'ordre des signaux compte. SIGTERM (15) demande au processus de s'arrêter proprement : le worker termine sa requête HTTP, ferme la transaction PostgreSQL, libère les ressources. SIGKILL (9) tue brutalement et laisse derrière des connexions PostgreSQL orphelines (idle in transaction) — à n'utiliser qu'en dernier recours, après un SIGTERM resté sans effet pendant plus de dix secondes. Sur Ubuntu 24.04, ss -tulpn est dix à cinquante fois plus rapide que lsof -i pour la même information utile (PID, processus, port) — préférer ss dans les scripts d'audit.
htop -u odoo filtre l'affichage sur l'utilisateur système Odoo. Les processus python3 odoo-bin apparaissent avec leur consommation CPU et RAM. Le PID en première colonne se reporte directement dans kill -SIGTERM <PID> pour stopper un worker bloqué sans interrompre les autres.📖 Définition — lsof et ss
lsof (list open files) liste tous les fichiers ouverts sur le système. Comme tout est fichier sous Unix (y compris les sockets réseau), lsof -i :PORT répond à la question « quel processus écoute sur ce port ? ». ss (socket statistics) est le successeur moderne de netstat dans iproute2. Combinaison utile -tulpn : t TCP, u UDP, l listening, p show process, n numeric (pas de résolution DNS). Plus rapide que lsof sur les hôtes chargés.
5. Permissions et filestore
Les soucis de droits arrivent toujours par surprise — typiquement après un rsync entre poste dev et VPS, ou après une bascule de l'utilisateur système qui exécute Odoo. Quatre commandes ferment le sujet.
# Rendre odoo-bin exécutable (755 = rwxr-xr-x)
chmod 755 odoo-bin
# Réajuster le propriétaire du filestore (récursif)
sudo chown -R odoo:odoo ~/.local/share/Odoo/filestore
# Forcer la permission 644 sur tous les fichiers (pas les répertoires)
sudo find ~/.local/share/Odoo/filestore -type f -exec chmod 644 {} \;
# Mesurer la taille du filestore par sous-répertoire (= par base)
du -sh ~/.local/share/Odoo/filestore/*
Le couple 755 / 644 est la convention standard : 755 sur les répertoires et exécutables, 644 sur les fichiers de données. Toute permission plus permissive (par exemple 777) sur le filestore est un anti-pattern de sécurité. La commande du -sh */ dans le répertoire filestore donne en deux secondes la liste des bases triées par poids — utile pour identifier celle qui sature un disque avant qu'une alerte de monitoring ne se déclenche.
⚠️ Piège — Permissions filestore après rsync
Un rsync exécuté en root sur le filestore conserve l'UID source. Si le poste dev utilise un UID 1000 et le VPS un utilisateur odoo en UID 998, les fichiers transférés appartiennent à un UID 1000 inconnu sur la cible. Conséquence : Odoo lance une erreur silencieuse lors de l'upload d'une nouvelle pièce jointe (permission denied) — la base continue de fonctionner pour la lecture, l'erreur n'apparaît qu'au moment d'un upload. Réflexe à adopter : exécuter sudo chown -R odoo:odoo ~/.local/share/Odoo/filestore immédiatement après tout rsync sur le répertoire.
6. Service systemd Odoo
Sur Ubuntu 24.04, Odoo tourne typiquement comme service systemd nommé odoo ou odoo.service. Quatre commandes pilotent le cycle de vie complet.
# Vérifier l'état du service (running, failed, inactive)
sudo systemctl status odoo
# Démarrer, arrêter, redémarrer
sudo systemctl start odoo
sudo systemctl stop odoo
sudo systemctl restart odoo
# Activer le démarrage automatique au boot
sudo systemctl enable odoo
# Consulter les logs systemd-journal du service
sudo journalctl -u odoo --since "1 hour ago"
L'option --since de journalctl accepte des formes variées : "1 hour ago", "yesterday" ou date ISO 8601 ("2026-05-13 14:00"). Combinée à -u odoo, elle isole les événements du service sur une fenêtre précise pour reconstituer un incident a posteriori.
📖 Définition — systemd
systemd est le gestionnaire de services par défaut des distributions Linux modernes (Ubuntu 16.04+, Debian 8+, RHEL 7+). Il remplace l'ancien init.d et SysVinit. Les services sont définis par des fichiers .service dans /etc/systemd/system/. Le composant journald centralise les logs (consultables via journalctl) au lieu des fichiers texte sous /var/log/. Pour Odoo, le service typique pointe ExecStart=/opt/odoo/odoo-bin -c /etc/odoo/odoo.conf et tourne sous l'utilisateur odoo.
7. Transferts locaux et backup rapide
Le développeur Odoo synchronise régulièrement son poste local avec un VPS de staging ou de prod. Quatre commandes couvrent les usages quotidiens, du transfert ponctuel d'un fichier de config jusqu'à la sauvegarde compressée d'un filestore.
# Copier un fichier vers un VPS distant via SSH
scp odoo.conf user@vps:/etc/odoo/
# Synchroniser un répertoire d'addons (--delete supprime côté cible les fichiers absents source)
rsync -avz --delete ./addons/ root@vps:/opt/odoo/custom-addons/
# Compresser un filestore avec horodatage automatique
tar czf filestore-$(date +%Y%m%d).tgz -C ~/.local/share/Odoo filestore/
# Dump PostgreSQL au format custom (sans filestore)
pg_dump -Fc -f backup_$(date +%Y%m%d).dump nom_base
Le flag -avz de rsync est le combo standard : a archive (préserve permissions, timestamps, symlinks), v verbose, z compression à la volée. L'option --delete est puissante mais destructive — à n'activer que si la cible est un miroir intégral du dépôt source. Pour les dumps PostgreSQL, le format custom (-Fc) produit un fichier binaire compressé restaurable via pg_restore, plus compact que le SQL plain. L'épisode S05 détaille les patterns pg_dump / pg_restore spécifiques à Odoo.
8. Cinq alias .bashrc qui changent la vie
Aucune commande Linux ne remplace un alias bien placé dans le .bashrc du développeur. Cinq alias suffisent à transformer le confort quotidien sur une sandbox Odoo.
# Suivre les erreurs Odoo en un caractère
alias logodoo='tail -f /var/log/odoo/odoo.log | grep --line-buffered "ERROR\|WARNING"'
# Redémarrer Odoo et suivre les logs systemd dans la foulée
alias restartodoo='sudo systemctl restart odoo && sudo journalctl -fu odoo'
# Se connecter à PostgreSQL avec le bon user en une frappe
alias psqlme='psql -U odoo -h localhost'
# Sauter dans le venv Odoo en une commande
alias odoodev='cd ~/odoo-dev && source venv/bin/activate'
# Vérifier l'état Git des addons custom
alias addons='cd ~/odoo-dev/addons-custom && git status'
Ces alias se déclarent dans ~/.bashrc, puis source ~/.bashrc les active dans la session courante. Règle d'or : ne pas créer d'alias qui masque une commande système standard (par exemple alias ls='rm -rf' est un piège sécurité — préfixer toujours par un verbe métier).
💡 Astuce — Navigation vi sur la ligne de commande
Ajouter set -o vi dans .bashrc active la navigation vi sur la ligne de commande Bash. Le mode normal (touche Échap) permet alors de naviguer avec h j k l, de supprimer un mot avec dw, de remplacer avec c, exactement comme dans l'éditeur. Un saut productif quand on enchaîne les inspections, à condition d'être déjà familier avec vi/vim. Réversible à tout moment via set -o emacs (mode par défaut).
⚠️ Piège — Redémarrer Odoo après modification d'addons
Après un rsync ou un git pull qui modifie un fichier Python d'un addon, lancer sudo systemctl restart odoo avant tout test. Les workers Python ne rechargent pas à chaud les modules importés. Le code modifié reste invisible jusqu'au redémarrage. Pour les modifications XML/QWeb d'un module installé, ajouter -u nom_module à la commande odoo-bin de relance afin de forcer la mise à jour des vues.
9. Les 30 commandes en synthèse
La table ci-dessous reprend la totalité des trente commandes vues dans l'article. Mémoriser le cas d'usage permet de retrouver la commande sans hésiter, même sous pression.
| # | Cas d'usage | Commande |
|---|---|---|
| 1 | Changer de répertoire | cd ~/odoo-dev |
| 2 | Lister fichiers détaillés | ls -lah |
| 3 | Afficher chemin courant | pwd |
| 4 | Afficher l'arborescence | tree -L 2 |
| 5 | Suivre un fichier interactivement | less +F fichier.log |
| 6 | Suivre un log en temps réel | tail -f odoo.log |
| 7 | Filtrer ERROR/WARNING en flux | tail -f odoo.log | grep --line-buffered "ERROR\|WARNING" |
| 8 | Suivre logs systemd-journal | journalctl -fu odoo.service |
| 9 | Naviguer dans un flux log | less +F odoo.log |
| 10 | Trouver fichiers modifiés récents | find . -name "*.xml" -newer /tmp/marker |
| 11 | Chercher chaîne récursivement | grep -rn "_inherit" addons/ |
| 12 | Localiser un fichier par nom | locate odoo.conf |
| 13 | Trouver un binaire dans PATH | which odoo-bin |
| 14 | Lister processus Odoo | ps aux | grep odoo |
| 15 | Vue interactive triée CPU/RAM | htop -u odoo |
| 16 | Arrêter proprement un PID | kill -SIGTERM <PID> |
| 17 | Identifier process sur port | lsof -i :8069 |
| 18 | Lister ports en écoute | ss -tulpn | grep 8069 |
| 19 | Rendre exécutable | chmod 755 odoo-bin |
| 20 | Réajuster propriétaire récursif | sudo chown -R odoo:odoo filestore/ |
| 21 | Appliquer 644 à tous les fichiers | find filestore -type f -exec chmod 644 {} \; |
| 22 | Mesurer taille par sous-rép | du -sh filestore/* |
| 23 | État du service Odoo | sudo systemctl status odoo |
| 24 | Redémarrer le service | sudo systemctl restart odoo |
| 25 | Activer au boot | sudo systemctl enable odoo |
| 26 | Logs systemd fenêtre temporelle | journalctl -u odoo --since "1 hour ago" |
| 27 | Copier fichier vers VPS | scp odoo.conf user@vps:/etc/odoo/ |
| 28 | Synchroniser addons VPS | rsync -avz --delete ./addons/ user@vps:/opt/odoo/ |
| 29 | Archiver filestore daté | tar czf filestore-$(date +%Y%m%d).tgz filestore/ |
| 30 | Dump PostgreSQL format custom | pg_dump -Fc -f backup.dump nom_base |
Pour fixer ces commandes en mémoire musculaire : tester chacune au moins une fois sur une sandbox locale avant la première intervention sous pression, puis les ranger dans un fichier ~/odoo-cheatsheet.md consultable en Ctrl+F. Au bout de quelques semaines, les quinze plus utilisées passent en réflexe.
Voir aussi dans la série
S01 — Linux : 30 commandes pour la sandbox
logs, processus, ports, permissions, systemd, alias .bashrc.
S02 — Git & GitHub : 20 commandes pour cloner, brancher, contribuer
clone shallow, submodules OCA, workflow feature-branch, PR via gh.
S03 — Bash : 5 scripts qui font gagner 1 heure par jour
start-odoo.sh, restore-db.sh, dump-and-clean.sh, install-and-test.sh, update-all-addons.sh.
S04 — odoo-bin shell : 15 patterns ORM essentiels
env, search_fetch v19, Domain, flush_model / invalidate_model.
S05 — PostgreSQL : psql, SELECT, dump propre
Requêtes psql, EXPLAIN ANALYZE, garde-fous UPDATE / DELETE, CTA E3.
Articles complémentaires
#50 — Installer Odoo 19 sur Ubuntu 24.04 LTS
Installation initiale — préalable à toute commande système.
#54 — Configurer l'environnement de développement Odoo 19
Setup PyCharm/VS Code, venv, addons-path — la suite de l'installation.