{"id":51222199,"url":"https://github.com/radical-data/radical-odoo","last_synced_at":"2026-06-28T08:02:44.234Z","repository":{"id":365921139,"uuid":"1274334080","full_name":"radical-data/radical-odoo","owner":"radical-data","description":null,"archived":false,"fork":false,"pushed_at":"2026-06-19T12:40:32.000Z","size":321,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-06-19T14:23:15.916Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/radical-data.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-06-19T12:05:55.000Z","updated_at":"2026-06-19T12:40:35.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/radical-data/radical-odoo","commit_stats":null,"previous_names":["radical-data/radical-odoo"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/radical-data/radical-odoo","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/radical-data%2Fradical-odoo","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/radical-data%2Fradical-odoo/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/radical-data%2Fradical-odoo/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/radical-data%2Fradical-odoo/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/radical-data","download_url":"https://codeload.github.com/radical-data/radical-odoo/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/radical-data%2Fradical-odoo/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34881384,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-28T02:00:05.809Z","response_time":54,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2026-06-28T08:02:43.635Z","updated_at":"2026-06-28T08:02:44.225Z","avatar_url":"https://github.com/radical-data.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Radical Odoo deployment\n\nAn opinionated Odoo deployment for small organisations in the Netherlands.\n\nImmutable Docker Compose deployment for **Odoo 19 Community** with a small set\nof packaged custom and OCA addons.\n\nThe repository is intended for local testing and deployment through platforms\nsuch as **Coolify**.\n\n## Design\n\n- `Dockerfile` builds a custom image from `odoo:19.0`.\n- OCA addons are installed as pinned Python packages from the OCA wheelhouse.\n- Vendored project addons are installed through `hatch-odoo` into the\n  `odoo.addons` namespace during the Docker build.\n- Odoo and PostgreSQL runtime data live in Docker volumes.\n- Production does not mount `/mnt/extra-addons`; addon code is image content.\n- Installing addon code in the image and updating installed modules in the\n  database are separate operations.\n\nThe source of truth is:\n\n```text\nRuntime/services: docker-compose.yml\nImage/addons:     Dockerfile, pyproject.toml, addons/, odoo-modules.txt\nPython packages:  requirements.txt\nLocal env sample: .env.example\nVAT workflow:     docs/nl-eenmanszaak-vat-workflow.md\n```\n\n## Local usage\n\nCreate a local environment file:\n\n```bash\ncp .env.example .env\n```\n\nEdit `.env`, then run:\n\n```bash\ndocker compose up --build\n```\n\nOpen:\n\n```text\nhttp://localhost:8069\n```\n\nFor a clean local reset:\n\n```bash\ndocker compose down -v\n```\n\nThis deletes the local Odoo and PostgreSQL volumes.\n\nInstall developer checks, or run them through `uvx` without a persistent install:\n\n```bash\nuv tool install pre-commit\npre-commit install\nuvx pre-commit run --all-files\n```\n\n## Deployment\n\nIn Coolify, create a Docker Compose application from this repository.\n\nSet real values for required secrets in the Coolify environment variables UI:\n\n```env\nSERVICE_USER_POSTGRES=odoo\nSERVICE_PASSWORD_POSTGRES=use-a-real-password\n```\n\nOptional local setting:\n\n```env\nODOO_PORT=8069\n```\n\nDo not commit production environment files.\n\n## First Odoo setup\n\nAfter the first login:\n\n1. Install Invoicing.\n2. Go to Apps -\u003e Update Apps List.\n3. Install or update the modules listed in odoo-modules.txt.\n4. Confirm the company fiscal localisation is set to Netherlands.\n5. Enable the accounting user rights described in\n   [`docs/nl-eenmanszaak-vat-workflow.md`](docs/nl-eenmanszaak-vat-workflow.md):\n   especially Analytic Accounting and Show Full Accounting Features.\n6. Validate that the official Odoo 19 Dutch reports are present before relying\n   on the database for VAT filing:\n\n```bash\nscripts/check-nl-tax-readiness.sh \u003cdatabase\u003e\n```\n\n## Common commands\n\n```bash\ndocker compose build --pull\ndocker compose up -d\ndocker compose logs -f odoo\nscripts/update-odoo-modules.sh \u003cdatabase\u003e\nscripts/check-nl-tax-readiness.sh \u003cdatabase\u003e\n```\n\nWith just:\n\n```bash\njust build\njust up\njust logs\njust lint\njust check\n```\n\nInstall just with your system package manager, for example:\n\n```bash\nbrew install just\n```\n\nRun all repository checks:\n\n```bash\njust lint\n```\n\n`just lint` uses `uvx pre-commit run --all-files`, so pre-commit does not need to be installed persistently.\n\n## Updating modules\n\nInstalling addon code in the image does not install or upgrade modules in an\nOdoo database.\n\nUse the helper script against a staging copy first:\n\n```bash\nscripts/update-odoo-modules.sh \u003cdatabase\u003e\n```\n\nBy default, the script updates the modules listed in:\n\n```text\nodoo-modules.txt\n```\n\nTo update a specific comma-separated module list:\n\n```bash\nscripts/update-odoo-modules.sh \u003cdatabase\u003e module_a,module_b\n```\n\nBack up PostgreSQL and the Odoo filestore before production module updates.\n\n## Updating Python and OCA dependencies\n\n`requirements.in` is the human-edited dependency input.\n\n`requirements.txt` is the pinned install file used by the Docker image.\n\nBecause OCA addon wheels depend on the Odoo runtime provided by the base image,\nregenerate and verify the pinned file inside an Odoo image. Do not hand-edit it\ncasually.\n\nEdit:\n\n```text\nrequirements.in\n```\n\nThen resolve from inside the Odoo base image:\n\n```bash\ndocker run --rm -v \"$PWD:/work\" -w /work odoo:19.0 \\\n  python3 -m pip install --break-system-packages -r requirements.in\n```\n\nIf the resolver can satisfy the Odoo runtime constraint, compile the lock file\nwith one chosen tool:\n\n```bash\nuv pip compile requirements.in -o requirements.txt\n```\n\nor:\n\n```bash\npip-compile -o requirements.txt requirements.in\n```\n\nCommit both files and rebuild the image:\n\n```bash\ndocker compose build --pull\n```\n\nTest against a staging database before production deployment when addon packages\nor Odoo-related dependencies change.\n\n## Backups\n\nBackups must preserve both:\n\n- PostgreSQL database data.\n- Odoo filestore data in /var/lib/odoo.\n\nBefore production module updates, back up both the database and the filestore.\nTest restores in staging when the accounting database becomes important.\n\n## Useful checks\n\n```bash\ndocker compose exec odoo python3 -c 'import odoo.addons.account_invoice_digitize_ai'\ndocker compose exec odoo python3 -c 'import odoo.addons.account_financial_report, odoo.addons.date_range, odoo.addons.report_xlsx'\ndocker compose logs -f odoo\n```\n\n## Dutch tax filing approach\n\nThis deployment targets an NL eenmanszaak doing services, installations,\nworkshops, funded projects, and international collaborations.\n\nFor Odoo 19, the primary Dutch tax filing path is Odoo's built-in Dutch\nlocalisation:\n\n```text\nl10n_nl\n```\n\nSee [`docs/nl-eenmanszaak-vat-workflow.md`](docs/nl-eenmanszaak-vat-workflow.md)\nfor the full workflow and transaction-based acceptance test.\n\nDo not store API keys, database dumps, filestores, or production passwords in\nthis repository.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fradical-data%2Fradical-odoo","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fradical-data%2Fradical-odoo","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fradical-data%2Fradical-odoo/lists"}