Files
nexus/sreweekly/articles/300/07-safe-schema-updates-strangling-the-monolith.html
2026-09-12 17:23:01 +08:00

1860 lines
125 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!DOCTYPE html><html dir="ltr" lang="en" class="initial"> <head><meta charset="utf-8"><title>Safe Schema Updates - Strangling The Monolith | Octopus blog</title><meta name="robots" content="max-image-preview:large, index, follow"><meta name="keywords"><meta name="description" content="This post discusses patterns for migrating from a tightly coupled to a loosely coupled architecture."><link rel="preconnect" href="https://octopus.com" crossorigin><link rel="preload" as="image" href="/blog/i/x/cover/monolith-architecture-change.png" imagesrcset="/blog/i/600/cover/monolith-architecture-change.webp 600w, /blog/i/1000/cover/monolith-architecture-change.webp 1000w, /blog/i/2000/cover/monolith-architecture-change.webp 1500w" imagesizes="(min-width: 1680px) 1000px, (min-width: 940px) calc(71.81vw - 192px), calc(100vw - 32px)" fetchpriority="high"><link rel="stylesheet" href="https://octopus.com/octopus-public/assets/pu-vars.css"><link rel="stylesheet" href="https://octopus.com/octopus-public/assets/navbar-pu-styles.css"><link rel="stylesheet" href="https://octopus.com/octopus-public/assets/footer-pu-styles.css" media="print" onload="this.media='all';this.onload=null"><link rel="stylesheet" href="https://octopus.com/octopus-public/assets/marketo-pu-styles.css" media="print" onload="this.media='all';this.onload=null"><noscript><link rel="stylesheet" href="https://octopus.com/octopus-public/assets/footer-pu-styles.css"><link rel="stylesheet" href="https://octopus.com/octopus-public/assets/marketo-pu-styles.css"></noscript><link rel="stylesheet" href="/blog/css/vars.css"><link rel="stylesheet" href="/blog/css/main.css"><meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1"><meta name="format-detection" content="telephone=no"><meta name="theme-color" content="#311e3e"><link rel="canonical" href="https://octopus.com/blog/safe-schema-updates-8-strangling-the-monolith"><link rel="alternate" type="application/atom+xml" title="Octopus blog" href="/blog/feed.xml"><link rel="alternate" href="/blog/sitemap.xml" type="application/rss+xml"><link rel="shortcut icon" href="/blog/icons/favicon.ico" type="image/x-icon"><link rel="apple-touch-icon" href="/blog/icons/apple-touch-icon.png"><meta property="og:type" content="website"><meta property="og:url" content="https://octopus.com/blog/safe-schema-updates-8-strangling-the-monolith"><meta property="og:title" content="Safe schema updates - Strangling the monolith"><meta property="og:description" content="This post discusses patterns for migrating from a tightly coupled to a loosely coupled architecture."><meta property="og:image" content="https://octopus.com/blog/img/cover/monolith-architecture-change.png"><meta property="og:image:alt" content="3 people building an unstable looking tower with blue blocks, beside 2 people building a stable, lower tower with blue blocks"><meta name="twitter:card" content="summary_large_image"><meta name="twitter:title" content="Safe schema updates - Strangling the monolith"><meta name="twitter:description" content="This post discusses patterns for migrating from a tightly coupled to a loosely coupled architecture."><meta name="twitter:image" content="https://octopus.com/blog/img/cover/monolith-architecture-change.png"><meta name="twitter:image:alt" content="3 people building an unstable looking tower with blue blocks, beside 2 people building a stable, lower tower with blue blocks"><meta name="view-transition" content="same-origin"><!-- Icons are decorative and used on ~10% of pages - load off the critical path -->
<link href="/blog/css/fa/css/fontawesome.css" rel="stylesheet" media="print" onload="this.media='all';this.onload=null">
<link href="/blog/css/fa/css/brands.css" rel="stylesheet" media="print" onload="this.media='all';this.onload=null">
<link href="/blog/css/fa/css/solid.css" rel="stylesheet" media="print" onload="this.media='all';this.onload=null">
<noscript>
<link href="/blog/css/fa/css/fontawesome.css" rel="stylesheet">
<link href="/blog/css/fa/css/brands.css" rel="stylesheet">
<link href="/blog/css/fa/css/solid.css" rel="stylesheet">
</noscript>
<meta name="google-site-verification" content="nIbWsTU_ELqMnLNxIexH_s6ch3m-s_MaFnl5u8WoaRM" />
<!-- Inline Script to set the initial theme -->
<script>
(() => {
const theme = localStorage.getItem('theme') || (window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light');
document.documentElement.setAttribute('data-theme', theme);
})();
</script>
<script defer>
const whenActivated = new Promise((resolve) => {
if (document.prerendering) {
document.addEventListener('prerenderingchange', resolve);
} else {
resolve();
}
});
async function add_gtm(w,d,s,l,i) {
// Only add analytics if the page is not "pre-rendering"
await whenActivated;
w[l] = w[l]||[];w[l].push({'gtm.start': new Date().getTime(), event:'gtm.js'});
var f = d.getElementsByTagName(s)[0],
j = d.createElement(s),
dl = l != 'dataLayer'
? '&l=' + l
: '';
j.defer=true;
j.src= 'https://www.googletagmanager.com/gtm.js?id='+i+dl;
f.parentNode.insertBefore(j, f);
}
if (document.location.hostname === 'octopus.com'
|| document.location.hostname === 'www.octopus.com') {
// Only add analytics to production site
add_gtm(window, document, 'script', 'dataLayer', 'GTM-MQ943TFN');
}
</script><script type="application/ld+json">{
"@context": "https://schema.org",
"@type": "NewsArticle",
"headline": "Safe schema updates - Strangling the monolith",
"description": "This post discusses patterns for migrating from a tightly coupled to a loosely coupled architecture.",
"author": {
"@type": "Person",
"name": "Alex Yates"
},
"datePublished": "2021-12-08T00:00:00.000Z",
"dateModified": "2021-12-08T00:00:00.000Z",
"publisher": {
"@type": "Organization",
"name": "Octopus Deploy",
"logo": {
"@type": "ImageObject",
"url": "/blog/img/octopus-glyph.png",
"width": 32,
"height": 32
}
},
"mainEntityOfPage": {
"@type": "WebPage",
"@id": "https://octopus.com/blog/safe-schema-updates-8-strangling-the-monolith"
},
"image": {
"@type": "ImageObject",
"url": "https://octopus.com/blog/img/cover/monolith-architecture-change.png",
"width": 1200,
"height": 800
},
"articleSection": "DevOps, Database Deployments, Deployment Patterns"
}</script><script type="application/ld+json">{"@context":"https://schema.org","@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https://octopus.com/"},{"@type":"ListItem","position":2,"name":"Blog","item":"https://octopus.com/blog"},{"@type":"ListItem","position":3,"name":"Safe schema updates - Strangling the monolith","item":"https://octopus.com/blog/safe-schema-updates-8-strangling-the-monolith"}]}</script></head> <body data-theme="dark"> <nav class="skip-links" aria-label="Skip Links" id="site-top"> <a href="#site-nav">Skip to navigation</a> <a href="#site-main">Skip to main content</a> <a href="#site-footer">Skip to footer</a> </nav> <div data-shared-source="live" data-shared-fragment="navbar" data-shared-note="fetched https://octopus.com/fragments/navbar at 2026-09-11T10:55:57.546Z">
<nav class="navbar navbar-pu site-header" aria-label="Main" data-navbar-pu itemscope itemtype="https://schema.org/SiteNavigationElement">
<div class="nav-container">
<div class="navbar-content">
<a class="navbar__logo" href="https://octopus.com/" aria-label="Octopus Deploy homepage" data-navbar-logo itemprop="url">
<svg id="glyph-icon" class="icon icon--octopus" xmlns="http://www.w3.org/2000/svg" width="144.4" height="154.6" version="1.1" viewBox="0 0 144.4 154.6">
<!-- Generator: Adobe Illustrator 29.3.1, SVG Export Plug-In . SVG Version: 2.1.0 Build 151) -->
<defs>
<style>
.logo-color {
fill: #0d80d8;
}
</style>
</defs>
<path id="glyph-icon1" data-name="glyph-icon" class="logo-color" d="M9.5,117.2c11.5-7.6,24.9-20.4,20-35.4-2.8-8.3-6.6-15.2-7.3-24.2-.5-7.6.7-15.2,3.3-22.1C35.8,7.4,66.6-5.9,94.4,2.4c25.6,7.8,43.2,38,32.7,64.1-6.1,15.2-8.9,27.1,4.7,38.7,3.8,3.1,12.7,8.1,12.7,13.8s-14.6-1.7-16-2.8c1.9,3.3,20,22.3,8.5,23.8-10.6,1.2-20-13.8-26.3-20.2-10.8-10.9-8.9,13.1-8.9,18.1,0,7.8-5.6,23.8-15.3,13.3-8-8.6-4.9-22.1-10.6-31.6-6.1-10.5-16.5,10.5-19,14.3-2.8,4.3-17.2,24.7-22.8,13.8-4.7-8.8,2.8-22.8,6.3-30.9-1.4,2.8-10.8,7.1-13.4,8.6-5.9,3.3-12.7,5-19.5,4.5-14.8-1-3.8-8.8,2.1-12.6Z"/>
</svg>
<svg id="wordmark-octopus-deploy" class="icon icon--octopus-deploy-wordmark" xmlns="http://www.w3.org/2000/svg" width="751.5" height="98.9" version="1.1" viewBox="0 0 751.5 98.9">
<!-- Generator: Adobe Illustrator 29.3.1, SVG Export Plug-In . SVG Version: 2.1.0 Build 151) -->
<defs>
<style>
.logo-wordmark-color {
fill: #0a151e;
}
</style>
</defs>
<path id="wordmark-octopus-deploy1" data-name="wordmark-octopus-deploy" class="logo-wordmark-color" d="M70.2,39.2c0,8.2-1.5,15.3-4.6,21.2-3.1,5.8-7.2,10.3-12.5,13.4-5.3,3.1-11.3,4.7-17.9,4.7s-12.7-1.6-18-4.7c-5.3-3.1-9.4-7.6-12.5-13.5C1.5,54.5,0,47.5,0,39.2s1.5-15.3,4.6-21.1c3.1-5.9,7.3-10.4,12.5-13.5C22.4,1.6,28.4,0,35.1,0s12.7,1.6,17.9,4.7c5.3,3.1,9.5,7.6,12.5,13.5,3.1,5.8,4.6,12.9,4.6,21.1ZM56.3,39.2c0-5.8-.9-10.7-2.7-14.7-1.8-4-4.3-7-7.5-9.1-3.2-2.1-6.9-3.1-11-3.1s-7.8,1-11,3.1c-3.2,2-5.7,5.1-7.5,9.1-1.8,4-2.7,8.9-2.7,14.7s.9,10.7,2.7,14.7c1.8,4,4.3,7,7.5,9.1,3.2,2,6.9,3.1,11,3.1s7.8-1,11-3.1c3.2-2.1,5.7-5.1,7.5-9.1,1.8-4,2.7-8.9,2.7-14.7ZM103.6,78.6c-5.7,0-10.6-1.3-14.7-3.8-4.1-2.5-7.2-6-9.4-10.4-2.2-4.5-3.3-9.6-3.3-15.4s1.1-11,3.4-15.4c2.2-4.5,5.4-8,9.5-10.4,4.1-2.5,9-3.8,14.5-3.8s8.8.9,12.3,2.6c3.6,1.7,6.5,4.1,8.6,7.2,2.1,3.1,3.4,6.7,3.7,10.8h-12.9c-.5-2.8-1.8-5.1-3.7-6.9-1.9-1.9-4.5-2.8-7.8-2.8s-5.2.7-7.3,2.2c-2.1,1.5-3.7,3.6-4.9,6.3-1.1,2.8-1.7,6.1-1.7,9.9s.6,7.3,1.7,10.1c1.1,2.8,2.7,4.9,4.8,6.5,2.1,1.5,4.5,2.2,7.4,2.2s3.8-.4,5.3-1.1c1.6-.8,2.9-1.9,4-3.3,1.1-1.4,1.8-3.2,2.2-5.3h12.9c-.3,4.1-1.5,7.6-3.6,10.8-2.1,3.1-4.9,5.5-8.4,7.3-3.6,1.7-7.7,2.6-12.5,2.6ZM163.8,20.1v10.4h-32.9v-10.4h32.9ZM139,6.4h13.5v53.8c0,1.8.3,3.2.8,4.2.6.9,1.3,1.6,2.2,1.9.9.3,1.9.5,3.1.5s1.6,0,2.3-.2c.7-.1,1.3-.2,1.6-.3l2.3,10.6c-.7.2-1.8.5-3.1.8-1.3.3-2.9.5-4.8.5-3.4.1-6.4-.4-9.1-1.5-2.7-1.1-4.9-2.9-6.5-5.3-1.6-2.4-2.3-5.4-2.3-9V6.4ZM195.4,78.6c-5.6,0-10.4-1.2-14.5-3.7-4.1-2.5-7.3-5.9-9.6-10.3-2.2-4.4-3.4-9.6-3.4-15.5s1.1-11.1,3.4-15.6c2.3-4.5,5.4-7.9,9.6-10.4,4.1-2.5,9-3.7,14.5-3.7s10.4,1.2,14.6,3.7c4.1,2.5,7.3,5.9,9.5,10.4,2.3,4.5,3.4,9.6,3.4,15.6s-1.1,11.1-3.4,15.5c-2.2,4.4-5.4,7.9-9.5,10.3-4.1,2.5-9,3.7-14.6,3.7ZM195.5,67.7c3,0,5.6-.8,7.6-2.5,2-1.7,3.6-4,4.6-6.8,1-2.8,1.5-6,1.5-9.5s-.5-6.7-1.5-9.5c-1-2.9-2.5-5.1-4.6-6.8-2-1.7-4.6-2.5-7.6-2.5s-5.7.8-7.8,2.5c-2,1.7-3.6,4-4.6,6.8-1,2.8-1.5,6-1.5,9.5s.5,6.6,1.5,9.5c1,2.8,2.5,5.1,4.6,6.8,2.1,1.7,4.7,2.5,7.8,2.5ZM230.3,98.9V20.1h13.3v9.5h.8c.7-1.4,1.7-2.9,2.9-4.4,1.3-1.6,3-2.9,5.1-4.1,2.2-1.1,4.9-1.7,8.3-1.7s8.4,1.1,12,3.4c3.6,2.2,6.4,5.6,8.5,10,2.1,4.4,3.2,9.7,3.2,16.1s-1,11.6-3.1,16c-2.1,4.4-4.9,7.8-8.4,10.1-3.6,2.3-7.6,3.5-12.1,3.5s-6-.5-8.2-1.6c-2.2-1.1-3.9-2.4-5.2-4-1.3-1.6-2.3-3-3-4.4h-.6v30.5h-13.5ZM243.5,48.8c0,3.7.5,7,1.6,9.7,1.1,2.8,2.6,5,4.6,6.5,2,1.5,4.5,2.3,7.3,2.3s5.5-.8,7.5-2.4c2-1.6,3.5-3.8,4.6-6.6,1-2.8,1.6-6,1.6-9.6s-.5-6.7-1.5-9.5c-1-2.8-2.5-4.9-4.6-6.5-2-1.6-4.5-2.4-7.5-2.4s-5.3.8-7.3,2.3c-2,1.5-3.5,3.6-4.6,6.4-1,2.7-1.5,6-1.5,9.7ZM328.4,53.3V20.1h13.5v57.3h-13.1v-10.2h-.6c-1.3,3.2-3.4,5.8-6.4,7.9-2.9,2-6.6,3.1-10.9,3.1s-7.1-.8-10-2.5c-2.9-1.7-5.1-4.1-6.7-7.3-1.6-3.2-2.4-7.1-2.4-11.7V20.1h13.5v34.4c0,3.6,1,6.5,3,8.7,2,2.1,4.6,3.2,7.8,3.2s3.9-.5,5.8-1.5c1.9-1,3.4-2.4,4.6-4.3,1.2-1.9,1.8-4.4,1.8-7.3ZM397,35.3l-12.3,1.3c-.3-1.2-1-2.4-1.8-3.5-.8-1.1-2-2-3.4-2.6-1.4-.7-3.2-1-5.3-1s-5.2.6-7.1,1.8c-1.9,1.2-2.8,2.8-2.8,4.7,0,1.7.6,3,1.8,4.1,1.3,1,3.4,1.9,6.3,2.6l9.8,2.1c5.4,1.2,9.5,3,12.1,5.6,2.7,2.5,4,5.9,4,10,0,3.6-1.1,6.8-3.2,9.6-2.1,2.7-4.9,4.9-8.6,6.4-3.7,1.5-7.9,2.3-12.7,2.3-7,0-12.7-1.5-16.9-4.4-4.3-3-6.8-7.1-7.6-12.3l13.2-1.3c.6,2.6,1.9,4.5,3.8,5.9,1.9,1.3,4.5,2,7.6,2s5.8-.7,7.7-2c2-1.3,2.9-2.9,2.9-4.9s-.6-3-1.9-4.1c-1.2-1.1-3.2-1.9-5.8-2.5l-9.8-2.1c-5.5-1.1-9.6-3.1-12.2-5.8-2.6-2.7-3.9-6.2-3.9-10.4,0-3.5.9-6.6,2.9-9.2,2-2.6,4.7-4.6,8.2-6,3.5-1.4,7.5-2.2,12.1-2.2,6.7,0,12,1.4,15.9,4.3,3.9,2.9,6.3,6.7,7.2,11.6ZM453.8,77.4h-25.9V1h26.4c7.6,0,14.1,1.5,19.5,4.6,5.5,3,9.7,7.4,12.6,13.1,2.9,5.7,4.4,12.5,4.4,20.4s-1.5,14.8-4.4,20.5c-2.9,5.7-7.2,10.1-12.7,13.2-5.5,3.1-12.2,4.6-19.9,4.6ZM441.7,65.5h11.4c5.3,0,9.8-1,13.3-2.9,3.6-2,6.2-4.9,8-8.8,1.8-3.9,2.7-8.8,2.7-14.6s-.9-10.7-2.7-14.5c-1.8-3.9-4.4-6.8-7.9-8.7-3.5-1.9-7.8-2.9-13-2.9h-11.8v52.5ZM524.7,78.6c-5.7,0-10.7-1.2-14.9-3.6-4.2-2.4-7.3-5.8-9.6-10.2-2.2-4.4-3.4-9.6-3.4-15.6s1.1-11.1,3.4-15.5c2.3-4.5,5.4-8,9.5-10.4,4.1-2.5,8.8-3.8,14.3-3.8s6.9.6,10,1.7c3.2,1.1,5.9,2.9,8.4,5.2,2.4,2.4,4.4,5.4,5.7,9,1.4,3.6,2.1,8,2.1,13v4.1h-47v-9.1h34c0-2.6-.6-4.9-1.7-6.9-1.1-2-2.6-3.6-4.6-4.8-1.9-1.2-4.2-1.8-6.8-1.8s-5.2.7-7.3,2c-2.1,1.3-3.7,3.1-4.9,5.2-1.1,2.1-1.7,4.5-1.8,7.1v7.9c0,3.3.6,6.2,1.8,8.6,1.2,2.4,2.9,4.2,5.1,5.4,2.2,1.2,4.8,1.9,7.7,1.9s3.7-.3,5.3-.8c1.6-.6,3-1.4,4.1-2.5,1.2-1.1,2.1-2.4,2.6-4.1l12.6,1.4c-.8,3.3-2.3,6.2-4.6,8.7-2.2,2.5-5,4.4-8.5,5.7-3.5,1.3-7.4,2-11.9,2ZM557.5,98.9V20.1h13.3v9.5h.8c.7-1.4,1.7-2.9,2.9-4.4,1.3-1.6,3-2.9,5.1-4.1,2.2-1.1,4.9-1.7,8.3-1.7s8.4,1.1,12,3.4c3.6,2.2,6.4,5.6,8.5,10,2.1,4.4,3.2,9.7,3.2,16.1s-1,11.6-3.1,16c-2.1,4.4-4.9,7.8-8.4,10.1-3.6,2.3-7.6,3.5-12.1,3.5s-6-.5-8.2-1.6c-2.2-1.1-3.9-2.4-5.2-4-1.3-1.6-2.3-3-3-4.4h-.6v30.5h-13.5ZM570.8,48.8c0,3.7.5,7,1.6,9.7,1.1,2.8,2.6,5,4.6,6.5,2,1.5,4.5,2.3,7.3,2.3s5.5-.8,7.5-2.4c2-1.6,3.5-3.8,4.6-6.6,1-2.8,1.6-6,1.6-9.6s-.5-6.7-1.5-9.5c-1-2.8-2.5-4.9-4.6-6.5-2-1.6-4.5-2.4-7.5-2.4s-5.3.8-7.3,2.3c-2,1.5-3.5,3.6-4.6,6.4-1,2.7-1.5,6-1.5,9.7ZM632.6,1v76.4h-13.5V1h13.5ZM667.4,78.6c-5.6,0-10.4-1.2-14.5-3.7-4.1-2.5-7.3-5.9-9.5-10.3-2.2-4.4-3.4-9.6-3.4-15.5s1.1-11.1,3.4-15.6c2.3-4.5,5.4-7.9,9.5-10.4s9-3.7,14.5-3.7,10.4,1.2,14.5,3.7c4.1,2.5,7.3,5.9,9.5,10.4,2.3,4.5,3.4,9.6,3.4,15.6s-1.1,11.1-3.4,15.5c-2.2,4.4-5.4,7.9-9.5,10.3-4.1,2.5-9,3.7-14.5,3.7ZM667.5,67.7c3,0,5.6-.8,7.6-2.5,2-1.7,3.6-4,4.6-6.8,1-2.8,1.5-6,1.5-9.5s-.5-6.7-1.5-9.5c-1-2.9-2.5-5.1-4.6-6.8-2-1.7-4.6-2.5-7.6-2.5s-5.7.8-7.8,2.5c-2,1.7-3.6,4-4.6,6.8-1,2.8-1.5,6-1.5,9.5s.5,6.6,1.5,9.5c1,2.8,2.5,5.1,4.6,6.8,2.1,1.7,4.7,2.5,7.8,2.5ZM708.7,98.9c-1.8,0-3.5-.1-5.1-.4-1.5-.3-2.8-.6-3.7-1l3.1-10.5c2,.6,3.7.8,5.3.8s2.9-.5,4.1-1.5c1.2-.9,2.2-2.5,3-4.6l1.2-3.1-20.8-58.5h14.3l13.2,43.3h.6l13.2-43.3h14.4l-22.9,64.2c-1.1,3-2.5,5.6-4.3,7.8-1.8,2.2-3.9,3.9-6.5,5-2.5,1.2-5.6,1.8-9.1,1.8Z"/>
</svg>
<span class="visually-hidden" itemprop="name">Octopus Deploy</span>
</a>
<div id="main-navbar" class="navbar__menu" data-navbar-menu>
<ul class="navbar__sections">
<li class="navbar__section">
<button type="button" class="navbar__button" aria-expanded="false" aria-controls="dropdown-solutions"
data-navbar-section-toggle data-target="dropdown-solutions"
aria-label="Solutions menu">
<span>Solutions</span>
<svg class="icon icon--chevron-navbar" width="13" height="8" viewBox="0 0 13 8" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M1.98755 1.5L6.98755 6.5L11.9875 1.5" stroke="#303E49" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
</button>
</li>
<li class="navbar__section">
<a class="navbar__button" href="https://octopus.com/pricing/overview" itemprop="url">
<span itemprop="name">Pricing</span>
</a>
</li>
<li class="navbar__section">
<a class="navbar__button" href="https://octopus.com/docs" target="_blank" rel="noopener noreferrer" itemprop="url">
<span itemprop="name">Docs</span>
</a>
</li>
<li class="navbar__section">
<button type="button" class="navbar__button" aria-expanded="false" aria-controls="dropdown-resources"
data-navbar-section-toggle data-target="dropdown-resources"
aria-label="Resources menu">
<span>Resources</span>
<svg class="icon icon--chevron-navbar" width="13" height="8" viewBox="0 0 13 8" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M1.98755 1.5L6.98755 6.5L11.9875 1.5" stroke="#303E49" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
</button>
</li>
<li class="navbar__section">
<button type="button" class="navbar__button" aria-expanded="false" aria-controls="dropdown-company"
data-navbar-section-toggle data-target="dropdown-company"
aria-label="Company menu">
<span>Company</span>
<svg class="icon icon--chevron-navbar" width="13" height="8" viewBox="0 0 13 8" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M1.98755 1.5L6.98755 6.5L11.9875 1.5" stroke="#303E49" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
</button>
</li>
</ul>
<ul class="navbar__sections navbar__sections--secondary" data-navbar-secondary>
<li class="navbar__section" data-navbar-signin>
<a class="navbar__button" href="https://octopus.com/signin" rel="nofollow" itemprop="url">
<span itemprop="name">Sign in</span>
</a>
</li>
<li class="navbar__section navbar__section--contact">
<a class="navbar__button navbar__button--contact button button--secondary" href="https://octopus.com/company/contact" itemprop="url">
<span itemprop="name">Contact us</span>
</a>
</li>
<li class="navbar__section" data-navbar-signup>
<a class="navbar__button navbar__button--signup button button--primary" href="https://octopus.com/free-signup?location=nav-bar" rel="nofollow" itemprop="url">
<span itemprop="name">Start for free</span>
</a>
</li>
<li class="navbar__section navbar__section--user" data-navbar-profile hidden>
<div class="navbar__user-menu">
<button type="button" class="navbar__button navbar__user-toggle" data-navbar-profile-link
aria-expanded="false" aria-controls="dropdown-user" data-target="dropdown-user"
aria-label="User profile menu">
<span class="navbar__profile-image" data-navbar-profile-image>
<img src="data:image/gif;base64,R0lGODlhAQABAAAAACw=" alt="" loading="lazy" hidden />
</span>
<span class="personal" data-navbar-profile-name>User</span>
<svg class="icon icon--chevron-navbar" width="13" height="8" viewBox="0 0 13 8" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M1.98755 1.5L6.98755 6.5L11.9875 1.5" stroke="#303E49" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
</button>
</div>
</li>
</ul>
</div>
<button class="navbar__toggler" type="button" aria-label="Open navigation menu" aria-controls="main-navbar" aria-expanded="false" data-navbar-toggler>
<span class="hamburger" aria-hidden="true">
<span class="hamburger__bar"></span>
<span class="hamburger__bar"></span>
<span class="hamburger__bar"></span>
</span>
</button>
</div>
</div>
<div class="navbar__panels" data-navbar-panels>
<nav class="navbar__dropdown" id="dropdown-solutions" data-navbar-dropdown aria-label="Solutions">
<button type="button" class="navbar__back-btn" data-navbar-back aria-label="Back to menu">
<svg class="icon icon--chevron-navbar" width="13" height="8" viewBox="0 0 13 8" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M1.98755 1.5L6.98755 6.5L11.9875 1.5" stroke="#303E49" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
<span>Back</span>
</button>
<div class="navbar__subsection">
<ul class="navbar__subsection-items">
<li class="navbar__item">
<span class="navbar__item-sub-category">Octopus Deploy</span>
</li>
<li class="navbar__item">
<a class="navbar__item-link" href="https://octopus.com/use-case/kubernetes" itemprop="url">
<span class="navbar__item-icon" aria-hidden="true">
<span class="image-wrapper">
<img src="https://a.storyblok.com/f/185929/45x45/c234e77f86/icon-kubernetes.svg" alt="Kubernetes icon logo steer blue gradient" loading="lazy" width="45" height="45" />
</span>
</span>
<span class="navbar__item-label" itemprop="name">Kubernetes deployments</span>
</a>
</li>
<li class="navbar__item">
<a class="navbar__item-link" href="https://octopus.com/use-case/platform-hub" itemprop="url">
<span class="navbar__item-icon" aria-hidden="true">
<span class="image-wrapper">
<img src="https://a.storyblok.com/f/185929/45x45/cc44e17bdf/icon-platform-hub.svg" alt="Blue boxes stacked on top of each other" loading="lazy" width="45" height="45" />
</span>
</span>
<span class="navbar__item-label" itemprop="name">Platform Hub</span>
</a>
</li>
<li class="navbar__item">
<a class="navbar__item-link" href="https://octopus.com/use-case/environment-promotion" itemprop="url">
<span class="navbar__item-icon" aria-hidden="true">
<span class="image-wrapper">
<img src="https://a.storyblok.com/f/185929/45x45/e2c09018a3/icon-environment-promotion.svg" alt="icon environment promotion gear blue gradient" loading="lazy" width="45" height="45" />
</span>
</span>
<span class="navbar__item-label" itemprop="name">Environment promotion</span>
</a>
</li>
<li class="navbar__item">
<a class="navbar__item-link" href="https://octopus.com/ai-tools" itemprop="url">
<span class="navbar__item-icon" aria-hidden="true">
<span class="image-wrapper">
<img src="https://a.storyblok.com/f/185929/45x45/bd93d826d3/icon-ai.svg" alt="AI icon" loading="lazy" width="45" height="45" />
</span>
</span>
<span class="navbar__item-label" itemprop="name">AI tools</span>
</a>
</li>
<li class="navbar__item">
<a class="navbar__item-link" href="https://octopus.com/use-case/argo-cd-in-octopus" itemprop="url">
<span class="navbar__item-icon" aria-hidden="true">
<span class="image-wrapper">
<img src="https://a.storyblok.com/f/185929/45x45/d42ce2a726/icon-argo.svg" alt="Argo icon" loading="lazy" width="45" height="45" />
</span>
</span>
<span class="navbar__item-label" itemprop="name">Argo CD in Octopus</span>
</a>
</li>
<li class="navbar__item">
<a class="navbar__item-link" href="https://octopus.com/use-case/runbooks" itemprop="url">
<span class="navbar__item-icon" aria-hidden="true">
<span class="image-wrapper">
<img src="https://a.storyblok.com/f/185929/45x45/d9ab08e6a3/icon-runbooks.svg" alt="runbooks running book with a wrench on it blue gradient" loading="lazy" width="45" height="45" />
</span>
</span>
<span class="navbar__item-label" itemprop="name">Automate operations tasks</span>
</a>
</li>
<li class="navbar__item">
<a class="navbar__item-link" href="https://octopus.com/use-case/tenanted-deployments" itemprop="url">
<span class="navbar__item-icon" aria-hidden="true">
<span class="image-wrapper">
<img src="https://a.storyblok.com/f/185929/45x45/c89e19472b/icon-tenanted-deployments.svg" alt="icon tenanted deployments blue gradient three people" loading="lazy" width="45" height="45" />
</span>
</span>
<span class="navbar__item-label" itemprop="name">Tenanted deployments</span>
</a>
</li>
</ul>
</div>
<div class="navbar__subsection">
<ul class="navbar__subsection-items">
<li class="navbar__item">
<span class="navbar__item-sub-category">Explore</span>
</li>
<li class="navbar__item">
<a class="navbar__item-link" href="https://octopus.com/downloads" itemprop="url">
<span class="navbar__item-label" itemprop="name">Install Octopus self-hosted</span>
</a>
</li>
<li class="navbar__item">
<a class="navbar__item-link" href="https://octopus.com/downloads/compare" itemprop="url">
<span class="navbar__item-label" itemprop="name">Compare releases</span>
</a>
</li>
<li class="navbar__item">
<a class="navbar__item-link" href="https://octopus.com/integrations" itemprop="url">
<span class="navbar__item-label" itemprop="name">Integrations</span>
</a>
</li>
<li class="navbar__item">
<a class="navbar__item-link" href="https://roadmap.octopus.com/tabs/2-planned" itemprop="url">
<span class="navbar__item-label" itemprop="name">Octopus Roadmap</span>
</a>
</li>
<li class="navbar__item">
<a class="navbar__item-link" href="https://octopus.com/free" itemprop="url">
<span class="navbar__item-label" itemprop="name">Start for free</span>
</a>
</li>
</ul>
</div>
<svg class="icon icon--marker-navbar" xmlns="http://www.w3.org/2000/svg" width="32" height="15" viewBox="0 0 32 15" fill="none">
<path d="M13.8787 1.12132L0 15H32L18.1213 1.12132C16.9497 -0.0502526 15.0503 -0.050255 13.8787 1.12132Z" fill="white"/>
</svg>
</nav>
<nav class="navbar__dropdown" id="dropdown-resources" data-navbar-dropdown aria-label="Resources">
<button type="button" class="navbar__back-btn" data-navbar-back aria-label="Back to menu">
<svg class="icon icon--chevron-navbar" width="13" height="8" viewBox="0 0 13 8" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M1.98755 1.5L6.98755 6.5L11.9875 1.5" stroke="#303E49" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
<span>Back</span>
</button>
<div class="navbar__subsection">
<p class="navbar__subsection-title" id="dropdown-resources-explore">Explore</p>
<ul class="navbar__subsection-items" aria-labelledby="dropdown-resources-explore">
<li class="navbar__item">
<a class="navbar__item-link" href="https://octopus.com/company/customers" itemprop="url">
<span class="navbar__item-icon" aria-hidden="true">
<span class="image-wrapper">
<img src="https://a.storyblok.com/f/185929/45x45/00525c876d/icon-customer-stories.svg" alt="icon customer stories success example graduate" loading="lazy" width="45" height="45" />
</span>
</span>
<span class="navbar__item-label" itemprop="name">Customer stories</span>
</a>
</li>
<li class="navbar__item">
<a class="navbar__item-link" href="https://octopus.com/webinars" itemprop="url">
<span class="navbar__item-icon" aria-hidden="true">
<span class="image-wrapper">
<img src="https://a.storyblok.com/f/185929/45x45/a7c01192c7/icon-webinars.svg" alt="icon camera webinars videos capture" loading="lazy" width="45" height="45" />
</span>
</span>
<span class="navbar__item-label" itemprop="name">Webinars</span>
</a>
</li>
<li class="navbar__item">
<a class="navbar__item-link" href="https://octopus.com/publications" itemprop="url">
<span class="navbar__item-icon" aria-hidden="true">
<span class="image-wrapper">
<img src="https://a.storyblok.com/f/185929/45x45/1845d0555a/icon-nav-publications.svg" alt="Publications icon" loading="lazy" width="45" height="45" />
</span>
</span>
<span class="navbar__item-label" itemprop="name">Publications</span>
</a>
</li>
<li class="navbar__item">
<a class="navbar__item-link" href="https://octopus.com/downloads" itemprop="url">
<span class="navbar__item-icon" aria-hidden="true">
<span class="image-wrapper">
<img src="https://a.storyblok.com/f/185929/45x45/0008b1a75e/nav-icon-downloads.svg" alt="Downloads icon" loading="lazy" width="45" height="45" />
</span>
</span>
<span class="navbar__item-label" itemprop="name">Downloads</span>
</a>
</li>
</ul>
</div>
<div class="navbar__subsection">
<p class="navbar__subsection-title" id="dropdown-resources-support-and-services">Support and services</p>
<ul class="navbar__subsection-items" aria-labelledby="dropdown-resources-support-and-services">
<li class="navbar__item">
<a class="navbar__item-link" href="https://octopus.com/docs" itemprop="url">
<span class="navbar__item-icon" aria-hidden="true">
<span class="image-wrapper">
<img src="https://a.storyblok.com/f/185929/45x45/0724935a2e/icon-devops-handbook.svg" alt="icon book devops DevOps handbook ci cd cycle" loading="lazy" width="45" height="45" />
</span>
</span>
<span class="navbar__item-label" itemprop="name">Documentation</span>
</a>
</li>
<li class="navbar__item">
<a class="navbar__item-link" href="https://octopus.com/support" itemprop="url">
<span class="navbar__item-icon" aria-hidden="true">
<span class="image-wrapper">
<img src="https://a.storyblok.com/f/185929/45x45/ecb140a3aa/icon-partners.svg" alt="icon support partners handshake trust" loading="lazy" width="45" height="45" />
</span>
</span>
<span class="navbar__item-label" itemprop="name">Customer support</span>
</a>
</li>
<li class="navbar__item">
<a class="navbar__item-link" href="https://learning.octopus.com/" target="_blank" rel="noopener noreferrer" itemprop="url">
<span class="navbar__item-icon" aria-hidden="true">
<span class="image-wrapper">
<img src="https://a.storyblok.com/f/185929/45x45/7802cd7dd7/icon-certificates-1.svg" alt="Certification icon" loading="lazy" width="45" height="45" />
</span>
</span>
<span class="navbar__item-label" itemprop="name">Certification</span>
</a>
</li>
<li class="navbar__item">
<a class="navbar__item-link" href="https://octopus.com/company/trust" itemprop="url">
<span class="navbar__item-icon" aria-hidden="true">
<span class="image-wrapper">
<img src="https://a.storyblok.com/f/185929/45x45/d01a1b10a9/icon-trust-security.svg" alt="icon trust and security lock pad" loading="lazy" width="45" height="45" />
</span>
</span>
<span class="navbar__item-label" itemprop="name">Trust and security</span>
</a>
</li>
</ul>
</div>
<div class="navbar__subsection">
<p class="navbar__subsection-title" id="dropdown-resources-publications">Publications</p>
<ul class="navbar__subsection-items" aria-labelledby="dropdown-resources-publications">
<li class="navbar__item">
<a class="navbar__item-link" href="https://octopus.com/publications/ai-pulse-report" itemprop="url">
<span class="navbar__item-label" itemprop="name">AI Pulse report</span>
</a>
</li>
<li class="navbar__item">
<a class="navbar__item-link" href="https://octopus.com/publications/compliance-through-continuous-delivery" itemprop="url">
<span class="navbar__item-label" itemprop="name">Compliance through CD</span>
</a>
</li>
<li class="navbar__item">
<a class="navbar__item-link" href="https://octopus.com/publications/platform-engineering-pulse" itemprop="url">
<span class="navbar__item-label" itemprop="name">Platform Engineering Pulse report</span>
</a>
</li>
<li class="navbar__item">
<a class="navbar__item-link" href="https://octopus.com/publications/state-of-gitops-report" itemprop="url">
<span class="navbar__item-label" itemprop="name">State of GitOps report</span>
</a>
</li>
<li class="navbar__item">
<a class="navbar__item-link" href="https://octopus.com/publications/argo-cd-best-practices" itemprop="url">
<span class="navbar__item-label" itemprop="name">Argo CD best practices</span>
</a>
</li>
<li class="navbar__item">
<a class="navbar__item-link" href="https://octopus.com/whitepapers/kubernetes-delivery-unlocked" itemprop="url">
<span class="navbar__item-label" itemprop="name">Kubernetes delivery unlocked</span>
</a>
</li>
<li class="navbar__item">
<a class="navbar__item-link" href="https://octopus.com/publications" itemprop="url">
<span class="navbar__item-label" itemprop="name">View all publications</span>
</a>
</li>
</ul>
</div>
<svg class="icon icon--marker-navbar" xmlns="http://www.w3.org/2000/svg" width="32" height="15" viewBox="0 0 32 15" fill="none">
<path d="M13.8787 1.12132L0 15H32L18.1213 1.12132C16.9497 -0.0502526 15.0503 -0.050255 13.8787 1.12132Z" fill="white"/>
</svg>
</nav>
<nav class="navbar__dropdown" id="dropdown-company" data-navbar-dropdown aria-label="Company">
<button type="button" class="navbar__back-btn" data-navbar-back aria-label="Back to menu">
<svg class="icon icon--chevron-navbar" width="13" height="8" viewBox="0 0 13 8" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M1.98755 1.5L6.98755 6.5L11.9875 1.5" stroke="#303E49" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
<span>Back</span>
</button>
<div class="navbar__subsection">
<p class="navbar__subsection-title" id="dropdown-company-careers">Careers</p>
<ul class="navbar__subsection-items" aria-labelledby="dropdown-company-careers">
<li class="navbar__item">
<a class="navbar__item-link" href="https://octopus.com/company/careers" itemprop="url">
<span class="navbar__item-icon" aria-hidden="true">
<span class="image-wrapper">
<img src="https://a.storyblok.com/f/185929/45x45/91b747265a/icon-careers-join-us.svg" alt="icon person plus career join us" loading="lazy" width="45" height="45" />
</span>
</span>
<span class="navbar__item-label" itemprop="name">Join us</span>
</a>
</li>
<li class="navbar__item">
<a class="navbar__item-link" href="https://handbook.octopus.com/" target="_blank" rel="noopener noreferrer" itemprop="url">
<span class="navbar__item-icon" aria-hidden="true">
<span class="image-wrapper">
<img src="https://a.storyblok.com/f/185929/45x45/94e4d7a548/icon-company-handbook.svg" alt="icon octopus handbook book" loading="lazy" width="45" height="45" />
</span>
</span>
<span class="navbar__item-label" itemprop="name">Company handbook</span>
</a>
</li>
</ul>
</div>
<div class="navbar__subsection">
<p class="navbar__subsection-title" id="dropdown-company-explore">Explore</p>
<ul class="navbar__subsection-items" aria-labelledby="dropdown-company-explore">
<li class="navbar__item">
<a class="navbar__item-link" href="https://octopus.com/company" itemprop="url">
<span class="navbar__item-label" itemprop="name">About us</span>
</a>
</li>
<li class="navbar__item">
<a class="navbar__item-link" href="https://octopus.com/company/contact" itemprop="url">
<span class="navbar__item-label" itemprop="name">Contact us</span>
</a>
</li>
<li class="navbar__item">
<a class="navbar__item-link" href="https://octopus.com/news" itemprop="url">
<span class="navbar__item-label" itemprop="name">News and media</span>
</a>
</li>
<li class="navbar__item">
<a class="navbar__item-link" href="https://octopus.com/events" itemprop="url">
<span class="navbar__item-label" itemprop="name">Events</span>
</a>
</li>
<li class="navbar__item">
<a class="navbar__item-link" href="https://octopus.com/partners" itemprop="url">
<span class="navbar__item-label" itemprop="name">Our partners</span>
</a>
</li>
<li class="navbar__item">
<a class="navbar__item-link" href="https://shop.octopus.com/" target="_blank" rel="noopener noreferrer" itemprop="url">
<span class="navbar__item-label" itemprop="name">Swag</span>
</a>
</li>
</ul>
</div>
<svg class="icon icon--marker-navbar" xmlns="http://www.w3.org/2000/svg" width="32" height="15" viewBox="0 0 32 15" fill="none">
<path d="M13.8787 1.12132L0 15H32L18.1213 1.12132C16.9497 -0.0502526 15.0503 -0.050255 13.8787 1.12132Z" fill="white"/>
</svg>
</nav>
<nav class="navbar__dropdown" id="dropdown-user" data-navbar-profile-dropdown aria-label="User profile">
<button type="button" class="navbar__back-btn" data-navbar-back aria-label="Back to menu">
<svg class="icon icon--chevron-navbar" width="13" height="8" viewBox="0 0 13 8" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M1.98755 1.5L6.98755 6.5L11.9875 1.5" stroke="#303E49" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
<span>Back</span>
</button>
<p class="navbar__panel-title" data-navbar-user-title>User</p>
<div class="navbar__subsection">
<ul class="navbar__subsection-items">
<li class="navbar__item">
<a class="navbar__item-link" href="https://billing.octopus.com" itemprop="url">
<span class="navbar__item-icon" aria-hidden="true">
<span class="image-wrapper">
<svg xmlns="http://www.w3.org/2000/svg" width="45" height="45"><rect width="45" height="45" rx="8.9" fill="#f4f6f8"/><path d="M29.4 20.7l-.3.5c-.1.2-.3.3-.5.2-.4-.2-.8-.4-1.2-.7-.2-.1-.2-.4-.1-.6l.3-.5-.6-1h-.6c-.2 0-.4-.2-.4-.4v-1.3c0-.2.2-.4.4-.4h.6c.1-.4.3-.7.6-1l-.3-.5c-.1-.2 0-.4.1-.6.3-.3.7-.5 1.2-.7.2 0 .4 0 .5.2l.3.5h1.1l.3-.5c.1-.2.3-.3.5-.2.4.2.8.4 1.2.7.2.1.2.4.1.6l-.3.5.6 1h.6c.2 0 .4.2.4.4v1.3c0 .2-.2.4-.4.4h-.6c-.1.4-.3.7-.6 1l.3.5c.1.2 0 .4-.1.6-.3.3-.7.5-1.2.7-.2 0-.4 0-.5-.2l-.3-.5h-1.1zm-.4-2.1c1.4 1 3-.5 1.9-1.9-1.4-1-3 .5-1.9 1.9zm-4.1 5.5l1.2.6c.4.2.5.6.4 1-.3.9-.9 1.6-1.5 2.3-.3.3-.7.4-1.1.2l-1-.6c-.6.5-1.2.9-2 1.1v1.2c0 .4-.3.8-.7.8-.9.1-1.8.2-2.7 0-.4 0-.7-.4-.7-.8v-1.2c-.7-.3-1.4-.6-2-1.1l-1 .6c-.4.2-.8.1-1.1-.2-.6-.7-1.2-1.5-1.5-2.3-.1-.4 0-.8.4-1l1.2-.6c-.1-.7-.1-1.5 0-2.2l-1.2-.6c-.4-.2-.5-.6-.4-1 .3-.9.9-1.6 1.5-2.3.3-.3.7-.4 1.1-.2l1 .6c.6-.5 1.2-.9 2-1.1v-1.2c0-.4.3-.8.7-.8.9-.1 1.8-.2 2.7 0 .4 0 .7.4.7.8v1.2c.7.3 1.4.6 2 1.1l1-.6c.4-.2.8-.1 1.1.2.6.7 1.2 1.5 1.5 2.3.1.4 0 .8-.4 1l-1.2.6c.1.7.1 1.5 0 2.2zm-4.2.7c2.1-2.7-1-5.8-3.8-3.7-2.1 2.7 1 5.8 3.8 3.7zm8.7 6.4l-.3.5c-.1.2-.3.3-.5.2-.4-.2-.8-.4-1.2-.7-.2-.1-.2-.4-.1-.6l.3-.5-.6-1h-.6c-.2 0-.4-.2-.4-.4v-1.3c0-.2.2-.4.4-.4h.6c.1-.4.3-.7.6-1l-.3-.5c-.1-.2 0-.4.1-.6.3-.3.7-.5 1.2-.7.2 0 .4 0 .5.2l.3.5h1.1l.3-.5c.1-.2.3-.3.5-.2.4.2.8.4 1.2.7.2.1.2.4.1.6l-.3.5.6 1h.6c.2 0 .4.2.4.4v1.3c0 .2-.2.4-.4.4h-.6c-.1.4-.3.7-.6 1l.3.5c.1.2 0 .4-.1.6-.3.3-.7.5-1.2.7-.2 0-.4 0-.5-.2l-.3-.5h-1.1zm-.4-2c1.4 1 3-.5 1.9-1.9-1.4-1-3 .5-1.9 1.9z" fill="#282f38"/></svg>
</span>
</span>
<span class="navbar__item-label" itemprop="name">Control Center</span>
</a>
</li>
<li class="navbar__item">
<a class="navbar__item-link" href="https://octopus.com/profile" itemprop="url">
<span class="navbar__item-icon" aria-hidden="true">
<span class="image-wrapper">
<svg xmlns="http://www.w3.org/2000/svg" width="45" height="45"><rect width="45" height="45" rx="8.9" fill="#f4f6f8"/><path d="M22.5 9C15 9 9 15 9 22.5S15 36 22.5 36 36 30 36 22.5 30 9 22.5 9zm0 5.2c2.6 0 4.8 2.1 4.8 4.8s-2.1 4.8-4.8 4.8-4.8-2.1-4.8-4.8 2.1-4.8 4.8-4.8zm0 18.8c-3.2 0-6.1-1.4-8-3.7 1-1.9 3-3.3 5.4-3.3h.4c.7.2 1.4.4 2.2.4s1.5-.1 2.2-.4h.4c2.3 0 4.3 1.3 5.4 3.3-1.9 2.3-4.8 3.7-8 3.7z" fill="#282f38"/></svg>
</span>
</span>
<span class="navbar__item-label" itemprop="name">Profile</span>
</a>
</li>
<li class="navbar__item">
<a class="navbar__item-link" href="https://octopus.com/signout" data-navbar-signout itemprop="url">
<span class="navbar__item-icon" aria-hidden="true">
<span class="image-wrapper">
<svg xmlns="http://www.w3.org/2000/svg" width="45" height="45"><rect width="45" height="45" rx="8.9" fill="#f4f6f8"/><path d="M33.5,23.1l-7.7,7.4c-.7.7-1.9.2-1.9-.8v-4.2h-6.2c-.6,0-1.1-.5-1.1-1.1v-4.2c0-.6.5-1.1,1.1-1.1h6.2v-4.2c0-.9,1.2-1.4,1.9-.8l7.7,7.4c.4.4.4,1.1,0,1.5ZM19.6,30.3v-1.8c0-.3-.2-.5-.5-.5h-3.8c-.8,0-1.5-.6-1.5-1.4v-8.5c0-.8.7-1.4,1.5-1.4h3.8c.3,0,.5-.2.5-.5v-1.8c0-.3-.2-.5-.5-.5h-3.8c-2.4,0-4.4,1.9-4.4,4.2v8.5c0,2.3,2,4.2,4.4,4.2h3.8c.3,0,.5-.2.5-.5Z" fill="#282f38"/></svg>
</span>
</span>
<span class="navbar__item-label" itemprop="name">Sign out</span>
</a>
</li>
</ul>
</div>
<svg class="icon icon--marker-navbar" xmlns="http://www.w3.org/2000/svg" width="32" height="15" viewBox="0 0 32 15" fill="none">
<path d="M13.8787 1.12132L0 15H32L18.1213 1.12132C16.9497 -0.0502526 15.0503 -0.050255 13.8787 1.12132Z" fill="white"/>
</svg>
</nav>
</div>
</nav>
</div> <div class="content-group anim-show-parent"> <main id="site-main"> <nav class="site-breadcrumbs" aria-label="Breadcrumb"> <ol> <li> <a href="/blog" aria-current="false"> <span>Blog</span> </a> </li> <li> <a href="/blog/safe-schema-updates-8-strangling-the-monolith" aria-current="page"> <span>Safe schema updates - Strangling the monolith</span> </a> </li> </ol> </nav> <article itemscope itemtype="https://schema.org/Article"> <header class="header__wrapper"> <figure class="image" data-image> <img src="/blog/i/x/cover/monolith-architecture-change.png" srcset="/blog/i/600/cover/monolith-architecture-change.webp 600w, /blog/i/1000/cover/monolith-architecture-change.webp 1000w, /blog/i/2000/cover/monolith-architecture-change.webp 1500w" sizes="(min-width: 1680px) 1000px, (min-width: 940px) calc(71.81vw - 192px), calc(100vw - 32px)" alt="3 people building an unstable looking tower with blue blocks, beside 2 people building a stable, lower tower with blue blocks" class="image__img" width="1500" height="800" loading="eager" fetchpriority="high" decoding="sync"> </figure> <div class="header"> <h1 class="header__title">Safe schema updates - Strangling the monolith</h1> </div> </header> <div class="page-content anim-show-parent" itemprop="articleBody"> <div class="author"> <a href="/blog/authors/alex-yates/1/" class="author__image-link"> <img class="author__image" srcset="/blog/i/600/authors/alex-yates.webp 600w, /blog/i/1000/authors/alex-yates.webp 646w" sizes="170px" src="/blog/i/x/authors/alex-yates.png" alt="Alex Yates" width="646" height="647"> </a> <div class="author__info"> <span class="author__name"> <a href="/blog/authors/alex-yates/1/"> <span> Alex Yates </span> </a> </span> <time class="author__time" datetime="Wed Dec 08 2021 00:00:00 GMT+0000 (Coordinated Universal Time)"> December 8, 2021 </time> </div> </div> <p>This blog post is part 8, and the final post, of my safe schema updates series.</p>
<p><strong>Critiquing existing systems:</strong></p>
<ul>
<li><a href="/blog/safe-schema-updates-1-delivery-hell">Part 1: Database delivery hell</a></li>
</ul>
<p><strong>Imagining better systems:</strong></p>
<ul>
<li><a href="/blog/safe-schema-updates-2-resilience-vs-robustness">Part 2: Resilient vs robust IT systems</a></li>
<li><a href="/blog/safe-schema-updates-3-ci-is-misunderstood">Part 3: Continuous Integration is misunderstood</a></li>
<li><a href="/blog/safe-schema-updates-4-loose-coupling-mitigates-tech-problems">Part 4: Loose coupling mitigates tech problems</a></li>
<li><a href="/blog/safe-schema-updates-5-loose-coupling-mitigates-human-problems">Part 5: Loose coupling mitigates human problems</a></li>
</ul>
<p><strong>Building better systems:</strong></p>
<ul>
<li><a href="/blog/safe-schema-updates-6-provisioning-databases">Part 6: Provisioning dev/test databases</a></li>
<li><a href="/blog/safe-schema-updates-7-near-zero-downtime-deployments">Part 7: Near-zero downtime database deployments</a></li>
<li><a href="/blog/safe-schema-updates-8-strangling-the-monolith">Part 8: Strangling the monolith</a></li>
</ul>
<p>So far in this series we’ve talked at length about the benefits of embracing a more loosely coupled architecture, where sub-systems manage their own data. By hiding the database internals for each sub-system, and forcing all communication to go through some messaging bus or API gateway, we avoid the dependency nightmares discussed in database delivery hell. We also allow sub-systems to be managed and updated independently, reducing governance overhead, and simplifying both provisioning and delivery challenges.</p>
<p>In the last post <a href="/blog/safe-schema-updates-1-delivery-hell">we discussed patterns for safe, near-zero downtime releases</a>, with fast and reliable rollback options. You’re armed with the motivation and tooling, but we’ve not discussed any guiding strategy for planning the refactor from tight coupling to loose coupling.</p>
<p>This post aims to provide a broad overview about how to manage the whole process. As the title suggests, we’ll discuss <a href="https://martinfowler.com/bliki/StranglerFigApplication.html">the strangler pattern</a>, but we’ll also touch on other patterns including:</p>
<ul>
<li><a href="/blog/devops-reading-list#ddd">Domain driven design</a></li>
<li><a href="https://martinfowler.com/bliki/BranchByAbstraction.html">Branching by abstraction</a></li>
<li><a href="https://martinfowler.com/bliki/DarkLaunching.html">Dark launching</a></li>
</ul>
<p>Before we go any further, let’s set some expectations: This isn’t easy, and it’s not a silver bullet. This is going to require plenty of time/investment, it’s something you’ll probably pick away at in phases, and there are trade-offs that need to be considered.</p>
<p>There’s no such thing as a free lunch.</p>
<h2 id="the-strangler-pattern">The strangler pattern</h2>
<p>Let’s imagine a typical dependency nightmare.</p>
<figure>
<p><img src="/blog/i/x/safe-schema-updates-8-strangling-the-monolith/strangler0.png" alt="Example monolithic architecture" loading="lazy" srcset="/blog/i/600/safe-schema-updates-8-strangling-the-monolith/strangler0.webp 537w" sizes="(min-width: 1680px) 1000px, (min-width: 940px) calc(71.81vw - 192px), calc(100vw - 32px)" class="resp-img" width="537" height="388"></p>
</figure>
<p>This architecture was the result of many years of accumulated tight deadlines, short-term planning, <a href="https://martinfowler.com/bliki/TechnicalDebt.html">technical debt</a>, knowledge hoarding, and staff turnover. Information sharing is hard at the best of times, but the existing team is looking at this without the benefits of perfect knowledge, reliable docs, or a mature test suite.</p>
<p>This system is valuable. Somewhere in that tangled web is the company’s “cash cow” product and a bunch of critical internal systems, but there’s also a long tail of forgotten, half-baked “side-projects”, abandoned business projects, and retired functionality. It’s hard to see the wood for the trees.</p>
<p>We need to wrap this monolith in a strangler application. Like the Australian fig tree that inspired this architecture, our strangler application is a parasite that will smother its host, eventually killing it in the process.</p>
<p>We’ll start with a simple proxy.</p>
<figure>
<p><img src="/blog/i/x/safe-schema-updates-8-strangling-the-monolith/strangler1.png" alt="Monolith behind a proxy" loading="lazy" srcset="/blog/i/600/safe-schema-updates-8-strangling-the-monolith/strangler1.webp 600w, /blog/i/1000/safe-schema-updates-8-strangling-the-monolith/strangler1.webp 602w" sizes="(min-width: 1680px) 1000px, (min-width: 940px) calc(71.81vw - 192px), calc(100vw - 32px)" class="resp-img" width="602" height="503"></p>
</figure>
<p>At first this proxy does nothing more than capture all inbound calls and redirect them back to the intended destination. Functionally, we’ve not made any changes, but we are increasing the load on your network. Given that loosely coupled architectures put more stress on your network, it’s a good idea to discover and resolve any network challenges early, before we start doing anything more exciting.</p>
<p>Next, we decide on a slice of functionality we want to spin out into a separate service. Ideally, we’ve used domain driven design to inform our choice (see <a href="/blog/safe-schema-updates-4-loose-coupling-mitigates-tech-problems">post 4</a> and <a href="/blog/safe-schema-updates-5-loose-coupling-mitigates-human-problems">post 5</a> in this series for a recap on “DDD”). Perhaps the functionality we are building broadly (or completely) replaces functionality in one or more of the old components of the monolith. In either case, this is brand new code, with the internal code implementation hidden from other systems.</p>
<figure>
<p><img src="/blog/i/x/safe-schema-updates-8-strangling-the-monolith/strangler2.png" alt="Dark launch of new service" loading="lazy" srcset="/blog/i/600/safe-schema-updates-8-strangling-the-monolith/strangler2.webp 600w, /blog/i/1000/safe-schema-updates-8-strangling-the-monolith/strangler2.webp 602w" sizes="(min-width: 1680px) 1000px, (min-width: 940px) calc(71.81vw - 192px), calc(100vw - 32px)" class="resp-img" width="602" height="503"></p>
</figure>
<p>Note, at this point we have “deployed” the service in production, but it has not yet been “released”. (I’m using the definition of “deployment” and “release” from <a href="/blog/safe-schema-updates-7-near-zero-downtime-deployments">part 7</a>, where deployments are associated with copying files, but releases are about making changes available to end users.) This allows us to test our new code in production, without exposing it to our users, while the production traffic is still handled safely by the old code.</p>
<p>When we’ve tested the new code, we can “release” our new service with a config change in the proxy. If we detect any issues, we can roll our change back instantly by reverting our proxy config.</p>
<figure>
<p><img src="/blog/i/x/safe-schema-updates-8-strangling-the-monolith/strangler3.png" alt="Service still coupled at database layer" loading="lazy" srcset="/blog/i/600/safe-schema-updates-8-strangling-the-monolith/strangler3.webp 549w" sizes="(min-width: 1680px) 1000px, (min-width: 940px) calc(71.81vw - 192px), calc(100vw - 32px)" class="resp-img" width="549" height="457"></p>
</figure>
<p>Also note that for now, we are still using the original database. Our service will not truly be decoupled until we’ve broken that dependency. We now need to break up the database, using <a href="/blog/safe-schema-updates-7-near-zero-downtime-deployments">the expand contract pattern discussed in part 7</a>.</p>
<p>As a temporary measure we may need to set both the old and new versions of the application to update both the old database and the new database. Alternatively, we might need to create an additional data sync service to ensure that both databases are kept in sync.</p>
<figure>
<p><img src="/blog/i/x/safe-schema-updates-8-strangling-the-monolith/strangler4.png" alt="Two databases linked by a data sync service" loading="lazy" srcset="/blog/i/600/safe-schema-updates-8-strangling-the-monolith/strangler4.webp 543w" sizes="(min-width: 1680px) 1000px, (min-width: 940px) calc(71.81vw - 192px), calc(100vw - 32px)" class="resp-img" width="543" height="495"></p>
</figure>
<p>When we’re confident that we won’t need to perform a fast rollback using the proxy trick, we can start to carefully clean up after ourselves. If we can easily determine which parts of the monolith are now obsolete, we can try to remove them.</p>
<p>We only need to keep the data for our newly decoupled service in the old database (and any data sync applications) until we are confident that the new service is healthy and fully uncoupled. For example, we could monitor for reads/writes in the old database. Assuming all is quiet, we then rename our columns or tables and wait for the phone to ring. If no-one calls for a week or two, it’s probably reasonably safe to backup and drop the old columns as well as any data sync services.</p>
<figure>
<p><img src="/blog/i/x/safe-schema-updates-8-strangling-the-monolith/strangler5.png" alt="Our first fully decoupled service" loading="lazy" srcset="/blog/i/600/safe-schema-updates-8-strangling-the-monolith/strangler5.webp 546w" sizes="(min-width: 1680px) 1000px, (min-width: 940px) calc(71.81vw - 192px), calc(100vw - 32px)" class="resp-img" width="546" height="458"></p>
</figure>
<p>Now, our new service can be managed independently. It’s easier to work on because developers are free from the constant fear of breaking dependencies and the cognitive overhead associated with the rest of the system. They can run the service wherever they like and plan their deployment schedule independently, free from any bureaucracy associated with the broader monolith.</p>
<p>Similarly, the monolith itself just became a little bit simpler.</p>
<p>So far so good, but what if the application I want to extract is buried deep in the monolith? For example, what if it needs to serve internal requests from within the monolith?</p>
<h2 id="branch-by-abstraction">Branch by abstraction</h2>
<p>In our first example, we used a proxy to strangle the whole monolith, but for some internal component we could use some other application, module, or class as an abstraction point to capture all the internal requests. Then, as with our original proxy, we can use our abstraction application it to determine where to divert the traffic to.</p>
<figure>
<p><img src="/blog/i/x/safe-schema-updates-8-strangling-the-monolith/strangler6.png" alt="Using an abstraction application to dark launch another service" loading="lazy" srcset="/blog/i/600/safe-schema-updates-8-strangling-the-monolith/strangler6.webp 600w, /blog/i/1000/safe-schema-updates-8-strangling-the-monolith/strangler6.webp 602w" sizes="(min-width: 1680px) 1000px, (min-width: 940px) calc(71.81vw - 192px), calc(100vw - 32px)" class="resp-img" width="602" height="411"></p>
</figure>
<p>In this example, even after we clean up the old application and database, we still have a challenge. Our databases are still dependent upon each other. Hopefully we can refactor the system such that these dependencies are handled through the communication tier and the data crunching is done by the application itself. This would be advantageous for all the reasons discussed in this series. However, it’s not without trade-offs.</p>
<h2 id="data-consistency-vs-availability">Data consistency vs availability</h2>
<p>By fully decoupling these databases, in many ways our system will become safer and easier to manage. Smaller databases, with more firebreaks, that can be updated independently. We are climbing out of <a href="/blog/safe-schema-updates-1-delivery-hell">Dante’s Database Hell</a>.</p>
<p>However, aside from the development costs associated with the refactor, there is a not insignificant set of drawbacks with this architecture.</p>
<p>First, performance. Love or hate relational databases, it’s hard to deny that they are exceptionally well optimized for data processing. Well-written stored procedures can crunch numbers at ludicrous speed. Compared to the latency and network load associated with firing off a network request, pulling back a bunch of data, and processing it in the application tier there is no contest. Your tangled-web of database dependencies, for all it’s flaws, is likely to be very well optimized for this. You may have invested decades refining that optimization.</p>
<p>We can mitigate some of the performance problems by throwing some (probably much needed) investment at our network and developing sophisticated caching systems, but we need to be honest that even with a tonne of investment, it’s unlikely we’ll match the same sort of raw performance.</p>
<p>Our next problem is consistency. Foreign keys are lovely things. When all our data exists in a single relational database, we can use foreign keys to perform fast joins and enforce referential integrity. After our data is split across multiple, decoupled services, we (necessarily) sacrifice our ability to use traditional foreign keys across those services.</p>
<p>We can write our own foreign keys to allow us to perform joins across different services, but there’s still nothing to reliably enforce referential integrity. Love or hate relational databases, they are great at referential integrity. After several decades of the RDBMS being the dominant technology in the database space, it’s hard for a lot of us to imagine a world without it.</p>
<p>(And, for some use cases, we recommend holding on to it.)</p>
<p>Our existing monolith might be built based on the assumption of referential integrity. (Because why not in the era of RDBMS market dominance?) But it was probably also possible to build a more resilient system, rather than one that prioritizes robustness. (<a href="/blog/safe-schema-updates-2-resilience-vs-robustness">See part 2 for more detail on resilience vs robustness</a>.)</p>
<p>If our system was built to handle broken dependencies gracefully, could we accept the occasional broken record, in exchange for broader benefits associated with loose coupling? How could we handle those broken records? Perhaps there are some things we could do to find, monitor, fix, or remove them?</p>
<p>Before we go too far down that road, let’s take a moment to consider how we might end up in an inconsistent state in the first place. Well, one of the big new problems we face with a more distributed system is partitioning.</p>
<h2 id="partitioning">Partitioning</h2>
<p>Let’s imagine an e-commerce system with separate services for the shopping cart, stock inventory, and payment gateway. Let’s imagine a customer has added <a href="https://www.amazon.co.uk/Octopus-Reversible-Plushie-Double-Sided-Expressing/dp/B08XK1WZHK/">a cuddly Octopus toy</a> to their cart. The shopping cart service is running and the payment service is running so we can transact the order. However, the stock inventory service is down. We don’t know if we have it in stock.</p>
<p>This is a partition. This could not have occurred in a monolith. This is a problem unique to loosely coupled systems that hide their data.</p>
<p><em>(Attribution: This example, along with much of the inspiration for this post, comes from a talk by Sam Newman, the author of <a href="https://www.goodreads.com/en/book/show/22512931-building-microservices">Building Microservices</a>, at GoTo 2019.)</em></p>
<p><a href="https://www.youtube.com/watch?v=9I9GdSQ1bbM&#x26;start=2401">Monolith Decomposition Patterns</a></p>
<p>Do you sell the toy? On the one hand, you lose sales if you don’t process the order. On the other, you might upset your customer if you later need to go back and refund/apologize. You need to trade off consistency versus availability.</p>
<p>For many, the performance and consistency problems will be a painful pill to swallow. Honestly, this architecture may not suit all systems. These can be nasty problems to work through.</p>
<p>However, before giving up on the idea of loose coupling, consider the benefits. Remember the horrors of <a href="/blog/safe-schema-updates-1-delivery-hell">Dante’s Database Hell</a>? Remind yourself of the original diagram of our monolith from this post. Imagine how much easier it would be if we only managed to extract half of the functionality of your monolith into something that looked more like this.</p>
<figure>
<p><img src="/blog/i/x/safe-schema-updates-8-strangling-the-monolith/strangler7.png" alt="A loosely coupled software architecture" loading="lazy" srcset="/blog/i/600/safe-schema-updates-8-strangling-the-monolith/strangler7.webp 600w, /blog/i/1000/safe-schema-updates-8-strangling-the-monolith/strangler7.webp 602w" sizes="(min-width: 1680px) 1000px, (min-width: 940px) calc(71.81vw - 192px), calc(100vw - 32px)" class="resp-img" width="602" height="381"></p>
</figure>
<h2 id="series-summary">Series summary</h2>
<p>Thanks for sticking with me.</p>
<p>This series started as (what I thought was) a simple idea for a short post about zero downtime deployments. But it kept growing, and growing, and growing. I kept getting side-tracked down rabbit holes, adding another two-thousand words here or there. The first draft was ridiculously long and complicated. Apparently, my brain has become its own tangled web of dependencies.</p>
<p>It helped me to break my ideas down into manageable chunks.</p>
<p>Monoliths certainly have their benefits. (Perhaps I should write a book?) Microservices should not be seen as some perfect solution. They are not a golden bullet. As we discussed, they present a very real set of challenges, especially regarding data. The journey from monolith to microservices can be long and expensive. If you give up halfway you might be left in some horrible hybrid with all the challenges and few of the benefits.</p>
<p>However, the benefits are also enormous. Thinking back to <a href="/blog/safe-schema-updates-1-delivery-hell">Database Delivery Hell, way back in part one</a>, the status quo probably isn’t sustainable either. We need to use our own judgement to decide how far we want to go down this path.</p>
<p>Regardless of the architecture we strive toward, the technical practices discussed in this series will help. Self-service provisioning and near-zero downtime deployment patterns bring significant benefits with respect to service resilience, both in tightly coupled and loosely coupled systems. (But like most things, they are especially beneficial and practical in smaller and more loosely coupled systems.)</p>
<p>Good luck, whatever course you decide to take.</p>
<h2 id="further-reading">Further reading</h2>
<p>If you would like to learn more about the topics in this post, I recommend watching Sam Newman’s talk (above).</p>
<p>If you’d like to go deeper into the concepts discussed during this series, the following books are a great place to start:</p>
<ul>
<li>
<p><strong>The business case for making these changes:</strong>
<a href="/blog/devops-reading-list#accelerate">Accelerate</a></p>
</li>
<li>
<p><strong>Managing data in the era of resilience over robustness:</strong>
<a href="/blog/devops-reading-list#dre">Database Reliability Engineering</a></p>
</li>
<li>
<p><strong>For more information about CI/CD:</strong>
<a href="/blog/devops-reading-list#cd">Continuous Delivery</a></p>
</li>
<li>
<p><strong>Putting domain-driven design into practice, to enable loose coupling:</strong>
<a href="/blog/devops-reading-list#ddd">Domain Driven Design Distilled</a></p>
</li>
<li>
<p><strong>Beyond expand/contract: database refactoring patterns:</strong>
<a href="https://www.goodreads.com/book/show/161302.Refactoring_Databases">Refactoring Databases: Evolutionary Database Design</a></p>
</li>
<li>
<p><strong>For more information about microservices:</strong>
<a href="https://www.goodreads.com/en/book/show/22512931-building-microservices">Building Microservices: Designing Fine-Grained Systems</a></p>
</li>
</ul>
<p>Links to the other posts in this series are available below:</p>
<p><strong>Critiquing existing systems:</strong></p>
<ul>
<li><a href="/blog/safe-schema-updates-1-delivery-hell">Part 1: Database delivery hell</a></li>
</ul>
<p><strong>Imagining better systems:</strong></p>
<ul>
<li><a href="/blog/safe-schema-updates-2-resilience-vs-robustness">Part 2: Resilient vs robust IT systems</a></li>
<li><a href="/blog/safe-schema-updates-3-ci-is-misunderstood">Part 3: Continuous Integration is misunderstood</a></li>
<li><a href="/blog/safe-schema-updates-4-loose-coupling-mitigates-tech-problems">Part 4: Loose coupling mitigates tech problems</a></li>
<li><a href="/blog/safe-schema-updates-5-loose-coupling-mitigates-human-problems">Part 5: Loose coupling mitigates human problems</a></li>
</ul>
<p><strong>Building better systems:</strong></p>
<ul>
<li><a href="/blog/safe-schema-updates-6-provisioning-databases">Part 6: Provisioning dev/test databases</a></li>
<li><a href="/blog/safe-schema-updates-7-near-zero-downtime-deployments">Part 7: Near-zero downtime database deployments</a></li>
<li><a href="/blog/safe-schema-updates-8-strangling-the-monolith">Part 8: Strangling the monolith</a></li>
</ul>
<h2 id="watch-the-webinars">Watch the webinars</h2>
<p>Our first webinar, Imagining better systems, discussed how loosely coupled architectures lead to maintainability, innovation, and safety.</p>
<p>Part two, Building better systems, discussed how to transition a mature system from one architecture to another.</p>
<h3 id="database-devops-imagining-better-systems">Database DevOps: Imagining better systems</h3>
<p><a href="https://www.youtube.com/watch?v=oJAbUMZ6bQY">Database DevOps - Imagining a better way</a></p>
<h3 id="database-devops-building-better-systems">Database DevOps: Building better systems</h3>
<p><a href="https://www.youtube.com/watch?v=joogIAcqMYo">Database DevOps - Building Better systems</a></p>
<p>Happy deployments!</p> <!-- <Feedback
frontmatter={frontmatter}
headings={headings}
lang={lang}
/> --> <div class="post-taxonomy"> <div class="post-tag"> <h2>Tags: </h2> <ul itemprop="keywords"> <li> <a href="/blog/tag/devops/1/">DevOps</a> </li><li> <a href="/blog/tag/database-deployments/1/">Database Deployments</a> </li><li> <a href="/blog/tag/deployment-patterns/1/">Deployment Patterns</a> </li> </ul> </div> </div> <div class="author"> <a href="/blog/authors/alex-yates/1/" class="author__image-link"> <img class="author__image" srcset="/blog/i/600/authors/alex-yates.webp 600w, /blog/i/1000/authors/alex-yates.webp 646w" sizes="170px" src="/blog/i/x/authors/alex-yates.png" alt="Alex Yates" width="646" height="647"> </a> <div class="author__info"> <span class="author__name" itemprop="author" itemscope itemtype="https://schema.org/Person"> <a href="/blog/authors/alex-yates/1/" itemprop="url"> <span itemprop="name"> Alex Yates </span> </a> </span> <time class="author__time" datetime="Wed Dec 08 2021 00:00:00 GMT+0000 (Coordinated Universal Time)" itemprop="datePublished"> Published: December 8, 2021 </time> </div> </div> </div> <h3>Related posts</h3> <div class="simple-grid-3"> <article class="card card--padded"> <a href="/blog/octo-easy-mode-23-runbookwebhooks" class="card__link" role="link" aria-label="Open Octopus Easy Mode - Runbook Webhooks"> <div class="card__image-wrapper"> <img srcset="/blog/i/600/cover/blog-ai-introducing-octopus-ai-assistant.webp 600w, /blog/i/1000/cover/blog-ai-introducing-octopus-ai-assistant.webp 750w" sizes="254px" src="/blog/i/x/cover/blog-ai-introducing-octopus-ai-assistant.png" width="750" height="400" alt="The image shows an isometric illustration of a central octopus-like icon connected to multiple brain icons in a hub-and-spoke network pattern against a purple-to-blue gradient background." class="card__image" onerror="this.src='https://i.octopus.com/library/step-templates/other.png';" loading="lazy"> </div> <div class="card__copy"> <p class="card__title">Octopus Easy Mode - Runbook Webhooks</p> <p class="card__description">Learn how to create runbook webhook triggers</p> <div class="card__meta"> <div class="card__authors"> <div class="author"> <img class="author__image" srcset="/blog/i/600/authors/matthew-casperson.webp 140w" sizes="170px" src="/blog/i/x/authors/matthew-casperson.png" alt="Matthew Casperson" width="140" height="140"> <div class="author__info"> <span class="author__name"> <span> Matthew Casperson </span> </span> <time class="author__time" datetime="2026-09-01"> September 1, 2026 </time> </div> </div> </div> </div> </div> </a> </article><article class="card card--padded"> <a href="/blog/the-hotfix-myth" class="card__link" role="link" aria-label="Open Debunking the hotfix pipeline myth"> <div class="card__image-wrapper"> <img srcset="/blog/i/600/cover/devops-golden-paths.webp 600w, /blog/i/1000/cover/devops-golden-paths.webp 750w" sizes="254px" src="/blog/i/x/cover/devops-golden-paths.png" width="750" height="400" alt="Stylized image of DevOps infinity symbol with a car driving on it and increasing speed over golden arrows." class="card__image" onerror="this.src='https://i.octopus.com/library/step-templates/other.png';" loading="lazy"> </div> <div class="card__copy"> <p class="card__title">Debunking the hotfix pipeline myth</p> <p class="card__description">Why it is more important to making the default pipelines as fast and as efficient as possible over hotfix pipelines.</p> <div class="card__meta"> <div class="card__authors"> <div class="author"> <img class="author__image" srcset="/blog/i/600/authors/bob-walker.webp 140w" sizes="170px" src="/blog/i/x/authors/bob-walker.png" alt="Bob Walker" width="140" height="140"> <div class="author__info"> <span class="author__name"> <span> Bob Walker </span> </span> <time class="author__time" datetime="2026-08-27"> August 27, 2026 </time> </div> </div> </div> </div> </div> </a> </article><article class="card card--padded"> <a href="/blog/inside-platform-engineering-nigel-douglas" class="card__link" role="link" aria-label="Open Inside Platform Engineering with Nigel Douglas"> <div class="card__image-wrapper"> <img srcset="/blog/i/600/cover/blog-img-inside-platform-engineering-nigel-douglas.webp 600w, /blog/i/1000/cover/blog-img-inside-platform-engineering-nigel-douglas.webp 750w" sizes="254px" src="/blog/i/x/cover/blog-img-inside-platform-engineering-nigel-douglas.png" width="750" height="400" alt="A photograph of Nigel Douglas surrounded by a circular blue and purple frame." class="card__image" onerror="this.src='https://i.octopus.com/library/step-templates/other.png';" loading="lazy"> </div> <div class="card__copy"> <p class="card__title">Inside Platform Engineering with Nigel Douglas</p> <p class="card__description">A conversation with Nigel Douglas on dependencies, supply chain attacks, and why most teams can&#39;t list everything holding their software together.</p> <div class="card__meta"> <div class="card__authors"> <div class="author"> <img class="author__image" srcset="/blog/i/600/authors/matthew-allford.webp 512w" sizes="170px" src="/blog/i/x/authors/matthew-allford.png" alt="Matthew Allford" width="512" height="512"> <div class="author__info"> <span class="author__name"> <span> Matthew Allford </span> </span> <time class="author__time" datetime="2026-08-21"> August 21, 2026 </time> </div> </div> </div> </div> </div> </a> </article> </div> <div class="newsletter"> <h2>Newsletter</h2> <p>
Join ~80,000 DevOps professionals and sign up for the latest Octopus news,
events, and opinions. No spam. Unsubscribe at any time.
</p> <form id="mktoForm_1062" class="newsletter__form"></form> <script>(function(){const formId = 1062;
const dreamdataTrackingId = undefined;
(() => {
const formEl = document.getElementById(`mktoForm_${formId}`);
if (!formEl) {
return;
}
// Load the 134 KB Marketo library once per page, shared across every form
const loadMarketo = () => {
if (!window.__marketoLoader) {
window.__marketoLoader = new Promise((resolve, reject) => {
const script = document.createElement('script');
script.src = 'https://get.octopus.com/js/forms2/js/forms2.min.js';
script.onload = resolve;
script.onerror = () => reject(new Error('Failed to load MktoForms2'));
document.head.appendChild(script);
});
}
return window.__marketoLoader;
};
const initForm = async () => {
try {
await loadMarketo();
} catch (error) {
console.error(error);
// Drop the cached rejected promise so a later form instance can retry
window.__marketoLoader = undefined;
// Collapse any space reserved for this form so a blocked or failed
// load does not leave an empty box (no-op when there is no wrapper)
formEl.closest('.newsletter')?.style.setProperty('display', 'none');
return;
}
// @ts-ignore - no global type for MktoForms2
if (typeof MktoForms2 === 'undefined' || !MktoForms2.loadForm) {
console.error('MktoForms2 is not available after loading.');
return;
}
// @ts-ignore
MktoForms2.loadForm(
'//get.octopus.com',
'271-BEX-827',
formId,
(form) => {
const formElem = form.getFormElem()[0];
if (!(formElem instanceof HTMLElement)) {
console.error(
'Expected a DOM element but got something else',
formElem
);
return;
}
formElem.querySelectorAll('style').forEach((style) => style.remove());
const baseStyle = document.getElementById('mktoForms2BaseStyle');
if (baseStyle) {
baseStyle.remove();
}
formElem.removeAttribute('style');
formElem
.querySelectorAll('.mktoTextField')
.forEach((el) => el.classList.add('form-control'));
formElem
.querySelectorAll('.mktoEmailField')
.forEach((el) => el.classList.add('form-control'));
formElem
.querySelectorAll('.mktoButton')
.forEach((el) => el.classList.add('button', 'button--primary'));
formElem
.querySelectorAll('.mktoAsterix')
.forEach((el) => el.remove());
formElem.querySelectorAll('.mktoOffset').forEach((el) => el.remove());
formElem
.querySelectorAll('.mktoFormCol, .mktoField, .mktoLabel')
.forEach((el) => el.removeAttribute('style'));
// Add Dreamdata tracking if configured
if (dreamdataTrackingId) {
form.onSuccess(function (values, followUpUrl) {
const email = values.Email || values.email;
if (typeof dreamdata !== 'undefined') {
try {
dreamdata.track(dreamdataTrackingId);
if (email) {
dreamdata.identify(null, { email: email });
}
} catch (error) {
console.warn('Dreamdata tracking failed:', error);
}
} else {
console.warn(
'Dreamdata not available for tracking:',
dreamdataTrackingId
);
}
if (followUpUrl) {
location.href = followUpUrl;
}
return followUpUrl ? false : true;
});
}
}
);
};
// The form is below the fold, so defer the library until the reader
// scrolls near it - keeps 134 KB off the critical path on every page.
// 600px of rootMargin starts the download early enough that the form is
// usually ready when it enters the viewport.
if ('IntersectionObserver' in window) {
const observer = new IntersectionObserver(
(entries) => {
if (entries.some((entry) => entry.isIntersecting)) {
observer.disconnect();
initForm();
}
},
{ rootMargin: '600px' }
);
observer.observe(formEl);
} else {
initForm();
}
})();
})();</script> </div> <meta itemprop="image" content="/blog/i/x/cover/monolith-architecture-change.png"> </article> </main> <nav class="site-nav" id="site-nav" aria-label="Site"> <div class="theme-switcher" data-theme-toggle> <input id="theme-switcher" type="checkbox" aria-checked="false" role="switch" aria-label="Toggle theme between light and dark mode" tabindex="-1" data-theme-toggle-checkbox> <label for="theme-switcher" class="theme-switcher__label" tabindex="0"> <span class="theme-switcher__icon theme-switcher__icon--light" aria-hidden="true"> <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none"> <path d="M12 2.40002C11.475 2.40002 11.1 2.81252 11.1 3.30002V5.70002C11.1 6.22502 11.475 6.60002 12 6.60002C12.4875 6.60002 12.9 6.22502 12.9 5.70002V3.30002C12.9 2.81252 12.4875 2.40002 12 2.40002ZM12 17.4C11.475 17.4 11.1 17.8125 11.1 18.3V20.7C11.1 21.225 11.475 21.6 12 21.6C12.4875 21.6 12.9 21.225 12.9 20.7V18.3C12.9 17.8125 12.4875 17.4 12 17.4ZM20.7 12.9C21.1875 12.9 21.6 12.525 21.6 12C21.6 11.5125 21.1875 11.1 20.7 11.1H18.3C17.775 11.1 17.4 11.5125 17.4 12C17.4 12.525 17.775 12.9 18.3 12.9H20.7ZM6.60002 12C6.60002 11.5125 6.18752 11.1 5.70002 11.1H3.30002C2.77502 11.1 2.40002 11.5125 2.40002 12C2.40002 12.525 2.77502 12.9 3.30002 12.9H5.70002C6.18752 12.9 6.60002 12.525 6.60002 12ZM18.7875 6.48752C19.125 6.15002 19.125 5.58752 18.7875 5.21252C18.4125 4.87502 17.85 4.87502 17.5125 5.21252L15.7875 6.93752C15.45 7.27502 15.45 7.83752 15.7875 8.21252C16.1625 8.55002 16.725 8.55002 17.0625 8.21252L18.7875 6.48752ZM8.17502 15.825C7.80002 15.4875 7.23752 15.4875 6.90002 15.825L5.21252 17.55C4.83752 17.8875 4.83752 18.45 5.21252 18.7875C5.55002 19.1625 6.11252 19.1625 6.45002 18.7875L8.17502 17.1C8.51252 16.7625 8.51252 16.2 8.17502 15.825ZM17.5125 18.7875C17.85 19.1625 18.4125 19.1625 18.7875 18.7875C19.125 18.45 19.125 17.8875 18.7875 17.55L17.0625 15.825C16.725 15.4875 16.1625 15.4875 15.7875 15.825C15.45 16.2 15.45 16.7625 15.7875 17.1L17.5125 18.7875ZM8.17502 8.21252C8.51252 7.83752 8.51252 7.27502 8.17502 6.93752L6.45002 5.21252C6.11252 4.87502 5.55002 4.87502 5.21252 5.21252C4.83752 5.58752 4.83752 6.15002 5.21252 6.48752L6.90002 8.21252C7.23752 8.55002 7.80002 8.55002 8.17502 8.21252ZM12 16.2C14.2875 16.2 16.2 14.325 16.2 12C16.2 9.71252 14.2875 7.80002 12 7.80002C9.67502 7.80002 7.80002 9.71252 7.80002 12C7.80002 14.325 9.67502 16.2 12 16.2Z" fill="white"></path> </svg>
Light
</span> <span class="switch-slider"></span> <span class="theme-switcher__icon theme-switcher__icon--dark" aria-hidden="true"> <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none"> <path d="M13.1625 3.59998C8.55005 3.59998 4.80005 7.38748 4.80005 12C4.80005 16.65 8.55005 20.4 13.1625 20.4C15.45 20.4 17.5125 19.5 19.0125 18.0375C19.2 17.85 19.2375 17.5875 19.125 17.325C19.0125 17.1 18.75 16.9875 18.4875 17.025C18.1125 17.1 17.7375 17.1 17.3625 17.1C13.725 17.1 10.7625 14.175 10.7625 10.5C10.7625 8.06248 12.1125 5.88748 14.1375 4.76248C14.3625 4.64998 14.475 4.38748 14.4 4.12498C14.3625 3.86248 14.1375 3.67498 13.875 3.63748C13.65 3.63748 13.3875 3.63748 13.1625 3.63748V3.59998Z" fill="white"></path> </svg>
Dark
</span> </label> </div> <h2 class="site-nav-title">Navigation</h2> <ul class="site-nav__list"> <li class="site-nav__list-item"> <a href="/blog" aria-current="false"> Blog home </a> </li> <li class="site-nav__list-item"> <a href="/blog/tag/product/1" aria-current="false"> Product </a> </li> <li class="site-nav__list-item"> <a href="/blog/tag/engineering/1" aria-current="false"> Engineering </a> </li> <li class="site-nav__list-item"> <a href="/blog/tag/devops/1" aria-current="false"> DevOps </a> </li> <li class="site-nav__list-item"> <a href="/blog/tag/company/1" aria-current="false"> Company </a> </li> <li class="site-nav__list-item"> <a href="/blog/search" aria-current="false"> Search </a> </li> </ul> </nav> <script type="module">
import { ThemeSwitcher } from '/blog/js/modules/theme-switcher.js';
document.addEventListener('DOMContentLoaded', function () {
const themeSwitchers = document.querySelectorAll('[data-theme-toggle]');
themeSwitchers.forEach((switcher) => new ThemeSwitcher(switcher));
});
</script> <div class="side-nav"> <nav class="article-nav" data-article-nav aria-label="Table of contents"> <details class="article-nav__details" open> <summary class="article-nav__title"> On this page </summary> <hr class="separator"> <ol class="article-nav__list"> <li class="article-nav__item article-nav__item--level-2"> <a href="#the-strangler-pattern" class="article-nav__link" data-article-link> The strangler pattern </a> </li><li class="article-nav__item article-nav__item--level-2"> <a href="#branch-by-abstraction" class="article-nav__link" data-article-link> Branch by abstraction </a> </li><li class="article-nav__item article-nav__item--level-2"> <a href="#data-consistency-vs-availability" class="article-nav__link" data-article-link> Data consistency vs availability </a> </li><li class="article-nav__item article-nav__item--level-2"> <a href="#partitioning" class="article-nav__link" data-article-link> Partitioning </a> </li><li class="article-nav__item article-nav__item--level-2"> <a href="#series-summary" class="article-nav__link" data-article-link> Series summary </a> </li><li class="article-nav__item article-nav__item--level-2"> <a href="#further-reading" class="article-nav__link" data-article-link> Further reading </a> </li><li class="article-nav__item article-nav__item--level-2"> <a href="#watch-the-webinars" class="article-nav__link" data-article-link> Watch the webinars </a> </li><li class="article-nav__item article-nav__item--level-3"> <a href="#database-devops-imagining-better-systems" class="article-nav__link" data-article-link> Database DevOps: Imagining better systems </a> </li><li class="article-nav__item article-nav__item--level-3"> <a href="#database-devops-building-better-systems" class="article-nav__link" data-article-link> Database DevOps: Building better systems </a> </li> </ol> </details> </nav> <script type="module">document.addEventListener(`DOMContentLoaded`,function(){let e=document.querySelector(`.article-nav__details`),t=()=>{e&&(window.innerWidth>=1130?e.setAttribute(`open`,``):e.removeAttribute(`open`))};t(),window.addEventListener(`resize`,t)});</script> </div> </div> <div data-shared-source="live" data-shared-fragment="footer" data-shared-note="fetched https://octopus.com/fragments/footer at 2026-09-11T10:55:57.544Z">
<footer class="footer footer-pu" itemscope itemtype="https://schema.org/WPFooter">
<div class="footer__content container">
<section class="footer__row footer__row--first" aria-label="Product and resource links">
<div class="footer__column">
<h3 class="footer__column-title" id="footer-first-platform" itemprop="name">Platform</h3>
<ul class="footer__items" aria-labelledby="footer-first-platform">
<li class="footer__item">
<a class="footer__item-link"
href="https://octopus.com/"
aria-label="Continuous Delivery platform"
itemprop="url">
<span class="footer__item-label" itemprop="name">
Continuous Delivery platform
<svg class="icon icon--button-link-arrow" xmlns='http://www.w3.org/2000/svg' width='14' height='15' viewBox='0 0 14 15' fill='none'><path d='M6.01228 1.80213L6.66634 1.13321C6.94328 0.849968 7.39111 0.849968 7.6651 1.13321L13.3925 6.98777C13.6695 7.27101 13.6695 7.72901 13.3925 8.00923L7.6651 13.8668C7.38816 14.15 6.94033 14.15 6.66634 13.8668L6.01228 13.1979C5.73239 12.9116 5.73828 12.4446 6.02406 12.1644L9.57424 8.70527L1.10685 8.70527C0.715007 8.70527 0.399764 8.38286 0.399764 7.98211L0.399764 7.0179C0.399764 6.61715 0.715008 6.29474 1.10685 6.29474L9.57424 6.29474L6.02407 2.83564C5.73534 2.55542 5.72945 2.08838 6.01228 1.80213Z' fill='#0D80D8'/></svg>
</span>
</a>
</li>
<li class="footer__item">
<a class="footer__item-link"
href="https://octopus.com/use-case/platform-hub"
aria-label="Platform Hub"
itemprop="url">
<span class="footer__item-label" itemprop="name">
Platform Hub
<svg class="icon icon--button-link-arrow" xmlns='http://www.w3.org/2000/svg' width='14' height='15' viewBox='0 0 14 15' fill='none'><path d='M6.01228 1.80213L6.66634 1.13321C6.94328 0.849968 7.39111 0.849968 7.6651 1.13321L13.3925 6.98777C13.6695 7.27101 13.6695 7.72901 13.3925 8.00923L7.6651 13.8668C7.38816 14.15 6.94033 14.15 6.66634 13.8668L6.01228 13.1979C5.73239 12.9116 5.73828 12.4446 6.02406 12.1644L9.57424 8.70527L1.10685 8.70527C0.715007 8.70527 0.399764 8.38286 0.399764 7.98211L0.399764 7.0179C0.399764 6.61715 0.715008 6.29474 1.10685 6.29474L9.57424 6.29474L6.02407 2.83564C5.73534 2.55542 5.72945 2.08838 6.01228 1.80213Z' fill='#0D80D8'/></svg>
</span>
</a>
</li>
<li class="footer__item">
<a class="footer__item-link"
href="https://octopus.com/ai-tools"
aria-label="AI tools"
itemprop="url">
<span class="footer__item-label" itemprop="name">
AI tools
<svg class="icon icon--button-link-arrow" xmlns='http://www.w3.org/2000/svg' width='14' height='15' viewBox='0 0 14 15' fill='none'><path d='M6.01228 1.80213L6.66634 1.13321C6.94328 0.849968 7.39111 0.849968 7.6651 1.13321L13.3925 6.98777C13.6695 7.27101 13.6695 7.72901 13.3925 8.00923L7.6651 13.8668C7.38816 14.15 6.94033 14.15 6.66634 13.8668L6.01228 13.1979C5.73239 12.9116 5.73828 12.4446 6.02406 12.1644L9.57424 8.70527L1.10685 8.70527C0.715007 8.70527 0.399764 8.38286 0.399764 7.98211L0.399764 7.0179C0.399764 6.61715 0.715008 6.29474 1.10685 6.29474L9.57424 6.29474L6.02407 2.83564C5.73534 2.55542 5.72945 2.08838 6.01228 1.80213Z' fill='#0D80D8'/></svg>
</span>
</a>
</li>
<li class="footer__item">
<a class="footer__item-link"
href="https://octopus.com/use-case/tenanted-deployments"
target="_blank"
rel="noopener noreferrer"
aria-label="Tenanted deployments (opens in new tab)"
itemprop="url">
<span class="footer__item-label" itemprop="name">
Tenanted deployments
<svg class="icon icon--button-link-arrow" xmlns='http://www.w3.org/2000/svg' width='14' height='15' viewBox='0 0 14 15' fill='none'><path d='M6.01228 1.80213L6.66634 1.13321C6.94328 0.849968 7.39111 0.849968 7.6651 1.13321L13.3925 6.98777C13.6695 7.27101 13.6695 7.72901 13.3925 8.00923L7.6651 13.8668C7.38816 14.15 6.94033 14.15 6.66634 13.8668L6.01228 13.1979C5.73239 12.9116 5.73828 12.4446 6.02406 12.1644L9.57424 8.70527L1.10685 8.70527C0.715007 8.70527 0.399764 8.38286 0.399764 7.98211L0.399764 7.0179C0.399764 6.61715 0.715008 6.29474 1.10685 6.29474L9.57424 6.29474L6.02407 2.83564C5.73534 2.55542 5.72945 2.08838 6.01228 1.80213Z' fill='#0D80D8'/></svg>
</span>
</a>
</li>
</ul>
</div>
<div class="footer__column">
<h3 class="footer__column-title" id="footer-first-resources" itemprop="name">Resources</h3>
<ul class="footer__items" aria-labelledby="footer-first-resources">
<li class="footer__item">
<a class="footer__item-link"
href="https://octopus.com/docs"
aria-label="Documentation"
itemprop="url">
<span class="footer__item-label" itemprop="name">
Documentation
<svg class="icon icon--button-link-arrow" xmlns='http://www.w3.org/2000/svg' width='14' height='15' viewBox='0 0 14 15' fill='none'><path d='M6.01228 1.80213L6.66634 1.13321C6.94328 0.849968 7.39111 0.849968 7.6651 1.13321L13.3925 6.98777C13.6695 7.27101 13.6695 7.72901 13.3925 8.00923L7.6651 13.8668C7.38816 14.15 6.94033 14.15 6.66634 13.8668L6.01228 13.1979C5.73239 12.9116 5.73828 12.4446 6.02406 12.1644L9.57424 8.70527L1.10685 8.70527C0.715007 8.70527 0.399764 8.38286 0.399764 7.98211L0.399764 7.0179C0.399764 6.61715 0.715008 6.29474 1.10685 6.29474L9.57424 6.29474L6.02407 2.83564C5.73534 2.55542 5.72945 2.08838 6.01228 1.80213Z' fill='#0D80D8'/></svg>
</span>
</a>
</li>
<li class="footer__item">
<a class="footer__item-link"
href="https://octopus.com/downloads"
aria-label="Download Octopus"
itemprop="url">
<span class="footer__item-label" itemprop="name">
Download Octopus
<svg class="icon icon--button-link-arrow" xmlns='http://www.w3.org/2000/svg' width='14' height='15' viewBox='0 0 14 15' fill='none'><path d='M6.01228 1.80213L6.66634 1.13321C6.94328 0.849968 7.39111 0.849968 7.6651 1.13321L13.3925 6.98777C13.6695 7.27101 13.6695 7.72901 13.3925 8.00923L7.6651 13.8668C7.38816 14.15 6.94033 14.15 6.66634 13.8668L6.01228 13.1979C5.73239 12.9116 5.73828 12.4446 6.02406 12.1644L9.57424 8.70527L1.10685 8.70527C0.715007 8.70527 0.399764 8.38286 0.399764 7.98211L0.399764 7.0179C0.399764 6.61715 0.715008 6.29474 1.10685 6.29474L9.57424 6.29474L6.02407 2.83564C5.73534 2.55542 5.72945 2.08838 6.01228 1.80213Z' fill='#0D80D8'/></svg>
</span>
</a>
</li>
<li class="footer__item">
<a class="footer__item-link"
href="https://octopus.com/publications"
aria-label="Publications"
itemprop="url">
<span class="footer__item-label" itemprop="name">
Publications
<svg class="icon icon--button-link-arrow" xmlns='http://www.w3.org/2000/svg' width='14' height='15' viewBox='0 0 14 15' fill='none'><path d='M6.01228 1.80213L6.66634 1.13321C6.94328 0.849968 7.39111 0.849968 7.6651 1.13321L13.3925 6.98777C13.6695 7.27101 13.6695 7.72901 13.3925 8.00923L7.6651 13.8668C7.38816 14.15 6.94033 14.15 6.66634 13.8668L6.01228 13.1979C5.73239 12.9116 5.73828 12.4446 6.02406 12.1644L9.57424 8.70527L1.10685 8.70527C0.715007 8.70527 0.399764 8.38286 0.399764 7.98211L0.399764 7.0179C0.399764 6.61715 0.715008 6.29474 1.10685 6.29474L9.57424 6.29474L6.02407 2.83564C5.73534 2.55542 5.72945 2.08838 6.01228 1.80213Z' fill='#0D80D8'/></svg>
</span>
</a>
</li>
<li class="footer__item">
<a class="footer__item-link"
href="https://octopus.com/blog"
aria-label="Blog"
itemprop="url">
<span class="footer__item-label" itemprop="name">
Blog
<svg class="icon icon--button-link-arrow" xmlns='http://www.w3.org/2000/svg' width='14' height='15' viewBox='0 0 14 15' fill='none'><path d='M6.01228 1.80213L6.66634 1.13321C6.94328 0.849968 7.39111 0.849968 7.6651 1.13321L13.3925 6.98777C13.6695 7.27101 13.6695 7.72901 13.3925 8.00923L7.6651 13.8668C7.38816 14.15 6.94033 14.15 6.66634 13.8668L6.01228 13.1979C5.73239 12.9116 5.73828 12.4446 6.02406 12.1644L9.57424 8.70527L1.10685 8.70527C0.715007 8.70527 0.399764 8.38286 0.399764 7.98211L0.399764 7.0179C0.399764 6.61715 0.715008 6.29474 1.10685 6.29474L9.57424 6.29474L6.02407 2.83564C5.73534 2.55542 5.72945 2.08838 6.01228 1.80213Z' fill='#0D80D8'/></svg>
</span>
</a>
</li>
</ul>
</div>
<div class="footer__column">
<h3 class="footer__column-title" id="footer-first-our-company" itemprop="name">Our company</h3>
<ul class="footer__items" aria-labelledby="footer-first-our-company">
<li class="footer__item">
<a class="footer__item-link"
href="https://octopus.com/company"
aria-label="About us"
itemprop="url">
<span class="footer__item-label" itemprop="name">
About us
<svg class="icon icon--button-link-arrow" xmlns='http://www.w3.org/2000/svg' width='14' height='15' viewBox='0 0 14 15' fill='none'><path d='M6.01228 1.80213L6.66634 1.13321C6.94328 0.849968 7.39111 0.849968 7.6651 1.13321L13.3925 6.98777C13.6695 7.27101 13.6695 7.72901 13.3925 8.00923L7.6651 13.8668C7.38816 14.15 6.94033 14.15 6.66634 13.8668L6.01228 13.1979C5.73239 12.9116 5.73828 12.4446 6.02406 12.1644L9.57424 8.70527L1.10685 8.70527C0.715007 8.70527 0.399764 8.38286 0.399764 7.98211L0.399764 7.0179C0.399764 6.61715 0.715008 6.29474 1.10685 6.29474L9.57424 6.29474L6.02407 2.83564C5.73534 2.55542 5.72945 2.08838 6.01228 1.80213Z' fill='#0D80D8'/></svg>
</span>
</a>
</li>
<li class="footer__item">
<a class="footer__item-link"
href="https://octopus.com/company/careers"
aria-label="Careers"
itemprop="url">
<span class="footer__item-label" itemprop="name">
Careers
<svg class="icon icon--button-link-arrow" xmlns='http://www.w3.org/2000/svg' width='14' height='15' viewBox='0 0 14 15' fill='none'><path d='M6.01228 1.80213L6.66634 1.13321C6.94328 0.849968 7.39111 0.849968 7.6651 1.13321L13.3925 6.98777C13.6695 7.27101 13.6695 7.72901 13.3925 8.00923L7.6651 13.8668C7.38816 14.15 6.94033 14.15 6.66634 13.8668L6.01228 13.1979C5.73239 12.9116 5.73828 12.4446 6.02406 12.1644L9.57424 8.70527L1.10685 8.70527C0.715007 8.70527 0.399764 8.38286 0.399764 7.98211L0.399764 7.0179C0.399764 6.61715 0.715008 6.29474 1.10685 6.29474L9.57424 6.29474L6.02407 2.83564C5.73534 2.55542 5.72945 2.08838 6.01228 1.80213Z' fill='#0D80D8'/></svg>
</span>
</a>
</li>
<li class="footer__item">
<a class="footer__item-link"
href="https://roadmap.octopus.com/tabs/1-under-consideration"
rel="noopener noreferrer"
aria-label="Roadmap (opens in new tab)"
itemprop="url">
<span class="footer__item-label" itemprop="name">
Roadmap
<svg class="icon icon--button-link-arrow" xmlns='http://www.w3.org/2000/svg' width='14' height='15' viewBox='0 0 14 15' fill='none'><path d='M6.01228 1.80213L6.66634 1.13321C6.94328 0.849968 7.39111 0.849968 7.6651 1.13321L13.3925 6.98777C13.6695 7.27101 13.6695 7.72901 13.3925 8.00923L7.6651 13.8668C7.38816 14.15 6.94033 14.15 6.66634 13.8668L6.01228 13.1979C5.73239 12.9116 5.73828 12.4446 6.02406 12.1644L9.57424 8.70527L1.10685 8.70527C0.715007 8.70527 0.399764 8.38286 0.399764 7.98211L0.399764 7.0179C0.399764 6.61715 0.715008 6.29474 1.10685 6.29474L9.57424 6.29474L6.02407 2.83564C5.73534 2.55542 5.72945 2.08838 6.01228 1.80213Z' fill='#0D80D8'/></svg>
</span>
</a>
</li>
<li class="footer__item">
<a class="footer__item-link"
href="https://ir.octopus.com/"
rel="noopener noreferrer"
aria-label="Investor relations (opens in new tab)"
itemprop="url">
<span class="footer__item-label" itemprop="name">
Investor relations
<svg class="icon icon--button-link-arrow" xmlns='http://www.w3.org/2000/svg' width='14' height='15' viewBox='0 0 14 15' fill='none'><path d='M6.01228 1.80213L6.66634 1.13321C6.94328 0.849968 7.39111 0.849968 7.6651 1.13321L13.3925 6.98777C13.6695 7.27101 13.6695 7.72901 13.3925 8.00923L7.6651 13.8668C7.38816 14.15 6.94033 14.15 6.66634 13.8668L6.01228 13.1979C5.73239 12.9116 5.73828 12.4446 6.02406 12.1644L9.57424 8.70527L1.10685 8.70527C0.715007 8.70527 0.399764 8.38286 0.399764 7.98211L0.399764 7.0179C0.399764 6.61715 0.715008 6.29474 1.10685 6.29474L9.57424 6.29474L6.02407 2.83564C5.73534 2.55542 5.72945 2.08838 6.01228 1.80213Z' fill='#0D80D8'/></svg>
</span>
</a>
</li>
<li class="footer__item">
<a class="footer__item-link"
href="https://octopus.com/company/brand"
aria-label="Brand guidelines"
itemprop="url">
<span class="footer__item-label" itemprop="name">
Brand guidelines
<svg class="icon icon--button-link-arrow" xmlns='http://www.w3.org/2000/svg' width='14' height='15' viewBox='0 0 14 15' fill='none'><path d='M6.01228 1.80213L6.66634 1.13321C6.94328 0.849968 7.39111 0.849968 7.6651 1.13321L13.3925 6.98777C13.6695 7.27101 13.6695 7.72901 13.3925 8.00923L7.6651 13.8668C7.38816 14.15 6.94033 14.15 6.66634 13.8668L6.01228 13.1979C5.73239 12.9116 5.73828 12.4446 6.02406 12.1644L9.57424 8.70527L1.10685 8.70527C0.715007 8.70527 0.399764 8.38286 0.399764 7.98211L0.399764 7.0179C0.399764 6.61715 0.715008 6.29474 1.10685 6.29474L9.57424 6.29474L6.02407 2.83564C5.73534 2.55542 5.72945 2.08838 6.01228 1.80213Z' fill='#0D80D8'/></svg>
</span>
</a>
</li>
</ul>
</div>
<div class="footer__column">
<h3 class="footer__column-title" id="footer-first-help-and-support" itemprop="name">Help and support</h3>
<ul class="footer__items" aria-labelledby="footer-first-help-and-support">
<li class="footer__item">
<a class="footer__item-link"
href="https://octopus.com/company/contact"
aria-label="Contact Sales"
itemprop="url">
<span class="footer__item-label" itemprop="name">
Contact Sales
<svg class="icon icon--button-link-arrow" xmlns='http://www.w3.org/2000/svg' width='14' height='15' viewBox='0 0 14 15' fill='none'><path d='M6.01228 1.80213L6.66634 1.13321C6.94328 0.849968 7.39111 0.849968 7.6651 1.13321L13.3925 6.98777C13.6695 7.27101 13.6695 7.72901 13.3925 8.00923L7.6651 13.8668C7.38816 14.15 6.94033 14.15 6.66634 13.8668L6.01228 13.1979C5.73239 12.9116 5.73828 12.4446 6.02406 12.1644L9.57424 8.70527L1.10685 8.70527C0.715007 8.70527 0.399764 8.38286 0.399764 7.98211L0.399764 7.0179C0.399764 6.61715 0.715008 6.29474 1.10685 6.29474L9.57424 6.29474L6.02407 2.83564C5.73534 2.55542 5.72945 2.08838 6.01228 1.80213Z' fill='#0D80D8'/></svg>
</span>
</a>
</li>
<li class="footer__item">
<a class="footer__item-link"
href="https://octopus.com/support"
aria-label="Support"
itemprop="url">
<span class="footer__item-label" itemprop="name">
Support
<svg class="icon icon--button-link-arrow" xmlns='http://www.w3.org/2000/svg' width='14' height='15' viewBox='0 0 14 15' fill='none'><path d='M6.01228 1.80213L6.66634 1.13321C6.94328 0.849968 7.39111 0.849968 7.6651 1.13321L13.3925 6.98777C13.6695 7.27101 13.6695 7.72901 13.3925 8.00923L7.6651 13.8668C7.38816 14.15 6.94033 14.15 6.66634 13.8668L6.01228 13.1979C5.73239 12.9116 5.73828 12.4446 6.02406 12.1644L9.57424 8.70527L1.10685 8.70527C0.715007 8.70527 0.399764 8.38286 0.399764 7.98211L0.399764 7.0179C0.399764 6.61715 0.715008 6.29474 1.10685 6.29474L9.57424 6.29474L6.02407 2.83564C5.73534 2.55542 5.72945 2.08838 6.01228 1.80213Z' fill='#0D80D8'/></svg>
</span>
</a>
</li>
<li class="footer__item">
<a class="footer__item-link"
href="https://octopus.com/upgrade"
aria-label="Upgrade"
itemprop="url">
<span class="footer__item-label" itemprop="name">
Upgrade
<svg class="icon icon--button-link-arrow" xmlns='http://www.w3.org/2000/svg' width='14' height='15' viewBox='0 0 14 15' fill='none'><path d='M6.01228 1.80213L6.66634 1.13321C6.94328 0.849968 7.39111 0.849968 7.6651 1.13321L13.3925 6.98777C13.6695 7.27101 13.6695 7.72901 13.3925 8.00923L7.6651 13.8668C7.38816 14.15 6.94033 14.15 6.66634 13.8668L6.01228 13.1979C5.73239 12.9116 5.73828 12.4446 6.02406 12.1644L9.57424 8.70527L1.10685 8.70527C0.715007 8.70527 0.399764 8.38286 0.399764 7.98211L0.399764 7.0179C0.399764 6.61715 0.715008 6.29474 1.10685 6.29474L9.57424 6.29474L6.02407 2.83564C5.73534 2.55542 5.72945 2.08838 6.01228 1.80213Z' fill='#0D80D8'/></svg>
</span>
</a>
</li>
<li class="footer__item">
<a class="footer__item-link"
href="https://octopus.com/company/trust"
aria-label="Security and legal"
itemprop="url">
<span class="footer__item-label" itemprop="name">
Security and legal
<svg class="icon icon--button-link-arrow" xmlns='http://www.w3.org/2000/svg' width='14' height='15' viewBox='0 0 14 15' fill='none'><path d='M6.01228 1.80213L6.66634 1.13321C6.94328 0.849968 7.39111 0.849968 7.6651 1.13321L13.3925 6.98777C13.6695 7.27101 13.6695 7.72901 13.3925 8.00923L7.6651 13.8668C7.38816 14.15 6.94033 14.15 6.66634 13.8668L6.01228 13.1979C5.73239 12.9116 5.73828 12.4446 6.02406 12.1644L9.57424 8.70527L1.10685 8.70527C0.715007 8.70527 0.399764 8.38286 0.399764 7.98211L0.399764 7.0179C0.399764 6.61715 0.715008 6.29474 1.10685 6.29474L9.57424 6.29474L6.02407 2.83564C5.73534 2.55542 5.72945 2.08838 6.01228 1.80213Z' fill='#0D80D8'/></svg>
</span>
</a>
</li>
<li class="footer__item">
<a class="footer__item-link"
href="https://oc.to/CommunitySlack"
rel="noopener noreferrer"
aria-label="Community Slack (opens in new tab)"
itemprop="url">
<span class="footer__item-label" itemprop="name">
Community Slack
<svg class="icon icon--button-link-arrow" xmlns='http://www.w3.org/2000/svg' width='14' height='15' viewBox='0 0 14 15' fill='none'><path d='M6.01228 1.80213L6.66634 1.13321C6.94328 0.849968 7.39111 0.849968 7.6651 1.13321L13.3925 6.98777C13.6695 7.27101 13.6695 7.72901 13.3925 8.00923L7.6651 13.8668C7.38816 14.15 6.94033 14.15 6.66634 13.8668L6.01228 13.1979C5.73239 12.9116 5.73828 12.4446 6.02406 12.1644L9.57424 8.70527L1.10685 8.70527C0.715007 8.70527 0.399764 8.38286 0.399764 7.98211L0.399764 7.0179C0.399764 6.61715 0.715008 6.29474 1.10685 6.29474L9.57424 6.29474L6.02407 2.83564C5.73534 2.55542 5.72945 2.08838 6.01228 1.80213Z' fill='#0D80D8'/></svg>
</span>
</a>
</li>
</ul>
</div>
</section>
<section class="footer__row footer__row--second" aria-label="Community and partners">
<div class="footer__column">
<h3 class="footer__column-title" id="footer-second-our-awards" itemprop="name">Our awards</h3>
<ul class="footer__items" aria-labelledby="footer-second-our-awards">
<li class="footer__item">
<a class="footer__item-link"
href="https://www.g2.com/products/octopus-deploy/reviews"
target="_blank"
rel="noopener noreferrer"
aria-label="Image link"
itemprop="url">
<span class="footer__item-image" aria-hidden="true">
<span class="image-wrapper">
<img src="https://a.storyblok.com/f/185929/868x1000/ff9d5240db/continuousintegration_bestmeetsrequirements_meetsrequirements.png/m/fit-in/1200x0/filters:quality(85):format(webp)" alt="Award badge for &quot;Best Meets Requirements&quot; from G2, Summer 2026." loading="lazy" width="868" height="1000" srcset="https://a.storyblok.com/f/185929/868x1000/ff9d5240db/continuousintegration_bestmeetsrequirements_meetsrequirements.png/m/fit-in/400x0/filters:quality(85):format(webp) 400w, https://a.storyblok.com/f/185929/868x1000/ff9d5240db/continuousintegration_bestmeetsrequirements_meetsrequirements.png/m/fit-in/600x0/filters:quality(85):format(webp) 600w, https://a.storyblok.com/f/185929/868x1000/ff9d5240db/continuousintegration_bestmeetsrequirements_meetsrequirements.png/m/fit-in/800x0/filters:quality(85):format(webp) 800w, https://a.storyblok.com/f/185929/868x1000/ff9d5240db/continuousintegration_bestmeetsrequirements_meetsrequirements.png/m/fit-in/1200x0/filters:quality(85):format(webp) 1200w, https://a.storyblok.com/f/185929/868x1000/ff9d5240db/continuousintegration_bestmeetsrequirements_meetsrequirements.png/m/fit-in/1600x0/filters:quality(85):format(webp) 1600w, https://a.storyblok.com/f/185929/868x1000/ff9d5240db/continuousintegration_bestmeetsrequirements_meetsrequirements.png/m/fit-in/2000x0/filters:quality(85):format(webp) 2000w" sizes="(max-width: 480px) 100vw, (max-width: 768px) 90vw, (max-width: 1024px) 80vw, 70vw" />
</span>
</span>
</a>
</li>
<li class="footer__item">
<a class="footer__item-link"
href="https://www.gartner.com/reviews/market/devops-platforms/vendor/octopus-deploy-125263461/product/octopus-deploy"
rel="noopener noreferrer"
aria-label="Image link"
itemprop="url">
<span class="footer__item-image" aria-hidden="true">
<span class="image-wrapper">
<img src="https://a.storyblok.com/f/185929/86x101/dd0724c752/gartner-users-love-us-badge.png/m/fit-in/1200x0/filters:quality(85):format(webp)" alt="Gartner badge - Users love us" loading="lazy" width="86" height="101" srcset="https://a.storyblok.com/f/185929/86x101/dd0724c752/gartner-users-love-us-badge.png/m/fit-in/400x0/filters:quality(85):format(webp) 400w, https://a.storyblok.com/f/185929/86x101/dd0724c752/gartner-users-love-us-badge.png/m/fit-in/600x0/filters:quality(85):format(webp) 600w, https://a.storyblok.com/f/185929/86x101/dd0724c752/gartner-users-love-us-badge.png/m/fit-in/800x0/filters:quality(85):format(webp) 800w, https://a.storyblok.com/f/185929/86x101/dd0724c752/gartner-users-love-us-badge.png/m/fit-in/1200x0/filters:quality(85):format(webp) 1200w, https://a.storyblok.com/f/185929/86x101/dd0724c752/gartner-users-love-us-badge.png/m/fit-in/1600x0/filters:quality(85):format(webp) 1600w, https://a.storyblok.com/f/185929/86x101/dd0724c752/gartner-users-love-us-badge.png/m/fit-in/2000x0/filters:quality(85):format(webp) 2000w" sizes="(max-width: 480px) 100vw, (max-width: 768px) 90vw, (max-width: 1024px) 80vw, 70vw" />
</span>
</span>
</a>
</li>
<li class="footer__item">
<a class="footer__item-link"
href="https://www.g2.com/products/octopus-deploy/reviews"
target="_blank"
rel="noopener noreferrer"
aria-label="Image link"
itemprop="url">
<span class="footer__item-image" aria-hidden="true">
<span class="image-wrapper">
<img src="https://a.storyblok.com/f/185929/868x1000/f647e2f3bc/configurationmanagement_highperformer_enterprise_highperformer.png/m/fit-in/1200x0/filters:quality(85):format(webp)" alt="Badge displaying &quot;High Performer Enterprise&quot; for Summer 2026 with G2 logo." loading="lazy" width="868" height="1000" srcset="https://a.storyblok.com/f/185929/868x1000/f647e2f3bc/configurationmanagement_highperformer_enterprise_highperformer.png/m/fit-in/400x0/filters:quality(85):format(webp) 400w, https://a.storyblok.com/f/185929/868x1000/f647e2f3bc/configurationmanagement_highperformer_enterprise_highperformer.png/m/fit-in/600x0/filters:quality(85):format(webp) 600w, https://a.storyblok.com/f/185929/868x1000/f647e2f3bc/configurationmanagement_highperformer_enterprise_highperformer.png/m/fit-in/800x0/filters:quality(85):format(webp) 800w, https://a.storyblok.com/f/185929/868x1000/f647e2f3bc/configurationmanagement_highperformer_enterprise_highperformer.png/m/fit-in/1200x0/filters:quality(85):format(webp) 1200w, https://a.storyblok.com/f/185929/868x1000/f647e2f3bc/configurationmanagement_highperformer_enterprise_highperformer.png/m/fit-in/1600x0/filters:quality(85):format(webp) 1600w, https://a.storyblok.com/f/185929/868x1000/f647e2f3bc/configurationmanagement_highperformer_enterprise_highperformer.png/m/fit-in/2000x0/filters:quality(85):format(webp) 2000w" sizes="(max-width: 480px) 100vw, (max-width: 768px) 90vw, (max-width: 1024px) 80vw, 70vw" />
</span>
</span>
</a>
</li>
</ul>
</div>
<div class="footer__column">
<h3 class="footer__column-title" id="footer-second-sign-up-to-our-newsletter" itemprop="name">Sign up to our newsletter</h3>
<ul class="footer__items" aria-labelledby="footer-second-sign-up-to-our-newsletter">
<li class="footer__item footer__item--component">
<div class="mktoFormWrapper"> <form id="mktoForm_2139" class="newsletter__form"></form> <script>(function(){const formId = 2139;
const dreamdataTrackingId = "Newsletter Signup (Footer)";
(() => {
const formEl = document.getElementById(`mktoForm_${formId}`);
if (!formEl) {
return;
}
// Load the 134 KB Marketo library once per page, shared across every form
const loadMarketo = () => {
if (!window.__marketoLoader) {
window.__marketoLoader = new Promise((resolve, reject) => {
const script = document.createElement('script');
script.src = 'https://get.octopus.com/js/forms2/js/forms2.min.js';
script.onload = resolve;
script.onerror = () => reject(new Error('Failed to load MktoForms2'));
document.head.appendChild(script);
});
}
return window.__marketoLoader;
};
const initForm = async () => {
try {
await loadMarketo();
} catch (error) {
console.error(error);
// Drop the cached rejected promise so a later form instance can retry
window.__marketoLoader = undefined;
// Collapse any space reserved for this form so a blocked or failed
// load does not leave an empty box (no-op when there is no wrapper)
formEl.closest('.newsletter')?.style.setProperty('display', 'none');
return;
}
// @ts-ignore - no global type for MktoForms2
if (typeof MktoForms2 === 'undefined' || !MktoForms2.loadForm) {
console.error('MktoForms2 is not available after loading.');
return;
}
// @ts-ignore
MktoForms2.loadForm(
'//get.octopus.com',
'271-BEX-827',
formId,
(form) => {
const formElem = form.getFormElem()[0];
if (!(formElem instanceof HTMLElement)) {
console.error(
'Expected a DOM element but got something else',
formElem
);
return;
}
formElem.querySelectorAll('style').forEach((style) => style.remove());
const baseStyle = document.getElementById('mktoForms2BaseStyle');
if (baseStyle) {
baseStyle.remove();
}
formElem.removeAttribute('style');
formElem
.querySelectorAll('.mktoTextField')
.forEach((el) => el.classList.add('form-control'));
formElem
.querySelectorAll('.mktoEmailField')
.forEach((el) => el.classList.add('form-control'));
formElem
.querySelectorAll('.mktoButton')
.forEach((el) => el.classList.add('button', 'button--primary'));
formElem
.querySelectorAll('.mktoAsterix')
.forEach((el) => el.remove());
formElem.querySelectorAll('.mktoOffset').forEach((el) => el.remove());
formElem
.querySelectorAll('.mktoFormCol, .mktoField, .mktoLabel')
.forEach((el) => el.removeAttribute('style'));
// Add Dreamdata tracking if configured
if (dreamdataTrackingId) {
form.onSuccess(function (values, followUpUrl) {
const email = values.Email || values.email;
if (typeof dreamdata !== 'undefined') {
try {
dreamdata.track(dreamdataTrackingId);
if (email) {
dreamdata.identify(null, { email: email });
}
} catch (error) {
console.warn('Dreamdata tracking failed:', error);
}
} else {
console.warn(
'Dreamdata not available for tracking:',
dreamdataTrackingId
);
}
if (followUpUrl) {
location.href = followUpUrl;
}
return followUpUrl ? false : true;
});
}
}
);
};
// The form is below the fold, so defer the library until the reader
// scrolls near it - keeps 134 KB off the critical path on every page.
// 600px of rootMargin starts the download early enough that the form is
// usually ready when it enters the viewport.
if ('IntersectionObserver' in window) {
const observer = new IntersectionObserver(
(entries) => {
if (entries.some((entry) => entry.isIntersecting)) {
observer.disconnect();
initForm();
}
},
{ rootMargin: '600px' }
);
observer.observe(formEl);
} else {
initForm();
}
})();
})();</script> </div>
</li>
</ul>
</div>
<div class="footer__column">
<h3 class="footer__column-title" id="footer-second-marketplaces" itemprop="name">Marketplaces</h3>
<ul class="footer__items" aria-labelledby="footer-second-marketplaces">
<li class="footer__item">
<a class="footer__item-link"
href="https://marketplace.microsoft.com/en-us/product/saas/octopusdeployptyltd1664464418055.octopus_cloud_saas_offer?tab=overview"
target="_blank"
rel="noopener noreferrer"
aria-label="Azure marketplace (opens in new tab)"
itemprop="url">
<span class="footer__item-image" aria-hidden="true">
<span class="image-wrapper">
<img src="https://a.storyblok.com/f/185929/43x43/01bd95458d/azure-marketplace-logo.png/m/fit-in/1200x0/filters:quality(85):format(webp)" alt="Azure marketplace logo" loading="lazy" width="43" height="43" srcset="https://a.storyblok.com/f/185929/43x43/01bd95458d/azure-marketplace-logo.png/m/fit-in/400x0/filters:quality(85):format(webp) 400w, https://a.storyblok.com/f/185929/43x43/01bd95458d/azure-marketplace-logo.png/m/fit-in/600x0/filters:quality(85):format(webp) 600w, https://a.storyblok.com/f/185929/43x43/01bd95458d/azure-marketplace-logo.png/m/fit-in/800x0/filters:quality(85):format(webp) 800w, https://a.storyblok.com/f/185929/43x43/01bd95458d/azure-marketplace-logo.png/m/fit-in/1200x0/filters:quality(85):format(webp) 1200w, https://a.storyblok.com/f/185929/43x43/01bd95458d/azure-marketplace-logo.png/m/fit-in/1600x0/filters:quality(85):format(webp) 1600w, https://a.storyblok.com/f/185929/43x43/01bd95458d/azure-marketplace-logo.png/m/fit-in/2000x0/filters:quality(85):format(webp) 2000w" sizes="(max-width: 480px) 100vw, (max-width: 768px) 90vw, (max-width: 1024px) 80vw, 70vw" />
</span>
</span>
<span class="footer__item-label" itemprop="name">
Azure marketplace
</span>
</a>
</li>
<li class="footer__item">
<a class="footer__item-link"
href="https://aws.amazon.com/marketplace/pp/prodview-rsv6rann3nbsu?sr=0-2&amp;ref_=beagle&amp;applicationId=AWSMPContessa"
target="_blank"
rel="noopener noreferrer"
aria-label="AWS marketplace (opens in new tab)"
itemprop="url">
<span class="footer__item-image" aria-hidden="true">
<span class="image-wrapper">
<img src="https://a.storyblok.com/f/185929/1500x1200/8959e687b4/aws-white.webp/m/fit-in/1200x0/filters:quality(85):format(webp)" alt="AWS logo with bold white letters &quot;aws&quot; and an orange curved arrow below on a black background." loading="lazy" width="1500" height="1200" srcset="https://a.storyblok.com/f/185929/1500x1200/8959e687b4/aws-white.webp/m/fit-in/400x0/filters:quality(85):format(webp) 400w, https://a.storyblok.com/f/185929/1500x1200/8959e687b4/aws-white.webp/m/fit-in/600x0/filters:quality(85):format(webp) 600w, https://a.storyblok.com/f/185929/1500x1200/8959e687b4/aws-white.webp/m/fit-in/800x0/filters:quality(85):format(webp) 800w, https://a.storyblok.com/f/185929/1500x1200/8959e687b4/aws-white.webp/m/fit-in/1200x0/filters:quality(85):format(webp) 1200w, https://a.storyblok.com/f/185929/1500x1200/8959e687b4/aws-white.webp/m/fit-in/1600x0/filters:quality(85):format(webp) 1600w, https://a.storyblok.com/f/185929/1500x1200/8959e687b4/aws-white.webp/m/fit-in/2000x0/filters:quality(85):format(webp) 2000w" sizes="(max-width: 480px) 100vw, (max-width: 768px) 90vw, (max-width: 1024px) 80vw, 70vw" />
</span>
</span>
<span class="footer__item-label" itemprop="name">
AWS marketplace
</span>
</a>
</li>
</ul>
</div>
</section>
<section class="footer__row footer__row--third" aria-label="Legal and social media">
<div class="footer__column">
<ul class="footer__items"
aria-labelledby="footer-third-">
<li class="footer__item">
<span class="footer__item-image" aria-hidden="true">
<span class="image-wrapper">
<img src="https://a.storyblok.com/f/185929/150x150/61efa58c5f/octopus-blue-logo.svg" alt="Octopus blue logo" loading="lazy" width="150" height="150" />
</span>
</span>
<span class="footer__item-label">&#xA9; 2026 Octopus Deploy</span>
</li>
</ul>
</div>
<div class="footer__column">
<ul class="footer__items"
aria-labelledby="footer-third-">
<li class="footer__item">
<a class="footer__item-link"
href="https://octopus.com/legal/privacy"
aria-label="Privacy Policy"
itemprop="url">
<span class="footer__item-label" itemprop="name">
Privacy Policy
<svg class="icon icon--button-link-arrow" xmlns='http://www.w3.org/2000/svg' width='14' height='15' viewBox='0 0 14 15' fill='none'><path d='M6.01228 1.80213L6.66634 1.13321C6.94328 0.849968 7.39111 0.849968 7.6651 1.13321L13.3925 6.98777C13.6695 7.27101 13.6695 7.72901 13.3925 8.00923L7.6651 13.8668C7.38816 14.15 6.94033 14.15 6.66634 13.8668L6.01228 13.1979C5.73239 12.9116 5.73828 12.4446 6.02406 12.1644L9.57424 8.70527L1.10685 8.70527C0.715007 8.70527 0.399764 8.38286 0.399764 7.98211L0.399764 7.0179C0.399764 6.61715 0.715008 6.29474 1.10685 6.29474L9.57424 6.29474L6.02407 2.83564C5.73534 2.55542 5.72945 2.08838 6.01228 1.80213Z' fill='#0D80D8'/></svg>
</span>
</a>
</li>
<li class="footer__item">
<a class="footer__item-link"
href="https://octopus.com/legal/gdpr"
aria-label="GDPR"
itemprop="url">
<span class="footer__item-label" itemprop="name">
GDPR
<svg class="icon icon--button-link-arrow" xmlns='http://www.w3.org/2000/svg' width='14' height='15' viewBox='0 0 14 15' fill='none'><path d='M6.01228 1.80213L6.66634 1.13321C6.94328 0.849968 7.39111 0.849968 7.6651 1.13321L13.3925 6.98777C13.6695 7.27101 13.6695 7.72901 13.3925 8.00923L7.6651 13.8668C7.38816 14.15 6.94033 14.15 6.66634 13.8668L6.01228 13.1979C5.73239 12.9116 5.73828 12.4446 6.02406 12.1644L9.57424 8.70527L1.10685 8.70527C0.715007 8.70527 0.399764 8.38286 0.399764 7.98211L0.399764 7.0179C0.399764 6.61715 0.715008 6.29474 1.10685 6.29474L9.57424 6.29474L6.02407 2.83564C5.73534 2.55542 5.72945 2.08838 6.01228 1.80213Z' fill='#0D80D8'/></svg>
</span>
</a>
</li>
<li class="footer__item">
<a class="footer__item-link"
href="https://octopus.com/legal/customer-agreement"
aria-label="Terms"
itemprop="url">
<span class="footer__item-label" itemprop="name">
Terms
<svg class="icon icon--button-link-arrow" xmlns='http://www.w3.org/2000/svg' width='14' height='15' viewBox='0 0 14 15' fill='none'><path d='M6.01228 1.80213L6.66634 1.13321C6.94328 0.849968 7.39111 0.849968 7.6651 1.13321L13.3925 6.98777C13.6695 7.27101 13.6695 7.72901 13.3925 8.00923L7.6651 13.8668C7.38816 14.15 6.94033 14.15 6.66634 13.8668L6.01228 13.1979C5.73239 12.9116 5.73828 12.4446 6.02406 12.1644L9.57424 8.70527L1.10685 8.70527C0.715007 8.70527 0.399764 8.38286 0.399764 7.98211L0.399764 7.0179C0.399764 6.61715 0.715008 6.29474 1.10685 6.29474L9.57424 6.29474L6.02407 2.83564C5.73534 2.55542 5.72945 2.08838 6.01228 1.80213Z' fill='#0D80D8'/></svg>
</span>
</a>
</li>
<li class="footer__item">
<a class="footer__item-link"
href="https://status.octopus.com/"
rel="noopener noreferrer"
aria-label="Status (opens in new tab)"
itemprop="url">
<span class="footer__item-label" itemprop="name">
Status
<svg class="icon icon--button-link-arrow" xmlns='http://www.w3.org/2000/svg' width='14' height='15' viewBox='0 0 14 15' fill='none'><path d='M6.01228 1.80213L6.66634 1.13321C6.94328 0.849968 7.39111 0.849968 7.6651 1.13321L13.3925 6.98777C13.6695 7.27101 13.6695 7.72901 13.3925 8.00923L7.6651 13.8668C7.38816 14.15 6.94033 14.15 6.66634 13.8668L6.01228 13.1979C5.73239 12.9116 5.73828 12.4446 6.02406 12.1644L9.57424 8.70527L1.10685 8.70527C0.715007 8.70527 0.399764 8.38286 0.399764 7.98211L0.399764 7.0179C0.399764 6.61715 0.715008 6.29474 1.10685 6.29474L9.57424 6.29474L6.02407 2.83564C5.73534 2.55542 5.72945 2.08838 6.01228 1.80213Z' fill='#0D80D8'/></svg>
</span>
</a>
</li>
</ul>
</div>
<div class="footer__column">
<ul class="footer__items"
aria-labelledby="footer-third-">
<li class="footer__item">
<a class="footer__item-link"
href="https://octopus.com/company/trust"
aria-label="Image link"
itemprop="url">
<span class="footer__item-image" aria-hidden="true">
<span class="image-wrapper">
<img src="https://a.storyblok.com/f/185929/121x28/f5e12a77a5/soc2-1.png/m/fit-in/1200x0/filters:quality(85):format(webp)" alt="SOC 2 Type II compliance" loading="lazy" width="121" height="28" srcset="https://a.storyblok.com/f/185929/121x28/f5e12a77a5/soc2-1.png/m/fit-in/400x0/filters:quality(85):format(webp) 400w, https://a.storyblok.com/f/185929/121x28/f5e12a77a5/soc2-1.png/m/fit-in/600x0/filters:quality(85):format(webp) 600w, https://a.storyblok.com/f/185929/121x28/f5e12a77a5/soc2-1.png/m/fit-in/800x0/filters:quality(85):format(webp) 800w, https://a.storyblok.com/f/185929/121x28/f5e12a77a5/soc2-1.png/m/fit-in/1200x0/filters:quality(85):format(webp) 1200w, https://a.storyblok.com/f/185929/121x28/f5e12a77a5/soc2-1.png/m/fit-in/1600x0/filters:quality(85):format(webp) 1600w, https://a.storyblok.com/f/185929/121x28/f5e12a77a5/soc2-1.png/m/fit-in/2000x0/filters:quality(85):format(webp) 2000w" sizes="(max-width: 480px) 100vw, (max-width: 768px) 90vw, (max-width: 1024px) 80vw, 70vw" />
</span>
</span>
</a>
</li>
<li class="footer__item">
<a class="footer__item-link"
href="https://octopus.com/support/enterprise-argo-support"
aria-label="Image link"
itemprop="url">
<span class="footer__item-image" aria-hidden="true">
<span class="image-wrapper">
<img src="https://a.storyblok.com/f/185929/81x46/95d9bb1ded/property-1-argo-logo-color.png/m/fit-in/1200x0/filters:quality(85):format(webp)" alt="Argo logo" loading="lazy" width="81" height="46" srcset="https://a.storyblok.com/f/185929/81x46/95d9bb1ded/property-1-argo-logo-color.png/m/fit-in/400x0/filters:quality(85):format(webp) 400w, https://a.storyblok.com/f/185929/81x46/95d9bb1ded/property-1-argo-logo-color.png/m/fit-in/600x0/filters:quality(85):format(webp) 600w, https://a.storyblok.com/f/185929/81x46/95d9bb1ded/property-1-argo-logo-color.png/m/fit-in/800x0/filters:quality(85):format(webp) 800w, https://a.storyblok.com/f/185929/81x46/95d9bb1ded/property-1-argo-logo-color.png/m/fit-in/1200x0/filters:quality(85):format(webp) 1200w, https://a.storyblok.com/f/185929/81x46/95d9bb1ded/property-1-argo-logo-color.png/m/fit-in/1600x0/filters:quality(85):format(webp) 1600w, https://a.storyblok.com/f/185929/81x46/95d9bb1ded/property-1-argo-logo-color.png/m/fit-in/2000x0/filters:quality(85):format(webp) 2000w" sizes="(max-width: 480px) 100vw, (max-width: 768px) 90vw, (max-width: 1024px) 80vw, 70vw" />
</span>
</span>
</a>
</li>
</ul>
</div>
<div class="footer__column">
<ul class="footer__items"
aria-labelledby="footer-third-">
<li class="footer__item">
<a class="footer__item-link"
href="https://x.com/OctopusDeploy"
target="_blank"
rel="noopener noreferrer"
aria-label="Image link"
itemprop="url">
<span class="footer__item-image" aria-hidden="true">
<span class="image-wrapper">
<img src="https://a.storyblok.com/f/185929/35x35/6f5c80f250/x-logo.png/m/fit-in/1200x0/filters:quality(85):format(webp)" alt="X logo" loading="lazy" width="35" height="35" srcset="https://a.storyblok.com/f/185929/35x35/6f5c80f250/x-logo.png/m/fit-in/400x0/filters:quality(85):format(webp) 400w, https://a.storyblok.com/f/185929/35x35/6f5c80f250/x-logo.png/m/fit-in/600x0/filters:quality(85):format(webp) 600w, https://a.storyblok.com/f/185929/35x35/6f5c80f250/x-logo.png/m/fit-in/800x0/filters:quality(85):format(webp) 800w, https://a.storyblok.com/f/185929/35x35/6f5c80f250/x-logo.png/m/fit-in/1200x0/filters:quality(85):format(webp) 1200w, https://a.storyblok.com/f/185929/35x35/6f5c80f250/x-logo.png/m/fit-in/1600x0/filters:quality(85):format(webp) 1600w, https://a.storyblok.com/f/185929/35x35/6f5c80f250/x-logo.png/m/fit-in/2000x0/filters:quality(85):format(webp) 2000w" sizes="(max-width: 480px) 100vw, (max-width: 768px) 90vw, (max-width: 1024px) 80vw, 70vw" />
</span>
</span>
</a>
</li>
<li class="footer__item">
<a class="footer__item-link"
href="https://www.linkedin.com/company/octopus-deploy"
target="_blank"
rel="noopener noreferrer"
aria-label="Image link"
itemprop="url">
<span class="footer__item-image" aria-hidden="true">
<span class="image-wrapper">
<img src="https://a.storyblok.com/f/185929/35x35/d628eb60c7/linkedin-logo.png/m/fit-in/1200x0/filters:quality(85):format(webp)" alt="LinkedIn logo" loading="lazy" width="35" height="35" srcset="https://a.storyblok.com/f/185929/35x35/d628eb60c7/linkedin-logo.png/m/fit-in/400x0/filters:quality(85):format(webp) 400w, https://a.storyblok.com/f/185929/35x35/d628eb60c7/linkedin-logo.png/m/fit-in/600x0/filters:quality(85):format(webp) 600w, https://a.storyblok.com/f/185929/35x35/d628eb60c7/linkedin-logo.png/m/fit-in/800x0/filters:quality(85):format(webp) 800w, https://a.storyblok.com/f/185929/35x35/d628eb60c7/linkedin-logo.png/m/fit-in/1200x0/filters:quality(85):format(webp) 1200w, https://a.storyblok.com/f/185929/35x35/d628eb60c7/linkedin-logo.png/m/fit-in/1600x0/filters:quality(85):format(webp) 1600w, https://a.storyblok.com/f/185929/35x35/d628eb60c7/linkedin-logo.png/m/fit-in/2000x0/filters:quality(85):format(webp) 2000w" sizes="(max-width: 480px) 100vw, (max-width: 768px) 90vw, (max-width: 1024px) 80vw, 70vw" />
</span>
</span>
</a>
</li>
<li class="footer__item">
<a class="footer__item-link"
href="https://github.com/OctopusDeploy"
target="_blank"
rel="noopener noreferrer"
aria-label="Image link"
itemprop="url">
<span class="footer__item-image" aria-hidden="true">
<span class="image-wrapper">
<img src="https://a.storyblok.com/f/185929/35x35/6d993f391c/github-logo.png/m/fit-in/1200x0/filters:quality(85):format(webp)" alt="GitHub logo" loading="lazy" width="35" height="35" srcset="https://a.storyblok.com/f/185929/35x35/6d993f391c/github-logo.png/m/fit-in/400x0/filters:quality(85):format(webp) 400w, https://a.storyblok.com/f/185929/35x35/6d993f391c/github-logo.png/m/fit-in/600x0/filters:quality(85):format(webp) 600w, https://a.storyblok.com/f/185929/35x35/6d993f391c/github-logo.png/m/fit-in/800x0/filters:quality(85):format(webp) 800w, https://a.storyblok.com/f/185929/35x35/6d993f391c/github-logo.png/m/fit-in/1200x0/filters:quality(85):format(webp) 1200w, https://a.storyblok.com/f/185929/35x35/6d993f391c/github-logo.png/m/fit-in/1600x0/filters:quality(85):format(webp) 1600w, https://a.storyblok.com/f/185929/35x35/6d993f391c/github-logo.png/m/fit-in/2000x0/filters:quality(85):format(webp) 2000w" sizes="(max-width: 480px) 100vw, (max-width: 768px) 90vw, (max-width: 1024px) 80vw, 70vw" />
</span>
</span>
</a>
</li>
<li class="footer__item">
<a class="footer__item-link"
href="https://www.youtube.com/c/Octopusdeploy"
rel="noopener noreferrer"
aria-label="Image link"
itemprop="url">
<span class="footer__item-image" aria-hidden="true">
<span class="image-wrapper">
<img src="https://a.storyblok.com/f/185929/35x35/944072d610/youtube-logo.png/m/fit-in/1200x0/filters:quality(85):format(webp)" alt="YouTube logo" loading="lazy" width="35" height="35" srcset="https://a.storyblok.com/f/185929/35x35/944072d610/youtube-logo.png/m/fit-in/400x0/filters:quality(85):format(webp) 400w, https://a.storyblok.com/f/185929/35x35/944072d610/youtube-logo.png/m/fit-in/600x0/filters:quality(85):format(webp) 600w, https://a.storyblok.com/f/185929/35x35/944072d610/youtube-logo.png/m/fit-in/800x0/filters:quality(85):format(webp) 800w, https://a.storyblok.com/f/185929/35x35/944072d610/youtube-logo.png/m/fit-in/1200x0/filters:quality(85):format(webp) 1200w, https://a.storyblok.com/f/185929/35x35/944072d610/youtube-logo.png/m/fit-in/1600x0/filters:quality(85):format(webp) 1600w, https://a.storyblok.com/f/185929/35x35/944072d610/youtube-logo.png/m/fit-in/2000x0/filters:quality(85):format(webp) 2000w" sizes="(max-width: 480px) 100vw, (max-width: 768px) 90vw, (max-width: 1024px) 80vw, 70vw" />
</span>
</span>
</a>
</li>
</ul>
</div>
</section>
</div>
</footer>
</div> <script>(function(){const site_url = "https://octopus.com";
const site_features = {"stickyNav":{"top":75.2},"codeBlocks":["copy"],"figures":["enlarge"],"youTubeLinks":["embed"],"headers":["link"],"details":["tabs"],"search":["dialog"]};
window.site_url = site_url;
window.site_features = site_features;
})();</script><script src="/blog/js/main.js" type="module" async></script><script>
document.addEventListener('searched', (e) => {
if (typeof plausible != 'undefined') {
plausible('Search', { props: e.detail });
}
});
</script> <script defer src="https://octopus.com/octopus-public/assets/navbarPU.js"></script> <script defer src="https://octopus.com/octopus-public/assets/buttonHoverEffect.js"></script> </body> </html>