CINXE.COM

Crossplane v0.4: new Rook integration supports in-cluster managed database alternatives to RDS, CloudSQL, and Azure DB

<!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8" /> <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" /> <title>Crossplane v0.4: new Rook integration supports in-cluster managed database alternatives to RDS, CloudSQL, and Azure DB</title> <meta name="HandheldFriendly" content="True" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <link rel="stylesheet" type="text/css" href="/assets/css/style.css?v=a1348d70b3" /> <link rel="icon" href="/favicon.png" type="image/png" /> <link rel="canonical" href="https://blog.crossplane.io/crossplane-v0-4-new-rook-integration-supports-in-cluster-managed-database-alternatives-to-rds-cloudsql-and-azure-db/" /> <meta name="referrer" content="no-referrer-when-downgrade" /> <link rel="amphtml" href="https://blog.crossplane.io/crossplane-v0-4-new-rook-integration-supports-in-cluster-managed-database-alternatives-to-rds-cloudsql-and-azure-db/amp/" /> <meta property="og:site_name" content="The Crossplane Blog" /> <meta property="og:type" content="article" /> <meta property="og:title" content="Crossplane v0.4: new Rook integration supports in-cluster managed database alternatives to RDS, CloudSQL, and Azure DB" /> <meta property="og:description" content="Cloud-native applications can now provision Yugabyte and Cockroach DB instances with the new Rook Stack using portable PostgreSQL claims via kubectl -- offering an in-cluster alternative to RDS, CloudSQL, and Azure DB. Streamlined documentation and UX improvements round out this important release. It鈥檚 only been 6 weeks since the" /> <meta property="og:url" content="https://blog.crossplane.io/crossplane-v0-4-new-rook-integration-supports-in-cluster-managed-database-alternatives-to-rds-cloudsql-and-azure-db/" /> <meta property="og:image" content="https://blog.crossplane.io/content/images/2023/12/Crossplanecity-1.png" /> <meta property="article:published_time" content="2019-10-29T00:00:00.000Z" /> <meta property="article:modified_time" content="2021-04-10T17:17:07.000Z" /> <meta property="article:tag" content="Rook" /> <meta property="article:tag" content="PostgreSQL" /> <meta property="article:tag" content="Yugabyte" /> <meta property="article:tag" content="Cockroach DB" /> <meta name="twitter:card" content="summary_large_image" /> <meta name="twitter:title" content="Crossplane v0.4: new Rook integration supports in-cluster managed database alternatives to RDS, CloudSQL, and Azure DB" /> <meta name="twitter:description" content="Cloud-native applications can now provision Yugabyte and Cockroach DB instances with the new Rook Stack using portable PostgreSQL claims via kubectl -- offering an in-cluster alternative to RDS, CloudSQL, and Azure DB. Streamlined documentation and UX improvements round out this important release. It鈥檚 only been 6 weeks since the" /> <meta name="twitter:url" content="https://blog.crossplane.io/crossplane-v0-4-new-rook-integration-supports-in-cluster-managed-database-alternatives-to-rds-cloudsql-and-azure-db/" /> <meta name="twitter:image" content="https://blog.crossplane.io/content/images/2023/12/Crossplanecity.png" /> <meta name="twitter:label1" content="Written by" /> <meta name="twitter:data1" content="Phil Prasek" /> <meta name="twitter:label2" content="Filed under" /> <meta name="twitter:data2" content="Rook, PostgreSQL, Yugabyte, Cockroach DB" /> <meta name="twitter:site" content="@crossplane_io" /> <meta property="og:image:width" content="682" /> <meta property="og:image:height" content="610" /> <script type="application/ld+json"> { "@context": "https://schema.org", "@type": "Article", "publisher": { "@type": "Organization", "name": "The Crossplane Blog", "url": "https://blog.crossplane.io/", "logo": { "@type": "ImageObject", "url": "https://blog.crossplane.io/content/images/2020/05/CrossplaneLogo_Horiz-WhiteText.png" } }, "author": { "@type": "Person", "name": "Phil Prasek", "image": { "@type": "ImageObject", "url": "https://blog.crossplane.io/content/images/2021/04/PhilPrasek-Thumb.jpg", "width": 2000, "height": 2000 }, "url": "https://blog.crossplane.io/author/phil/", "sameAs": [] }, "headline": "Crossplane v0.4: new Rook integration supports in-cluster managed database alternatives to RDS, CloudSQL, and Azure DB", "url": "https://blog.crossplane.io/crossplane-v0-4-new-rook-integration-supports-in-cluster-managed-database-alternatives-to-rds-cloudsql-and-azure-db/", "datePublished": "2019-10-29T00:00:00.000Z", "dateModified": "2021-04-10T17:17:07.000Z", "keywords": "Rook, PostgreSQL, Yugabyte, Cockroach DB", "description": "Cloud-native applications can now provision Yugabyte and Cockroach DB instances\nwith the new Rook Stack [https://crossplane.io/docs/v0.4/stacks-guide-rook.html] \nusing portable PostgreSQL claims via kubectl -- offering an in-cluster\nalternative to RDS, CloudSQL, and Azure DB. Streamlined documentation and UX\nimprovements round out this important release.\n\nIt鈥檚 only been 6 weeks since the v0.3 release but we have a lot of ground to\ncover with a new Rook Stack for provisioning in-cluster stateful ", "mainEntityOfPage": { "@type": "WebPage", "@id": "https://blog.crossplane.io/" } } </script> <meta name="generator" content="Ghost 4.2" /> <link rel="alternate" type="application/rss+xml" title="The Crossplane Blog" href="https://blog.crossplane.io/rss/" /> <script defer src="https://unpkg.com/@tryghost/portal@~1.1.0/umd/portal.min.js" data-ghost="https://blog.crossplane.io/"></script><style> .gh-post-upgrade-cta-content, .gh-post-upgrade-cta { display: flex; flex-direction: column; align-items: center; font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif; text-align: center; width: 100%; color: #ffffff; font-size: 16px; } .gh-post-upgrade-cta-content { border-radius: 8px; padding: 40px 4vw; } .gh-post-upgrade-cta h2 { color: #ffffff; font-size: 28px; letter-spacing: -0.2px; margin: 0; padding: 0; } .gh-post-upgrade-cta p { margin: 20px 0 0; padding: 0; } .gh-post-upgrade-cta small { font-size: 16px; letter-spacing: -0.2px; } .gh-post-upgrade-cta a { color: #ffffff; cursor: pointer; font-weight: 500; box-shadow: none; text-decoration: underline; } .gh-post-upgrade-cta a:hover { color: #ffffff; opacity: 0.8; box-shadow: none; text-decoration: underline; } .gh-post-upgrade-cta a.gh-btn { display: block; background: #ffffff; text-decoration: none; margin: 28px 0 0; padding: 8px 18px; border-radius: 4px; font-size: 16px; font-weight: 600; } .gh-post-upgrade-cta a.gh-btn:hover { opacity: 0.92; }</style> <style> .site-logo { max-width: 8em; } </style> <!-- Google Tag Manager --> <script>(function(w,d,s,l,i){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.async=true;j.src= 'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f); })(window,document,'script','dataLayer','GTM-WFF2NQHG');</script> <!-- End Google Tag Manager --><style>:root {--ghost-accent-color: #F3807B;}</style> </head> <body class="post-template tag-rook tag-postgresql tag-yugabyte tag-cockroach-db"> <nav id="menu"> <a class="close-button">Close</a> <div class="nav-wrapper"> <p class="nav-label">Menu</p> <ul> <li class="nav-blog-home" role="presentation"><a href="https://blog.crossplane.io/">Blog Home</a></li> <li class="nav-crossplane-io" role="presentation"><a href="https://crossplane.io/">Crossplane.io</a></li> <li class="nav-subscribe-to-the-newsletter" role="presentation"><a href="https://eepurl.com/ivy4v-/">Subscribe to the Newsletter</a></li> <li class="nav-twitter"><a href="https://twitter.com/crossplane_io" title="@crossplane_io"><i class="ic ic-twitter"></i> Twitter</a></li> <li class="nav-rss"><a href="https://blog.crossplane.io/rss/"><i class="ic ic-rss"></i> Subscribe</a></li> </ul> </div> </nav> <section id="wrapper"> <a class="hidden-close"></a> <div class="progress-container"> <span class="progress-bar"></span> </div> <!-- <header id="post-header"> --> <header id="post-header"> <div class="inner"> <nav id="navigation"> <span class="blog-logo"> <a href="https://blog.crossplane.io"><img src="https://blog.crossplane.io/content/images/2020/05/CrossplaneLogo_Horiz-WhiteText.png" alt="Blog Logo" /></a> </span> <span id="menu-button" class="nav-button"> <a class="menu-button"><i class="ic ic-menu"></i> Menu</a> </span> </nav> <h1 class="post-title">Crossplane v0.4: new Rook integration supports in-cluster managed database alternatives to RDS, CloudSQL, and Azure DB</h1> <span class="post-meta"><a href="/author/phil/">Phil Prasek</a> | <time datetime="2019-10-28">28 Oct 2019</time></span> <!----> </div> </header> <main class="content" role="main"> <article class="post tag-rook tag-postgresql tag-yugabyte tag-cockroach-db no-image"> <div class="inner"> <section class="post-content"> <p><strong><strong><strong><strong>Cloud-native applications can now provision Yugabyte and Cockroach DB instances with the new<a href="https://crossplane.io/docs/v0.4/stacks-guide-rook.html"> Rook Stack</a> using portable PostgreSQL claims </strong></strong>via<strong><strong> kubectl -- offering an in-cluster alternative to RDS, CloudSQL, and Azure DB. Streamlined documentation and UX improvements round out this important release.</strong></strong></strong></strong></p><figure class="kg-card kg-image-card"><img src="blob:https://blog.crossplane.io/820881cc-1def-4ccf-a802-0390f9a07116" class="kg-image" alt loading="lazy"></figure><p>It鈥檚 only been 6 weeks since the v0.3 release but we have a lot of ground to cover with a new Rook Stack for provisioning in-cluster stateful services, release automation for faster release cycles, GitOps support for complete environments, and streamlined documentation and UX improvements that make it easier to get started with Crossplane in dev and test environments today!</p><h3 id="rook-managed-databases-with-claim-based-provisioning">Rook-managed databases with claim-based provisioning</h3><p>Previously when running Kubernetes apps in GKE, EKS, or AKS when you needed a managed database the only feasible option was to use the managed services (CloudSQL, RDS, Azure DB) offered by the same cloud provider as your managed Kubernetes cluster.</p><p>With Crossplane v0.4 and the new Rook Stack you can now provision Kubernetes clusters with Rook operators installed, so Kubernetes applications can consume Yugabyte and Cockroach DB instances provisioned with PostgreSQL claims via <code>kubectl</code> as alternatives to CloudSQL, RDS, and Azure DB.</p><p>Checkout the new <a href="https://crossplane.io/docs/v0.4/stacks-guide-rook.html">Rook Stack Guide</a> for more info!</p><h3 id="gitops-support-for-complete-devtest-environments">GitOps support for complete dev/test environments</h3><p>In v0.3 we added support for secure connectivity for cloud services with many new Kubernetes resources including Networks, Subnets, Service Endpoints, Security Groups and more. However many of these resources, especially those for the AWS Stack, generated non-deterministic IDs that required waiting for one resource (VPC) to be created before creating the next resource (subnet) using the generated ID from the first resource. This required the use of scripts to sequence the creation of complete environments: Kubernetes cluster(s), networking, security, and classes of managed service.</p><p>The v0.4 release now supports cross-resource references, such that entire environments can now be declared in a single yaml file, version controlled in a Git repo, and applied with a single <code>kubectl</code>command. We think that this is an amazing improvement in the usability of Crossplane and we are thrilled to have more people try it out since it's now easier than ever to use!</p><pre><code>kubectl apply -f aws-dev-env.yaml </code></pre><p>For example, an AWS <code>Subnet</code> resource has a <code>spec.vpcIdRef</code> field used by Crossplane to wait for the <code>VPC</code> to be provisioned, so its ID can be used when provisioning the <code>Subnet</code>. This all happens within Crossplane so you can just declare the complete desired-state of a dev or test environment and Crossplane will make it so.</p><pre><code>apiVersion: network.aws.crossplane.io/v1alpha3 kind: Subnet metadata: name: sample-subnet1 spec: cidrBlock: 192.168.64.0/18 vpcIdRef: name: sample-vpc availabilityZone: us-west-2a reclaimPolicy: Delete providerRef: name: aws-provider </code></pre><p>Checkout the Stacks Guides for <a href="https://crossplaneio.github.io/docs/v0.4/stacks-guide-gcp.html">GCP</a>, <a href="https://crossplaneio.github.io/docs/v0.4/stacks-guide-aws.html">AWS</a>, and <a href="https://crossplaneio.github.io/docs/v0.4/stacks-guide-azure.html">Azure</a> to try it out today!</p><h3 id="v1beta1-api-types-for-databasescaches-in-gcp-and-aws">v1beta1 API types for databases/caches in GCP and AWS</h3><p>Stacks for GCP and AWS now have v1beta1 API types for databases and caches, with expanded support for almost every parameter available in the underlying cloud provider APIs. Declarative yaml configuration can be committed to a Git repo, applied using <code>kubectl</code> and Crossplane will create, update, or delete the underlying managed resources as needed.</p><p>Crossplane observes the <a href="https://kubernetes.io/docs/concepts/overview/kubernetes-api/#api-versioning">Kubernetes API versioning</a> guidelines:</p><blockquote>Beta: Support for the overall features will not be dropped, though details may change. Support for upgrading or migrating between versions will be provided, either through automation or manual steps.</blockquote><p>Checkout the updated <a href="https://crossplane.io/docs/v0.4/api.html">API Reference</a> for these new v1beta1 API types that are ready for use in dev and test environments today:</p><ul><li><a href="https://crossplane.io/docs/v0.4/api/crossplaneio/stack-gcp/database-gcp-crossplane-io-v1beta1.html">database.gcp.crossplane.io/v1beta1</a></li><li><a href="https://crossplane.io/docs/v0.4/api/crossplaneio/stack-aws/database-aws-crossplane-io-v1beta1.html">database.aws.crossplane.io/v1beta1</a></li><li><a href="https://crossplane.io/docs/v0.4/api/crossplaneio/stack-gcp/cache-gcp-crossplane-io-v1beta1.html">cache.gcp.crossplane.io/v1beta1</a></li><li><a href="https://crossplane.io/docs/v0.4/api/crossplaneio/stack-aws/cache-aws-crossplane-io-v1beta1.html">cache.aws.crossplane.io/v1beta1</a></li></ul><h3 id="simpler-claim-binding-model-with-label-selectors">Simpler claim-binding model with label selectors</h3><p>In Crossplane v0.3 we introduced support for provider-specific resource classes, where they were previously generic. However with resource classes becoming specific to a single cloud provider, the claims that referenced them lost their portability. To address this issue in v0.3, portable resource classes were added to map a portable claim kind to a portable resource class like <code>PostgreSQLInstanceClass</code> that in turn could be mapped to a provider-specific class like <code>CloudSQLInstanceClass</code>.</p><p>Crossplane v0.4 incorporates community feedback and replaces portable resource classes with a simpler claim-binding model that uses the label selector pattern used throughout Kubernetes today. Resource classes are now cluster-scoped and resource claims can now be matched to a resource class in several ways:</p><ol><li>class label selectors defined in the <code>claim.spec.classSelector</code></li><li>default resource classes marked <code>resourceclass.crossplane.io/is-default-class: "true"</code></li><li>provider-specific <code>claim.spec.classRef</code> that is not portable across clouds</li></ol><p>Checkout the <a href="https://crossplane.io/docs/v0.4/services-guide.html">Services Guide</a> and the <a href="https://github.com/crossplaneio/crossplane/blob/master/design/one-pager-simple-class-selection.md">design doc</a> for more info on this exciting new feature and how to use claims and classes to enable dynamic provisioning of managed services with RDS, CloudSQL, and Azure DB!</p><h3 id="faster-monthly-release-cadence-going-forward">Faster monthly release cadence going forward</h3><p>To keep the momentum rolling and shorten our feedback loops we wanted to release more often and v0.4 includes new release automation to make that happen. We鈥檒l be releasing on a monthly cadence going forward so stay tuned for great new content!</p><h3 id="and-there%E2%80%99s-more">And there鈥檚 more!</h3><p>There are a number of features we鈥檒l mention just briefly here:</p><ul><li>Crossplane supporting work for <a href="https://gitlab.com/gitlab-org/gitlab/issues/34702">GitLab 12.5 Auto DevOps</a></li><li>New <a href="https://github.com/packethost/stack-packet">Packet Stack</a> to provision Packet bare-metal</li><li>New <a href="https://crossplaneio.github.io/docs/v0.4/troubleshoot.html">Trace utility</a> for enhanced debugging support</li><li>New simple provisioning examples in <a href="https://crossplaneio.github.io/docs/v0.4/quick-start.html">Getting Started</a>!</li></ul><h3 id="beyond-v04">Beyond v0.4</h3><p>We have many things on tap including:</p><ul><li>GitLab 12.5 Auto DevOps integration</li><li>CD integration examples for GitLab, Jenkins, and ArgoCD</li><li>Stable v1beta1 API types for all GCP, AWS and Azure resources</li><li>Resource packs for default classes and configurations</li><li>Improved error messages surfaced in claims and/or eventing</li><li>Stack Manager</li><li>Enhanced security model</li><li>Robot account support</li><li>Annotation support: parent/child, UI, CRD</li><li>Versioning and upgrade support</li><li>Template Stacks with lifecyle hooks</li><li>Additional real-world App Stacks</li><li>Expanded Rook support for additional storage types</li><li>Policy-based secure connectivity strategies</li></ul><h3 id="get-involved">Get involved!</h3><p>There are many different ways to get involved in the Crossplane project, both from the user side and the developer side. Please join us in helping the project continue to grow on its way beyond the v0.4 milestone as we move from alpha to beta over the coming months!</p><ul><li><a href="https://crossplane.io/">Crossplane website</a></li><li><a href="https://github.com/crossplaneio/crossplane">Github</a></li><li><a href="https://twitter.com/crossplane_io">Twitter</a></li><li><a href="https://slack.crossplane.io/">Slack</a></li><li><a href="https://www.youtube.com/channel/UC19FgzMBMqBro361HbE46Fw">Youtube</a></li><li><a href="mailto:info@crossplane.io">Email</a></li></ul><p>Join the open cloud movement to help level the playing field for everyone!</p> </section> <section class="post-info"> <div class="post-share"> <a class="twitter" href="https://twitter.com/share?text=Crossplane v0.4: new Rook integration supports in-cluster managed database alternatives to RDS, CloudSQL, and Azure DB&url=https://blog.crossplane.io/crossplane-v0-4-new-rook-integration-supports-in-cluster-managed-database-alternatives-to-rds-cloudsql-and-azure-db/" onclick="window.open(this.href, 'twitter-share', 'width=550,height=235');return false;"> <i class="ic ic-twitter"></i><span class="hidden">Twitter</span> </a> <a class="facebook" href="https://www.facebook.com/sharer/sharer.php?u=https://blog.crossplane.io/crossplane-v0-4-new-rook-integration-supports-in-cluster-managed-database-alternatives-to-rds-cloudsql-and-azure-db/" onclick="window.open(this.href, 'facebook-share','width=580,height=296');return false;"> <i class="ic ic-facebook"></i><span class="hidden">Facebook</span> </a> <a class="googleplus" href="https://plus.google.com/share?url=https://blog.crossplane.io/crossplane-v0-4-new-rook-integration-supports-in-cluster-managed-database-alternatives-to-rds-cloudsql-and-azure-db/" onclick="window.open(this.href, 'google-plus-share', 'width=490,height=530');return false;"> <i class="ic ic-googleplus"></i><span class="hidden">Google+</span> </a> <div class="clear"></div> </div> <aside class="post-tags"> <a href="/tag/rook/">Rook</a> <a href="/tag/postgresql/">PostgreSQL</a> <a href="/tag/yugabyte/">Yugabyte</a> <a href="/tag/cockroach-db/">Cockroach DB</a> </aside> <div class="clear"></div> <aside class="post-author"> <figure class="post-author-avatar avatar"> <img src="https://blog.crossplane.io/content/images/2021/04/PhilPrasek-Thumb.jpg" alt="Phil Prasek" /> </figure> <div class="post-author-bio"> <h4 class="post-author-name"><a href="/author/phil/">Phil Prasek</a></h4> <p class="post-author-about">Phil is a Principal Product Manager at Upbound with 20 years' experience in product and engineering roles building successful new products at startups and large enterprises.</p> </div> <div class="clear"></div> </aside> </section> <!-- <section class="post-comments"> <a id="show-disqus" class="post-comments-activate">Show Comments</a> <div id="disqus_thread"></div> </section> --> <!-- Begin Mailchimp Signup Form --> <link href="//cdn-images.mailchimp.com/embedcode/classic-10_7.css" rel="stylesheet" type="text/css"> <style type="text/css"> #mc_embed_signup{background:#fff; clear:left; font:14px Helvetica,Arial,sans-serif; width: 600px; align-content: center; } /* Add your own Mailchimp form style overrides in your site stylesheet or in this style block. We recommend moving this block and the preceding CSS link to the HEAD of your HTML file. */ </style> <div id="mc_embed_signup"> <form action="https://upbound.us17.list-manage.com/subscribe/post?u=b9f6c1840c97ee09ae739fdb0&amp;id=4f555f7090" method="post" id="mc-embedded-subscribe-form" name="mc-embedded-subscribe-form" class="validate" target="_blank" novalidate> <div id="mc_embed_signup_scroll"> <h2>Keep up with Upbound</h2> <div class="indicates-required"><span class="asterisk">*</span> indicates required</div> <div class="mc-field-group"> <label for="mce-LNAME">Name <span class="asterisk">*</span> </label> <input type="text" value="" name="LNAME" class="required" id="mce-LNAME"> </div> <div class="mc-field-group"> <label for="mce-EMAIL">Email Address <span class="asterisk">*</span> </label> <input type="email" value="" name="EMAIL" class="required email" id="mce-EMAIL"> </div> <div id="mce-responses" class="clear"> <div class="response" id="mce-error-response" style="display:none"></div> <div class="response" id="mce-success-response" style="display:none"></div> </div> <!-- real people should not fill this in and expect good things - do not remove this or risk form bot signups--> <div style="position: absolute; left: -5000px;" aria-hidden="true"><input type="text" name="b_b9f6c1840c97ee09ae739fdb0_4f555f7090" tabindex="-1" value=""></div> <div class="clear"><input type="submit" value="Subscribe" name="subscribe" id="mc-embedded-subscribe" class="button"></div> </div> </form> </div> <script type='text/javascript' src='//s3.amazonaws.com/downloads.mailchimp.com/js/mc-validate.js'></script><script type='text/javascript'>(function($) {window.fnames = new Array(); window.ftypes = new Array();fnames[2]='LNAME';ftypes[2]='text';fnames[0]='EMAIL';ftypes[0]='email';}(jQuery));var $mcj = jQuery.noConflict(true);</script> <!--End mc_embed_signup--> <aside class="post-nav"> <a class="post-nav-next" href="/crossplane-v0-5-apis-reach-v1beta1-for-continuous-delivery-into-multiple-clouds-with-gitlab-argocd-gitops/"> <section class="post-nav-teaser"> <i class="ic ic-arrow-left"></i> <h2 class="post-nav-title">Crossplane v0.5: APIs reach v1beta1 for continuous delivery into multiple clouds with GitLab, ArgoCD, GitOps support and more!</h2> <p class="post-nav-excerpt">Crossplane is ready for use in dev/test pipelines with v1beta1 APIs&hellip;</p> </section> </a> <a class="post-nav-prev" href="/aws-secure-connectivity-for-eks-rds/"> <section class="post-nav-teaser"> <i class="ic ic-arrow-right"></i> <h2 class="post-nav-title">AWS secure connectivity for EKS &amp; RDS</h2> <p class="post-nav-excerpt">The AWS Stack now supports securely connecting RDS instances and app deployments&hellip;</p> </section> </a> <div class="clear"></div> </aside> </div> </article> </main> <div id="body-class" style="display: none;" class="post-template tag-rook tag-postgresql tag-yugabyte tag-cockroach-db"></div> <footer id="footer"> <div class="inner"> <section class="credits"> <span class="credits-theme">Theme <a href="https://github.com/zutrinken/attila">Attila</a> by <a href="http://zutrinken.com" rel="nofollow">zutrinken</a></span> <span class="credits-software">Published with <a href="http://ghost.org">Ghost</a></span> </section> </div> </footer> </section> <script type="text/javascript" src="/assets/js/script.js?v=a1348d70b3"></script> <!-- Google Tag Manager (noscript) --> <noscript><iframe src="https://www.googletagmanager.com/ns.html?id=GTM-WFF2NQHG" height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript> <!-- End Google Tag Manager (noscript) --> </body> </html>

Pages: 1 2 3 4 5 6 7 8 9 10