Odoo Build
This is the Mint System Odoo development environment.
This projects provides a highly opinionated way to manage and develop Odoo. It features:
- 🔍 Odoo Source: Checkout the Odoo Community and Enterprise Edition and start editing the source code.
- 🐳 Container Compose: Spin up an Odoo, Postgres, and pgAdmin container and experiment locally.
- 💻 Native: Start an Odoo server directly from the source.
- 🔄 Multiple Versions: With Odoo Build, you can switch between Odoo versions starting from 13.0 up to 18.0.
- 🛠️ Develop Modules: Scaffold new modules, develop new Odoo features locally.
- 📥 Import and Export Database: Use Odoo scripts to copy and restore a customer database to the local environment. Investigate issues and deploy the database with ease.
- 🤝 Community Repos: The most common community repos are checked out when setting up the project.
- ✂️ Customizing Snippets: Create snippets and push them to an Odoo database.
- 🕰️ Odoo Revisions: Snapshot the Odoo source at a specific date. See revisions for details.
- 📦 Container Image: Build and publish a custom Odoo image. See README for details.
- 🔑 Credentials: Manage login credentials for Odoo and Nextcloud.
- ⬆️ Odoo Upgrade: Helper commands to ease the Odoo upgrade process.
- 🧠 LLM: Prompt LLMs with module code and apply changes.
- 🚀 And More: See task help.
Requirements
The Odoo development environment has the following requirements:
Command Completion (Optional)
bash/zsh alias task='./task' with completion.
Nix (Optional)
You can use Nix to setup the requirements.
LLM (Optional)
Install the llm cli to make use of the LLM features.
Usage
The usage section is a set of workflows. See task help or task for details about the project commands.
Clone this repository.
git clone git@github.com:Mint-System/Odoo-Build.git
cd Odoo-Build
When working with Nix, run the nix-shell.
nix-shell
Checkout the Odoo version. Supported versions are: 13.0, 14.0, 15.0, 16.0, 17.0, 18.0
task checkout "$VERSION"
Install Odoo scripts.
task install-odoo-scripts
Decide wether you want to run Odoo in native mode (from source) or as a container.
Native
Run Odoo from source. Currently supported OS: Ubuntu, Debian, Pop!_OS, Darwin, Windows with Ubuntu on WSL2.
Setup Odoo environment
Sync the submodule branch.
task sync-git-submodule
Setup Python environment
Install the Python and dependencies.
task install-native
Initialize and start Odoo from source
Start database container only.
task start db
Initialize database.
task init-db
Start Odoo from source.
task start native
The browser will be opened automatically.
Create a new module from source
Create a new module.
task create-module addons/project/project_sprint
Add a new model.
task generate-module-model addons/project/project_sprint project.sprint
Add model security.
task generate-module-security addons/project/project_sprint project.sprint
Load modules from thirdparty folder
Clone thirdparty repos into the thirdparty folder.
To load modules from a thirdparty folder, set this env var in your .env file:
ODOO_ADDONS_PATH=thirdparty/odoo-apps-partner-contact,../odoo-cd/untracked-odoo-apps
The paths will be appended to the Odoo config.
Initialize without demo data
In your .env file define this Odoo parameter env var:
ODOO_PARAM="--without-demo=all"
Set Odoo database name
By default the database name is the current branch name.
To define the name, set this env var in your .env file:
ODOO_DATABASE=odoo
Disable browser open
To disable the browser open when starting the Odoo server edit the .env file:
BROWSER_OPEN=false
Container
Run Odoo as container.
Set podman as container engine
If you are using podman, set this .env var:
CONTAINER_ENGINE=podman
Start and initialize Odoo
Set the Odoo addons path in your .env file:
ODOO_ADDONS_PATH=/mnt/addons/,/mnt/oca/,/mnt/enterprise,/mnt/themes/
Run container compose.
task start
Initialize database with the Odoo script.
Use docker-odoo-init help to show all options.
docker-odoo-init -d odoo -i web
Open browser to http://localhost:8069 and login with admin:admin.
Install custom module
docker-odoo-install -m show_db_name
Common
Instructions that are true for container and native usage.
Change log level
To change the log level of Odoo set this env var in your .env file:
LOG_LEVEL=debug
Manage database with container
Open database manager http://localhost:8000/ and login with admin@example.com:admin.
Remove containers
This removes containers and volumes.
task remove
Stop all containers
task stop
Drop database
task drop-db
Define Postgres image version
Define the Postgres image in your .env file:
POSTGRES_IMAGE=postgres:12-alpine
Build and publish container image
Ensure your container setup can build multi-platform images.
Checkout latest revision of the Odoo version.
task checkout-latest-revision "16.0"
Build the Odoo image.
task build
Test the image.
task test-container
Publish the Odoo image.
task publish
Setup mail catcher
Start mail server.
task start mail
Setup mail server config for Odoo.
task setup-mail
Develop
Create Odoo revision
Check the latest official Odoo image tag on https://hub.docker.com/_/odoo/tags.
Replace the - with a . in the tag name and create a revision:
task create-revision 16.0.20250311
Replace all image references in the docs.
Update repo template from oca-addons-repo-template
Install copier.
source task source
uv pip install copier
Run copier and select ruff as linter.
copier copy --UNSAFE https://github.com/OCA/oca-addons-repo-template.git "templates/$VERSION"
Remove unnecessary linter files.
cd "templates/$VERSION"
rm -rf .github
rm .copier-answers.yml
rm .flake8
rm .isort.cfg
rm .pylintrc-mandatory
rm README.md
In .pre-commit-config.yaml remove mandatory pylint odoo:
- id: pylint_odoo
args:
- --rcfile=.pylintrc-mandatory
In .pylintrc remove these rules:
- missing-return
- duplicate-xml-record-id
In the .ruff.toml set this option:
line-length = 120
Template the server tools repo and run the linter:
task template-repo addons/server_tools
cd addons/server_tools
task all
Refine the templates based on the linter results.
Troubleshooting
Remove tracked submodule folders
Problem
The checkout command fails tue to unregistered submdoules.
Solution
Remove the submodule with git rm, f.e. git rm oca/dms.
inotify instance limit reached
Problem
While starting the native server this error is thrown:
OSError: [Errno 24] inotify instance limit reached
Or this error:
inotify.calls.InotifyError: Call failed (should not be -1): (-1) ERRNO=(0)
Solution
Increase inotify watch limit.
sudo vi /etc/sysctl.conf
fs.inotify.max_user_watches=524288
fs.inotify.max_user_instances=256
sudo sysctl -p
ImportError libldap
Problem
Instance with auth_ldap does not start.
ImportError: libldap_r-2.4.so.2: cannot open shared object file: No such file or directory
Solution
Reinstall with pip flags.
pip install python-ldap --force-reinstall --no-binary python-ldap
psycopg2 symbol not found
Problem
init-db fails with psycopg2 errors on macOS / Darwin.
Solution
source task source
pip install psycopg2-binary --force
Distribution not found
Problem
After switching the Odoo version with task checkout the task command fail with this error:
pkg_resources.DistributionNotFound: The 'odoo==XX.0' distribution was not found and is required by the application
Solution
The local Odoo package needs to be updated:
source task source
pip install -e odoo
Import Error lxml
Problem
After install the Pyhton dependencies and running Odoo the following error is thrown:
ImportError: lxml.html.clean module is now a separate project lxml_html_clean.
Install lxml[html_clean] or lxml_html_clean directly.
Solution
Pin the version lxml.
pip install lxml==4.9.3
Attribute Error werkzeug
Problem
After install the Pyhton dependencies and running Odoo the following error is thrown:
Traceback (most recent call last):
File "/home/janikvonrotz/Odoo-Build/venv17.0/bin/odoo", line 7, in <module>
exec(compile(f.read(), __file__, 'exec'))
File "/home/janikvonrotz/Odoo-Build/odoo/setup/odoo", line 5, in <module>
import odoo
File "/home/janikvonrotz/Odoo-Build/odoo/odoo/__init__.py", line 119, in <module>
from . import service
File "/home/janikvonrotz/Odoo-Build/odoo/odoo/service/__init__.py", line 5, in <module>
from . import model
File "/home/janikvonrotz/Odoo-Build/odoo/odoo/service/model.py", line 13, in <module>
from odoo.http import request
File "/home/janikvonrotz/Odoo-Build/odoo/odoo/http.py", line 279, in <module>
if parse_version(werkzeug.__version__) >= parse_version('2.0.2'):
^^^^^^^^^^^^^^^^^^^^
AttributeError: module 'werkzeug' has no attribute '__version__'
Solution
pip install Werkzeug==2.2.2