Public Access
feat(blog): publish "How to Install Odoo Modules Using Git"
New post at blog/posts/how-to-install-odoo-modules-using-git.html (2026-10-28, area "deep dive"), body pasted verbatim from the boss's supplied block (7 h2, two figures in place). Chrome copied from the newest post (odoo-community-is-going-online-on-odoo4projects.html: main.blog-post / span.badge / div.post-meta / img.post-image / div.post-body / a.back-link), style block trimmed to the rules this page uses plus the ol/figure/figcaption rules its body needs. Additive wiring: og:image + twitter:card, post-image after post-meta (alt = h1), BlogPosting JSON-LD with dateModified. blog/index.json gets the entry first (newest-first, key order id,date,area,headline,teaser,link,image) by text splice - 15 -> 16 posts; sitemap.xml one new 0.6 blog url - 35 -> 36 <loc>; llms.txt one new line at the top of the post list.
This commit is contained in:
1 parent
972453747b
commit
ea97e65416
4 files changed
+197
No files matched your search
@@ -1,5 +1,14 @@
|
|||||||
{
|
{
|
||||||
"posts": [
|
"posts": [
|
||||||
|
{
|
||||||
|
"id": "how-to-install-odoo-modules-using-git",
|
||||||
|
"date": "2026-10-28",
|
||||||
|
"area": "deep dive",
|
||||||
|
"headline": "How to Install Odoo Modules Using Git — and the Quick Git Route That Skips the Console",
|
||||||
|
"teaser": "Every business is slightly different, which is why a system that only does the standard thing is only ever half a system",
|
||||||
|
"link": "blog/posts/how-to-install-odoo-modules-using-git.html",
|
||||||
|
"image": "https://image.office.odoo4projects.com/img/screenshot_git.png"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"id": "odoo-community-is-going-online-on-odoo4projects",
|
"id": "odoo-community-is-going-online-on-odoo4projects",
|
||||||
"date": "2026-10-27",
|
"date": "2026-10-27",
|
||||||
|
|||||||
@@ -0,0 +1,181 @@
|
|||||||
|
<!doctype html>
|
||||||
|
<html lang="en-US">
|
||||||
|
<head>
|
||||||
|
<meta charset="utf-8" />
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
||||||
|
<title>How to Install Odoo Modules Using Git — and the Quick Git Route That Skips the Console | ODOO4projects</title>
|
||||||
|
<meta name="description" content="Every business is slightly different, which is why a system that only does the standard thing is only ever half a system. Odoo ships with a broad set of apps -" />
|
||||||
|
<link rel="canonical" href="https://odoo4projects.com/blog/posts/how-to-install-odoo-modules-using-git.html" />
|
||||||
|
<meta property="og:title" content="How to Install Odoo Modules Using Git — and the Quick Git Route That Skips the Console" />
|
||||||
|
<meta property="og:description" content="Every business is slightly different, which is why a system that only does the standard thing is only ever half a system. Odoo ships with a broad set of apps -" />
|
||||||
|
<meta property="og:type" content="article" />
|
||||||
|
<meta property="og:image" content="https://image.office.odoo4projects.com/img/screenshot_git.png" />
|
||||||
|
<meta name="twitter:card" content="summary_large_image" />
|
||||||
|
<link rel="icon" href="../../images/favicon.ico" />
|
||||||
|
<link rel="preconnect" href="https://fonts.googleapis.com" />
|
||||||
|
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
|
||||||
|
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800&family=Inter+Tight:wght@500;600;700;800&display=swap" rel="stylesheet" />
|
||||||
|
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.1/css/all.min.css" />
|
||||||
|
<link rel="stylesheet" href="../../style.css" />
|
||||||
|
<style>
|
||||||
|
body { background: #0d1b2e; }
|
||||||
|
.blog-post { max-width: 720px; margin: 0 auto; padding: 3rem 1.5rem 6rem; color: #171c26; background: #faf7f1; min-height: 100vh; }
|
||||||
|
.blog-post h1 { font-family: 'Marcellus', Georgia, serif; font-size: 2.4rem; font-weight: 400; margin: 0 0 0.5rem; color: #0d1b2e; }
|
||||||
|
.blog-post .post-meta { font-family: Inter, sans-serif; font-size: 0.82rem; color: rgba(23,28,38,0.6); margin-bottom: 2rem; }
|
||||||
|
.blog-post .post-meta .badge { display: inline-block; font-size: 0.68rem; font-weight: 600; letter-spacing: 0.15em; text-transform: uppercase; color: #c9a227; margin-right: 0.75rem; }
|
||||||
|
.blog-post .post-image { width: 100%; border-radius: 0.75rem; margin-bottom: 2rem; box-shadow: 0 2px 8px rgba(13,27,46,0.08); }
|
||||||
|
.blog-post p { font-family: Inter, sans-serif; font-size: 1rem; line-height: 1.7; margin-bottom: 1.2rem; }
|
||||||
|
.blog-post h2 { font-family: 'Marcellus', Georgia, serif; font-size: 1.6rem; font-weight: 400; margin: 2rem 0 0.75rem; color: #0d1b2e; }
|
||||||
|
.blog-post ul, .blog-post ol { font-family: Inter, sans-serif; font-size: 1rem; line-height: 1.7; margin-bottom: 1.2rem; padding-left: 1.5rem; }
|
||||||
|
.blog-post li { margin-bottom: 0.3rem; }
|
||||||
|
.blog-post a { color: #8a6f1f; text-decoration: underline; }
|
||||||
|
.blog-post strong { font-weight: 600; }
|
||||||
|
.blog-post figure { margin: 2rem 0; }
|
||||||
|
.blog-post figure img { width: 100%; border-radius: 0.75rem; box-shadow: 0 2px 8px rgba(13,27,46,0.08); }
|
||||||
|
.blog-post figcaption { font-family: Inter, sans-serif; font-size: 0.85rem; line-height: 1.6; color: rgba(23,28,38,0.6); margin-top: 0.6rem; }
|
||||||
|
.back-link { display: inline-block; margin-top: 2rem; font-family: 'Marcellus', Georgia, serif; font-size: 0.9rem; text-transform: uppercase; letter-spacing: 0.04em; color: #c9a227; text-decoration: none; }
|
||||||
|
.back-link:hover { text-decoration: underline; }
|
||||||
|
@media (max-width: 600px) { .blog-post h1 { font-size: 1.7rem; } .blog-post { padding: 2rem 1rem 4rem; } }
|
||||||
|
</style>
|
||||||
|
<script type="application/ld+json">
|
||||||
|
{
|
||||||
|
"@context": "https://schema.org",
|
||||||
|
"@type": "BlogPosting",
|
||||||
|
"headline": "How to Install Odoo Modules Using Git — and the Quick Git Route That Skips the Console",
|
||||||
|
"datePublished": "2026-10-28",
|
||||||
|
"dateModified": "2026-10-28",
|
||||||
|
"url": "https://odoo4projects.com/blog/posts/how-to-install-odoo-modules-using-git.html",
|
||||||
|
"image": "https://image.office.odoo4projects.com/img/screenshot_git.png",
|
||||||
|
"author": {
|
||||||
|
"@type": "Organization",
|
||||||
|
"name": "ODOO4projects",
|
||||||
|
"url": "https://odoo4projects.com/"
|
||||||
|
},
|
||||||
|
"publisher": {
|
||||||
|
"@type": "Organization",
|
||||||
|
"name": "ODOO4projects",
|
||||||
|
"url": "https://odoo4projects.com/",
|
||||||
|
"logo": {
|
||||||
|
"@type": "ImageObject",
|
||||||
|
"url": "https://odoo4projects.com/images/logo.png"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<main class="blog-post">
|
||||||
|
<span class="badge">deep dive</span>
|
||||||
|
<h1>How to Install Odoo Modules Using Git — and the Quick Git Route That Skips the Console</h1>
|
||||||
|
<div class="post-meta">October 28, 2026 · Deep Dive</div>
|
||||||
|
<img src="https://image.office.odoo4projects.com/img/screenshot_git.png" alt="How to Install Odoo Modules Using Git — and the Quick Git Route That Skips the Console" class="post-image" loading="lazy" />
|
||||||
|
<div class="post-body">
|
||||||
|
<p>Every business is slightly different, which is why a system that only does the standard thing is only ever half a system. Odoo ships with a broad set of apps - sales, invoicing, stock, purchasing, projects, website - and on top of that it lets you add <strong>modules</strong>: focused pieces of function that one business needed and someone wrote down properly. Installing a module is the moment your system stops being shipped defaults and starts being yours.</p>
|
||||||
|
|
||||||
|
<p>This is the long version of that operation: what a module actually is, where to find a good one, and the two routes into a live instance on our servers - <strong>Quick Git</strong> and <strong>Git</strong>. Read it once and the phrase "just install the module" stops being a mystery.</p>
|
||||||
|
|
||||||
|
<h2>1. What an app or a module is - and where to find one</h2>
|
||||||
|
|
||||||
|
<p>A module (the words "app" and "module" get used interchangeably, and nobody is being sloppy when they do) is a business capability that has been packaged so the system can pick it up. A stock reservation method, a localisation for your country's tax rules, a dashboard for one department - each of those is a module somewhere.</p>
|
||||||
|
|
||||||
|
<p>There are two places worth looking, and they are not equivalent:</p>
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<li><strong>apps.odoo.com</strong> - the official app store. Largest catalogue, most commercial publishers, and a mixture of quality that ranges from excellent to abandoned.</li>
|
||||||
|
<li><strong>apps.odoo-community.org</strong> - the Odoo Community Association's own index. Smaller, curated, and built by the people who write Odoo for a living.</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<p>Search on what the business needs to <em>do</em>, not on what you think the feature is called. "Reserve stock for a customer order" finds better things than "stock module" does.</p>
|
||||||
|
|
||||||
|
<h2>2. What you are actually downloading - quality, version, and a folder of files</h2>
|
||||||
|
|
||||||
|
<p><strong>A module is a folder of files.</strong> That is the whole secret. It holds a manifest that names it, Python and XML that describe what it does, and whatever assets it needs. Your instance reads that folder. There is no installer in the classic sense, no setup wizard that writes into the operating system - which is exactly why the two routes below are both, essentially, "get the folder in front of the server and tell the server to look again".</p>
|
||||||
|
|
||||||
|
<p>Two things decide whether a module is worth your time:</p>
|
||||||
|
|
||||||
|
<ol>
|
||||||
|
<li><strong>Provider quality.</strong> The app store marks modules and providers with quality indicators, and the reviews on the card are worth reading before the description. The best of the lot are the <strong>OCA modules</strong> - they are made with ❤️ by the community association, peer-reviewed, and maintained against new Odoo versions by people who have no incentive to sell you anything.</li>
|
||||||
|
<li><strong>Version match.</strong> A module is written for one Odoo version. It needs to match the version of <em>your</em> instance. A module built for a different version is not "probably fine" - it is the single most common reason a module misbehaves after installation, and no amount of restarting fixes it.</li>
|
||||||
|
</ol>
|
||||||
|
|
||||||
|
<p><strong>What you get when you download.</strong> Downloading a module gives you a <strong>zip file</strong>, and inside that zip you will often find several <strong>sub-modules, each in its own separate folder</strong>. That detail matters later: the system looks for modules at a certain depth, and a zip that has been unpacked one folder too deep is the second most common reason a module never appears.</p>
|
||||||
|
|
||||||
|
<p>Both routes below are described in detail, because they solve the same problem for two different kinds of user.</p>
|
||||||
|
|
||||||
|
<h2>3. Two ways to install: Git, or Quick Git</h2>
|
||||||
|
|
||||||
|
<p><strong>With Git</strong> you are the professional who wants the full workflow: your own repository per instance, your own keys, your own history, push and pull as you develop.</p>
|
||||||
|
|
||||||
|
<p><strong>With Quick Git</strong> you just want the thing working: you upload your zip file and our servers handle all the git work behind it. Same destination, far less to learn.</p>
|
||||||
|
|
||||||
|
<p>Pick by who you are. If you are going to develop against the instance, use Git. If you bought a module, got a zip, and want it live this afternoon, Quick Git is the shorter road.</p>
|
||||||
|
|
||||||
|
<h2>4. Upload the module: Quick Git</h2>
|
||||||
|
|
||||||
|
<p>Everything happens inside your Odoo, in the console we run for you:</p>
|
||||||
|
|
||||||
|
<ol>
|
||||||
|
<li>Go to <strong>settings -> 4server -> GIT/MCP</strong> in your ODOO.</li>
|
||||||
|
<li>Click on the button <strong>Import Module</strong> and select your ZIP file.</li>
|
||||||
|
<li>Confirm the upload.</li>
|
||||||
|
<li>After the upload is confirmed, <strong>restart the server</strong> - and then do the <strong>Update Module List</strong> dance (section 6). Both steps, in that order.</li>
|
||||||
|
</ol>
|
||||||
|
|
||||||
|
<figure>
|
||||||
|
<img src="https://image.office.odoo4projects.com/img/screenshot_quick_git.png" alt="Settings -> 4server -> GIT/MCP, with the Import Module dialog open: choose the Module .ZIP file, then click Import.">
|
||||||
|
<figcaption>Quick Git: Settings → 4server → GIT/MCP, then <strong>Import Module</strong> and pick your ZIP.</figcaption>
|
||||||
|
</figure>
|
||||||
|
|
||||||
|
<p>That is the whole procedure. The server unpacks the zip, puts the sub-modules where they belong, and commits them so the change is part of the instance's history rather than a loose file sitting on a disk somewhere.</p>
|
||||||
|
|
||||||
|
<h2>5. Upload the module: Git</h2>
|
||||||
|
|
||||||
|
<p>For professionals we use Git. Every ODOO instance on our server has its own git repository - one instance, one repo - so your customisations are versioned, reviewable, and portable rather than living in a folder nobody remembers creating.</p>
|
||||||
|
|
||||||
|
<p>Setting it up, in order:</p>
|
||||||
|
|
||||||
|
<ol>
|
||||||
|
<li><strong>Create an SSH key.</strong> On your console, create one if you do not already have one:</li>
|
||||||
|
</ol>
|
||||||
|
|
||||||
|
<p><code>ssh-keygen</code></p>
|
||||||
|
|
||||||
|
<ol start="2">
|
||||||
|
<li><strong>Copy the PUBLIC part of that key</strong> - the public part, never the private one - into your ODOO instance, in the field labelled <strong>SSH Public Key</strong>.</li>
|
||||||
|
<li><strong>Pro tip:</strong> you can add several keys, so you can develop with your team. One key per person, added the same way.</li>
|
||||||
|
<li><strong>Reboot the server to activate the key.</strong> The key does not count until the reboot has happened.</li>
|
||||||
|
<li><strong>Clone the repository to your PC.</strong> Use the clone URL and paste it into your command line, so the git repository gets cloned on your machine.</li>
|
||||||
|
<li><strong>Add your modules and push.</strong> You can install all your custom modules into the <code>custom/</code> folder and push it. Done.</li>
|
||||||
|
</ol>
|
||||||
|
|
||||||
|
<figure>
|
||||||
|
<img src="https://image.office.odoo4projects.com/img/screenshot_git.png" alt="The GIT/MCP tab: Clone URL, Git Pull and Import Module buttons, the SSH public key field with a pasted ssh-ed25519 key, and the warning that key changes take effect after you save and restart the server.">
|
||||||
|
<figcaption>The Git route: your <strong>Clone URL</strong>, the <strong>SSH public key</strong> field, and the reminder that a key change needs a save and a restart.</figcaption>
|
||||||
|
</figure>
|
||||||
|
|
||||||
|
<p>From then on, a module in the repository is a module on the server: push, restart, update the module list, and the new function is there.</p>
|
||||||
|
|
||||||
|
<h2>6. Troubleshooting, and the Update Module List dance</h2>
|
||||||
|
|
||||||
|
<p>When a new module is installed, you need to tell ODOO there is something new. It does not go looking by itself. This is the step people skip, and it is the reason a perfectly installed module "does not work".</p>
|
||||||
|
|
||||||
|
<ol>
|
||||||
|
<li>Go to <strong>Settings</strong>, scroll all the way down, and click on <strong>Activate Developer Mode</strong>.</li>
|
||||||
|
<li>Go to <strong>Apps</strong> and click on the new menu item <strong>Update APP List</strong>.</li>
|
||||||
|
<li>Your new modules should be visible - perhaps you need to delete the filter <strong>APPS</strong> by clicking on the X.</li>
|
||||||
|
</ol>
|
||||||
|
|
||||||
|
<p>That last line is the trap. The Apps screen comes with a filter applied, so a module that is installed, matched to the right version, and sitting exactly where it should be can still be invisible - hidden by a filter, not by a problem. Remove the filter and look again before you conclude anything is wrong.</p>
|
||||||
|
|
||||||
|
<p>If a module is still not there after you have restarted the server <em>and</em> updated the app list: check the version match first, then check whether the zip unpacked into a folder inside a folder. Those two account for most cases, and both are fixed by getting the folder to the right depth - by uploading the zip again through Quick Git, or by pushing the correctly nested folder through Git.</p>
|
||||||
|
|
||||||
|
<h2>7. What this means for the person who owns the business</h2>
|
||||||
|
|
||||||
|
<p>You do not have to enjoy any of this. The point of running your system as a service is that the boring half - the repository, the keys, the restart, the version match - is somebody else's job. Add a capability when the business needs it, not when a project plan says so: a module goes in, the menu item appears, and your team uses it the same day.</p>
|
||||||
|
|
||||||
|
<p>If a console is not where you want to spend your afternoon, that is not a gap in your abilities. It is a job that should never have been yours in the first place.</p>
|
||||||
|
</div>
|
||||||
|
<a href="../../index.html#blog" class="back-link">← Back to the Blog</a>
|
||||||
|
</main>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
@@ -43,6 +43,7 @@
|
|||||||
|
|
||||||
## Blog posts
|
## Blog posts
|
||||||
|
|
||||||
|
- [How to Install Odoo Modules Using Git — and the Quick Git Route That Skips the Console](https://odoo4projects.com/blog/posts/how-to-install-odoo-modules-using-git.html) — 2026-10-28 — Every business is slightly different, which is why a system that only does the standard thing is only ever half a system.
|
||||||
- [ODOO Community Is Going Online on ODOO4projects](https://odoo4projects.com/blog/posts/odoo-community-is-going-online-on-odoo4projects.html) — 2026-10-27 — ODOO Community is online.
|
- [ODOO Community Is Going Online on ODOO4projects](https://odoo4projects.com/blog/posts/odoo-community-is-going-online-on-odoo4projects.html) — 2026-10-27 — ODOO Community is online.
|
||||||
- [Track the OCA Modules You Actually Use — Without Refreshing GitHub Every Day](https://odoo4projects.com/blog/posts/track-the-oca-modules-you-actually-use.html) — 2026-10-24 — Every new Odoo release starts the same routine.
|
- [Track the OCA Modules You Actually Use — Without Refreshing GitHub Every Day](https://odoo4projects.com/blog/posts/track-the-oca-modules-you-actually-use.html) — 2026-10-24 — Every new Odoo release starts the same routine.
|
||||||
- [This is how i updated my Invoices from Odoo 19 to Odoo 20 with n8n and much MCP](https://odoo4projects.com/blog/posts/odoo-19-to-20-invoice-migration-with-n8n-and-mcp.html) — 2026-10-23 — Copying invoices from one Odoo instance to another by hand is the kind of task that looks small until you are on…
|
- [This is how i updated my Invoices from Odoo 19 to Odoo 20 with n8n and much MCP](https://odoo4projects.com/blog/posts/odoo-19-to-20-invoice-migration-with-n8n-and-mcp.html) — 2026-10-23 — Copying invoices from one Odoo instance to another by hand is the kind of task that looks small until you are on…
|
||||||
|
|||||||
@@ -48,6 +48,12 @@
|
|||||||
<changefreq>yearly</changefreq>
|
<changefreq>yearly</changefreq>
|
||||||
<priority>0.4</priority>
|
<priority>0.4</priority>
|
||||||
</url>
|
</url>
|
||||||
|
<url>
|
||||||
|
<loc>https://odoo4projects.com/blog/posts/how-to-install-odoo-modules-using-git.html</loc>
|
||||||
|
<lastmod>2026-10-28</lastmod>
|
||||||
|
<changefreq>monthly</changefreq>
|
||||||
|
<priority>0.6</priority>
|
||||||
|
</url>
|
||||||
<url>
|
<url>
|
||||||
<loc>https://odoo4projects.com/blog/posts/odoo-community-is-going-online-on-odoo4projects.html</loc>
|
<loc>https://odoo4projects.com/blog/posts/odoo-community-is-going-online-on-odoo4projects.html</loc>
|
||||||
<lastmod>2026-10-27</lastmod>
|
<lastmod>2026-10-27</lastmod>
|
||||||
|
|||||||
Reference in new issue
Block a user