[{"data":1,"prerenderedAt":1173},["ShallowReactive",2],{"navigation":3,"latest-changelog-release":42,"blog-page":70,"blogs":78},[4],{"title":5,"path":6,"stem":7,"children":8,"page":41},"Blog","\u002Fblog","blog",[9,13,17,21,25,29,33,37],{"title":10,"path":11,"stem":12},"Clean Fix for the ‘Model Not in Registry’ Error in Odoo Addons","\u002Fblog\u002Fclean-fix-for-the-model-not-in-registry-error-in-odoo-addons","blog\u002Fclean-fix-for-the-model-not-in-registry-error-in-odoo-addons",{"title":14,"path":15,"stem":16},"From Sales to Production: The Story of a Connected Manufacturing Workflow in Odoo","\u002Fblog\u002Ffrom-sales-to-production-the-story-of-a-connected-manufacturing-workflow-in-odoo","blog\u002Ffrom-sales-to-production-the-story-of-a-connected-manufacturing-workflow-in-odoo",{"title":18,"path":19,"stem":20},"How to Install Odoo 18 Community Edition on Ubuntu Server","\u002Fblog\u002Fhow-to-install-odoo-18-community-edition-on-ubuntu-server","blog\u002Fhow-to-install-odoo-18-community-edition-on-ubuntu-server",{"title":22,"path":23,"stem":24},"How to Properly Backup Your Odoo Instance (Database + Filestore)","\u002Fblog\u002Fhow-to-properly-backup-your-odoo-instance-database-filestore","blog\u002Fhow-to-properly-backup-your-odoo-instance-database-filestore",{"title":26,"path":27,"stem":28},"Launch Your Odoo MVP in Weeks with MoSCoW Prioritization","\u002Fblog\u002Flaunch-your-odoo-mvp-in-weeks-with-moscow-prioritization","blog\u002Flaunch-your-odoo-mvp-in-weeks-with-moscow-prioritization",{"title":30,"path":31,"stem":32},"Managing Users and Groups on Linux: A Practical Guide","\u002Fblog\u002Fmanaging-users-and-groups-on-linux-a-practical-guide","blog\u002Fmanaging-users-and-groups-on-linux-a-practical-guide",{"title":34,"path":35,"stem":36},"Understanding Odoo's Filestore Structure: What’s Inside and Why It Matters","\u002Fblog\u002Funderstanding-odoos-filestore-structure-whats-inside-and-why-it-matters","blog\u002Funderstanding-odoos-filestore-structure-whats-inside-and-why-it-matters",{"title":38,"path":39,"stem":40},"What Is a BoM and How Does It Affect Product Costs?","\u002Fblog\u002Fwhat-is-a-bom-and-how-does-it-affect-product-costs","blog\u002Fwhat-is-a-bom-and-how-does-it-affect-product-costs",false,{"id":43,"title":44,"added":45,"body":50,"date":57,"description":58,"extension":59,"fixed":60,"image":60,"imageAlt":60,"improved":61,"meta":63,"navigation":64,"path":65,"seo":66,"stem":67,"version":68,"__hash__":69},"changelog\u002Fchangelog\u002Fv0.9.1.md","Current website version",[46,47,48,49],"Homepage introducing Koderstory and its work.","Services page for website, business system, and ERP work.","Blog with practical articles.","About page with company information and approach.",{"type":51,"value":52,"toc":53},"minimark",[],{"title":54,"searchDepth":55,"depth":55,"links":56},"",2,[],"2026-10-17","The current pre-1.0 baseline for the Koderstory website.","md",null,[62],"Replaced the About page company information section with a clearer contact call to action.",{},true,"\u002Fchangelog\u002Fv0.9.1",{"title":44,"description":58},"changelog\u002Fv0.9.1","0.9.1","2BmReZMoo2c1JW3Ek64_ZyALBF8Yx8MR4yi8uQnb8SE",{"id":71,"title":72,"body":60,"description":73,"extension":74,"links":60,"meta":75,"navigation":64,"path":6,"seo":76,"stem":7,"__hash__":77},"pages\u002Fblog.yml","Latest Articles","Some of my recent thoughts on design, development, and the tech industry.","yml",{},{"title":72,"description":73},"vycKbZXH6lUprkttlxVokzcLu31TOtP82HO4ECYI1yY",[79,375,478,530,762,947,998,1089],{"id":80,"title":18,"author":81,"body":86,"date":370,"description":371,"extension":59,"image":85,"meta":372,"minRead":165,"navigation":64,"path":19,"seo":373,"stem":20,"__hash__":374},"blog\u002Fblog\u002Fhow-to-install-odoo-18-community-edition-on-ubuntu-server.md",{"name":82,"to":83,"avatar":84},"Koderstory","https:\u002F\u002Fdevlog.koderstory.com",{"src":85,"alt":82},"\u002Fimages\u002Fkoderstory-avatar.png",{"type":51,"value":87,"toc":364},[88,92,97,100,104,107,236,243,247,250,306,313,317,320,342,349,360],[89,90,91],"p",{},"Odoo is an open-source ERP suite used to manage business operations in one system. This guide outlines the original setup flow for Odoo 18 Community Edition on Ubuntu, from server preparation to the first startup.",[93,94,96],"h2",{"id":95},"prerequisites","Prerequisites",[89,98,99],{},"Start with a clean Ubuntu 22.04 or later server and root or sudo access. The original guide recommends at least 2 GB RAM (4 GB or more is preferable), a domain or static IP where needed, and basic familiarity with the Linux command line.",[93,101,103],{"id":102},"install-system-dependencies","Install system dependencies",[89,105,106],{},"Update package lists and install the tools, development libraries, and services needed by Odoo and its Python dependencies:",[108,109,113],"pre",{"className":110,"code":111,"language":112,"meta":54,"style":54},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","sudo apt update\nsudo apt install -y openssh-server fail2ban python3-pip python3-dev python3-venv \\\n  libxml2-dev libxslt1-dev zlib1g-dev libsasl2-dev libldap2-dev build-essential \\\n  libssl-dev libffi-dev libmysqlclient-dev libpq-dev libjpeg8-dev liblcms2-dev \\\n  libblas-dev libatlas-base-dev git curl fontconfig libxrender1 xfonts-75dpi xfonts-base\n","bash",[114,115,116,132,163,186,209],"code",{"__ignoreMap":54},[117,118,121,125,129],"span",{"class":119,"line":120},"line",1,[117,122,124],{"class":123},"sBMFI","sudo",[117,126,128],{"class":127},"sfazB"," apt",[117,130,131],{"class":127}," update\n",[117,133,134,136,138,141,144,147,150,153,156,159],{"class":119,"line":55},[117,135,124],{"class":123},[117,137,128],{"class":127},[117,139,140],{"class":127}," install",[117,142,143],{"class":127}," -y",[117,145,146],{"class":127}," openssh-server",[117,148,149],{"class":127}," fail2ban",[117,151,152],{"class":127}," python3-pip",[117,154,155],{"class":127}," python3-dev",[117,157,158],{"class":127}," python3-venv",[117,160,162],{"class":161},"sTEyZ"," \\\n",[117,164,166,169,172,175,178,181,184],{"class":119,"line":165},3,[117,167,168],{"class":127},"  libxml2-dev",[117,170,171],{"class":127}," libxslt1-dev",[117,173,174],{"class":127}," zlib1g-dev",[117,176,177],{"class":127}," libsasl2-dev",[117,179,180],{"class":127}," libldap2-dev",[117,182,183],{"class":127}," build-essential",[117,185,162],{"class":161},[117,187,189,192,195,198,201,204,207],{"class":119,"line":188},4,[117,190,191],{"class":127},"  libssl-dev",[117,193,194],{"class":127}," libffi-dev",[117,196,197],{"class":127}," libmysqlclient-dev",[117,199,200],{"class":127}," libpq-dev",[117,202,203],{"class":127}," libjpeg8-dev",[117,205,206],{"class":127}," liblcms2-dev",[117,208,162],{"class":161},[117,210,212,215,218,221,224,227,230,233],{"class":119,"line":211},5,[117,213,214],{"class":127},"  libblas-dev",[117,216,217],{"class":127}," libatlas-base-dev",[117,219,220],{"class":127}," git",[117,222,223],{"class":127}," curl",[117,225,226],{"class":127}," fontconfig",[117,228,229],{"class":127}," libxrender1",[117,231,232],{"class":127}," xfonts-75dpi",[117,234,235],{"class":127}," xfonts-base\n",[89,237,238,239,242],{},"The source guide also documents installing OpenSSL 1.1 for environments that need it, and installing a matching ",[114,240,241],{},"wkhtmltopdf"," package for PDF reports. Check compatibility with the Ubuntu release and Odoo deployment before installing older system packages.",[93,244,246],{"id":245},"get-odoo-and-its-python-requirements","Get Odoo and its Python requirements",[89,248,249],{},"Clone the Community 18.0 branch and install the listed Python requirements in the environment you intend to run Odoo with:",[108,251,253],{"className":110,"code":252,"language":112,"meta":54,"style":54},"git clone -b 18.0 --single-branch --depth 1 https:\u002F\u002Fgithub.com\u002Fodoo\u002Fodoo.git odoo_ce\ncd odoo_ce\npip3 install -r requirements.txt\n",[114,254,255,285,293],{"__ignoreMap":54},[117,256,257,260,263,266,270,273,276,279,282],{"class":119,"line":120},[117,258,259],{"class":123},"git",[117,261,262],{"class":127}," clone",[117,264,265],{"class":127}," -b",[117,267,269],{"class":268},"sbssI"," 18.0",[117,271,272],{"class":127}," --single-branch",[117,274,275],{"class":127}," --depth",[117,277,278],{"class":268}," 1",[117,280,281],{"class":127}," https:\u002F\u002Fgithub.com\u002Fodoo\u002Fodoo.git",[117,283,284],{"class":127}," odoo_ce\n",[117,286,287,291],{"class":119,"line":55},[117,288,290],{"class":289},"s2Zo4","cd",[117,292,284],{"class":127},[117,294,295,298,300,303],{"class":119,"line":165},[117,296,297],{"class":123},"pip3",[117,299,140],{"class":127},[117,301,302],{"class":127}," -r",[117,304,305],{"class":127}," requirements.txt\n",[89,307,308,309,312],{},"Odoo can generate an initial configuration file with ",[114,310,311],{},"odoo-bin --save --config \u002Fetc\u002Fodoo\u002Fodoo.conf --stop-after-init",". Configure PostgreSQL with a dedicated user and database, and restrict remote database access to the hosts that need it.",[93,314,316],{"id":315},"start-the-server","Start the server",[89,318,319],{},"Run Odoo with the configuration file and install the base web modules:",[108,321,323],{"className":110,"code":322,"language":112,"meta":54,"style":54},"\u002Fsrv\u002Fodoo_ce\u002Fodoo-bin -c \u002Fetc\u002Fodoo\u002Fodoo.conf -i base,web\n",[114,324,325],{"__ignoreMap":54},[117,326,327,330,333,336,339],{"class":119,"line":120},[117,328,329],{"class":123},"\u002Fsrv\u002Fodoo_ce\u002Fodoo-bin",[117,331,332],{"class":127}," -c",[117,334,335],{"class":127}," \u002Fetc\u002Fodoo\u002Fodoo.conf",[117,337,338],{"class":127}," -i",[117,340,341],{"class":127}," base,web\n",[89,343,344,345,348],{},"The default web port is 8069. Visit ",[114,346,347],{},"http:\u002F\u002F\u003Cyour-server-ip>:8069"," to complete the initial setup. For a production deployment, configure service management, firewall rules, and HTTPS before exposing the instance publicly.",[89,350,351,352,359],{},"Originally published on ",[353,354,358],"a",{"href":355,"rel":356},"https:\u002F\u002Fdevlog.koderstory.com\u002Fhow-to-install-odoo-18-community-edition-on-ubuntu-server",[357],"nofollow","Koderstory Devlog",".",[361,362,363],"style",{},"html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}",{"title":54,"searchDepth":55,"depth":55,"links":365},[366,367,368,369],{"id":95,"depth":55,"text":96},{"id":102,"depth":55,"text":103},{"id":245,"depth":55,"text":246},{"id":315,"depth":55,"text":316},"2025-05-01","A practical walkthrough for preparing Ubuntu, installing Odoo 18 Community dependencies, configuring PostgreSQL, and starting the server.",{},{"title":18,"description":371},"4DAdrTrN7O3lMOYuj4sfYG2aeSD102cykZGBsTBz_I4",{"id":376,"title":26,"author":377,"body":379,"date":472,"description":473,"extension":59,"image":85,"meta":474,"minRead":475,"navigation":64,"path":27,"seo":476,"stem":28,"__hash__":477},"blog\u002Fblog\u002Flaunch-your-odoo-mvp-in-weeks-with-moscow-prioritization.md",{"name":82,"to":83,"avatar":378},{"src":85,"alt":82},{"type":51,"value":380,"toc":461},[381,384,402,406,409,413,417,420,423,426,429,432,435,438,442,445,448,452,455],[89,382,383],{},"What if you could bring an Odoo ERP system online in just a few weeks—without drowning a small team in customizations, endless approvals, or scope debates?",[89,385,386,387,391,392,391,395,398,399,359],{},"When time is short and the business needs impact now, the key is deciding what belongs in the first release. MoSCoW prioritization gives the team a shared way to make that decision. The name groups requirements into ",[388,389,390],"strong",{},"Must have",", ",[388,393,394],{},"Should have",[388,396,397],{},"Could have",", and ",[388,400,401],{},"Won't have for now",[93,403,405],{"id":404},"start-with-the-business-outcome","Start with the business outcome",[89,407,408],{},"Before making a feature list, agree on the problem the MVP must solve. A useful first release might need to record customer orders, keep stock accurate, and give the team a reliable view of what needs to be delivered. Define the outcome in terms the people using the system recognize.",[93,410,412],{"id":411},"sort-requirements-with-moscow","Sort requirements with MoSCoW",[414,415,390],"h3",{"id":416},"must-have",[89,418,419],{},"These are the minimum capabilities required for the core workflow to function. If a must-have is missing, the MVP cannot deliver its agreed business outcome. Keep this list small and test each item against a real process.",[414,421,394],{"id":422},"should-have",[89,424,425],{},"Important capabilities that add clear value, but can be deferred briefly without stopping the business from operating. These are strong candidates for the next iteration once the first workflow is in use.",[414,427,397],{"id":428},"could-have",[89,430,431],{},"Useful improvements that make the experience better when time and budget allow. Treat them as optional so they do not quietly expand the first release.",[414,433,401],{"id":434},"wont-have-for-now",[89,436,437],{},"Features intentionally excluded from this launch. Recording them prevents repeated scope discussions and gives the team a place to revisit ideas later.",[93,439,441],{"id":440},"keep-the-first-release-focused","Keep the first release focused",[89,443,444],{},"Review the categories with the people who own and use the process. Ask what happens if each item is delayed. If the answer is that the core workflow still works, it probably does not belong in “Must have.” Make dependencies visible, since a seemingly small feature can depend on data, permissions, or integrations that take longer to prepare.",[89,446,447],{},"Build and validate the essential workflow first. Put real transactions through it, gather feedback from the people doing the work, and use what you learn to order the next release. This reduces the risk of spending weeks customizing features that users do not need yet.",[93,449,451],{"id":450},"a-better-path-to-an-odoo-mvp","A better path to an Odoo MVP",[89,453,454],{},"MoSCoW does not mean settling for a poor system. It means agreeing on a useful first step, launching it sooner, and improving it with evidence from day-to-day use. A focused Odoo MVP lets a small team start benefiting from connected operations while keeping later improvements visible and manageable.",[89,456,351,457,359],{},[353,458,358],{"href":459,"rel":460},"https:\u002F\u002Fdevlog.koderstory.com\u002Flaunch-your-odoo-mvp-in-weeks-with-moscow-prioritization",[357],{"title":54,"searchDepth":55,"depth":55,"links":462},[463,464,470,471],{"id":404,"depth":55,"text":405},{"id":411,"depth":55,"text":412,"children":465},[466,467,468,469],{"id":416,"depth":165,"text":390},{"id":422,"depth":165,"text":394},{"id":428,"depth":165,"text":397},{"id":434,"depth":165,"text":401},{"id":440,"depth":55,"text":441},{"id":450,"depth":55,"text":451},"2025-04-24","A practical way to launch an Odoo ERP MVP quickly by focusing the team on the features that matter most.",{},6,{"title":26,"description":473},"Y29qNZc6PLXe29gbGw6o8fLF3F_iMR1jNTYuXaEqvGA",{"id":479,"title":14,"author":480,"body":482,"date":525,"description":526,"extension":59,"image":85,"meta":527,"minRead":165,"navigation":64,"path":15,"seo":528,"stem":16,"__hash__":529},"blog\u002Fblog\u002Ffrom-sales-to-production-the-story-of-a-connected-manufacturing-workflow-in-odoo.md",{"name":82,"to":83,"avatar":481},{"src":85,"alt":82},{"type":51,"value":483,"toc":520},[484,487,490,494,497,501,504,508,511,514],[89,485,486],{},"Imagine a customer calls your sales team to order something your business manufactures. Do you have enough stock? If not, how quickly can you make it? Are the materials ready?",[89,488,489],{},"This is where many businesses stumble. Sales talks to Inventory. Inventory asks Purchasing. Manufacturing waits for the green light. Delays happen, emails are missed, and deadlines slip. In Odoo, these activities can be connected as one workflow.",[93,491,493],{"id":492},"it-starts-with-the-customer-request","It starts with the customer request",[89,495,496],{},"Sales sends a quotation and the customer confirms the order. Odoo checks whether the product is available, whether it is made to order, and whether production is needed. The sales order signals what must move, what must be made, and when it needs to be delivered.",[93,498,500],{"id":499},"inventory-coordinates-the-work","Inventory coordinates the work",[89,502,503],{},"Inventory checks whether the finished product is ready and whether raw materials are available. If something is missing, procurement rules can trigger the next action rather than relying on a manual stock check. Inventory acts as the connection between demand, purchasing, and production.",[93,505,507],{"id":506},"purchasing-and-manufacturing-respond","Purchasing and manufacturing respond",[89,509,510],{},"When materials are low, reordering rules and procurement strategies can notify Purchasing. Purchase orders go to suppliers, and incoming materials become available for production. The Manufacturing Order can then be prepared and its work orders scheduled. Materials move from Inventory into production; finished goods return to stock ready to fulfill the sales order.",[89,512,513],{},"Each part is connected rather than isolated: Sales drives demand, Inventory balances stock, Purchasing supplies materials, and Manufacturing produces what is needed. A connected workflow keeps teams aligned and makes it easier to focus on quality and delivery instead of chasing updates across spreadsheets and email.",[89,515,351,516,359],{},[353,517,358],{"href":518,"rel":519},"https:\u002F\u002Fdevlog.koderstory.com\u002Ffrom-sales-to-production-the-story-of-a-connected-manufacturing-workflow-in-odoo",[357],{"title":54,"searchDepth":55,"depth":55,"links":521},[522,523,524],{"id":492,"depth":55,"text":493},{"id":499,"depth":55,"text":500},{"id":506,"depth":55,"text":507},"2025-04-23","How Odoo connects a customer order with inventory, purchasing, and manufacturing so teams can deliver without chasing updates.",{},{"title":14,"description":526},"NwxY2C9NuGPGRXAFDfAefkJ-l-AazmKK_JFYhP_r8G4",{"id":531,"title":10,"author":532,"body":534,"date":757,"description":758,"extension":59,"image":85,"meta":759,"minRead":165,"navigation":64,"path":11,"seo":760,"stem":12,"__hash__":761},"blog\u002Fblog\u002Fclean-fix-for-the-model-not-in-registry-error-in-odoo-addons.md",{"name":82,"to":83,"avatar":533},{"src":85,"alt":82},{"type":51,"value":535,"toc":753},[536,547,555,558,562,580,583,610,613,620,685,689,692,738,744,750],[89,537,538,539,542,543,546],{},"You build a custom module that extends ",[114,540,541],{},"product.category"," or ",[114,544,545],{},"product.template",", add the Product module as a dependency, and then Odoo stops with an error like:",[108,548,553],{"className":549,"code":551,"language":552,"meta":54},[550],"language-text","TypeError: Model 'product.template' does not exist in registry.\n","text",[114,554,551],{"__ignoreMap":54},[89,556,557],{},"The Product app may appear installed, but Odoo still has to find and load its source code before it can register those models.",[93,559,561],{"id":560},"check-the-common-causes","Check the common causes",[89,563,564,565,568,569,572,573,576,577,359],{},"First, inspect ",[114,566,567],{},"addons_path"," in ",[114,570,571],{},"odoo.conf",". If the Community addons directory is missing or ordered incorrectly, Odoo may not load core modules such as ",[114,574,575],{},"product",". Confirm the expected module exists on disk, for example at ",[114,578,579],{},"\u002Fsrv\u002Fodoo_ce\u002Faddons\u002Fproduct",[89,581,582],{},"Next, check the custom module manifest. A module that inherits Product models should declare the dependency:",[108,584,588],{"className":585,"code":586,"language":587,"meta":54,"style":54},"language-python shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","'depends': [\n    'base',\n    'product',\n],\n","python",[114,589,590,595,600,605],{"__ignoreMap":54},[117,591,592],{"class":119,"line":120},[117,593,594],{},"'depends': [\n",[117,596,597],{"class":119,"line":55},[117,598,599],{},"    'base',\n",[117,601,602],{"class":119,"line":165},[117,603,604],{},"    'product',\n",[117,606,607],{"class":119,"line":188},[117,608,609],{},"],\n",[89,611,612],{},"Dependencies tell Odoo which modules must load first. They cannot compensate for an addon folder that Odoo cannot find.",[89,614,615,616,619],{},"Stale ",[114,617,618],{},".pyc"," files from an older build can also make a development or deployment environment behave unexpectedly. Clear compiled files in the affected custom addon directory when you have confirmed they are safe to regenerate:",[108,621,623],{"className":110,"code":622,"language":112,"meta":54,"style":54},"find \u002Fsrv\u002Ferp\u002Fodoo_addons -name '*.pyc' -delete\nfind \u002Fsrv\u002Ferp\u002Fodoo_addons -type d -name '__pycache__' -exec rm -rf {} +\n",[114,624,625,649],{"__ignoreMap":54},[117,626,627,630,633,636,640,643,646],{"class":119,"line":120},[117,628,629],{"class":123},"find",[117,631,632],{"class":127}," \u002Fsrv\u002Ferp\u002Fodoo_addons",[117,634,635],{"class":127}," -name",[117,637,639],{"class":638},"sMK4o"," '",[117,641,642],{"class":127},"*.pyc",[117,644,645],{"class":638},"'",[117,647,648],{"class":127}," -delete\n",[117,650,651,653,655,658,661,663,665,668,670,673,676,679,682],{"class":119,"line":55},[117,652,629],{"class":123},[117,654,632],{"class":127},[117,656,657],{"class":127}," -type",[117,659,660],{"class":127}," d",[117,662,635],{"class":127},[117,664,639],{"class":638},[117,666,667],{"class":127},"__pycache__",[117,669,645],{"class":638},[117,671,672],{"class":127}," -exec",[117,674,675],{"class":127}," rm",[117,677,678],{"class":127}," -rf",[117,680,681],{"class":127}," {}",[117,683,684],{"class":127}," +\n",[93,686,688],{"id":687},"load-modules-in-the-right-order","Load modules in the right order",[89,690,691],{},"Make sure the core addons path comes before optional Enterprise and custom addon paths. Then restart Odoo and update the dependency and your custom module together:",[108,693,695],{"className":110,"code":694,"language":112,"meta":54,"style":54},"\u002Fsrv\u002Fodoo_ce\u002Fodoo-bin \\\n  -c \u002Fsrv\u002Ferp\u002Fodoo.conf \\\n  -d erp \\\n  -u product,mycustom_categorycode \\\n  --stop-after-init\n",[114,696,697,703,713,723,733],{"__ignoreMap":54},[117,698,699,701],{"class":119,"line":120},[117,700,329],{"class":123},[117,702,162],{"class":161},[117,704,705,708,711],{"class":119,"line":55},[117,706,707],{"class":127},"  -c",[117,709,710],{"class":127}," \u002Fsrv\u002Ferp\u002Fodoo.conf",[117,712,162],{"class":161},[117,714,715,718,721],{"class":119,"line":165},[117,716,717],{"class":127},"  -d",[117,719,720],{"class":127}," erp",[117,722,162],{"class":161},[117,724,725,728,731],{"class":119,"line":188},[117,726,727],{"class":127},"  -u",[117,729,730],{"class":127}," product,mycustom_categorycode",[117,732,162],{"class":161},[117,734,735],{"class":119,"line":211},[117,736,737],{"class":127},"  --stop-after-init\n",[89,739,740,741,743],{},"Review the startup logs to confirm ",[114,742,575],{}," loads before the custom addon. With the path, manifest dependency, and module order aligned, Odoo can register the inherited models before initializing your code.",[89,745,351,746,359],{},[353,747,358],{"href":748,"rel":749},"https:\u002F\u002Fdevlog.koderstory.com\u002Fclean-fix-for-the-model-not-in-registry-error-in-odoo-addons",[357],[361,751,752],{},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}",{"title":54,"searchDepth":55,"depth":55,"links":754},[755,756],{"id":560,"depth":55,"text":561},{"id":687,"depth":55,"text":688},"2025-04-22","Troubleshoot missing Odoo models by checking addon paths, dependencies, cached Python files, and module loading order.",{},{"title":10,"description":758},"VyjRGcmQxRfPvLfgzv4skOIYGm9Bgr1uj070rpbyw5c",{"id":763,"title":30,"author":764,"body":766,"date":942,"description":943,"extension":59,"image":85,"meta":944,"minRead":188,"navigation":64,"path":31,"seo":945,"stem":32,"__hash__":946},"blog\u002Fblog\u002Fmanaging-users-and-groups-on-linux-a-practical-guide.md",{"name":82,"to":83,"avatar":765},{"src":85,"alt":82},{"type":51,"value":767,"toc":937},[768,771,775,788,799,803,806,861,872,876,886,925,928,934],[89,769,770],{},"Security often starts with something as simple as managing users and groups. On Linux, these controls help organize collaboration and strengthen multi-user environments such as ERP platforms.",[93,772,774],{"id":773},"user-management","User management",[89,776,777,780,781,784,785,359],{},[114,778,779],{},"sudo useradd testuser"," creates a user with the lower-level account tool. It does not create a home directory or set a password by default. For an interactive setup that creates a home directory and prompts for user details, use ",[114,782,783],{},"sudo adduser testuser",". Set a password with ",[114,786,787],{},"sudo passwd testuser",[89,789,790,791,794,795,798],{},"To remove an account while keeping its files, use ",[114,792,793],{},"sudo userdel testuser",". When the account and its home directory should both be removed, ",[114,796,797],{},"sudo deluser --remove-home testuser"," is the more complete cleanup command. Confirm the account and data are no longer needed before removing them.",[93,800,802],{"id":801},"group-management","Group management",[89,804,805],{},"Groups make it easier to grant shared access without changing permissions for each person individually:",[108,807,809],{"className":110,"code":808,"language":112,"meta":54,"style":54},"sudo groupadd devgroup\nsudo usermod -aG devgroup testuser\nsudo gpasswd -d testuser devgroup\nsudo groupdel devgroup\n",[114,810,811,821,837,852],{"__ignoreMap":54},[117,812,813,815,818],{"class":119,"line":120},[117,814,124],{"class":123},[117,816,817],{"class":127}," groupadd",[117,819,820],{"class":127}," devgroup\n",[117,822,823,825,828,831,834],{"class":119,"line":55},[117,824,124],{"class":123},[117,826,827],{"class":127}," usermod",[117,829,830],{"class":127}," -aG",[117,832,833],{"class":127}," devgroup",[117,835,836],{"class":127}," testuser\n",[117,838,839,841,844,847,850],{"class":119,"line":165},[117,840,124],{"class":123},[117,842,843],{"class":127}," gpasswd",[117,845,846],{"class":127}," -d",[117,848,849],{"class":127}," testuser",[117,851,820],{"class":127},[117,853,854,856,859],{"class":119,"line":188},[117,855,124],{"class":123},[117,857,858],{"class":127}," groupdel",[117,860,820],{"class":127},[89,862,863,864,867,868,871],{},"The commands create a group, add a user, remove a user, and delete the group. The ",[114,865,866],{},"-a"," option in ",[114,869,870],{},"usermod -aG"," appends the group while preserving the user's existing supplementary groups.",[93,873,875],{"id":874},"use-groups-to-limit-access","Use groups to limit access",[89,877,878,879,568,882,885],{},"To limit SSH access to approved users, configure ",[114,880,881],{},"AllowGroups",[114,883,884],{},"\u002Fetc\u002Fssh\u002Fsshd_config",", then add authorized accounts to that group. For a shared team directory, assign the directory to a group and set permissions so only group members can use it:",[108,887,889],{"className":110,"code":888,"language":112,"meta":54,"style":54},"sudo mkdir \u002Fsrv\u002Fproject\nsudo chown :devgroup \u002Fsrv\u002Fproject\nsudo chmod 2770 \u002Fsrv\u002Fproject\n",[114,890,891,901,913],{"__ignoreMap":54},[117,892,893,895,898],{"class":119,"line":120},[117,894,124],{"class":123},[117,896,897],{"class":127}," mkdir",[117,899,900],{"class":127}," \u002Fsrv\u002Fproject\n",[117,902,903,905,908,911],{"class":119,"line":55},[117,904,124],{"class":123},[117,906,907],{"class":127}," chown",[117,909,910],{"class":127}," :devgroup",[117,912,900],{"class":127},[117,914,915,917,920,923],{"class":119,"line":165},[117,916,124],{"class":123},[117,918,919],{"class":127}," chmod",[117,921,922],{"class":268}," 2770",[117,924,900],{"class":127},[89,926,927],{},"On a multi-tenant server, a separate group and directory for each tenant can keep files isolated. Services such as PostgreSQL and NGINX should also run under dedicated, limited accounts. These practices support least privilege, clearer ownership, and safer operations as teams and systems grow.",[89,929,351,930,359],{},[353,931,358],{"href":932,"rel":933},"https:\u002F\u002Fdevlog.koderstory.com\u002Fmanaging-users-and-groups-on-linux-a-practical-guide",[357],[361,935,936],{},"html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}",{"title":54,"searchDepth":55,"depth":55,"links":938},[939,940,941],{"id":773,"depth":55,"text":774},{"id":801,"depth":55,"text":802},{"id":874,"depth":55,"text":875},"2025-04-21","Practical Linux user and group commands for access control, team collaboration, and service isolation.",{},{"title":30,"description":943},"ePTxTbKUGvXm7PxNB1kZ63nDG4de9dQWsrr1C-jLaS4",{"id":948,"title":38,"author":949,"body":951,"date":942,"description":994,"extension":59,"image":85,"meta":995,"minRead":188,"navigation":64,"path":39,"seo":996,"stem":40,"__hash__":997},"blog\u002Fblog\u002Fwhat-is-a-bom-and-how-does-it-affect-product-costs.md",{"name":82,"to":83,"avatar":950},{"src":85,"alt":82},{"type":51,"value":952,"toc":989},[953,956,960,963,966,970,973,976,980,983],[89,954,955],{},"A Bill of Materials (BoM) is the recipe for a product. It lists the components and quantities needed to make it. In Odoo, a BoM connects product definition with manufacturing, inventory, and cost visibility.",[93,957,959],{"id":958},"what-a-bom-contains","What a BoM contains",[89,961,962],{},"A BoM identifies the product being made and the components required to produce it. A simple BoM lists direct components. A multi-level structure can include subassemblies, each with its own components. For example, a manufactured item might need two subassemblies and several raw materials.",[89,964,965],{},"The quantities matter: Odoo uses them to determine the materials needed for a Manufacturing Order. When demand changes, the component requirements can be planned from the same product structure instead of being recalculated by hand.",[93,967,969],{"id":968},"how-it-affects-product-costs","How it affects product costs",[89,971,972],{},"The cost of components contributes to the manufacturing cost of the finished product. If a product uses several materials, the quantities in the BoM determine how much of each component is consumed. Operations and work centers can also contribute labor or operation costs when configured. This makes accurate BoM data important for understanding what it takes to produce an item.",[89,974,975],{},"When component costs or quantities change, the resulting product cost can change too. A BoM therefore supports more than production instructions: it provides a basis for cost analysis, purchasing decisions, and pricing conversations. It is still important to verify which costing method and cost settings are active for the products and company.",[93,977,979],{"id":978},"keep-the-structure-useful","Keep the structure useful",[89,981,982],{},"Use a BoM that reflects how the product is actually made. Maintain component quantities, units of measure, and subassemblies carefully, and review changes when materials or processes change. A well-maintained BoM helps align production, inventory, and costing around the same definition of the product.",[89,984,351,985,359],{},[353,986,358],{"href":987,"rel":988},"https:\u002F\u002Fdevlog.koderstory.com\u002Fwhat-is-a-bom-and-how-does-it-affect-product-costs",[357],{"title":54,"searchDepth":55,"depth":55,"links":990},[991,992,993],{"id":958,"depth":55,"text":959},{"id":968,"depth":55,"text":969},{"id":978,"depth":55,"text":979},"Understand how an Odoo Bill of Materials describes product components and helps calculate manufacturing costs.",{},{"title":38,"description":994},"w7LDBBOe9zzXkwz2KmNYRSfsRsIFiLh0-L796dgdmqg",{"id":999,"title":22,"author":1000,"body":1002,"date":1084,"description":1085,"extension":59,"image":85,"meta":1086,"minRead":55,"navigation":64,"path":23,"seo":1087,"stem":24,"__hash__":1088},"blog\u002Fblog\u002Fhow-to-properly-backup-your-odoo-instance-database-filestore.md",{"name":82,"to":83,"avatar":1001},{"src":85,"alt":82},{"type":51,"value":1003,"toc":1079},[1004,1007,1011,1014,1018,1025,1043,1047,1058,1061,1067,1070,1076],[89,1005,1006],{},"Regular backups help protect an Odoo system from data loss, corruption, and accidental deletion. A complete backup needs both the PostgreSQL database and the filestore where Odoo keeps attachments and assets.",[93,1008,1010],{"id":1009},"what-needs-to-be-backed-up","What needs to be backed up?",[89,1012,1013],{},"The PostgreSQL database contains structured information such as records, module data, settings, products, and transactions. The filestore contains binary files, including document attachments, images, reports, and files uploaded by users. Restoring only the database can leave broken links or missing attachments.",[93,1015,1017],{"id":1016},"back-up-the-database","Back up the database",[89,1019,1020,1021,1024],{},"Use ",[114,1022,1023],{},"pg_dump"," to export the database. Replace the example name with the database you actually use:",[108,1026,1028],{"className":110,"code":1027,"language":112,"meta":54,"style":54},"pg_dump odoo_db_name > odoo_backup.sql\n",[114,1029,1030],{"__ignoreMap":54},[117,1031,1032,1034,1037,1040],{"class":119,"line":120},[117,1033,1023],{"class":123},[117,1035,1036],{"class":127}," odoo_db_name",[117,1038,1039],{"class":638}," >",[117,1041,1042],{"class":127}," odoo_backup.sql\n",[93,1044,1046],{"id":1045},"back-up-the-filestore","Back up the filestore",[89,1048,1049,1050,1053,1054,1057],{},"The filestore is commonly found at ",[114,1051,1052],{},"~\u002F.local\u002Fshare\u002FOdoo\u002Ffilestore\u002F\u003Cdatabase-name>"," or, for a service installation, at ",[114,1055,1056],{},"\u002Fvar\u002Flib\u002Fodoo\u002F.local\u002Fshare\u002FOdoo\u002Ffilestore\u002F\u003Cdatabase-name>",". Copy the entire database-specific directory and store it alongside the SQL backup.",[89,1059,1060],{},"A dated folder makes the matching pieces clear:",[108,1062,1065],{"className":1063,"code":1064,"language":552,"meta":54},[550],"\u002Fbackups\u002F\n└── 2025-04-20\u002F\n    ├── odoo_backup.sql\n    └── filestore\u002F\n",[114,1066,1064],{"__ignoreMap":54},[89,1068,1069],{},"For active systems, daily backups are a useful starting point. Automate the process where possible, and periodically restore a backup on a staging server. A backup is only dependable when both parts are present and the restore has been tested.",[89,1071,351,1072,359],{},[353,1073,358],{"href":1074,"rel":1075},"https:\u002F\u002Fdevlog.koderstory.com\u002Fhow-to-properly-backup-your-odoo-instance-database-filestore",[357],[361,1077,1078],{},"html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":54,"searchDepth":55,"depth":55,"links":1080},[1081,1082,1083],{"id":1009,"depth":55,"text":1010},{"id":1016,"depth":55,"text":1017},{"id":1045,"depth":55,"text":1046},"2025-04-20","Back up both the PostgreSQL database and Odoo filestore to preserve business records and uploaded files.",{},{"title":22,"description":1085},"SrjXfmUYQfW9KW-j-XF2spMeZULI7aNKKa8MGckzsYs",{"id":1090,"title":34,"author":1091,"body":1093,"date":1084,"description":1169,"extension":59,"image":85,"meta":1170,"minRead":55,"navigation":64,"path":35,"seo":1171,"stem":36,"__hash__":1172},"blog\u002Fblog\u002Funderstanding-odoos-filestore-structure-whats-inside-and-why-it-matters.md",{"name":82,"to":83,"avatar":1092},{"src":85,"alt":82},{"type":51,"value":1094,"toc":1163},[1095,1102,1106,1109,1115,1121,1136,1139,1150,1154,1157],[89,1096,1097,1098,1101],{},"When exploring an Odoo installation, you may find a path like ",[114,1099,1100],{},"~\u002F.local\u002Fshare\u002FOdoo\u002Ffilestore\u002Fyourdatabase\u002Faa\u002Fac\u002F...",". The two-letter folders can look random, and a database name that resembles a domain can be confusing. Here is what they mean.",[93,1103,1105],{"id":1104},"what-is-the-filestore","What is the filestore?",[89,1107,1108],{},"Odoo keeps uploaded binary files—images, attachments, PDFs, and documents—outside the database in a dedicated filestore directory. This keeps large files separate from structured records. A typical location is:",[108,1110,1113],{"className":1111,"code":1112,"language":552,"meta":54},[550],"~\u002F.local\u002Fshare\u002FOdoo\u002Ffilestore\u002F\n",[114,1114,1112],{"__ignoreMap":54},[89,1116,1117,1118,359],{},"When Odoo runs as a service, the path may be under the service user's home, such as ",[114,1119,1120],{},"\u002Fvar\u002Flib\u002Fodoo\u002F.local\u002Fshare\u002FOdoo\u002Ffilestore\u002F",[93,1122,1124,1125,391,1128,1131,1132,1135],{"id":1123},"why-are-there-folders-named-aa-ac-or-dc","Why are there folders named ",[114,1126,1127],{},"aa",[114,1129,1130],{},"ac",", or ",[114,1133,1134],{},"dc","?",[89,1137,1138],{},"Odoo stores files using hashes and uses the beginning of a hash to place files into subdirectories. This avoids putting thousands of files in one directory and helps keep retrieval manageable as the filestore grows.",[89,1140,1141,1142,1145,1146,1149],{},"The directory immediately under ",[114,1143,1144],{},"filestore"," is the database name. A folder such as ",[114,1147,1148],{},"koderstory_com"," appears because the database was named that way; it is not derived automatically from the website domain.",[93,1151,1153],{"id":1152},"what-should-you-back-up","What should you back up?",[89,1155,1156],{},"Keep the PostgreSQL database backup and the complete matching filestore directory together. Preserving only the database can leave attachment references without their files. Preserve every hashed subdirectory, and test restores in a staging environment so missing files are found before an emergency.",[89,1158,351,1159,359],{},[353,1160,358],{"href":1161,"rel":1162},"https:\u002F\u002Fdevlog.koderstory.com\u002Funderstanding-odoos-filestore-structure-whats-inside-and-why-it-matters",[357],{"title":54,"searchDepth":55,"depth":55,"links":1164},[1165,1166,1168],{"id":1104,"depth":55,"text":1105},{"id":1123,"depth":55,"text":1167},"Why are there folders named aa, ac, or dc?",{"id":1152,"depth":55,"text":1153},"Learn where Odoo stores uploaded files, why the filestore uses hashed directories, and what to include in backups.",{},{"title":34,"description":1169},"ggKBd4c1hMwM7-OO4FE2C6uahEteeaCX4CHnOLB0s0s",1792253290470]