[ADD] migration : copie anonymisée, verdicts remontés, dérives dépistées Vingt-deux commits. Une copie de production s'ouvre désormais sans rien atteindre au dehors : `exp_duplicate_database` d'Odoo coupe la source, régénère l'uuid, emporte le filestore et neutralise — depuis la 16 seulement. En deçà, un script du dépôt prend le relais plutôt que de refuser, et l'exécution annonce lequel a servi, car les deux ne posent pas les mêmes gestes. L'anonymisation passe sa liste noire entière — le SQL par un fichier, un argument ne portant que 131 072 octets — et n'épargne plus les noms qu'elle devait masquer. Elle laisse intacts les chemins d'identifiants qu'Odoo repasse à `int()`, et tire ses nombres dans l'étendue mesurée de leur colonne : la fiche masquée s'ouvre encore. Une migration ratée ne passe plus pour réussie. Les verdicts de chaque palier, de la 12 à la 18, remontent dans un écran de qualité, avec le passage de journal qui les explique et la sortie des outils telle qu'ils l'écrivent : un pseudo-terminal la capture sans faire taire les invites conditionnées par `isatty`, ANSI retiré et secrets caviardés. Un code 1 y dit des trouvailles, non un échec. Trois dérives muettes deviennent dépistables : un dépôt d'addons absent d'un palier, un type de vue supprimé qui survit dans des sources qu'aucune base ne montre, un plan comptable qui gonfle sous un gabarit rechargé. La liste de prix cesse d'être dupliquée à vide : la décision se prend sur ce que `base.group_user` implique et non sur les groupes de l'exécutant, et une liste partagée entre sociétés compte enfin pour chacune. Le reste tient la chaîne : `odoo_bin.sh` lit le config.conf du dépôt par ODOO_RC, les bases se nomment sans collision, le registre se précharge, le lanceur de tests n'oublie plus de fichier, et un hook tient le sujet des commits. --- EN --- Twenty-two commits. A production copy now opens without reaching anything outside it: Odoo's `exp_duplicate_database` cuts the source, regenerates the uuid, carries the filestore over and neutralises — from 16 onwards only. Below it a repository script takes over rather than refusing, and the run announces which one served, because the two do not make the same gestures. Anonymisation runs its whole blacklist through — the SQL by way of a file, a single argument carrying no more than 131,072 bytes — and no longer spares the names it was meant to mask. It leaves alone the identifier paths Odoo passes back through `int()`, and draws its numbers from their own column's measured range: the masked record still opens. A failed migration no longer passes for a successful one. Every step's verdicts, 12 through 18, surface in a quality screen, with the log passage that explains them and the tools' output as they wrote it: a pseudo-terminal captures it without silencing the prompts conditioned on `isatty`, ANSI stripped and secrets redacted. There, exit code 1 means findings, not failure. Three silent drifts become detectable: an addons repository missing from one step, a removed view type surviving in sources no database shows, a chart of accounts swelling under a reloaded template. The pricelist stops being duplicated empty: the decision is taken on what `base.group_user` implies rather than on the runner's groups, and a pricelist shared across companies at last counts for each of them. The rest holds the chain: `odoo_bin.sh` reads the repository's config.conf through ODOO_RC, databases are named without collision, the registry is preloaded, the test runner no longer skips a file, and a hook holds commit subjects. Assisted-by: Claude Opus 5 |
||
|---|---|---|
| .claude | ||
| .github | ||
| conf | ||
| contracts | ||
| doc | ||
| docker | ||
| long_test | ||
| manifest | ||
| mobile | ||
| private | ||
| requirement | ||
| script | ||
| test | ||
| .editorconfig | ||
| .erplibre-semver-version | ||
| .flake8 | ||
| .gitignore | ||
| .prettierignore | ||
| AI_POLICY.base.md | ||
| AI_POLICY.fr.md | ||
| AI_POLICY.md | ||
| CHANGELOG.base.md | ||
| CHANGELOG.fr.md | ||
| CHANGELOG.md | ||
| CLAUDE.md | ||
| coverage_run.sh | ||
| docker-compose-dev.yml | ||
| docker-compose.yml | ||
| env_var.sh | ||
| install.sh | ||
| LICENSE | ||
| Makefile | ||
| odoo_bin.sh | ||
| package-lock.json | ||
| package.json | ||
| poetry.toml | ||
| README.base.md | ||
| README.fr.md | ||
| README.md | ||
| run.sh | ||
| source_repo_addons.csv | ||
| test.sh | ||
| TODO.base.md | ||
| TODO.fr.md | ||
| TODO.md | ||
ERPLibre
ERPLibre is a CRM/ERP platform including automated installation, maintenance, and development of open source modules of the Odoo community version. It is a "soft-fork" of the Odoo Community Edition (OCE), meaning it aims at contributing back upstream. It is based on a set of production-ready modules, supported by the Odoo Community Association (OCA) and an ecosystem of specialized companies. This solution ensures digital sovereignty in a local environment while integrating pre-trained Generative Transformers (GPT), bringing an additional dimension to data management and automation.
Follow us on Mastodon : https://fosstodon.org/@erplibre
Features
- Multi-version Odoo support : run Odoo 12.0, 13.0, 14.0, 15.0, 16.0, 17.0 and 18.0 in the same workspace, with independent Python virtual environments (
.venv.erplibreand.venv.odooXX) - Interactive CLI (TODO.py) : guided interactive tool for installation, execution, database management, code formatting, mobile compilation, and more. Launch it with
make - Code generator : generate Odoo modules automatically with support for views, portal, snippets, inheritance, i18n, and JavaScript
- Selenium automation : web testing and automation with Selenium Grid, video recording, and login automation
- Mobile application : ERPLibre Home Mobile (Owl + Capacitor), compiled and deployed via TODO.py
- Docker deployment : production-ready Docker images with PostgreSQL 18 and PostGIS
- Deployment tools : Nginx, Apache, Cloudflare DDNS, Certbot SSL, systemd services
- Database tools : backup, restore, clone, migration between versions, production-to-dev migration
- Performance tools : request-per-second measurement, parallel test execution, coverage analysis
Supported Odoo versions
| Odoo version | Python | Status |
|---|---|---|
| 18.0 | 3.12.10 | Active |
| 17.0 | 3.10.18 | Inactive |
| 16.0 | 3.10.18 | Inactive |
| 15.0 | 3.8.20 | Deprecated |
| 14.0 | 3.8.20 | Deprecated |
| 13.0 | 3.7.17 | Deprecated |
| 12.0 | 3.7.17 | Deprecated |
Switch between versions with make switch_odoo_18, make switch_odoo_16, etc.
Supported platforms
- Ubuntu : 24.04, 25.10, 26.04 — 20.04 and 22.04 are dropped, pikepdf requiring a qpdf 12.2 built in C++20
- Linux Mint : 22.3
- Debian : 12 (bookworm) and 13 (trixie)
- Fedora : 41 and later
- AlmaLinux, Rocky Linux : 9 and 10 — RHEL and CentOS Stream take the same path
- openSUSE : Leap 16.0 and Tumbleweed
- Arch Linux : rolling release
- macOS : through mise or pyenv
- Windows : through WSL or Docker
- Architectures : amd64, arm64 and s390x (IBM Z mainframe)
Installation in production
Easy installation on Ubuntu or Debian using Docker
This has been tested in Debian 12 and Ubuntu 24.04 LTS.
Note : This is meant for a test environment, on a local network or similar environment not directly exposed to the Internet.
-
Make sure Docker and nginx web server are installed:
sudo apt install docker.io docker-compose-v2 nginx -
Get the latest ERPLibre Docker compose file:
wget https://raw.githubusercontent.com/ERPLibre/ERPLibre/master/docker-compose.yml -
Install and run ERPLibre with Docker running as a daemon (web server):
sudo docker compose up -d -
Open the final installation step at this web page :
http://[server IP]:8069/web/database/manager

-
Finish the installation by providing a database name, email and password. then click on Create Database. Depending on your system resources this may take more than 2 minutes without feedback ! Check your browser loading indicator.
-
Next, the web page will reload itself, and you should see the Applications list in ERPLibre:

You can now personalize your ERPLibre installation.
For more information, read Docker guide.
Install from source code
Automated installation
For Debian/Ubuntu
sudo apt install make python3
Clone the project:
git clone https://github.com/ERPLibre/ERPLibre.git
cd ERPLibre
Follow the instruction on the following script, it will try to detect your environment.
make
Manually
Into Ubuntu, minimal dependency:
sudo apt install make git curl
Into Ubuntu, developer dependency:
sudo apt install make build-essential libssl-dev zlib1g-dev libreadline-dev libsqlite3-dev curl llvm libncurses5-dev libncursesw5-dev xz-utils tk-dev liblzma-dev libbz2-dev libldap2-dev libsasl2-dev
Clone the project:
git clone https://github.com/ERPLibre/ERPLibre.git
cd ERPLibre
make install_os detects the distribution and picks the right dependency script: apt for Ubuntu, Linux Mint and Debian, dnf for Fedora and the RHEL family, zypper for openSUSE, pacman for Arch. See the supported platforms above.
make install_os
make install_odoo_18
Install a specific Odoo version:
make install_odoo_16
make install_odoo_17
make install_odoo_18
Update your configuration if you need to run from another interface than 127.0.0.1, file config.conf
xmlrpc_interface = 0.0.0.0
Show version :
make version
Ready to execute:
make run
Test
Execute ERPLibre test with his code generator.
time make test_full_fast
Documentation
| Guide | Description |
|---|---|
| DISCOVER | Learn and explore ERPLibre |
| DEVELOPMENT | Development environment setup |
| PRODUCTION | Production server deployment |
| RUN | Execution modes and use cases |
| CODE_GENERATOR | Odoo module code generation |
| MIGRATION | Database migration between versions |
| GIT_REPO | Git repository management |
| POETRY | Python dependency management |
| FAQ | Frequently asked questions |
| HOWTO | How-to guides |
| WINDOWS_INSTALLATION | Windows installation |
Contributing
See CONTRIBUTION.md for guidelines.
License
This project is licensed under the GNU Affero General Public License v3.0.